From c11dbcd001313e5225ce625fbf8266bfc4fef606 Mon Sep 17 00:00:00 2001 From: Nick Ethier Date: Tue, 11 Aug 2020 18:30:22 -0400 Subject: [PATCH] docker: support group allocated ports and host_networks (#8623) * docker: support group allocated ports * docker: add new ports driver config to specify which group ports are mapped * docker: update port mapping docs --- client/allocrunner/taskrunner/task_runner.go | 2 + drivers/docker/config.go | 2 + drivers/docker/config_test.go | 4 +- drivers/docker/driver.go | 68 +-- drivers/docker/driver_test.go | 43 ++ drivers/docker/ports.go | 52 ++ plugins/drivers/driver.go | 6 + plugins/drivers/proto/driver.pb.go | 563 +++++++++++-------- plugins/drivers/proto/driver.proto | 11 + plugins/drivers/utils.go | 27 + website/pages/docs/drivers/docker.mdx | 72 ++- 11 files changed, 534 insertions(+), 316 deletions(-) create mode 100644 drivers/docker/ports.go diff --git a/client/allocrunner/taskrunner/task_runner.go b/client/allocrunner/taskrunner/task_runner.go index 514d0e1ed..55bf98ac7 100644 --- a/client/allocrunner/taskrunner/task_runner.go +++ b/client/allocrunner/taskrunner/task_runner.go @@ -936,6 +936,7 @@ func (tr *TaskRunner) buildTaskConfig() *drivers.TaskConfig { alloc := tr.Alloc() invocationid := uuid.Generate()[:8] taskResources := tr.taskResources + ports := tr.Alloc().AllocatedResources.Shared.Ports env := tr.envBuilder.Build() tr.networkIsolationLock.Lock() defer tr.networkIsolationLock.Unlock() @@ -964,6 +965,7 @@ func (tr *TaskRunner) buildTaskConfig() *drivers.TaskConfig { CPUShares: taskResources.Cpu.CpuShares, PercentTicks: float64(taskResources.Cpu.CpuShares) / float64(tr.clientConfig.Node.NodeResources.Cpu.CpuShares), }, + Ports: &ports, }, Devices: tr.hookResources.getDevices(), Mounts: tr.hookResources.getMounts(), diff --git a/drivers/docker/config.go b/drivers/docker/config.go index 492754565..666071f74 100644 --- a/drivers/docker/config.go +++ b/drivers/docker/config.go @@ -347,6 +347,7 @@ var ( "runtime": hclspec.NewAttr("runtime", "string", false), "pids_limit": hclspec.NewAttr("pids_limit", "number", false), "pid_mode": hclspec.NewAttr("pid_mode", "string", false), + "ports": hclspec.NewAttr("ports", "list(string)", false), "port_map": hclspec.NewAttr("port_map", "list(map(number))", false), "privileged": hclspec.NewAttr("privileged", "bool", false), "readonly_rootfs": hclspec.NewAttr("readonly_rootfs", "bool", false), @@ -413,6 +414,7 @@ type TaskConfig struct { Runtime string `codec:"runtime"` PidsLimit int64 `codec:"pids_limit"` PidMode string `codec:"pid_mode"` + Ports []string `codec:"ports"` PortMap hclutils.MapStrInt `codec:"port_map"` Privileged bool `codec:"privileged"` ReadonlyRootfs bool `codec:"readonly_rootfs"` diff --git a/drivers/docker/config_test.go b/drivers/docker/config_test.go index 75d387b51..a79997be9 100644 --- a/drivers/docker/config_test.go +++ b/drivers/docker/config_test.go @@ -264,7 +264,8 @@ config { network_aliases = ["redis"] network_mode = "host" pids_limit = 2000 - pid_mode = "host" + pid_mode = "host" + ports = ["http", "https"] port_map { http = 80 redis = 6379 @@ -395,6 +396,7 @@ config { NetworkMode: "host", PidsLimit: 2000, PidMode: "host", + Ports: []string{"http", "https"}, PortMap: map[string]int{ "http": 80, "redis": 6379, diff --git a/drivers/docker/driver.go b/drivers/docker/driver.go index 59cb45919..5e7e0b35a 100644 --- a/drivers/docker/driver.go +++ b/drivers/docker/driver.go @@ -1032,61 +1032,39 @@ func (d *Driver) createContainerConfig(task *drivers.TaskConfig, driverConfig *T } // Setup port mapping and exposed ports - if len(task.Resources.NomadResources.Networks) == 0 { - if len(driverConfig.PortMap) > 0 { - return c, fmt.Errorf("Trying to map ports but no network interface is available") + ports := newPublishedPorts(logger) + switch { + case task.Resources.Ports != nil && len(driverConfig.Ports) > 0: + // Do not set up docker port mapping if shared alloc networking is used + if strings.HasPrefix(hostConfig.NetworkMode, "container:") { + break } - } else { - // TODO add support for more than one network + + for _, port := range driverConfig.Ports { + if mapping, ok := task.Resources.Ports.Get(port); ok { + ports.add(mapping.Label, mapping.HostIP, mapping.Value, mapping.To) + } else { + return c, fmt.Errorf("Port %q not found, check network stanza", port) + } + } + case len(task.Resources.NomadResources.Networks) > 0: network := task.Resources.NomadResources.Networks[0] - publishedPorts := map[docker.Port][]docker.PortBinding{} - exposedPorts := map[docker.Port]struct{}{} for _, port := range network.ReservedPorts { - // By default we will map the allocated port 1:1 to the container - containerPortInt := port.Value - - // If the user has mapped a port using port_map we'll change it here - if mapped, ok := driverConfig.PortMap[port.Label]; ok { - containerPortInt = mapped - } - - hostPortStr := strconv.Itoa(port.Value) - containerPort := docker.Port(strconv.Itoa(containerPortInt)) - - publishedPorts[containerPort+"/tcp"] = getPortBinding(network.IP, hostPortStr) - publishedPorts[containerPort+"/udp"] = getPortBinding(network.IP, hostPortStr) - logger.Debug("allocated static port", "ip", network.IP, "port", port.Value) - - exposedPorts[containerPort+"/tcp"] = struct{}{} - exposedPorts[containerPort+"/udp"] = struct{}{} - logger.Debug("exposed port", "port", port.Value) + ports.addMapped(port.Label, network.IP, port.Value, driverConfig.PortMap) } for _, port := range network.DynamicPorts { - // By default we will map the allocated port 1:1 to the container - containerPortInt := port.Value - - // If the user has mapped a port using port_map we'll change it here - if mapped, ok := driverConfig.PortMap[port.Label]; ok { - containerPortInt = mapped - } - - hostPortStr := strconv.Itoa(port.Value) - containerPort := docker.Port(strconv.Itoa(containerPortInt)) - - publishedPorts[containerPort+"/tcp"] = getPortBinding(network.IP, hostPortStr) - publishedPorts[containerPort+"/udp"] = getPortBinding(network.IP, hostPortStr) - logger.Debug("allocated mapped port", "ip", network.IP, "port", port.Value) - - exposedPorts[containerPort+"/tcp"] = struct{}{} - exposedPorts[containerPort+"/udp"] = struct{}{} - logger.Debug("exposed port", "port", containerPort) + ports.addMapped(port.Label, network.IP, port.Value, driverConfig.PortMap) } - hostConfig.PortBindings = publishedPorts - config.ExposedPorts = exposedPorts + default: + if len(driverConfig.PortMap) > 0 { + return c, fmt.Errorf("Trying to map ports but no network interface is available") + } } + hostConfig.PortBindings = ports.publishedPorts + config.ExposedPorts = ports.exposedPorts // If the user specified a custom command to run, we'll inject it here. if driverConfig.Command != "" { diff --git a/drivers/docker/driver_test.go b/drivers/docker/driver_test.go index 9ba0e8e4a..5a950b682 100644 --- a/drivers/docker/driver_test.go +++ b/drivers/docker/driver_test.go @@ -1533,6 +1533,49 @@ func TestDockerDriver_PortsMapping(t *testing.T) { require.Exactly(t, expectedPortBindings, container.HostConfig.PortBindings) } +func TestDockerDriver_CreateContainerConfig_Ports(t *testing.T) { + t.Parallel() + + task, cfg, ports := dockerTask(t) + defer freeport.Return(ports) + hostIP := "127.0.0.1" + if runtime.GOOS == "windows" { + hostIP = "" + } + portmappings := structs.AllocatedPorts(make([]structs.AllocatedPortMapping, len(ports))) + portmappings[0] = structs.AllocatedPortMapping{ + Label: "main", + Value: ports[0], + HostIP: hostIP, + To: 8080, + } + portmappings[1] = structs.AllocatedPortMapping{ + Label: "REDIS", + Value: ports[1], + HostIP: hostIP, + To: 6379, + } + task.Resources.Ports = &portmappings + cfg.Ports = []string{"main", "REDIS"} + + dh := dockerDriverHarness(t, nil) + driver := dh.Impl().(*Driver) + + c, err := driver.createContainerConfig(task, cfg, "org/repo:0.1") + require.NoError(t, err) + + require.Equal(t, "org/repo:0.1", c.Config.Image) + + // Verify that the correct ports are FORWARDED + expectedPortBindings := map[docker.Port][]docker.PortBinding{ + docker.Port("8080/tcp"): {{HostIP: hostIP, HostPort: fmt.Sprintf("%d", ports[0])}}, + docker.Port("8080/udp"): {{HostIP: hostIP, HostPort: fmt.Sprintf("%d", ports[0])}}, + docker.Port("6379/tcp"): {{HostIP: hostIP, HostPort: fmt.Sprintf("%d", ports[1])}}, + docker.Port("6379/udp"): {{HostIP: hostIP, HostPort: fmt.Sprintf("%d", ports[1])}}, + } + require.Exactly(t, expectedPortBindings, c.HostConfig.PortBindings) + +} func TestDockerDriver_CreateContainerConfig_PortsMapping(t *testing.T) { t.Parallel() diff --git a/drivers/docker/ports.go b/drivers/docker/ports.go new file mode 100644 index 000000000..e3df4cdef --- /dev/null +++ b/drivers/docker/ports.go @@ -0,0 +1,52 @@ +package docker + +import ( + "strconv" + + docker "github.com/fsouza/go-dockerclient" + "github.com/hashicorp/go-hclog" + "github.com/hashicorp/nomad/helper/pluginutils/hclutils" +) + +type publishedPorts struct { + logger hclog.Logger + publishedPorts map[docker.Port][]docker.PortBinding + exposedPorts map[docker.Port]struct{} +} + +func newPublishedPorts(logger hclog.Logger) *publishedPorts { + return &publishedPorts{ + logger: logger, + publishedPorts: map[docker.Port][]docker.PortBinding{}, + exposedPorts: map[docker.Port]struct{}{}, + } +} + +// adds the port to the structures the Docker API expects for declaring mapped ports +func (p *publishedPorts) addMapped(label, ip string, port int, portMap hclutils.MapStrInt) { + // By default we will map the allocated port 1:1 to the container + containerPortInt := port + + // If the user has mapped a port using port_map we'll change it here + if mapped, ok := portMap[label]; ok { + containerPortInt = mapped + } + + p.add(label, ip, port, containerPortInt) +} + +func (p *publishedPorts) add(label, ip string, port, to int) { + if to == 0 { + to = port + } + hostPortStr := strconv.Itoa(port) + containerPort := docker.Port(strconv.Itoa(to)) + + p.publishedPorts[containerPort+"/tcp"] = getPortBinding(ip, hostPortStr) + p.publishedPorts[containerPort+"/udp"] = getPortBinding(ip, hostPortStr) + p.logger.Debug("allocated static port", "ip", ip, "port", port) + + p.exposedPorts[containerPort+"/tcp"] = struct{}{} + p.exposedPorts[containerPort+"/udp"] = struct{}{} + p.logger.Debug("exposed port", "port", port) +} diff --git a/plugins/drivers/driver.go b/plugins/drivers/driver.go index 5cf4cf7fe..c2d040eed 100644 --- a/plugins/drivers/driver.go +++ b/plugins/drivers/driver.go @@ -334,6 +334,7 @@ func (tc *TaskConfig) EncodeConcreteDriverConfig(t interface{}) error { type Resources struct { NomadResources *structs.AllocatedTaskResources LinuxResources *LinuxResources + Ports *structs.AllocatedPorts } func (r *Resources) Copy() *Resources { @@ -347,6 +348,11 @@ func (r *Resources) Copy() *Resources { if r.LinuxResources != nil { res.LinuxResources = r.LinuxResources.Copy() } + + if r.Ports != nil { + ports := structs.AllocatedPorts(append(make([]structs.AllocatedPortMapping, 0, len(*r.Ports)), *r.Ports...)) + res.Ports = &ports + } return res } diff --git a/plugins/drivers/proto/driver.pb.go b/plugins/drivers/proto/driver.pb.go index 40a12e0db..f68f8af9a 100644 --- a/plugins/drivers/proto/driver.pb.go +++ b/plugins/drivers/proto/driver.pb.go @@ -233,7 +233,7 @@ func (x CPUUsage_Fields) String() string { } func (CPUUsage_Fields) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{52, 0} + return fileDescriptor_4a8f45747846a74d, []int{53, 0} } type MemoryUsage_Fields int32 @@ -273,7 +273,7 @@ func (x MemoryUsage_Fields) String() string { } func (MemoryUsage_Fields) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{53, 0} + return fileDescriptor_4a8f45747846a74d, []int{54, 0} } type TaskConfigSchemaRequest struct { @@ -2213,10 +2213,13 @@ type Resources struct { // AllocatedResources are the resources set for the task AllocatedResources *AllocatedTaskResources `protobuf:"bytes,1,opt,name=allocated_resources,json=allocatedResources,proto3" json:"allocated_resources,omitempty"` // LinuxResources are the computed values to set for specific Linux features - LinuxResources *LinuxResources `protobuf:"bytes,2,opt,name=linux_resources,json=linuxResources,proto3" json:"linux_resources,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + LinuxResources *LinuxResources `protobuf:"bytes,2,opt,name=linux_resources,json=linuxResources,proto3" json:"linux_resources,omitempty"` + // Ports are the allocated port mappings for the allocation. + // A task may use these to manually configure port mapping if shared network namespaces aren't being used. + Ports []*PortMapping `protobuf:"bytes,3,rep,name=ports,proto3" json:"ports,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Resources) Reset() { *m = Resources{} } @@ -2258,6 +2261,13 @@ func (m *Resources) GetLinuxResources() *LinuxResources { return nil } +func (m *Resources) GetPorts() []*PortMapping { + if m != nil { + return m.Ports + } + return nil +} + type AllocatedTaskResources struct { Cpu *AllocatedCpuResources `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` Memory *AllocatedMemoryResources `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` @@ -2517,6 +2527,69 @@ func (m *NetworkPort) GetValue() int32 { return 0 } +type PortMapping struct { + Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"` + Value int32 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` + To int32 `protobuf:"varint,3,opt,name=to,proto3" json:"to,omitempty"` + HostIp string `protobuf:"bytes,4,opt,name=host_ip,json=hostIp,proto3" json:"host_ip,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PortMapping) Reset() { *m = PortMapping{} } +func (m *PortMapping) String() string { return proto.CompactTextString(m) } +func (*PortMapping) ProtoMessage() {} +func (*PortMapping) Descriptor() ([]byte, []int) { + return fileDescriptor_4a8f45747846a74d, []int{42} +} + +func (m *PortMapping) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PortMapping.Unmarshal(m, b) +} +func (m *PortMapping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PortMapping.Marshal(b, m, deterministic) +} +func (m *PortMapping) XXX_Merge(src proto.Message) { + xxx_messageInfo_PortMapping.Merge(m, src) +} +func (m *PortMapping) XXX_Size() int { + return xxx_messageInfo_PortMapping.Size(m) +} +func (m *PortMapping) XXX_DiscardUnknown() { + xxx_messageInfo_PortMapping.DiscardUnknown(m) +} + +var xxx_messageInfo_PortMapping proto.InternalMessageInfo + +func (m *PortMapping) GetLabel() string { + if m != nil { + return m.Label + } + return "" +} + +func (m *PortMapping) GetValue() int32 { + if m != nil { + return m.Value + } + return 0 +} + +func (m *PortMapping) GetTo() int32 { + if m != nil { + return m.To + } + return 0 +} + +func (m *PortMapping) GetHostIp() string { + if m != nil { + return m.HostIp + } + return "" +} + type LinuxResources struct { // CPU CFS (Completely Fair Scheduler) period. Default: 0 (not specified) CpuPeriod int64 `protobuf:"varint,1,opt,name=cpu_period,json=cpuPeriod,proto3" json:"cpu_period,omitempty"` @@ -2543,7 +2616,7 @@ func (m *LinuxResources) Reset() { *m = LinuxResources{} } func (m *LinuxResources) String() string { return proto.CompactTextString(m) } func (*LinuxResources) ProtoMessage() {} func (*LinuxResources) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{42} + return fileDescriptor_4a8f45747846a74d, []int{43} } func (m *LinuxResources) XXX_Unmarshal(b []byte) error { @@ -2636,7 +2709,7 @@ func (m *Mount) Reset() { *m = Mount{} } func (m *Mount) String() string { return proto.CompactTextString(m) } func (*Mount) ProtoMessage() {} func (*Mount) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{43} + return fileDescriptor_4a8f45747846a74d, []int{44} } func (m *Mount) XXX_Unmarshal(b []byte) error { @@ -2700,7 +2773,7 @@ func (m *Device) Reset() { *m = Device{} } func (m *Device) String() string { return proto.CompactTextString(m) } func (*Device) ProtoMessage() {} func (*Device) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{44} + return fileDescriptor_4a8f45747846a74d, []int{45} } func (m *Device) XXX_Unmarshal(b []byte) error { @@ -2762,7 +2835,7 @@ func (m *TaskHandle) Reset() { *m = TaskHandle{} } func (m *TaskHandle) String() string { return proto.CompactTextString(m) } func (*TaskHandle) ProtoMessage() {} func (*TaskHandle) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{45} + return fileDescriptor_4a8f45747846a74d, []int{46} } func (m *TaskHandle) XXX_Unmarshal(b []byte) error { @@ -2830,7 +2903,7 @@ func (m *NetworkOverride) Reset() { *m = NetworkOverride{} } func (m *NetworkOverride) String() string { return proto.CompactTextString(m) } func (*NetworkOverride) ProtoMessage() {} func (*NetworkOverride) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{46} + return fileDescriptor_4a8f45747846a74d, []int{47} } func (m *NetworkOverride) XXX_Unmarshal(b []byte) error { @@ -2889,7 +2962,7 @@ func (m *ExitResult) Reset() { *m = ExitResult{} } func (m *ExitResult) String() string { return proto.CompactTextString(m) } func (*ExitResult) ProtoMessage() {} func (*ExitResult) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{47} + return fileDescriptor_4a8f45747846a74d, []int{48} } func (m *ExitResult) XXX_Unmarshal(b []byte) error { @@ -2953,7 +3026,7 @@ func (m *TaskStatus) Reset() { *m = TaskStatus{} } func (m *TaskStatus) String() string { return proto.CompactTextString(m) } func (*TaskStatus) ProtoMessage() {} func (*TaskStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{48} + return fileDescriptor_4a8f45747846a74d, []int{49} } func (m *TaskStatus) XXX_Unmarshal(b []byte) error { @@ -3029,7 +3102,7 @@ func (m *TaskDriverStatus) Reset() { *m = TaskDriverStatus{} } func (m *TaskDriverStatus) String() string { return proto.CompactTextString(m) } func (*TaskDriverStatus) ProtoMessage() {} func (*TaskDriverStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{49} + return fileDescriptor_4a8f45747846a74d, []int{50} } func (m *TaskDriverStatus) XXX_Unmarshal(b []byte) error { @@ -3075,7 +3148,7 @@ func (m *TaskStats) Reset() { *m = TaskStats{} } func (m *TaskStats) String() string { return proto.CompactTextString(m) } func (*TaskStats) ProtoMessage() {} func (*TaskStats) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{50} + return fileDescriptor_4a8f45747846a74d, []int{51} } func (m *TaskStats) XXX_Unmarshal(b []byte) error { @@ -3138,7 +3211,7 @@ func (m *TaskResourceUsage) Reset() { *m = TaskResourceUsage{} } func (m *TaskResourceUsage) String() string { return proto.CompactTextString(m) } func (*TaskResourceUsage) ProtoMessage() {} func (*TaskResourceUsage) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{51} + return fileDescriptor_4a8f45747846a74d, []int{52} } func (m *TaskResourceUsage) XXX_Unmarshal(b []byte) error { @@ -3191,7 +3264,7 @@ func (m *CPUUsage) Reset() { *m = CPUUsage{} } func (m *CPUUsage) String() string { return proto.CompactTextString(m) } func (*CPUUsage) ProtoMessage() {} func (*CPUUsage) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{52} + return fileDescriptor_4a8f45747846a74d, []int{53} } func (m *CPUUsage) XXX_Unmarshal(b []byte) error { @@ -3280,7 +3353,7 @@ func (m *MemoryUsage) Reset() { *m = MemoryUsage{} } func (m *MemoryUsage) String() string { return proto.CompactTextString(m) } func (*MemoryUsage) ProtoMessage() {} func (*MemoryUsage) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{53} + return fileDescriptor_4a8f45747846a74d, []int{54} } func (m *MemoryUsage) XXX_Unmarshal(b []byte) error { @@ -3379,7 +3452,7 @@ func (m *DriverTaskEvent) Reset() { *m = DriverTaskEvent{} } func (m *DriverTaskEvent) String() string { return proto.CompactTextString(m) } func (*DriverTaskEvent) ProtoMessage() {} func (*DriverTaskEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{54} + return fileDescriptor_4a8f45747846a74d, []int{55} } func (m *DriverTaskEvent) XXX_Unmarshal(b []byte) error { @@ -3499,6 +3572,7 @@ func init() { proto.RegisterType((*AllocatedMemoryResources)(nil), "hashicorp.nomad.plugins.drivers.proto.AllocatedMemoryResources") proto.RegisterType((*NetworkResource)(nil), "hashicorp.nomad.plugins.drivers.proto.NetworkResource") proto.RegisterType((*NetworkPort)(nil), "hashicorp.nomad.plugins.drivers.proto.NetworkPort") + proto.RegisterType((*PortMapping)(nil), "hashicorp.nomad.plugins.drivers.proto.PortMapping") proto.RegisterType((*LinuxResources)(nil), "hashicorp.nomad.plugins.drivers.proto.LinuxResources") proto.RegisterType((*Mount)(nil), "hashicorp.nomad.plugins.drivers.proto.Mount") proto.RegisterType((*Device)(nil), "hashicorp.nomad.plugins.drivers.proto.Device") @@ -3523,235 +3597,238 @@ func init() { } var fileDescriptor_4a8f45747846a74d = []byte{ - // 3643 bytes of a gzipped FileDescriptorProto + // 3692 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x5a, 0x4f, 0x6f, 0x1b, 0x49, 0x76, 0x57, 0xf3, 0x9f, 0xc8, 0x47, 0x89, 0x6a, 0x95, 0x65, 0x0f, 0xcd, 0x49, 0x32, 0xde, 0x06, 0x36, 0x10, 0x76, 0x67, 0xe8, 0x19, 0x2d, 0x32, 0x1e, 0xcd, 0x7a, 0xd6, 0xc3, 0xa1, 0x68, 0x49, 0x63, 0x89, 0x52, 0x8a, 0x14, 0xbc, 0x8e, 0xb3, 0xd3, 0x69, 0x75, 0x97, 0xc9, 0xb6, 0xd8, 0x7f, - 0xdc, 0xd5, 0x94, 0xa5, 0x0d, 0x82, 0x04, 0x1b, 0x20, 0xd8, 0x00, 0x09, 0x92, 0xcb, 0x64, 0x2f, - 0x39, 0x6d, 0x8e, 0xf9, 0x02, 0x41, 0x82, 0x3d, 0xe7, 0x0b, 0xe4, 0x96, 0x5c, 0x72, 0xcb, 0x25, - 0x40, 0xf2, 0x0d, 0x16, 0xf5, 0xa7, 0x9b, 0xdd, 0x24, 0x3d, 0x6e, 0x52, 0x3e, 0x91, 0xef, 0x55, - 0xd5, 0xaf, 0x5e, 0xbd, 0xf7, 0xaa, 0xde, 0xab, 0xea, 0x07, 0x9a, 0x3f, 0x1a, 0x0f, 0x6c, 0x97, - 0xde, 0xb7, 0x02, 0xfb, 0x92, 0x04, 0xf4, 0xbe, 0x1f, 0x78, 0xa1, 0x27, 0xa9, 0x26, 0x27, 0xd0, - 0xf7, 0x87, 0x06, 0x1d, 0xda, 0xa6, 0x17, 0xf8, 0x4d, 0xd7, 0x73, 0x0c, 0xab, 0x29, 0xc7, 0x34, - 0xe5, 0x18, 0xd1, 0xad, 0xf1, 0x7b, 0x03, 0xcf, 0x1b, 0x8c, 0x88, 0x40, 0x38, 0x1f, 0xbf, 0xb8, - 0x6f, 0x8d, 0x03, 0x23, 0xb4, 0x3d, 0x57, 0xb6, 0x7f, 0x30, 0xdd, 0x1e, 0xda, 0x0e, 0xa1, 0xa1, - 0xe1, 0xf8, 0xb2, 0xc3, 0x97, 0x03, 0x3b, 0x1c, 0x8e, 0xcf, 0x9b, 0xa6, 0xe7, 0xdc, 0x8f, 0xa7, - 0xbc, 0xcf, 0xa7, 0xbc, 0x1f, 0x89, 0x49, 0x87, 0x46, 0x40, 0xac, 0xfb, 0x43, 0x73, 0x44, 0x7d, - 0x62, 0xb2, 0x5f, 0x9d, 0xfd, 0x91, 0x08, 0xfb, 0xd9, 0x11, 0x68, 0x18, 0x8c, 0xcd, 0x30, 0x5a, - 0xaf, 0x11, 0x86, 0x81, 0x7d, 0x3e, 0x0e, 0x89, 0x00, 0xd2, 0xee, 0xc2, 0x7b, 0x7d, 0x83, 0x5e, - 0xb4, 0x3d, 0xf7, 0x85, 0x3d, 0xe8, 0x99, 0x43, 0xe2, 0x18, 0x98, 0xbc, 0x1a, 0x13, 0x1a, 0x6a, - 0x7f, 0x0c, 0xf5, 0xd9, 0x26, 0xea, 0x7b, 0x2e, 0x25, 0xe8, 0x4b, 0x28, 0x30, 0x69, 0xea, 0xca, - 0x3d, 0x65, 0xbb, 0xba, 0xf3, 0x61, 0xf3, 0x4d, 0x8a, 0x13, 0x32, 0x34, 0xe5, 0x2a, 0x9a, 0x3d, - 0x9f, 0x98, 0x98, 0x8f, 0xd4, 0x6e, 0xc3, 0xad, 0xb6, 0xe1, 0x1b, 0xe7, 0xf6, 0xc8, 0x0e, 0x6d, - 0x42, 0xa3, 0x49, 0xc7, 0xb0, 0x95, 0x66, 0xcb, 0x09, 0x7f, 0x06, 0x6b, 0x66, 0x82, 0x2f, 0x27, - 0xde, 0x6d, 0x66, 0xb2, 0x58, 0x73, 0x8f, 0x53, 0x29, 0xe0, 0x14, 0x9c, 0xb6, 0x05, 0xe8, 0xb1, - 0xed, 0x0e, 0x48, 0xe0, 0x07, 0xb6, 0x1b, 0x46, 0xc2, 0xfc, 0x26, 0x0f, 0xb7, 0x52, 0x6c, 0x29, - 0xcc, 0x4b, 0x80, 0x58, 0x8f, 0x4c, 0x94, 0xfc, 0x76, 0x75, 0xe7, 0xeb, 0x8c, 0xa2, 0xcc, 0xc1, - 0x6b, 0xb6, 0x62, 0xb0, 0x8e, 0x1b, 0x06, 0xd7, 0x38, 0x81, 0x8e, 0xbe, 0x81, 0xd2, 0x90, 0x18, - 0xa3, 0x70, 0x58, 0xcf, 0xdd, 0x53, 0xb6, 0x6b, 0x3b, 0x8f, 0x6f, 0x30, 0xcf, 0x01, 0x07, 0xea, - 0x85, 0x46, 0x48, 0xb0, 0x44, 0x45, 0x1f, 0x01, 0x12, 0xff, 0x74, 0x8b, 0x50, 0x33, 0xb0, 0x7d, - 0xe6, 0xc8, 0xf5, 0xfc, 0x3d, 0x65, 0xbb, 0x82, 0x37, 0x45, 0xcb, 0xde, 0xa4, 0xa1, 0xe1, 0xc3, - 0xc6, 0x94, 0xb4, 0x48, 0x85, 0xfc, 0x05, 0xb9, 0xe6, 0x16, 0xa9, 0x60, 0xf6, 0x17, 0xed, 0x43, - 0xf1, 0xd2, 0x18, 0x8d, 0x09, 0x17, 0xb9, 0xba, 0xf3, 0xc9, 0xdb, 0xdc, 0x43, 0xba, 0xe8, 0x44, - 0x0f, 0x58, 0x8c, 0xff, 0x3c, 0xf7, 0x99, 0xa2, 0xed, 0x42, 0x35, 0x21, 0x37, 0xaa, 0x01, 0x9c, - 0x75, 0xf7, 0x3a, 0xfd, 0x4e, 0xbb, 0xdf, 0xd9, 0x53, 0x57, 0xd0, 0x3a, 0x54, 0xce, 0xba, 0x07, - 0x9d, 0xd6, 0x51, 0xff, 0xe0, 0x99, 0xaa, 0xa0, 0x2a, 0xac, 0x46, 0x44, 0x4e, 0xbb, 0x02, 0x84, - 0x89, 0xe9, 0x5d, 0x92, 0x80, 0x39, 0xb2, 0xb4, 0x2a, 0x7a, 0x0f, 0x56, 0x43, 0x83, 0x5e, 0xe8, - 0xb6, 0x25, 0x65, 0x2e, 0x31, 0xf2, 0xd0, 0x42, 0x87, 0x50, 0x1a, 0x1a, 0xae, 0x35, 0x7a, 0xbb, - 0xdc, 0x69, 0x55, 0x33, 0xf0, 0x03, 0x3e, 0x10, 0x4b, 0x00, 0xe6, 0xdd, 0xa9, 0x99, 0x85, 0x01, - 0xb4, 0x67, 0xa0, 0xf6, 0x42, 0x23, 0x08, 0x93, 0xe2, 0x74, 0xa0, 0xc0, 0xe6, 0x97, 0x1e, 0xbd, - 0xc8, 0x9c, 0x62, 0x67, 0x62, 0x3e, 0x5c, 0xfb, 0xff, 0x1c, 0x6c, 0x26, 0xb0, 0xa5, 0xa7, 0x3e, - 0x85, 0x52, 0x40, 0xe8, 0x78, 0x14, 0x72, 0xf8, 0xda, 0xce, 0xa3, 0x8c, 0xf0, 0x33, 0x48, 0x4d, - 0xcc, 0x61, 0xb0, 0x84, 0x43, 0xdb, 0xa0, 0x8a, 0x11, 0x3a, 0x09, 0x02, 0x2f, 0xd0, 0x1d, 0x3a, - 0xe0, 0x5a, 0xab, 0xe0, 0x9a, 0xe0, 0x77, 0x18, 0xfb, 0x98, 0x0e, 0x12, 0x5a, 0xcd, 0xdf, 0x50, - 0xab, 0xc8, 0x00, 0xd5, 0x25, 0xe1, 0x6b, 0x2f, 0xb8, 0xd0, 0x99, 0x6a, 0x03, 0xdb, 0x22, 0xf5, + 0xdc, 0x5d, 0x94, 0xa5, 0x0d, 0x82, 0x04, 0x1b, 0x20, 0xd8, 0x00, 0x09, 0x92, 0xcb, 0x64, 0x2f, + 0x39, 0x6d, 0x90, 0x53, 0xbe, 0x40, 0x90, 0x60, 0xcf, 0xf9, 0x02, 0x39, 0xe6, 0x92, 0x5b, 0x2e, + 0x01, 0x92, 0x6f, 0xb0, 0xa8, 0x3f, 0xdd, 0xec, 0x26, 0xe9, 0x71, 0x93, 0xf2, 0x89, 0x7c, 0xaf, + 0xaa, 0x7e, 0xf5, 0xfa, 0xbd, 0x57, 0xf5, 0x5e, 0x55, 0x3d, 0xd0, 0xfc, 0xd1, 0x78, 0x60, 0xbb, + 0xe1, 0x7d, 0x2b, 0xb0, 0x2f, 0x49, 0x10, 0xde, 0xf7, 0x03, 0x8f, 0x7a, 0x92, 0x6a, 0x72, 0x02, + 0x7d, 0x7f, 0x68, 0x84, 0x43, 0xdb, 0xf4, 0x02, 0xbf, 0xe9, 0x7a, 0x8e, 0x61, 0x35, 0xe5, 0x98, + 0xa6, 0x1c, 0x23, 0xba, 0x35, 0x7e, 0x6f, 0xe0, 0x79, 0x83, 0x11, 0x11, 0x08, 0xe7, 0xe3, 0x17, + 0xf7, 0xad, 0x71, 0x60, 0x50, 0xdb, 0x73, 0x65, 0xfb, 0x07, 0xd3, 0xed, 0xd4, 0x76, 0x48, 0x48, + 0x0d, 0xc7, 0x97, 0x1d, 0xbe, 0x1c, 0xd8, 0x74, 0x38, 0x3e, 0x6f, 0x9a, 0x9e, 0x73, 0x3f, 0x9e, + 0xf2, 0x3e, 0x9f, 0xf2, 0x7e, 0x24, 0x66, 0x38, 0x34, 0x02, 0x62, 0xdd, 0x1f, 0x9a, 0xa3, 0xd0, + 0x27, 0x26, 0xfb, 0xd5, 0xd9, 0x1f, 0x89, 0xb0, 0x9f, 0x1d, 0x21, 0xa4, 0xc1, 0xd8, 0xa4, 0xd1, + 0xf7, 0x1a, 0x94, 0x06, 0xf6, 0xf9, 0x98, 0x12, 0x01, 0xa4, 0xdd, 0x85, 0xf7, 0xfa, 0x46, 0x78, + 0xd1, 0xf6, 0xdc, 0x17, 0xf6, 0xa0, 0x67, 0x0e, 0x89, 0x63, 0x60, 0xf2, 0x6a, 0x4c, 0x42, 0xaa, + 0xfd, 0x31, 0xd4, 0x67, 0x9b, 0x42, 0xdf, 0x73, 0x43, 0x82, 0xbe, 0x84, 0x02, 0x93, 0xa6, 0xae, + 0xdc, 0x53, 0xb6, 0xab, 0x3b, 0x1f, 0x36, 0xdf, 0xa4, 0x38, 0x21, 0x43, 0x53, 0x7e, 0x45, 0xb3, + 0xe7, 0x13, 0x13, 0xf3, 0x91, 0xda, 0x6d, 0xb8, 0xd5, 0x36, 0x7c, 0xe3, 0xdc, 0x1e, 0xd9, 0xd4, + 0x26, 0x61, 0x34, 0xe9, 0x18, 0xb6, 0xd2, 0x6c, 0x39, 0xe1, 0xcf, 0x60, 0xcd, 0x4c, 0xf0, 0xe5, + 0xc4, 0xbb, 0xcd, 0x4c, 0x16, 0x6b, 0xee, 0x71, 0x2a, 0x05, 0x9c, 0x82, 0xd3, 0xb6, 0x00, 0x3d, + 0xb6, 0xdd, 0x01, 0x09, 0xfc, 0xc0, 0x76, 0x69, 0x24, 0xcc, 0x6f, 0xf2, 0x70, 0x2b, 0xc5, 0x96, + 0xc2, 0xbc, 0x04, 0x88, 0xf5, 0xc8, 0x44, 0xc9, 0x6f, 0x57, 0x77, 0xbe, 0xce, 0x28, 0xca, 0x1c, + 0xbc, 0x66, 0x2b, 0x06, 0xeb, 0xb8, 0x34, 0xb8, 0xc6, 0x09, 0x74, 0xf4, 0x0d, 0x94, 0x86, 0xc4, + 0x18, 0xd1, 0x61, 0x3d, 0x77, 0x4f, 0xd9, 0xae, 0xed, 0x3c, 0xbe, 0xc1, 0x3c, 0x07, 0x1c, 0xa8, + 0x47, 0x0d, 0x4a, 0xb0, 0x44, 0x45, 0x1f, 0x01, 0x12, 0xff, 0x74, 0x8b, 0x84, 0x66, 0x60, 0xfb, + 0xcc, 0x91, 0xeb, 0xf9, 0x7b, 0xca, 0x76, 0x05, 0x6f, 0x8a, 0x96, 0xbd, 0x49, 0x43, 0xc3, 0x87, + 0x8d, 0x29, 0x69, 0x91, 0x0a, 0xf9, 0x0b, 0x72, 0xcd, 0x2d, 0x52, 0xc1, 0xec, 0x2f, 0xda, 0x87, + 0xe2, 0xa5, 0x31, 0x1a, 0x13, 0x2e, 0x72, 0x75, 0xe7, 0x93, 0xb7, 0xb9, 0x87, 0x74, 0xd1, 0x89, + 0x1e, 0xb0, 0x18, 0xff, 0x79, 0xee, 0x33, 0x45, 0xdb, 0x85, 0x6a, 0x42, 0x6e, 0x54, 0x03, 0x38, + 0xeb, 0xee, 0x75, 0xfa, 0x9d, 0x76, 0xbf, 0xb3, 0xa7, 0xae, 0xa0, 0x75, 0xa8, 0x9c, 0x75, 0x0f, + 0x3a, 0xad, 0xa3, 0xfe, 0xc1, 0x33, 0x55, 0x41, 0x55, 0x58, 0x8d, 0x88, 0x9c, 0x76, 0x05, 0x08, + 0x13, 0xd3, 0xbb, 0x24, 0x01, 0x73, 0x64, 0x69, 0x55, 0xf4, 0x1e, 0xac, 0x52, 0x23, 0xbc, 0xd0, + 0x6d, 0x4b, 0xca, 0x5c, 0x62, 0xe4, 0xa1, 0x85, 0x0e, 0xa1, 0x34, 0x34, 0x5c, 0x6b, 0xf4, 0x76, + 0xb9, 0xd3, 0xaa, 0x66, 0xe0, 0x07, 0x7c, 0x20, 0x96, 0x00, 0xcc, 0xbb, 0x53, 0x33, 0x0b, 0x03, + 0x68, 0xcf, 0x40, 0xed, 0x51, 0x23, 0xa0, 0x49, 0x71, 0x3a, 0x50, 0x60, 0xf3, 0x4b, 0x8f, 0x5e, + 0x64, 0x4e, 0xb1, 0x32, 0x31, 0x1f, 0xae, 0xfd, 0x7f, 0x0e, 0x36, 0x13, 0xd8, 0xd2, 0x53, 0x9f, + 0x42, 0x29, 0x20, 0xe1, 0x78, 0x44, 0x39, 0x7c, 0x6d, 0xe7, 0x51, 0x46, 0xf8, 0x19, 0xa4, 0x26, + 0xe6, 0x30, 0x58, 0xc2, 0xa1, 0x6d, 0x50, 0xc5, 0x08, 0x9d, 0x04, 0x81, 0x17, 0xe8, 0x4e, 0x38, + 0xe0, 0x5a, 0xab, 0xe0, 0x9a, 0xe0, 0x77, 0x18, 0xfb, 0x38, 0x1c, 0x24, 0xb4, 0x9a, 0xbf, 0xa1, + 0x56, 0x91, 0x01, 0xaa, 0x4b, 0xe8, 0x6b, 0x2f, 0xb8, 0xd0, 0x99, 0x6a, 0x03, 0xdb, 0x22, 0xf5, 0x02, 0x07, 0xfd, 0x34, 0x23, 0x68, 0x57, 0x0c, 0x3f, 0x91, 0xa3, 0xf1, 0x86, 0x9b, 0x66, 0x68, - 0x3f, 0x84, 0x92, 0x58, 0x29, 0xf3, 0xa4, 0xde, 0x59, 0xbb, 0xdd, 0xe9, 0xf5, 0xd4, 0x15, 0x54, - 0x81, 0x22, 0xee, 0xf4, 0x31, 0xf3, 0xb0, 0x0a, 0x14, 0x1f, 0xb7, 0xfa, 0xad, 0x23, 0x35, 0xa7, - 0xfd, 0x00, 0x36, 0x9e, 0x1a, 0x76, 0x98, 0xc5, 0xb9, 0x34, 0x0f, 0xd4, 0x49, 0x5f, 0x69, 0x9d, - 0xc3, 0x94, 0x75, 0xb2, 0xab, 0xa6, 0x73, 0x65, 0x87, 0x53, 0xf6, 0x50, 0x21, 0x4f, 0x82, 0x40, - 0x9a, 0x80, 0xfd, 0xd5, 0x5e, 0xc3, 0x46, 0x2f, 0xf4, 0xfc, 0x4c, 0x9e, 0xff, 0x23, 0x58, 0x65, - 0x31, 0xca, 0x1b, 0x87, 0xd2, 0xf5, 0xef, 0x36, 0x45, 0x0c, 0x6b, 0x46, 0x31, 0xac, 0xb9, 0x27, - 0x63, 0x1c, 0x8e, 0x7a, 0xa2, 0x3b, 0x50, 0xa2, 0xf6, 0xc0, 0x35, 0x46, 0xf2, 0xb4, 0x90, 0x94, - 0x86, 0x98, 0x93, 0x47, 0x13, 0x4b, 0xc7, 0x6f, 0x03, 0xda, 0x23, 0x34, 0x0c, 0xbc, 0xeb, 0x4c, - 0xf2, 0x6c, 0x41, 0xf1, 0x85, 0x17, 0x98, 0x62, 0x23, 0x96, 0xb1, 0x20, 0xd8, 0xa6, 0x4a, 0x81, - 0x48, 0xec, 0x8f, 0x00, 0x1d, 0xba, 0x2c, 0xa6, 0x64, 0x33, 0xc4, 0xdf, 0xe7, 0xe0, 0x56, 0xaa, - 0xbf, 0x34, 0xc6, 0xf2, 0xfb, 0x90, 0x1d, 0x4c, 0x63, 0x2a, 0xf6, 0x21, 0x3a, 0x81, 0x92, 0xe8, - 0x21, 0x35, 0xf9, 0x60, 0x01, 0x20, 0x11, 0xa6, 0x24, 0x9c, 0x84, 0x99, 0xeb, 0xf4, 0xf9, 0x77, - 0xeb, 0xf4, 0xaf, 0x41, 0x8d, 0xd6, 0x41, 0xdf, 0x6a, 0x9b, 0xaf, 0xe1, 0x96, 0xe9, 0x8d, 0x46, - 0xc4, 0x64, 0xde, 0xa0, 0xdb, 0x6e, 0x48, 0x82, 0x4b, 0x63, 0xf4, 0x76, 0xbf, 0x41, 0x93, 0x51, - 0x87, 0x72, 0x90, 0xf6, 0x1c, 0x36, 0x13, 0x13, 0x4b, 0x43, 0x3c, 0x86, 0x22, 0x65, 0x0c, 0x69, - 0x89, 0x8f, 0x17, 0xb4, 0x04, 0xc5, 0x62, 0xb8, 0x76, 0x4b, 0x80, 0x77, 0x2e, 0x89, 0x1b, 0x2f, - 0x4b, 0xdb, 0x83, 0xcd, 0x1e, 0x77, 0xd3, 0x4c, 0x7e, 0x38, 0x71, 0xf1, 0x5c, 0xca, 0xc5, 0xb7, - 0x00, 0x25, 0x51, 0xa4, 0x23, 0x5e, 0xc3, 0x46, 0xe7, 0x8a, 0x98, 0x99, 0x90, 0xeb, 0xb0, 0x6a, - 0x7a, 0x8e, 0x63, 0xb8, 0x56, 0x3d, 0x77, 0x2f, 0xbf, 0x5d, 0xc1, 0x11, 0x99, 0xdc, 0x8b, 0xf9, - 0xac, 0x7b, 0x51, 0xfb, 0x5b, 0x05, 0xd4, 0xc9, 0xdc, 0x52, 0x91, 0x4c, 0xfa, 0xd0, 0x62, 0x40, - 0x6c, 0xee, 0x35, 0x2c, 0x29, 0xc9, 0x8f, 0x8e, 0x0b, 0xc1, 0x27, 0x41, 0x90, 0x38, 0x8e, 0xf2, - 0x37, 0x3c, 0x8e, 0xb4, 0x03, 0xf8, 0x9d, 0x48, 0x9c, 0x5e, 0x18, 0x10, 0xc3, 0xb1, 0xdd, 0xc1, - 0xe1, 0xc9, 0x89, 0x4f, 0x84, 0xe0, 0x08, 0x41, 0xc1, 0x32, 0x42, 0x43, 0x0a, 0xc6, 0xff, 0xb3, - 0x4d, 0x6f, 0x8e, 0x3c, 0x1a, 0x6f, 0x7a, 0x4e, 0x68, 0xff, 0x9e, 0x87, 0xfa, 0x0c, 0x54, 0xa4, - 0xde, 0xe7, 0x50, 0xa4, 0x24, 0x1c, 0xfb, 0xd2, 0x55, 0x3a, 0x99, 0x05, 0x9e, 0x8f, 0xd7, 0xec, - 0x31, 0x30, 0x2c, 0x30, 0xd1, 0x00, 0xca, 0x61, 0x78, 0xad, 0x53, 0xfb, 0xe7, 0x51, 0x42, 0x70, - 0x74, 0x53, 0xfc, 0x3e, 0x09, 0x1c, 0xdb, 0x35, 0x46, 0x3d, 0xfb, 0xe7, 0x04, 0xaf, 0x86, 0xe1, - 0x35, 0xfb, 0x83, 0x9e, 0x31, 0x87, 0xb7, 0x6c, 0x57, 0xaa, 0xbd, 0xbd, 0xec, 0x2c, 0x09, 0x05, - 0x63, 0x81, 0xd8, 0x38, 0x82, 0x22, 0x5f, 0xd3, 0x32, 0x8e, 0xa8, 0x42, 0x3e, 0x0c, 0xaf, 0xb9, - 0x50, 0x65, 0xcc, 0xfe, 0x36, 0x1e, 0xc2, 0x5a, 0x72, 0x05, 0xcc, 0x91, 0x86, 0xc4, 0x1e, 0x0c, - 0x85, 0x83, 0x15, 0xb1, 0xa4, 0x98, 0x25, 0x5f, 0xdb, 0x96, 0x4c, 0x59, 0x8b, 0x58, 0x10, 0xda, - 0xbf, 0xe4, 0xe0, 0xee, 0x1c, 0xcd, 0x48, 0x67, 0x7d, 0x9e, 0x72, 0xd6, 0x77, 0xa4, 0x85, 0xc8, - 0xe3, 0x9f, 0xa7, 0x3c, 0xfe, 0x1d, 0x82, 0xb3, 0x6d, 0x73, 0x07, 0x4a, 0xe4, 0xca, 0x0e, 0x89, - 0x25, 0x55, 0x25, 0xa9, 0xc4, 0x76, 0x2a, 0xdc, 0x74, 0x3b, 0x7d, 0x02, 0x5b, 0xed, 0x80, 0x18, - 0x21, 0x91, 0x47, 0x79, 0xe4, 0xff, 0x77, 0xa1, 0x6c, 0x8c, 0x46, 0x9e, 0x39, 0x31, 0xeb, 0x2a, - 0xa7, 0x0f, 0x2d, 0xed, 0x5b, 0x05, 0x6e, 0x4f, 0x8d, 0x91, 0x9a, 0x3e, 0x87, 0x9a, 0x4d, 0xbd, - 0x11, 0x5f, 0x84, 0x9e, 0xb8, 0xc5, 0xfd, 0x78, 0xb1, 0x70, 0x72, 0x18, 0x61, 0xf0, 0x4b, 0xdd, - 0xba, 0x9d, 0x24, 0xb9, 0x57, 0xf1, 0xc9, 0x2d, 0xb9, 0x9b, 0x23, 0x52, 0xfb, 0x07, 0x05, 0x6e, - 0xcb, 0x28, 0x9e, 0x79, 0x31, 0x73, 0x44, 0xce, 0xbd, 0x6b, 0x91, 0xb5, 0x3a, 0xdc, 0x99, 0x96, - 0x4b, 0x9e, 0xeb, 0xff, 0x51, 0x00, 0x34, 0x7b, 0x83, 0x44, 0xdf, 0x83, 0x35, 0x4a, 0x5c, 0x4b, - 0x17, 0x31, 0x41, 0x84, 0xab, 0x32, 0xae, 0x32, 0x9e, 0x08, 0x0e, 0x94, 0x1d, 0x73, 0xe4, 0x4a, - 0x4a, 0x5b, 0xc6, 0xfc, 0x3f, 0x1a, 0xc2, 0xda, 0x0b, 0xaa, 0xc7, 0x73, 0x73, 0xa7, 0xa9, 0x65, - 0x3e, 0xba, 0x66, 0xe5, 0x68, 0x3e, 0xee, 0xc5, 0xeb, 0xc2, 0xd5, 0x17, 0x34, 0x26, 0xd0, 0x2f, - 0x15, 0x78, 0x2f, 0x4a, 0x1d, 0x26, 0xea, 0x73, 0x3c, 0x8b, 0xd0, 0x7a, 0xe1, 0x5e, 0x7e, 0xbb, - 0xb6, 0x73, 0x7a, 0x03, 0xfd, 0xcd, 0x30, 0x8f, 0x3d, 0x8b, 0xe0, 0xdb, 0xee, 0x1c, 0x2e, 0x45, - 0x4d, 0xb8, 0xe5, 0x8c, 0x69, 0xa8, 0x0b, 0x2f, 0xd0, 0x65, 0xa7, 0x7a, 0x91, 0xeb, 0x65, 0x93, - 0x35, 0xa5, 0x7c, 0x15, 0x5d, 0xc0, 0xba, 0xe3, 0x8d, 0xdd, 0x50, 0x37, 0xf9, 0x1d, 0x87, 0xd6, - 0x4b, 0x0b, 0x5d, 0x7e, 0xe7, 0x68, 0xe9, 0x98, 0xc1, 0x89, 0x1b, 0x13, 0xc5, 0x6b, 0x4e, 0x82, - 0xd2, 0x9a, 0x50, 0x4d, 0xe8, 0x10, 0x95, 0xa1, 0xd0, 0x3d, 0xe9, 0x76, 0xd4, 0x15, 0x04, 0x50, - 0x6a, 0x1f, 0xe0, 0x93, 0x93, 0xbe, 0x48, 0xfb, 0x0f, 0x8f, 0x5b, 0xfb, 0x1d, 0x35, 0xa7, 0x75, - 0x60, 0x2d, 0x89, 0x86, 0x10, 0xd4, 0xce, 0xba, 0x4f, 0xba, 0x27, 0x4f, 0xbb, 0xfa, 0xf1, 0xc9, - 0x59, 0xb7, 0xcf, 0x2e, 0x0c, 0x35, 0x80, 0x56, 0xf7, 0xd9, 0x84, 0x5e, 0x87, 0x4a, 0xf7, 0x24, - 0x22, 0x95, 0x46, 0x4e, 0x55, 0xb4, 0xff, 0xcd, 0xc1, 0xd6, 0x3c, 0xc5, 0x22, 0x0b, 0x0a, 0xcc, - 0x48, 0xf2, 0xca, 0xf6, 0xee, 0x6d, 0xc4, 0xd1, 0x99, 0x6f, 0xfa, 0x86, 0x3c, 0xa3, 0x2b, 0x98, - 0xff, 0x47, 0x3a, 0x94, 0x46, 0xc6, 0x39, 0x19, 0xd1, 0x7a, 0x9e, 0x3f, 0x6a, 0xec, 0xdf, 0x64, - 0xee, 0x23, 0x8e, 0x24, 0x5e, 0x34, 0x24, 0x6c, 0x63, 0x17, 0xaa, 0x09, 0xf6, 0x9c, 0xa7, 0x83, - 0xad, 0xe4, 0xd3, 0x41, 0x25, 0xf9, 0x0e, 0xf0, 0x68, 0x56, 0x5b, 0x6c, 0x35, 0xcc, 0x5c, 0x07, - 0x27, 0xbd, 0xbe, 0xb8, 0xa4, 0xed, 0xe3, 0x93, 0xb3, 0x53, 0x55, 0x61, 0xcc, 0x7e, 0xab, 0xf7, - 0x44, 0xcd, 0xc5, 0xd6, 0xcc, 0x6b, 0xcf, 0xa1, 0xb2, 0xd7, 0xed, 0x09, 0xa3, 0xb1, 0x03, 0x8a, - 0x92, 0x80, 0x2d, 0x81, 0xbf, 0xdf, 0x54, 0x70, 0x44, 0xa2, 0x06, 0x94, 0x29, 0x31, 0x02, 0x73, - 0x48, 0xa8, 0x8c, 0x88, 0x31, 0xcd, 0x46, 0x79, 0xfc, 0x1d, 0x44, 0x28, 0xa8, 0x82, 0x23, 0x52, - 0xfb, 0xbf, 0x55, 0x80, 0xc9, 0x9d, 0x1c, 0xd5, 0x20, 0x17, 0x9f, 0x62, 0x39, 0xdb, 0x62, 0xca, - 0x76, 0x0d, 0x27, 0x5a, 0x15, 0xff, 0x8f, 0x76, 0xe0, 0xb6, 0x43, 0x07, 0xbe, 0x61, 0x5e, 0xe8, - 0xf2, 0x2a, 0x2d, 0x9c, 0x9d, 0x9f, 0x08, 0x6b, 0xf8, 0x96, 0x6c, 0x94, 0xbe, 0x2c, 0x70, 0x8f, - 0x20, 0x4f, 0xdc, 0x4b, 0xbe, 0x7b, 0xab, 0x3b, 0x9f, 0x2f, 0xfc, 0x56, 0xd0, 0xec, 0xb8, 0x97, - 0xc2, 0x20, 0x0c, 0x06, 0xe9, 0x00, 0x16, 0xb9, 0xb4, 0x4d, 0xa2, 0x33, 0xd0, 0x22, 0x07, 0xfd, - 0x72, 0x71, 0xd0, 0x3d, 0x8e, 0x11, 0x43, 0x57, 0xac, 0x88, 0x46, 0x5d, 0xa8, 0x04, 0x84, 0x7a, - 0xe3, 0xc0, 0x24, 0x62, 0x0b, 0x67, 0x4f, 0xe7, 0x71, 0x34, 0x0e, 0x4f, 0x20, 0xd0, 0x1e, 0x94, - 0xf8, 0xce, 0xa5, 0xf5, 0x55, 0x2e, 0xec, 0x87, 0x19, 0xc1, 0xf8, 0x76, 0xc5, 0x72, 0x2c, 0xda, - 0x87, 0x55, 0x21, 0x22, 0xad, 0x97, 0x39, 0xcc, 0x47, 0x59, 0x8f, 0x15, 0x3e, 0x0a, 0x47, 0xa3, - 0x99, 0x55, 0xc7, 0x94, 0x04, 0xf5, 0x8a, 0xb0, 0x2a, 0xfb, 0x8f, 0xde, 0x87, 0x8a, 0x88, 0x62, - 0x96, 0x1d, 0xd4, 0x81, 0x37, 0x88, 0xb0, 0xb6, 0x67, 0x07, 0xe8, 0x03, 0xa8, 0x8a, 0x8c, 0x44, - 0xe7, 0x5b, 0xaf, 0xca, 0x9b, 0x41, 0xb0, 0x4e, 0xd9, 0x06, 0x14, 0x1d, 0x48, 0x10, 0x88, 0x0e, - 0x6b, 0x71, 0x07, 0x12, 0x04, 0xbc, 0xc3, 0xef, 0xc3, 0x06, 0xcf, 0xe3, 0x06, 0x81, 0x37, 0xf6, - 0x75, 0xee, 0x53, 0xeb, 0xbc, 0xd3, 0x3a, 0x63, 0xef, 0x33, 0x6e, 0x97, 0x39, 0xd7, 0x5d, 0x28, - 0xbf, 0xf4, 0xce, 0x45, 0x87, 0x9a, 0x08, 0xa6, 0x2f, 0xbd, 0xf3, 0xa8, 0x29, 0x8e, 0xb3, 0x1b, - 0xe9, 0x38, 0xfb, 0x0a, 0xee, 0xcc, 0x06, 0x0c, 0x1e, 0x6f, 0xd5, 0x9b, 0xc7, 0xdb, 0x2d, 0x77, - 0xde, 0x61, 0xf7, 0x15, 0xe4, 0x2d, 0x97, 0xd6, 0x37, 0x17, 0x72, 0x8e, 0x78, 0x1f, 0x63, 0x36, - 0xb8, 0xf1, 0x29, 0x94, 0x23, 0xef, 0x5b, 0xe4, 0x48, 0x69, 0x3c, 0x84, 0x5a, 0xda, 0x77, 0x17, - 0x3a, 0x90, 0xfe, 0x53, 0x81, 0x4a, 0xec, 0xa5, 0xc8, 0x85, 0x5b, 0x5c, 0x8b, 0x2c, 0xc9, 0xd1, - 0x27, 0x4e, 0x2f, 0x52, 0xab, 0x2f, 0x32, 0xae, 0xab, 0x15, 0x21, 0xc8, 0x7b, 0x9c, 0xdc, 0x01, - 0x28, 0x46, 0x9e, 0xcc, 0xf7, 0x0d, 0x6c, 0x8c, 0x6c, 0x77, 0x7c, 0x95, 0x98, 0x4b, 0xe4, 0x44, - 0x7f, 0x90, 0x71, 0xae, 0x23, 0x36, 0x7a, 0x32, 0x47, 0x6d, 0x94, 0xa2, 0xb5, 0x6f, 0x73, 0x70, - 0x67, 0xbe, 0x38, 0xa8, 0x0b, 0x79, 0xd3, 0x1f, 0xcb, 0xa5, 0x3d, 0x5c, 0x74, 0x69, 0x6d, 0x7f, - 0x3c, 0x99, 0x95, 0x01, 0xa1, 0xa7, 0x50, 0x72, 0x88, 0xe3, 0x05, 0xd7, 0x72, 0x05, 0x8f, 0x16, - 0x85, 0x3c, 0xe6, 0xa3, 0x27, 0xa8, 0x12, 0x0e, 0x61, 0x28, 0x4b, 0x9f, 0xa3, 0xf2, 0x74, 0x5b, - 0xf0, 0xc9, 0x24, 0x82, 0xc4, 0x31, 0x8e, 0xf6, 0x29, 0xdc, 0x9e, 0xbb, 0x14, 0xf4, 0xbb, 0x00, - 0xa6, 0x3f, 0xd6, 0xf9, 0x93, 0xb6, 0xb0, 0x7b, 0x1e, 0x57, 0x4c, 0x7f, 0xdc, 0xe3, 0x0c, 0xed, - 0x01, 0xd4, 0xdf, 0x24, 0x2f, 0x3b, 0x33, 0x84, 0xc4, 0xba, 0x73, 0xce, 0x75, 0x90, 0xc7, 0x65, - 0xc1, 0x38, 0x3e, 0xd7, 0x7e, 0x95, 0x83, 0x8d, 0x29, 0x71, 0xd8, 0x95, 0x43, 0x9c, 0x41, 0xd1, - 0x65, 0x4e, 0x50, 0xec, 0x40, 0x32, 0x6d, 0x2b, 0x7a, 0x06, 0xe4, 0xff, 0x79, 0x28, 0xf2, 0xe5, - 0x13, 0x5d, 0xce, 0xf6, 0x99, 0x43, 0x3b, 0xe7, 0x76, 0x48, 0xf9, 0xad, 0xa4, 0x88, 0x05, 0x81, - 0x9e, 0x41, 0x2d, 0x20, 0x3c, 0x04, 0x5a, 0xba, 0xef, 0x05, 0x61, 0xa4, 0xb0, 0x9d, 0xc5, 0x14, - 0x76, 0xea, 0x05, 0x21, 0x5e, 0x8f, 0x90, 0x18, 0x45, 0xd1, 0x53, 0x58, 0xb7, 0xae, 0x5d, 0xc3, - 0xb1, 0x4d, 0x89, 0x5c, 0x5a, 0x1a, 0x79, 0x4d, 0x02, 0x71, 0x60, 0x6d, 0x17, 0xaa, 0x89, 0x46, - 0xb6, 0x30, 0x9e, 0x65, 0x48, 0x9d, 0x08, 0x22, 0xbd, 0x7f, 0x8b, 0x72, 0xff, 0x6a, 0xff, 0x94, - 0x83, 0x5a, 0x7a, 0x03, 0x44, 0xf6, 0xf3, 0x49, 0x60, 0x7b, 0x56, 0xc2, 0x7e, 0xa7, 0x9c, 0xc1, - 0x6c, 0xc4, 0x9a, 0x5f, 0x8d, 0xbd, 0xd0, 0x88, 0x6c, 0x64, 0xfa, 0xe3, 0x3f, 0x64, 0xf4, 0x94, - 0xed, 0xf3, 0x53, 0xb6, 0x47, 0x1f, 0x02, 0x92, 0xf6, 0x1d, 0xd9, 0x8e, 0x1d, 0xea, 0xe7, 0xd7, - 0x21, 0x11, 0xfa, 0xcf, 0x63, 0x55, 0xb4, 0x1c, 0xb1, 0x86, 0xaf, 0x18, 0x1f, 0x69, 0xb0, 0xee, - 0x79, 0x8e, 0x4e, 0x4d, 0x2f, 0x20, 0xba, 0x61, 0xbd, 0xe4, 0x59, 0x72, 0x1e, 0x57, 0x3d, 0xcf, - 0xe9, 0x31, 0x5e, 0xcb, 0x7a, 0xc9, 0xe2, 0x84, 0xe9, 0x8f, 0x29, 0x09, 0x75, 0xf6, 0xc3, 0x43, - 0x6b, 0x05, 0x83, 0x60, 0xb5, 0xfd, 0x31, 0x4d, 0x74, 0x70, 0x88, 0xc3, 0xc2, 0x65, 0xa2, 0xc3, - 0x31, 0x71, 0xd8, 0x2c, 0x6b, 0xa7, 0x24, 0x30, 0x89, 0x1b, 0xf6, 0x6d, 0xf3, 0x82, 0x45, 0x42, - 0x65, 0x5b, 0xc1, 0x29, 0x9e, 0xf6, 0x33, 0x28, 0xf2, 0xc8, 0xc9, 0x16, 0xcf, 0xa3, 0x0e, 0x0f, - 0x4a, 0x42, 0xbd, 0x65, 0xc6, 0xe0, 0x21, 0xe9, 0x7d, 0xa8, 0x0c, 0x3d, 0x2a, 0x43, 0x9a, 0xf0, - 0xbc, 0x32, 0x63, 0xf0, 0xc6, 0x06, 0x94, 0x03, 0x62, 0x58, 0x9e, 0x3b, 0x8a, 0x5e, 0x12, 0x62, - 0x5a, 0x7b, 0x05, 0x25, 0x71, 0xfc, 0xde, 0x00, 0xff, 0x23, 0x40, 0xa6, 0x88, 0x85, 0x3e, 0x09, - 0x1c, 0x9b, 0x52, 0x99, 0x9c, 0xf1, 0xcf, 0x57, 0xa2, 0xe5, 0x74, 0xd2, 0xa0, 0xfd, 0x97, 0x22, - 0xd2, 0x34, 0xf1, 0x61, 0x81, 0xe5, 0x73, 0xcc, 0xd3, 0xd8, 0x35, 0x4c, 0xbc, 0x60, 0x44, 0x24, - 0xbb, 0xbc, 0xcb, 0x6c, 0x2c, 0xb7, 0xec, 0x77, 0x19, 0x09, 0x10, 0xbd, 0x67, 0x12, 0x79, 0xd3, - 0x5b, 0xf4, 0x3d, 0x93, 0x88, 0xf7, 0x4c, 0xc2, 0xee, 0x9b, 0x32, 0x4f, 0x14, 0x70, 0x05, 0x9e, - 0x26, 0x56, 0xad, 0xf8, 0xd1, 0x98, 0x68, 0xff, 0xa3, 0xc4, 0x67, 0x45, 0xf4, 0xb8, 0x8b, 0xbe, - 0x81, 0x32, 0xdb, 0x76, 0xba, 0x63, 0xf8, 0xf2, 0x53, 0x65, 0x7b, 0xb9, 0x77, 0xe3, 0x26, 0xdb, - 0x65, 0xc7, 0x86, 0x2f, 0xb2, 0xbc, 0x55, 0x5f, 0x50, 0xec, 0xcc, 0x31, 0xac, 0xc9, 0x99, 0xc3, - 0xfe, 0xa3, 0xef, 0x43, 0xcd, 0x18, 0x87, 0x9e, 0x6e, 0x58, 0x97, 0x24, 0x08, 0x6d, 0x4a, 0xa4, - 0xed, 0xd7, 0x19, 0xb7, 0x15, 0x31, 0x1b, 0x9f, 0xc3, 0x5a, 0x12, 0xf3, 0x6d, 0xd1, 0xb7, 0x98, - 0x8c, 0xbe, 0x7f, 0x02, 0x30, 0x79, 0x28, 0x61, 0x3e, 0x42, 0xae, 0x6c, 0x76, 0x5d, 0x94, 0xf7, - 0xa6, 0x22, 0x2e, 0x33, 0x46, 0x9b, 0xdd, 0x10, 0xd2, 0xaf, 0xb8, 0xc5, 0xe8, 0x15, 0x97, 0xed, - 0x5a, 0xb6, 0xd1, 0x2e, 0xec, 0xd1, 0x28, 0x7e, 0xbc, 0xa9, 0x78, 0x9e, 0xf3, 0x84, 0x33, 0xb4, - 0xdf, 0xe4, 0x84, 0xaf, 0x88, 0xf7, 0xf8, 0x4c, 0x29, 0xfd, 0xbb, 0x32, 0xf5, 0x2e, 0x00, 0x0d, - 0x8d, 0x80, 0xa5, 0x12, 0x46, 0xf4, 0x7c, 0xd4, 0x98, 0x79, 0x06, 0xee, 0x47, 0x65, 0x05, 0xb8, - 0x22, 0x7b, 0xb7, 0x42, 0xf4, 0x05, 0xac, 0x99, 0x9e, 0xe3, 0x8f, 0x88, 0x1c, 0x5c, 0x7c, 0xeb, - 0xe0, 0x6a, 0xdc, 0xbf, 0x15, 0x26, 0x1e, 0xad, 0x4a, 0x37, 0x7d, 0xb4, 0xfa, 0x57, 0x45, 0x7c, - 0x56, 0x48, 0x7e, 0xd5, 0x40, 0x83, 0x39, 0x9f, 0xce, 0xf7, 0x97, 0xfc, 0x44, 0xf2, 0x5d, 0xdf, - 0xcd, 0x1b, 0x5f, 0x64, 0xf9, 0x50, 0xfd, 0xe6, 0xe4, 0xee, 0xdf, 0xf2, 0x50, 0x89, 0xbf, 0x28, - 0xcc, 0xd8, 0xfe, 0x33, 0xa8, 0xc4, 0x35, 0x1d, 0xf2, 0x80, 0xf8, 0x4e, 0xf3, 0xc4, 0x9d, 0xd1, - 0x0b, 0x40, 0xc6, 0x60, 0x10, 0x27, 0x6d, 0xfa, 0x98, 0x1a, 0x83, 0xe8, 0x7b, 0xce, 0x67, 0x0b, - 0xe8, 0x21, 0x8a, 0x5b, 0x67, 0x6c, 0x3c, 0x56, 0x8d, 0xc1, 0x20, 0xc5, 0x41, 0x7f, 0x0a, 0xb7, - 0xd3, 0x73, 0xe8, 0xe7, 0xd7, 0xba, 0x6f, 0x5b, 0xf2, 0xea, 0x78, 0xb0, 0xe8, 0x47, 0x95, 0x66, - 0x0a, 0xfe, 0xab, 0xeb, 0x53, 0xdb, 0x12, 0x3a, 0x47, 0xc1, 0x4c, 0x43, 0xe3, 0xcf, 0xe1, 0xbd, - 0x37, 0x74, 0x9f, 0x63, 0x83, 0x6e, 0xba, 0x58, 0x60, 0x79, 0x25, 0x24, 0xac, 0xf7, 0x6b, 0x45, - 0x7c, 0xfb, 0x49, 0xeb, 0xa4, 0x95, 0xcc, 0x5b, 0xef, 0x67, 0x9c, 0xa7, 0x7d, 0x7a, 0x26, 0xe0, - 0x79, 0xaa, 0xfa, 0xf5, 0x54, 0xaa, 0x9a, 0x35, 0x89, 0x11, 0x19, 0x9f, 0x00, 0x92, 0x08, 0xda, - 0x3f, 0xe7, 0xa1, 0x1c, 0xa1, 0xf3, 0x8b, 0xdf, 0x35, 0x0d, 0x89, 0xa3, 0xc7, 0x4f, 0x3f, 0x0a, - 0x06, 0xc1, 0xe2, 0xcf, 0x1c, 0xef, 0x43, 0x85, 0xdd, 0x2f, 0x45, 0x73, 0x8e, 0x37, 0x97, 0x19, - 0x83, 0x37, 0x7e, 0x00, 0xd5, 0xd0, 0x0b, 0x8d, 0x91, 0x1e, 0xf2, 0x58, 0x9e, 0x17, 0xa3, 0x39, - 0x8b, 0x47, 0x72, 0xf4, 0x43, 0xd8, 0x0c, 0x87, 0x81, 0x17, 0x86, 0x23, 0x96, 0xdf, 0xf1, 0x8c, - 0x46, 0x24, 0x20, 0x05, 0xac, 0xc6, 0x0d, 0x22, 0xd3, 0xa1, 0xec, 0xf4, 0x9e, 0x74, 0x66, 0xae, - 0xcb, 0x0f, 0x91, 0x02, 0x5e, 0x8f, 0xb9, 0xcc, 0xb5, 0x59, 0xf0, 0xf4, 0x45, 0xb6, 0xc0, 0xcf, - 0x0a, 0x05, 0x47, 0x24, 0xd2, 0x61, 0xc3, 0x21, 0x06, 0x1d, 0x07, 0xc4, 0xd2, 0x5f, 0xd8, 0x64, - 0x64, 0x89, 0xfb, 0x7a, 0x2d, 0x73, 0xfa, 0x1d, 0xa9, 0xa5, 0xf9, 0x98, 0x8f, 0xc6, 0xb5, 0x08, - 0x4e, 0xd0, 0x2c, 0x73, 0x10, 0xff, 0xd0, 0x06, 0x54, 0x7b, 0xcf, 0x7a, 0xfd, 0xce, 0xb1, 0x7e, - 0x7c, 0xb2, 0xd7, 0x91, 0xf5, 0x20, 0xbd, 0x0e, 0x16, 0xa4, 0xc2, 0xda, 0xfb, 0x27, 0xfd, 0xd6, - 0x91, 0xde, 0x3f, 0x6c, 0x3f, 0xe9, 0xa9, 0x39, 0x74, 0x1b, 0x36, 0xfb, 0x07, 0xf8, 0xa4, 0xdf, - 0x3f, 0xea, 0xec, 0xe9, 0xa7, 0x1d, 0x7c, 0x78, 0xb2, 0xd7, 0x53, 0xf3, 0x08, 0x41, 0x6d, 0xc2, - 0xee, 0x1f, 0x1e, 0x77, 0xd4, 0x02, 0xaa, 0xc2, 0xea, 0x69, 0x07, 0xb7, 0x3b, 0xdd, 0xbe, 0x5a, - 0xd4, 0x7e, 0x95, 0x87, 0x6a, 0xc2, 0x8a, 0xcc, 0x91, 0x03, 0x2a, 0xf2, 0xfc, 0x02, 0x66, 0x7f, - 0xf9, 0xf7, 0x2b, 0xc3, 0x1c, 0x0a, 0xeb, 0x14, 0xb0, 0x20, 0x78, 0x6e, 0x6f, 0x5c, 0x25, 0xf6, - 0x79, 0x01, 0x97, 0x1d, 0xe3, 0x4a, 0x80, 0x7c, 0x0f, 0xd6, 0x2e, 0x48, 0xe0, 0x92, 0x91, 0x6c, - 0x17, 0x16, 0xa9, 0x0a, 0x9e, 0xe8, 0xb2, 0x0d, 0xaa, 0xec, 0x32, 0x81, 0x11, 0xe6, 0xa8, 0x09, - 0xfe, 0x71, 0x04, 0xb6, 0x05, 0x45, 0xd1, 0xbc, 0x2a, 0xe6, 0xe7, 0x04, 0x0b, 0x53, 0xf4, 0xb5, - 0xe1, 0xf3, 0xfc, 0xae, 0x80, 0xf9, 0x7f, 0x74, 0x3e, 0x6b, 0x9f, 0x12, 0xb7, 0xcf, 0xee, 0xe2, - 0xee, 0xfc, 0x26, 0x13, 0x0d, 0x63, 0x13, 0xad, 0x42, 0x1e, 0x47, 0x45, 0x14, 0xed, 0x56, 0xfb, - 0x80, 0x99, 0x65, 0x1d, 0x2a, 0xc7, 0xad, 0x9f, 0xea, 0x67, 0x3d, 0xfe, 0xa2, 0x8a, 0x54, 0x58, - 0x7b, 0xd2, 0xc1, 0xdd, 0xce, 0x91, 0xe4, 0xe4, 0xd1, 0x16, 0xa8, 0x92, 0x33, 0xe9, 0x57, 0x60, - 0x08, 0xe2, 0x6f, 0x11, 0x95, 0xa1, 0xd0, 0x7b, 0xda, 0x3a, 0x55, 0x4b, 0xda, 0x7f, 0xe7, 0x60, - 0x43, 0x84, 0x85, 0xf8, 0x73, 0xef, 0x9b, 0x3f, 0x77, 0x25, 0x1f, 0x3f, 0x72, 0xe9, 0xc7, 0x8f, - 0x28, 0x09, 0xe5, 0x51, 0x3d, 0x3f, 0x49, 0x42, 0xf9, 0xa3, 0x49, 0xea, 0xc4, 0x2f, 0x2c, 0x72, - 0xe2, 0xd7, 0x61, 0xd5, 0x21, 0x34, 0xb6, 0x5b, 0x05, 0x47, 0x24, 0xb2, 0xa1, 0x6a, 0xb8, 0xae, - 0x17, 0x1a, 0xe2, 0x45, 0xb1, 0xb4, 0x50, 0x30, 0x9c, 0x5a, 0x71, 0xb3, 0x35, 0x41, 0x12, 0x07, - 0x73, 0x12, 0xbb, 0xf1, 0x13, 0x50, 0xa7, 0x3b, 0x2c, 0x12, 0x0e, 0x7f, 0xf0, 0xc9, 0x24, 0x1a, - 0x12, 0xb6, 0x2f, 0xe4, 0x7b, 0xb7, 0xba, 0xc2, 0x08, 0x7c, 0xd6, 0xed, 0x1e, 0x76, 0xf7, 0x55, - 0x05, 0x01, 0x94, 0x3a, 0x3f, 0x3d, 0xec, 0x77, 0xf6, 0xd4, 0xdc, 0xce, 0xaf, 0x37, 0xa1, 0x24, - 0x84, 0x44, 0xdf, 0xca, 0x4c, 0x20, 0x59, 0x4a, 0x88, 0x7e, 0xb2, 0x70, 0x46, 0x9d, 0x2a, 0x4f, - 0x6c, 0x3c, 0x5a, 0x7a, 0xbc, 0xfc, 0xac, 0xb3, 0x82, 0xfe, 0x5a, 0x81, 0xb5, 0xd4, 0x27, 0x9d, - 0xac, 0x2f, 0xaa, 0x73, 0x2a, 0x17, 0x1b, 0x3f, 0x5e, 0x6a, 0x6c, 0x2c, 0xcb, 0x2f, 0x15, 0xa8, - 0x26, 0x6a, 0xf6, 0xd0, 0xee, 0x32, 0x75, 0x7e, 0x42, 0x92, 0xcf, 0x97, 0x2f, 0x11, 0xd4, 0x56, - 0x3e, 0x56, 0xd0, 0x5f, 0x29, 0x50, 0x4d, 0x54, 0xaf, 0x65, 0x16, 0x65, 0xb6, 0xd6, 0x2e, 0xb3, - 0x28, 0xf3, 0x8a, 0xe5, 0x56, 0xd0, 0x5f, 0x28, 0x50, 0x89, 0x2b, 0xd1, 0xd0, 0x83, 0xc5, 0x6b, - 0xd7, 0x84, 0x10, 0x9f, 0x2d, 0x5b, 0xf4, 0xa6, 0xad, 0xa0, 0x3f, 0x83, 0x72, 0x54, 0xb6, 0x85, - 0xb2, 0x46, 0xaf, 0xa9, 0x9a, 0xb0, 0xc6, 0x83, 0x85, 0xc7, 0x25, 0xa7, 0x8f, 0x6a, 0xa9, 0x32, - 0x4f, 0x3f, 0x55, 0xf5, 0xd5, 0x78, 0xb0, 0xf0, 0xb8, 0x78, 0x7a, 0xe6, 0x09, 0x89, 0x92, 0xab, - 0xcc, 0x9e, 0x30, 0x5b, 0xeb, 0x95, 0xd9, 0x13, 0xe6, 0x55, 0x78, 0x09, 0x41, 0x12, 0x45, 0x5b, - 0x99, 0x05, 0x99, 0x2d, 0x0c, 0xcb, 0x2c, 0xc8, 0x9c, 0x1a, 0x31, 0x6d, 0x05, 0xfd, 0x42, 0x49, - 0xde, 0x0b, 0x1e, 0x2c, 0x5c, 0x9b, 0xb4, 0xa0, 0x4b, 0xce, 0x54, 0x47, 0xf1, 0x0d, 0xfa, 0x0b, - 0xf9, 0x8a, 0x21, 0x4a, 0x9b, 0xd0, 0x22, 0x60, 0xa9, 0x6a, 0xa8, 0xc6, 0xa7, 0xcb, 0x05, 0x1b, - 0x2e, 0xc4, 0x5f, 0x2a, 0x00, 0x93, 0x22, 0xa8, 0xcc, 0x42, 0xcc, 0x54, 0x5f, 0x35, 0x76, 0x97, - 0x18, 0x99, 0xdc, 0x20, 0x51, 0x91, 0x46, 0xe6, 0x0d, 0x32, 0x55, 0xa4, 0x95, 0x79, 0x83, 0x4c, - 0x17, 0x58, 0x69, 0x2b, 0xe8, 0x1f, 0x15, 0xd8, 0x9c, 0x29, 0x12, 0x41, 0x8f, 0x6e, 0x58, 0x27, - 0xd4, 0xf8, 0x72, 0x79, 0x80, 0x48, 0xb4, 0x6d, 0xe5, 0x63, 0x05, 0xfd, 0x8d, 0x02, 0xeb, 0xe9, - 0x0f, 0xeb, 0x99, 0xa3, 0xd4, 0x9c, 0x72, 0x93, 0xc6, 0xc3, 0xe5, 0x06, 0xc7, 0xda, 0xfa, 0x3b, - 0x05, 0x6a, 0xe9, 0x1a, 0x0b, 0xf4, 0x70, 0xb1, 0x63, 0x61, 0x4a, 0xa0, 0x2f, 0x96, 0x1c, 0x1d, - 0x49, 0xf4, 0xd5, 0xea, 0x1f, 0x15, 0x45, 0xf6, 0x56, 0xe2, 0x3f, 0x3f, 0xfa, 0x6d, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x29, 0x1e, 0x98, 0x4c, 0x27, 0x32, 0x00, 0x00, + 0x3f, 0x84, 0x92, 0xf8, 0x52, 0xe6, 0x49, 0xbd, 0xb3, 0x76, 0xbb, 0xd3, 0xeb, 0xa9, 0x2b, 0xa8, + 0x02, 0x45, 0xdc, 0xe9, 0x63, 0xe6, 0x61, 0x15, 0x28, 0x3e, 0x6e, 0xf5, 0x5b, 0x47, 0x6a, 0x4e, + 0xfb, 0x01, 0x6c, 0x3c, 0x35, 0x6c, 0x9a, 0xc5, 0xb9, 0x34, 0x0f, 0xd4, 0x49, 0x5f, 0x69, 0x9d, + 0xc3, 0x94, 0x75, 0xb2, 0xab, 0xa6, 0x73, 0x65, 0xd3, 0x29, 0x7b, 0xa8, 0x90, 0x27, 0x41, 0x20, + 0x4d, 0xc0, 0xfe, 0x6a, 0xaf, 0x61, 0xa3, 0x47, 0x3d, 0x3f, 0x93, 0xe7, 0xff, 0x08, 0x56, 0x59, + 0x8c, 0xf2, 0xc6, 0x54, 0xba, 0xfe, 0xdd, 0xa6, 0x88, 0x61, 0xcd, 0x28, 0x86, 0x35, 0xf7, 0x64, + 0x8c, 0xc3, 0x51, 0x4f, 0x74, 0x07, 0x4a, 0xa1, 0x3d, 0x70, 0x8d, 0x91, 0xdc, 0x2d, 0x24, 0xa5, + 0x21, 0xe6, 0xe4, 0xd1, 0xc4, 0xd2, 0xf1, 0xdb, 0x80, 0xf6, 0x48, 0x48, 0x03, 0xef, 0x3a, 0x93, + 0x3c, 0x5b, 0x50, 0x7c, 0xe1, 0x05, 0xa6, 0x58, 0x88, 0x65, 0x2c, 0x08, 0xb6, 0xa8, 0x52, 0x20, + 0x12, 0xfb, 0x23, 0x40, 0x87, 0x2e, 0x8b, 0x29, 0xd9, 0x0c, 0xf1, 0xf7, 0x39, 0xb8, 0x95, 0xea, + 0x2f, 0x8d, 0xb1, 0xfc, 0x3a, 0x64, 0x1b, 0xd3, 0x38, 0x14, 0xeb, 0x10, 0x9d, 0x40, 0x49, 0xf4, + 0x90, 0x9a, 0x7c, 0xb0, 0x00, 0x90, 0x08, 0x53, 0x12, 0x4e, 0xc2, 0xcc, 0x75, 0xfa, 0xfc, 0xbb, + 0x75, 0xfa, 0xd7, 0xa0, 0x46, 0xdf, 0x11, 0xbe, 0xd5, 0x36, 0x5f, 0xc3, 0x2d, 0xd3, 0x1b, 0x8d, + 0x88, 0xc9, 0xbc, 0x41, 0xb7, 0x5d, 0x4a, 0x82, 0x4b, 0x63, 0xf4, 0x76, 0xbf, 0x41, 0x93, 0x51, + 0x87, 0x72, 0x90, 0xf6, 0x1c, 0x36, 0x13, 0x13, 0x4b, 0x43, 0x3c, 0x86, 0x62, 0xc8, 0x18, 0xd2, + 0x12, 0x1f, 0x2f, 0x68, 0x89, 0x10, 0x8b, 0xe1, 0xda, 0x2d, 0x01, 0xde, 0xb9, 0x24, 0x6e, 0xfc, + 0x59, 0xda, 0x1e, 0x6c, 0xf6, 0xb8, 0x9b, 0x66, 0xf2, 0xc3, 0x89, 0x8b, 0xe7, 0x52, 0x2e, 0xbe, + 0x05, 0x28, 0x89, 0x22, 0x1d, 0xf1, 0x1a, 0x36, 0x3a, 0x57, 0xc4, 0xcc, 0x84, 0x5c, 0x87, 0x55, + 0xd3, 0x73, 0x1c, 0xc3, 0xb5, 0xea, 0xb9, 0x7b, 0xf9, 0xed, 0x0a, 0x8e, 0xc8, 0xe4, 0x5a, 0xcc, + 0x67, 0x5d, 0x8b, 0xda, 0xdf, 0x2a, 0xa0, 0x4e, 0xe6, 0x96, 0x8a, 0x64, 0xd2, 0x53, 0x8b, 0x01, + 0xb1, 0xb9, 0xd7, 0xb0, 0xa4, 0x24, 0x3f, 0xda, 0x2e, 0x04, 0x9f, 0x04, 0x41, 0x62, 0x3b, 0xca, + 0xdf, 0x70, 0x3b, 0xd2, 0x0e, 0xe0, 0x77, 0x22, 0x71, 0x7a, 0x34, 0x20, 0x86, 0x63, 0xbb, 0x83, + 0xc3, 0x93, 0x13, 0x9f, 0x08, 0xc1, 0x11, 0x82, 0x82, 0x65, 0x50, 0x43, 0x0a, 0xc6, 0xff, 0xb3, + 0x45, 0x6f, 0x8e, 0xbc, 0x30, 0x5e, 0xf4, 0x9c, 0xd0, 0xfe, 0x23, 0x0f, 0xf5, 0x19, 0xa8, 0x48, + 0xbd, 0xcf, 0xa1, 0x18, 0x12, 0x3a, 0xf6, 0xa5, 0xab, 0x74, 0x32, 0x0b, 0x3c, 0x1f, 0xaf, 0xd9, + 0x63, 0x60, 0x58, 0x60, 0xa2, 0x01, 0x94, 0x29, 0xbd, 0xd6, 0x43, 0xfb, 0xe7, 0x51, 0x42, 0x70, + 0x74, 0x53, 0xfc, 0x3e, 0x09, 0x1c, 0xdb, 0x35, 0x46, 0x3d, 0xfb, 0xe7, 0x04, 0xaf, 0x52, 0x7a, + 0xcd, 0xfe, 0xa0, 0x67, 0xcc, 0xe1, 0x2d, 0xdb, 0x95, 0x6a, 0x6f, 0x2f, 0x3b, 0x4b, 0x42, 0xc1, + 0x58, 0x20, 0x36, 0x8e, 0xa0, 0xc8, 0xbf, 0x69, 0x19, 0x47, 0x54, 0x21, 0x4f, 0xe9, 0x35, 0x17, + 0xaa, 0x8c, 0xd9, 0xdf, 0xc6, 0x43, 0x58, 0x4b, 0x7e, 0x01, 0x73, 0xa4, 0x21, 0xb1, 0x07, 0x43, + 0xe1, 0x60, 0x45, 0x2c, 0x29, 0x66, 0xc9, 0xd7, 0xb6, 0x25, 0x53, 0xd6, 0x22, 0x16, 0x84, 0xf6, + 0xaf, 0x39, 0xb8, 0x3b, 0x47, 0x33, 0xd2, 0x59, 0x9f, 0xa7, 0x9c, 0xf5, 0x1d, 0x69, 0x21, 0xf2, + 0xf8, 0xe7, 0x29, 0x8f, 0x7f, 0x87, 0xe0, 0x6c, 0xd9, 0xdc, 0x81, 0x12, 0xb9, 0xb2, 0x29, 0xb1, + 0xa4, 0xaa, 0x24, 0x95, 0x58, 0x4e, 0x85, 0x9b, 0x2e, 0xa7, 0x4f, 0x60, 0xab, 0x1d, 0x10, 0x83, + 0x12, 0xb9, 0x95, 0x47, 0xfe, 0x7f, 0x17, 0xca, 0xc6, 0x68, 0xe4, 0x99, 0x13, 0xb3, 0xae, 0x72, + 0xfa, 0xd0, 0xd2, 0xbe, 0x55, 0xe0, 0xf6, 0xd4, 0x18, 0xa9, 0xe9, 0x73, 0xa8, 0xd9, 0xa1, 0x37, + 0xe2, 0x1f, 0xa1, 0x27, 0x4e, 0x71, 0x3f, 0x5e, 0x2c, 0x9c, 0x1c, 0x46, 0x18, 0xfc, 0x50, 0xb7, + 0x6e, 0x27, 0x49, 0xee, 0x55, 0x7c, 0x72, 0x4b, 0xae, 0xe6, 0x88, 0xd4, 0xfe, 0x41, 0x81, 0xdb, + 0x32, 0x8a, 0x67, 0xfe, 0x98, 0x39, 0x22, 0xe7, 0xde, 0xb5, 0xc8, 0x5a, 0x1d, 0xee, 0x4c, 0xcb, + 0x25, 0xf7, 0xf5, 0xff, 0x2c, 0x00, 0x9a, 0x3d, 0x41, 0xa2, 0xef, 0xc1, 0x5a, 0x48, 0x5c, 0x4b, + 0x17, 0x31, 0x41, 0x84, 0xab, 0x32, 0xae, 0x32, 0x9e, 0x08, 0x0e, 0x21, 0xdb, 0xe6, 0xc8, 0x95, + 0x94, 0xb6, 0x8c, 0xf9, 0x7f, 0x34, 0x84, 0xb5, 0x17, 0xa1, 0x1e, 0xcf, 0xcd, 0x9d, 0xa6, 0x96, + 0x79, 0xeb, 0x9a, 0x95, 0xa3, 0xf9, 0xb8, 0x17, 0x7f, 0x17, 0xae, 0xbe, 0x08, 0x63, 0x02, 0xfd, + 0x52, 0x81, 0xf7, 0xa2, 0xd4, 0x61, 0xa2, 0x3e, 0xc7, 0xb3, 0x48, 0x58, 0x2f, 0xdc, 0xcb, 0x6f, + 0xd7, 0x76, 0x4e, 0x6f, 0xa0, 0xbf, 0x19, 0xe6, 0xb1, 0x67, 0x11, 0x7c, 0xdb, 0x9d, 0xc3, 0x0d, + 0x51, 0x13, 0x6e, 0x39, 0xe3, 0x90, 0xea, 0xc2, 0x0b, 0x74, 0xd9, 0xa9, 0x5e, 0xe4, 0x7a, 0xd9, + 0x64, 0x4d, 0x29, 0x5f, 0x45, 0x17, 0xb0, 0xee, 0x78, 0x63, 0x97, 0xea, 0x26, 0x3f, 0xe3, 0x84, + 0xf5, 0xd2, 0x42, 0x87, 0xdf, 0x39, 0x5a, 0x3a, 0x66, 0x70, 0xe2, 0xc4, 0x14, 0xe2, 0x35, 0x27, + 0x41, 0x69, 0x4d, 0xa8, 0x26, 0x74, 0x88, 0xca, 0x50, 0xe8, 0x9e, 0x74, 0x3b, 0xea, 0x0a, 0x02, + 0x28, 0xb5, 0x0f, 0xf0, 0xc9, 0x49, 0x5f, 0xa4, 0xfd, 0x87, 0xc7, 0xad, 0xfd, 0x8e, 0x9a, 0xd3, + 0x3a, 0xb0, 0x96, 0x44, 0x43, 0x08, 0x6a, 0x67, 0xdd, 0x27, 0xdd, 0x93, 0xa7, 0x5d, 0xfd, 0xf8, + 0xe4, 0xac, 0xdb, 0x67, 0x07, 0x86, 0x1a, 0x40, 0xab, 0xfb, 0x6c, 0x42, 0xaf, 0x43, 0xa5, 0x7b, + 0x12, 0x91, 0x4a, 0x23, 0xa7, 0x2a, 0xda, 0xff, 0xe6, 0x60, 0x6b, 0x9e, 0x62, 0x91, 0x05, 0x05, + 0x66, 0x24, 0x79, 0x64, 0x7b, 0xf7, 0x36, 0xe2, 0xe8, 0xcc, 0x37, 0x7d, 0x43, 0xee, 0xd1, 0x15, + 0xcc, 0xff, 0x23, 0x1d, 0x4a, 0x23, 0xe3, 0x9c, 0x8c, 0xc2, 0x7a, 0x9e, 0x5f, 0x6a, 0xec, 0xdf, + 0x64, 0xee, 0x23, 0x8e, 0x24, 0x6e, 0x34, 0x24, 0x6c, 0x63, 0x17, 0xaa, 0x09, 0xf6, 0x9c, 0xab, + 0x83, 0xad, 0xe4, 0xd5, 0x41, 0x25, 0x79, 0x0f, 0xf0, 0x68, 0x56, 0x5b, 0xec, 0x6b, 0x98, 0xb9, + 0x0e, 0x4e, 0x7a, 0x7d, 0x71, 0x48, 0xdb, 0xc7, 0x27, 0x67, 0xa7, 0xaa, 0xc2, 0x98, 0xfd, 0x56, + 0xef, 0x89, 0x9a, 0x8b, 0xad, 0x99, 0xd7, 0x9e, 0x43, 0x65, 0xaf, 0xdb, 0x13, 0x46, 0x63, 0x1b, + 0x54, 0x48, 0x02, 0xf6, 0x09, 0xfc, 0xfe, 0xa6, 0x82, 0x23, 0x12, 0x35, 0xa0, 0x1c, 0x12, 0x23, + 0x30, 0x87, 0x24, 0x94, 0x11, 0x31, 0xa6, 0xd9, 0x28, 0x8f, 0xdf, 0x83, 0x08, 0x05, 0x55, 0x70, + 0x44, 0x6a, 0xff, 0xb7, 0x0a, 0x30, 0x39, 0x93, 0xa3, 0x1a, 0xe4, 0xe2, 0x5d, 0x2c, 0x67, 0x5b, + 0x4c, 0xd9, 0xae, 0xe1, 0x44, 0x5f, 0xc5, 0xff, 0xa3, 0x1d, 0xb8, 0xed, 0x84, 0x03, 0xdf, 0x30, + 0x2f, 0x74, 0x79, 0x94, 0x16, 0xce, 0xce, 0x77, 0x84, 0x35, 0x7c, 0x4b, 0x36, 0x4a, 0x5f, 0x16, + 0xb8, 0x47, 0x90, 0x27, 0xee, 0x25, 0x5f, 0xbd, 0xd5, 0x9d, 0xcf, 0x17, 0xbe, 0x2b, 0x68, 0x76, + 0xdc, 0x4b, 0x61, 0x10, 0x06, 0x83, 0x74, 0x00, 0x8b, 0x5c, 0xda, 0x26, 0xd1, 0x19, 0x68, 0x91, + 0x83, 0x7e, 0xb9, 0x38, 0xe8, 0x1e, 0xc7, 0x88, 0xa1, 0x2b, 0x56, 0x44, 0xa3, 0x2e, 0x54, 0x02, + 0x12, 0x7a, 0xe3, 0xc0, 0x24, 0x62, 0x09, 0x67, 0x4f, 0xe7, 0x71, 0x34, 0x0e, 0x4f, 0x20, 0xd0, + 0x1e, 0x94, 0xf8, 0xca, 0x0d, 0xeb, 0xab, 0x5c, 0xd8, 0x0f, 0x33, 0x82, 0xf1, 0xe5, 0x8a, 0xe5, + 0x58, 0xb4, 0x0f, 0xab, 0x42, 0xc4, 0xb0, 0x5e, 0xe6, 0x30, 0x1f, 0x65, 0xdd, 0x56, 0xf8, 0x28, + 0x1c, 0x8d, 0x66, 0x56, 0x1d, 0x87, 0x24, 0xa8, 0x57, 0x84, 0x55, 0xd9, 0x7f, 0xf4, 0x3e, 0x54, + 0x44, 0x14, 0xb3, 0xec, 0xa0, 0x0e, 0xbc, 0x41, 0x84, 0xb5, 0x3d, 0x3b, 0x40, 0x1f, 0x40, 0x55, + 0x64, 0x24, 0x3a, 0x5f, 0x7a, 0x55, 0xde, 0x0c, 0x82, 0x75, 0xca, 0x16, 0xa0, 0xe8, 0x40, 0x82, + 0x40, 0x74, 0x58, 0x8b, 0x3b, 0x90, 0x20, 0xe0, 0x1d, 0x7e, 0x1f, 0x36, 0x78, 0x1e, 0x37, 0x08, + 0xbc, 0xb1, 0xaf, 0x73, 0x9f, 0x5a, 0xe7, 0x9d, 0xd6, 0x19, 0x7b, 0x9f, 0x71, 0xbb, 0xcc, 0xb9, + 0xee, 0x42, 0xf9, 0xa5, 0x77, 0x2e, 0x3a, 0xd4, 0x44, 0x30, 0x7d, 0xe9, 0x9d, 0x47, 0x4d, 0x71, + 0x9c, 0xdd, 0x48, 0xc7, 0xd9, 0x57, 0x70, 0x67, 0x36, 0x60, 0xf0, 0x78, 0xab, 0xde, 0x3c, 0xde, + 0x6e, 0xb9, 0xf3, 0x36, 0xbb, 0xaf, 0x20, 0x6f, 0xb9, 0x61, 0x7d, 0x73, 0x21, 0xe7, 0x88, 0xd7, + 0x31, 0x66, 0x83, 0x1b, 0x9f, 0x42, 0x39, 0xf2, 0xbe, 0x45, 0xb6, 0x94, 0xc6, 0x43, 0xa8, 0xa5, + 0x7d, 0x77, 0xa1, 0x0d, 0xe9, 0x9f, 0x73, 0x50, 0x89, 0xbd, 0x14, 0xb9, 0x70, 0x8b, 0x6b, 0x91, + 0x25, 0x39, 0xfa, 0xc4, 0xe9, 0x45, 0x6a, 0xf5, 0x45, 0xc6, 0xef, 0x6a, 0x45, 0x08, 0xf2, 0x1c, + 0x27, 0x57, 0x00, 0x8a, 0x91, 0x27, 0xf3, 0x7d, 0x03, 0x1b, 0x23, 0xdb, 0x1d, 0x5f, 0x25, 0xe6, + 0x12, 0x39, 0xd1, 0x1f, 0x64, 0x9c, 0xeb, 0x88, 0x8d, 0x9e, 0xcc, 0x51, 0x1b, 0xa5, 0x68, 0x74, + 0x00, 0x45, 0xdf, 0x0b, 0x68, 0x14, 0x09, 0x76, 0x32, 0xa2, 0x9e, 0x7a, 0x01, 0x3d, 0x36, 0x7c, + 0x9f, 0xa5, 0xf6, 0x02, 0x40, 0xfb, 0x36, 0x07, 0x77, 0xe6, 0x7f, 0x18, 0xea, 0x42, 0xde, 0xf4, + 0xc7, 0x52, 0x49, 0x0f, 0x17, 0x55, 0x52, 0xdb, 0x1f, 0x4f, 0xe4, 0x67, 0x40, 0xe8, 0x29, 0x94, + 0x1c, 0xe2, 0x78, 0xc1, 0xb5, 0xd4, 0xc5, 0xa3, 0x45, 0x21, 0x8f, 0xf9, 0xe8, 0x09, 0xaa, 0x84, + 0x43, 0x18, 0xca, 0xd2, 0x7b, 0x43, 0xb9, 0x4f, 0x2e, 0x78, 0xf9, 0x12, 0x41, 0xe2, 0x18, 0x47, + 0xfb, 0x14, 0x6e, 0xcf, 0xfd, 0x14, 0xf4, 0xbb, 0x00, 0xa6, 0x3f, 0xd6, 0xf9, 0xe5, 0xb8, 0xf0, + 0xa0, 0x3c, 0xae, 0x98, 0xfe, 0xb8, 0xc7, 0x19, 0xda, 0x03, 0xa8, 0xbf, 0x49, 0x5e, 0xb6, 0xfb, + 0x08, 0x89, 0x75, 0xe7, 0x9c, 0xeb, 0x20, 0x8f, 0xcb, 0x82, 0x71, 0x7c, 0xae, 0xfd, 0x2a, 0x07, + 0x1b, 0x53, 0xe2, 0xb0, 0xc3, 0x8b, 0xd8, 0xcd, 0xa2, 0x63, 0xa1, 0xa0, 0xd8, 0xd6, 0x66, 0xda, + 0x56, 0x74, 0xa1, 0xc8, 0xff, 0xf3, 0xa0, 0xe6, 0xcb, 0xcb, 0xbe, 0x9c, 0xed, 0xb3, 0xa5, 0xe1, + 0x9c, 0xdb, 0x34, 0xe4, 0xe7, 0x9b, 0x22, 0x16, 0x04, 0x7a, 0x06, 0xb5, 0x80, 0xf0, 0x60, 0x6a, + 0xe9, 0xc2, 0x83, 0x8a, 0x0b, 0x79, 0x90, 0x94, 0x90, 0x39, 0x12, 0x5e, 0x8f, 0x90, 0x18, 0x15, + 0xa2, 0xa7, 0xb0, 0x6e, 0x5d, 0xbb, 0x86, 0x63, 0x9b, 0x12, 0xb9, 0xb4, 0x34, 0xf2, 0x9a, 0x04, + 0xe2, 0xc0, 0xda, 0x2e, 0x54, 0x13, 0x8d, 0xec, 0xc3, 0x78, 0xbe, 0x22, 0x75, 0x22, 0x88, 0xf4, + 0x4e, 0x50, 0x94, 0x3b, 0x81, 0x76, 0x0e, 0xd5, 0x84, 0xcf, 0x2f, 0x32, 0x94, 0xe9, 0x93, 0x7a, + 0x5c, 0x9f, 0x45, 0x9c, 0xa3, 0x1e, 0x3b, 0xa3, 0x0f, 0xbd, 0x90, 0xea, 0xb6, 0xcf, 0x35, 0x5a, + 0xc1, 0x25, 0x46, 0x1e, 0xfa, 0xda, 0x3f, 0xe5, 0xa0, 0x96, 0x5e, 0xae, 0x91, 0x8f, 0xf8, 0x24, + 0xb0, 0x3d, 0x2b, 0xe1, 0x23, 0xa7, 0x9c, 0xc1, 0xfc, 0x80, 0x35, 0xbf, 0x1a, 0x7b, 0xd4, 0x88, + 0xfc, 0xc0, 0xf4, 0xc7, 0x7f, 0xc8, 0xe8, 0x29, 0xff, 0xca, 0x4f, 0xf9, 0x17, 0xfa, 0x10, 0x90, + 0xf4, 0xa1, 0x91, 0xed, 0xd8, 0x54, 0x3f, 0xbf, 0xa6, 0x44, 0xd8, 0x38, 0x8f, 0x55, 0xd1, 0x72, + 0xc4, 0x1a, 0xbe, 0x62, 0x7c, 0xa4, 0xc1, 0xba, 0xe7, 0x39, 0x7a, 0x68, 0x7a, 0x01, 0xd1, 0x0d, + 0xeb, 0x25, 0xcf, 0xe9, 0xf3, 0xb8, 0xea, 0x79, 0x4e, 0x8f, 0xf1, 0x5a, 0xd6, 0x4b, 0x16, 0xd5, + 0x4c, 0x7f, 0x1c, 0x12, 0xaa, 0xb3, 0x1f, 0x9e, 0x08, 0x54, 0x30, 0x08, 0x56, 0xdb, 0x1f, 0x87, + 0x89, 0x0e, 0x0e, 0x71, 0x58, 0x70, 0x4f, 0x74, 0x38, 0x26, 0x0e, 0x9b, 0x65, 0xed, 0x94, 0x04, + 0x26, 0x71, 0x69, 0xdf, 0x36, 0x2f, 0x58, 0xdc, 0x56, 0xb6, 0x15, 0x9c, 0xe2, 0x69, 0x3f, 0x83, + 0x22, 0x8f, 0xf3, 0xec, 0xe3, 0x79, 0x8c, 0xe4, 0x21, 0x54, 0xd8, 0xa1, 0xcc, 0x18, 0x3c, 0x80, + 0xbe, 0x0f, 0x15, 0xae, 0xe4, 0x44, 0xee, 0x5b, 0x66, 0x0c, 0xde, 0xd8, 0x80, 0x72, 0x40, 0x0c, + 0xcb, 0x73, 0x47, 0xd1, 0xbd, 0x47, 0x4c, 0x6b, 0xaf, 0xa0, 0x24, 0x82, 0xc5, 0x0d, 0xf0, 0x3f, + 0x02, 0x64, 0x8a, 0xc8, 0xed, 0x93, 0xc0, 0xb1, 0xc3, 0x50, 0xa6, 0x92, 0xfc, 0xb1, 0x4d, 0xb4, + 0x9c, 0x4e, 0x1a, 0xb4, 0xff, 0x52, 0x44, 0x52, 0x29, 0x9e, 0x41, 0x58, 0xf6, 0xc9, 0xbc, 0x99, + 0x1d, 0x1a, 0xc5, 0x7d, 0x4b, 0x44, 0xa2, 0x43, 0x28, 0xc9, 0xdc, 0x31, 0xb7, 0xec, 0x2b, 0x92, + 0x04, 0x88, 0x6e, 0x5f, 0x89, 0x3c, 0x97, 0x2e, 0x7a, 0xfb, 0x4a, 0xc4, 0xed, 0x2b, 0x61, 0xa7, + 0x63, 0x99, 0xd5, 0x0a, 0xb8, 0x02, 0x4f, 0x6a, 0xab, 0x56, 0x7c, 0xc5, 0x4d, 0xb4, 0xff, 0x51, + 0xe2, 0xfd, 0x28, 0xba, 0x8a, 0x46, 0xdf, 0x40, 0x99, 0x2d, 0x6d, 0xdd, 0x31, 0x7c, 0xf9, 0xb0, + 0xda, 0x5e, 0xee, 0x96, 0x3b, 0x8a, 0x44, 0x22, 0x27, 0x5d, 0xf5, 0x05, 0xc5, 0xf6, 0x35, 0xc3, + 0x9a, 0xec, 0x6b, 0xec, 0x3f, 0xfa, 0x3e, 0xd4, 0x8c, 0x31, 0xf5, 0x74, 0xc3, 0xba, 0x24, 0x01, + 0xb5, 0x43, 0x22, 0x6d, 0xbf, 0xce, 0xb8, 0xad, 0x88, 0xd9, 0xf8, 0x1c, 0xd6, 0x92, 0x98, 0x6f, + 0xcb, 0x15, 0x8a, 0xc9, 0x5c, 0xe1, 0x4f, 0x00, 0x26, 0xd7, 0x3a, 0xcc, 0x47, 0xc8, 0x95, 0xcd, + 0x0e, 0xb7, 0xf2, 0x94, 0x57, 0xc4, 0x65, 0xc6, 0x68, 0xb3, 0xf3, 0x4c, 0xfa, 0xce, 0xb9, 0x18, + 0xdd, 0x39, 0xb3, 0x55, 0xcb, 0x16, 0xda, 0x85, 0x3d, 0x1a, 0xc5, 0x57, 0x4d, 0x15, 0xcf, 0x73, + 0x9e, 0x70, 0x86, 0xf6, 0x9b, 0x9c, 0xf0, 0x15, 0xf1, 0x7a, 0x90, 0xe9, 0x00, 0xf2, 0xae, 0x4c, + 0xbd, 0x0b, 0x10, 0x52, 0x23, 0x60, 0x89, 0x8f, 0x11, 0x5d, 0x76, 0x35, 0x66, 0x2e, 0xad, 0xfb, + 0x51, 0x11, 0x04, 0xae, 0xc8, 0xde, 0x2d, 0x8a, 0xbe, 0x80, 0x35, 0xd3, 0x73, 0xfc, 0x11, 0x91, + 0x83, 0x8b, 0x6f, 0x1d, 0x5c, 0x8d, 0xfb, 0xb7, 0x68, 0xe2, 0x8a, 0xad, 0x74, 0xd3, 0x2b, 0xb6, + 0x7f, 0x53, 0xc4, 0x23, 0x48, 0xf2, 0x0d, 0x06, 0x0d, 0xe6, 0x3c, 0xf4, 0xef, 0x2f, 0xf9, 0xa0, + 0xf3, 0x5d, 0xaf, 0xfc, 0x8d, 0x2f, 0xb2, 0x3c, 0xab, 0xbf, 0x39, 0x15, 0xfd, 0xf7, 0x3c, 0x54, + 0xe2, 0xf7, 0x8f, 0x19, 0xdb, 0x7f, 0x06, 0x95, 0xb8, 0x02, 0x45, 0x6e, 0x10, 0xdf, 0x69, 0x9e, + 0xb8, 0x33, 0x7a, 0x01, 0xc8, 0x18, 0x0c, 0xe2, 0x14, 0x53, 0x1f, 0x87, 0xc6, 0x20, 0x7a, 0x7d, + 0xfa, 0x6c, 0x01, 0x3d, 0x44, 0x71, 0xeb, 0x8c, 0x8d, 0xc7, 0xaa, 0x31, 0x18, 0xa4, 0x38, 0xe8, + 0x4f, 0xe1, 0x76, 0x7a, 0x0e, 0xfd, 0xfc, 0x5a, 0xf7, 0x6d, 0x4b, 0x1e, 0x74, 0x0f, 0x16, 0x7d, + 0x02, 0x6a, 0xa6, 0xe0, 0xbf, 0xba, 0x3e, 0xb5, 0x2d, 0xa1, 0x73, 0x14, 0xcc, 0x34, 0x34, 0xfe, + 0x1c, 0xde, 0x7b, 0x43, 0xf7, 0x39, 0x36, 0xe8, 0xa6, 0x4b, 0x1b, 0x96, 0x57, 0x42, 0xc2, 0x7a, + 0xbf, 0x56, 0xc4, 0x4b, 0x55, 0x5a, 0x27, 0xad, 0x64, 0x6e, 0x7c, 0x3f, 0xe3, 0x3c, 0xed, 0xd3, + 0x33, 0x01, 0xcf, 0xd3, 0xe1, 0xaf, 0xa7, 0xd2, 0xe1, 0xac, 0x89, 0x92, 0xc8, 0x2a, 0x05, 0x90, + 0x44, 0xd0, 0xfe, 0x25, 0x0f, 0xe5, 0x08, 0x9d, 0x1f, 0x53, 0xaf, 0x43, 0x4a, 0x1c, 0x3d, 0xbe, + 0xa8, 0x52, 0x30, 0x08, 0x16, 0xbf, 0x94, 0x79, 0x1f, 0x2a, 0xec, 0x34, 0x2c, 0x9a, 0x73, 0xbc, + 0xb9, 0xcc, 0x18, 0xbc, 0xf1, 0x03, 0xa8, 0x52, 0x8f, 0x1a, 0x23, 0x9d, 0xf2, 0x58, 0x9e, 0x17, + 0xa3, 0x39, 0x8b, 0x47, 0x72, 0xf4, 0x43, 0xd8, 0xa4, 0xc3, 0xc0, 0xa3, 0x74, 0xc4, 0x72, 0x48, + 0x9e, 0xd1, 0x88, 0x04, 0xa4, 0x80, 0xd5, 0xb8, 0x41, 0x64, 0x3a, 0x21, 0xdb, 0xbd, 0x27, 0x9d, + 0x99, 0xeb, 0xf2, 0x4d, 0xa4, 0x80, 0xd7, 0x63, 0x2e, 0x73, 0x6d, 0x16, 0x3c, 0x7d, 0x91, 0x2d, + 0xf0, 0xbd, 0x42, 0xc1, 0x11, 0x89, 0x74, 0xd8, 0x70, 0x88, 0x11, 0x8e, 0x03, 0x62, 0xe9, 0x2f, + 0x6c, 0x32, 0xb2, 0xc4, 0xed, 0x42, 0x2d, 0x73, 0x8a, 0x1f, 0xa9, 0xa5, 0xf9, 0x98, 0x8f, 0xc6, + 0xb5, 0x08, 0x4e, 0xd0, 0x2c, 0x73, 0x10, 0xff, 0xd0, 0x06, 0x54, 0x7b, 0xcf, 0x7a, 0xfd, 0xce, + 0xb1, 0x7e, 0x7c, 0xb2, 0xd7, 0x91, 0xd5, 0x2b, 0xbd, 0x0e, 0x16, 0xa4, 0xc2, 0xda, 0xfb, 0x27, + 0xfd, 0xd6, 0x91, 0xde, 0x3f, 0x6c, 0x3f, 0xe9, 0xa9, 0x39, 0x74, 0x1b, 0x36, 0xfb, 0x07, 0xf8, + 0xa4, 0xdf, 0x3f, 0xea, 0xec, 0xe9, 0xa7, 0x1d, 0x7c, 0x78, 0xb2, 0xd7, 0x53, 0xf3, 0x08, 0x41, + 0x6d, 0xc2, 0xee, 0x1f, 0x1e, 0x77, 0xd4, 0x02, 0xaa, 0xc2, 0xea, 0x69, 0x07, 0xb7, 0x3b, 0xdd, + 0xbe, 0x5a, 0xd4, 0x7e, 0x95, 0x87, 0x6a, 0xc2, 0x8a, 0xcc, 0x91, 0x83, 0x50, 0x9c, 0x25, 0x0a, + 0x98, 0xfd, 0xe5, 0xaf, 0x6d, 0x86, 0x39, 0x14, 0xd6, 0x29, 0x60, 0x41, 0xf0, 0xf3, 0x83, 0x71, + 0x95, 0x58, 0xe7, 0x05, 0x5c, 0x76, 0x8c, 0x2b, 0x01, 0xf2, 0x3d, 0x58, 0xbb, 0x20, 0x81, 0x4b, + 0x46, 0xb2, 0x5d, 0x58, 0xa4, 0x2a, 0x78, 0xa2, 0xcb, 0x36, 0xa8, 0xb2, 0xcb, 0x04, 0x46, 0x98, + 0xa3, 0x26, 0xf8, 0xc7, 0x11, 0xd8, 0x16, 0x14, 0x45, 0xf3, 0xaa, 0x98, 0x9f, 0x13, 0x2c, 0x4c, + 0x85, 0xaf, 0x0d, 0x9f, 0xe7, 0x77, 0x05, 0xcc, 0xff, 0xa3, 0xf3, 0x59, 0xfb, 0x94, 0xb8, 0x7d, + 0x76, 0x17, 0x77, 0xe7, 0x37, 0x99, 0x68, 0x18, 0x9b, 0x68, 0x15, 0xf2, 0x38, 0x2a, 0xf9, 0x68, + 0xb7, 0xda, 0x07, 0xcc, 0x2c, 0xeb, 0x50, 0x39, 0x6e, 0xfd, 0x54, 0x3f, 0xeb, 0xf1, 0xfb, 0x5f, + 0xa4, 0xc2, 0xda, 0x93, 0x0e, 0xee, 0x76, 0x8e, 0x24, 0x27, 0x8f, 0xb6, 0x40, 0x95, 0x9c, 0x49, + 0xbf, 0x02, 0x43, 0x10, 0x7f, 0x8b, 0xa8, 0x0c, 0x85, 0xde, 0xd3, 0xd6, 0xa9, 0x5a, 0xd2, 0xfe, + 0x3b, 0x07, 0x1b, 0x22, 0x2c, 0xc4, 0x8f, 0xd3, 0x6f, 0x7e, 0x9c, 0x4b, 0x5e, 0xd5, 0xe4, 0xd2, + 0x57, 0x35, 0x51, 0x12, 0xca, 0xa3, 0x7a, 0x7e, 0x92, 0x84, 0xf2, 0x2b, 0x9e, 0xd4, 0x8e, 0x5f, + 0x58, 0x64, 0xc7, 0xaf, 0xc3, 0xaa, 0x43, 0xc2, 0xd8, 0x6e, 0x15, 0x1c, 0x91, 0xc8, 0x86, 0xaa, + 0xe1, 0xba, 0x1e, 0x35, 0xc4, 0xfd, 0x67, 0x69, 0xa1, 0x60, 0x38, 0xf5, 0xc5, 0xcd, 0xd6, 0x04, + 0x49, 0x6c, 0xcc, 0x49, 0xec, 0xc6, 0x4f, 0x40, 0x9d, 0xee, 0xb0, 0x48, 0x38, 0xfc, 0xc1, 0x27, + 0x93, 0x68, 0x48, 0xd8, 0xba, 0x90, 0xb7, 0xf3, 0xea, 0x0a, 0x23, 0xf0, 0x59, 0xb7, 0x7b, 0xd8, + 0xdd, 0x57, 0x15, 0x04, 0x50, 0xea, 0xfc, 0xf4, 0xb0, 0xdf, 0xd9, 0x53, 0x73, 0x3b, 0xbf, 0xde, + 0x84, 0x92, 0x10, 0x12, 0x7d, 0x2b, 0x33, 0x81, 0x64, 0xe1, 0x23, 0xfa, 0xc9, 0xc2, 0x19, 0x75, + 0xaa, 0x98, 0xb2, 0xf1, 0x68, 0xe9, 0xf1, 0xf2, 0x11, 0x6a, 0x05, 0xfd, 0xb5, 0x02, 0x6b, 0xa9, + 0x07, 0xa8, 0xac, 0xf7, 0xbf, 0x73, 0xea, 0x2c, 0x1b, 0x3f, 0x5e, 0x6a, 0x6c, 0x2c, 0xcb, 0x2f, + 0x15, 0xa8, 0x26, 0x2a, 0x0c, 0xd1, 0xee, 0x32, 0x55, 0x89, 0x42, 0x92, 0xcf, 0x97, 0x2f, 0x68, + 0xd4, 0x56, 0x3e, 0x56, 0xd0, 0x5f, 0x29, 0x50, 0x4d, 0xd4, 0xda, 0x65, 0x16, 0x65, 0xb6, 0x32, + 0x30, 0xb3, 0x28, 0xf3, 0x4a, 0xfb, 0x56, 0xd0, 0x5f, 0x28, 0x50, 0x89, 0xeb, 0xe6, 0xd0, 0x83, + 0xc5, 0x2b, 0xed, 0x84, 0x10, 0x9f, 0x2d, 0x5b, 0xa2, 0xa7, 0xad, 0xa0, 0x3f, 0x83, 0x72, 0x54, + 0x64, 0x86, 0xb2, 0x46, 0xaf, 0xa9, 0x0a, 0xb6, 0xc6, 0x83, 0x85, 0xc7, 0x25, 0xa7, 0x8f, 0x2a, + 0xbf, 0x32, 0x4f, 0x3f, 0x55, 0xa3, 0xd6, 0x78, 0xb0, 0xf0, 0xb8, 0x78, 0x7a, 0xe6, 0x09, 0x89, + 0x02, 0xb1, 0xcc, 0x9e, 0x30, 0x5b, 0x99, 0x96, 0xd9, 0x13, 0xe6, 0xd5, 0xa3, 0x09, 0x41, 0x12, + 0x25, 0x66, 0x99, 0x05, 0x99, 0x2d, 0x63, 0xcb, 0x2c, 0xc8, 0x9c, 0x8a, 0x36, 0x6d, 0x05, 0xfd, + 0x42, 0x49, 0x9e, 0x0b, 0x1e, 0x2c, 0x5c, 0x49, 0xb5, 0xa0, 0x4b, 0xce, 0xd4, 0x72, 0xf1, 0x05, + 0xfa, 0x0b, 0x79, 0x8b, 0x21, 0x0a, 0xb1, 0xd0, 0x22, 0x60, 0xa9, 0xda, 0xad, 0xc6, 0xa7, 0xcb, + 0x05, 0x1b, 0x2e, 0xc4, 0x5f, 0x2a, 0x00, 0x93, 0x92, 0xad, 0xcc, 0x42, 0xcc, 0xd4, 0x8a, 0x35, + 0x76, 0x97, 0x18, 0x99, 0x5c, 0x20, 0x51, 0x49, 0x49, 0xe6, 0x05, 0x32, 0x55, 0x52, 0x96, 0x79, + 0x81, 0x4c, 0x97, 0x83, 0x69, 0x2b, 0xe8, 0x1f, 0x15, 0xd8, 0x9c, 0x29, 0x69, 0x41, 0x8f, 0x6e, + 0x58, 0xd5, 0xd4, 0xf8, 0x72, 0x79, 0x80, 0x48, 0xb4, 0x6d, 0xe5, 0x63, 0x05, 0xfd, 0x8d, 0x02, + 0xeb, 0xe9, 0x32, 0x80, 0xcc, 0x51, 0x6a, 0x4e, 0x71, 0x4c, 0xe3, 0xe1, 0x72, 0x83, 0x63, 0x6d, + 0xfd, 0x9d, 0x02, 0xb5, 0x74, 0x45, 0x08, 0x7a, 0xb8, 0xd8, 0xb6, 0x30, 0x25, 0xd0, 0x17, 0x4b, + 0x8e, 0x8e, 0x24, 0xfa, 0x6a, 0xf5, 0x8f, 0x8a, 0x22, 0x7b, 0x2b, 0xf1, 0x9f, 0x1f, 0xfd, 0x36, + 0x00, 0x00, 0xff, 0xff, 0x80, 0x65, 0x7d, 0xb1, 0xd5, 0x32, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/plugins/drivers/proto/driver.proto b/plugins/drivers/proto/driver.proto index 5284feef5..549f94dac 100644 --- a/plugins/drivers/proto/driver.proto +++ b/plugins/drivers/proto/driver.proto @@ -467,6 +467,10 @@ message Resources { // LinuxResources are the computed values to set for specific Linux features LinuxResources linux_resources = 2; + + // Ports are the allocated port mappings for the allocation. + // A task may use these to manually configure port mapping if shared network namespaces aren't being used. + repeated PortMapping ports = 3; } message AllocatedTaskResources { @@ -497,6 +501,13 @@ message NetworkPort { int32 value = 2; } +message PortMapping { + string label = 1; + int32 value = 2; + int32 to = 3; + string host_ip = 4; +} + message LinuxResources { // CPU CFS (Completely Fair Scheduler) period. Default: 0 (not specified) diff --git a/plugins/drivers/utils.go b/plugins/drivers/utils.go index bfb3d5c26..10eb9710a 100644 --- a/plugins/drivers/utils.go +++ b/plugins/drivers/utils.go @@ -147,6 +147,19 @@ func ResourcesFromProto(pb *proto.Resources) *Resources { } } + if pb.Ports != nil { + ports := structs.AllocatedPorts(make([]structs.AllocatedPortMapping, len(pb.Ports))) + for i, port := range pb.Ports { + ports[i] = structs.AllocatedPortMapping{ + Label: port.Label, + Value: int(port.Value), + To: int(port.To), + HostIP: port.HostIp, + } + } + r.Ports = &ports + } + return &r } @@ -203,6 +216,20 @@ func ResourcesToProto(r *Resources) *proto.Resources { } } + if r.Ports != nil { + ports := make([]*proto.PortMapping, len(*r.Ports)) + for i, port := range *r.Ports { + ports[i] = &proto.PortMapping{ + Label: port.Label, + Value: int32(port.Value), + To: int32(port.To), + HostIp: port.HostIP, + } + } + + pb.Ports = ports + } + return &pb } diff --git a/website/pages/docs/drivers/docker.mdx b/website/pages/docs/drivers/docker.mdx index c403e0734..1016f131f 100644 --- a/website/pages/docs/drivers/docker.mdx +++ b/website/pages/docs/drivers/docker.mdx @@ -218,7 +218,9 @@ The `docker` driver supports the following configuration in the job spec. Only to be configured to allow privileged containers. See below for more details. -- `port_map` - (Optional) A key-value map of port labels (see below). +- `ports` - (Optional) A list of port labels to map into the container (see below). + +- `port_map` - (Optional) *Deprecated* A key-value map of port labels (see below). - `security_opt` - (Optional) A list of string flags to pass directly to [`--security-opt`](https://docs.docker.com/engine/reference/run/#security-configuration). @@ -536,13 +538,15 @@ You can allocate ports to your task using the port syntax described on the [networking page](/docs/job-specification/network). Here is a recap: ```hcl -task "example" { - driver = "docker" - - resources { - network { - port "http" {} - port "https" {} +group { + network { + port "http" {} + port "https {} + } + task "example" { + driver = "docker" + config { + ports = ["http", "https"] } } } @@ -554,16 +558,25 @@ A Docker container typically specifies which port a service will listen on by specifying the `EXPOSE` directive in the `Dockerfile`. Because dynamic ports will not match the ports exposed in your Dockerfile, -Nomad will automatically expose all of the ports it allocates to your -container. +Nomad will automatically expose any ports specified in the `ports` field. These ports will be identified via environment variables. For example: ```hcl -port "http" {} +group { + network { + port "http" {} + } + task "api" { + driver = "docker" + config { + ports = ["http"] + } + } +} ``` -If Nomad allocates port `23332` to your task for `http`, `23332` will be +If Nomad allocates port `23332` to your api task for `http`, `23332` will be automatically exposed and forwarded to your container, and the driver will set an environment variable `NOMAD_PORT_http` with the value `23332` that you can read inside your container. @@ -574,30 +587,25 @@ performance. ### Using the Port Map If you prefer to use the traditional port-mapping method, you can specify the -`port_map` option in your job specification. It looks like this: +the `to` field in the port configuration. It looks like this: ```hcl -task "example" { - driver = "docker" - - config { - image = "redis" - - port_map { - redis = 6379 - } +group "example" { + network { + port "redis" { to = 6379 } } + task "example" { + driver = "docker" - resources { - network { - mbits = 20 - port "redis" {} + config { + image = "redis" + ports = ["redis"] } } } ``` -If Nomad allocates port `23332` to your task, the Docker driver will +If Nomad allocates port `23332` to your allocation, the Docker driver will automatically setup the port mapping from `23332` on the host to `6379` in your container, so it will just work! @@ -605,6 +613,16 @@ Note that by default this only works with `bridged` networking mode. It may also work with custom networking plugins which implement the same API for expose and port forwarding. +#### Deprecated `port_map` Syntax + +Up until Nomad 0.12, ports could be specified in a task's resource stanza and set using the docker +`port_map` field. As more features have been added to the group network resource allocation, task based +network resources are deprecated. With it the `port_map` field is also deprecated and can only be used +with task network resources. + +Users should migrate their jobs to define ports in the group network stanza and specified which ports +a task maps with the `ports` field. + ### Advertising Container IPs _New in Nomad 0.6._