diff -Nru lxd-2.14/client/doc.go lxd-2.15/client/doc.go --- lxd-2.14/client/doc.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/client/doc.go 2017-06-28 03:00:23.000000000 +0000 @@ -1,14 +1,5 @@ // Package lxd implements a client for the LXD API // -// Warning -// -// This API isn't considered STABLE yet! -// -// This client library is planned to become the new supported Go library -// for LXD which will come with guaranteed API stability. New functions and -// struct arguments may be added over time but no existing signature or -// type will be changed and structs will only gain new members. -// // Overview // // This package lets you connect to LXD daemons or SimpleStream image diff -Nru lxd-2.14/client/interfaces.go lxd-2.15/client/interfaces.go --- lxd-2.14/client/interfaces.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/client/interfaces.go 2017-06-28 03:00:23.000000000 +0000 @@ -6,6 +6,7 @@ "github.com/gorilla/websocket" "github.com/lxc/lxd/shared/api" + "github.com/lxc/lxd/shared/cancel" ) // The Server type represents a generic read-only server. @@ -57,6 +58,7 @@ GetContainer(name string) (container *api.Container, ETag string, err error) CreateContainer(container api.ContainersPost) (op *Operation, err error) CreateContainerFromImage(source ImageServer, image api.Image, imgcontainer api.ContainersPost) (op *RemoteOperation, err error) + CopyContainer(source ContainerServer, container api.Container, args *ContainerCopyArgs) (op *RemoteOperation, err error) UpdateContainer(name string, container api.ContainerPut, ETag string) (op *Operation, err error) RenameContainer(name string, container api.ContainerPost) (op *Operation, err error) MigrateContainer(name string, container api.ContainerPost) (op *Operation, err error) @@ -72,6 +74,7 @@ GetContainerSnapshots(containerName string) (snapshots []api.ContainerSnapshot, err error) GetContainerSnapshot(containerName string, name string) (snapshot *api.ContainerSnapshot, ETag string, err error) CreateContainerSnapshot(containerName string, snapshot api.ContainerSnapshotsPost) (op *Operation, err error) + CopyContainerSnapshot(source ContainerServer, snapshot api.ContainerSnapshot, args *ContainerSnapshotCopyArgs) (op *RemoteOperation, err error) RenameContainerSnapshot(containerName string, name string, container api.ContainerSnapshotPost) (op *Operation, err error) MigrateContainerSnapshot(containerName string, name string, container api.ContainerSnapshotPost) (op *Operation, err error) DeleteContainerSnapshot(containerName string, name string) (op *Operation, err error) @@ -192,6 +195,9 @@ // Progress handler (called whenever some progress is made) ProgressHandler func(progress ProgressData) + + // A canceler that can be used to interrupt some part of the image download request + Canceler *cancel.Canceler } // The ImageFileResponse struct is used as the response for image downloads @@ -224,6 +230,24 @@ Public bool } +// The ContainerCopyArgs struct is used to pass additional options during container copy +type ContainerCopyArgs struct { + // If set, the container will be renamed on copy + Name string + + // If set, the container running state will be transferred (live migration) + Live bool + + // If set, only the container will copied, its snapshots won't + ContainerOnly bool +} + +// The ContainerSnapshotCopyArgs struct is used to pass additional options during container copy +type ContainerSnapshotCopyArgs struct { + // If set, the container will be renamed on copy + Name string +} + // The ContainerExecArgs struct is used to pass additional options during container exec type ContainerExecArgs struct { // Standard input @@ -237,6 +261,9 @@ // Control message handler (window resize, signals, ...) Control func(conn *websocket.Conn) + + // Channel that will be closed when all data operations are done + DataDone chan bool } // The ContainerFileArgs struct is used to pass the various options for a container file upload diff -Nru lxd-2.14/client/lxd_containers.go lxd-2.15/client/lxd_containers.go --- lxd-2.14/client/lxd_containers.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/client/lxd_containers.go 2017-06-28 03:00:23.000000000 +0000 @@ -78,17 +78,27 @@ return op, nil } -func (r *ProtocolLXD) tryCreateContainerFromImage(req api.ContainersPost, urls []string) (*RemoteOperation, error) { +func (r *ProtocolLXD) tryCreateContainer(req api.ContainersPost, urls []string) (*RemoteOperation, error) { + if len(urls) == 0 { + return nil, fmt.Errorf("The source server isn't listening on the network") + } + rop := RemoteOperation{ chDone: make(chan bool), } + operation := req.Source.Operation + // Forward targetOp to remote op go func() { success := false errors := []string{} for _, serverURL := range urls { - req.Source.Server = serverURL + if operation == "" { + req.Source.Server = serverURL + } else { + req.Source.Operation = fmt.Sprintf("%s/1.0/operations/%s", serverURL, operation) + } op, err := r.CreateContainer(req) if err != nil { @@ -182,7 +192,92 @@ req.Source.Secret = secret } - return r.tryCreateContainerFromImage(req, info.Addresses) + return r.tryCreateContainer(req, info.Addresses) +} + +// CopyContainer copies a container from a remote server. Additional options can be passed using ContainerCopyArgs +func (r *ProtocolLXD) CopyContainer(source ContainerServer, container api.Container, args *ContainerCopyArgs) (*RemoteOperation, error) { + // Base request + req := api.ContainersPost{ + Name: container.Name, + ContainerPut: container.Writable(), + } + req.Source.BaseImage = container.Config["volatile.base_image"] + req.Source.Live = container.StatusCode == api.Running + + // Process the copy arguments + if args != nil { + // Sanity checks + if args.ContainerOnly && !r.HasExtension("container_only_migration") { + return nil, fmt.Errorf("The server is missing the required \"container_only_migration\" API extension") + } + + // Allow overriding the target name + if args.Name != "" { + req.Name = args.Name + } + + req.Source.Live = args.Live + req.Source.ContainerOnly = args.ContainerOnly + } + + // Optimization for the local copy case + if r == source { + // Local copy source fields + req.Source.Type = "copy" + req.Source.Source = container.Name + + // Copy the container + op, err := r.CreateContainer(req) + if err != nil { + return nil, err + } + + rop := RemoteOperation{ + targetOp: op, + chDone: make(chan bool), + } + + // Forward targetOp to remote op + go func() { + rop.err = rop.targetOp.Wait() + close(rop.chDone) + }() + + return &rop, nil + } + + // Get source server connection information + info, err := source.GetConnectionInfo() + if err != nil { + return nil, err + } + + // Get a source operation + sourceReq := api.ContainerPost{ + Migration: true, + Live: req.Source.Live, + ContainerOnly: req.Source.ContainerOnly, + } + + op, err := source.MigrateContainer(container.Name, sourceReq) + if err != nil { + return nil, err + } + + sourceSecrets := map[string]string{} + for k, v := range op.Metadata { + sourceSecrets[k] = v.(string) + } + + // Migration source fields + req.Source.Type = "migration" + req.Source.Mode = "pull" + req.Source.Operation = op.ID + req.Source.Websockets = sourceSecrets + req.Source.Certificate = info.Certificate + + return r.tryCreateContainer(req, info.Addresses) } // UpdateContainer updates the container definition @@ -296,11 +391,19 @@ shared.WebsocketSendStream(conn, args.Stdin, -1) <-shared.WebsocketRecvStream(args.Stdout, conn) conn.Close() + + if args.DataDone != nil { + close(args.DataDone) + } }() + } else { + if args.DataDone != nil { + close(args.DataDone) + } } } else { // Handle non-interactive sessions - dones := []chan bool{} + dones := map[int]chan bool{} conns := []*websocket.Conn{} // Handle stdin @@ -311,7 +414,7 @@ } conns = append(conns, conn) - dones = append(dones, shared.WebsocketSendStream(conn, args.Stdin, -1)) + dones[0] = shared.WebsocketSendStream(conn, args.Stdin, -1) } // Handle stdout @@ -322,7 +425,7 @@ } conns = append(conns, conn) - dones = append(dones, shared.WebsocketRecvStream(args.Stdout, conn)) + dones[1] = shared.WebsocketRecvStream(args.Stdout, conn) } // Handle stderr @@ -333,12 +436,17 @@ } conns = append(conns, conn) - dones = append(dones, shared.WebsocketRecvStream(args.Stderr, conn)) + dones[2] = shared.WebsocketRecvStream(args.Stderr, conn) } // Wait for everything to be done go func() { - for _, chDone := range dones { + for i, chDone := range dones { + // Skip stdin, dealing with it separately below + if i == 0 { + continue + } + <-chDone } @@ -349,6 +457,10 @@ for _, conn := range conns { conn.Close() } + + if args.DataDone != nil { + close(args.DataDone) + } }() } } @@ -442,9 +554,17 @@ } // Set the various headers - req.Header.Set("X-LXD-uid", fmt.Sprintf("%d", args.UID)) - req.Header.Set("X-LXD-gid", fmt.Sprintf("%d", args.GID)) - req.Header.Set("X-LXD-mode", fmt.Sprintf("%04o", args.Mode)) + if args.UID > -1 { + req.Header.Set("X-LXD-uid", fmt.Sprintf("%d", args.UID)) + } + + if args.GID > -1 { + req.Header.Set("X-LXD-gid", fmt.Sprintf("%d", args.GID)) + } + + if args.Mode > -1 { + req.Header.Set("X-LXD-mode", fmt.Sprintf("%04o", args.Mode)) + } if args.Type != "" { req.Header.Set("X-LXD-type", args.Type) @@ -540,6 +660,91 @@ return op, nil } +// CopyContainerSnapshot copies a snapshot from a remote server into a new container. Additional options can be passed using ContainerCopyArgs +func (r *ProtocolLXD) CopyContainerSnapshot(source ContainerServer, snapshot api.ContainerSnapshot, args *ContainerSnapshotCopyArgs) (*RemoteOperation, error) { + // Base request + fields := strings.SplitN(snapshot.Name, shared.SnapshotDelimiter, 2) + cName := fields[0] + sName := fields[1] + + req := api.ContainersPost{ + Name: cName, + ContainerPut: api.ContainerPut{ + Architecture: snapshot.Architecture, + Config: snapshot.Config, + Devices: snapshot.Devices, + Ephemeral: snapshot.Ephemeral, + Profiles: snapshot.Profiles, + Stateful: snapshot.Stateful, + }, + } + req.Source.BaseImage = snapshot.Config["volatile.base_image"] + + // Process the copy arguments + if args != nil { + // Allow overriding the target name + if args.Name != "" { + req.Name = args.Name + } + } + + // Optimization for the local copy case + if r == source { + // Local copy source fields + req.Source.Type = "copy" + req.Source.Source = snapshot.Name + + // Copy the container + op, err := r.CreateContainer(req) + if err != nil { + return nil, err + } + + rop := RemoteOperation{ + targetOp: op, + chDone: make(chan bool), + } + + // Forward targetOp to remote op + go func() { + rop.err = rop.targetOp.Wait() + close(rop.chDone) + }() + + return &rop, nil + } + + // Get source server connection information + info, err := source.GetConnectionInfo() + if err != nil { + return nil, err + } + + // Get a source operation + sourceReq := api.ContainerSnapshotPost{ + Migration: true, + } + + op, err := source.MigrateContainerSnapshot(cName, sName, sourceReq) + if err != nil { + return nil, err + } + + sourceSecrets := map[string]string{} + for k, v := range op.Metadata { + sourceSecrets[k] = v.(string) + } + + // Migration source fields + req.Source.Type = "migration" + req.Source.Mode = "pull" + req.Source.Operation = op.ID + req.Source.Websockets = sourceSecrets + req.Source.Certificate = info.Certificate + + return r.tryCreateContainer(req, info.Addresses) +} + // RenameContainerSnapshot requests that LXD renames the snapshot func (r *ProtocolLXD) RenameContainerSnapshot(containerName string, name string, container api.ContainerSnapshotPost) (*Operation, error) { // Sanity check diff -Nru lxd-2.14/client/lxd.go lxd-2.15/client/lxd.go --- lxd-2.14/client/lxd.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/client/lxd.go 2017-06-28 03:00:23.000000000 +0000 @@ -181,15 +181,29 @@ } func (r *ProtocolLXD) queryOperation(method string, path string, data interface{}, ETag string) (*Operation, string, error) { + // Attempt to setup an early event listener + listener, err := r.GetEvents() + if err != nil { + listener = nil + } + // Send the query resp, etag, err := r.query(method, path, data, ETag) if err != nil { + if listener != nil { + listener.Disconnect() + } + return nil, "", err } // Get to the operation respOperation, err := resp.MetadataAsOperation() if err != nil { + if listener != nil { + listener.Disconnect() + } + return nil, "", err } @@ -197,6 +211,7 @@ op := Operation{ Operation: *respOperation, r: r, + listener: listener, chActive: make(chan bool), } diff -Nru lxd-2.14/client/lxd_images.go lxd-2.15/client/lxd_images.go --- lxd-2.14/client/lxd_images.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/client/lxd_images.go 2017-06-28 03:00:23.000000000 +0000 @@ -443,6 +443,10 @@ // tryCopyImage iterates through the source server URLs until one lets it download the image func (r *ProtocolLXD) tryCopyImage(req api.ImagesPost, urls []string) (*RemoteOperation, error) { + if len(urls) == 0 { + return nil, fmt.Errorf("The source server isn't listening on the network") + } + rop := RemoteOperation{ chDone: make(chan bool), } diff -Nru lxd-2.14/client/operations.go lxd-2.15/client/operations.go --- lxd-2.14/client/operations.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/client/operations.go 2017-06-28 03:00:23.000000000 +0000 @@ -16,8 +16,10 @@ r *ProtocolLXD listener *EventListener - listenerLock sync.Mutex - chActive chan bool + handlerReady bool + handlerLock sync.Mutex + + chActive chan bool } // AddHandler adds a function to be called whenever an event is received @@ -29,8 +31,8 @@ } // Make sure we're not racing with ourselves - op.listenerLock.Lock() - defer op.listenerLock.Unlock() + op.handlerLock.Lock() + defer op.handlerLock.Unlock() // If we're done already, just return if op.StatusCode.IsFinal() { @@ -63,8 +65,8 @@ // RemoveHandler removes a function to be called whenever an event is received func (op *Operation) RemoveHandler(target *EventTarget) error { // Make sure we're not racing with ourselves - op.listenerLock.Lock() - defer op.listenerLock.Unlock() + op.handlerLock.Lock() + defer op.handlerLock.Unlock() // If the listener is gone, just return if op.listener == nil { @@ -77,7 +79,7 @@ // Refresh pulls the current version of the operation and updates the struct func (op *Operation) Refresh() error { // Don't bother with a manual update if we are listening for events - if op.listener != nil { + if op.handlerReady { return nil } @@ -122,23 +124,27 @@ func (op *Operation) setupListener() error { // Make sure we're not racing with ourselves - op.listenerLock.Lock() - defer op.listenerLock.Unlock() + op.handlerLock.Lock() + defer op.handlerLock.Unlock() // We already have a listener setup - if op.listener != nil { + if op.handlerReady { return nil } // Get a new listener - listener, err := op.r.GetEvents() - if err != nil { - return err + if op.listener == nil { + listener, err := op.r.GetEvents() + if err != nil { + return err + } + + op.listener = listener } // Setup the handler chReady := make(chan bool) - _, err = listener.AddHandler([]string{"operation"}, func(data interface{}) { + _, err := op.listener.AddHandler([]string{"operation"}, func(data interface{}) { <-chReady // Get an operation struct out of this data @@ -148,8 +154,8 @@ } // We don't want concurrency while processing events - op.listenerLock.Lock() - defer op.listenerLock.Unlock() + op.handlerLock.Lock() + defer op.handlerLock.Unlock() // Check if we're done already (because of another event) if op.listener == nil { @@ -168,20 +174,20 @@ } }) if err != nil { - listener.Disconnect() + op.listener.Disconnect() return err } // And do a manual refresh to avoid races err = op.Refresh() if err != nil { - listener.Disconnect() + op.listener.Disconnect() return err } // Check if not done already if op.StatusCode.IsFinal() { - listener.Disconnect() + op.listener.Disconnect() close(op.chActive) if op.Err != "" { @@ -192,7 +198,7 @@ } // Start processing background updates - op.listener = listener + op.handlerReady = true close(chReady) return nil diff -Nru lxd-2.14/client/simplestreams_images.go lxd-2.15/client/simplestreams_images.go --- lxd-2.14/client/simplestreams_images.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/client/simplestreams_images.go 2017-06-28 03:00:23.000000000 +0000 @@ -63,11 +63,11 @@ // Try over http url := fmt.Sprintf("http://%s/%s", strings.TrimPrefix(r.httpHost, "https://"), meta.Path) - size, err := downloadFileSha256(r.http, r.httpUserAgent, req.ProgressHandler, "metadata", url, meta.Sha256, req.MetaFile) + size, err := downloadFileSha256(r.http, r.httpUserAgent, req.ProgressHandler, req.Canceler, "metadata", url, meta.Sha256, req.MetaFile) if err != nil { // Try over https url = fmt.Sprintf("%s/%s", r.httpHost, meta.Path) - size, err = downloadFileSha256(r.http, r.httpUserAgent, req.ProgressHandler, "metadata", url, meta.Sha256, req.MetaFile) + size, err = downloadFileSha256(r.http, r.httpUserAgent, req.ProgressHandler, req.Canceler, "metadata", url, meta.Sha256, req.MetaFile) if err != nil { return nil, err } @@ -84,11 +84,11 @@ // Try over http url := fmt.Sprintf("http://%s/%s", strings.TrimPrefix(r.httpHost, "https://"), rootfs.Path) - size, err := downloadFileSha256(r.http, r.httpUserAgent, req.ProgressHandler, "rootfs", url, rootfs.Sha256, req.RootfsFile) + size, err := downloadFileSha256(r.http, r.httpUserAgent, req.ProgressHandler, req.Canceler, "rootfs", url, rootfs.Sha256, req.RootfsFile) if err != nil { // Try over https url = fmt.Sprintf("%s/%s", r.httpHost, rootfs.Path) - size, err = downloadFileSha256(r.http, r.httpUserAgent, req.ProgressHandler, "rootfs", url, rootfs.Sha256, req.RootfsFile) + size, err = downloadFileSha256(r.http, r.httpUserAgent, req.ProgressHandler, req.Canceler, "rootfs", url, rootfs.Sha256, req.RootfsFile) if err != nil { return nil, err } diff -Nru lxd-2.14/client/util.go lxd-2.15/client/util.go --- lxd-2.14/client/util.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/client/util.go 2017-06-28 03:00:23.000000000 +0000 @@ -9,6 +9,7 @@ "net/url" "github.com/lxc/lxd/shared" + "github.com/lxc/lxd/shared/cancel" "github.com/lxc/lxd/shared/ioprogress" ) @@ -81,7 +82,7 @@ return &client, nil } -func downloadFileSha256(httpClient *http.Client, useragent string, progress func(progress ProgressData), filename string, url string, hash string, target io.WriteSeeker) (int64, error) { +func downloadFileSha256(httpClient *http.Client, useragent string, progress func(progress ProgressData), canceler *cancel.Canceler, filename string, url string, hash string, target io.WriteSeeker) (int64, error) { // Always seek to the beginning target.Seek(0, 0) @@ -95,12 +96,13 @@ req.Header.Set("User-Agent", useragent) } - // Start the request - r, err := httpClient.Do(req) + // Perform the request + r, err, doneCh := cancel.CancelableDownload(canceler, httpClient, req) if err != nil { return -1, err } defer r.Body.Close() + defer close(doneCh) if r.StatusCode != http.StatusOK { return -1, fmt.Errorf("Unable to fetch %s: %s", url, r.Status) diff -Nru lxd-2.14/client.go lxd-2.15/client.go --- lxd-2.14/client.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/client.go 2017-06-28 03:00:23.000000000 +0000 @@ -1,5 +1,9 @@ package lxd +// DEPRECATED: This package is now deprecated in favor of github.com/lxc/lxd/client +// +// This package will be entirely removed from the code tree with LXD 2.16 + import ( "bytes" "crypto/x509" diff -Nru lxd-2.14/debian/changelog lxd-2.15/debian/changelog --- lxd-2.14/debian/changelog 2017-06-13 05:52:41.000000000 +0000 +++ lxd-2.15/debian/changelog 2017-07-06 05:00:09.000000000 +0000 @@ -1,10 +1,135 @@ -lxd (2.14-0ubuntu3~16.04.1) xenial-backports; urgency=medium +lxd (2.15-0ubuntu6~ubuntu16.04.1) xenial-backports; urgency=medium * Backport to Xenial. * Disable shared libraries. * Use embedded dependencies for backport. - -- Stéphane Graber Tue, 13 Jun 2017 01:52:41 -0400 + -- Stéphane Graber Thu, 06 Jul 2017 01:00:09 -0400 + +lxd (2.15-0ubuntu6) artful; urgency=medium + + * Cherry-pick upstream fixes: + - 0015-Fix-file-push-pull-with-names-containing-spaces.patch + + -- Stéphane Graber Wed, 05 Jul 2017 14:51:44 -0400 + +lxd (2.15-0ubuntu5) artful; urgency=medium + + * Cherry-pick upstream fixes: + - 0006-lxc-config-Removal-of-multiple-devices-at-once.patch (LP: #1690299) + - 0007-network-Don-t-fail-on-non-process-PIDs.patch (LP: #1698712) + - 0008-config-Try-to-be-clever-about-in-snapshots.patch (LP: #1694855) + - 0009-Fix-readonly-mode-for-directory-mount.patch + - 0010-client-Fix-race-condition-in-operation-handling.patch + - 0011-import-keep-volatile-keys.patch + - 0012-import-remove-last-dependency-on-symlink.patch + - 0013-Better-handle-errors-in-memory-reporting.patch + - 0014-client-Don-t-live-migrate-stopped-containers.patch + + -- Stéphane Graber Mon, 03 Jul 2017 18:19:16 -0400 + +lxd (2.15-0ubuntu4) artful; urgency=medium + + * Cherry-pick upstream fixes: + - 0005-client-Commonize-error-handling.patch + + -- Stéphane Graber Fri, 30 Jun 2017 18:13:02 -0400 + +lxd (2.15-0ubuntu3) artful; urgency=medium + + * Cherry-pick upstream fixes: + - 0004-cancel-Fix-crash-if-no-canceler-is-setup.patch + + -- Stéphane Graber Thu, 29 Jun 2017 14:22:51 -0400 + +lxd (2.15-0ubuntu2) artful; urgency=medium + + * Cherry-pick upstream fixes: + - 0001-lxc-publish-Fix-fingerprint-printing.patch + - 0002-Fix-failure-to-launch-containers-with-random-names.patch + - 0003-client-Fix-handling-of-public-LXD-remote.patch + + -- Stéphane Graber Wed, 28 Jun 2017 17:40:28 -0400 + +lxd (2.15-0ubuntu1) artful; urgency=medium + + * New upstream release (2.15): + - "lxc list" and "lxc image list" now both support table, json, yaml + and csv as output formats. + - It's now possible to cancel (DELETE) some background operations + while they're downloading content. + - The "lxc" command line tool was ported from our old client code to + the new client package. + This was the last bit of code which needed porting and we're now + planning on removing the old client package from our tree with LXD 2.16. + - New CopyContainer and CopyContainerSnapshot functions were added + to the client package. + - LXD will now dynamically remap custom storage volumes when + attached to containers. + + - client: Add extra exec option to block on I/O + - client: Fail copy if the source isn't listening on network + - client: Fix potential race in event handler setup + - client: Only set file headers if value is provided + - doc: Add a note for blkio limits + - doc: Document image refresh API call + - doc: Fix missing markdown escaping + - doc: Tweak storage formatting + - lxc/file: Clean source path for recursive push + - lxc/file: Properly read file permissions on Windows + - lxd/containers: Support lxc.net..\* configuration keys on newer LXC + - lxd/containers: Check whether the disk device exists before unmount + - lxd/containers: Detect POLLNVAL when polling during exec + - lxd/containers: Fail if we get EBUSY during startup + - lxd/containers: Use the lxc.network..\* configuration keys + - lxd/db: Replace some uses of InternalError with SmartError + - lxd/images: Always expand the fingerprint + - lxd/images: If multiple cache hits, pick the latest + - lxd/images: Properly initialize image info in direct case + - lxd/images: Skip cached images without auto-update + - lxd/networks: Always pass --conf-file to dnsmasq + - lxd/networks: Only generate DHCP fw rules if enabled + - lxd/networks: Remove IPv6 leases on container delete + - lxd/networks: Tweak error in subnet auto detection + - lxd/patches: Fix bad upgrade for ZFS pools + - lxd/patches: Make sure localdevices are properly updated + - lxd/shutdown: Only timeout if told to + - lxd/storage: Fix ETag calculation for pools + - lxd/storage: Insert driver correctly + - lxd/storage/btrfs: Apply default flags BEFORE detecting type + - lxd/storage/btrfs: Enable filesystem quotas on demand + - lxd/storage/dir: Still create the needed symlinks on freeze failure + - lxd/storage/dir: Unfreeze on rsync errors + - lxd/storage/lvm: Allow non-empty VGs when thinpool exists + - lxd/storage/rsync: Handle sparse files when rsyncing + - lxd/storage/zfs: Fix container snapshot copy + - lxd/storage/zfs: Improve dummy dataset creation + - Makefile: Update pot before po + - shared/api: API extensions go at the bottom + - tests: Add more copy/migration tests + - tests: Add tests for custom storage volume attach + - tests: Add tests for "lxc file push -r ./" + - tests: Don't attempt to finger public remotes + - tests: Don't run migration tests again on LVM when backend is random + - tests: Use in-memory database for tests + + * Bump standards to 4.0.0, no change required. + + -- Stéphane Graber Wed, 28 Jun 2017 00:05:49 -0400 + +lxd (2.14-0ubuntu5) artful; urgency=medium + + * Cherry-pick upstream fix (image direct download): + - 0007-lxd-images-Initialize-image-info-in-direct-case.patch + + -- Stéphane Graber Tue, 20 Jun 2017 13:28:36 -0400 + +lxd (2.14-0ubuntu4) artful; urgency=medium + + * Cherry-pick upstream fix (btrfs bind-mount): + - 0006-btrfs-Apply-default-flags-BEFORE-detecting-type.patch + + -- Stéphane Graber Thu, 15 Jun 2017 01:04:03 -0400 lxd (2.14-0ubuntu3) artful; urgency=medium diff -Nru lxd-2.14/debian/control lxd-2.15/debian/control --- lxd-2.14/debian/control 2017-06-13 05:52:08.000000000 +0000 +++ lxd-2.15/debian/control 2017-07-06 04:59:56.000000000 +0000 @@ -2,7 +2,7 @@ Section: admin Priority: optional Maintainer: Ubuntu Developers -Standards-Version: 3.9.8 +Standards-Version: 4.0.0 Homepage: https://linuxcontainers.org/ Vcs-Git: https://github.com/lxc/lxd-pkg-ubuntu Vcs-Browser: https://github.com/lxc/lxd-pkg-ubuntu diff -Nru lxd-2.14/debian/.git-dpm lxd-2.15/debian/.git-dpm --- lxd-2.14/debian/.git-dpm 2017-06-09 21:18:44.000000000 +0000 +++ lxd-2.15/debian/.git-dpm 2017-07-05 18:51:39.000000000 +0000 @@ -1,8 +1,8 @@ # see git-dpm(1) from git-dpm package -39874cba8b96930dbccea993a86d6a3ebc6ee0b0 -39874cba8b96930dbccea993a86d6a3ebc6ee0b0 -3b1abed998c5d56eeb7d641f84870830fee3e6b4 -3b1abed998c5d56eeb7d641f84870830fee3e6b4 -lxd_2.14.orig.tar.gz -e52e5ae509c0dd94da2a37368b5e5de8a71d1b16 -5583645 +916f33d8843608eade93f4dbde69dd26411bf4a1 +916f33d8843608eade93f4dbde69dd26411bf4a1 +622fd1e31709d94794ad9fc6f1625a3b1edef430 +622fd1e31709d94794ad9fc6f1625a3b1edef430 +lxd_2.15.orig.tar.gz +94d34b2797d16d049f4a2170a5a17f89bea4e4c2 +5617933 diff -Nru lxd-2.14/debian/patches/0001-lxc-publish-Fix-fingerprint-printing.patch lxd-2.15/debian/patches/0001-lxc-publish-Fix-fingerprint-printing.patch --- lxd-2.14/debian/patches/0001-lxc-publish-Fix-fingerprint-printing.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0001-lxc-publish-Fix-fingerprint-printing.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,35 @@ +From aa537ee16a9ead35510ca98663d173e24165293e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Wed, 28 Jun 2017 00:22:36 -0400 +Subject: lxc/publish: Fix fingerprint printing +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Stéphane Graber +--- + lxc/publish.go | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/lxc/publish.go b/lxc/publish.go +index 4254d4e8..2d4a9e12 100644 +--- a/lxc/publish.go ++++ b/lxc/publish.go +@@ -169,8 +169,6 @@ func (c *publishCmd) run(conf *config.Config, args []string) error { + properties[entry[0]] = entry[1] + } + +- var fp string +- + // We should only set the properties field if there actually are any. + // Otherwise we will only delete any existing properties on publish. + // This is something which only direct callers of the API are allowed to +@@ -247,7 +245,7 @@ func (c *publishCmd) run(conf *config.Config, args []string) error { + } + } + +- fmt.Printf(i18n.G("Container published with fingerprint: %s")+"\n", fp) ++ fmt.Printf(i18n.G("Container published with fingerprint: %s")+"\n", fingerprint) + + return nil + } diff -Nru lxd-2.14/debian/patches/0001-storage-insert-driver-correctly.patch lxd-2.15/debian/patches/0001-storage-insert-driver-correctly.patch --- lxd-2.14/debian/patches/0001-storage-insert-driver-correctly.patch 2017-06-09 21:18:43.000000000 +0000 +++ lxd-2.15/debian/patches/0001-storage-insert-driver-correctly.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -From 7794e0200442c7ff3b2137de28ed1118e1bc36b6 Mon Sep 17 00:00:00 2001 -From: Christian Brauner -Date: Wed, 7 Jun 2017 17:32:58 +0200 -Subject: storage: insert driver correctly - -Closes #3386. - -Signed-off-by: Christian Brauner ---- - lxd/db_storage_pools.go | 2 +- - lxd/patches.go | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/lxd/db_storage_pools.go b/lxd/db_storage_pools.go -index c304eba5..f340c7cb 100644 ---- a/lxd/db_storage_pools.go -+++ b/lxd/db_storage_pools.go -@@ -132,7 +132,7 @@ func dbStoragePoolConfigGet(db *sql.DB, poolID int64) (map[string]string, error) - } - - // Create new storage pool. --func dbStoragePoolCreate(db *sql.DB, poolName, poolDescription string, poolDriver string, poolConfig map[string]string) (int64, error) { -+func dbStoragePoolCreate(db *sql.DB, poolName string, poolDescription string, poolDriver string, poolConfig map[string]string) (int64, error) { - tx, err := dbBegin(db) - if err != nil { - return -1, err -diff --git a/lxd/patches.go b/lxd/patches.go -index e535da70..e3db87b6 100644 ---- a/lxd/patches.go -+++ b/lxd/patches.go -@@ -1433,7 +1433,7 @@ func upgradeFromStorageTypeZfs(name string, d *Daemon, defaultPoolName string, d - } - - // (Use a tmp variable as Go's scoping is freaking me out.) -- tmp, err := dbStoragePoolCreate(d.db, poolName, defaultStorageTypeName, "", poolConfig) -+ tmp, err := dbStoragePoolCreate(d.db, poolName, "", defaultStorageTypeName, poolConfig) - if err != nil { - logger.Warnf("Storage pool already exists in the database. Proceeding...") - } diff -Nru lxd-2.14/debian/patches/0002-Fix-failure-to-launch-containers-with-random-names.patch lxd-2.15/debian/patches/0002-Fix-failure-to-launch-containers-with-random-names.patch --- lxd-2.14/debian/patches/0002-Fix-failure-to-launch-containers-with-random-names.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0002-Fix-failure-to-launch-containers-with-random-names.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,44 @@ +From 1f1fd9d053901798a4051a9b1858aa10db328078 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Wed, 28 Jun 2017 14:47:05 -0400 +Subject: Fix failure to launch containers with random names +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Stéphane Graber +--- + lxc/init.go | 3 ++- + test/suites/basic.sh | 4 ++-- + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/lxc/init.go b/lxc/init.go +index 1a7934e3..254da695 100644 +--- a/lxc/init.go ++++ b/lxc/init.go +@@ -310,7 +310,8 @@ func (c *initCmd) create(conf *config.Config, args []string) (lxd.ContainerServe + + if len(containers) == 1 && name == "" { + fields := strings.Split(containers[0], "/") +- fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1]) ++ name = fields[len(fields)-1] ++ fmt.Printf(i18n.G("Container name is: %s")+"\n", name) + } + + // Validate the network setup +diff --git a/test/suites/basic.sh b/test/suites/basic.sh +index 318303be..19b7885e 100644 +--- a/test/suites/basic.sh ++++ b/test/suites/basic.sh +@@ -201,9 +201,9 @@ test_basic_usage() { + [ ! -d "${LXD_DIR}/snapshots/bar" ] + + # Test randomly named container creation +- lxc init testimage ++ lxc launch testimage + RDNAME=$(lxc list | tail -n2 | grep ^\| | awk '{print $2}') +- lxc delete "${RDNAME}" ++ lxc delete -f "${RDNAME}" + + # Test "nonetype" container creation + wait_for "${LXD_ADDR}" my_curl -X POST "https://${LXD_ADDR}/1.0/containers" \ diff -Nru lxd-2.14/debian/patches/0002-patches-fix-upgrade.patch lxd-2.15/debian/patches/0002-patches-fix-upgrade.patch --- lxd-2.14/debian/patches/0002-patches-fix-upgrade.patch 2017-06-09 21:18:43.000000000 +0000 +++ lxd-2.15/debian/patches/0002-patches-fix-upgrade.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -From e9ac56944c12e62ff2ab25a35ba3fa65d2d70b18 Mon Sep 17 00:00:00 2001 -From: Christian Brauner -Date: Wed, 7 Jun 2017 17:48:02 +0200 -Subject: patches: fix upgrade - -Closes #3386. - -Signed-off-by: Christian Brauner ---- - lxd/patches.go | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/lxd/patches.go b/lxd/patches.go -index e3db87b6..525dd68b 100644 ---- a/lxd/patches.go -+++ b/lxd/patches.go -@@ -43,6 +43,7 @@ var patches = []patch{ - {name: "storage_api_update_storage_configs", run: patchStorageApiUpdateStorageConfigs}, - {name: "storage_api_lxd_on_btrfs", run: patchStorageApiLxdOnBtrfs}, - {name: "storage_api_lvm_detect_lv_size", run: patchStorageApiDetectLVSize}, -+ {name: "storage_api_insert_zfs_driver", run: patchStorageApiInsertZfsDriver}, - } - - type patch struct { -@@ -2237,6 +2238,15 @@ func patchStorageApiDetectLVSize(name string, d *Daemon) error { - return nil - } - -+func patchStorageApiInsertZfsDriver(name string, d *Daemon) error { -+ _, err := dbExec(d.db, "UPDATE storage_pools SET driver='zfs', description='' WHERE driver=''") -+ if err != nil { -+ return err -+ } -+ -+ return nil -+} -+ - // Patches end here - - // Here are a couple of legacy patches that were originally in diff -Nru lxd-2.14/debian/patches/0003-client-Fix-handling-of-public-LXD-remote.patch lxd-2.15/debian/patches/0003-client-Fix-handling-of-public-LXD-remote.patch --- lxd-2.14/debian/patches/0003-client-Fix-handling-of-public-LXD-remote.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0003-client-Fix-handling-of-public-LXD-remote.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,56 @@ +From 74b8229f53cac9b8a937c414cbcbf27441b9112f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Wed, 28 Jun 2017 15:41:25 -0400 +Subject: client: Fix handling of public LXD remote +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Public LXD remotes don't advertise their bound addresses, but they are +still reachable using the URL that was used for the remote. + +Closes #3464 + +Signed-off-by: Stéphane Graber +--- + client/lxd.go | 8 ++++---- + test/suites/remote.sh | 5 +++++ + 2 files changed, 9 insertions(+), 4 deletions(-) + +diff --git a/client/lxd.go b/client/lxd.go +index df1c6dbf..742ad2fc 100644 +--- a/client/lxd.go ++++ b/client/lxd.go +@@ -36,11 +36,11 @@ func (r *ProtocolLXD) GetConnectionInfo() (*ConnectionInfo, error) { + info.Protocol = "lxd" + + urls := []string{} +- if len(r.server.Environment.Addresses) > 0 { +- if r.httpProtocol == "https" { +- urls = append(urls, r.httpHost) +- } ++ if r.httpProtocol == "https" { ++ urls = append(urls, r.httpHost) ++ } + ++ if len(r.server.Environment.Addresses) > 0 { + for _, addr := range r.server.Environment.Addresses { + url := fmt.Sprintf("https://%s", addr) + if !shared.StringInSlice(url, urls) { +diff --git a/test/suites/remote.sh b/test/suites/remote.sh +index d53ee123..79a168a5 100644 +--- a/test/suites/remote.sh ++++ b/test/suites/remote.sh +@@ -117,7 +117,12 @@ test_remote_usage() { + lxc_remote image show lxd2:bar | grep -q "public: true" + ! lxc_remote image show bar + lxc_remote delete pub ++ ++ # test spawn from public server ++ lxc_remote remote add lxd2-public "${LXD2_ADDR}" --public --accept-certificate ++ lxc_remote init lxd2-public:bar pub + lxc_remote image delete lxd2:bar ++ lxc_remote delete pub + + # Double launch to test if the image downloads only once. + lxc_remote init localhost:testimage lxd2:c1 & diff -Nru lxd-2.14/debian/patches/0003-zfs-fix-container-copy.patch lxd-2.15/debian/patches/0003-zfs-fix-container-copy.patch --- lxd-2.14/debian/patches/0003-zfs-fix-container-copy.patch 2017-06-09 21:18:44.000000000 +0000 +++ lxd-2.15/debian/patches/0003-zfs-fix-container-copy.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -From 965d6a610c48419397ba09073a766c9cb7f482a3 Mon Sep 17 00:00:00 2001 -From: Christian Brauner -Date: Thu, 8 Jun 2017 22:01:24 +0200 -Subject: zfs: fix container copy - -Closes #3395. - -Signed-off-by: Christian Brauner ---- - lxd/storage_zfs.go | 47 +++++++++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 45 insertions(+), 2 deletions(-) - -diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go -index 37697fe6..dbe42152 100644 ---- a/lxd/storage_zfs.go -+++ b/lxd/storage_zfs.go -@@ -958,7 +958,7 @@ func (s *storageZfs) copyWithSnapshots(target container, source container, paren - - zfsSendCmd := exec.Command("zfs", args...) - targetSnapshotDataset := fmt.Sprintf("%s/containers/%s@snapshot-%s", poolName, targetParentName, targetSnapOnlyName) -- zfsRecvCmd := exec.Command("zfs", "receive", targetSnapshotDataset) -+ zfsRecvCmd := exec.Command("zfs", "receive", "-F", targetSnapshotDataset) - - zfsRecvCmd.Stdin, _ = zfsSendCmd.StdoutPipe() - zfsRecvCmd.Stdout = os.Stdout -@@ -1019,8 +1019,9 @@ func (s *storageZfs) ContainerCopy(target container, source container, container - return err - } - -+ prev := "" -+ prevSnapOnlyName := "" - for i, snap := range snapshots { -- prev := "" - if i > 0 { - prev = snapshots[i-1].Name() - } -@@ -1031,6 +1032,7 @@ func (s *storageZfs) ContainerCopy(target container, source container, container - } - - _, snapOnlyName, _ := containerGetParentAndSnapshotName(snap.Name()) -+ prevSnapOnlyName = snapOnlyName - newSnapName := fmt.Sprintf("%s/%s", target.Name(), snapOnlyName) - targetSnapshot, err := containerLoadByName(s.d, newSnapName) - if err != nil { -@@ -1043,6 +1045,47 @@ func (s *storageZfs) ContainerCopy(target container, source container, container - } - } - -+ // send actual container -+ tmpSnapshotName := fmt.Sprintf("copy-send-%s", uuid.NewRandom().String()) -+ err = s.zfsPoolVolumeSnapshotCreate(fmt.Sprintf("containers/%s", source.Name()), tmpSnapshotName) -+ if err != nil { -+ return err -+ } -+ -+ poolName := s.getOnDiskPoolName() -+ currentSnapshotDataset := fmt.Sprintf("%s/containers/%s@%s", poolName, source.Name(), tmpSnapshotName) -+ args := []string{"send", currentSnapshotDataset} -+ if prevSnapOnlyName != "" { -+ parentSnapshotDataset := fmt.Sprintf("%s/containers/%s@snapshot-%s", poolName, source.Name(), prevSnapOnlyName) -+ args = append(args, "-i", parentSnapshotDataset) -+ } -+ -+ zfsSendCmd := exec.Command("zfs", args...) -+ targetSnapshotDataset := fmt.Sprintf("%s/containers/%s@%s", poolName, target.Name(), tmpSnapshotName) -+ zfsRecvCmd := exec.Command("zfs", "receive", "-F", targetSnapshotDataset) -+ -+ zfsRecvCmd.Stdin, _ = zfsSendCmd.StdoutPipe() -+ zfsRecvCmd.Stdout = os.Stdout -+ zfsRecvCmd.Stderr = os.Stderr -+ -+ err = zfsRecvCmd.Start() -+ if err != nil { -+ return err -+ } -+ -+ err = zfsSendCmd.Run() -+ if err != nil { -+ return err -+ } -+ -+ err = zfsRecvCmd.Wait() -+ if err != nil { -+ return err -+ } -+ -+ s.zfsPoolVolumeSnapshotDestroy(fmt.Sprintf("containers/%s", source.Name()), tmpSnapshotName) -+ s.zfsPoolVolumeSnapshotDestroy(fmt.Sprintf("containers/%s", target.Name()), tmpSnapshotName) -+ - fs := fmt.Sprintf("containers/%s", target.Name()) - err = s.zfsPoolVolumeSet(fs, "mountpoint", targetContainerMountPoint) - if err != nil { diff -Nru lxd-2.14/debian/patches/0004-cancel-Fix-crash-if-no-canceler-is-setup.patch lxd-2.15/debian/patches/0004-cancel-Fix-crash-if-no-canceler-is-setup.patch --- lxd-2.14/debian/patches/0004-cancel-Fix-crash-if-no-canceler-is-setup.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0004-cancel-Fix-crash-if-no-canceler-is-setup.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,26 @@ +From bf183e7b510b80883d629fec6c3d743688b3e4a8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Thu, 29 Jun 2017 13:00:41 -0400 +Subject: cancel: Fix crash if no canceler is setup +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Stéphane Graber +--- + shared/cancel/canceler.go | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/shared/cancel/canceler.go b/shared/cancel/canceler.go +index 7e868519..79f60dbf 100644 +--- a/shared/cancel/canceler.go ++++ b/shared/cancel/canceler.go +@@ -34,7 +34,7 @@ func CancelableDownload(c *Canceler, client *http.Client, req *http.Request) (*h + } + + select { +- case <-c.chCancel: ++ case <-chCancel: + if transport, ok := client.Transport.(*http.Transport); ok { + transport.CancelRequest(req) + } diff -Nru lxd-2.14/debian/patches/0004-storage-copy-move-bugfixes.patch lxd-2.15/debian/patches/0004-storage-copy-move-bugfixes.patch --- lxd-2.14/debian/patches/0004-storage-copy-move-bugfixes.patch 2017-06-09 21:18:44.000000000 +0000 +++ lxd-2.15/debian/patches/0004-storage-copy-move-bugfixes.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,174 +0,0 @@ -From 1cf3cc1f13a488cefe609532d57e581f7afe8573 Mon Sep 17 00:00:00 2001 -From: Christian Brauner -Date: Thu, 8 Jun 2017 22:21:55 +0200 -Subject: storage: {copy,move} bugfixes - -Signed-off-by: Christian Brauner ---- - lxd/migrate.go | 2 +- - lxd/storage_btrfs.go | 22 ++++++++++++---------- - lxd/storage_migration.go | 33 ++++++++++++++++++--------------- - lxd/storage_zfs.go | 27 ++++++++++++++++----------- - 4 files changed, 47 insertions(+), 37 deletions(-) - -diff --git a/lxd/migrate.go b/lxd/migrate.go -index 5fa7d1db..244ee1d7 100644 ---- a/lxd/migrate.go -+++ b/lxd/migrate.go -@@ -401,7 +401,7 @@ func (s *migrationSourceWs) Do(migrateOp *operation) error { - return err - } - -- err = driver.SendWhileRunning(s.fsConn, migrateOp, bwlimit) -+ err = driver.SendWhileRunning(s.fsConn, migrateOp, bwlimit, s.containerOnly) - if err != nil { - return abort(err) - } -diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go -index a2956971..a4ea3997 100644 ---- a/lxd/storage_btrfs.go -+++ b/lxd/storage_btrfs.go -@@ -1767,7 +1767,7 @@ func (s *btrfsMigrationSourceDriver) send(conn *websocket.Conn, btrfsPath string - return err - } - --func (s *btrfsMigrationSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string) error { -+func (s *btrfsMigrationSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string, containerOnly bool) error { - _, containerPool := s.container.Storage().GetContainerPoolInfo() - containerName := s.container.Name() - containersPath := getContainerMountPoint(containerPool, "") -@@ -1803,16 +1803,18 @@ func (s *btrfsMigrationSourceDriver) SendWhileRunning(conn *websocket.Conn, op * - return s.send(conn, migrationSendSnapshot, "", wrapper) - } - -- for i, snap := range s.snapshots { -- prev := "" -- if i > 0 { -- prev = getSnapshotMountPoint(containerPool, s.snapshots[i-1].Name()) -- } -+ if !containerOnly { -+ for i, snap := range s.snapshots { -+ prev := "" -+ if i > 0 { -+ prev = getSnapshotMountPoint(containerPool, s.snapshots[i-1].Name()) -+ } - -- snapMntPoint := getSnapshotMountPoint(containerPool, snap.Name()) -- wrapper := StorageProgressReader(op, "fs_progress", snap.Name()) -- if err := s.send(conn, snapMntPoint, prev, wrapper); err != nil { -- return err -+ snapMntPoint := getSnapshotMountPoint(containerPool, snap.Name()) -+ wrapper := StorageProgressReader(op, "fs_progress", snap.Name()) -+ if err := s.send(conn, snapMntPoint, prev, wrapper); err != nil { -+ return err -+ } - } - } - -diff --git a/lxd/storage_migration.go b/lxd/storage_migration.go -index 4f1e095c..c49f2b37 100644 ---- a/lxd/storage_migration.go -+++ b/lxd/storage_migration.go -@@ -18,7 +18,7 @@ type MigrationStorageSourceDriver interface { - /* send any bits of the container/snapshots that are possible while the - * container is still running. - */ -- SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string) error -+ SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string, containerOnly bool) error - - /* send the final bits (e.g. a final delta snapshot for zfs, btrfs, or - * do a final rsync) of the fs after the container has been -@@ -42,22 +42,25 @@ func (s rsyncStorageSourceDriver) Snapshots() []container { - return s.snapshots - } - --func (s rsyncStorageSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string) error { -+func (s rsyncStorageSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string, containerOnly bool) error { - ctName, _, _ := containerGetParentAndSnapshotName(s.container.Name()) -- for _, send := range s.snapshots { -- ourStart, err := send.StorageStart() -- if err != nil { -- return err -- } -- if ourStart { -- defer send.StorageStop() -- } - -- path := send.Path() -- wrapper := StorageProgressReader(op, "fs_progress", send.Name()) -- err = RsyncSend(ctName, shared.AddSlash(path), conn, wrapper, bwlimit) -- if err != nil { -- return err -+ if !containerOnly { -+ for _, send := range s.snapshots { -+ ourStart, err := send.StorageStart() -+ if err != nil { -+ return err -+ } -+ if ourStart { -+ defer send.StorageStop() -+ } -+ -+ path := send.Path() -+ wrapper := StorageProgressReader(op, "fs_progress", send.Name()) -+ err = RsyncSend(ctName, shared.AddSlash(path), conn, wrapper, bwlimit) -+ if err != nil { -+ return err -+ } - } - } - -diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go -index dbe42152..dea7044f 100644 ---- a/lxd/storage_zfs.go -+++ b/lxd/storage_zfs.go -@@ -2510,7 +2510,7 @@ func (s *zfsMigrationSourceDriver) send(conn *websocket.Conn, zfsName string, zf - return err - } - --func (s *zfsMigrationSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string) error { -+func (s *zfsMigrationSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string, containerOnly bool) error { - if s.container.IsSnapshot() { - _, snapOnlyName, _ := containerGetParentAndSnapshotName(s.container.Name()) - snapshotName := fmt.Sprintf("snapshot-%s", snapOnlyName) -@@ -2519,18 +2519,19 @@ func (s *zfsMigrationSourceDriver) SendWhileRunning(conn *websocket.Conn, op *op - } - - lastSnap := "" -+ if !containerOnly { -+ for i, snap := range s.zfsSnapshotNames { -+ prev := "" -+ if i > 0 { -+ prev = s.zfsSnapshotNames[i-1] -+ } - -- for i, snap := range s.zfsSnapshotNames { -- prev := "" -- if i > 0 { -- prev = s.zfsSnapshotNames[i-1] -- } -- -- lastSnap = snap -+ lastSnap = snap - -- wrapper := StorageProgressReader(op, "fs_progress", snap) -- if err := s.send(conn, snap, prev, wrapper); err != nil { -- return err -+ wrapper := StorageProgressReader(op, "fs_progress", snap) -+ if err := s.send(conn, snap, prev, wrapper); err != nil { -+ return err -+ } - } - } - -@@ -2593,6 +2594,10 @@ func (s *storageZfs) MigrationSource(ct container, containerOnly bool) (Migratio - zfs: s, - } - -+ if containerOnly { -+ return &driver, nil -+ } -+ - /* List all the snapshots in order of reverse creation. The idea here - * is that we send the oldest to newest snapshot, hopefully saving on - * xfer costs. Then, after all that, we send the container itself. diff -Nru lxd-2.14/debian/patches/0005-client-Commonize-error-handling.patch lxd-2.15/debian/patches/0005-client-Commonize-error-handling.patch --- lxd-2.14/debian/patches/0005-client-Commonize-error-handling.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0005-client-Commonize-error-handling.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,179 @@ +From 326d6efb327a7a9c516fe1313d69f5d39f12b164 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Fri, 30 Jun 2017 17:02:21 -0400 +Subject: client: Commonize error handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Some functions that were doing direct HTTP queries weren't using the +centralized error handling and would lead to low level errors being +reported to the user rather than the more useful higher level errors. + +Signed-off-by: Stéphane Graber +--- + client/lxd.go | 50 ++++++++++++++++++++++++++---------------------- + client/lxd_containers.go | 15 +++++++++++---- + client/lxd_images.go | 23 ++++++---------------- + 3 files changed, 44 insertions(+), 44 deletions(-) + +diff --git a/client/lxd.go b/client/lxd.go +index 742ad2fc..a6e07130 100644 +--- a/client/lxd.go ++++ b/client/lxd.go +@@ -74,6 +74,32 @@ func (r *ProtocolLXD) RawWebsocket(path string) (*websocket.Conn, error) { + } + + // Internal functions ++func (r *ProtocolLXD) parseResponse(resp *http.Response) (*api.Response, string, error) { ++ // Get the ETag ++ etag := resp.Header.Get("ETag") ++ ++ // Decode the response ++ decoder := json.NewDecoder(resp.Body) ++ response := api.Response{} ++ ++ err := decoder.Decode(&response) ++ if err != nil { ++ // Check the return value for a cleaner error ++ if resp.StatusCode != http.StatusOK { ++ return nil, "", fmt.Errorf("Failed to fetch %s: %s", resp.Request.URL.String(), resp.Status) ++ } ++ ++ return nil, "", err ++ } ++ ++ // Handle errors ++ if response.Type == api.ErrorResponse { ++ return nil, "", fmt.Errorf(response.Error) ++ } ++ ++ return &response, etag, nil ++} ++ + func (r *ProtocolLXD) rawQuery(method string, url string, data interface{}, ETag string) (*api.Response, string, error) { + var req *http.Request + var err error +@@ -130,29 +156,7 @@ func (r *ProtocolLXD) rawQuery(method string, url string, data interface{}, ETag + } + defer resp.Body.Close() + +- // Get the ETag +- etag := resp.Header.Get("ETag") +- +- // Decode the response +- decoder := json.NewDecoder(resp.Body) +- response := api.Response{} +- +- err = decoder.Decode(&response) +- if err != nil { +- // Check the return value for a cleaner error +- if resp.StatusCode != http.StatusOK { +- return nil, "", fmt.Errorf("Failed to fetch %s: %s", url, resp.Status) +- } +- +- return nil, "", err +- } +- +- // Handle errors +- if response.Type == api.ErrorResponse { +- return nil, "", fmt.Errorf(response.Error) +- } +- +- return &response, etag, nil ++ return r.parseResponse(resp) + } + + func (r *ProtocolLXD) query(method string, path string, data interface{}, ETag string) (*api.Response, string, error) { +diff --git a/client/lxd_containers.go b/client/lxd_containers.go +index c3786914..e8d03a14 100644 +--- a/client/lxd_containers.go ++++ b/client/lxd_containers.go +@@ -490,7 +490,10 @@ func (r *ProtocolLXD) GetContainerFile(containerName string, path string) (io.Re + + // Check the return value for a cleaner error + if resp.StatusCode != http.StatusOK { +- return nil, nil, fmt.Errorf("Failed to fetch %s: %s", url, resp.Status) ++ _, _, err := r.parseResponse(resp) ++ if err != nil { ++ return nil, nil, err ++ } + } + + // Parse the headers +@@ -581,8 +584,9 @@ func (r *ProtocolLXD) CreateContainerFile(containerName string, path string, arg + } + + // Check the return value for a cleaner error +- if resp.StatusCode != http.StatusOK { +- return fmt.Errorf("Failed to upload to %s: %s", url, resp.Status) ++ _, _, err = r.parseResponse(resp) ++ if err != nil { ++ return err + } + + return nil +@@ -856,7 +860,10 @@ func (r *ProtocolLXD) GetContainerLogfile(name string, filename string) (io.Read + + // Check the return value for a cleaner error + if resp.StatusCode != http.StatusOK { +- return nil, fmt.Errorf("Failed to fetch %s: %s", url, resp.Status) ++ _, _, err := r.parseResponse(resp) ++ if err != nil { ++ return nil, err ++ } + } + + return resp.Body, err +diff --git a/client/lxd_images.go b/client/lxd_images.go +index edc7a453..e17b1d29 100644 +--- a/client/lxd_images.go ++++ b/client/lxd_images.go +@@ -2,7 +2,6 @@ package lxd + + import ( + "crypto/sha256" +- "encoding/json" + "fmt" + "io" + "io/ioutil" +@@ -125,7 +124,10 @@ func (r *ProtocolLXD) GetPrivateImageFile(fingerprint string, secret string, req + defer response.Body.Close() + + if response.StatusCode != http.StatusOK { +- return nil, fmt.Errorf("Unable to fetch %s: %s", url, response.Status) ++ _, _, err := r.parseResponse(response) ++ if err != nil { ++ return nil, err ++ } + } + + ctype, ctypeParams, err := mime.ParseMediaType(response.Header.Get("Content-Type")) +@@ -406,25 +408,12 @@ func (r *ProtocolLXD) CreateImage(image api.ImagesPost, args *ImageCreateArgs) ( + } + defer resp.Body.Close() + +- // Decode the response +- decoder := json.NewDecoder(resp.Body) +- response := api.Response{} +- +- err = decoder.Decode(&response) ++ // Handle errors ++ response, _, err := r.parseResponse(resp) + if err != nil { +- // Check the return value for a cleaner error +- if resp.StatusCode != http.StatusOK { +- return nil, fmt.Errorf("Failed to fetch %s: %s", reqURL, resp.Status) +- } +- + return nil, err + } + +- // Handle errors +- if response.Type == api.ErrorResponse { +- return nil, fmt.Errorf(response.Error) +- } +- + // Get to the operation + respOperation, err := response.MetadataAsOperation() + if err != nil { diff -Nru lxd-2.14/debian/patches/0005-test-add-more-copy-migration-tests.patch lxd-2.15/debian/patches/0005-test-add-more-copy-migration-tests.patch --- lxd-2.14/debian/patches/0005-test-add-more-copy-migration-tests.patch 2017-06-09 21:18:44.000000000 +0000 +++ lxd-2.15/debian/patches/0005-test-add-more-copy-migration-tests.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -From 39874cba8b96930dbccea993a86d6a3ebc6ee0b0 Mon Sep 17 00:00:00 2001 -From: Christian Brauner -Date: Thu, 8 Jun 2017 22:32:28 +0200 -Subject: test: add more {copy,migration} tests - -Signed-off-by: Christian Brauner ---- - test/suites/migration.sh | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/test/suites/migration.sh b/test/suites/migration.sh -index 4794e54f..c4c63207 100644 ---- a/test/suites/migration.sh -+++ b/test/suites/migration.sh -@@ -124,27 +124,33 @@ migration() { - - # Test container only copies - lxc init testimage cccp -+ echo "before" | lxc file push - cccp/blah - lxc snapshot cccp - lxc snapshot cccp -+ echo "after" | lxc file push - cccp/blah - - # Local container only copy. - lxc copy cccp udssr --container-only - [ "$(lxc info udssr | grep -c snap)" -eq 0 ] -+ [ "$(lxc file pull udssr/blah -)" = "after" ] - lxc delete udssr - - # Local container with snapshots copy. - lxc copy cccp udssr - [ "$(lxc info udssr | grep -c snap)" -eq 2 ] -+ [ "$(lxc file pull udssr/blah -)" = "after" ] - lxc delete udssr - - # Remote container only copy. - lxc_remote copy l1:cccp l2:udssr --container-only - [ "$(lxc_remote info l2:udssr | grep -c snap)" -eq 0 ] -+ [ "$(lxc_remote file pull l2:udssr/blah -)" = "after" ] - lxc_remote delete l2:udssr - - # Remote container with snapshots copy. - lxc_remote copy l1:cccp l2:udssr - [ "$(lxc_remote info l2:udssr | grep -c snap)" -eq 2 ] -+ [ "$(lxc_remote file pull l2:udssr/blah -)" = "after" ] - lxc_remote delete l2:udssr - - # Remote container only move. diff -Nru lxd-2.14/debian/patches/0006-lxc-config-Removal-of-multiple-devices-at-once.patch lxd-2.15/debian/patches/0006-lxc-config-Removal-of-multiple-devices-at-once.patch --- lxd-2.14/debian/patches/0006-lxc-config-Removal-of-multiple-devices-at-once.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0006-lxc-config-Removal-of-multiple-devices-at-once.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,80 @@ +From 4c1e59f308153f012299fb5daa434fa6e39659a0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Fri, 30 Jun 2017 15:44:47 -0400 +Subject: lxc/config: Removal of multiple devices at once +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Launchpad: https://bugs.launchpad.net/ubuntu/+source/lxd/+bug/1690299 +Signed-off-by: Stéphane Graber +--- + lxc/config.go | 26 ++++++++++++++------------ + 1 file changed, 14 insertions(+), 12 deletions(-) + +diff --git a/lxc/config.go b/lxc/config.go +index f9b26642..6bc2fd06 100644 +--- a/lxc/config.go ++++ b/lxc/config.go +@@ -99,7 +99,7 @@ lxc config device list [:] + lxc config device show [:] + Show full device details for container. + +-lxc config device remove [:] ++lxc config device remove [:] ... + Remove device from container. + + *Client trust store management* +@@ -993,19 +993,19 @@ func (c *configCmd) deviceRm(conf *config.Config, which string, args []string) e + return err + } + +- devname := args[3] +- + if which == "profile" { + profile, etag, err := client.GetProfile(name) + if err != nil { + return err + } + +- _, ok := profile.Devices[devname] +- if !ok { +- return fmt.Errorf(i18n.G("The device doesn't exist")) ++ for _, devname := range args[3:] { ++ _, ok := profile.Devices[devname] ++ if !ok { ++ return fmt.Errorf(i18n.G("The device doesn't exist")) ++ } ++ delete(profile.Devices, devname) + } +- delete(profile.Devices, devname) + + err = client.UpdateProfile(name, profile.Writable(), etag) + if err != nil { +@@ -1017,11 +1017,13 @@ func (c *configCmd) deviceRm(conf *config.Config, which string, args []string) e + return err + } + +- _, ok := container.Devices[devname] +- if !ok { +- return fmt.Errorf(i18n.G("The device doesn't exist")) ++ for _, devname := range args[3:] { ++ _, ok := container.Devices[devname] ++ if !ok { ++ return fmt.Errorf(i18n.G("The device doesn't exist")) ++ } ++ delete(container.Devices, devname) + } +- delete(container.Devices, devname) + + op, err := client.UpdateContainer(name, container.Writable(), etag) + if err != nil { +@@ -1034,7 +1036,7 @@ func (c *configCmd) deviceRm(conf *config.Config, which string, args []string) e + } + } + +- fmt.Printf(i18n.G("Device %s removed from %s")+"\n", devname, name) ++ fmt.Printf(i18n.G("Device %s removed from %s")+"\n", strings.Join(args[3:], ", "), name) + return nil + } + diff -Nru lxd-2.14/debian/patches/0007-network-Don-t-fail-on-non-process-PIDs.patch lxd-2.15/debian/patches/0007-network-Don-t-fail-on-non-process-PIDs.patch --- lxd-2.14/debian/patches/0007-network-Don-t-fail-on-non-process-PIDs.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0007-network-Don-t-fail-on-non-process-PIDs.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,33 @@ +From 8e07d4ee6fc0c2399cbeab0f1d13b51ff86f10a7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Sat, 1 Jul 2017 00:38:51 -0400 +Subject: network: Don't fail on non-process PIDs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If the PID we have point to a kernel thread, /proc/PID/exe will not +exist and resolving the symlink will therefore fail. + +In such cases, just go ahead with an empty path which will result in the +right behavior. + +Launchpad: https://bugs.launchpad.net/ubuntu/+source/lxd/+bug/1698712 +Signed-off-by: Stéphane Graber +--- + lxd/networks_utils.go | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lxd/networks_utils.go b/lxd/networks_utils.go +index 3bac33d0..098487cc 100644 +--- a/lxd/networks_utils.go ++++ b/lxd/networks_utils.go +@@ -681,7 +681,7 @@ func networkKillDnsmasq(name string, reload bool) error { + // Check if it's dnsmasq + cmdPath, err := os.Readlink(fmt.Sprintf("/proc/%s/exe", pid)) + if err != nil { +- return err ++ cmdPath = "" + } + + // Deal with deleted paths diff -Nru lxd-2.14/debian/patches/0008-config-Try-to-be-clever-about-in-snapshots.patch lxd-2.15/debian/patches/0008-config-Try-to-be-clever-about-in-snapshots.patch --- lxd-2.14/debian/patches/0008-config-Try-to-be-clever-about-in-snapshots.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0008-config-Try-to-be-clever-about-in-snapshots.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,40 @@ +From f1b23226c63b957196596f84075dfb30d75e5730 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Sat, 1 Jul 2017 01:33:31 -0400 +Subject: config: Try to be clever about ":" in snapshots +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If we detect a ":" in the provided string and can't find any remote with +that name and we detect a "/" in the resource name, then assume we're +dealing with a snapshot containing ":" and select the default remote. + +Launchpad: https://bugs.launchpad.net/ubuntu/+source/lxd/+bug/1694855 +Signed-off-by: Stéphane Graber +--- + lxc/config/remote.go | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/lxc/config/remote.go b/lxc/config/remote.go +index 3317ccc4..e5d255e6 100644 +--- a/lxc/config/remote.go ++++ b/lxc/config/remote.go +@@ -21,11 +21,16 @@ type Remote struct { + func (c *Config) ParseRemote(raw string) (string, string, error) { + result := strings.SplitN(raw, ":", 2) + if len(result) == 1 { +- return c.DefaultRemote, result[0], nil ++ return c.DefaultRemote, raw, nil + } + + _, ok := c.Remotes[result[0]] + if !ok { ++ // Attempt to play nice with snapshots containing ":" ++ if shared.IsSnapshot(raw) && strings.Contains(result[0], "/") { ++ return c.DefaultRemote, raw, nil ++ } ++ + return "", "", fmt.Errorf("The remote \"%s\" doesn't exist", result[0]) + } + diff -Nru lxd-2.14/debian/patches/0009-Fix-readonly-mode-for-directory-mount.patch lxd-2.15/debian/patches/0009-Fix-readonly-mode-for-directory-mount.patch --- lxd-2.14/debian/patches/0009-Fix-readonly-mode-for-directory-mount.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0009-Fix-readonly-mode-for-directory-mount.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,31 @@ +From a620f239bb72452a3d9470e0939b44cfe78a737e Mon Sep 17 00:00:00 2001 +From: Denis Pynkin +Date: Sat, 1 Jul 2017 20:32:06 +0300 +Subject: Fix readonly mode for directory mount + +Added remount of binded mounts with readonly mode if flag "readonly" is "true". + +Signed-off-by: Denis Pynkin +--- + lxd/devices.go | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/lxd/devices.go b/lxd/devices.go +index b15eedef..7d65bfa1 100644 +--- a/lxd/devices.go ++++ b/lxd/devices.go +@@ -909,6 +909,14 @@ func deviceMountDisk(srcPath string, dstPath string, readonly bool, recursive bo + return fmt.Errorf("Unable to mount %s at %s: %s", srcPath, dstPath, err) + } + ++ // Remount bind mounts in readonly mode if requested ++ if readonly == true && flags&syscall.MS_BIND == syscall.MS_BIND { ++ flags = syscall.MS_RDONLY | syscall.MS_BIND | syscall.MS_REMOUNT ++ if err = syscall.Mount("", dstPath, fstype, uintptr(flags), ""); err != nil { ++ return fmt.Errorf("Unable to mount %s in readonly mode: %s", dstPath, err) ++ } ++ } ++ + flags = syscall.MS_REC | syscall.MS_SLAVE + if err = syscall.Mount("", dstPath, "", uintptr(flags), ""); err != nil { + return fmt.Errorf("unable to make mount %s private: %s", dstPath, err) diff -Nru lxd-2.14/debian/patches/0010-client-Fix-race-condition-in-operation-handling.patch lxd-2.15/debian/patches/0010-client-Fix-race-condition-in-operation-handling.patch --- lxd-2.14/debian/patches/0010-client-Fix-race-condition-in-operation-handling.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0010-client-Fix-race-condition-in-operation-handling.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,51 @@ +From d3858167d11b09d8c7ffb5511f0feec373adf05a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Sun, 2 Jul 2017 02:23:09 -0400 +Subject: client: Fix race condition in operation handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Stéphane Graber +--- + client/operations.go | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/client/operations.go b/client/operations.go +index 7bf1cbd6..59ece5fd 100644 +--- a/client/operations.go ++++ b/client/operations.go +@@ -175,6 +175,10 @@ func (op *Operation) setupListener() error { + }) + if err != nil { + op.listener.Disconnect() ++ op.listener = nil ++ close(op.chActive) ++ close(chReady) ++ + return err + } + +@@ -182,14 +186,22 @@ func (op *Operation) setupListener() error { + err = op.Refresh() + if err != nil { + op.listener.Disconnect() ++ op.listener = nil ++ close(op.chActive) ++ close(chReady) ++ + return err + } + + // Check if not done already + if op.StatusCode.IsFinal() { + op.listener.Disconnect() ++ op.listener = nil + close(op.chActive) + ++ op.handlerReady = true ++ close(chReady) ++ + if op.Err != "" { + return fmt.Errorf(op.Err) + } diff -Nru lxd-2.14/debian/patches/0011-import-keep-volatile-keys.patch lxd-2.15/debian/patches/0011-import-keep-volatile-keys.patch --- lxd-2.14/debian/patches/0011-import-keep-volatile-keys.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0011-import-keep-volatile-keys.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,49 @@ +From e2898a3d1db00dd0e68eb30cd0b6c707731f62e8 Mon Sep 17 00:00:00 2001 +From: Christian Brauner +Date: Sun, 2 Jul 2017 23:31:18 +0200 +Subject: import: keep volatile keys + +We shouldn't wipe volatile keys on container import. Otherwise we'll lose +things like hwaddr and last idmapping. + +Signed-off-by: Christian Brauner +--- + lxd/api_internal.go | 11 ----------- + 1 file changed, 11 deletions(-) + +diff --git a/lxd/api_internal.go b/lxd/api_internal.go +index 27157184..3a520be8 100644 +--- a/lxd/api_internal.go ++++ b/lxd/api_internal.go +@@ -8,7 +8,6 @@ import ( + "net/http" + "os" + "strconv" +- "strings" + + "github.com/gorilla/mux" + "gopkg.in/yaml.v2" +@@ -345,11 +344,6 @@ func internalImport(d *Daemon, r *http.Request) Response { + } + + baseImage := backup.Container.Config["volatile.base_image"] +- for k := range backup.Container.Config { +- if strings.HasPrefix(k, "volatile") { +- delete(backup.Container.Config, k) +- } +- } + + arch, err := osarch.ArchitectureId(backup.Container.Architecture) + if err != nil { +@@ -430,11 +424,6 @@ func internalImport(d *Daemon, r *http.Request) Response { + } + + baseImage := snap.Config["volatile.base_image"] +- for k := range snap.Config { +- if strings.HasPrefix(k, "volatile") { +- delete(snap.Config, k) +- } +- } + + arch, err := osarch.ArchitectureId(snap.Architecture) + if err != nil { diff -Nru lxd-2.14/debian/patches/0012-import-remove-last-dependency-on-symlink.patch lxd-2.15/debian/patches/0012-import-remove-last-dependency-on-symlink.patch --- lxd-2.14/debian/patches/0012-import-remove-last-dependency-on-symlink.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0012-import-remove-last-dependency-on-symlink.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,26 @@ +From e32e64a2473cdb2030672490dc82ca29cf402801 Mon Sep 17 00:00:00 2001 +From: Christian Brauner +Date: Sun, 2 Jul 2017 23:32:13 +0200 +Subject: import: remove last dependency on symlink + +When importing containers we do not rely on symlinks. + +Signed-off-by: Christian Brauner +--- + lxd/api_internal.go | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/lxd/api_internal.go b/lxd/api_internal.go +index 3a520be8..a41746ff 100644 +--- a/lxd/api_internal.go ++++ b/lxd/api_internal.go +@@ -182,7 +182,8 @@ func internalImport(d *Daemon, r *http.Request) Response { + } + + // Read in the backup.yaml file. +- backup, err := slurpBackupFile(shared.VarPath("containers", req.Name, "backup.yaml")) ++ backupYamlPath := shared.VarPath("storage-pools", containerPoolName, "containers", req.Name, "backup.yaml") ++ backup, err := slurpBackupFile(backupYamlPath) + if err != nil { + return SmartError(err) + } diff -Nru lxd-2.14/debian/patches/0013-Better-handle-errors-in-memory-reporting.patch lxd-2.15/debian/patches/0013-Better-handle-errors-in-memory-reporting.patch --- lxd-2.14/debian/patches/0013-Better-handle-errors-in-memory-reporting.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0013-Better-handle-errors-in-memory-reporting.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,77 @@ +From d62f854e826a47c48abc275d9fc560bdceff92e2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Sun, 2 Jul 2017 18:14:10 -0400 +Subject: Better handle errors in memory reporting +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Closes #3482 + +Signed-off-by: Stéphane Graber +--- + lxd/container_lxc.go | 39 ++++++++++++++++++--------------------- + 1 file changed, 18 insertions(+), 21 deletions(-) + +diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go +index 3e104185..2e574107 100644 +--- a/lxd/container_lxc.go ++++ b/lxd/container_lxc.go +@@ -4980,39 +4980,36 @@ func (c *containerLXC) memoryState() api.ContainerStateMemory { + + // Memory in bytes + value, err := c.CGroupGet("memory.usage_in_bytes") +- valueInt, err := strconv.ParseInt(value, 10, 64) +- if err != nil { +- valueInt = -1 ++ valueInt, err1 := strconv.ParseInt(value, 10, 64) ++ if err == nil && err1 == nil { ++ memory.Usage = valueInt + } +- memory.Usage = valueInt + + // Memory peak in bytes + value, err = c.CGroupGet("memory.max_usage_in_bytes") +- valueInt, err = strconv.ParseInt(value, 10, 64) +- if err != nil { +- valueInt = -1 ++ valueInt, err1 = strconv.ParseInt(value, 10, 64) ++ if err == nil && err1 == nil { ++ memory.UsagePeak = valueInt + } + +- memory.UsagePeak = valueInt +- + if cgSwapAccounting { + // Swap in bytes +- value, err := c.CGroupGet("memory.memsw.usage_in_bytes") +- valueInt, err := strconv.ParseInt(value, 10, 64) +- if err != nil { +- valueInt = -1 ++ if memory.Usage > 0 { ++ value, err := c.CGroupGet("memory.memsw.usage_in_bytes") ++ valueInt, err1 := strconv.ParseInt(value, 10, 64) ++ if err == nil && err1 == nil { ++ memory.SwapUsage = valueInt - memory.Usage ++ } + } + +- memory.SwapUsage = valueInt - memory.Usage +- + // Swap peak in bytes +- value, err = c.CGroupGet("memory.memsw.max_usage_in_bytes") +- valueInt, err = strconv.ParseInt(value, 10, 64) +- if err != nil { +- valueInt = -1 ++ if memory.UsagePeak > 0 { ++ value, err = c.CGroupGet("memory.memsw.max_usage_in_bytes") ++ valueInt, err1 = strconv.ParseInt(value, 10, 64) ++ if err == nil && err1 == nil { ++ memory.SwapUsagePeak = valueInt - memory.UsagePeak ++ } + } +- +- memory.SwapUsagePeak = valueInt - memory.UsagePeak + } + + return memory diff -Nru lxd-2.14/debian/patches/0014-client-Don-t-live-migrate-stopped-containers.patch lxd-2.15/debian/patches/0014-client-Don-t-live-migrate-stopped-containers.patch --- lxd-2.14/debian/patches/0014-client-Don-t-live-migrate-stopped-containers.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0014-client-Don-t-live-migrate-stopped-containers.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,36 @@ +From 53c6e59a0aeb914506f9ae21c32ec1e050e2950a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?St=C3=A9phane=20Graber?= +Date: Mon, 3 Jul 2017 01:25:39 -0400 +Subject: client: Don't live migrate stopped containers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Stéphane Graber +--- + client/lxd_containers.go | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/client/lxd_containers.go b/client/lxd_containers.go +index e8d03a14..c2362423 100644 +--- a/client/lxd_containers.go ++++ b/client/lxd_containers.go +@@ -203,7 +203,6 @@ func (r *ProtocolLXD) CopyContainer(source ContainerServer, container api.Contai + ContainerPut: container.Writable(), + } + req.Source.BaseImage = container.Config["volatile.base_image"] +- req.Source.Live = container.StatusCode == api.Running + + // Process the copy arguments + if args != nil { +@@ -221,6 +220,10 @@ func (r *ProtocolLXD) CopyContainer(source ContainerServer, container api.Contai + req.Source.ContainerOnly = args.ContainerOnly + } + ++ if req.Source.Live { ++ req.Source.Live = container.StatusCode == api.Running ++ } ++ + // Optimization for the local copy case + if r == source { + // Local copy source fields diff -Nru lxd-2.14/debian/patches/0015-Fix-file-push-pull-with-names-containing-spaces.patch lxd-2.15/debian/patches/0015-Fix-file-push-pull-with-names-containing-spaces.patch --- lxd-2.14/debian/patches/0015-Fix-file-push-pull-with-names-containing-spaces.patch 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/debian/patches/0015-Fix-file-push-pull-with-names-containing-spaces.patch 2017-07-05 18:51:39.000000000 +0000 @@ -0,0 +1,104 @@ +From 916f33d8843608eade93f4dbde69dd26411bf4a1 Mon Sep 17 00:00:00 2001 +From: Alberto Donato +Date: Mon, 3 Jul 2017 11:10:52 +0200 +Subject: Fix file push/pull with names containing spaces. + +Signed-off-by: Alberto Donato +--- + client/lxd_containers.go | 19 +++++++++++++++---- + shared/util.go | 16 ++++++++++++++++ + shared/util_test.go | 10 ++++++++++ + 3 files changed, 41 insertions(+), 4 deletions(-) + +diff --git a/client/lxd_containers.go b/client/lxd_containers.go +index c2362423..3977fd28 100644 +--- a/client/lxd_containers.go ++++ b/client/lxd_containers.go +@@ -474,8 +474,14 @@ func (r *ProtocolLXD) ExecContainer(containerName string, exec api.ContainerExec + // GetContainerFile retrieves the provided path from the container + func (r *ProtocolLXD) GetContainerFile(containerName string, path string) (io.ReadCloser, *ContainerFileResponse, error) { + // Prepare the HTTP request +- url := fmt.Sprintf("%s/1.0/containers/%s/files?path=%s", r.httpHost, containerName, path) +- req, err := http.NewRequest("GET", url, nil) ++ requestURL, err := shared.URLEncode( ++ fmt.Sprintf("%s/1.0/containers/%s/files", r.httpHost, containerName), ++ map[string]string{"path": path}) ++ if err != nil { ++ return nil, nil, err ++ } ++ ++ req, err := http.NewRequest("GET", requestURL, nil) + if err != nil { + return nil, nil, err + } +@@ -548,8 +554,13 @@ func (r *ProtocolLXD) CreateContainerFile(containerName string, path string, arg + } + + // Prepare the HTTP request +- url := fmt.Sprintf("%s/1.0/containers/%s/files?path=%s", r.httpHost, containerName, path) +- req, err := http.NewRequest("POST", url, args.Content) ++ requestURL, err := shared.URLEncode( ++ fmt.Sprintf("%s/1.0/containers/%s/files", r.httpHost, containerName), ++ map[string]string{"path": path}) ++ if err != nil { ++ return err ++ } ++ req, err := http.NewRequest("POST", requestURL, args.Content) + if err != nil { + return err + } +diff --git a/shared/util.go b/shared/util.go +index 43cba257..21648147 100644 +--- a/shared/util.go ++++ b/shared/util.go +@@ -12,6 +12,7 @@ import ( + "io/ioutil" + "math" + "net/http" ++ "net/url" + "os" + "os/exec" + "path" +@@ -28,6 +29,21 @@ import ( + const SnapshotDelimiter = "/" + const DefaultPort = "8443" + ++// URLEncode encodes a path and query parameters to a URL. ++func URLEncode(path string, query map[string]string) (string, error) { ++ u, err := url.Parse(path) ++ if err != nil { ++ return "", err ++ } ++ ++ params := url.Values{} ++ for key, value := range query { ++ params.Add(key, value) ++ } ++ u.RawQuery = params.Encode() ++ return u.String(), nil ++} ++ + // AddSlash adds a slash to the end of paths if they don't already have one. + // This can be useful for rsyncing things, since rsync has behavior present on + // the presence or absence of a trailing slash. +diff --git a/shared/util_test.go b/shared/util_test.go +index 458c8fca..33157374 100644 +--- a/shared/util_test.go ++++ b/shared/util_test.go +@@ -9,6 +9,16 @@ import ( + "testing" + ) + ++func TestURLEncode(t *testing.T) { ++ url, _ := URLEncode( ++ "/path/with spaces", ++ map[string]string{"param": "with spaces", "other": "without"}) ++ expected := "/path/with%20spaces?other=without¶m=with+spaces" ++ if url != expected { ++ t.Error(fmt.Errorf("'%s' != '%s'", url, expected)) ++ } ++} ++ + func TestFileCopy(t *testing.T) { + helloWorld := []byte("hello world\n") + source, err := ioutil.TempFile("", "") diff -Nru lxd-2.14/debian/patches/series lxd-2.15/debian/patches/series --- lxd-2.14/debian/patches/series 2017-06-09 21:18:44.000000000 +0000 +++ lxd-2.15/debian/patches/series 2017-07-05 18:51:39.000000000 +0000 @@ -1,5 +1,15 @@ -0001-storage-insert-driver-correctly.patch -0002-patches-fix-upgrade.patch -0003-zfs-fix-container-copy.patch -0004-storage-copy-move-bugfixes.patch -0005-test-add-more-copy-migration-tests.patch +0001-lxc-publish-Fix-fingerprint-printing.patch +0002-Fix-failure-to-launch-containers-with-random-names.patch +0003-client-Fix-handling-of-public-LXD-remote.patch +0004-cancel-Fix-crash-if-no-canceler-is-setup.patch +0005-client-Commonize-error-handling.patch +0006-lxc-config-Removal-of-multiple-devices-at-once.patch +0007-network-Don-t-fail-on-non-process-PIDs.patch +0008-config-Try-to-be-clever-about-in-snapshots.patch +0009-Fix-readonly-mode-for-directory-mount.patch +0010-client-Fix-race-condition-in-operation-handling.patch +0011-import-keep-volatile-keys.patch +0012-import-remove-last-dependency-on-symlink.patch +0013-Better-handle-errors-in-memory-reporting.patch +0014-client-Don-t-live-migrate-stopped-containers.patch +0015-Fix-file-push-pull-with-names-containing-spaces.patch diff -Nru lxd-2.14/dist/src/github.com/golang/protobuf/jsonpb/jsonpb.go lxd-2.15/dist/src/github.com/golang/protobuf/jsonpb/jsonpb.go --- lxd-2.14/dist/src/github.com/golang/protobuf/jsonpb/jsonpb.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/golang/protobuf/jsonpb/jsonpb.go 2017-06-28 03:01:30.000000000 +0000 @@ -108,6 +108,12 @@ type int32Slice []int32 +var nonFinite = map[string]float64{ + `"NaN"`: math.NaN(), + `"Infinity"`: math.Inf(1), + `"-Infinity"`: math.Inf(-1), +} + // For sorting extensions ids to ensure stable output. func (s int32Slice) Len() int { return len(s) } func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } @@ -124,6 +130,22 @@ if err != nil { return err } + if typeURL != "" { + // we are marshaling this object to an Any type + var js map[string]*json.RawMessage + if err = json.Unmarshal(b, &js); err != nil { + return fmt.Errorf("type %T produced invalid JSON: %v", v, err) + } + turl, err := json.Marshal(typeURL) + if err != nil { + return fmt.Errorf("failed to marshal type URL %q to JSON: %v", typeURL, err) + } + js["@type"] = (*json.RawMessage)(&turl) + if b, err = json.Marshal(js); err != nil { + return err + } + } + out.write(string(b)) return out.err } @@ -441,9 +463,6 @@ // Handle well-known types. // Most are handled up in marshalObject (because 99% are messages). - type wkt interface { - XXX_WellKnownType() string - } if wkt, ok := v.Interface().(wkt); ok { switch wkt.XXX_WellKnownType() { case "NullValue": @@ -629,9 +648,6 @@ } // Handle well-known types. - type wkt interface { - XXX_WellKnownType() string - } if w, ok := target.Addr().Interface().(wkt); ok { switch w.XXX_WellKnownType() { case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", @@ -651,13 +667,13 @@ } val, ok := jsonFields["@type"] - if !ok { + if !ok || val == nil { return errors.New("Any JSON doesn't have '@type'") } var turl string if err := json.Unmarshal([]byte(*val), &turl); err != nil { - return fmt.Errorf("can't unmarshal Any's '@type': %q", val) + return fmt.Errorf("can't unmarshal Any's '@type': %q", *val) } target.Field(0).SetString(turl) @@ -678,7 +694,7 @@ } if err := u.unmarshalValue(reflect.ValueOf(m).Elem(), *val, nil); err != nil { - return fmt.Errorf("can't unmarshal Any's WKT: %v", err) + return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err) } } else { delete(jsonFields, "@type") @@ -688,13 +704,13 @@ } if err = u.unmarshalValue(reflect.ValueOf(m).Elem(), nestedProto, nil); err != nil { - return fmt.Errorf("can't unmarshal nested Any proto: %v", err) + return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err) } } b, err := proto.Marshal(m) if err != nil { - return fmt.Errorf("can't marshal proto into Any.Value: %v", err) + return fmt.Errorf("can't marshal proto %T into Any.Value: %v", m, err) } target.Field(1).SetBytes(b) @@ -971,6 +987,15 @@ inputValue = inputValue[1 : len(inputValue)-1] } + // Non-finite numbers can be encoded as strings. + isFloat := targetType.Kind() == reflect.Float32 || targetType.Kind() == reflect.Float64 + if isFloat { + if num, ok := nonFinite[string(inputValue)]; ok { + target.SetFloat(num) + return nil + } + } + // Use the encoding/json for parsing other value types. return json.Unmarshal(inputValue, target.Addr().Interface()) } diff -Nru lxd-2.14/dist/src/github.com/golang/protobuf/jsonpb/jsonpb_test.go lxd-2.15/dist/src/github.com/golang/protobuf/jsonpb/jsonpb_test.go --- lxd-2.14/dist/src/github.com/golang/protobuf/jsonpb/jsonpb_test.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/golang/protobuf/jsonpb/jsonpb_test.go 2017-06-28 03:01:30.000000000 +0000 @@ -44,6 +44,7 @@ pb "github.com/golang/protobuf/jsonpb/jsonpb_test_proto" proto3pb "github.com/golang/protobuf/proto/proto3_proto" + "github.com/golang/protobuf/ptypes" anypb "github.com/golang/protobuf/ptypes/any" durpb "github.com/golang/protobuf/ptypes/duration" stpb "github.com/golang/protobuf/ptypes/struct" @@ -461,7 +462,7 @@ } } -func TestMarshalingWithJSONPBMarshaler(t *testing.T) { +func TestMarshalJSONPBMarshaler(t *testing.T) { rawJson := `{ "foo": "bar", "baz": [0, 1, 2, 3] }` msg := dynamicMessage{rawJson: rawJson} str, err := new(Marshaler).MarshalToString(&msg) @@ -473,6 +474,24 @@ } } +func TestMarshalAnyJSONPBMarshaler(t *testing.T) { + msg := dynamicMessage{rawJson: `{ "foo": "bar", "baz": [0, 1, 2, 3] }`} + a, err := ptypes.MarshalAny(&msg) + if err != nil { + t.Errorf("an unexpected error occurred when marshalling to Any: %v", err) + } + str, err := new(Marshaler).MarshalToString(a) + if err != nil { + t.Errorf("an unexpected error occurred when marshalling Any to JSON: %v", err) + } + // after custom marshaling, it's round-tripped through JSON decoding/encoding already, + // so the keys are sorted, whitespace is compacted, and "@type" key has been added + expected := `{"@type":"type.googleapis.com/` + dynamicMessageName +`","baz":[0,1,2,3],"foo":"bar"}` + if str != expected { + t.Errorf("marshalling JSON produced incorrect output: got %s, wanted %s", str, expected) + } +} + var unmarshalingTests = []struct { desc string unmarshaler Unmarshaler @@ -511,6 +530,9 @@ }}}, {"unquoted int64 object", Unmarshaler{}, `{"oInt64":-314}`, &pb.Simple{OInt64: proto.Int64(-314)}}, {"unquoted uint64 object", Unmarshaler{}, `{"oUint64":123}`, &pb.Simple{OUint64: proto.Uint64(123)}}, + {"NaN", Unmarshaler{}, `{"oDouble":"NaN"}`, &pb.Simple{ODouble: proto.Float64(math.NaN())}}, + {"Inf", Unmarshaler{}, `{"oFloat":"Infinity"}`, &pb.Simple{OFloat: proto.Float32(float32(math.Inf(1)))}}, + {"-Inf", Unmarshaler{}, `{"oDouble":"-Infinity"}`, &pb.Simple{ODouble: proto.Float64(math.Inf(-1))}}, {"map", Unmarshaler{}, `{"nummy":{"1":2,"3":4}}`, &pb.Mappy{Nummy: map[int64]int32{1: 2, 3: 4}}}, {"map", Unmarshaler{}, `{"strry":{"\"one\"":"two","three":"four"}}`, &pb.Mappy{Strry: map[string]string{`"one"`: "two", "three": "four"}}}, {"map", Unmarshaler{}, `{"objjy":{"1":{"dub":1}}}`, &pb.Mappy{Objjy: map[int32]*pb.Simple3{1: &pb.Simple3{Dub: 1}}}}, @@ -670,11 +692,10 @@ } } -func TestUnmarshalWithJSONPBUnmarshaler(t *testing.T) { +func TestUnmarshalJSONPBUnmarshaler(t *testing.T) { rawJson := `{ "foo": "bar", "baz": [0, 1, 2, 3] }` var msg dynamicMessage - err := Unmarshal(strings.NewReader(rawJson), &msg) - if err != nil { + if err := Unmarshal(strings.NewReader(rawJson), &msg); err != nil { t.Errorf("an unexpected error occurred when parsing into JSONPBUnmarshaler: %v", err) } if msg.rawJson != rawJson { @@ -682,10 +703,39 @@ } } +func TestUnmarshalAnyJSONPBUnmarshaler(t *testing.T) { + rawJson := `{ "@type": "blah.com/` + dynamicMessageName + `", "foo": "bar", "baz": [0, 1, 2, 3] }` + var got anypb.Any + if err := Unmarshal(strings.NewReader(rawJson), &got); err != nil { + t.Errorf("an unexpected error occurred when parsing into JSONPBUnmarshaler: %v", err) + } + + dm := &dynamicMessage{rawJson: `{"baz":[0,1,2,3],"foo":"bar"}`} + var want anypb.Any + if b, err := proto.Marshal(dm); err != nil { + t.Errorf("an unexpected error occurred when marshaling message: %v", err) + } else { + want.TypeUrl = "blah.com/" + dynamicMessageName + want.Value = b + } + + if !proto.Equal(&got, &want) { + t.Errorf("message contents not set correctly after unmarshalling JSON: got %s, wanted %s", got, want) + } +} + +const ( + dynamicMessageName = "google.protobuf.jsonpb.testing.dynamicMessage" +) +func init() { + // we register the custom type below so that we can use it in Any types + proto.RegisterType((*dynamicMessage)(nil), dynamicMessageName) +} + // dynamicMessage implements protobuf.Message but is not a normal generated message type. // It provides implementations of JSONPBMarshaler and JSONPBUnmarshaler for JSON support. type dynamicMessage struct { - rawJson string + rawJson string `protobuf:"bytes,1,opt,name=rawJson"` } func (m *dynamicMessage) Reset() { @@ -703,7 +753,7 @@ return []byte(m.rawJson), nil } -func (m *dynamicMessage) UnmarshalJSONPB(jum *Unmarshaler, json []byte) error { - m.rawJson = string(json) +func (m *dynamicMessage) UnmarshalJSONPB(jum *Unmarshaler, js []byte) error { + m.rawJson = string(js) return nil -} +} \ No newline at end of file diff -Nru lxd-2.14/dist/src/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden lxd-2.15/dist/src/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden --- lxd-2.14/dist/src/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden 2017-06-28 03:01:30.000000000 +0000 @@ -1,6 +1,5 @@ -// Code generated by protoc-gen-go. +// Code generated by protoc-gen-go. DO NOT EDIT. // source: my_test/test.proto -// DO NOT EDIT! /* Package my_test is a generated protocol buffer package. diff -Nru lxd-2.14/dist/src/github.com/golang/protobuf/ptypes/any.go lxd-2.15/dist/src/github.com/golang/protobuf/ptypes/any.go --- lxd-2.14/dist/src/github.com/golang/protobuf/ptypes/any.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/golang/protobuf/ptypes/any.go 2017-06-28 03:01:30.000000000 +0000 @@ -51,6 +51,9 @@ // function. AnyMessageName is provided for less common use cases like filtering a // sequence of Any messages based on a set of allowed message type names. func AnyMessageName(any *any.Any) (string, error) { + if any == nil { + return "", fmt.Errorf("message is nil") + } slash := strings.LastIndex(any.TypeUrl, "/") if slash < 0 { return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) diff -Nru lxd-2.14/dist/src/github.com/golang/protobuf/ptypes/duration_test.go lxd-2.15/dist/src/github.com/golang/protobuf/ptypes/duration_test.go --- lxd-2.14/dist/src/github.com/golang/protobuf/ptypes/duration_test.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/golang/protobuf/ptypes/duration_test.go 2017-06-28 03:01:30.000000000 +0000 @@ -52,37 +52,37 @@ dur time.Duration }{ // The zero duration. - {&durpb.Duration{0, 0}, true, true, 0}, + {&durpb.Duration{Seconds: 0, Nanos: 0}, true, true, 0}, // Some ordinary non-zero durations. - {&durpb.Duration{100, 0}, true, true, 100 * time.Second}, - {&durpb.Duration{-100, 0}, true, true, -100 * time.Second}, - {&durpb.Duration{100, 987}, true, true, 100*time.Second + 987}, - {&durpb.Duration{-100, -987}, true, true, -(100*time.Second + 987)}, + {&durpb.Duration{Seconds: 100, Nanos: 0}, true, true, 100 * time.Second}, + {&durpb.Duration{Seconds: -100, Nanos: 0}, true, true, -100 * time.Second}, + {&durpb.Duration{Seconds: 100, Nanos: 987}, true, true, 100*time.Second + 987}, + {&durpb.Duration{Seconds: -100, Nanos: -987}, true, true, -(100*time.Second + 987)}, // The largest duration representable in Go. - {&durpb.Duration{maxGoSeconds, int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, true, math.MaxInt64}, + {&durpb.Duration{Seconds: maxGoSeconds, Nanos: int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, true, math.MaxInt64}, // The smallest duration representable in Go. - {&durpb.Duration{minGoSeconds, int32(math.MinInt64 - 1e9*minGoSeconds)}, true, true, math.MinInt64}, + {&durpb.Duration{Seconds: minGoSeconds, Nanos: int32(math.MinInt64 - 1e9*minGoSeconds)}, true, true, math.MinInt64}, {nil, false, false, 0}, - {&durpb.Duration{-100, 987}, false, false, 0}, - {&durpb.Duration{100, -987}, false, false, 0}, - {&durpb.Duration{math.MinInt64, 0}, false, false, 0}, - {&durpb.Duration{math.MaxInt64, 0}, false, false, 0}, + {&durpb.Duration{Seconds: -100, Nanos: 987}, false, false, 0}, + {&durpb.Duration{Seconds: 100, Nanos: -987}, false, false, 0}, + {&durpb.Duration{Seconds: math.MinInt64, Nanos: 0}, false, false, 0}, + {&durpb.Duration{Seconds: math.MaxInt64, Nanos: 0}, false, false, 0}, // The largest valid duration. - {&durpb.Duration{maxSeconds, 1e9 - 1}, true, false, 0}, + {&durpb.Duration{Seconds: maxSeconds, Nanos: 1e9 - 1}, true, false, 0}, // The smallest valid duration. - {&durpb.Duration{minSeconds, -(1e9 - 1)}, true, false, 0}, + {&durpb.Duration{Seconds: minSeconds, Nanos: -(1e9 - 1)}, true, false, 0}, // The smallest invalid duration above the valid range. - {&durpb.Duration{maxSeconds + 1, 0}, false, false, 0}, + {&durpb.Duration{Seconds: maxSeconds + 1, Nanos: 0}, false, false, 0}, // The largest invalid duration below the valid range. - {&durpb.Duration{minSeconds - 1, -(1e9 - 1)}, false, false, 0}, + {&durpb.Duration{Seconds: minSeconds - 1, Nanos: -(1e9 - 1)}, false, false, 0}, // One nanosecond past the largest duration representable in Go. - {&durpb.Duration{maxGoSeconds, int32(math.MaxInt64-1e9*maxGoSeconds) + 1}, true, false, 0}, + {&durpb.Duration{Seconds: maxGoSeconds, Nanos: int32(math.MaxInt64-1e9*maxGoSeconds) + 1}, true, false, 0}, // One nanosecond past the smallest duration representable in Go. - {&durpb.Duration{minGoSeconds, int32(math.MinInt64-1e9*minGoSeconds) - 1}, true, false, 0}, + {&durpb.Duration{Seconds: minGoSeconds, Nanos: int32(math.MinInt64-1e9*minGoSeconds) - 1}, true, false, 0}, // One second past the largest duration representable in Go. - {&durpb.Duration{maxGoSeconds + 1, int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, false, 0}, + {&durpb.Duration{Seconds: maxGoSeconds + 1, Nanos: int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, false, 0}, // One second past the smallest duration representable in Go. - {&durpb.Duration{minGoSeconds - 1, int32(math.MinInt64 - 1e9*minGoSeconds)}, true, false, 0}, + {&durpb.Duration{Seconds: minGoSeconds - 1, Nanos: int32(math.MinInt64 - 1e9*minGoSeconds)}, true, false, 0}, } func TestValidateDuration(t *testing.T) { diff -Nru lxd-2.14/dist/src/github.com/golang/protobuf/ptypes/timestamp.go lxd-2.15/dist/src/github.com/golang/protobuf/ptypes/timestamp.go --- lxd-2.14/dist/src/github.com/golang/protobuf/ptypes/timestamp.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/golang/protobuf/ptypes/timestamp.go 2017-06-28 03:01:30.000000000 +0000 @@ -99,6 +99,15 @@ return t, validateTimestamp(ts) } +// TimestampNow returns a google.protobuf.Timestamp for the current time. +func TimestampNow() *tspb.Timestamp { + ts, err := TimestampProto(time.Now()) + if err != nil { + panic("ptypes: time.Now() out of Timestamp range") + } + return ts +} + // TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. // It returns an error if the resulting Timestamp is invalid. func TimestampProto(t time.Time) (*tspb.Timestamp, error) { diff -Nru lxd-2.14/dist/src/github.com/golang/protobuf/ptypes/timestamp_test.go lxd-2.15/dist/src/github.com/golang/protobuf/ptypes/timestamp_test.go --- lxd-2.14/dist/src/github.com/golang/protobuf/ptypes/timestamp_test.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/golang/protobuf/ptypes/timestamp_test.go 2017-06-28 03:01:30.000000000 +0000 @@ -46,32 +46,32 @@ t time.Time }{ // The timestamp representing the Unix epoch date. - {&tspb.Timestamp{0, 0}, true, utcDate(1970, 1, 1)}, + {&tspb.Timestamp{Seconds: 0, Nanos: 0}, true, utcDate(1970, 1, 1)}, // The smallest representable timestamp. - {&tspb.Timestamp{math.MinInt64, math.MinInt32}, false, + {&tspb.Timestamp{Seconds: math.MinInt64, Nanos: math.MinInt32}, false, time.Unix(math.MinInt64, math.MinInt32).UTC()}, // The smallest representable timestamp with non-negative nanos. - {&tspb.Timestamp{math.MinInt64, 0}, false, time.Unix(math.MinInt64, 0).UTC()}, + {&tspb.Timestamp{Seconds: math.MinInt64, Nanos: 0}, false, time.Unix(math.MinInt64, 0).UTC()}, // The earliest valid timestamp. - {&tspb.Timestamp{minValidSeconds, 0}, true, utcDate(1, 1, 1)}, + {&tspb.Timestamp{Seconds: minValidSeconds, Nanos: 0}, true, utcDate(1, 1, 1)}, //"0001-01-01T00:00:00Z"}, // The largest representable timestamp. - {&tspb.Timestamp{math.MaxInt64, math.MaxInt32}, false, + {&tspb.Timestamp{Seconds: math.MaxInt64, Nanos: math.MaxInt32}, false, time.Unix(math.MaxInt64, math.MaxInt32).UTC()}, // The largest representable timestamp with nanos in range. - {&tspb.Timestamp{math.MaxInt64, 1e9 - 1}, false, + {&tspb.Timestamp{Seconds: math.MaxInt64, Nanos: 1e9 - 1}, false, time.Unix(math.MaxInt64, 1e9-1).UTC()}, // The largest valid timestamp. - {&tspb.Timestamp{maxValidSeconds - 1, 1e9 - 1}, true, + {&tspb.Timestamp{Seconds: maxValidSeconds - 1, Nanos: 1e9 - 1}, true, time.Date(9999, 12, 31, 23, 59, 59, 1e9-1, time.UTC)}, // The smallest invalid timestamp that is larger than the valid range. - {&tspb.Timestamp{maxValidSeconds, 0}, false, time.Unix(maxValidSeconds, 0).UTC()}, + {&tspb.Timestamp{Seconds: maxValidSeconds, Nanos: 0}, false, time.Unix(maxValidSeconds, 0).UTC()}, // A date before the epoch. - {&tspb.Timestamp{-281836800, 0}, true, utcDate(1961, 1, 26)}, + {&tspb.Timestamp{Seconds: -281836800, Nanos: 0}, true, utcDate(1961, 1, 26)}, // A date after the epoch. - {&tspb.Timestamp{1296000000, 0}, true, utcDate(2011, 1, 26)}, + {&tspb.Timestamp{Seconds: 1296000000, Nanos: 0}, true, utcDate(2011, 1, 26)}, // A date after the epoch, in the middle of the day. - {&tspb.Timestamp{1296012345, 940483}, true, + {&tspb.Timestamp{Seconds: 1296012345, Nanos: 940483}, true, time.Date(2011, 1, 26, 3, 25, 45, 940483, time.UTC)}, } @@ -123,8 +123,8 @@ }{ // Not much testing needed because presumably time.Format is // well-tested. - {&tspb.Timestamp{0, 0}, "1970-01-01T00:00:00Z"}, - {&tspb.Timestamp{minValidSeconds - 1, 0}, "(timestamp: seconds:-62135596801 before 0001-01-01)"}, + {&tspb.Timestamp{Seconds: 0, Nanos: 0}, "1970-01-01T00:00:00Z"}, + {&tspb.Timestamp{Seconds: minValidSeconds - 1, Nanos: 0}, "(timestamp: seconds:-62135596801 before 0001-01-01)"}, } { got := TimestampString(test.ts) if got != test.want { @@ -136,3 +136,18 @@ func utcDate(year, month, day int) time.Time { return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC) } + +func TestTimestampNow(t *testing.T) { + // Bracket the expected time. + before := time.Now() + ts := TimestampNow() + after := time.Now() + + tm, err := Timestamp(ts) + if err != nil { + t.Errorf("between %v and %v\nTimestampNow() = %v\nwhich is invalid (%v)", before, after, ts, err) + } + if tm.Before(before) || tm.After(after) { + t.Errorf("between %v and %v\nTimestamp(TimestampNow()) = %v", before, after, tm) + } +} diff -Nru lxd-2.14/dist/src/github.com/golang/protobuf/README.md lxd-2.15/dist/src/github.com/golang/protobuf/README.md --- lxd-2.14/dist/src/github.com/golang/protobuf/README.md 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/golang/protobuf/README.md 2017-06-28 03:01:30.000000000 +0000 @@ -1,5 +1,7 @@ # Go support for Protocol Buffers +[![Build Status](https://travis-ci.org/golang/protobuf.svg?branch=master)](https://travis-ci.org/golang/protobuf) + Google's data interchange format. Copyright 2010 The Go Authors. https://github.com/golang/protobuf diff -Nru lxd-2.14/dist/src/github.com/golang/protobuf/.travis.yml lxd-2.15/dist/src/github.com/golang/protobuf/.travis.yml --- lxd-2.14/dist/src/github.com/golang/protobuf/.travis.yml 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/golang/protobuf/.travis.yml 2017-06-28 03:01:30.000000000 +0000 @@ -0,0 +1,17 @@ +sudo: false +language: go +go: +- 1.6.x +- 1.7.x +- 1.8.x + +install: + - go get -v -d -t github.com/golang/protobuf/... + - curl -L https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip -o /tmp/protoc.zip + - unzip /tmp/protoc.zip -d $HOME/protoc + +env: + - PATH=$HOME/protoc/bin:$PATH + +script: + - make all test diff -Nru lxd-2.14/dist/src/github.com/gorilla/mux/doc.go lxd-2.15/dist/src/github.com/gorilla/mux/doc.go --- lxd-2.14/dist/src/github.com/gorilla/mux/doc.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/gorilla/mux/doc.go 2017-06-28 03:01:31.000000000 +0000 @@ -12,8 +12,8 @@ * Requests can be matched based on URL host, path, path prefix, schemes, header and query values, HTTP methods or using custom matchers. - * URL hosts and paths can have variables with an optional regular - expression. + * URL hosts, paths and query values can have variables with an optional + regular expression. * Registered URLs can be built, or "reversed", which helps maintaining references to resources. * Routes can be used as subrouters: nested routes are only tested if the @@ -188,18 +188,20 @@ "/articles/technology/42" -This also works for host variables: +This also works for host and query value variables: r := mux.NewRouter() r.Host("{subdomain}.domain.com"). Path("/articles/{category}/{id:[0-9]+}"). + Queries("filter", "{filter}"). HandlerFunc(ArticleHandler). Name("article") - // url.String() will be "http://news.domain.com/articles/technology/42" + // url.String() will be "http://news.domain.com/articles/technology/42?filter=gorilla" url, err := r.Get("article").URL("subdomain", "news", "category", "technology", - "id", "42") + "id", "42", + "filter", "gorilla") All variables defined in the route are required, and their values must conform to the corresponding patterns. These requirements guarantee that a diff -Nru lxd-2.14/dist/src/github.com/gorilla/mux/mux.go lxd-2.15/dist/src/github.com/gorilla/mux/mux.go --- lxd-2.14/dist/src/github.com/gorilla/mux/mux.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/gorilla/mux/mux.go 2017-06-28 03:01:31.000000000 +0000 @@ -456,7 +456,7 @@ return m, nil } -// mapFromPairsToRegex converts variadic string paramers to a +// mapFromPairsToRegex converts variadic string parameters to a // string to regex map. func mapFromPairsToRegex(pairs ...string) (map[string]*regexp.Regexp, error) { length, err := checkPairs(pairs...) diff -Nru lxd-2.14/dist/src/github.com/gorilla/mux/mux_test.go lxd-2.15/dist/src/github.com/gorilla/mux/mux_test.go --- lxd-2.14/dist/src/github.com/gorilla/mux/mux_test.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/gorilla/mux/mux_test.go 2017-06-28 03:01:31.000000000 +0000 @@ -36,6 +36,7 @@ scheme string // the expected scheme of the built URL host string // the expected host of the built URL path string // the expected path of the built URL + query string // the expected query string of the built URL pathTemplate string // the expected path template of the route hostTemplate string // the expected host template of the route methods []string // the expected route methods @@ -744,6 +745,7 @@ vars: map[string]string{}, host: "", path: "", + query: "foo=bar&baz=ding", shouldMatch: true, }, { @@ -753,6 +755,7 @@ vars: map[string]string{}, host: "", path: "", + query: "foo=bar&baz=ding", pathTemplate: `/api`, hostTemplate: `www.example.com`, shouldMatch: true, @@ -764,6 +767,7 @@ vars: map[string]string{}, host: "", path: "", + query: "foo=bar&baz=ding", pathTemplate: `/api`, hostTemplate: `www.example.com`, shouldMatch: true, @@ -784,6 +788,7 @@ vars: map[string]string{"v1": "bar"}, host: "", path: "", + query: "foo=bar", shouldMatch: true, }, { @@ -793,6 +798,7 @@ vars: map[string]string{"v1": "bar", "v2": "ding"}, host: "", path: "", + query: "foo=bar&baz=ding", shouldMatch: true, }, { @@ -802,6 +808,7 @@ vars: map[string]string{"v1": "10"}, host: "", path: "", + query: "foo=10", shouldMatch: true, }, { @@ -820,6 +827,7 @@ vars: map[string]string{"v1": "1"}, host: "", path: "", + query: "foo=1", shouldMatch: true, }, { @@ -829,6 +837,7 @@ vars: map[string]string{"v1": "1"}, host: "", path: "", + query: "foo=1", shouldMatch: true, }, { @@ -847,6 +856,7 @@ vars: map[string]string{"v1": "1a"}, host: "", path: "", + query: "foo=1a", shouldMatch: true, }, { @@ -865,6 +875,7 @@ vars: map[string]string{"v-1": "bar"}, host: "", path: "", + query: "foo=bar", shouldMatch: true, }, { @@ -874,6 +885,7 @@ vars: map[string]string{"v-1": "bar", "v-2": "ding"}, host: "", path: "", + query: "foo=bar&baz=ding", shouldMatch: true, }, { @@ -883,6 +895,7 @@ vars: map[string]string{"v-1": "10"}, host: "", path: "", + query: "foo=10", shouldMatch: true, }, { @@ -892,6 +905,7 @@ vars: map[string]string{"v-1": "1a"}, host: "", path: "", + query: "foo=1a", shouldMatch: true, }, { @@ -901,6 +915,7 @@ vars: map[string]string{}, host: "", path: "", + query: "foo=", shouldMatch: true, }, { @@ -919,6 +934,7 @@ vars: map[string]string{}, host: "", path: "", + query: "foo=", shouldMatch: true, }, { @@ -946,6 +962,7 @@ vars: map[string]string{"foo": ""}, host: "", path: "", + query: "foo=", shouldMatch: true, }, { @@ -957,6 +974,16 @@ path: "", shouldMatch: false, }, + { + title: "Queries route with pattern, match, escaped value", + route: new(Route).Queries("foo", "{v1}"), + request: newRequest("GET", "http://localhost?foo=%25bar%26%20%2F%3D%3F"), + vars: map[string]string{"v1": "%bar& /=?"}, + host: "", + path: "", + query: "foo=%25bar%26+%2F%3D%3F", + shouldMatch: true, + }, } for _, test := range tests { @@ -1537,6 +1564,7 @@ route := test.route vars := test.vars shouldMatch := test.shouldMatch + query := test.query shouldRedirect := test.shouldRedirect uri := url.URL{ Scheme: test.scheme, @@ -1606,6 +1634,13 @@ return } } + if query != "" { + u, _ := route.URL(mapToPairs(match.Vars)...) + if query != u.RawQuery { + t.Errorf("(%v) URL query not equal: expected %v, got %v", test.title, query, u.RawQuery) + return + } + } if shouldRedirect && match.Handler == nil { t.Errorf("(%v) Did not redirect", test.title) return diff -Nru lxd-2.14/dist/src/github.com/gorilla/mux/README.md lxd-2.15/dist/src/github.com/gorilla/mux/README.md --- lxd-2.14/dist/src/github.com/gorilla/mux/README.md 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/gorilla/mux/README.md 2017-06-28 03:01:31.000000000 +0000 @@ -15,7 +15,7 @@ * It implements the `http.Handler` interface so it is compatible with the standard `http.ServeMux`. * Requests can be matched based on URL host, path, path prefix, schemes, header and query values, HTTP methods or using custom matchers. -* URL hosts and paths can have variables with an optional regular expression. +* URL hosts, paths and query values can have variables with an optional regular expression. * Registered URLs can be built, or "reversed", which helps maintaining references to resources. * Routes can be used as subrouters: nested routes are only tested if the parent route matches. This is useful to define groups of routes that share common conditions like a host, a path prefix or other repeated attributes. As a bonus, this optimizes request matching. @@ -268,19 +268,21 @@ "/articles/technology/42" ``` -This also works for host variables: +This also works for host and query value variables: ```go r := mux.NewRouter() r.Host("{subdomain}.domain.com"). Path("/articles/{category}/{id:[0-9]+}"). + Queries("filter", "{filter}") HandlerFunc(ArticleHandler). Name("article") -// url.String() will be "http://news.domain.com/articles/technology/42" +// url.String() will be "http://news.domain.com/articles/technology/42?filter=gorilla" url, err := r.Get("article").URL("subdomain", "news", "category", "technology", - "id", "42") + "id", "42", + "filter", "gorilla") ``` All variables defined in the route are required, and their values must conform to the corresponding patterns. These requirements guarantee that a generated URL will always match a registered route -- the only exception is for explicitly defined "build-only" routes which never match. diff -Nru lxd-2.14/dist/src/github.com/gorilla/mux/regexp.go lxd-2.15/dist/src/github.com/gorilla/mux/regexp.go --- lxd-2.14/dist/src/github.com/gorilla/mux/regexp.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/gorilla/mux/regexp.go 2017-06-28 03:01:31.000000000 +0000 @@ -35,7 +35,7 @@ // Now let's parse it. defaultPattern := "[^/]+" if matchQuery { - defaultPattern = "[^?&]*" + defaultPattern = ".*" } else if matchHost { defaultPattern = "[^.]+" matchPrefix = false @@ -178,6 +178,9 @@ if !ok { return "", fmt.Errorf("mux: missing route variable %q", v) } + if r.matchQuery { + value = url.QueryEscape(value) + } urlValues[k] = value } rv := fmt.Sprintf(r.reverse, urlValues...) diff -Nru lxd-2.14/dist/src/github.com/gorilla/mux/route.go lxd-2.15/dist/src/github.com/gorilla/mux/route.go --- lxd-2.14/dist/src/github.com/gorilla/mux/route.go 2017-05-30 19:04:46.000000000 +0000 +++ lxd-2.15/dist/src/github.com/gorilla/mux/route.go 2017-06-28 03:01:31.000000000 +0000 @@ -482,6 +482,7 @@ return nil, err } var scheme, host, path string + queries := make([]string, 0, len(r.regexp.queries)) if r.regexp.host != nil { if host, err = r.regexp.host.url(values); err != nil { return nil, err @@ -496,10 +497,18 @@ return nil, err } } + for _, q := range r.regexp.queries { + var query string + if query, err = q.url(values); err != nil { + return nil, err + } + queries = append(queries, query) + } return &url.URL{ - Scheme: scheme, - Host: host, - Path: path, + Scheme: scheme, + Host: host, + Path: path, + RawQuery: strings.Join(queries, "&"), }, nil } diff -Nru lxd-2.14/dist/src/github.com/gorilla/websocket/examples/chat/client.go lxd-2.15/dist/src/github.com/gorilla/websocket/examples/chat/client.go --- lxd-2.14/dist/src/github.com/gorilla/websocket/examples/chat/client.go 2017-05-30 19:04:34.000000000 +0000 +++ lxd-2.15/dist/src/github.com/gorilla/websocket/examples/chat/client.go 2017-06-28 03:01:15.000000000 +0000 @@ -129,6 +129,9 @@ } client := &Client{hub: hub, conn: conn, send: make(chan []byte, 256)} client.hub.register <- client + + // Allow collection of memory referenced by the caller by doing all work in + // new goroutines. go client.writePump() - client.readPump() + go client.readPump() } diff -Nru lxd-2.14/dist/src/github.com/mattn/go-colorable/colorable_appengine.go lxd-2.15/dist/src/github.com/mattn/go-colorable/colorable_appengine.go --- lxd-2.14/dist/src/github.com/mattn/go-colorable/colorable_appengine.go 2017-05-30 19:04:40.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-colorable/colorable_appengine.go 2017-06-28 03:01:19.000000000 +0000 @@ -5,6 +5,8 @@ import ( "io" "os" + + _ "github.com/mattn/go-isatty" ) // NewColorable return new instance of Writer which handle escape sequence. diff -Nru lxd-2.14/dist/src/github.com/mattn/go-colorable/colorable_others.go lxd-2.15/dist/src/github.com/mattn/go-colorable/colorable_others.go --- lxd-2.14/dist/src/github.com/mattn/go-colorable/colorable_others.go 2017-05-30 19:04:40.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-colorable/colorable_others.go 2017-06-28 03:01:19.000000000 +0000 @@ -6,6 +6,8 @@ import ( "io" "os" + + _ "github.com/mattn/go-isatty" ) // NewColorable return new instance of Writer which handle escape sequence. diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/doc.go lxd-2.15/dist/src/github.com/mattn/go-isatty/doc.go --- lxd-2.14/dist/src/github.com/mattn/go-isatty/doc.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/doc.go 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,2 @@ +// Package isatty implements interface to isatty +package isatty diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/example_test.go lxd-2.15/dist/src/github.com/mattn/go-isatty/example_test.go --- lxd-2.14/dist/src/github.com/mattn/go-isatty/example_test.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/example_test.go 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,18 @@ +package isatty_test + +import ( + "fmt" + "os" + + "github.com/mattn/go-isatty" +) + +func Example() { + if isatty.IsTerminal(os.Stdout.Fd()) { + fmt.Println("Is Terminal") + } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { + fmt.Println("Is Cygwin/MSYS2 Terminal") + } else { + fmt.Println("Is Not Terminal") + } +} diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_appengine.go lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_appengine.go --- lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_appengine.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_appengine.go 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,15 @@ +// +build appengine + +package isatty + +// IsTerminal returns true if the file descriptor is terminal which +// is always false on on appengine classic which is a sandboxed PaaS. +func IsTerminal(fd uintptr) bool { + return false +} + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_bsd.go lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_bsd.go --- lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_bsd.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_bsd.go 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,18 @@ +// +build darwin freebsd openbsd netbsd dragonfly +// +build !appengine + +package isatty + +import ( + "syscall" + "unsafe" +) + +const ioctlReadTermios = syscall.TIOCGETA + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var termios syscall.Termios + _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) + return err == 0 +} diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_linux.go lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_linux.go --- lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_linux.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_linux.go 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,18 @@ +// +build linux +// +build !appengine + +package isatty + +import ( + "syscall" + "unsafe" +) + +const ioctlReadTermios = syscall.TCGETS + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var termios syscall.Termios + _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) + return err == 0 +} diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_others.go lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_others.go --- lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_others.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_others.go 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,10 @@ +// +build !windows +// +build !appengine + +package isatty + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_others_test.go lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_others_test.go --- lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_others_test.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_others_test.go 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,19 @@ +// +build !windows + +package isatty + +import ( + "os" + "testing" +) + +func TestTerminal(t *testing.T) { + // test for non-panic + IsTerminal(os.Stdout.Fd()) +} + +func TestCygwinPipeName(t *testing.T) { + if IsCygwinTerminal(os.Stdout.Fd()) { + t.Fatal("should be false always") + } +} diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_solaris.go lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_solaris.go --- lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_solaris.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_solaris.go 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,16 @@ +// +build solaris +// +build !appengine + +package isatty + +import ( + "golang.org/x/sys/unix" +) + +// IsTerminal returns true if the given file descriptor is a terminal. +// see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c +func IsTerminal(fd uintptr) bool { + var termio unix.Termio + err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio) + return err == nil +} diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_windows.go lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_windows.go --- lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_windows.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_windows.go 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,94 @@ +// +build windows +// +build !appengine + +package isatty + +import ( + "strings" + "syscall" + "unicode/utf16" + "unsafe" +) + +const ( + fileNameInfo uintptr = 2 + fileTypePipe = 3 +) + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + procGetConsoleMode = kernel32.NewProc("GetConsoleMode") + procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") + procGetFileType = kernel32.NewProc("GetFileType") +) + +func init() { + // Check if GetFileInformationByHandleEx is available. + if procGetFileInformationByHandleEx.Find() != nil { + procGetFileInformationByHandleEx = nil + } +} + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var st uint32 + r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) + return r != 0 && e == 0 +} + +// Check pipe name is used for cygwin/msys2 pty. +// Cygwin/MSYS2 PTY has a name like: +// \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master +func isCygwinPipeName(name string) bool { + token := strings.Split(name, "-") + if len(token) < 5 { + return false + } + + if token[0] != `\msys` && token[0] != `\cygwin` { + return false + } + + if token[1] == "" { + return false + } + + if !strings.HasPrefix(token[2], "pty") { + return false + } + + if token[3] != `from` && token[3] != `to` { + return false + } + + if token[4] != "master" { + return false + } + + return true +} + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. +func IsCygwinTerminal(fd uintptr) bool { + if procGetFileInformationByHandleEx == nil { + return false + } + + // Cygwin/msys's pty is a pipe. + ft, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0) + if ft != fileTypePipe || e != 0 { + return false + } + + var buf [2 + syscall.MAX_PATH]uint16 + r, _, e := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), + 4, fd, fileNameInfo, uintptr(unsafe.Pointer(&buf)), + uintptr(len(buf)*2), 0, 0) + if r == 0 || e != 0 { + return false + } + + l := *(*uint32)(unsafe.Pointer(&buf)) + return isCygwinPipeName(string(utf16.Decode(buf[2 : 2+l/2]))) +} diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_windows_test.go lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_windows_test.go --- lxd-2.14/dist/src/github.com/mattn/go-isatty/isatty_windows_test.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/isatty_windows_test.go 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,35 @@ +// +build windows + +package isatty + +import ( + "testing" +) + +func TestCygwinPipeName(t *testing.T) { + tests := []struct { + name string + result bool + }{ + {``, false}, + {`\msys-`, false}, + {`\cygwin-----`, false}, + {`\msys-x-PTY5-pty1-from-master`, false}, + {`\cygwin-x-PTY5-from-master`, false}, + {`\cygwin-x-pty2-from-toaster`, false}, + {`\cygwin--pty2-from-master`, false}, + {`\\cygwin-x-pty2-from-master`, false}, + {`\cygwin-x-pty2-from-master-`, true}, // for the feature + {`\cygwin-e022582115c10879-pty4-from-master`, true}, + {`\msys-e022582115c10879-pty4-to-master`, true}, + {`\cygwin-e022582115c10879-pty4-to-master`, true}, + } + + for _, test := range tests { + want := test.result + got := isCygwinPipeName(test.name) + if want != got { + t.Fatalf("isatty(%q): got %v, want %v:", test.name, got, want) + } + } +} diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/LICENSE lxd-2.15/dist/src/github.com/mattn/go-isatty/LICENSE --- lxd-2.14/dist/src/github.com/mattn/go-isatty/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/LICENSE 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,9 @@ +Copyright (c) Yasuhiro MATSUMOTO + +MIT License (Expat) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/README.md lxd-2.15/dist/src/github.com/mattn/go-isatty/README.md --- lxd-2.14/dist/src/github.com/mattn/go-isatty/README.md 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/README.md 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,50 @@ +# go-isatty + +[![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) +[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) +[![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) +[![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) + +isatty for golang + +## Usage + +```go +package main + +import ( + "fmt" + "github.com/mattn/go-isatty" + "os" +) + +func main() { + if isatty.IsTerminal(os.Stdout.Fd()) { + fmt.Println("Is Terminal") + } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { + fmt.Println("Is Cygwin/MSYS2 Terminal") + } else { + fmt.Println("Is Not Terminal") + } +} +``` + +## Installation + +``` +$ go get github.com/mattn/go-isatty +``` + +## License + +MIT + +## Author + +Yasuhiro Matsumoto (a.k.a mattn) + +## Thanks + +* k-takata: base idea for IsCygwinTerminal + + https://github.com/k-takata/go-iscygpty diff -Nru lxd-2.14/dist/src/github.com/mattn/go-isatty/.travis.yml lxd-2.15/dist/src/github.com/mattn/go-isatty/.travis.yml --- lxd-2.14/dist/src/github.com/mattn/go-isatty/.travis.yml 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-isatty/.travis.yml 2017-06-28 03:01:20.000000000 +0000 @@ -0,0 +1,9 @@ +language: go +go: + - tip + +before_install: + - go get github.com/mattn/goveralls + - go get golang.org/x/tools/cmd/cover +script: + - $HOME/gopath/bin/goveralls -repotoken 3gHdORO5k5ziZcWMBxnd9LrMZaJs8m9x5 diff -Nru lxd-2.14/dist/src/github.com/mattn/go-sqlite3/sqlite3.go lxd-2.15/dist/src/github.com/mattn/go-sqlite3/sqlite3.go --- lxd-2.14/dist/src/github.com/mattn/go-sqlite3/sqlite3.go 2017-05-30 19:04:51.000000000 +0000 +++ lxd-2.15/dist/src/github.com/mattn/go-sqlite3/sqlite3.go 2017-06-28 03:01:36.000000000 +0000 @@ -113,6 +113,7 @@ "runtime" "strconv" "strings" + "sync" "time" "unsafe" @@ -157,6 +158,7 @@ // SQLiteConn implement sql.Conn. type SQLiteConn struct { + dbMu sync.Mutex db *C.sqlite3 loc *time.Location txlock string @@ -679,11 +681,22 @@ return c.lastError() } deleteHandles(c) + c.dbMu.Lock() c.db = nil + c.dbMu.Unlock() runtime.SetFinalizer(c, nil) return nil } +func (c *SQLiteConn) dbConnOpen() bool { + if c == nil { + return false + } + c.dbMu.Lock() + defer c.dbMu.Unlock() + return c.db != nil +} + // Prepare the query string. Return a new statement. func (c *SQLiteConn) Prepare(query string) (driver.Stmt, error) { return c.prepare(context.Background(), query) @@ -713,7 +726,7 @@ return nil } s.closed = true - if s.c == nil || s.c.db == nil { + if !s.c.dbConnOpen() { return errors.New("sqlite statement with already closed database connection") } rv := C.sqlite3_finalize(s.s) @@ -734,6 +747,8 @@ v driver.Value } +var placeHolder = []byte{0} + func (s *SQLiteStmt) bind(args []namedValue) error { rv := C.sqlite3_reset(s.s) if rv != C.SQLITE_ROW && rv != C.SQLITE_OK && rv != C.SQLITE_DONE { @@ -755,8 +770,7 @@ rv = C.sqlite3_bind_null(s.s, n) case string: if len(v) == 0 { - b := []byte{0} - rv = C._sqlite3_bind_text(s.s, n, (*C.char)(unsafe.Pointer(&b[0])), C.int(0)) + rv = C._sqlite3_bind_text(s.s, n, (*C.char)(unsafe.Pointer(&placeHolder[0])), C.int(0)) } else { b := []byte(v) rv = C._sqlite3_bind_text(s.s, n, (*C.char)(unsafe.Pointer(&b[0])), C.int(len(b))) @@ -773,10 +787,9 @@ rv = C.sqlite3_bind_double(s.s, n, C.double(v)) case []byte: if len(v) == 0 { - rv = C._sqlite3_bind_blob(s.s, n, nil, 0) - } else { - rv = C._sqlite3_bind_blob(s.s, n, unsafe.Pointer(&v[0]), C.int(len(v))) + v = placeHolder } + rv = C._sqlite3_bind_blob(s.s, n, unsafe.Pointer(&v[0]), C.int(len(v))) case time.Time: b := []byte(v.Format(SQLiteTimestampFormats[0])) rv = C._sqlite3_bind_text(s.s, n, (*C.char)(unsafe.Pointer(&b[0])), C.int(len(b))) diff -Nru lxd-2.14/dist/src/github.com/pborman/uuid/uuid_test.go lxd-2.15/dist/src/github.com/pborman/uuid/uuid_test.go --- lxd-2.14/dist/src/github.com/pborman/uuid/uuid_test.go 2017-05-30 19:04:54.000000000 +0000 +++ lxd-2.15/dist/src/github.com/pborman/uuid/uuid_test.go 2017-06-28 03:01:39.000000000 +0000 @@ -421,13 +421,13 @@ uuid1 := New() uuid2 := New() if uuid1 != uuid2 { - t.Errorf("execpted duplicates, got %q and %q", uuid1, uuid2) + t.Errorf("expected duplicates, got %q and %q", uuid1, uuid2) } SetRand(nil) uuid1 = New() uuid2 = New() if uuid1 == uuid2 { - t.Errorf("unexecpted duplicates, got %q", uuid1) + t.Errorf("unexpected duplicates, got %q", uuid1) } } diff -Nru lxd-2.14/dist/src/github.com/stretchr/testify/assert/assertion_format.go lxd-2.15/dist/src/github.com/stretchr/testify/assert/assertion_format.go --- lxd-2.14/dist/src/github.com/stretchr/testify/assert/assertion_format.go 2017-05-30 19:04:59.000000000 +0000 +++ lxd-2.15/dist/src/github.com/stretchr/testify/assert/assertion_format.go 2017-06-28 03:01:24.000000000 +0000 @@ -325,6 +325,16 @@ return Panics(t, f, append([]interface{}{msg}, args...)...) } +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...) +} + // Regexpf asserts that a specified regexp matches a string. // // assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") diff -Nru lxd-2.14/dist/src/github.com/stretchr/testify/assert/assertion_forward.go lxd-2.15/dist/src/github.com/stretchr/testify/assert/assertion_forward.go --- lxd-2.14/dist/src/github.com/stretchr/testify/assert/assertion_forward.go 2017-05-30 19:04:59.000000000 +0000 +++ lxd-2.15/dist/src/github.com/stretchr/testify/assert/assertion_forward.go 2017-06-28 03:01:24.000000000 +0000 @@ -630,6 +630,26 @@ return Panics(a.t, f, msgAndArgs...) } +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + return PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + return PanicsWithValuef(a.t, expected, f, msg, args...) +} + // Panicsf asserts that the code inside the specified PanicTestFunc panics. // // a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") diff -Nru lxd-2.14/dist/src/github.com/stretchr/testify/assert/assertions.go lxd-2.15/dist/src/github.com/stretchr/testify/assert/assertions.go --- lxd-2.14/dist/src/github.com/stretchr/testify/assert/assertions.go 2017-05-30 19:04:59.000000000 +0000 +++ lxd-2.15/dist/src/github.com/stretchr/testify/assert/assertions.go 2017-06-28 03:01:24.000000000 +0000 @@ -811,6 +811,25 @@ return true } +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + funcDidPanic, panicValue := didPanic(f) + if !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + if panicValue != expected { + return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%v\n\r\tPanic value:\t%v", f, expected, panicValue), msgAndArgs...) + } + + return true +} + // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. // // assert.NotPanics(t, func(){ RemainCalm() }) diff -Nru lxd-2.14/dist/src/github.com/stretchr/testify/assert/assertions_test.go lxd-2.15/dist/src/github.com/stretchr/testify/assert/assertions_test.go --- lxd-2.14/dist/src/github.com/stretchr/testify/assert/assertions_test.go 2017-05-30 19:04:59.000000000 +0000 +++ lxd-2.15/dist/src/github.com/stretchr/testify/assert/assertions_test.go 2017-06-28 03:01:24.000000000 +0000 @@ -649,6 +649,28 @@ } +func TestPanicsWithValue(t *testing.T) { + + mockT := new(testing.T) + + if !PanicsWithValue(mockT, "Panic!", func() { + panic("Panic!") + }) { + t.Error("PanicsWithValue should return true") + } + + if PanicsWithValue(mockT, "Panic!", func() { + }) { + t.Error("PanicsWithValue should return false") + } + + if PanicsWithValue(mockT, "at the disco", func() { + panic("Panic!") + }) { + t.Error("PanicsWithValue should return false") + } +} + func TestNotPanics(t *testing.T) { mockT := new(testing.T) diff -Nru lxd-2.14/dist/src/github.com/stretchr/testify/mock/mock.go lxd-2.15/dist/src/github.com/stretchr/testify/mock/mock.go --- lxd-2.14/dist/src/github.com/stretchr/testify/mock/mock.go 2017-05-30 19:04:59.000000000 +0000 +++ lxd-2.15/dist/src/github.com/stretchr/testify/mock/mock.go 2017-06-28 03:01:24.000000000 +0000 @@ -285,9 +285,16 @@ } parts := strings.Split(functionPath, ".") functionName := parts[len(parts)-1] + return m.MethodCalled(functionName, arguments...) +} +// MethodCalled tells the mock object that the given method has been called, and gets +// an array of arguments to return. Panics if the call is unexpected (i.e. not preceded +// by appropriate .On .Return() calls) +// If Call.WaitFor is set, blocks until the channel is closed or receives a message. +func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Arguments { m.mutex.Lock() - found, call := m.findExpectedCall(functionName, arguments...) + found, call := m.findExpectedCall(methodName, arguments...) if found < 0 { // we have to fail here - because we don't know what to do @@ -297,13 +304,13 @@ // b) the arguments are not what was expected, or // c) the developer has forgotten to add an accompanying On...Return pair. - closestFound, closestCall := m.findClosestCall(functionName, arguments...) + closestFound, closestCall := m.findClosestCall(methodName, arguments...) m.mutex.Unlock() if closestFound { - panic(fmt.Sprintf("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\n", callString(functionName, arguments, true), callString(functionName, closestCall.Arguments, true), diffArguments(arguments, closestCall.Arguments))) + panic(fmt.Sprintf("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\n", callString(methodName, arguments, true), callString(methodName, closestCall.Arguments, true), diffArguments(arguments, closestCall.Arguments))) } else { - panic(fmt.Sprintf("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", functionName, functionName, callString(functionName, arguments, true), assert.CallerInfo())) + panic(fmt.Sprintf("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", methodName, methodName, callString(methodName, arguments, true), assert.CallerInfo())) } } @@ -321,7 +328,7 @@ } // add the call - m.Calls = append(m.Calls, *newCall(m, functionName, arguments...)) + m.Calls = append(m.Calls, *newCall(m, methodName, arguments...)) m.mutex.Unlock() // block if specified diff -Nru lxd-2.14/dist/src/github.com/stretchr/testify/mock/mock_test.go lxd-2.15/dist/src/github.com/stretchr/testify/mock/mock_test.go --- lxd-2.14/dist/src/github.com/stretchr/testify/mock/mock_test.go 2017-05-30 19:04:59.000000000 +0000 +++ lxd-2.15/dist/src/github.com/stretchr/testify/mock/mock_test.go 2017-06-28 03:01:24.000000000 +0000 @@ -2,10 +2,11 @@ import ( "errors" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "testing" "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) /* @@ -1184,3 +1185,13 @@ // Allow the first call to execute, so the second one executes afterwards ch2 <- time.Now() } + +func Test_MockMethodCalled(t *testing.T) { + m := new(Mock) + m.On("foo", "hello").Return("world") + + retArgs := m.MethodCalled("foo", "hello") + require.True(t, len(retArgs) == 1) + require.Equal(t, "world", retArgs[0]) + m.AssertExpectations(t) +} diff -Nru lxd-2.14/dist/src/github.com/stretchr/testify/require/require_forward.go lxd-2.15/dist/src/github.com/stretchr/testify/require/require_forward.go --- lxd-2.14/dist/src/github.com/stretchr/testify/require/require_forward.go 2017-05-30 19:04:59.000000000 +0000 +++ lxd-2.15/dist/src/github.com/stretchr/testify/require/require_forward.go 2017-06-28 03:01:24.000000000 +0000 @@ -631,6 +631,26 @@ Panics(a.t, f, msgAndArgs...) } +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + PanicsWithValuef(a.t, expected, f, msg, args...) +} + // Panicsf asserts that the code inside the specified PanicTestFunc panics. // // a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") diff -Nru lxd-2.14/dist/src/github.com/stretchr/testify/require/require.go lxd-2.15/dist/src/github.com/stretchr/testify/require/require.go --- lxd-2.14/dist/src/github.com/stretchr/testify/require/require.go 2017-05-30 19:04:59.000000000 +0000 +++ lxd-2.15/dist/src/github.com/stretchr/testify/require/require.go 2017-06-28 03:01:24.000000000 +0000 @@ -769,6 +769,30 @@ } } +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.PanicsWithValue(t, expected, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.PanicsWithValuef(t, expected, f, msg, args...) { + t.FailNow() + } +} + // Panicsf asserts that the code inside the specified PanicTestFunc panics. // // assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/acme/autocert/listener.go lxd-2.15/dist/src/golang.org/x/crypto/acme/autocert/listener.go --- lxd-2.14/dist/src/golang.org/x/crypto/acme/autocert/listener.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/acme/autocert/listener.go 2017-06-28 03:01:23.000000000 +0000 @@ -36,6 +36,9 @@ // operating system-specific cache or temp directory. This may not // be suitable for servers spanning multiple machines. // +// The returned listener uses a *tls.Config that enables HTTP/2, and +// should only be used with servers that support HTTP/2. +// // The returned Listener also enables TCP keep-alives on the accepted // connections. The returned *tls.Conn are returned before their TLS // handshake has completed. @@ -58,6 +61,9 @@ // Listener listens on the standard TLS port (443) on all interfaces // and returns a net.Listener returning *tls.Conn connections. // +// The returned listener uses a *tls.Config that enables HTTP/2, and +// should only be used with servers that support HTTP/2. +// // The returned Listener also enables TCP keep-alives on the accepted // connections. The returned *tls.Conn are returned before their TLS // handshake has completed. @@ -68,7 +74,8 @@ ln := &listener{ m: m, conf: &tls.Config{ - GetCertificate: m.GetCertificate, // bonus: panic on nil m + GetCertificate: m.GetCertificate, // bonus: panic on nil m + NextProtos: []string{"h2", "http/1.1"}, // Enable HTTP/2 }, } ln.tcpListener, ln.tcpListenErr = net.Listen("tcp", ":443") diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/blake2s/blake2s.go lxd-2.15/dist/src/golang.org/x/crypto/blake2s/blake2s.go --- lxd-2.14/dist/src/golang.org/x/crypto/blake2s/blake2s.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/blake2s/blake2s.go 2017-06-28 03:01:23.000000000 +0000 @@ -15,8 +15,12 @@ const ( // The blocksize of BLAKE2s in bytes. BlockSize = 64 + // The hash size of BLAKE2s-256 in bytes. Size = 32 + + // The hash size of BLAKE2s-128 in bytes. + Size128 = 16 ) var errKeySize = errors.New("blake2s: invalid key size") @@ -37,6 +41,17 @@ // key turns the hash into a MAC. The key must between zero and 32 bytes long. func New256(key []byte) (hash.Hash, error) { return newDigest(Size, key) } +// New128 returns a new hash.Hash computing the BLAKE2s-128 checksum given a +// non-empty key. Note that a 128-bit digest is too small to be secure as a +// cryptographic hash and should only be used as a MAC, thus the key argument +// is not optional. +func New128(key []byte) (hash.Hash, error) { + if len(key) == 0 { + return nil, errors.New("blake2s: a key is required for a 128-bit hash") + } + return newDigest(Size128, key) +} + func newDigest(hashSize int, key []byte) (*digest, error) { if len(key) > Size { return nil, errKeySize diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/blake2s/blake2s_test.go lxd-2.15/dist/src/golang.org/x/crypto/blake2s/blake2s_test.go --- lxd-2.14/dist/src/golang.org/x/crypto/blake2s/blake2s_test.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/blake2s/blake2s_test.go 2017-06-28 03:01:23.000000000 +0000 @@ -18,21 +18,25 @@ if useSSE4 { t.Log("SSE4 version") testHashes(t) + testHashes128(t) useSSE4 = false } if useSSSE3 { t.Log("SSSE3 version") testHashes(t) + testHashes128(t) useSSSE3 = false } if useSSE2 { t.Log("SSE2 version") testHashes(t) + testHashes128(t) useSSE2 = false } if useGeneric { t.Log("generic version") testHashes(t) + testHashes128(t) } } @@ -69,6 +73,39 @@ } } +func testHashes128(t *testing.T) { + key, _ := hex.DecodeString("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f") + + input := make([]byte, 255) + for i := range input { + input[i] = byte(i) + } + + for i, expectedHex := range hashes128 { + h, err := New128(key) + if err != nil { + t.Fatalf("#%d: error from New128: %v", i, err) + } + + h.Write(input[:i]) + sum := h.Sum(nil) + + if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex { + t.Fatalf("#%d (single write): got %s, wanted %s", i, gotHex, expectedHex) + } + + h.Reset() + for j := 0; j < i; j++ { + h.Write(input[j : j+1]) + } + + sum = h.Sum(sum[:0]) + if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex { + t.Fatalf("#%d (byte-by-byte): got %s, wanted %s", i, gotHex, expectedHex) + } + } +} + // Benchmarks func benchmarkSum(b *testing.B, size int) { @@ -355,3 +392,262 @@ "db444c15597b5f1a03d1f9edd16e4a9f43a667cc275175dfa2b704e3bb1a9b83", "3fb735061abc519dfe979e54c1ee5bfad0a9d858b3315bad34bde999efd724dd", } + +var hashes128 = []string{ + "9536f9b267655743dee97b8a670f9f53", + "13bacfb85b48a1223c595f8c1e7e82cb", + "d47a9b1645e2feae501cd5fe44ce6333", + "1e2a79436a7796a3e9826bfedf07659f", + "7640360ed3c4f3054dba79a21dda66b7", + "d1207ac2bf5ac84fc9ef016da5a46a86", + "3123987871e59305ece3125abfc0099a", + "cf9e072ad522f2cda2d825218086731c", + "95d22870392efe2846b12b6e8e84efbb", + "7d63c30e2d51333f245601b038c0b93b", + "ed608b98e13976bdf4bedc63fa35e443", + "ed704b5cd1abf8e0dd67a6ac667a3fa5", + "77dc70109827dc74c70fd26cba379ae5", + "d2bf34508b07825ee934f33958f4560e", + "a340baa7b8a93a6e658adef42e78eeb7", + "b85c5ceaecbe9a251eac76f6932ba395", + "246519722001f6e8e97a2183f5985e53", + "5bce5aa0b7c6cac2ecf6406183cd779a", + "13408f1647c02f6efd0047ad8344f695", + "a63970f196760aa36cb965ab62f0e0fa", + "bc26f48421dd99fd45e15e736d3e7dac", + "4c6f70f9e3237cde918afb52d26f1823", + "45ed610cfbc37db80c4bf0eef14ae8d6", + "87c4c150705ea5078209ec008200539c", + "54de21f5e0e6f2afe04daeb822b6931e", + "9732a04e505064e19de3d542e7e71631", + "d2bd27e95531d6957eef511c4ba64ad4", + "7a36c9f70dcc7c3063b547101a5f6c35", + "322007d1a44c4257bc7903b183305529", + "dbcc9a09f412290ca2e0d53dfd142ddb", + "df12ed43b8e53a56db20e0f83764002c", + "d114cc11e7d5b33a360c45f18d4c7c6e", + "c43b5e836af88620a8a71b1652cb8640", + "9491c653e8867ed73c1b4ac6b5a9bb4d", + "06d0e988df94ada6c6f9f36f588ab7c5", + "561efad2480e93262c8eeaa3677615c4", + "ba8ffc702e5adc93503045eca8702312", + "5782be6ccdc78c8425285e85de8ccdc6", + "aa1c4393e4c07b53ea6e2b5b1e970771", + "42a229dc50e52271c51e8666023ebc1e", + "53706110e919f84de7f8d6c7f0e7b831", + "fc5ac8ee39cc1dd1424391323e2901bd", + "bed27b62ff66cac2fbb68193c727106a", + "cd5e689b96d0b9ea7e08dac36f7b211e", + "0b4c7f604eba058d18e322c6e1baf173", + "eb838227fdfad09a27f0f8413120675d", + "3149cf9d19a7fd529e6154a8b4c3b3ad", + "ca1e20126df930fd5fb7afe4422191e5", + "b23398f910599f3c09b6549fa81bcb46", + "27fb17c11b34fa5d8b5afe5ee3321ead", + "0f665f5f04cf2d46b7fead1a1f328158", + "8f068be73b3681f99f3b282e3c02bba5", + "ba189bbd13808dcf4e002a4dd21660d5", + "2732dcd1b16668ae6ab6a61595d0d62a", + "d410ccdd059f0e02b472ec9ec54bdd3c", + "b2eaa07b055b3a03a399971327f7e8c2", + "2e8a225655e9f99b69c60dc8b4d8e566", + "4eb55416c853f2152e67f8a224133cec", + "49552403790d8de0505a8e317a443687", + "7f2747cd41f56942752e868212c7d5ac", + "02a28f10e193b430df7112d2d98cf759", + "d4213404a9f1cf759017747cf5958270", + "faa34884344f9c65e944882db8476d34", + "ece382a8bd5018f1de5da44b72cea75b", + "f1efa90d2547036841ecd3627fafbc36", + "811ff8686d23a435ecbd0bdafcd27b1b", + "b21beea9c7385f657a76558530438721", + "9cb969da4f1b4fc5b13bf78fe366f0c4", + "8850d16d7b614d3268ccfa009d33c7fc", + "aa98a2b6176ea86415b9aff3268c6f6d", + "ec3e1efa5ed195eff667e16b1af1e39e", + "e40787dca57411d2630db2de699beb08", + "554835890735babd06318de23d31e78a", + "493957feecddc302ee2bb2086b6ebfd3", + "f6069709ad5b0139163717e9ce1114ab", + "ba5ed386098da284484b211555505a01", + "9244c8dfad8cbb68c118fa51465b3ae4", + "51e309a5008eb1f5185e5cc007cfb36f", + "6ce9ff712121b4f6087955f4911eafd4", + "59b51d8dcda031218ccdd7c760828155", + "0012878767a3d4f1c8194458cf1f8832", + "82900708afd5b6582dc16f008c655edd", + "21302c7e39b5a4cdf1d6f86b4f00c9b4", + "e894c7431591eab8d1ce0fe2aa1f01df", + "b67e1c40ee9d988226d605621854d955", + "6237bdafa34137cbbec6be43ea9bd22c", + "4172a8e19b0dcb09b978bb9eff7af52b", + "5714abb55bd4448a5a6ad09fbd872fdf", + "7ce1700bef423e1f958a94a77a94d44a", + "3742ec50cded528527775833453e0b26", + "5d41b135724c7c9c689495324b162f18", + "85c523333c6442c202e9e6e0f1185f93", + "5c71f5222d40ff5d90e7570e71ab2d30", + "6e18912e83d012efb4c66250ced6f0d9", + "4add4448c2e35e0b138a0bac7b4b1775", + "c0376c6bc5e7b8b9d2108ec25d2aab53", + "f72261d5ed156765c977751c8a13fcc1", + "cff4156c48614b6ceed3dd6b9058f17e", + "36bfb513f76c15f514bcb593419835aa", + "166bf48c6bffaf8291e6fdf63854bef4", + "0b67d33f8b859c3157fbabd9e6e47ed0", + "e4da659ca76c88e73a9f9f10f3d51789", + "33c1ae2a86b3f51c0642e6ed5b5aa1f1", + "27469b56aca2334449c1cf4970dcd969", + "b7117b2e363378aa0901b0d6a9f6ddc0", + "a9578233b09e5cd5231943fdb12cd90d", + "486d7d75253598b716a068243c1c3e89", + "66f6b02d682b78ffdc85e9ec86852489", + "38a07b9a4b228fbcc305476e4d2e05d2", + "aedb61c7970e7d05bf9002dae3c6858c", + "c03ef441f7dd30fdb61ad2d4d8e4c7da", + "7f45cc1eea9a00cb6aeb2dd748361190", + "a59538b358459132e55160899e47bd65", + "137010fef72364411820c3fbed15c8df", + "d8362b93fc504500dbd33ac74e1b4d70", + "a7e49f12c8f47e3b29cf8c0889b0a9c8", + "072e94ffbfc684bd8ab2a1b9dade2fd5", + "5ab438584bd2229e452052e002631a5f", + "f233d14221097baef57d3ec205c9e086", + "3a95db000c4a8ff98dc5c89631a7f162", + "0544f18c2994ab4ddf1728f66041ff16", + "0bc02116c60a3cc331928d6c9d3ba37e", + "b189dca6cb5b813c74200834fba97f29", + "ac8aaab075b4a5bc24419da239212650", + "1e9f19323dc71c29ae99c479dc7e8df9", + "12d944c3fa7caa1b3d62adfc492274dd", + "b4c68f1fffe8f0030e9b18aad8c9dc96", + "25887fab1422700d7fa3edc0b20206e2", + "8c09f698d03eaf88abf69f8147865ef6", + "5c363ae42a5bec26fbc5e996428d9bd7", + "7fdfc2e854fbb3928150d5e3abcf56d6", + "f0c944023f714df115f9e4f25bcdb89b", + "6d19534b4c332741c8ddd79a9644de2d", + "32595eb23764fbfc2ee7822649f74a12", + "5a51391aab33c8d575019b6e76ae052a", + "98b861ce2c620f10f913af5d704a5afd", + "b7fe2fc8b77fb1ce434f8465c7ddf793", + "0e8406e0cf8e9cc840668ece2a0fc64e", + "b89922db99c58f6a128ccffe19b6ce60", + "e1be9af665f0932b77d7f5631a511db7", + "74b96f20f58de8dc9ff5e31f91828523", + "36a4cfef5a2a7d8548db6710e50b3009", + "007e95e8d3b91948a1dedb91f75de76b", + "a87a702ce08f5745edf765bfcd5fbe0d", + "847e69a388a749a9c507354d0dddfe09", + "07176eefbc107a78f058f3d424ca6a54", + "ad7e80682333b68296f6cb2b4a8e446d", + "53c4aba43896ae422e5de5b9edbd46bf", + "33bd6c20ca2a7ab916d6e98003c6c5f8", + "060d088ea94aa093f9981a79df1dfcc8", + "5617b214b9df08d4f11e58f5e76d9a56", + "ca3a60ee85bd971e1daf9f7db059d909", + "cd2b7754505d8c884eddf736f1ec613e", + "f496163b252f1439e7e113ba2ecabd8e", + "5719c7dcf9d9f756d6213354acb7d5cf", + "6f7dd40b245c54411e7a9be83ae5701c", + "c8994dd9fdeb077a45ea04a30358b637", + "4b1184f1e35458c1c747817d527a252f", + "fc7df674afeac7a3fd994183f4c67a74", + "4f68e05ce4dcc533acf9c7c01d95711e", + "d4ebc59e918400720035dfc88e0c486a", + "d3105dd6fa123e543b0b3a6e0eeaea9e", + "874196128ed443f5bdb2800ca048fcad", + "01645f134978dc8f9cf0abc93b53780e", + "5b8b64caa257873a0ffd47c981ef6c3f", + "4ee208fc50ba0a6e65c5b58cec44c923", + "53f409a52427b3b7ffabb057ca088428", + "c1d6cd616f5341a93d921e356e5887a9", + "e85c20fea67fa7320dc23379181183c8", + "7912b6409489df001b7372bc94aebde7", + "e559f761ec866a87f1f331767fafc60f", + "20a6f5a36bc37043d977ed7708465ef8", + "6a72f526965ab120826640dd784c6cc4", + "bf486d92ad68e87c613689dd370d001b", + "d339fd0eb35edf3abd6419c8d857acaf", + "9521cd7f32306d969ddabc4e6a617f52", + "a1cd9f3e81520842f3cf6cc301cb0021", + "18e879b6f154492d593edd3f4554e237", + "66e2329c1f5137589e051592587e521e", + "e899566dd6c3e82cbc83958e69feb590", + "8a4b41d7c47e4e80659d77b4e4bfc9ae", + "f1944f6fcfc17803405a1101998c57dd", + "f6bcec07567b4f72851b307139656b18", + "22e7bb256918fe9924dce9093e2d8a27", + "dd25b925815fe7b50b7079f5f65a3970", + "0457f10f299acf0c230dd4007612e58f", + "ecb420c19efd93814fae2964d69b54af", + "14eb47b06dff685d88751c6e32789db4", + "e8f072dbb50d1ab6654aa162604a892d", + "69cff9c62092332f03a166c7b0034469", + "d3619f98970b798ca32c6c14cd25af91", + "2246d423774ee9d51a551e89c0539d9e", + "75e5d1a1e374a04a699247dad827b6cf", + "6d087dd1d4cd15bf47db07c7a96b1db8", + "967e4c055ac51b4b2a3e506cebd5826f", + "7417aa79247e473401bfa92a25b62e2a", + "24f3f4956da34b5c533d9a551ccd7b16", + "0c40382de693a5304e2331eb951cc962", + "9436f949d51b347db5c8e6258dafaaac", + "d2084297fe84c4ba6e04e4fb73d734fe", + "42a6f8ff590af21b512e9e088257aa34", + "c484ad06b1cdb3a54f3f6464a7a2a6fd", + "1b8ac860f5ceb4365400a201ed2917aa", + "c43eadabbe7b7473f3f837fc52650f54", + "0e5d3205406126b1f838875deb150d6a", + "6bf4946f8ec8a9c417f50cd1e67565be", + "42f09a2522314799c95b3fc121a0e3e8", + "06b8f1487f691a3f7c3f74e133d55870", + "1a70a65fb4f314dcf6a31451a9d2704f", + "7d4acdd0823279fd28a1e48b49a04669", + "09545cc8822a5dfc93bbab708fd69174", + "efc063db625013a83c9a426d39a9bddb", + "213bbf89b3f5be0ffdb14854bbcb2588", + "b69624d89fe2774df9a6f43695d755d4", + "c0f9ff9ded82bd73c512e365a894774d", + "d1b68507ed89c17ead6f69012982db71", + "14cf16db04648978e35c44850855d1b0", + "9f254d4eccab74cd91d694df863650a8", + "8f8946e2967baa4a814d36ff01d20813", + "6b9dc4d24ecba166cb2915d7a6cba43b", + "eb35a80418a0042b850e294db7898d4d", + "f55f925d280c637d54055c9df088ef5f", + "f48427a04f67e33f3ba0a17f7c9704a7", + "4a9f5bfcc0321aea2eced896cee65894", + "8723a67d1a1df90f1cef96e6fe81e702", + "c166c343ee25998f80bad4067960d3fd", + "dab67288d16702e676a040fd42344d73", + "c8e9e0d80841eb2c116dd14c180e006c", + "92294f546bacf0dea9042c93ecba8b34", + "013705b1502b37369ad22fe8237d444e", + "9b97f8837d5f2ebab0768fc9a6446b93", + "7e7e5236b05ec35f89edf8bf655498e7", + "7be8f2362c174c776fb9432fe93bf259", + "2422e80420276d2df5702c6470879b01", + "df645795db778bcce23bbe819a76ba48", + "3f97a4ac87dfc58761cda1782d749074", + "50e3f45df21ebfa1b706b9c0a1c245a8", + "7879541c7ff612c7ddf17cb8f7260183", + "67f6542b903b7ba1945eba1a85ee6b1c", + "b34b73d36ab6234b8d3f5494d251138e", + "0aea139641fdba59ab1103479a96e05f", + "02776815a87b8ba878453666d42afe3c", + "5929ab0a90459ebac5a16e2fb37c847e", + "c244def5b20ce0468f2b5012d04ac7fd", + "12116add6fefce36ed8a0aeccce9b6d3", + "3cd743841e9d8b878f34d91b793b4fad", + "45e87510cf5705262185f46905fae35f", + "276047016b0bfb501b2d4fc748165793", + "ddd245df5a799417d350bd7f4e0b0b7e", + "d34d917a54a2983f3fdbc4b14caae382", + "7730fbc09d0c1fb1939a8fc436f6b995", + "eb4899ef257a1711cc9270a19702e5b5", + "8a30932014bce35bba620895d374df7a", + "1924aabf9c50aa00bee5e1f95b5d9e12", + "1758d6f8b982aec9fbe50f20e3082b46", + "cd075928ab7e6883e697fe7fd3ac43ee", +} diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/nacl/box/example_test.go lxd-2.15/dist/src/golang.org/x/crypto/nacl/box/example_test.go --- lxd-2.14/dist/src/golang.org/x/crypto/nacl/box/example_test.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/nacl/box/example_test.go 2017-06-28 03:01:23.000000000 +0000 @@ -0,0 +1,95 @@ +package box_test + +import ( + crypto_rand "crypto/rand" // Custom so it's clear which rand we're using. + "fmt" + "io" + + "golang.org/x/crypto/nacl/box" +) + +func Example() { + senderPublicKey, senderPrivateKey, err := box.GenerateKey(crypto_rand.Reader) + if err != nil { + panic(err) + } + + recipientPublicKey, recipientPrivateKey, err := box.GenerateKey(crypto_rand.Reader) + if err != nil { + panic(err) + } + + // You must use a different nonce for each message you encrypt with the + // same key. Since the nonce here is 192 bits long, a random value + // provides a sufficiently small probability of repeats. + var nonce [24]byte + if _, err := io.ReadFull(crypto_rand.Reader, nonce[:]); err != nil { + panic(err) + } + + msg := []byte("Alas, poor Yorick! I knew him, Horatio") + // This encrypts msg and appends the result to the nonce. + encrypted := box.Seal(nonce[:], msg, &nonce, recipientPublicKey, senderPrivateKey) + + // The recipient can decrypt the message using their private key and the + // sender's public key. When you decrypt, you must use the same nonce you + // used to encrypt the message. One way to achieve this is to store the + // nonce alongside the encrypted message. Above, we stored the nonce in the + // first 24 bytes of the encrypted text. + var decryptNonce [24]byte + copy(decryptNonce[:], encrypted[:24]) + decrypted, ok := box.Open(nil, encrypted[24:], &decryptNonce, senderPublicKey, recipientPrivateKey) + if !ok { + panic("decryption error") + } + fmt.Println(string(decrypted)) + // Output: Alas, poor Yorick! I knew him, Horatio +} + +func Example_precompute() { + senderPublicKey, senderPrivateKey, err := box.GenerateKey(crypto_rand.Reader) + if err != nil { + panic(err) + } + + recipientPublicKey, recipientPrivateKey, err := box.GenerateKey(crypto_rand.Reader) + if err != nil { + panic(err) + } + + // The shared key can be used to speed up processing when using the same + // pair of keys repeatedly. + sharedEncryptKey := new([32]byte) + box.Precompute(sharedEncryptKey, recipientPublicKey, senderPrivateKey) + + // You must use a different nonce for each message you encrypt with the + // same key. Since the nonce here is 192 bits long, a random value + // provides a sufficiently small probability of repeats. + var nonce [24]byte + if _, err := io.ReadFull(crypto_rand.Reader, nonce[:]); err != nil { + panic(err) + } + + msg := []byte("A fellow of infinite jest, of most excellent fancy") + // This encrypts msg and appends the result to the nonce. + encrypted := box.SealAfterPrecomputation(nonce[:], msg, &nonce, sharedEncryptKey) + + // The shared key can be used to speed up processing when using the same + // pair of keys repeatedly. + var sharedDecryptKey [32]byte + box.Precompute(&sharedDecryptKey, senderPublicKey, recipientPrivateKey) + + // The recipient can decrypt the message using the shared key. When you + // decrypt, you must use the same nonce you used to encrypt the message. + // One way to achieve this is to store the nonce alongside the encrypted + // message. Above, we stored the nonce in the first 24 bytes of the + // encrypted text. + var decryptNonce [24]byte + copy(decryptNonce[:], encrypted[:24]) + decrypted, ok := box.OpenAfterPrecomputation(nil, encrypted[24:], &decryptNonce, &sharedDecryptKey) + if !ok { + panic("decryption error") + } + fmt.Println(string(decrypted)) + // Output: A fellow of infinite jest, of most excellent fancy +} diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/nacl/secretbox/example_test.go lxd-2.15/dist/src/golang.org/x/crypto/nacl/secretbox/example_test.go --- lxd-2.14/dist/src/golang.org/x/crypto/nacl/secretbox/example_test.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/nacl/secretbox/example_test.go 2017-06-28 03:01:23.000000000 +0000 @@ -43,7 +43,7 @@ // 24 bytes of the encrypted text. var decryptNonce [24]byte copy(decryptNonce[:], encrypted[:24]) - decrypted, ok := secretbox.Open([]byte{}, encrypted[24:], &decryptNonce, &secretKey) + decrypted, ok := secretbox.Open(nil, encrypted[24:], &decryptNonce, &secretKey) if !ok { panic("decryption error") } diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/nacl/secretbox/secretbox_test.go lxd-2.15/dist/src/golang.org/x/crypto/nacl/secretbox/secretbox_test.go --- lxd-2.14/dist/src/golang.org/x/crypto/nacl/secretbox/secretbox_test.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/nacl/secretbox/secretbox_test.go 2017-06-28 03:01:23.000000000 +0000 @@ -89,3 +89,66 @@ t.Fatalf("Seal didn't correctly append with sufficient capacity.") } } + +func benchmarkSealSize(b *testing.B, size int) { + message := make([]byte, size) + out := make([]byte, size+Overhead) + var nonce [24]byte + var key [32]byte + + b.SetBytes(int64(size)) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + out = Seal(out[:0], message, &nonce, &key) + } +} + +func BenchmarkSeal8Bytes(b *testing.B) { + benchmarkSealSize(b, 8) +} + +func BenchmarkSeal100Bytes(b *testing.B) { + benchmarkSealSize(b, 100) +} + +func BenchmarkSeal1K(b *testing.B) { + benchmarkSealSize(b, 1024) +} + +func BenchmarkSeal8K(b *testing.B) { + benchmarkSealSize(b, 8192) +} + +func benchmarkOpenSize(b *testing.B, size int) { + msg := make([]byte, size) + result := make([]byte, size) + var nonce [24]byte + var key [32]byte + box := Seal(nil, msg, &nonce, &key) + + b.SetBytes(int64(size)) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + if _, ok := Open(result[:0], box, &nonce, &key); !ok { + panic("Open failed") + } + } +} + +func BenchmarkOpen8Bytes(b *testing.B) { + benchmarkOpenSize(b, 8) +} + +func BenchmarkOpen100Bytes(b *testing.B) { + benchmarkOpenSize(b, 100) +} + +func BenchmarkOpen1K(b *testing.B) { + benchmarkOpenSize(b, 1024) +} + +func BenchmarkOpen8K(b *testing.B) { + benchmarkOpenSize(b, 8192) +} diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/ocsp/ocsp.go lxd-2.15/dist/src/golang.org/x/crypto/ocsp/ocsp.go --- lxd-2.14/dist/src/golang.org/x/crypto/ocsp/ocsp.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/ocsp/ocsp.go 2017-06-28 03:01:23.000000000 +0000 @@ -450,8 +450,8 @@ // then the signature over the response is checked. If issuer is not nil then // it will be used to validate the signature or embedded certificate. // -// Invalid signatures or parse failures will result in a ParseError. Error -// responses will result in a ResponseError. +// Invalid responses and parse failures will result in a ParseError. +// Error responses will result in a ResponseError. func ParseResponse(bytes []byte, issuer *x509.Certificate) (*Response, error) { return ParseResponseForCert(bytes, nil, issuer) } @@ -462,8 +462,8 @@ // issuer is not nil then it will be used to validate the signature or embedded // certificate. // -// Invalid signatures or parse failures will result in a ParseError. Error -// responses will result in a ResponseError. +// Invalid responses and parse failures will result in a ParseError. +// Error responses will result in a ResponseError. func ParseResponseForCert(bytes []byte, cert, issuer *x509.Certificate) (*Response, error) { var resp responseASN1 rest, err := asn1.Unmarshal(bytes, &resp) @@ -496,10 +496,32 @@ return nil, ParseError("OCSP response contains bad number of responses") } + var singleResp singleResponse + if cert == nil { + singleResp = basicResp.TBSResponseData.Responses[0] + } else { + match := false + for _, resp := range basicResp.TBSResponseData.Responses { + if cert == nil || cert.SerialNumber.Cmp(resp.CertID.SerialNumber) == 0 { + singleResp = resp + match = true + break + } + } + if !match { + return nil, ParseError("no response matching the supplied certificate") + } + } + ret := &Response{ TBSResponseData: basicResp.TBSResponseData.Raw, Signature: basicResp.Signature.RightAlign(), SignatureAlgorithm: getSignatureAlgorithmFromOID(basicResp.SignatureAlgorithm.Algorithm), + Extensions: singleResp.SingleExtensions, + SerialNumber: singleResp.CertID.SerialNumber, + ProducedAt: basicResp.TBSResponseData.ProducedAt, + ThisUpdate: singleResp.ThisUpdate, + NextUpdate: singleResp.NextUpdate, } // Handle the ResponderID CHOICE tag. ResponderID can be flattened into @@ -542,25 +564,14 @@ } } - var r singleResponse - for _, resp := range basicResp.TBSResponseData.Responses { - if cert == nil || cert.SerialNumber.Cmp(resp.CertID.SerialNumber) == 0 { - r = resp - break - } - } - - for _, ext := range r.SingleExtensions { + for _, ext := range singleResp.SingleExtensions { if ext.Critical { return nil, ParseError("unsupported critical extension") } } - ret.Extensions = r.SingleExtensions - - ret.SerialNumber = r.CertID.SerialNumber for h, oid := range hashOIDs { - if r.CertID.HashAlgorithm.Algorithm.Equal(oid) { + if singleResp.CertID.HashAlgorithm.Algorithm.Equal(oid) { ret.IssuerHash = h break } @@ -570,20 +581,16 @@ } switch { - case bool(r.Good): + case bool(singleResp.Good): ret.Status = Good - case bool(r.Unknown): + case bool(singleResp.Unknown): ret.Status = Unknown default: ret.Status = Revoked - ret.RevokedAt = r.Revoked.RevocationTime - ret.RevocationReason = int(r.Revoked.Reason) + ret.RevokedAt = singleResp.Revoked.RevocationTime + ret.RevocationReason = int(singleResp.Revoked.Reason) } - ret.ProducedAt = basicResp.TBSResponseData.ProducedAt - ret.ThisUpdate = r.ThisUpdate - ret.NextUpdate = r.NextUpdate - return ret, nil } diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/ocsp/ocsp_test.go lxd-2.15/dist/src/golang.org/x/crypto/ocsp/ocsp_test.go --- lxd-2.14/dist/src/golang.org/x/crypto/ocsp/ocsp_test.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/ocsp/ocsp_test.go 2017-06-28 03:01:23.000000000 +0000 @@ -343,6 +343,21 @@ } } +func TestOCSPDecodeMultiResponseWithoutMatchingCert(t *testing.T) { + wrongCert, _ := hex.DecodeString(startComHex) + cert, err := x509.ParseCertificate(wrongCert) + if err != nil { + t.Fatal(err) + } + + responseBytes, _ := hex.DecodeString(ocspMultiResponseHex) + _, err = ParseResponseForCert(responseBytes, cert, nil) + want := ParseError("no response matching the supplied certificate") + if err != want { + t.Errorf("err: got %q, want %q", err, want) + } +} + // This OCSP response was taken from Thawte's public OCSP responder. // To recreate: // $ openssl s_client -tls1 -showcerts -servername www.google.com -connect www.google.com:443 diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/ssh/connection.go lxd-2.15/dist/src/golang.org/x/crypto/ssh/connection.go --- lxd-2.14/dist/src/golang.org/x/crypto/ssh/connection.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/ssh/connection.go 2017-06-28 03:01:23.000000000 +0000 @@ -25,7 +25,7 @@ // User returns the user ID for this connection. User() string - // SessionID returns the sesson hash, also denoted by H. + // SessionID returns the session hash, also denoted by H. SessionID() []byte // ClientVersion returns the client's version string as hashed diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/ssh/example_test.go lxd-2.15/dist/src/golang.org/x/crypto/ssh/example_test.go --- lxd-2.14/dist/src/golang.org/x/crypto/ssh/example_test.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/ssh/example_test.go 2017-06-28 03:01:23.000000000 +0000 @@ -56,7 +56,12 @@ // Remove to disable public key auth. PublicKeyCallback: func(c ssh.ConnMetadata, pubKey ssh.PublicKey) (*ssh.Permissions, error) { if authorizedKeysMap[string(pubKey.Marshal())] { - return nil, nil + return &ssh.Permissions{ + // Record the public key used for authentication. + Extensions: map[string]string{ + "pubkey-fp": ssh.FingerprintSHA256(pubKey), + }, + }, nil } return nil, fmt.Errorf("unknown public key for %q", c.User()) }, @@ -87,10 +92,12 @@ // Before use, a handshake must be performed on the incoming // net.Conn. - _, chans, reqs, err := ssh.NewServerConn(nConn, config) + conn, chans, reqs, err := ssh.NewServerConn(nConn, config) if err != nil { log.Fatal("failed to handshake: ", err) } + log.Printf("logged in with key %s", conn.Permissions.Extensions["pubkey-fp"]) + // The incoming Request channel must be serviced. go ssh.DiscardRequests(reqs) diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/ssh/kex.go lxd-2.15/dist/src/golang.org/x/crypto/ssh/kex.go --- lxd-2.14/dist/src/golang.org/x/crypto/ssh/kex.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/ssh/kex.go 2017-06-28 03:01:23.000000000 +0000 @@ -383,8 +383,8 @@ // 4253 and Oakley Group 2 in RFC 2409. p, _ := new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF", 16) kexAlgoMap[kexAlgoDH1SHA1] = &dhGroup{ - g: new(big.Int).SetInt64(2), - p: p, + g: new(big.Int).SetInt64(2), + p: p, pMinus1: new(big.Int).Sub(p, bigOne), } @@ -393,8 +393,8 @@ p, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16) kexAlgoMap[kexAlgoDH14SHA1] = &dhGroup{ - g: new(big.Int).SetInt64(2), - p: p, + g: new(big.Int).SetInt64(2), + p: p, pMinus1: new(big.Int).Sub(p, bigOne), } diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/ssh/keys.go lxd-2.15/dist/src/golang.org/x/crypto/ssh/keys.go --- lxd-2.14/dist/src/golang.org/x/crypto/ssh/keys.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/ssh/keys.go 2017-06-28 03:01:23.000000000 +0000 @@ -756,6 +756,18 @@ return NewSignerFromKey(key) } +// ParsePrivateKeyWithPassphrase returns a Signer from a PEM encoded private +// key and passphrase. It supports the same keys as +// ParseRawPrivateKeyWithPassphrase. +func ParsePrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (Signer, error) { + key, err := ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase) + if err != nil { + return nil, err + } + + return NewSignerFromKey(key) +} + // encryptedBlock tells whether a private key is // encrypted by examining its Proc-Type header // for a mention of ENCRYPTED @@ -788,6 +800,37 @@ default: return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) } +} + +func ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (interface{}, error) { + block, _ := pem.Decode(pemBytes) + if block == nil { + return nil, errors.New("ssh: no key found") + } + buf := block.Bytes + + if encryptedBlock(block) { + if x509.IsEncryptedPEMBlock(block) { + var err error + buf, err = x509.DecryptPEMBlock(block, passPhrase) + if err != nil { + return nil, fmt.Errorf("ssh: cannot decode encrypted private keys: %v", err) + } + } + } + + switch block.Type { + case "RSA PRIVATE KEY": + return x509.ParsePKCS1PrivateKey(buf) + case "EC PRIVATE KEY": + return x509.ParseECPrivateKey(buf) + case "DSA PRIVATE KEY": + return ParseDSAPrivateKey(buf) + case "OPENSSH PRIVATE KEY": + return parseOpenSSHPrivateKey(buf) + default: + return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) + } } // ParseDSAPrivateKey returns a DSA private key from its ASN.1 DER encoding, as diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/ssh/keys_test.go lxd-2.15/dist/src/golang.org/x/crypto/ssh/keys_test.go --- lxd-2.14/dist/src/golang.org/x/crypto/ssh/keys_test.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/ssh/keys_test.go 2017-06-28 03:01:23.000000000 +0000 @@ -148,6 +148,25 @@ } } +// Parse encrypted private keys with passphrase +func TestParseEncryptedPrivateKeysWithPassphrase(t *testing.T) { + data := []byte("sign me") + for _, tt := range testdata.PEMEncryptedKeys { + s, err := ParsePrivateKeyWithPassphrase(tt.PEMBytes, []byte(tt.EncryptionKey)) + if err != nil { + t.Fatalf("ParsePrivateKeyWithPassphrase returned error: %s", err) + continue + } + sig, err := s.Sign(rand.Reader, data) + if err != nil { + t.Fatalf("dsa.Sign: %v", err) + } + if err := s.PublicKey().Verify(data, sig); err != nil { + t.Errorf("Verify failed: %v", err) + } + } +} + func TestParseDSA(t *testing.T) { // We actually exercise the ParsePrivateKey codepath here, as opposed to // using the ParseRawPrivateKey+NewSignerFromKey path that testdata_test.go diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/ssh/server.go lxd-2.15/dist/src/golang.org/x/crypto/ssh/server.go --- lxd-2.14/dist/src/golang.org/x/crypto/ssh/server.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/ssh/server.go 2017-06-28 03:01:23.000000000 +0000 @@ -14,23 +14,34 @@ ) // The Permissions type holds fine-grained permissions that are -// specific to a user or a specific authentication method for a -// user. Permissions, except for "source-address", must be enforced in -// the server application layer, after successful authentication. The -// Permissions are passed on in ServerConn so a server implementation -// can honor them. +// specific to a user or a specific authentication method for a user. +// The Permissions value for a successful authentication attempt is +// available in ServerConn, so it can be used to pass information from +// the user-authentication phase to the application layer. type Permissions struct { - // Critical options restrict default permissions. Common - // restrictions are "source-address" and "force-command". If - // the server cannot enforce the restriction, or does not - // recognize it, the user should not authenticate. + // CriticalOptions indicate restrictions to the default + // permissions, and are typically used in conjunction with + // user certificates. The standard for SSH certificates + // defines "force-command" (only allow the given command to + // execute) and "source-address" (only allow connections from + // the given address). The SSH package currently only enforces + // the "source-address" critical option. It is up to server + // implementations to enforce other critical options, such as + // "force-command", by checking them after the SSH handshake + // is successful. In general, SSH servers should reject + // connections that specify critical options that are unknown + // or not supported. CriticalOptions map[string]string // Extensions are extra functionality that the server may - // offer on authenticated connections. Common extensions are - // "permit-agent-forwarding", "permit-X11-forwarding". Lack of - // support for an extension does not preclude authenticating a - // user. + // offer on authenticated connections. Lack of support for an + // extension does not preclude authenticating a user. Common + // extensions are "permit-agent-forwarding", + // "permit-X11-forwarding". The Go SSH library currently does + // not act on any extension, and it is up to server + // implementations to honor them. Extensions can be used to + // pass data from the authentication callbacks to the server + // application layer. Extensions map[string]string } @@ -55,9 +66,14 @@ // attempts to authenticate using a password. PasswordCallback func(conn ConnMetadata, password []byte) (*Permissions, error) - // PublicKeyCallback, if non-nil, is called when a client attempts public - // key authentication. It must return true if the given public key is - // valid for the given user. For example, see CertChecker.Authenticate. + // PublicKeyCallback, if non-nil, is called when a client + // offers a public key for authentication. It must return true + // if the given public key can be used to authenticate the + // given user. For example, see CertChecker.Authenticate. A + // call to this function does not guarantee that the key + // offered is in fact used to authenticate. To record any data + // depending on the public key, store it inside a + // Permissions.Extensions entry. PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error) // KeyboardInteractiveCallback, if non-nil, is called when diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/xts/xts.go lxd-2.15/dist/src/golang.org/x/crypto/xts/xts.go --- lxd-2.14/dist/src/golang.org/x/crypto/xts/xts.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/xts/xts.go 2017-06-28 03:01:23.000000000 +0000 @@ -23,6 +23,7 @@ import ( "crypto/cipher" + "encoding/binary" "errors" ) @@ -65,21 +66,20 @@ } var tweak [blockSize]byte - for i := 0; i < 8; i++ { - tweak[i] = byte(sectorNum) - sectorNum >>= 8 - } + binary.LittleEndian.PutUint64(tweak[:8], sectorNum) c.k2.Encrypt(tweak[:], tweak[:]) - for i := 0; i < len(plaintext); i += blockSize { - for j := 0; j < blockSize; j++ { - ciphertext[i+j] = plaintext[i+j] ^ tweak[j] + for len(plaintext) > 0 { + for j := range tweak { + ciphertext[j] = plaintext[j] ^ tweak[j] } - c.k1.Encrypt(ciphertext[i:], ciphertext[i:]) - for j := 0; j < blockSize; j++ { - ciphertext[i+j] ^= tweak[j] + c.k1.Encrypt(ciphertext, ciphertext) + for j := range tweak { + ciphertext[j] ^= tweak[j] } + plaintext = plaintext[blockSize:] + ciphertext = ciphertext[blockSize:] mul2(&tweak) } @@ -97,21 +97,20 @@ } var tweak [blockSize]byte - for i := 0; i < 8; i++ { - tweak[i] = byte(sectorNum) - sectorNum >>= 8 - } + binary.LittleEndian.PutUint64(tweak[:8], sectorNum) c.k2.Encrypt(tweak[:], tweak[:]) - for i := 0; i < len(plaintext); i += blockSize { - for j := 0; j < blockSize; j++ { - plaintext[i+j] = ciphertext[i+j] ^ tweak[j] + for len(ciphertext) > 0 { + for j := range tweak { + plaintext[j] = ciphertext[j] ^ tweak[j] } - c.k1.Decrypt(plaintext[i:], plaintext[i:]) - for j := 0; j < blockSize; j++ { - plaintext[i+j] ^= tweak[j] + c.k1.Decrypt(plaintext, plaintext) + for j := range tweak { + plaintext[j] ^= tweak[j] } + plaintext = plaintext[blockSize:] + ciphertext = ciphertext[blockSize:] mul2(&tweak) } diff -Nru lxd-2.14/dist/src/golang.org/x/crypto/xts/xts_test.go lxd-2.15/dist/src/golang.org/x/crypto/xts/xts_test.go --- lxd-2.14/dist/src/golang.org/x/crypto/xts/xts_test.go 2017-05-30 19:04:43.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/crypto/xts/xts_test.go 2017-06-28 03:01:23.000000000 +0000 @@ -83,3 +83,23 @@ } } } + +func TestShorterCiphertext(t *testing.T) { + // Decrypt used to panic if the input was shorter than the output. See + // https://go-review.googlesource.com/c/39954/ + c, err := NewCipher(aes.NewCipher, make([]byte, 32)) + if err != nil { + t.Fatalf("NewCipher failed: %s", err) + } + + plaintext := make([]byte, 32) + encrypted := make([]byte, 48) + decrypted := make([]byte, 48) + + c.Encrypt(encrypted, plaintext, 0) + c.Decrypt(decrypted, encrypted[:len(plaintext)], 0) + + if !bytes.Equal(plaintext, decrypted[:len(plaintext)]) { + t.Errorf("En/Decryption is not inverse") + } +} diff -Nru lxd-2.14/dist/src/golang.org/x/net/bpf/constants.go lxd-2.15/dist/src/golang.org/x/net/bpf/constants.go --- lxd-2.14/dist/src/golang.org/x/net/bpf/constants.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/bpf/constants.go 2017-06-28 03:01:38.000000000 +0000 @@ -76,54 +76,54 @@ // ExtLen returns the length of the packet. ExtLen Extension = 1 // ExtProto returns the packet's L3 protocol type. - ExtProto = 0 + ExtProto Extension = 0 // ExtType returns the packet's type (skb->pkt_type in the kernel) // // TODO: better documentation. How nice an API do we want to // provide for these esoteric extensions? - ExtType = 4 + ExtType Extension = 4 // ExtPayloadOffset returns the offset of the packet payload, or // the first protocol header that the kernel does not know how to // parse. - ExtPayloadOffset = 52 + ExtPayloadOffset Extension = 52 // ExtInterfaceIndex returns the index of the interface on which // the packet was received. - ExtInterfaceIndex = 8 + ExtInterfaceIndex Extension = 8 // ExtNetlinkAttr returns the netlink attribute of type X at // offset A. - ExtNetlinkAttr = 12 + ExtNetlinkAttr Extension = 12 // ExtNetlinkAttrNested returns the nested netlink attribute of // type X at offset A. - ExtNetlinkAttrNested = 16 + ExtNetlinkAttrNested Extension = 16 // ExtMark returns the packet's mark value. - ExtMark = 20 + ExtMark Extension = 20 // ExtQueue returns the packet's assigned hardware queue. - ExtQueue = 24 + ExtQueue Extension = 24 // ExtLinkLayerType returns the packet's hardware address type // (e.g. Ethernet, Infiniband). - ExtLinkLayerType = 28 + ExtLinkLayerType Extension = 28 // ExtRXHash returns the packets receive hash. // // TODO: figure out what this rxhash actually is. - ExtRXHash = 32 + ExtRXHash Extension = 32 // ExtCPUID returns the ID of the CPU processing the current // packet. - ExtCPUID = 36 + ExtCPUID Extension = 36 // ExtVLANTag returns the packet's VLAN tag. - ExtVLANTag = 44 + ExtVLANTag Extension = 44 // ExtVLANTagPresent returns non-zero if the packet has a VLAN // tag. // // TODO: I think this might be a lie: it reads bit 0x1000 of the // VLAN header, which changed meaning in recent revisions of the // spec - this extension may now return meaningless information. - ExtVLANTagPresent = 48 + ExtVLANTagPresent Extension = 48 // ExtVLANProto returns 0x8100 if the frame has a VLAN header, // 0x88a8 if the frame has a "Q-in-Q" double VLAN header, or some // other value if no VLAN information is present. - ExtVLANProto = 60 + ExtVLANProto Extension = 60 // ExtRand returns a uniformly random uint32. - ExtRand = 56 + ExtRand Extension = 56 ) // The following gives names to various bit patterns used in opcode construction. diff -Nru lxd-2.14/dist/src/golang.org/x/net/bpf/setter.go lxd-2.15/dist/src/golang.org/x/net/bpf/setter.go --- lxd-2.14/dist/src/golang.org/x/net/bpf/setter.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/bpf/setter.go 2017-06-28 03:01:38.000000000 +0000 @@ -0,0 +1,10 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bpf + +// A Setter is a type which can attach a compiled BPF filter to itself. +type Setter interface { + SetBPF(filter []RawInstruction) error +} diff -Nru lxd-2.14/dist/src/golang.org/x/net/dns/dnsmessage/example_test.go lxd-2.15/dist/src/golang.org/x/net/dns/dnsmessage/example_test.go --- lxd-2.14/dist/src/golang.org/x/net/dns/dnsmessage/example_test.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/dns/dnsmessage/example_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -0,0 +1,132 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package dnsmessage_test + +import ( + "fmt" + "net" + "strings" + + "golang.org/x/net/dns/dnsmessage" +) + +func mustNewName(name string) dnsmessage.Name { + n, err := dnsmessage.NewName(name) + if err != nil { + panic(err) + } + return n +} + +func ExampleParser() { + msg := dnsmessage.Message{ + Header: dnsmessage.Header{Response: true, Authoritative: true}, + Questions: []dnsmessage.Question{ + { + Name: mustNewName("foo.bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + { + Name: mustNewName("bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + }, + Answers: []dnsmessage.Resource{ + { + dnsmessage.ResourceHeader{ + Name: mustNewName("foo.bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + &dnsmessage.AResource{[4]byte{127, 0, 0, 1}}, + }, + { + dnsmessage.ResourceHeader{ + Name: mustNewName("bar.example.com."), + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + }, + &dnsmessage.AResource{[4]byte{127, 0, 0, 2}}, + }, + }, + } + + buf, err := msg.Pack() + if err != nil { + panic(err) + } + + wantName := "bar.example.com." + + var p dnsmessage.Parser + if _, err := p.Start(buf); err != nil { + panic(err) + } + + for { + q, err := p.Question() + if err == dnsmessage.ErrSectionDone { + break + } + if err != nil { + panic(err) + } + + if q.Name.String() != wantName { + continue + } + + fmt.Println("Found question for name", wantName) + if err := p.SkipAllQuestions(); err != nil { + panic(err) + } + break + } + + var gotIPs []net.IP + for { + h, err := p.AnswerHeader() + if err == dnsmessage.ErrSectionDone { + break + } + if err != nil { + panic(err) + } + + if (h.Type != dnsmessage.TypeA && h.Type != dnsmessage.TypeAAAA) || h.Class != dnsmessage.ClassINET { + continue + } + + if !strings.EqualFold(h.Name.String(), wantName) { + if err := p.SkipAnswer(); err != nil { + panic(err) + } + continue + } + + switch h.Type { + case dnsmessage.TypeA: + r, err := p.AResource() + if err != nil { + panic(err) + } + gotIPs = append(gotIPs, r.A[:]) + case dnsmessage.TypeAAAA: + r, err := p.AAAAResource() + if err != nil { + panic(err) + } + gotIPs = append(gotIPs, r.AAAA[:]) + } + } + + fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs) + + // Output: + // Found question for name bar.example.com. + // Found A/AAAA records for name bar.example.com.: [127.0.0.2] +} diff -Nru lxd-2.14/dist/src/golang.org/x/net/dns/dnsmessage/message.go lxd-2.15/dist/src/golang.org/x/net/dns/dnsmessage/message.go --- lxd-2.14/dist/src/golang.org/x/net/dns/dnsmessage/message.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/dns/dnsmessage/message.go 2017-06-28 03:01:38.000000000 +0000 @@ -68,12 +68,12 @@ var ( // ErrNotStarted indicates that the prerequisite information isn't // available yet because the previous records haven't been appropriately - // parsed or skipped. - ErrNotStarted = errors.New("parsing of this type isn't available yet") + // parsed, skipped or finished. + ErrNotStarted = errors.New("parsing/packing of this type isn't available yet") // ErrSectionDone indicated that all records in the section have been - // parsed. - ErrSectionDone = errors.New("parsing of this section has completed") + // parsed or finished. + ErrSectionDone = errors.New("parsing/packing of this section has completed") errBaseLen = errors.New("insufficient data for base length type") errCalcLen = errors.New("insufficient data for calculated length type") @@ -88,6 +88,28 @@ errTooManyAnswers = errors.New("too many Answers to pack (>65535)") errTooManyAuthorities = errors.New("too many Authorities to pack (>65535)") errTooManyAdditionals = errors.New("too many Additionals to pack (>65535)") + errNonCanonicalName = errors.New("name is not in canonical format (it must end with a .)") +) + +// Internal constants. +const ( + // packStartingCap is the default initial buffer size allocated during + // packing. + // + // The starting capacity doesn't matter too much, but most DNS responses + // Will be <= 512 bytes as it is the limit for DNS over UDP. + packStartingCap = 512 + + // uint16Len is the length (in bytes) of a uint16. + uint16Len = 2 + + // uint32Len is the length (in bytes) of a uint32. + uint32Len = 4 + + // headerLen is the length (in bytes) of a DNS header. + // + // A header is comprised of 6 uint16s and no padding. + headerLen = 6 * uint16Len ) type nestedError struct { @@ -148,7 +170,8 @@ type section uint8 const ( - sectionHeader section = iota + sectionNotStarted section = iota + sectionHeader sectionQuestions sectionAnswers sectionAuthorities @@ -241,10 +264,13 @@ } // A Resource is a DNS resource record. -type Resource interface { - // Header return's the Resource's ResourceHeader. - Header() *ResourceHeader +type Resource struct { + Header ResourceHeader + Body ResourceBody +} +// A ResourceBody is a DNS resource record minus the header. +type ResourceBody interface { // pack packs a Resource except for its header. pack(msg []byte, compression map[string]int) ([]byte, error) @@ -253,25 +279,21 @@ realType() Type } -func packResource(msg []byte, resource Resource, compression map[string]int) ([]byte, error) { +func (r *Resource) pack(msg []byte, compression map[string]int) ([]byte, error) { oldMsg := msg - resource.Header().Type = resource.realType() - msg, length, err := resource.Header().pack(msg, compression) + r.Header.Type = r.Body.realType() + msg, length, err := r.Header.pack(msg, compression) if err != nil { return msg, &nestedError{"ResourceHeader", err} } preLen := len(msg) - msg, err = resource.pack(msg, compression) + msg, err = r.Body.pack(msg, compression) if err != nil { return msg, &nestedError{"content", err} } - conLen := len(msg) - preLen - if conLen > int(^uint16(0)) { - return oldMsg, errResTooLong + if err := r.Header.fixLen(msg, length, preLen); err != nil { + return oldMsg, err } - // Fill in the length now that we know how long the content is. - packUint16(length[:0], uint16(conLen)) - resource.Header().Length = uint16(conLen) return msg, nil } @@ -330,14 +352,15 @@ func (p *Parser) resource(sec section) (Resource, error) { var r Resource - hdr, err := p.resourceHeader(sec) + var err error + r.Header, err = p.resourceHeader(sec) if err != nil { return r, err } p.resHeaderValid = false - r, p.off, err = unpackResource(p.msg, p.off, hdr) + r.Body, p.off, err = unpackResourceBody(p.msg, p.off, r.Header) if err != nil { - return nil, &nestedError{"unpacking " + sectionNames[sec], err} + return Resource{}, &nestedError{"unpacking " + sectionNames[sec], err} } p.index++ return r, nil @@ -389,7 +412,8 @@ if err := p.checkAdvance(sectionQuestions); err != nil { return Question{}, err } - name, off, err := unpackName(p.msg, p.off) + var name Name + off, err := name.unpack(p.msg, p.off) if err != nil { return Question{}, &nestedError{"unpacking Question.Name", err} } @@ -575,6 +599,168 @@ } } +// CNAMEResource parses a single CNAMEResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) CNAMEResource() (CNAMEResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeCNAME { + return CNAMEResource{}, ErrNotStarted + } + r, err := unpackCNAMEResource(p.msg, p.off) + if err != nil { + return CNAMEResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// MXResource parses a single MXResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) MXResource() (MXResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeMX { + return MXResource{}, ErrNotStarted + } + r, err := unpackMXResource(p.msg, p.off) + if err != nil { + return MXResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// NSResource parses a single NSResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) NSResource() (NSResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeNS { + return NSResource{}, ErrNotStarted + } + r, err := unpackNSResource(p.msg, p.off) + if err != nil { + return NSResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// PTRResource parses a single PTRResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) PTRResource() (PTRResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypePTR { + return PTRResource{}, ErrNotStarted + } + r, err := unpackPTRResource(p.msg, p.off) + if err != nil { + return PTRResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// SOAResource parses a single SOAResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) SOAResource() (SOAResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeSOA { + return SOAResource{}, ErrNotStarted + } + r, err := unpackSOAResource(p.msg, p.off) + if err != nil { + return SOAResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// TXTResource parses a single TXTResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) TXTResource() (TXTResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeTXT { + return TXTResource{}, ErrNotStarted + } + r, err := unpackTXTResource(p.msg, p.off, p.resHeader.Length) + if err != nil { + return TXTResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// SRVResource parses a single SRVResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) SRVResource() (SRVResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeSRV { + return SRVResource{}, ErrNotStarted + } + r, err := unpackSRVResource(p.msg, p.off) + if err != nil { + return SRVResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// AResource parses a single AResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) AResource() (AResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeA { + return AResource{}, ErrNotStarted + } + r, err := unpackAResource(p.msg, p.off) + if err != nil { + return AResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + +// AAAAResource parses a single AAAAResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) AAAAResource() (AAAAResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeAAAA { + return AAAAResource{}, ErrNotStarted + } + r, err := unpackAAAAResource(p.msg, p.off) + if err != nil { + return AAAAResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + // Unpack parses a full Message. func (m *Message) Unpack(msg []byte) error { var p Parser @@ -623,9 +809,7 @@ h.authorities = uint16(len(m.Authorities)) h.additionals = uint16(len(m.Additionals)) - // The starting capacity doesn't matter too much, but most DNS responses - // Will be <= 512 bytes as it is the limit for DNS over UDP. - msg := make([]byte, 0, 512) + msg := make([]byte, 0, packStartingCap) msg = h.pack(msg) @@ -639,31 +823,27 @@ // compression will help ensure compliance. compression := map[string]int{} - for _, q := range m.Questions { + for i := range m.Questions { var err error - msg, err = q.pack(msg, compression) - if err != nil { + if msg, err = m.Questions[i].pack(msg, compression); err != nil { return nil, &nestedError{"packing Question", err} } } - for _, a := range m.Answers { + for i := range m.Answers { var err error - msg, err = packResource(msg, a, compression) - if err != nil { + if msg, err = m.Answers[i].pack(msg, compression); err != nil { return nil, &nestedError{"packing Answer", err} } } - for _, a := range m.Authorities { + for i := range m.Authorities { var err error - msg, err = packResource(msg, a, compression) - if err != nil { + if msg, err = m.Authorities[i].pack(msg, compression); err != nil { return nil, &nestedError{"packing Authority", err} } } - for _, a := range m.Additionals { + for i := range m.Additionals { var err error - msg, err = packResource(msg, a, compression) - if err != nil { + if msg, err = m.Additionals[i].pack(msg, compression); err != nil { return nil, &nestedError{"packing Additional", err} } } @@ -671,11 +851,369 @@ return msg, nil } -// An ResourceHeader is the header of a DNS resource record. There are +// A Builder allows incrementally packing a DNS message. +type Builder struct { + msg []byte + header header + section section + compression map[string]int +} + +// Start initializes the builder. +// +// buf is optional (nil is fine), but if provided, Start takes ownership of buf. +func (b *Builder) Start(buf []byte, h Header) { + b.StartWithoutCompression(buf, h) + b.compression = map[string]int{} +} + +// StartWithoutCompression initializes the builder with compression disabled. +// +// This avoids compression related allocations, but can result in larger message +// sizes. Be careful with this mode as it can cause messages to exceed the UDP +// size limit. +// +// buf is optional (nil is fine), but if provided, Start takes ownership of buf. +func (b *Builder) StartWithoutCompression(buf []byte, h Header) { + *b = Builder{msg: buf} + b.header.id, b.header.bits = h.pack() + if cap(b.msg) < headerLen { + b.msg = make([]byte, 0, packStartingCap) + } + b.msg = b.msg[:headerLen] + b.section = sectionHeader +} + +func (b *Builder) startCheck(s section) error { + if b.section <= sectionNotStarted { + return ErrNotStarted + } + if b.section > s { + return ErrSectionDone + } + return nil +} + +// StartQuestions prepares the builder for packing Questions. +func (b *Builder) StartQuestions() error { + if err := b.startCheck(sectionQuestions); err != nil { + return err + } + b.section = sectionQuestions + return nil +} + +// StartAnswers prepares the builder for packing Answers. +func (b *Builder) StartAnswers() error { + if err := b.startCheck(sectionAnswers); err != nil { + return err + } + b.section = sectionAnswers + return nil +} + +// StartAuthorities prepares the builder for packing Authorities. +func (b *Builder) StartAuthorities() error { + if err := b.startCheck(sectionAuthorities); err != nil { + return err + } + b.section = sectionAuthorities + return nil +} + +// StartAdditionals prepares the builder for packing Additionals. +func (b *Builder) StartAdditionals() error { + if err := b.startCheck(sectionAdditionals); err != nil { + return err + } + b.section = sectionAdditionals + return nil +} + +func (b *Builder) incrementSectionCount() error { + var count *uint16 + var err error + switch b.section { + case sectionQuestions: + count = &b.header.questions + err = errTooManyQuestions + case sectionAnswers: + count = &b.header.answers + err = errTooManyAnswers + case sectionAuthorities: + count = &b.header.authorities + err = errTooManyAuthorities + case sectionAdditionals: + count = &b.header.additionals + err = errTooManyAdditionals + } + if *count == ^uint16(0) { + return err + } + *count++ + return nil +} + +// Question adds a single Question. +func (b *Builder) Question(q Question) error { + if b.section < sectionQuestions { + return ErrNotStarted + } + if b.section > sectionQuestions { + return ErrSectionDone + } + msg, err := q.pack(b.msg, b.compression) + if err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +func (b *Builder) checkResourceSection() error { + if b.section < sectionAnswers { + return ErrNotStarted + } + if b.section > sectionAdditionals { + return ErrSectionDone + } + return nil +} + +// CNAMEResource adds a single CNAMEResource. +func (b *Builder) CNAMEResource(h ResourceHeader, r CNAMEResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"CNAMEResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// MXResource adds a single MXResource. +func (b *Builder) MXResource(h ResourceHeader, r MXResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"MXResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// NSResource adds a single NSResource. +func (b *Builder) NSResource(h ResourceHeader, r NSResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"NSResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// PTRResource adds a single PTRResource. +func (b *Builder) PTRResource(h ResourceHeader, r PTRResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"PTRResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// SOAResource adds a single SOAResource. +func (b *Builder) SOAResource(h ResourceHeader, r SOAResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"SOAResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// TXTResource adds a single TXTResource. +func (b *Builder) TXTResource(h ResourceHeader, r TXTResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"TXTResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// SRVResource adds a single SRVResource. +func (b *Builder) SRVResource(h ResourceHeader, r SRVResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"SRVResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// AResource adds a single AResource. +func (b *Builder) AResource(h ResourceHeader, r AResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"AResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// AAAAResource adds a single AAAAResource. +func (b *Builder) AAAAResource(h ResourceHeader, r AAAAResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, length, err := h.pack(b.msg, b.compression) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression); err != nil { + return &nestedError{"AAAAResource body", err} + } + if err := h.fixLen(msg, length, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// Finish ends message building and generates a binary packet. +func (b *Builder) Finish() ([]byte, error) { + if b.section < sectionHeader { + return nil, ErrNotStarted + } + b.section = sectionDone + b.header.pack(b.msg[:0]) + return b.msg, nil +} + +// A ResourceHeader is the header of a DNS resource record. There are // many types of DNS resource records, but they all share the same header. type ResourceHeader struct { // Name is the domain name for which this resource record pertains. - Name string + Name Name // Type is the type of DNS resource record. // @@ -697,17 +1235,12 @@ Length uint16 } -// Header implements Resource.Header. -func (h *ResourceHeader) Header() *ResourceHeader { - return h -} - // pack packs all of the fields in a ResourceHeader except for the length. The // length bytes are returned as a slice so they can be filled in after the rest // of the Resource has been packed. func (h *ResourceHeader) pack(oldMsg []byte, compression map[string]int) (msg []byte, length []byte, err error) { msg = oldMsg - if msg, err = packName(msg, h.Name, compression); err != nil { + if msg, err = h.Name.pack(msg, compression); err != nil { return oldMsg, nil, &nestedError{"Name", err} } msg = packType(msg, h.Type) @@ -715,13 +1248,13 @@ msg = packUint32(msg, h.TTL) lenBegin := len(msg) msg = packUint16(msg, h.Length) - return msg, msg[lenBegin:], nil + return msg, msg[lenBegin : lenBegin+uint16Len], nil } func (h *ResourceHeader) unpack(msg []byte, off int) (int, error) { newOff := off var err error - if h.Name, newOff, err = unpackName(msg, newOff); err != nil { + if newOff, err = h.Name.unpack(msg, newOff); err != nil { return off, &nestedError{"Name", err} } if h.Type, newOff, err = unpackType(msg, newOff); err != nil { @@ -739,6 +1272,19 @@ return newOff, nil } +func (h *ResourceHeader) fixLen(msg []byte, length []byte, preLen int) error { + conLen := len(msg) - preLen + if conLen > int(^uint16(0)) { + return errResTooLong + } + + // Fill in the length now that we know how long the content is. + packUint16(length[:0], uint16(conLen)) + h.Length = uint16(conLen) + + return nil +} + func skipResource(msg []byte, off int) (int, error) { newOff, err := skipName(msg, off) if err != nil { @@ -768,17 +1314,17 @@ } func unpackUint16(msg []byte, off int) (uint16, int, error) { - if off+2 > len(msg) { + if off+uint16Len > len(msg) { return 0, off, errBaseLen } - return uint16(msg[off])<<8 | uint16(msg[off+1]), off + 2, nil + return uint16(msg[off])<<8 | uint16(msg[off+1]), off + uint16Len, nil } func skipUint16(msg []byte, off int) (int, error) { - if off+2 > len(msg) { + if off+uint16Len > len(msg) { return off, errBaseLen } - return off + 2, nil + return off + uint16Len, nil } func packType(msg []byte, field Type) []byte { @@ -818,18 +1364,18 @@ } func unpackUint32(msg []byte, off int) (uint32, int, error) { - if off+4 > len(msg) { + if off+uint32Len > len(msg) { return 0, off, errBaseLen } v := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3]) - return v, off + 4, nil + return v, off + uint32Len, nil } func skipUint32(msg []byte, off int) (int, error) { - if off+4 > len(msg) { + if off+uint32Len > len(msg) { return off, errBaseLen } - return off + 4, nil + return off + uint32Len, nil } func packText(msg []byte, field string) []byte { @@ -889,30 +1435,53 @@ return newOff, nil } -// packName packs a domain name. +const nameLen = 255 + +// A Name is a non-encoded domain name. It is used instead of strings to avoid +// allocations. +type Name struct { + Data [nameLen]byte + Length uint8 +} + +// NewName creates a new Name from a string. +func NewName(name string) (Name, error) { + if len([]byte(name)) > nameLen { + return Name{}, errCalcLen + } + n := Name{Length: uint8(len(name))} + copy(n.Data[:], []byte(name)) + return n, nil +} + +func (n Name) String() string { + return string(n.Data[:n.Length]) +} + +// pack packs a domain name. // // Domain names are a sequence of counted strings split at the dots. They end // with a zero-length string. Compression can be used to reuse domain suffixes. // // The compression map will be updated with new domain suffixes. If compression // is nil, compression will not be used. -func packName(msg []byte, name string, compression map[string]int) ([]byte, error) { +func (n *Name) pack(msg []byte, compression map[string]int) ([]byte, error) { oldMsg := msg // Add a trailing dot to canonicalize name. - if n := len(name); n == 0 || name[n-1] != '.' { - name += "." + if n.Length == 0 || n.Data[n.Length-1] != '.' { + return oldMsg, errNonCanonicalName } // Allow root domain. - if name == "." { + if n.Data[0] == '.' && n.Length == 1 { return append(msg, 0), nil } // Emit sequence of counted strings, chopping at dots. - for i, begin := 0, 0; i < len(name); i++ { + for i, begin := 0, 0; i < int(n.Length); i++ { // Check for the end of the segment. - if name[i] == '.' { + if n.Data[i] == '.' { // The two most significant bits have special meaning. // It isn't allowed for segments to be long enough to // need them. @@ -928,7 +1497,7 @@ msg = append(msg, byte(i-begin)) for j := begin; j < i; j++ { - msg = append(msg, name[j]) + msg = append(msg, n.Data[j]) } begin = i + 1 @@ -938,8 +1507,8 @@ // We can only compress domain suffixes starting with a new // segment. A pointer is two bytes with the two most significant // bits set to 1 to indicate that it is a pointer. - if (i == 0 || name[i-1] == '.') && compression != nil { - if ptr, ok := compression[name[i:]]; ok { + if (i == 0 || n.Data[i-1] == '.') && compression != nil { + if ptr, ok := compression[string(n.Data[i:])]; ok { // Hit. Emit a pointer instead of the rest of // the domain. return append(msg, byte(ptr>>8|0xC0), byte(ptr)), nil @@ -948,15 +1517,15 @@ // Miss. Add the suffix to the compression table if the // offset can be stored in the available 14 bytes. if len(msg) <= int(^uint16(0)>>2) { - compression[name[i:]] = len(msg) + compression[string(n.Data[i:])] = len(msg) } } } return append(msg, 0), nil } -// unpackName unpacks a domain name. -func unpackName(msg []byte, off int) (string, int, error) { +// unpack unpacks a domain name. +func (n *Name) unpack(msg []byte, off int) (int, error) { // currOff is the current working offset. currOff := off @@ -965,15 +1534,16 @@ // the usage of this name. newOff := off - // name is the domain name being unpacked. - name := make([]byte, 0, 255) - // ptr is the number of pointers followed. var ptr int + + // Name is a slice representation of the name data. + name := n.Data[:0] + Loop: for { if currOff >= len(msg) { - return "", off, errBaseLen + return off, errBaseLen } c := int(msg[currOff]) currOff++ @@ -985,14 +1555,14 @@ } endOff := currOff + c if endOff > len(msg) { - return "", off, errCalcLen + return off, errCalcLen } name = append(name, msg[currOff:endOff]...) name = append(name, '.') currOff = endOff case 0xC0: // Pointer if currOff >= len(msg) { - return "", off, errInvalidPtr + return off, errInvalidPtr } c1 := msg[currOff] currOff++ @@ -1001,21 +1571,25 @@ } // Don't follow too many pointers, maybe there's a loop. if ptr++; ptr > 10 { - return "", off, errTooManyPtr + return off, errTooManyPtr } currOff = (c^0xC0)<<8 | int(c1) default: // Prefixes 0x80 and 0x40 are reserved. - return "", off, errReserved + return off, errReserved } } if len(name) == 0 { name = append(name, '.') } + if len(name) > len(n.Data) { + return off, errCalcLen + } + n.Length = uint8(len(name)) if ptr == 0 { newOff = currOff } - return string(name), newOff, nil + return newOff, nil } func skipName(msg []byte, off int) (int, error) { @@ -1061,13 +1635,13 @@ // A Question is a DNS query. type Question struct { - Name string + Name Name Type Type Class Class } func (q *Question) pack(msg []byte, compression map[string]int) ([]byte, error) { - msg, err := packName(msg, q.Name, compression) + msg, err := q.Name.pack(msg, compression) if err != nil { return msg, &nestedError{"Name", err} } @@ -1075,55 +1649,71 @@ return packClass(msg, q.Class), nil } -func unpackResource(msg []byte, off int, hdr ResourceHeader) (Resource, int, error) { +func unpackResourceBody(msg []byte, off int, hdr ResourceHeader) (ResourceBody, int, error) { var ( - r Resource + r ResourceBody err error name string ) switch hdr.Type { case TypeA: - r, err = unpackAResource(hdr, msg, off) + var rb AResource + rb, err = unpackAResource(msg, off) + r = &rb name = "A" case TypeNS: - r, err = unpackNSResource(hdr, msg, off) + var rb NSResource + rb, err = unpackNSResource(msg, off) + r = &rb name = "NS" case TypeCNAME: - r, err = unpackCNAMEResource(hdr, msg, off) + var rb CNAMEResource + rb, err = unpackCNAMEResource(msg, off) + r = &rb name = "CNAME" case TypeSOA: - r, err = unpackSOAResource(hdr, msg, off) + var rb SOAResource + rb, err = unpackSOAResource(msg, off) + r = &rb name = "SOA" case TypePTR: - r, err = unpackPTRResource(hdr, msg, off) + var rb PTRResource + rb, err = unpackPTRResource(msg, off) + r = &rb name = "PTR" case TypeMX: - r, err = unpackMXResource(hdr, msg, off) + var rb MXResource + rb, err = unpackMXResource(msg, off) + r = &rb name = "MX" case TypeTXT: - r, err = unpackTXTResource(hdr, msg, off) + var rb TXTResource + rb, err = unpackTXTResource(msg, off, hdr.Length) + r = &rb name = "TXT" case TypeAAAA: - r, err = unpackAAAAResource(hdr, msg, off) + var rb AAAAResource + rb, err = unpackAAAAResource(msg, off) + r = &rb name = "AAAA" case TypeSRV: - r, err = unpackSRVResource(hdr, msg, off) + var rb SRVResource + rb, err = unpackSRVResource(msg, off) + r = &rb name = "SRV" } if err != nil { return nil, off, &nestedError{name + " record", err} } - if r != nil { - return r, off + int(hdr.Length), nil + if r == nil { + return nil, off, errors.New("invalid resource type: " + string(hdr.Type+'0')) } - return nil, off, errors.New("invalid resource type: " + string(hdr.Type+'0')) + return r, off + int(hdr.Length), nil } // A CNAMEResource is a CNAME Resource record. type CNAMEResource struct { - ResourceHeader - - CNAME string + CNAME Name } func (r *CNAMEResource) realType() Type { @@ -1131,23 +1721,21 @@ } func (r *CNAMEResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - return packName(msg, r.CNAME, compression) + return r.CNAME.pack(msg, compression) } -func unpackCNAMEResource(hdr ResourceHeader, msg []byte, off int) (*CNAMEResource, error) { - cname, _, err := unpackName(msg, off) - if err != nil { - return nil, err +func unpackCNAMEResource(msg []byte, off int) (CNAMEResource, error) { + var cname Name + if _, err := cname.unpack(msg, off); err != nil { + return CNAMEResource{}, err } - return &CNAMEResource{hdr, cname}, nil + return CNAMEResource{cname}, nil } // An MXResource is an MX Resource record. type MXResource struct { - ResourceHeader - Pref uint16 - MX string + MX Name } func (r *MXResource) realType() Type { @@ -1157,30 +1745,28 @@ func (r *MXResource) pack(msg []byte, compression map[string]int) ([]byte, error) { oldMsg := msg msg = packUint16(msg, r.Pref) - msg, err := packName(msg, r.MX, compression) + msg, err := r.MX.pack(msg, compression) if err != nil { return oldMsg, &nestedError{"MXResource.MX", err} } return msg, nil } -func unpackMXResource(hdr ResourceHeader, msg []byte, off int) (*MXResource, error) { +func unpackMXResource(msg []byte, off int) (MXResource, error) { pref, off, err := unpackUint16(msg, off) if err != nil { - return nil, &nestedError{"Pref", err} + return MXResource{}, &nestedError{"Pref", err} } - mx, _, err := unpackName(msg, off) - if err != nil { - return nil, &nestedError{"MX", err} + var mx Name + if _, err := mx.unpack(msg, off); err != nil { + return MXResource{}, &nestedError{"MX", err} } - return &MXResource{hdr, pref, mx}, nil + return MXResource{pref, mx}, nil } // An NSResource is an NS Resource record. type NSResource struct { - ResourceHeader - - NS string + NS Name } func (r *NSResource) realType() Type { @@ -1188,22 +1774,20 @@ } func (r *NSResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - return packName(msg, r.NS, compression) + return r.NS.pack(msg, compression) } -func unpackNSResource(hdr ResourceHeader, msg []byte, off int) (*NSResource, error) { - ns, _, err := unpackName(msg, off) - if err != nil { - return nil, err +func unpackNSResource(msg []byte, off int) (NSResource, error) { + var ns Name + if _, err := ns.unpack(msg, off); err != nil { + return NSResource{}, err } - return &NSResource{hdr, ns}, nil + return NSResource{ns}, nil } // A PTRResource is a PTR Resource record. type PTRResource struct { - ResourceHeader - - PTR string + PTR Name } func (r *PTRResource) realType() Type { @@ -1211,23 +1795,21 @@ } func (r *PTRResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - return packName(msg, r.PTR, compression) + return r.PTR.pack(msg, compression) } -func unpackPTRResource(hdr ResourceHeader, msg []byte, off int) (*PTRResource, error) { - ptr, _, err := unpackName(msg, off) - if err != nil { - return nil, err +func unpackPTRResource(msg []byte, off int) (PTRResource, error) { + var ptr Name + if _, err := ptr.unpack(msg, off); err != nil { + return PTRResource{}, err } - return &PTRResource{hdr, ptr}, nil + return PTRResource{ptr}, nil } // An SOAResource is an SOA Resource record. type SOAResource struct { - ResourceHeader - - NS string - MBox string + NS Name + MBox Name Serial uint32 Refresh uint32 Retry uint32 @@ -1245,11 +1827,11 @@ func (r *SOAResource) pack(msg []byte, compression map[string]int) ([]byte, error) { oldMsg := msg - msg, err := packName(msg, r.NS, compression) + msg, err := r.NS.pack(msg, compression) if err != nil { return oldMsg, &nestedError{"SOAResource.NS", err} } - msg, err = packName(msg, r.MBox, compression) + msg, err = r.MBox.pack(msg, compression) if err != nil { return oldMsg, &nestedError{"SOAResource.MBox", err} } @@ -1260,42 +1842,41 @@ return packUint32(msg, r.MinTTL), nil } -func unpackSOAResource(hdr ResourceHeader, msg []byte, off int) (*SOAResource, error) { - ns, off, err := unpackName(msg, off) - if err != nil { - return nil, &nestedError{"NS", err} - } - mbox, off, err := unpackName(msg, off) - if err != nil { - return nil, &nestedError{"MBox", err} +func unpackSOAResource(msg []byte, off int) (SOAResource, error) { + var ns Name + off, err := ns.unpack(msg, off) + if err != nil { + return SOAResource{}, &nestedError{"NS", err} + } + var mbox Name + if off, err = mbox.unpack(msg, off); err != nil { + return SOAResource{}, &nestedError{"MBox", err} } serial, off, err := unpackUint32(msg, off) if err != nil { - return nil, &nestedError{"Serial", err} + return SOAResource{}, &nestedError{"Serial", err} } refresh, off, err := unpackUint32(msg, off) if err != nil { - return nil, &nestedError{"Refresh", err} + return SOAResource{}, &nestedError{"Refresh", err} } retry, off, err := unpackUint32(msg, off) if err != nil { - return nil, &nestedError{"Retry", err} + return SOAResource{}, &nestedError{"Retry", err} } expire, off, err := unpackUint32(msg, off) if err != nil { - return nil, &nestedError{"Expire", err} + return SOAResource{}, &nestedError{"Expire", err} } minTTL, _, err := unpackUint32(msg, off) if err != nil { - return nil, &nestedError{"MinTTL", err} + return SOAResource{}, &nestedError{"MinTTL", err} } - return &SOAResource{hdr, ns, mbox, serial, refresh, retry, expire, minTTL}, nil + return SOAResource{ns, mbox, serial, refresh, retry, expire, minTTL}, nil } // A TXTResource is a TXT Resource record. type TXTResource struct { - ResourceHeader - Txt string // Not a domain name. } @@ -1307,32 +1888,30 @@ return packText(msg, r.Txt), nil } -func unpackTXTResource(hdr ResourceHeader, msg []byte, off int) (*TXTResource, error) { +func unpackTXTResource(msg []byte, off int, length uint16) (TXTResource, error) { var txt string - for n := uint16(0); n < hdr.Length; { + for n := uint16(0); n < length; { var t string var err error if t, off, err = unpackText(msg, off); err != nil { - return nil, &nestedError{"text", err} + return TXTResource{}, &nestedError{"text", err} } // Check if we got too many bytes. - if hdr.Length-n < uint16(len(t))+1 { - return nil, errCalcLen + if length-n < uint16(len(t))+1 { + return TXTResource{}, errCalcLen } n += uint16(len(t)) + 1 txt += t } - return &TXTResource{hdr, txt}, nil + return TXTResource{txt}, nil } // An SRVResource is an SRV Resource record. type SRVResource struct { - ResourceHeader - Priority uint16 Weight uint16 Port uint16 - Target string // Not compressed as per RFC 2782. + Target Name // Not compressed as per RFC 2782. } func (r *SRVResource) realType() Type { @@ -1344,37 +1923,35 @@ msg = packUint16(msg, r.Priority) msg = packUint16(msg, r.Weight) msg = packUint16(msg, r.Port) - msg, err := packName(msg, r.Target, nil) + msg, err := r.Target.pack(msg, nil) if err != nil { return oldMsg, &nestedError{"SRVResource.Target", err} } return msg, nil } -func unpackSRVResource(hdr ResourceHeader, msg []byte, off int) (*SRVResource, error) { +func unpackSRVResource(msg []byte, off int) (SRVResource, error) { priority, off, err := unpackUint16(msg, off) if err != nil { - return nil, &nestedError{"Priority", err} + return SRVResource{}, &nestedError{"Priority", err} } weight, off, err := unpackUint16(msg, off) if err != nil { - return nil, &nestedError{"Weight", err} + return SRVResource{}, &nestedError{"Weight", err} } port, off, err := unpackUint16(msg, off) if err != nil { - return nil, &nestedError{"Port", err} + return SRVResource{}, &nestedError{"Port", err} } - target, _, err := unpackName(msg, off) - if err != nil { - return nil, &nestedError{"Target", err} + var target Name + if _, err := target.unpack(msg, off); err != nil { + return SRVResource{}, &nestedError{"Target", err} } - return &SRVResource{hdr, priority, weight, port, target}, nil + return SRVResource{priority, weight, port, target}, nil } // An AResource is an A Resource record. type AResource struct { - ResourceHeader - A [4]byte } @@ -1386,18 +1963,16 @@ return packBytes(msg, r.A[:]), nil } -func unpackAResource(hdr ResourceHeader, msg []byte, off int) (*AResource, error) { +func unpackAResource(msg []byte, off int) (AResource, error) { var a [4]byte if _, err := unpackBytes(msg, off, a[:]); err != nil { - return nil, err + return AResource{}, err } - return &AResource{hdr, a}, nil + return AResource{a}, nil } // An AAAAResource is an AAAA Resource record. type AAAAResource struct { - ResourceHeader - AAAA [16]byte } @@ -1409,10 +1984,10 @@ return packBytes(msg, r.AAAA[:]), nil } -func unpackAAAAResource(hdr ResourceHeader, msg []byte, off int) (*AAAAResource, error) { +func unpackAAAAResource(msg []byte, off int) (AAAAResource, error) { var aaaa [16]byte if _, err := unpackBytes(msg, off, aaaa[:]); err != nil { - return nil, err + return AAAAResource{}, err } - return &AAAAResource{hdr, aaaa}, nil + return AAAAResource{aaaa}, nil } diff -Nru lxd-2.14/dist/src/golang.org/x/net/dns/dnsmessage/message_test.go lxd-2.15/dist/src/golang.org/x/net/dns/dnsmessage/message_test.go --- lxd-2.14/dist/src/golang.org/x/net/dns/dnsmessage/message_test.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/dns/dnsmessage/message_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -5,13 +5,20 @@ package dnsmessage import ( + "bytes" "fmt" - "net" "reflect" - "strings" "testing" ) +func mustNewName(name string) Name { + n, err := NewName(name) + if err != nil { + panic(err) + } + return n +} + func (m *Message) String() string { s := fmt.Sprintf("Message: %#v\n", &m.Header) if len(m.Questions) > 0 { @@ -41,9 +48,17 @@ return s } +func TestNameString(t *testing.T) { + want := "foo" + name := mustNewName(want) + if got := fmt.Sprint(name); got != want { + t.Errorf("got fmt.Sprint(%#v) = %s, want = %s", name, got, want) + } +} + func TestQuestionPackUnpack(t *testing.T) { want := Question{ - Name: ".", + Name: mustNewName("."), Type: TypeA, Class: ClassINET, } @@ -68,16 +83,42 @@ } } +func TestName(t *testing.T) { + tests := []string{ + "", + ".", + "google..com", + "google.com", + "google..com.", + "google.com.", + ".google.com.", + "www..google.com.", + "www.google.com.", + } + + for _, test := range tests { + n, err := NewName(test) + if err != nil { + t.Errorf("Creating name for %q: %v", test, err) + continue + } + if ns := n.String(); ns != test { + t.Errorf("Got %#v.String() = %q, want = %q", n, ns, test) + continue + } + } +} + func TestNamePackUnpack(t *testing.T) { tests := []struct { in string want string err error }{ - {"", ".", nil}, + {"", "", errNonCanonicalName}, {".", ".", nil}, - {"google..com", "", errZeroSegLen}, - {"google.com", "google.com.", nil}, + {"google..com", "", errNonCanonicalName}, + {"google.com", "", errNonCanonicalName}, {"google..com.", "", errZeroSegLen}, {"google.com.", "google.com.", nil}, {".google.com.", "", errZeroSegLen}, @@ -86,29 +127,91 @@ } for _, test := range tests { - buf, err := packName(make([]byte, 0, 30), test.in, map[string]int{}) + in := mustNewName(test.in) + want := mustNewName(test.want) + buf, err := in.pack(make([]byte, 0, 30), map[string]int{}) if err != test.err { - t.Errorf("Packing of %s: got err = %v, want err = %v", test.in, err, test.err) + t.Errorf("Packing of %q: got err = %v, want err = %v", test.in, err, test.err) continue } if test.err != nil { continue } - got, n, err := unpackName(buf, 0) + var got Name + n, err := got.unpack(buf, 0) if err != nil { - t.Errorf("Unpacking for %s failed: %v", test.in, err) + t.Errorf("Unpacking for %q failed: %v", test.in, err) continue } if n != len(buf) { t.Errorf( - "Unpacked different amount than packed for %s: got n = %d, want = %d", + "Unpacked different amount than packed for %q: got n = %d, want = %d", test.in, n, len(buf), ) } - if got != test.want { - t.Errorf("Unpacking packing of %s: got = %s, want = %s", test.in, got, test.want) + if got != want { + t.Errorf("Unpacking packing of %q: got = %#v, want = %#v", test.in, got, want) + } + } +} + +func checkErrorPrefix(err error, prefix string) bool { + e, ok := err.(*nestedError) + return ok && e.s == prefix +} + +func TestHeaderUnpackError(t *testing.T) { + wants := []string{ + "id", + "bits", + "questions", + "answers", + "authorities", + "additionals", + } + var buf []byte + var h header + for _, want := range wants { + n, err := h.unpack(buf, 0) + if n != 0 || !checkErrorPrefix(err, want) { + t.Errorf("got h.unpack([%d]byte, 0) = %d, %v, want = 0, %s", len(buf), n, err, want) + } + buf = append(buf, 0, 0) + } +} + +func TestParserStart(t *testing.T) { + const want = "unpacking header" + var p Parser + for i := 0; i <= 1; i++ { + _, err := p.Start([]byte{}) + if !checkErrorPrefix(err, want) { + t.Errorf("got p.Start(nil) = _, %v, want = _, %s", err, want) + } + } +} + +func TestResourceNotStarted(t *testing.T) { + tests := []struct { + name string + fn func(*Parser) error + }{ + {"CNAMEResource", func(p *Parser) error { _, err := p.CNAMEResource(); return err }}, + {"MXResource", func(p *Parser) error { _, err := p.MXResource(); return err }}, + {"NSResource", func(p *Parser) error { _, err := p.NSResource(); return err }}, + {"PTRResource", func(p *Parser) error { _, err := p.PTRResource(); return err }}, + {"SOAResource", func(p *Parser) error { _, err := p.SOAResource(); return err }}, + {"TXTResource", func(p *Parser) error { _, err := p.TXTResource(); return err }}, + {"SRVResource", func(p *Parser) error { _, err := p.SRVResource(); return err }}, + {"AResource", func(p *Parser) error { _, err := p.AResource(); return err }}, + {"AAAAResource", func(p *Parser) error { _, err := p.AAAAResource(); return err }}, + } + + for _, test := range tests { + if err := test.fn(&Parser{}); err != ErrNotStarted { + t.Errorf("got _, %v = p.%s(), want = _, %v", err, test.name, ErrNotStarted) } } } @@ -118,7 +221,7 @@ { Questions: []Question{ { - Name: ".", + Name: mustNewName("."), Type: TypeAAAA, Class: ClassINET, }, @@ -238,206 +341,481 @@ } func TestVeryLongTxt(t *testing.T) { - want := &TXTResource{ - ResourceHeader: ResourceHeader{ - Name: "foo.bar.example.com.", + want := Resource{ + ResourceHeader{ + Name: mustNewName("foo.bar.example.com."), Type: TypeTXT, Class: ClassINET, }, - Txt: loremIpsum, + &TXTResource{loremIpsum}, } - buf, err := packResource(make([]byte, 0, 8000), want, map[string]int{}) + buf, err := want.pack(make([]byte, 0, 8000), map[string]int{}) if err != nil { t.Fatal("Packing failed:", err) } - var hdr ResourceHeader - off, err := hdr.unpack(buf, 0) + var got Resource + off, err := got.Header.unpack(buf, 0) if err != nil { t.Fatal("Unpacking ResourceHeader failed:", err) } - got, n, err := unpackResource(buf, off, hdr) + body, n, err := unpackResourceBody(buf, off, got.Header) if err != nil { t.Fatal("Unpacking failed:", err) } + got.Body = body if n != len(buf) { t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", n, len(buf)) } if !reflect.DeepEqual(got, want) { - t.Errorf("Got = %+v, want = %+v", got, want) + t.Errorf("Got = %#v, want = %#v", got, want) + } +} + +func TestStartError(t *testing.T) { + tests := []struct { + name string + fn func(*Builder) error + }{ + {"Questions", func(b *Builder) error { return b.StartQuestions() }}, + {"Answers", func(b *Builder) error { return b.StartAnswers() }}, + {"Authorities", func(b *Builder) error { return b.StartAuthorities() }}, + {"Additionals", func(b *Builder) error { return b.StartAdditionals() }}, + } + + envs := []struct { + name string + fn func() *Builder + want error + }{ + {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted}, + {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone}, + } + + for _, env := range envs { + for _, test := range tests { + if got := test.fn(env.fn()); got != env.want { + t.Errorf("got Builder{%s}.Start%s = %v, want = %v", env.name, test.name, got, env.want) + } + } + } +} + +func TestBuilderResourceError(t *testing.T) { + tests := []struct { + name string + fn func(*Builder) error + }{ + {"CNAMEResource", func(b *Builder) error { return b.CNAMEResource(ResourceHeader{}, CNAMEResource{}) }}, + {"MXResource", func(b *Builder) error { return b.MXResource(ResourceHeader{}, MXResource{}) }}, + {"NSResource", func(b *Builder) error { return b.NSResource(ResourceHeader{}, NSResource{}) }}, + {"PTRResource", func(b *Builder) error { return b.PTRResource(ResourceHeader{}, PTRResource{}) }}, + {"SOAResource", func(b *Builder) error { return b.SOAResource(ResourceHeader{}, SOAResource{}) }}, + {"TXTResource", func(b *Builder) error { return b.TXTResource(ResourceHeader{}, TXTResource{}) }}, + {"SRVResource", func(b *Builder) error { return b.SRVResource(ResourceHeader{}, SRVResource{}) }}, + {"AResource", func(b *Builder) error { return b.AResource(ResourceHeader{}, AResource{}) }}, + {"AAAAResource", func(b *Builder) error { return b.AAAAResource(ResourceHeader{}, AAAAResource{}) }}, + } + + envs := []struct { + name string + fn func() *Builder + want error + }{ + {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted}, + {"sectionHeader", func() *Builder { return &Builder{section: sectionHeader} }, ErrNotStarted}, + {"sectionQuestions", func() *Builder { return &Builder{section: sectionQuestions} }, ErrNotStarted}, + {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone}, + } + + for _, env := range envs { + for _, test := range tests { + if got := test.fn(env.fn()); got != env.want { + t.Errorf("got Builder{%s}.%s = %v, want = %v", env.name, test.name, got, env.want) + } + } + } +} + +func TestFinishError(t *testing.T) { + var b Builder + want := ErrNotStarted + if _, got := b.Finish(); got != want { + t.Errorf("got Builder{}.Finish() = %v, want = %v", got, want) } } -func ExampleHeaderSearch() { +func TestBuilder(t *testing.T) { + msg := largeTestMsg() + want, err := msg.Pack() + if err != nil { + t.Fatal("Packing without builder:", err) + } + + var b Builder + b.Start(nil, msg.Header) + + if err := b.StartQuestions(); err != nil { + t.Fatal("b.StartQuestions():", err) + } + for _, q := range msg.Questions { + if err := b.Question(q); err != nil { + t.Fatalf("b.Question(%#v): %v", q, err) + } + } + + if err := b.StartAnswers(); err != nil { + t.Fatal("b.StartAnswers():", err) + } + for _, a := range msg.Answers { + switch a.Header.Type { + case TypeA: + if err := b.AResource(a.Header, *a.Body.(*AResource)); err != nil { + t.Fatalf("b.AResource(%#v): %v", a, err) + } + case TypeNS: + if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil { + t.Fatalf("b.NSResource(%#v): %v", a, err) + } + case TypeCNAME: + if err := b.CNAMEResource(a.Header, *a.Body.(*CNAMEResource)); err != nil { + t.Fatalf("b.CNAMEResource(%#v): %v", a, err) + } + case TypeSOA: + if err := b.SOAResource(a.Header, *a.Body.(*SOAResource)); err != nil { + t.Fatalf("b.SOAResource(%#v): %v", a, err) + } + case TypePTR: + if err := b.PTRResource(a.Header, *a.Body.(*PTRResource)); err != nil { + t.Fatalf("b.PTRResource(%#v): %v", a, err) + } + case TypeMX: + if err := b.MXResource(a.Header, *a.Body.(*MXResource)); err != nil { + t.Fatalf("b.MXResource(%#v): %v", a, err) + } + case TypeTXT: + if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil { + t.Fatalf("b.TXTResource(%#v): %v", a, err) + } + case TypeAAAA: + if err := b.AAAAResource(a.Header, *a.Body.(*AAAAResource)); err != nil { + t.Fatalf("b.AAAAResource(%#v): %v", a, err) + } + case TypeSRV: + if err := b.SRVResource(a.Header, *a.Body.(*SRVResource)); err != nil { + t.Fatalf("b.SRVResource(%#v): %v", a, err) + } + } + } + + if err := b.StartAuthorities(); err != nil { + t.Fatal("b.StartAuthorities():", err) + } + for _, a := range msg.Authorities { + if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil { + t.Fatalf("b.NSResource(%#v): %v", a, err) + } + } + + if err := b.StartAdditionals(); err != nil { + t.Fatal("b.StartAdditionals():", err) + } + for _, a := range msg.Additionals { + if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil { + t.Fatalf("b.TXTResource(%#v): %v", a, err) + } + } + + got, err := b.Finish() + if err != nil { + t.Fatal("b.Finish():", err) + } + if !bytes.Equal(got, want) { + t.Fatalf("Got from Builder: %#v\nwant = %#v", got, want) + } +} + +func BenchmarkParsing(b *testing.B) { + b.ReportAllocs() + + name := mustNewName("foo.bar.example.com.") msg := Message{ Header: Header{Response: true, Authoritative: true}, Questions: []Question{ { - Name: "foo.bar.example.com.", - Type: TypeA, - Class: ClassINET, - }, - { - Name: "bar.example.com.", + Name: name, Type: TypeA, Class: ClassINET, }, }, Answers: []Resource{ - &AResource{ - ResourceHeader: ResourceHeader{ - Name: "foo.bar.example.com.", - Type: TypeA, + { + ResourceHeader{ + Name: name, Class: ClassINET, }, - A: [4]byte{127, 0, 0, 1}, + &AResource{[4]byte{}}, }, - &AResource{ - ResourceHeader: ResourceHeader{ - Name: "bar.example.com.", - Type: TypeA, + { + ResourceHeader{ + Name: name, + Class: ClassINET, + }, + &AAAAResource{[16]byte{}}, + }, + { + ResourceHeader{ + Name: name, Class: ClassINET, }, - A: [4]byte{127, 0, 0, 2}, + &CNAMEResource{name}, + }, + { + ResourceHeader{ + Name: name, + Class: ClassINET, + }, + &NSResource{name}, }, }, } buf, err := msg.Pack() if err != nil { - panic(err) - } - - wantName := "bar.example.com." - - var p Parser - if _, err := p.Start(buf); err != nil { - panic(err) + b.Fatal("msg.Pack():", err) } - for { - q, err := p.Question() - if err == ErrSectionDone { - break - } - if err != nil { - panic(err) + for i := 0; i < b.N; i++ { + var p Parser + if _, err := p.Start(buf); err != nil { + b.Fatal("p.Start(buf):", err) } - if q.Name != wantName { - continue + for { + _, err := p.Question() + if err == ErrSectionDone { + break + } + if err != nil { + b.Fatal("p.Question():", err) + } } - fmt.Println("Found question for name", wantName) - if err := p.SkipAllQuestions(); err != nil { - panic(err) - } - break + for { + h, err := p.AnswerHeader() + if err == ErrSectionDone { + break + } + if err != nil { + panic(err) + } + + switch h.Type { + case TypeA: + if _, err := p.AResource(); err != nil { + b.Fatal("p.AResource():", err) + } + case TypeAAAA: + if _, err := p.AAAAResource(); err != nil { + b.Fatal("p.AAAAResource():", err) + } + case TypeCNAME: + if _, err := p.CNAMEResource(); err != nil { + b.Fatal("p.CNAMEResource():", err) + } + case TypeNS: + if _, err := p.NSResource(); err != nil { + b.Fatal("p.NSResource():", err) + } + default: + b.Fatalf("unknown type: %T", h) + } + } } +} + +func BenchmarkBuilding(b *testing.B) { + b.ReportAllocs() + + name := mustNewName("foo.bar.example.com.") + buf := make([]byte, 0, packStartingCap) - var gotIPs []net.IP - for { - h, err := p.AnswerHeader() - if err == ErrSectionDone { - break + for i := 0; i < b.N; i++ { + var bld Builder + bld.StartWithoutCompression(buf, Header{Response: true, Authoritative: true}) + + if err := bld.StartQuestions(); err != nil { + b.Fatal("bld.StartQuestions():", err) + } + q := Question{ + Name: name, + Type: TypeA, + Class: ClassINET, } - if err != nil { - panic(err) + if err := bld.Question(q); err != nil { + b.Fatalf("bld.Question(%+v): %v", q, err) } - if (h.Type != TypeA && h.Type != TypeAAAA) || h.Class != ClassINET { - continue + hdr := ResourceHeader{ + Name: name, + Class: ClassINET, + } + if err := bld.StartAnswers(); err != nil { + b.Fatal("bld.StartQuestions():", err) } - if !strings.EqualFold(h.Name, wantName) { - if err := p.SkipAnswer(); err != nil { - panic(err) - } - continue + ar := AResource{[4]byte{}} + if err := bld.AResource(hdr, ar); err != nil { + b.Fatalf("bld.AResource(%+v, %+v): %v", hdr, ar, err) } - a, err := p.Answer() - if err != nil { - panic(err) + + aaar := AAAAResource{[16]byte{}} + if err := bld.AAAAResource(hdr, aaar); err != nil { + b.Fatalf("bld.AAAAResource(%+v, %+v): %v", hdr, aaar, err) } - switch r := a.(type) { - default: - panic(fmt.Sprintf("unknown type: %T", r)) - case *AResource: - gotIPs = append(gotIPs, r.A[:]) - case *AAAAResource: - gotIPs = append(gotIPs, r.AAAA[:]) + cnr := CNAMEResource{name} + if err := bld.CNAMEResource(hdr, cnr); err != nil { + b.Fatalf("bld.CNAMEResource(%+v, %+v): %v", hdr, cnr, err) } - } - fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs) + nsr := NSResource{name} + if err := bld.NSResource(hdr, nsr); err != nil { + b.Fatalf("bld.NSResource(%+v, %+v): %v", hdr, nsr, err) + } - // Output: - // Found question for name bar.example.com. - // Found A/AAAA records for name bar.example.com.: [127.0.0.2] + if _, err := bld.Finish(); err != nil { + b.Fatal("bld.Finish():", err) + } + } } func largeTestMsg() Message { + name := mustNewName("foo.bar.example.com.") return Message{ Header: Header{Response: true, Authoritative: true}, Questions: []Question{ { - Name: "foo.bar.example.com.", + Name: name, Type: TypeA, Class: ClassINET, }, }, Answers: []Resource{ - &AResource{ - ResourceHeader: ResourceHeader{ - Name: "foo.bar.example.com.", + { + ResourceHeader{ + Name: name, Type: TypeA, Class: ClassINET, }, - A: [4]byte{127, 0, 0, 1}, + &AResource{[4]byte{127, 0, 0, 1}}, }, - &AResource{ - ResourceHeader: ResourceHeader{ - Name: "foo.bar.example.com.", + { + ResourceHeader{ + Name: name, Type: TypeA, Class: ClassINET, }, - A: [4]byte{127, 0, 0, 2}, + &AResource{[4]byte{127, 0, 0, 2}}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeAAAA, + Class: ClassINET, + }, + &AAAAResource{[16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeCNAME, + Class: ClassINET, + }, + &CNAMEResource{mustNewName("alias.example.com.")}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeSOA, + Class: ClassINET, + }, + &SOAResource{ + NS: mustNewName("ns1.example.com."), + MBox: mustNewName("mb.example.com."), + Serial: 1, + Refresh: 2, + Retry: 3, + Expire: 4, + MinTTL: 5, + }, + }, + { + ResourceHeader{ + Name: name, + Type: TypePTR, + Class: ClassINET, + }, + &PTRResource{mustNewName("ptr.example.com.")}, + }, + { + ResourceHeader{ + Name: name, + Type: TypeMX, + Class: ClassINET, + }, + &MXResource{ + 7, + mustNewName("mx.example.com."), + }, + }, + { + ResourceHeader{ + Name: name, + Type: TypeSRV, + Class: ClassINET, + }, + &SRVResource{ + 8, + 9, + 11, + mustNewName("srv.example.com."), + }, }, }, Authorities: []Resource{ - &NSResource{ - ResourceHeader: ResourceHeader{ - Name: "foo.bar.example.com.", + { + ResourceHeader{ + Name: name, Type: TypeNS, Class: ClassINET, }, - NS: "ns1.example.com.", + &NSResource{mustNewName("ns1.example.com.")}, }, - &NSResource{ - ResourceHeader: ResourceHeader{ - Name: "foo.bar.example.com.", + { + ResourceHeader{ + Name: name, Type: TypeNS, Class: ClassINET, }, - NS: "ns2.example.com.", + &NSResource{mustNewName("ns2.example.com.")}, }, }, Additionals: []Resource{ - &TXTResource{ - ResourceHeader: ResourceHeader{ - Name: "foo.bar.example.com.", + { + ResourceHeader{ + Name: name, Type: TypeTXT, Class: ClassINET, }, - Txt: "So Long, and Thanks for All the Fish", + &TXTResource{"So Long, and Thanks for All the Fish"}, }, - &TXTResource{ - ResourceHeader: ResourceHeader{ - Name: "foo.bar.example.com.", + { + ResourceHeader{ + Name: name, Type: TypeTXT, Class: ClassINET, }, - Txt: "Hamster Huey and the Gooey Kablooie", + &TXTResource{"Hamster Huey and the Gooey Kablooie"}, }, }, } diff -Nru lxd-2.14/dist/src/golang.org/x/net/http2/errors.go lxd-2.15/dist/src/golang.org/x/net/http2/errors.go --- lxd-2.14/dist/src/golang.org/x/net/http2/errors.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/http2/errors.go 2017-06-28 03:01:38.000000000 +0000 @@ -87,13 +87,16 @@ func (goAwayFlowError) Error() string { return "connection exceeded flow control window size" } -// connErrorReason wraps a ConnectionError with an informative error about why it occurs. - +// connError represents an HTTP/2 ConnectionError error code, along +// with a string (for debugging) explaining why. +// // Errors of this type are only returned by the frame parser functions -// and converted into ConnectionError(ErrCodeProtocol). +// and converted into ConnectionError(Code), after stashing away +// the Reason into the Framer's errDetail field, accessible via +// the (*Framer).ErrorDetail method. type connError struct { - Code ErrCode - Reason string + Code ErrCode // the ConnectionError error code + Reason string // additional reason } func (e connError) Error() string { diff -Nru lxd-2.14/dist/src/golang.org/x/net/http2/go18.go lxd-2.15/dist/src/golang.org/x/net/http2/go18.go --- lxd-2.14/dist/src/golang.org/x/net/http2/go18.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/http2/go18.go 2017-06-28 03:01:38.000000000 +0000 @@ -52,3 +52,5 @@ func reqBodyIsNoBody(body io.ReadCloser) bool { return body == http.NoBody } + +func go18httpNoBody() io.ReadCloser { return http.NoBody } // for tests only diff -Nru lxd-2.14/dist/src/golang.org/x/net/http2/http2.go lxd-2.15/dist/src/golang.org/x/net/http2/http2.go --- lxd-2.14/dist/src/golang.org/x/net/http2/http2.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/http2/http2.go 2017-06-28 03:01:38.000000000 +0000 @@ -376,12 +376,16 @@ // validPseudoPath reports whether v is a valid :path pseudo-header // value. It must be either: // -// *) a non-empty string starting with '/', but not with with "//", +// *) a non-empty string starting with '/' // *) the string '*', for OPTIONS requests. // // For now this is only used a quick check for deciding when to clean // up Opaque URLs before sending requests from the Transport. // See golang.org/issue/16847 +// +// We used to enforce that the path also didn't start with "//", but +// Google's GFE accepts such paths and Chrome sends them, so ignore +// that part of the spec. See golang.org/issue/19103. func validPseudoPath(v string) bool { - return (len(v) > 0 && v[0] == '/' && (len(v) == 1 || v[1] != '/')) || v == "*" + return (len(v) > 0 && v[0] == '/') || v == "*" } diff -Nru lxd-2.14/dist/src/golang.org/x/net/http2/not_go18.go lxd-2.15/dist/src/golang.org/x/net/http2/not_go18.go --- lxd-2.14/dist/src/golang.org/x/net/http2/not_go18.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/http2/not_go18.go 2017-06-28 03:01:38.000000000 +0000 @@ -25,3 +25,5 @@ } func reqBodyIsNoBody(io.ReadCloser) bool { return false } + +func go18httpNoBody() io.ReadCloser { return nil } // for tests only diff -Nru lxd-2.14/dist/src/golang.org/x/net/http2/server.go lxd-2.15/dist/src/golang.org/x/net/http2/server.go --- lxd-2.14/dist/src/golang.org/x/net/http2/server.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/http2/server.go 2017-06-28 03:01:38.000000000 +0000 @@ -2252,6 +2252,7 @@ wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. sentHeader bool // have we sent the header frame? handlerDone bool // handler has finished + dirty bool // a Write failed; don't reuse this responseWriterState sentContentLen int64 // non-zero if handler set a Content-Length header wroteBytes int64 @@ -2333,6 +2334,7 @@ date: date, }) if err != nil { + rws.dirty = true return 0, err } if endStream { @@ -2354,6 +2356,7 @@ if len(p) > 0 || endStream { // only send a 0 byte DATA frame if we're ending the stream. if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { + rws.dirty = true return 0, err } } @@ -2365,6 +2368,9 @@ trailers: rws.trailers, endStream: true, }) + if err != nil { + rws.dirty = true + } return len(p), err } return len(p), nil @@ -2504,7 +2510,7 @@ // // * Handler calls w.Write or w.WriteString -> // * -> rws.bw (*bufio.Writer) -> -// * (Handler migth call Flush) +// * (Handler might call Flush) // * -> chunkWriter{rws} // * -> responseWriterState.writeChunk(p []byte) // * -> responseWriterState.writeChunk (most of the magic; see comment there) @@ -2543,10 +2549,19 @@ func (w *responseWriter) handlerDone() { rws := w.rws + dirty := rws.dirty rws.handlerDone = true w.Flush() w.rws = nil - responseWriterStatePool.Put(rws) + if !dirty { + // Only recycle the pool if all prior Write calls to + // the serverConn goroutine completed successfully. If + // they returned earlier due to resets from the peer + // there might still be write goroutines outstanding + // from the serverConn referencing the rws memory. See + // issue 20704. + responseWriterStatePool.Put(rws) + } } // Push errors. diff -Nru lxd-2.14/dist/src/golang.org/x/net/http2/server_test.go lxd-2.15/dist/src/golang.org/x/net/http2/server_test.go --- lxd-2.14/dist/src/golang.org/x/net/http2/server_test.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/http2/server_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -3685,3 +3685,37 @@ <-done } } + +func TestIssue20704Race(t *testing.T) { + if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" { + t.Skip("skipping in short mode") + } + const ( + itemSize = 1 << 10 + itemCount = 100 + ) + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + for i := 0; i < itemCount; i++ { + _, err := w.Write(make([]byte, itemSize)) + if err != nil { + return + } + } + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + cl := &http.Client{Transport: tr} + + for i := 0; i < 1000; i++ { + resp, err := cl.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + // Force a RST stream to the server by closing without + // reading the body: + resp.Body.Close() + } +} diff -Nru lxd-2.14/dist/src/golang.org/x/net/http2/transport.go lxd-2.15/dist/src/golang.org/x/net/http2/transport.go --- lxd-2.14/dist/src/golang.org/x/net/http2/transport.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/http2/transport.go 2017-06-28 03:01:38.000000000 +0000 @@ -694,7 +694,7 @@ // req.ContentLength, where 0 actually means zero (not unknown) and -1 // means unknown. func actualContentLength(req *http.Request) int64 { - if req.Body == nil { + if req.Body == nil || reqBodyIsNoBody(req.Body) { return 0 } if req.ContentLength != 0 { @@ -725,8 +725,8 @@ } body := req.Body - hasBody := body != nil contentLen := actualContentLength(req) + hasBody := contentLen != 0 // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere? var requestedGzip bool diff -Nru lxd-2.14/dist/src/golang.org/x/net/http2/transport_test.go lxd-2.15/dist/src/golang.org/x/net/http2/transport_test.go --- lxd-2.14/dist/src/golang.org/x/net/http2/transport_test.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/http2/transport_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -417,6 +417,11 @@ req: &http.Request{Body: panicReader{}, ContentLength: 5}, want: 5, }, + // http.NoBody means 0, not -1. + 3: { + req: &http.Request{Body: go18httpNoBody()}, + want: 0, + }, } for i, tt := range tests { got := actualContentLength(tt.req) @@ -2529,7 +2534,7 @@ } } -// golangorg/issue/16847 +// golang.org/issue/16847, golang.org/issue/19103 func TestTransportRequestPathPseudo(t *testing.T) { type result struct { path string @@ -2549,9 +2554,9 @@ }, want: result{path: "/foo"}, }, - // I guess we just don't let users request "//foo" as - // a path, since it's illegal to start with two - // slashes.... + // In Go 1.7, we accepted paths of "//foo". + // In Go 1.8, we rejected it (issue 16847). + // In Go 1.9, we accepted it again (issue 19103). 1: { req: &http.Request{ Method: "GET", @@ -2560,7 +2565,7 @@ Path: "//foo", }, }, - want: result{err: `invalid request :path "//foo"`}, + want: result{path: "//foo"}, }, // Opaque with //$Matching_Hostname/path @@ -2969,3 +2974,42 @@ t.Errorf("Handler Write err = %v; want errStreamClosed", gotErr) } } + +// Issue 18891: make sure Request.Body == NoBody means no DATA frame +// is ever sent, even if empty. +func TestTransportNoBodyMeansNoDATA(t *testing.T) { + ct := newClientTester(t) + + unblockClient := make(chan bool) + + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", go18httpNoBody()) + ct.tr.RoundTrip(req) + <-unblockClient + return nil + } + ct.server = func() error { + defer close(unblockClient) + defer ct.cc.(*net.TCPConn).Close() + ct.greet() + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return fmt.Errorf("ReadFrame while waiting for Headers: %v", err) + } + switch f := f.(type) { + default: + return fmt.Errorf("Got %T; want HeadersFrame", f) + case *WindowUpdateFrame, *SettingsFrame: + continue + case *HeadersFrame: + if !f.StreamEnded() { + return fmt.Errorf("got headers frame without END_STREAM") + } + return nil + } + } + } + ct.run() +} diff -Nru lxd-2.14/dist/src/golang.org/x/net/icmp/helper.go lxd-2.15/dist/src/golang.org/x/net/icmp/helper.go --- lxd-2.14/dist/src/golang.org/x/net/icmp/helper.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/icmp/helper.go 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -import ( - "encoding/binary" - "unsafe" -) - -var ( - // See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. - freebsdVersion uint32 - - nativeEndian binary.ByteOrder -) - -func init() { - i := uint32(1) - b := (*[4]byte)(unsafe.Pointer(&i)) - if b[0] == 1 { - nativeEndian = binary.LittleEndian - } else { - nativeEndian = binary.BigEndian - } -} diff -Nru lxd-2.14/dist/src/golang.org/x/net/icmp/ipv4.go lxd-2.15/dist/src/golang.org/x/net/icmp/ipv4.go --- lxd-2.14/dist/src/golang.org/x/net/icmp/ipv4.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/icmp/ipv4.go 2017-06-28 03:01:38.000000000 +0000 @@ -9,9 +9,14 @@ "net" "runtime" + "golang.org/x/net/internal/socket" "golang.org/x/net/ipv4" ) +// freebsdVersion is set in sys_freebsd.go. +// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. +var freebsdVersion uint32 + // ParseIPv4Header parses b as an IPv4 header of ICMP error message // invoking packet, which is contained in ICMP error message. func ParseIPv4Header(b []byte) (*ipv4.Header, error) { @@ -36,12 +41,12 @@ } switch runtime.GOOS { case "darwin": - h.TotalLen = int(nativeEndian.Uint16(b[2:4])) + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) case "freebsd": if freebsdVersion >= 1000000 { h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) } else { - h.TotalLen = int(nativeEndian.Uint16(b[2:4])) + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) } default: h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) diff -Nru lxd-2.14/dist/src/golang.org/x/net/icmp/ipv4_test.go lxd-2.15/dist/src/golang.org/x/net/icmp/ipv4_test.go --- lxd-2.14/dist/src/golang.org/x/net/icmp/ipv4_test.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/icmp/ipv4_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -11,6 +11,7 @@ "runtime" "testing" + "golang.org/x/net/internal/socket" "golang.org/x/net/ipv4" ) @@ -55,7 +56,7 @@ func TestParseIPv4Header(t *testing.T) { tt := &ipv4HeaderLittleEndianTest - if nativeEndian != binary.LittleEndian { + if socket.NativeEndian != binary.LittleEndian { t.Skip("no test for non-little endian machine yet") } diff -Nru lxd-2.14/dist/src/golang.org/x/net/idna/example_test.go lxd-2.15/dist/src/golang.org/x/net/idna/example_test.go --- lxd-2.14/dist/src/golang.org/x/net/idna/example_test.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/idna/example_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -51,6 +51,10 @@ idna.Transitional(true)) // Map ß -> ss fmt.Println(p.ToASCII("*.faß.com")) + // Lookup for registration. Also does not allow '*'. + p = idna.New(idna.ValidateForRegistration()) + fmt.Println(p.ToUnicode("*.faß.com")) + // Set up a profile maps for lookup, but allows wild cards. p = idna.New( idna.MapForLookup(), @@ -60,6 +64,7 @@ // Output: // *.xn--fa-hia.com - // *.fass.com idna: disallowed rune U+002E + // *.fass.com idna: disallowed rune U+002A + // *.faß.com idna: disallowed rune U+002A // *.fass.com } diff -Nru lxd-2.14/dist/src/golang.org/x/net/idna/idna.go lxd-2.15/dist/src/golang.org/x/net/idna/idna.go --- lxd-2.14/dist/src/golang.org/x/net/idna/idna.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/idna/idna.go 2017-06-28 03:01:38.000000000 +0000 @@ -67,6 +67,15 @@ return func(o *options) { o.verifyDNSLength = verify } } +// RemoveLeadingDots removes leading label separators. Leading runes that map to +// dots, such as U+3002, are removed as well. +// +// This is the behavior suggested by the UTS #46 and is adopted by some +// browsers. +func RemoveLeadingDots(remove bool) Option { + return func(o *options) { o.removeLeadingDots = remove } +} + // ValidateLabels sets whether to check the mandatory label validation criteria // as defined in Section 5.4 of RFC 5891. This includes testing for correct use // of hyphens ('-'), normalization, validity of runes, and the context rules. @@ -133,14 +142,16 @@ o.mapping = validateAndMap StrictDomainName(true)(o) ValidateLabels(true)(o) + RemoveLeadingDots(true)(o) } } type options struct { - transitional bool - useSTD3Rules bool - validateLabels bool - verifyDNSLength bool + transitional bool + useSTD3Rules bool + validateLabels bool + verifyDNSLength bool + removeLeadingDots bool trie *idnaTrie @@ -240,21 +251,23 @@ punycode = &Profile{} lookup = &Profile{options{ - transitional: true, - useSTD3Rules: true, - validateLabels: true, - trie: trie, - fromPuny: validateFromPunycode, - mapping: validateAndMap, - bidirule: bidirule.ValidString, + transitional: true, + useSTD3Rules: true, + validateLabels: true, + removeLeadingDots: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, }} display = &Profile{options{ - useSTD3Rules: true, - validateLabels: true, - trie: trie, - fromPuny: validateFromPunycode, - mapping: validateAndMap, - bidirule: bidirule.ValidString, + useSTD3Rules: true, + validateLabels: true, + removeLeadingDots: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, }} registration = &Profile{options{ useSTD3Rules: true, @@ -293,7 +306,9 @@ s, err = p.mapping(p, s) } // Remove leading empty labels. - for ; len(s) > 0 && s[0] == '.'; s = s[1:] { + if p.removeLeadingDots { + for ; len(s) > 0 && s[0] == '.'; s = s[1:] { + } } // It seems like we should only create this error on ToASCII, but the // UTS 46 conformance tests suggests we should always check this. @@ -373,23 +388,20 @@ if !norm.NFC.IsNormalString(s) { return s, &labelError{s, "V1"} } - var err error for i := 0; i < len(s); { v, sz := trie.lookupString(s[i:]) - i += sz // Copy bytes not copied so far. switch p.simplify(info(v).category()) { // TODO: handle the NV8 defined in the Unicode idna data set to allow // for strict conformance to IDNA2008. case valid, deviation: case disallowed, mapped, unknown, ignored: - if err == nil { - r, _ := utf8.DecodeRuneInString(s[i:]) - err = runeError(r) - } + r, _ := utf8.DecodeRuneInString(s[i:]) + return s, runeError(r) } + i += sz } - return s, err + return s, nil } func validateAndMap(p *Profile, s string) (string, error) { @@ -408,7 +420,7 @@ continue case disallowed: if err == nil { - r, _ := utf8.DecodeRuneInString(s[i:]) + r, _ := utf8.DecodeRuneInString(s[start:]) err = runeError(r) } continue diff -Nru lxd-2.14/dist/src/golang.org/x/net/internal/socket/socket.go lxd-2.15/dist/src/golang.org/x/net/internal/socket/socket.go --- lxd-2.14/dist/src/golang.org/x/net/internal/socket/socket.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/internal/socket/socket.go 2017-06-28 03:01:38.000000000 +0000 @@ -175,6 +175,9 @@ for len(m) >= controlHeaderLen() { h := (*cmsghdr)(unsafe.Pointer(&m[0])) l := h.len() + if l <= 0 { + return nil, errors.New("invalid header length") + } if uint64(l) < uint64(controlHeaderLen()) { return nil, errors.New("invalid message length") } diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv4/control.go lxd-2.15/dist/src/golang.org/x/net/ipv4/control.go --- lxd-2.14/dist/src/golang.org/x/net/ipv4/control.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv4/control.go 2017-06-28 03:01:38.000000000 +0000 @@ -83,14 +83,14 @@ if lvl != iana.ProtocolIP { continue } - switch typ { - case ctlOpts[ctlTTL].name: + switch { + case typ == ctlOpts[ctlTTL].name && l >= ctlOpts[ctlTTL].length: ctlOpts[ctlTTL].parse(cm, m.Data(l)) - case ctlOpts[ctlDst].name: + case typ == ctlOpts[ctlDst].name && l >= ctlOpts[ctlDst].length: ctlOpts[ctlDst].parse(cm, m.Data(l)) - case ctlOpts[ctlInterface].name: + case typ == ctlOpts[ctlInterface].name && l >= ctlOpts[ctlInterface].length: ctlOpts[ctlInterface].parse(cm, m.Data(l)) - case ctlOpts[ctlPacketInfo].name: + case typ == ctlOpts[ctlPacketInfo].name && l >= ctlOpts[ctlPacketInfo].length: ctlOpts[ctlPacketInfo].parse(cm, m.Data(l)) } } diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv4/control_test.go lxd-2.15/dist/src/golang.org/x/net/ipv4/control_test.go --- lxd-2.14/dist/src/golang.org/x/net/ipv4/control_test.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv4/control_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -0,0 +1,21 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4_test + +import ( + "testing" + + "golang.org/x/net/ipv4" +) + +func TestControlMessageParseWithFuzz(t *testing.T) { + var cm ipv4.ControlMessage + for _, fuzz := range []string{ + "\f\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00", + "\f\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00", + } { + cm.Parse([]byte(fuzz)) + } +} diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv4/helper.go lxd-2.15/dist/src/golang.org/x/net/ipv4/helper.go --- lxd-2.14/dist/src/golang.org/x/net/ipv4/helper.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv4/helper.go 2017-06-28 03:01:38.000000000 +0000 @@ -43,3 +43,21 @@ } return nil } + +func opAddr(a net.Addr) net.Addr { + switch a.(type) { + case *net.TCPAddr: + if a == nil { + return nil + } + case *net.UDPAddr: + if a == nil { + return nil + } + case *net.IPAddr: + if a == nil { + return nil + } + } + return a +} diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv4/multicastlistener_test.go lxd-2.15/dist/src/golang.org/x/net/ipv4/multicastlistener_test.go --- lxd-2.14/dist/src/golang.org/x/net/ipv4/multicastlistener_test.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv4/multicastlistener_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -69,13 +69,16 @@ } for _, gaddr := range udpMultipleGroupListenerTests { - c1, err := net.ListenPacket("udp4", "224.0.0.0:1024") // wildcard address with reusable port + c1, err := net.ListenPacket("udp4", "224.0.0.0:0") // wildcard address with reusable port if err != nil { t.Fatal(err) } defer c1.Close() - - c2, err := net.ListenPacket("udp4", "224.0.0.0:1024") // wildcard address with reusable port + _, port, err := net.SplitHostPort(c1.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + c2, err := net.ListenPacket("udp4", net.JoinHostPort("224.0.0.0", port)) // wildcard address with reusable port if err != nil { t.Fatal(err) } @@ -131,16 +134,29 @@ if err != nil { t.Fatal(err) } + port := "0" for i, ifi := range ift { ip, ok := nettest.IsMulticastCapable("ip4", &ifi) if !ok { continue } - c, err := net.ListenPacket("udp4", ip.String()+":"+"1024") // unicast address with non-reusable port + c, err := net.ListenPacket("udp4", net.JoinHostPort(ip.String(), port)) // unicast address with non-reusable port if err != nil { - t.Fatal(err) + // The listen may fail when the serivce is + // already in use, but it's fine because the + // purpose of this is not to test the + // bookkeeping of IP control block inside the + // kernel. + t.Log(err) + continue } defer c.Close() + if port == "0" { + _, port, err = net.SplitHostPort(c.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + } p := ipv4.NewPacketConn(c) if err := p.JoinGroup(&ifi, &gaddr); err != nil { t.Fatal(err) diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv4/packet_go1_9.go lxd-2.15/dist/src/golang.org/x/net/ipv4/packet_go1_9.go --- lxd-2.14/dist/src/golang.org/x/net/ipv4/packet_go1_9.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv4/packet_go1_9.go 2017-06-28 03:01:38.000000000 +0000 @@ -61,7 +61,7 @@ } m.Addr = dst if err := c.SendMsg(&m, 0); err != nil { - return &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + return &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Addr: opAddr(dst), Err: err} } return nil } diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv4/payload_cmsg_go1_8.go lxd-2.15/dist/src/golang.org/x/net/ipv4/payload_cmsg_go1_8.go --- lxd-2.14/dist/src/golang.org/x/net/ipv4/payload_cmsg_go1_8.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv4/payload_cmsg_go1_8.go 2017-06-28 03:01:38.000000000 +0000 @@ -53,7 +53,7 @@ case *net.IPConn: n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) default: - return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType} + return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType} } return } diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv4/payload_cmsg_go1_9.go lxd-2.15/dist/src/golang.org/x/net/ipv4/payload_cmsg_go1_9.go --- lxd-2.14/dist/src/golang.org/x/net/ipv4/payload_cmsg_go1_9.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv4/payload_cmsg_go1_9.go 2017-06-28 03:01:38.000000000 +0000 @@ -61,7 +61,7 @@ } err := c.SendMsg(&m, 0) if err != nil { - err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err} } return m.N, err } diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv6/control.go lxd-2.15/dist/src/golang.org/x/net/ipv6/control.go --- lxd-2.14/dist/src/golang.org/x/net/ipv6/control.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv6/control.go 2017-06-28 03:01:38.000000000 +0000 @@ -129,14 +129,14 @@ if lvl != iana.ProtocolIPv6 { continue } - switch typ { - case ctlOpts[ctlTrafficClass].name: + switch { + case typ == ctlOpts[ctlTrafficClass].name && l >= ctlOpts[ctlTrafficClass].length: ctlOpts[ctlTrafficClass].parse(cm, m.Data(l)) - case ctlOpts[ctlHopLimit].name: + case typ == ctlOpts[ctlHopLimit].name && l >= ctlOpts[ctlHopLimit].length: ctlOpts[ctlHopLimit].parse(cm, m.Data(l)) - case ctlOpts[ctlPacketInfo].name: + case typ == ctlOpts[ctlPacketInfo].name && l >= ctlOpts[ctlPacketInfo].length: ctlOpts[ctlPacketInfo].parse(cm, m.Data(l)) - case ctlOpts[ctlPathMTU].name: + case typ == ctlOpts[ctlPathMTU].name && l >= ctlOpts[ctlPathMTU].length: ctlOpts[ctlPathMTU].parse(cm, m.Data(l)) } } diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv6/control_rfc2292_unix.go lxd-2.15/dist/src/golang.org/x/net/ipv6/control_rfc2292_unix.go --- lxd-2.14/dist/src/golang.org/x/net/ipv6/control_rfc2292_unix.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv6/control_rfc2292_unix.go 2017-06-28 03:01:38.000000000 +0000 @@ -17,7 +17,7 @@ m := socket.ControlMessage(b) m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292HOPLIMIT, 4) if cm != nil { - nativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) } return m.Next(4) } diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv6/control_rfc3542_unix.go lxd-2.15/dist/src/golang.org/x/net/ipv6/control_rfc3542_unix.go --- lxd-2.14/dist/src/golang.org/x/net/ipv6/control_rfc3542_unix.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv6/control_rfc3542_unix.go 2017-06-28 03:01:38.000000000 +0000 @@ -18,26 +18,26 @@ m := socket.ControlMessage(b) m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_TCLASS, 4) if cm != nil { - nativeEndian.PutUint32(m.Data(4), uint32(cm.TrafficClass)) + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.TrafficClass)) } return m.Next(4) } func parseTrafficClass(cm *ControlMessage, b []byte) { - cm.TrafficClass = int(nativeEndian.Uint32(b[:4])) + cm.TrafficClass = int(socket.NativeEndian.Uint32(b[:4])) } func marshalHopLimit(b []byte, cm *ControlMessage) []byte { m := socket.ControlMessage(b) m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_HOPLIMIT, 4) if cm != nil { - nativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) } return m.Next(4) } func parseHopLimit(cm *ControlMessage, b []byte) { - cm.HopLimit = int(nativeEndian.Uint32(b[:4])) + cm.HopLimit = int(socket.NativeEndian.Uint32(b[:4])) } func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv6/control_test.go lxd-2.15/dist/src/golang.org/x/net/ipv6/control_test.go --- lxd-2.14/dist/src/golang.org/x/net/ipv6/control_test.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv6/control_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -0,0 +1,21 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv6_test + +import ( + "testing" + + "golang.org/x/net/ipv6" +) + +func TestControlMessageParseWithFuzz(t *testing.T) { + var cm ipv6.ControlMessage + for _, fuzz := range []string{ + "\f\x00\x00\x00)\x00\x00\x00.\x00\x00\x00", + "\f\x00\x00\x00)\x00\x00\x00,\x00\x00\x00", + } { + cm.Parse([]byte(fuzz)) + } +} diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv6/helper.go lxd-2.15/dist/src/golang.org/x/net/ipv6/helper.go --- lxd-2.14/dist/src/golang.org/x/net/ipv6/helper.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv6/helper.go 2017-06-28 03:01:38.000000000 +0000 @@ -5,10 +5,8 @@ package ipv6 import ( - "encoding/binary" "errors" "net" - "unsafe" ) var ( @@ -17,20 +15,8 @@ errInvalidConnType = errors.New("invalid conn type") errOpNoSupport = errors.New("operation not supported") errNoSuchInterface = errors.New("no such interface") - - nativeEndian binary.ByteOrder ) -func init() { - i := uint32(1) - b := (*[4]byte)(unsafe.Pointer(&i)) - if b[0] == 1 { - nativeEndian = binary.LittleEndian - } else { - nativeEndian = binary.BigEndian - } -} - func boolint(b bool) int { if b { return 1 @@ -51,3 +37,21 @@ } return nil } + +func opAddr(a net.Addr) net.Addr { + switch a.(type) { + case *net.TCPAddr: + if a == nil { + return nil + } + case *net.UDPAddr: + if a == nil { + return nil + } + case *net.IPAddr: + if a == nil { + return nil + } + } + return a +} diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv6/multicastlistener_test.go lxd-2.15/dist/src/golang.org/x/net/ipv6/multicastlistener_test.go --- lxd-2.14/dist/src/golang.org/x/net/ipv6/multicastlistener_test.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv6/multicastlistener_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -5,7 +5,6 @@ package ipv6_test import ( - "fmt" "net" "runtime" "testing" @@ -70,13 +69,16 @@ } for _, gaddr := range udpMultipleGroupListenerTests { - c1, err := net.ListenPacket("udp6", "[ff02::]:1024") // wildcard address with reusable port + c1, err := net.ListenPacket("udp6", "[ff02::]:0") // wildcard address with reusable port if err != nil { t.Fatal(err) } defer c1.Close() - - c2, err := net.ListenPacket("udp6", "[ff02::]:1024") // wildcard address with reusable port + _, port, err := net.SplitHostPort(c1.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + c2, err := net.ListenPacket("udp6", net.JoinHostPort("ff02::", port)) // wildcard address with reusable port if err != nil { t.Fatal(err) } @@ -132,16 +134,29 @@ if err != nil { t.Fatal(err) } + port := "0" for i, ifi := range ift { ip, ok := nettest.IsMulticastCapable("ip6", &ifi) if !ok { continue } - c, err := net.ListenPacket("udp6", fmt.Sprintf("[%s%%%s]:1024", ip.String(), ifi.Name)) // unicast address with non-reusable port + c, err := net.ListenPacket("udp6", net.JoinHostPort(ip.String()+"%"+ifi.Name, port)) // unicast address with non-reusable port if err != nil { - t.Fatal(err) + // The listen may fail when the serivce is + // already in use, but it's fine because the + // purpose of this is not to test the + // bookkeeping of IP control block inside the + // kernel. + t.Log(err) + continue } defer c.Close() + if port == "0" { + _, port, err = net.SplitHostPort(c.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + } p := ipv6.NewPacketConn(c) if err := p.JoinGroup(&ifi, &gaddr); err != nil { t.Fatal(err) @@ -227,7 +242,7 @@ if !ok { continue } - c, err := net.ListenPacket("ip6:ipv6-icmp", fmt.Sprintf("%s%%%s", ip.String(), ifi.Name)) // unicast address + c, err := net.ListenPacket("ip6:ipv6-icmp", ip.String()+"%"+ifi.Name) // unicast address if err != nil { t.Fatal(err) } diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv6/payload_cmsg_go1_8.go lxd-2.15/dist/src/golang.org/x/net/ipv6/payload_cmsg_go1_8.go --- lxd-2.14/dist/src/golang.org/x/net/ipv6/payload_cmsg_go1_8.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv6/payload_cmsg_go1_8.go 2017-06-28 03:01:38.000000000 +0000 @@ -49,7 +49,7 @@ case *net.IPConn: n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) default: - return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType} + return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType} } return } diff -Nru lxd-2.14/dist/src/golang.org/x/net/ipv6/payload_cmsg_go1_9.go lxd-2.15/dist/src/golang.org/x/net/ipv6/payload_cmsg_go1_9.go --- lxd-2.14/dist/src/golang.org/x/net/ipv6/payload_cmsg_go1_9.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/ipv6/payload_cmsg_go1_9.go 2017-06-28 03:01:38.000000000 +0000 @@ -51,7 +51,7 @@ } err := c.SendMsg(&m, 0) if err != nil { - err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err} } return m.N, err } diff -Nru lxd-2.14/dist/src/golang.org/x/net/publicsuffix/list_test.go lxd-2.15/dist/src/golang.org/x/net/publicsuffix/list_test.go --- lxd-2.14/dist/src/golang.org/x/net/publicsuffix/list_test.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/publicsuffix/list_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -216,13 +216,13 @@ {"aaa.xn--p1ai", "xn--p1ai"}, {"www.xxx.yyy.xn--p1ai", "xn--p1ai"}, - // The .zw rules are: - // *.zw - {"zw", "zw"}, - {"www.zw", "www.zw"}, - {"zzz.zw", "zzz.zw"}, - {"www.zzz.zw", "zzz.zw"}, - {"www.xxx.yyy.zzz.zw", "zzz.zw"}, + // The .bd rules are: + // *.bd + {"bd", "bd"}, + {"www.bd", "www.bd"}, + {"zzz.bd", "zzz.bd"}, + {"www.zzz.bd", "zzz.bd"}, + {"www.xxx.yyy.zzz.bd", "zzz.bd"}, // There are no .nosuchtld rules. {"nosuchtld", "nosuchtld"}, diff -Nru lxd-2.14/dist/src/golang.org/x/net/publicsuffix/table.go lxd-2.15/dist/src/golang.org/x/net/publicsuffix/table.go --- lxd-2.14/dist/src/golang.org/x/net/publicsuffix/table.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/publicsuffix/table.go 2017-06-28 03:01:38.000000000 +0000 @@ -2,7 +2,7 @@ package publicsuffix -const version = "publicsuffix.org's public_suffix_list.dat, git revision 45a2bf8ef3e22000fbe4bfa5f9252db41d777001 (2017-01-18T01:04:06Z)" +const version = "publicsuffix.org's public_suffix_list.dat, git revision f47d806df99585862c8426c3e064a50eb5a278f5 (2017-06-14T11:49:01Z)" const ( nodesBitsChildren = 9 @@ -23,447 +23,453 @@ ) // numTLD is the number of top level domains. -const numTLD = 1554 +const numTLD = 1549 // Text is the combined text of all labels. -const text = "bikedagestangeorgeorgiaxagrocerybnikahokutobishimaizuruhreportar" + - "nobrzegyptianaturalhistorymuseumcentereviewskrakoweddinggfarmers" + - "einexus-2bilbaogakievenesalangenikiiyamanouchikuhokuryugasakitau" + - "rayasudabillustrationikkoebenhavnikolaevennodessagamiharabiomuta" + - "shinainfinitintuitattoolsztynsettlersalondonetskarpaczeladzjcbre" + - "mangerbirdartcenterprisesakikuchikuseikarugapartmentsaltdalimoli" + - "serniabirkenesoddtangenovaravennagasukeverbankaruizawabirthplace" + - "vje-og-hornnesalvadordalibabajddarchaeologyusuisserveexchangebja" + - "rkoyuufcfanikonantanangerbjerkreimbalsanagochihayaakasakawaharau" + - "malopolskanlandds3-us-west-1bjugninohekinannestadrangedalindasda" + - "burblockbusternidray-dnsupdaterbloombergbauerninomiyakonojosoyro" + - "rosalzburgjovikarumaifarmsteadraydnsamegawabloxcmsamnangerblueda" + - "ncebmoattachmentsamsclubindalindesnesamsungladell-ogliastraderbm" + - "sandvikcoromantovalle-d-aostatic-accessanfranciscofreakunemurora" + - "ngeiseiyoichiropracticasinordre-landrivelandrobaknoluoktabuseekl" + - "ogesurancertmgretachikawakkanaibetsubamericanfamilydscloudcontro" + - "lledekafjordrudunsangoppdalivornobmweirbnpparibaselburglassassin" + - "ationalheritagematsubarakawagoebnrwfarsundupontariobonnirasakinu" + - "yamashinashikitchenishiazainvestmentsanjournalismailillesandefjo" + - "rdurbanamexhibitionishigobookingliwicebootsannanishiharaboschaef" + - "flerdalomzaporizhzhegurinzais-a-bulls-fanishiizunazukis-a-candid" + - "atebostikasaokamiminersannohelplfinancialorenskoglobalashovhachi" + - "nohedmarkashibatakasakiyokawarabostonakijinsekikogentinglobodoes" + - "-itvedestrandurhamburglogowhalingloppenzaogashimadachicagoboatsa" + - "nokashiharabotanicalgardenishikatakayamatta-varjjataxihuanishika" + - "tsuragithubusercontentgoryuzawabotanicgardenishikawazukamitondab" + - "ayashiogamagoriziabotanybouncemerckmsdnipropetrovskjakdnepropetr" + - "ovskiervaapsteiermarkashiwarabounty-fullensakerrypropertiesantab" + - "arbaraboutiquebecngmbhartiffanybozentsujiiebradescorporationishi" + - "merabrandywinevalleybrasiliabresciabrindisibenikebristoloslocalh" + - "istoryggeelvinckashiwazakiyosatokashikiyosemitebritishcolumbialo" + - "wiezachpomorskienishinomiyashironobroadcastlefrakkestadvrcambrid" + - "gestonextdirectjeldsundvrdnsantacruzsantafedextraspacekitagataji" + - "rittogoldpoint2thisamitsukebroadwaybroke-itjmaxxxboxenapponazure" + - "-mobilebrokerbronnoysundwgminakamichiharabrothermesaverdeatnurem" + - "bergmodellingmxfinitybrowsersafetymarketsanukis-a-catererbrumund" + - "dalotenkawabrunelasticbeanstalkasukabedzin-the-bandaikawachinaga" + - "noharamcoalaskanittedallasalleasinglest-mon-blogueurovisionthewi" + - "fiat-band-campaniabrusselsaotomemergencyberlevagangaviikanonjis-" + - "a-celticsfanishinoomotegobruxellesapodlasiellakasamatsudovre-eik" + - "erbryanskjervoyagebrynewhampshirebungoonordlandyndns-at-workingg" + - "roupalacebuskerudinewjerseybuzenishinoshimattelefonicarbonia-igl" + - "esias-carboniaiglesiascarboniabuzzlgrimstadyndns-blogdnsapporobw" + - "hoswhokksundyndns-freebox-ostrowiecateringebuilderschmidtre-gaul" + - "dalottebzhitomirumalselvendrellottokonamegatakasugais-a-chefashi" + - "onishiokoppegardyndns-homednsardegnamsskoganeis-a-conservativefs" + - "nillfjordyndns-ipaleocondoshichinohealth-carereformitakeharaconf" + - "erenceconstructionconsuladoesntexistanbullensvanguardyndns-wikin" + - "dlegokasells-for-lessaudaconsultanthropologyconsultingvolluxuryc" + - "ontactoyookanmakiwakunigamifunecontemporaryarteducationalchikugo" + - "doharuovatoyosatoyakokonoecontractorskenconventureshinodesashibe" + - "tsuikinderoycookingchannelblagdenesnaaseralingenkainanaejrietisa" + - "latinabenonichernihivanovodkagoshimalvikasumigaurawa-mazowszexjc" + - "palermomahachijorpelandyndns-mailouvreisenishitosashimizunaminam" + - "iashigaracoolkuszkoladbrokesauheradyndns-workisboringrpamperedch" + - "efastlylbaltimore-og-romsdalwaysdatabaseballangenoamishirasatoch" + - "igiessenebakkeshibechambagriculturennebudejjudygarlandigitalavan" + - "genavigationavuotnaklodzkodairamusementarumizusawabruzzoologyeon" + - "gbuk12cooperaunitemasekatsushikabeeldengeluidyndns1copenhagencyc" + - "lopedichernivtsiciliacorsicagliarightathomeftpanamacorvettenriku" + - "zentakataitogliattiresavannahgacosenzaganquannakadomaritimekeepi" + - "ngatlantaijis-a-financialadvisor-aurdaluzerncosidnsfor-better-th" + - "anawawildlifedjeffersoncostumedio-campidano-mediocampidanomedioc" + - "ouchpotatofriesaves-the-whalessandria-trani-barletta-andriatrani" + - "barlettaandriacouncilvivano-frankivskatsuyamasfjordencouponsavon" + - "aplesaxocoursesbschokoladencq-acranbrookuwanalyticscholarshipsch" + - "oolcreditcardynnschulezajskydivingruecreditunioncremonashorokana" + - "iecrewilliamhillcricketrzyncrimeastcoastaldefencecrotonewyorkshi" + - "recipesaro-urbino-pesarourbinopesaromasvuotnaharimamurogawacrown" + - "providercrsvpanasonichernovtsykkylvenetogakushimotoganewportllig" + - "atjxn--0trq7p7nnishiwakis-a-cpadoval-daostavalleycruiseschwarzgw" + - "angjuegoshikiminokamoenairtraffichiryukyuragifuchungbukasuyaltak" + - "ashimaseratis-a-cubicle-slavellinowtvalleaostatoilowiczest-le-pa" + - "trondheimmobilienissandnessjoenissayokoshibahikariwanumatakazaki" + - "s-a-democratkmaxxn--11b4c3dyndns-office-on-the-webcampobassociat" + - "esardiniacryptonomichigangwoncuisinellahppiacenzakopanerairguard" + - "ynv6culturalcentertainmentoyotaris-a-geekgalaxycuneocupcakecxn--" + - "1ctwolominamatakkokaminokawanishiaizubangecymrussiacyonabarulsan" + - "doycyouthdfcbankaufenfiguerestaurantoyotomiyazakis-a-greenfilate" + - "liafilminamiawajikis-a-guruslivinghistoryfinalfinancefineartscie" + - "ntistoragefinlandfinnoyfirebaseapparliamentoyotsukaidownloadfire" + - "nzefirestonefirmdaleirfjordfishingolffanscjohnsonfitjarqhachioji" + - "yahikobeatscotlandfitnessettlementoyourafjalerflesbergushikamifu" + - "ranoshiroomuraflickragerotikakamigaharaflightscrapper-siteflirfl" + - "ogintogurafloraflorencefloridavvesiidazaifudaigojomedizinhistori" + - "schescrappingxn--1lqs71dfloristanohatakahamaniwakuratexascolipic" + - "enord-aurdalipayflorogerserveftparmaflowerservegame-serversaille" + - "servehalflifestyleflynnhubambleclercartoonartdecoldwarmiamibugat" + - "tipschlesisches3-us-west-2fndfoodnetworkshoppingfor-ourfor-somee" + - "thnologyfor-theaterforexrothruherecreationforgotdnservehttparoch" + - "erkasyno-dservehumourforli-cesena-forlicesenaforlikescandynamic-" + - "dnserveirchitachinakagawatchandclockaszubyforsaleirvikazoforsand" + - "asuoloftoystre-slidrettozawafortmissoulair-traffic-controlleyfor" + - "tworthachirogatakahatakaishimogosenforuminamibosogndalfosneserve" + - "minecraftozsdev-myqnapcloudcontrolappspotagerfotaruis-a-hard-wor" + - "kerfoxfordedyn-ip24freeboxoservemp3utilitiesquarezzoologicalvink" + - "lein-addrammenuernbergdyniabogadocscbnl-o-g-i-nativeamericananti" + - "ques3-ap-northeast-1kappchizippodhaleangaviikadenadexeterepbodyn" + - "athomebuilt3l3p0rtargets-itargiving12000emmafanconagawakayamadri" + - "dvagsoyericssonyoursidealerimo-i-ranaamesjevuemielno-ip6freemaso" + - "nryfreiburgfreightcminamidaitomangotsukisosakitagawafreseniuscou" + - "ntryestateofdelawaredstonefribourgfriuli-v-giuliafriuli-ve-giuli" + - "afriuli-vegiuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-" + - "vgiuliafriuliv-giuliafriulive-giuliafriulivegiuliafriulivenezia-" + - "giuliafriuliveneziagiuliafriulivgiuliafrlfroganservep2parservepi" + - "cservequakefrognfrolandfrom-akrehamnfrom-alfrom-arfrom-azwinbana" + - "narepublicasadelamonedatsunanjoburgjerstadotsuruokakegawasnesodd" + - "enmarkhangelskiptveterinairealtychyattorneyagawalmartatamotors3-" + - "ap-south-1from-capebretonamiastapleservesarcasmatartanddesignfro" + - "m-collectionfrom-ctrani-andria-barletta-trani-andriafrom-dchitos" + - "etogitsuldalucaniafrom-defenseljordfrom-flanderservicesettsurgeo" + - "nshalloffamemorialfrom-gausdalfrom-higashiagatsumagoizumizakiraf" + - "rom-iafrom-idfrom-ilfrom-incheonfrom-ksevastopolefrom-kyowariasa" + - "hikawafrom-lajollamericanexpressexyfrom-mannortonsbergfrom-mdfro" + - "m-megurokunohealthcareersevenassisicilyfrom-midoris-a-hunterfrom" + - "-mnfrom-mochizukirkenesewindmillfrom-msfranziskanerdpolicefrom-m" + - "tnfrom-nchloefrom-ndfrom-nefrom-nhktraniandriabarlettatraniandri" + - "afrom-njelenia-gorafrom-nminamiechizenfrom-nvalled-aostavangerfr" + - "om-nyfrom-ohkurafrom-oketohmansionshangrilanciafrom-orfrom-pader" + - "bornfrom-pratohnoshoooshikamaishimodatextileitungsenfrom-ris-a-k" + - "nightpointtokaizukameokameyamatotakadafrom-schoenbrunnfrom-sdfro" + - "m-tnfrom-txn--1qqw23afrom-utazuerichardlillehammerfeste-ipartis-" + - "a-landscaperfrom-vaksdalfrom-vtranoyfrom-wafrom-wielunnerfrom-wv" + - "alledaostavernfrom-wyfrosinonefrostalowa-wolawafroyahababyglandf" + - "stcgroupartnersharis-a-lawyerfujiiderafujikawaguchikonefujiminoh" + - "tawaramotoineppubolognakanotoddenfujinomiyadafujiokayamanxn--2m4" + - "a15efujisatoshonairportland-4-salernoboribetsucksharpartshawaiij" + - "imarugame-hostrodawarafujisawafujishiroishidakabiratoridegreefuj" + - "itsurugashimamateramodalenfujixeroxn--30rr7yfujiyoshidafukayabea" + - "rdubaiduckdnshellaspeziafukuchiyamadafukudominichocolatelevision" + - "issedaluccapitalonewmexicoffeedbackplaneapplinzis-a-designerimar" + - "umorimachidafukuis-a-liberalfukumitsubishigakirovogradoyfukuokaz" + - "akiryuohadanotaireshimojis-a-libertarianfukuroishikarikaturindal" + - "fukusakisarazurewebsiteshikagamiishibukawafukuyamagatakaharustka" + - "noyakagefunabashiriuchinadafunagatakahashimamakishiwadafunahashi" + - "kamiamakusatsumasendaisennangonohejis-a-linux-useranishiaritabas" + - "hijonawatefundaciofuoiskujukuriyamaoris-a-llamarylandfuosskoczow" + - "indowshimokawafurnituredumbrellanbibaidarfurubiraquarelleborkang" + - "erfurudonostiaarpartyfurukawairtelecityeatshimokitayamafusodegau" + - "rafussaikisofukushimapasadenamsosnowiechofunatorientexpressarluc" + - "ernefutabayamaguchinomigawafutboldlygoingnowhere-for-moregontrai" + - "lroadfuttsurugimperiafuturehostingfuturemailingfvgfyis-a-musicia" + - "nfylkesbiblackfridayfyresdalhangglidinghangoutsystemscloudfrontd" + - "oorhannanmokuizumodenakasatsunais-a-painteractivegarsheis-a-pats" + - "fanhannotteroyhanyuzenhapmirhareidsbergenharstadharvestcelebrati" + - "onhasamarnardalhasaminami-alpssells-itransportransurlhashbanghas" + - "udahasura-appassenger-associationhasvikazunohatogayahoohatoyamaz" + - "akitahiroshimarriottrapaniimimatakatoris-a-personaltrainerhatsuk" + - "aichikaiseis-a-photographerokuappaviancargodaddynaliascoli-picen" + - "oipirangamvikddielddanuorrissagaeroclubmedecincinnationwidealsta" + - "haugesunderseaportsinfolldalabamagasakishimabarackmazehattfjelld" + - "alhayashimamotobungotakadapliernewhollandhazuminobusellsyourhome" + - "goodshimotsumahboehringerikehelsinkitakamiizumisanofidelitysvard" + - "ollshinichinanhembygdsforbundhemneshinjournalistjohnhemsedalhepf" + - "orgeherokussldheroyhgtvallee-aosteroyhigashichichibunkyonanaoshi" + - "mageandsoundandvisionhigashihiroshimanehigashiizumozakitakatakam" + - "oriokalmykiahigashikagawahigashikagurasoedahigashikawakitaaikita" + - "kyushuaiahigashikurumeiwamarshallstatebankfhappouhigashimatsushi" + - "maritimodernhigashimatsuyamakitaakitadaitoigawahigashimurayamamo" + - "torcycleshinjukumanohigashinarusembokukitamidsundhigashinehigash" + - "iomihachimanchesterhigashiosakasayamanakakogawahigashishirakawam" + - "atakanabeautydalhigashisumiyoshikawaminamiaikitamotosumitakagild" + - "eskaliszhigashitsunowruzhgorodeohigashiurausukitanakagusukumodum" + - "inamiiselectravelchannelhigashiyamatokoriyamanashifteditchyourip" + - "fizerhigashiyodogawahigashiyoshinogaris-a-playerhiraizumisatohob" + - "by-sitehirakatashinagawahiranais-a-republicancerresearchaeologic" + - "aliforniahirarahiratsukagawahirayaitakanezawahistorichouseshinka" + - "migotoyohashimotoshimahitachiomiyaginankokubunjis-a-rockstaracho" + - "wicehitachiotagooglecodespotravelersinsurancehitraeumtgeradeloit" + - "tevadsoccertificationhjartdalhjelmelandholeckobierzyceholidayhom" + - "eipgfoggiahomelinkhakassiahomelinuxn--32vp30haebaruminamifuranoh" + - "omeofficehomesecuritymaceratakaokaluganskodjejuifminamiizukamiok" + - "amikitayamatsuris-a-socialistmein-vigorgehomesecuritypccwinnersh" + - "inshinotsurgeryhomesenseminehomeunixn--3bst00minamimakis-a-soxfa" + - "nhondahoneywellbeingzonehongopocznosegawahonjyoitakarazukamakura" + - "zakitashiobarahornindalhorseoulminamiminowahortendofinternet-dns" + - "hinshirohospitalhoteleshintokushimahotmailhoyangerhoylandetroits" + - "kolelhumanitieshintomikasaharahurdalhurumajis-a-studentalhyllest" + - "adhyogoris-a-teacherkassymantechnologyhyugawarahyundaiwafunehzch" + - "onanbuildingripescaravantaajlchoyodobashichikashukujitawarajlljm" + - "pharmacienshirakofuefukihaboromskoguchikuzenjnjeonnamerikawauejo" + - "yokaichibahcavuotnagaranzannefrankfurtrentino-alto-adigejpmorgan" + - "jpnjprshiranukamogawajuniperjurkoshunantokigawakosugekotohiradom" + - "ainsureggiocalabriakotourakouhokutamakis-an-artisteinkjerusalemb" + - "roiderykounosupplieshiraokanagawakouyamashikokuchuokouzushimasoy" + - "kozagawakozakis-an-engineeringkpnkppspdnshiratakahagivestbytomar" + - "idagawassamukawataricohdatingkrasnodarkredirectmeldalkristiansan" + - "dcatshishikuis-an-entertainerkristiansundkrodsheradkrokstadelval" + - "daostarostwodzislawioshisognekryminamisanrikubetsupportrentino-a" + - "ltoadigekumatorinokumejimasudakumenanyokkaichirurgiens-dentistes" + - "-en-francekunisakis-bykunitachiarailwaykunitomigusukumamotoyamas" + - "sa-carrara-massacarraramassabusinessebyklegallocus-1kunneppulawy" + - "kunstsammlungkunstunddesignkuokgrouphdkureggioemiliaromagnakayam" + - "atsumaebashikshacknetrentino-s-tirollagrigentomologyeonggiehtavu" + - "oatnagaivuotnagaokakyotambabia-goracleaningkurgankurobelaudibleb" + - "timnetzkurogimilanokuroisoftwarendalenugkuromatsunais-certifiedo" + - "gawarabikomaezakirunorthwesternmutualkurotakikawasakis-foundatio" + - "nkushirogawakusupplykutchanelkutnokuzumakis-gonekvafjordkvalsund" + - "kvamfamberkeleykvanangenkvinesdalkvinnheradkviteseidskogkvitsoyk" + - "wpspiegelkzmissilevangermisugitokorozawamitourismolancastermitoy" + - "oakemiuramiyazumiyotamanomjondalenmlbfanmonmouthagebostadmonster" + - "monticellombardiamondshisuifuelveruminamitanemontrealestatefarme" + - "quipmentrentino-stirolmonza-brianzaporizhzhiamonza-e-della-brian" + - "zapposhitaramamonzabrianzaptokuyamatsusakahoginowaniihamatamakaw" + - "ajimarburgmonzaebrianzaramonzaedellabrianzamoparachutingmordovia" + - "jessheiminamiuonumatsumotofukemoriyamatsushigemoriyoshimilitarym" + - "ormoneymoroyamatsuuramortgagemoscowitdkmpspbarcelonagasakijobser" + - "verisignieznord-odalaziobihirosakikamijimassnasaarlandd-dnshome-" + - "webservercellikes-piedmontblancomeeres3-ap-southeast-1moseushist" + - "orymosjoenmoskeneshizukuishimofusaitamatsukuris-into-gamessinats" + - "ukigatakasagotembaixadamosshizuokananporovigotpantheonsitemosvik" + - "nx-serveronakatsugawamoteginozawaonsenmoviemovistargardmtpchrist" + - "masakikugawatchesarufutsunomiyawakasaikaitakoelniyodogawamtranby" + - "muenstermugithubcloudusercontentrentino-sud-tirolmuikamisatokama" + - "chippubetsubetsugarumukochikushinonsenergymulhouservebeermunakat" + - "anemuncieszynmuosattemuphiladelphiaareadmyblogsitemurmanskolobrz" + - "egersundmurotorcraftrentino-sudtirolmusashimurayamatsuzakis-leet" + - "rdmusashinoharamuseetrentino-sued-tirolmuseumverenigingmutsuzawa" + - "mutuellewismillermy-vigorlicemy-wanggouvicenzamyactivedirectorym" + - "yasustor-elvdalmycdn77-securechtrainingmydissentrentino-suedtiro" + - "lmydrobofagemydshoujis-lostre-toteneis-a-techietis-a-therapistoi" + - "amyeffectrentinoa-adigemyfirewallonieruchomoscienceandindustrynm" + - "yfritzmyftpaccesshowamyfusionmyhome-serverrankoshigayamelhusgard" + - "enmykolaivaolbia-tempio-olbiatempioolbialystokkepnogiftshowtimet" + - "eorapphilatelymymediapchromedicaltanissettairamyokohamamatsudamy" + - "pepsongdalenviknakanojohanamakinoharamypetshriramlidlugolekagami" + - "nogatagajobojis-not-certifieducatorahimeshimakanegasakinkobayash" + - "ikaoirminamiogunicomcastresistancemyphotoshibahccavuotnagareyama" + - "lborkdalvdalcesienarashinomypsxn--3e0b707emysecuritycamerakermys" + - "hopblocksigdalmyvnchryslerpictetrentinoaadigepicturesimple-urlpi" + - "emontepilotsirdalpimientaketomisatolgapinkomakiyosunndalpioneerp" + - "ippuphoenixn--3oq18vl8pn36apiszpittsburghofauskedsmokorsetagayas" + - "ells-for-ulvikautokeinopiwatepizzapkomatsushimashikizunokunimiho" + - "boleslawiechristiansburgriwataraidyndns-picsarpsborgroks-thisaya" + - "manobeokakudamatsueplanetariuminamiyamashirokawanabellevuelosang" + - "elesjaguarchitecturealtorlandplantationplantslingplatforminanopl" + - "aystationplazaplchungnamdalseidfjordyndns-remotewdyndns-serverda" + - "luroyplombardynamisches-dnslupskomforbarclaycards3-website-ap-no" + - "rtheast-1plumbingopmnpodzonepohlpoivronpokerpokrovskommunalforbu" + - "ndpolitiendapolkowicepoltavalle-aostathellexusdecorativeartsnoas" + - "aitomobellunorddalpomorzeszowithgoogleapisa-hockeynutsiracusakat" + - "akinouepordenonepornporsangerporsanguidelmenhorstalbansokanazawa" + - "porsgrunnanpoznanpraxis-a-bookkeeperugiaprdpreservationpresidiop" + - "rgmrprimeloyalistockholmestrandprincipeprivatizehealthinsurancep" + - "rochowiceproductionsokndalprofbsbxn--1lqs03nprogressivegasiaproj" + - "ectrentinoalto-adigepromombetsurfbx-ostrowwlkpmgulenpropertyprot" + - "ectionprotonetrentinoaltoadigeprudentialpruszkowithyoutubentleyp" + - "rzeworskogptplusterpvtrentinos-tirolpwchurchaseljeepostfoldnavyp" + - "zqldqponqslgbtrentinostirolquicksytesolarssonqvcirclegnicafedera" + - "tionstufftoread-booksnesolundbeckommunestuttgartrentoyokawasusak" + - "is-slickharkovalleeaosteigensusonosuzakaneyamazoesuzukaniepcesuz" + - "ukis-uberleetrentino-a-adigesvalbardunloppacificircustomersveios" + - "velvikomvuxn--3ds443gsvizzeraswedenswidnicarrierswiebodzindianap" + - "olis-a-bloggerswiftcoversicherungswinoujscienceandhistoryswisshi" + - "kis-very-badaddjamisonsynology-dsolutionsolognetuscanytushuissie" + - "r-justicetuvalle-daostaticsootuxfamilyvenneslaskerrylogisticsopo" + - "trentinosud-tirolvestfoldvestnesor-odalvestre-slidreamhostersor-" + - "varangervestre-totennishiawakuravestvagoyvevelstadvibo-valentiav" + - "ibovalentiavideovillaskoyabearalvahkihokumakogengerdalpha-myqnap" + - "cloudapplebesbydgoszczecinemakeupowiathletajimabariakembuchikuma" + - "gayagawakuyabukicks-assedicitadeliveryvinnicartiervinnytsiavipsi" + - "naapphonefossilkomaganevirginiavirtualvirtueeldomeindianmarketin" + - "gvirtuelvisakegawavistaprinternationalfirearmsorfoldviterboltroa" + - "ndinosaurepaircraftrevisohughesomavivoldavlaanderenvladikavkazim" + - "ierz-dolnyvladimirvlogoiphotographysiovolkswagentsorreisahayakaw" + - "akamiichikawamisatotalvologdanskongsvingervolvolkenkundenvolyngd" + - "alvossevangenvotevotingvotoyonakagyokutoursortlandworldworse-tha" + - "ndawowiwatsukiyonowritesthisblogsytewroclawloclawekoninjavald-ao" + - "starnbergwtciticatholicheltenham-radio-opencraftranagatorodoywtf" + - "bxosciencecentersciencehistorywuozuwwwmflabsorumincommbanklabudh" + - "abikinokawabarthagakhanamigawawzmiuwajimaxn--4gq48lf9jetztrentin" + - "o-aadigexn--4it168dxn--4it797konsulatrobeepilepsydneyxn--4pvxsou" + - "thcarolinazawaxn--54b7fta0ccivilizationxn--55qw42gxn--55qx5dxn--" + - "5js045dxn--5rtp49civilwarmanagementmpalmspringsakerxn--5rtq34kon" + - "yvelolxn--5su34j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2r" + - "xn--6qq986b3xlxn--7t0a264claimsasayamaxn--80adxhksouthwestfalenx" + - "n--80ao21axn--80aqecdr1axn--80asehdbarefootballooningjesdalillyo" + - "mbondiscountysnes3-website-ap-southeast-2xn--80aswgxn--80audneda" + - "lnxn--8ltr62kooris-an-actorxn--8pvr4uxn--8y0a063axn--90a3academy" + - "-firewall-gatewayxn--90aishobaraomoriguchiharahkkeravjuedischesa" + - "peakebayernrtrogstadxn--90azhytomyrxn--9dbhblg6dietcimdbargainst" + - "itutelemarkaratsuginamikatagamiharuconnectatarantottoribestadisc" + - "overyomitanobirastronomy-gatewayokosukanzakiwienaturalsciencesna" + - "turelles3-ap-southeast-2xn--9dbq2axn--9et52uxn--9krt00axn--andy-" + - "iraxn--aroport-byanaizuxn--asky-iraxn--aurskog-hland-jnbarreauct" + - "ionayorovnobninskarelianceu-1xn--avery-yuasakuhokkaidontexistein" + - "geekopervikhmelnitskiyamashikexn--b-5gaxn--b4w605ferdxn--bck1b9a" + - "5dre4clickatowicexn--bdddj-mrabdxn--bearalvhki-y4axn--berlevg-jx" + - "axn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachikatsuuraxn-" + - "-bievt-0qa2xn--bjarky-fyandexn--3pxu8konskowolayangroupharmacysh" + - "iraois-an-accountantshinyoshitomiokamitsuexn--bjddar-ptamayufuet" + - "tertdasnetzxn--blt-elabourxn--bmlo-graingerxn--bod-2naroyxn--brn" + - "ny-wuaccident-investigation-aptibleaseating-organicbcn-north-1xn" + - "--brnnysund-m8accident-prevention-webhopenairbusantiquest-a-la-m" + - "aisondre-landebudapest-a-la-masionionjukudoyamagazineat-urlxn--b" + - "rum-voagatromsakakinokiaxn--btsfjord-9zaxn--c1avgxn--c2br7gxn--c" + - "3s14mintelligencexn--cck2b3barrel-of-knowledgemologicallyngenvir" + - "onmentalconservationflfanfshostrolekamisunagawaugustowadaegubs3-" + - "ca-central-1xn--cg4bkis-very-evillagexn--ciqpnxn--clchc0ea0b2g2a" + - "9gcdn77-sslattumisakis-into-carshioyanagawaxn--comunicaes-v6a2ox" + - "n--correios-e-telecomunicaes-ghc29axn--czr694barrell-of-knowledg" + - "eologyonagoyaukraanghkeymachineustarhubalestrandabergamoareke164" + - "xn--czrs0tromsojaworznoxn--czru2dxn--czrw28bashkiriaurskog-holan" + - "droverhalla-speziaeroportalaheadjudaicaaarborteaches-yogasawarac" + - "ingroks-theatree12xn--d1acj3basilicataniaustevollarvikarasjokara" + - "suyamarylhurstjordalshalsenaturbruksgymnaturhistorisches3-eu-cen" + - "tral-1xn--d1alfaromeoxn--d1atrusteexn--d5qv7z876clinichernigover" + - "nmentjometlifeinsurancexn--davvenjrga-y4axn--djrs72d6uyxn--djty4" + - "koryokamikawanehonbetsurutaharaxn--dnna-grajewolterskluwerxn--dr" + - "bak-wuaxn--dyry-iraxn--e1a4cliniquenoharaxn--eckvdtc9dxn--efvn9s" + - "owaxn--efvy88haibarakitahatakamatsukawaxn--ehqz56nxn--elqq16hair" + - "-surveillancexn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct429ko" + - "saigawaxn--fhbeiarnxn--finny-yuaxn--fiq228c5hspjelkavikomonoxn--" + - "fiq64basketballfinanzgoraustinnatuurwetenschappenaumburgjemnes3-" + - "eu-west-1xn--fiqs8spreadbettingxn--fiqz9spydebergxn--fjord-lraxn" + - "--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--fpcrj9c3dxn--frde-" + - "grandrapidsrlxn--frna-woaraisaijotrvarggatritonxn--frya-hraxn--f" + - "zc2c9e2clintonoshoesaseboknowsitallutskypexn--fzys8d69uvgmailxn-" + - "-g2xx48clothingrondarxn--gckr3f0fermobilyxn--gecrj9cloudnsdojoet" + - "suwanouchikujogaszczytnore-og-uvdaluxembourgrongaxn--ggaviika-8y" + - "a47hakatanotogawaxn--gildeskl-g0axn--givuotna-8yaotsurreyxn--gjv" + - "ik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050is-very-goodhandsonxn" + - "--gmqw5axn--h-2failxn--h1aeghakodatexn--h2brj9cnsaskatchewanxn--" + - "hbmer-xqaxn--hcesuolo-7ya35batodayonaguniversityoriikariyakumold" + - "eltaiwanairlinedre-eikerxn--hery-iraxn--hgebostad-g3axn--hmmrfea" + - "sta-s4acctrysiljan-mayenxn--hnefoss-q1axn--hobl-iraxn--holtlen-h" + - "xaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b" + - "6b1a6a2exn--imr513nxn--indery-fyasakaiminatoyonezawaxn--io0a7is-" + - "very-nicexn--j1aeferraraxn--j1amhakonexn--j6w193gxn--jlq61u9w7ba" + - "tsfjordishakotankarlsoyoshiokarasjohkamikoaniikappugliaustraliai" + - "sondriodejaneirochesterhcloudfunctions3-external-1xn--jlster-bya" + - "sugis-very-sweetpepperxn--jrpeland-54axn--jvr189misasaguris-into" + - "-cartoonshirahamatonbetsurnadalxn--k7yn95exn--karmy-yuaxn--kbrq7" + - "oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dx" + - "n--kltx9axn--klty5xn--42c2d9axn--koluokta-7ya57hakubadajozorahol" + - "taleniwaizumiotsukumiyamazonawsabaerobaticketshimonosekikawaxn--" + - "kprw13dxn--kpry57dxn--kpu716ferrarivnexn--kput3is-with-thebandoo" + - "mdnsiskinkyotobetsumidatlantichoseiroumuenchenisshingugexn--krag" + - "er-gyasuokanraxn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxaxn" + - "--krjohka-hwab49jevnakershuscultureggio-emilia-romagnakatombetsu" + - "my-routerxn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyatomitamamurax" + - "n--kvnangen-k0axn--l-1fairwindsrtrentinosudtirolxn--l1accenturek" + - "lamborghiniizaxn--laheadju-7yatsukanumazuryxn--langevg-jxaxn--lc" + - "vr32dxn--ldingen-q1axn--leagaviika-52bauhausposts-and-telecommun" + - "icationsncfdivtasvuodnakaiwamizawaustrheimatunduhrennesoyokotebi" + - "nagisochildrensgardenaustdalavagiskebinorfolkebibleikangerxn--le" + - "sund-huaxn--lgbbat1ad8jewelryxn--lgrd-poacoachampionshiphoptobam" + - "agentositelekommunikationlinebraskaunjargallupinbbcaseihichisobe" + - "tsuitainairforceoceanographics3-website-eu-west-1xn--lhppi-xqaxn" + - "--linds-pramericanartulangevagrarboretumbriamallamaintenancechir" + - "ealminnesotaketakatsukis-into-animelbournexn--lns-qlansrvareserv" + - "eblogspotrentinosued-tirolxn--loabt-0qaxn--lrdal-sraxn--lrenskog" + - "-54axn--lt-liacntoyonoxn--lten-granexn--lury-iraxn--mely-iraxn--" + - "merker-kuaxn--mgb2ddestordalxn--mgb9awbferreroticanonoichinomiya" + - "kexn--mgba3a3ejtunesomnaritakurashikis-savedunetbankharkivguccip" + - "rianiigataishinomakimobetsuliguriaxn--mgba3a4f16axn--mgba3a4fran" + - "amizuholdingsmileksvikosakaerodromegalsacebetsukubankhmelnytskyi" + - "vanylvenicexn--mgba7c0bbn0axn--mgbaakc7dvfetsundynvpnxn--mgbaam7" + - "a8hakuis-a-nascarfanxn--mgbab2bdxn--mgbai9a5eva00bbtateshinanoma" + - "chintaifun-dnsaliaskimitsubatamicable-modembetsukuibigawauthorda" + - "landroiddnskingjerdrumckinseyokozebizenakaniikawatanaguraetnagah" + - "amaroygardendoftheinternetflixilovecollegefantasyleaguernseyboml" + - "oans3-ap-northeast-2xn--mgbai9azgqp6jewishartgalleryxn--mgbayh7g" + - "padualstackspace-to-rentalstomakomaibaraxn--mgbb9fbpobanazawaxn-" + - "-mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgberp4a5d4a87gxn--m" + - "gberp4a5d4arxn--mgbi4ecexposedxn--mgbpl2fhskleppiagetmyiphilipsy" + - "nology-diskstationxn--mgbqly7c0a67fbcolonialwilliamsburgrossetou" + - "chijiwadellogliastradingroundhandlingroznyxn--mgbqly7cvafredriks" + - "tadtvstoreitrentinosuedtirolxn--mgbt3dhdxn--mgbtf8flatangerxn--m" + - "gbtx2bbvacationswatch-and-clockerxn--mgbx4cd0abbottunkongsbergxn" + - "--mix082fgunmarcheaparisor-fronxn--mix891fhvalerxn--mjndalen-64a" + - "xn--mk0axindustriesteambulancexn--mk1bu44coloradoplateaudioxn--m" + - "kru45isleofmandalxn--mlatvuopmi-s4axn--mli-tlanxesstorfjordxn--m" + - "lselv-iuaxn--moreke-juaxn--mori-qsakuragawaxn--mosjen-eyatsushir" + - "oxn--mot-tlapyxn--mre-og-romsdal-qqbeppublishproxyzgorzeleccolog" + - "newspaperxn--msy-ula0hakusandiegoodyearthadselfipassagenshimonit" + - "ayanagitlaborxn--mtta-vrjjat-k7afamilycompanycolumbusheyxn--muos" + - "t-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--45brj9ci" + - "vilaviationxn--nit225koseis-an-actresshiojirishirifujiedaxn--nme" + - "sjevuemie-tcbalatinord-frontierxn--nnx388axn--nodexn--nqv7fs00em" + - "axn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nttery-byaeservecount" + - "erstrikexn--nvuotna-hwaxn--nyqy26axn--o1achattanooganordreisa-ge" + - "ekosherbrookegawaxn--o3cw4haldenxn--od0algxn--od0aq3bernuorockar" + - "tuzyukibmdivttasvuotnakamagayachts3-website-sa-east-1xn--ogbpf8f" + - "lekkefjordxn--oppegrd-ixaxn--ostery-fyawaraxn--osyro-wuaxn--p1ac" + - "fidonnakamuratajimicrolightinguovdageaidnunzenxn--p1aissmarterth" + - "anyouxn--pbt977communitysfjordyndns-weberlincolnxn--pgbs0dhlxn--" + - "porsgu-sta26fieldyroyrvikinguitarschweizparaglidingujolsterxn--p" + - "ssu33lxn--pssy2uxn--q9jyb4comobaraxn--qcka1pmcdonaldstpetersburg" + - "xn--qqqt11misconfusedxn--qxamuneuestreamsterdamnserverbaniaxn--r" + - "ady-iraxn--rdal-poaxn--rde-ulaquilancashirehabmerxn--rdy-0nabari" + - "wchoshibuyachiyodavvenjargaulardalukowiiheyaizuwakamatsubushikus" + - "akadogawaxn--rennesy-v1axn--rhkkervju-01aflakstadaokagakibichuox" + - "n--rholt-mragowoodsidexn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn" + - "--risa-5narusawaxn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmsk" + - "og-byawatahamaxn--rny31halsaintlouis-a-anarchistoireggio-calabri" + - "axn--rovu88beskidyn-vpncasertaipeiheijiinetnedalimanowarudautomo" + - "tivecodyn-o-saurlandes3-fips-us-gov-west-1xn--rros-granvindafjor" + - "dxn--rskog-uuaxn--rst-0narutokyotangovturystykannamihamadaxn--rs" + - "ta-francaiseharaxn--ryken-vuaxn--ryrvik-byaxn--s-1faitheguardian" + - "xn--s9brj9comparemarkerryhotelsassaris-a-doctorayxn--sandnessjen" + - "-ogbizxn--sandy-yuaxn--seral-lraxn--ses554gxn--sgne-gratangenxn-" + - "-skierv-utazaskvolloabathsbcompute-1xn--skjervy-v1axn--skjk-soax" + - "n--sknit-yqaxn--sknland-fxaxn--slat-5narviikamishihoronobeauxart" + - "sandcraftstudioxn--slt-elabbvieeexn--smla-hraxn--smna-gratis-a-b" + - "ruinsfanxn--snase-nraxn--sndre-land-0cbstudyndns-at-homedepotenz" + - "amamicrosoftbankomorotsukaminoyamaxunusualpersonxn--snes-poaxn--" + - "snsa-roaxn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-va" + - "ranger-ggbestbuyshouses3-website-us-east-1xn--srfold-byaxn--srre" + - "isa-q1axn--srum-grazxn--stfold-9xaxn--stjrdal-s1axn--stjrdalshal" + - "sen-sqbetainaboxfusejnynysadodgeometre-experts-comptables3-websi" + - "te-us-west-1xn--stre-toten-zcbieigersundiyukuhashimoichinosekiga" + - "harautoscanadaejeonbukaratehimeji234xn--t60b56axn--tckweathercha" + - "nnelxn--tiq49xqyjfkhersonxn--tjme-hraxn--tn0agrinet-freakstuff-4" + - "-salexn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trgstad-r1axn--t" + - "rna-woaxn--troms-zuaxn--tysvr-vraxn--uc0atvaroyxn--uc0ay4axn--ui" + - "st22hammarfeastafricapetownnews-stagingxn--uisz3gxn--unjrga-rtao" + - "baokinawashirosatochiokinoshimalatvuopmiasakuchinotsuchiurakawal" + - "brzycharternopilawalesundxn--unup4yxn--uuwu58axn--vads-jraxn--va" + - "rd-jraxn--vegrshei-c0axn--vermgensberater-ctbielawalterxn--vermg" + - "ensberatung-pwbiellaakesvuemielecceu-2xn--vestvgy-ixa6oxn--vg-yi" + - "abcgxn--vgan-qoaxn--vgsy-qoa0jgoraxn--vgu402computerhistoryofsci" + - "ence-fictionxn--vhquvbarclays3-website-ap-southeast-1xn--vler-qo" + - "axn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861bieszczad" + - "ygeyachimataikikonaioirasebastopologyeongnamegawakeisenbahnhlfan" + - "hs3-website-us-west-2xn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dx" + - "n--wgbh1comsecuritytacticsatxn--1ck2e1balsfjordgcahcesuolodingen" + - "aval-d-aosta-valleyolasitemrxn--wgbl6axn--xhq521bievatmallorcada" + - "quesakuraiitatebayashiibaghdadultateyamaveroykenglanddnss3-sa-ea" + - "st-1xn--xkc2al3hye2axn--xkc2dl3a5ee0hamurakamigoriginshimosuwalk" + - "is-a-nurservebbshimotsukexn--y9a3aquariumishimatsunoxn--yer-znar" + - "vikoshimizumakis-an-anarchistoricalsocietyxn--yfro4i67oxn--ygard" + - "en-p1axn--ygbi2ammxn--45q11civilisationxn--ystre-slidre-ujbifuka" + - "gawarszawashingtondclkarmoyurihonjoyentatsunoceanographiquevents" + - "akyotanabeneventoeidsvollimitednpagefrontappagespeedmobilizerodd" + - "avocatanzarowegroweibolzanordkappgafanpachigasakidsmynasushiobar" + - "agusarts3-us-east-2xn--zbx025dxn--zf0ao64axn--zf0avxn--4gbrimini" + - "ngxn--zfr164bihorologyusuharavoues3-us-gov-west-1xperiaxz" +const text = "bifukagawalterbihorologybikedagestangeorgeorgiaxasnesoddenmarkha" + + "ngelskjakdnepropetrovskiervaapsteiermarkaragandabruzzoologicalvi" + + "nklein-addrammenuernberggfarmerseine12bilbaogakidsmynasushiobara" + + "gusartsalangeninohekinannestadray-dnsiskinkyotobetsumidatlantica" + + "tholicheltenham-radio-opencraftranagatorodoybillustrationinomiya" + + "konojosoyrorosalondonetskarpaczeladzjavald-aostarnbergladegreevj" + + "e-og-hornnesaltdalimitedraydnsupdaternopilawabioceanographiquebi" + + "rdartcenterprisesakikuchikuseikarugamvikaruizawabirkenesoddtange" + + "novaraumalopolskanlandrivelandrobaknoluoktachikawakembuchikumaga" + + "yagawakkanaibetsubamericanfamilydscloudcontrolledekafjordrudunsa" + + "lvadordalibabalatinord-aurdalvdalaskanittedallasalleasinglesuran" + + "certmgretagajobojinzais-a-candidatebirthplacebjarkoybjerkreimbal" + + "sfjordgcahcesuolocus-1bjugnirasakis-a-catererblockbustermezlglas" + + "sassinationalheritagematsubarakawagoebloombergbauernishiazais-a-" + + "celticsfanishigoddabloxcmsalzburgliwicebluedancebmoattachmentsam" + + "egawabmsamnangerbmwegroweibolzanordkappgafanquannefrankfurtjmaxx" + + "xboxenapponazure-mobilebnpparibaselburglobalashovhachinohedmarka" + + "rumaifarmsteadupontariomutashinais-a-chefarsundurbanamexnethnolo" + + "gybnrweirbonnishiharabookinglobodoes-itvedestrandurhamburglogowf" + + "ashionishiizunazukis-a-conservativefsnillfjordvrcambridgestonexu" + + "s-2bootsamsclubindalimoliserniaboschaefflerdalindashorokanaiebos" + + "tikasaokaminokawanishiaizubangebostonakijinsekikogentingloppenza" + + "ogashimadachicagoboatsamsungmbhartiffanybotanicalgardenishikatak" + + "ayamatta-varjjatjometlifeinsurancebotanicgardenishikatsuragithub" + + "usercontentjxfinitybotanybouncemerckmsdnipropetrovskjervoyagebou" + + "nty-fullensakerrypropertiesandvikcoromantovalle-d-aostatic-acces" + + "sanfranciscofreakunemurorangeiseiyoichippubetsubetsugaruhrboutiq" + + "uebecngminakamichiharabozentsujiiebplacedogawarabikomaezakirunor" + + "dlandvrdnsangoppdalindesnesanjournalismailillesandefjordyndns-at" + + "-workinggroupaleobrandywinevalleybrasiliabresciabrindisibenikebr" + + "istoloslocalhistorybritishcolumbialowiezachpomorskienishikawazuk" + + "amitondabayashiogamagoriziabroadcastlegallocalhostrodawaravennag" + + "asukebroadwaybroke-itkmaxxjaworznowtvalled-aostavangerbrokerbron" + + "noysundyndns-blogdnsannanishimerabrothermesaverdeatnurembergmode" + + "nakasatsunais-a-cpadualstackspace-to-rentalstomakomaibarabrowser" + + "safetymarketsannohelplfinancialivornobrumunddalombardiamondsanok" + + "ashibatakashimaseratis-a-cubicle-slavellinotteroybrunelasticbean" + + "stalkashiharabrusselsantabarbarabruxellesantacruzsantafedjeffers" + + "onishinomiyashironobryanskleppalermomahachijorpelandyndns-freebo" + + "x-ostrowwlkpmgmxn--0trq7p7nnishinoomotegobrynewhollandyndns-home" + + "dnsanukis-a-democratmpalmspringsakerbuskerudinewmexicodyn-vpnplu" + + "sterbuzenishinoshimattelefonicarbonia-iglesias-carboniaiglesiasc" + + "arboniabuzzpamperedchefastlylbaltimore-og-romsdalwaysdatabasebal" + + "langenoamishirasatochigiessensiositelemarkarateu-1bwhalingrimsta" + + "dyndns-ipirangaulardalombardynamisches-dnsaotomemergencyachtsapo" + + "dlasiellaktyubinskiptveterinairealtorlandyndns-mailomzaporizhzhe" + + "guris-a-designerimarumorimachidabzhitomirumalselvendrellorenskog" + + "ripescaravantaacondoshichinohealth-carereformitakeharaconference" + + "constructionconsuladoesntexistanbullensvanguardyndns1consultanth" + + "ropologyconsultingvolluroycontactoyotsukaidownloadynnsaskatchewa" + + "ncontemporaryarteducationalchikugodoharuovatoyouracontractorsken" + + "conventureshinodesashibetsuikinderoycookingchannelblagdenesnaase" + + "ralingenkainanaejrietisalatinabenonichernivtsiciliacoolkuszczytn" + + "ore-og-uvdalutskasuyameldaluxembourgrpanamacooperaunitenrightath" + + "omeftpanasonichernovtsykkylvenetogakushimotoganewspapercopenhage" + + "ncyclopedichirurgiens-dentistes-en-francecorsicagliaridagawarsza" + + "washingtondclkaszubycorvettevadsoccertificationcosenzagancosidns" + + "dojoetsuwanouchikujogaszkoladbrokesassaris-a-huntercostumedio-ca" + + "mpidano-mediocampidanomediocouchpotatofriesatxn--11b4c3dynv6coun" + + "ciluxurycouponsaudacoursesauheradynvpnchiryukyuragifuchungbukhar" + + "acq-acranbrookuwanalyticsavannahgacreditcardyroyrvikingruecredit" + + "unioncremonashgabadaddjambyluzerncrewiiheyakagecricketrzyncrimea" + + "st-kazakhstanangercrotonextdirectoystre-slidrettozawacrownprovid" + + "ercrsvparaglidinguitarsaves-the-whalessandria-trani-barletta-and" + + "riatranibarlettaandriacruisesavonaplesaxocryptonomichigangwoncui" + + "sinellahppiacenzakopanerairguardiannakadomarinebraskaunjargalsac" + + "eoculturalcentertainmentozsdeltaitogliattiresbschokoladencuneocu" + + "pcakecxn--12c1fe0bradescorporationcyberlevagangaviikanonjis-a-kn" + + "ightpointtokaizukamikitayamatsuris-a-landscapercymrussiacyonabar" + + "ulvikatowicecyouthdfcbankatsushikabeeldengeluidfidonnakamurataji" + + "mibuildingulenfieldfiguerestaurantraniandriabarlettatraniandriaf" + + "ilateliafilegearthachiojiyahoofilminamidaitomangotsukisosakitaga" + + "wafinalfinancefineartschwarzgwangjuifminamiechizenfinlandfinnoyf" + + "irebaseapparisor-fronfirenzefirestonefirmdaleirvikaufenfishingol" + + "ffanschweizwildlifedorainfracloudfrontdoorfitjarmeniafitnessettl" + + "ementranoyfjalerflesbergunmarburguovdageaidnuslivinghistoryflick" + + "ragerotikakamigaharaflightsciencecentersciencehistoryflirflogint" + + "ogurafloraflorencefloridavvesiidazaifudaigojomedizinhistorisches" + + "cientistoragefloripaderbornfloristanohatakahamangyshlakasamatsud" + + "ontexisteingeekautokeinoflorogerscjohnsonflowerscotlandflynnhuba" + + "mblefrakkestadiscountysnes3-sa-east-1fndfoodnetworkshoppingushik" + + "amifuranortonsbergxn--12co0c3b4evalleaostatoilfor-ourfor-someetn" + + "edalfor-theaterforexrothachirogatakahatakaishimogosenforgotdnscr" + + "apper-siteforli-cesena-forlicesenaforlikescandynamic-dnscrapping" + + "forsaleitungsenforsandasuolodingenfortmissoulair-traffic-control" + + "leyfortworthadanosegawaforuminamifuranofosneserveftparliamentran" + + "sportransurlfotaruis-a-lawyerfoxfordedyn-ip24freeboxoservegame-s" + + "erversailleservehalflifestylefreemasonryfreetlservehttparmafreib" + + "urgfreightcminamiiselectrapaniimimatakatoris-a-liberalfresenius-" + + "3fribourgfriuli-v-giuliafriuli-ve-giuliafriuli-vegiuliafriuli-ve" + + "nezia-giuliafriuli-veneziagiuliafriuli-vgiuliafriuliv-giuliafriu" + + "live-giuliafriulivegiuliafriulivenezia-giuliafriuliveneziagiulia" + + "friulivgiuliafrlfroganservehumourfrognfrolandfrom-akrehamnfrom-a" + + "lfrom-arqhadselfiparocherkasyno-dserveirchitachinakagawassamukaw" + + "ataricohdatsunanjoburgriwataraidyndns-office-on-the-webcampobass" + + "ociatesapporofrom-azfrom-capebretonamiastapleserveminecraftravel" + + "channelfrom-collectionfrom-ctravelersinsurancefrom-dchitosetogit" + + "suldalotenkawafrom-defenseljordfrom-flanderservemp3from-gausdalf" + + "rom-higashiagatsumagoizumizakirkeneservep2parservepicservequakef" + + "rom-iafrom-idfrom-ilfrom-incheonfrom-kservesarcasmatartanddesign" + + "from-kyowariasahikawafrom-lajollamericanexpressexyfrom-maniwakur" + + "atextileksvikazofrom-mdfrom-megurokunohealthcareerservicesettsur" + + "geonshalloffamemorialfrom-microsoftbankazunofrom-mnfrom-modellin" + + "gfrom-msevastopolefrom-mtnfrom-nchloefrom-ndfrom-nefrom-nhktrdfr" + + "om-njcbnlfrom-nminamiizukamisatokamachintaifun-dnsaliasdaburfrom" + + "-nvalledaostavernfrom-nyfrom-ohkurafrom-oketohmannorth-kazakhsta" + + "nfrom-orfrom-padovaksdalfrom-pratohnoshoooshikamaishimodatefrom-" + + "rivnefrom-schoenbrunnfrom-sdfrom-tnfrom-txn--1ck2e1bananarepubli" + + "caseihichisobetsuitainairforcechirealminamiawajikibmdiscoveryomb" + + "ondishakotanavigationavoiitatebayashiibahcavuotnagaraholtaleniwa" + + "izumiotsukumiyamazonawsadodgemologicallyngenvironmentalconservat" + + "ionavuotnaklodzkodairassnasabaerobaticketselinogradultashkentata" + + "motors3-ap-northeast-2from-utazuerichardlillehammerfeste-ipartis" + + "-a-libertarianfrom-val-daostavalleyfrom-vtrentino-a-adigefrom-wa" + + "from-wielunnerfrom-wvallee-aosteroyfrom-wyfrosinonefrostalowa-wo" + + "lawafroyahikobeardubaiduckdnsevenassisicilyfstcgroupartnersewill" + + "iamhillfujiiderafujikawaguchikonefujiminohtawaramotoineppubologn" + + "akanotoddenfujinomiyadafujiokayamansionsfranziskanerdpolicefujis" + + "atoshonairtelecityeatsharis-a-linux-useranishiaritabashijonawate" + + "fujisawafujishiroishidakabiratoridefinimakanegasakindlegokasells" + + "-for-lessharpartshawaiijimarugame-hostrolekameokameyamatotakadaf" + + "ujitsurugashimaritimekeepingfujixeroxn--1ctwolominamatakkokamino" + + "yamaxunusualpersonfujiyoshidafukayabeatshellaspeziafukuchiyamada" + + "fukudominichocolatemasekashiwazakiyosatokashikiyosemitefukuis-a-" + + "llamarylandfukumitsubishigakirovogradoyfukuokazakiryuohaebarumin" + + "amimakis-a-musicianfukuroishikarikaturindalfukusakisarazurewebsi" + + "teshikagamiishibukawafukuyamagatakaharustkanoyakumoldeloittexasc" + + "olipicenoipifonynysaarlandfunabashiriuchinadafunagatakahashimama" + + "kishiwadafunahashikamiamakusatsumasendaisennangonohejis-a-nascar" + + "fanfundaciofuoiskujukuriyamanxn--1lqs03nfuosskoczowinbarcelonaga" + + "sakijobserverisignieznord-frontiereviewskrakowedeployomitanobihi" + + "rosakikamijimastronomy-gatewaybomloans3-ap-south-1furnituredston" + + "efurubiraquarelleborkangerfurudonostiaarpartyfurukawairtrafficho" + + "funatoriginsurecifedexhibitionishiokoppegardyndns-picsardegnamss" + + "koganeis-a-doctorayfusodegaurafussaikisofukushimaoris-a-nurserve" + + "bbshimojis-a-painteractivegarsheis-a-patsfanfutabayamaguchinomig" + + "awafutboldlygoingnowhere-for-moregontrailroadfuttsurugimperiafut" + + "urehostingfuturemailingfvgfyis-a-personaltrainerfylkesbiblackfri" + + "dayfyresdalhangoutsystemscloudfunctionshimokawahannanmokuizumode" + + "rnhannotaireshimokitayamahanyuzenhapmirhareidsbergenharstadharve" + + "stcelebrationhasamarcheapassagenshimonitayanagitlaborhasaminami-" + + "alpssells-itrentino-aadigehashbanghasudahasura-appassenger-assoc" + + "iationhasvikddielddanuorrikuzentakataiwanairlinedre-eikerhatogay" + + "aitakamoriokalmykiahatoyamazakitahiroshimarnardalhatsukaichikais" + + "eis-a-republicancerresearchaeologicaliforniahattfjelldalhayashim" + + "amotobungotakadapliernewjerseyhazuminobusellsyourhomegoodshimono" + + "sekikawahboehringerikehelsinkitakamiizumisanofidelitysvardollshi" + + "mosuwalkis-a-rockstarachowicehembygdsforbundhemneshimotsukehemse" + + "dalhepforgeherokussldheroyhgtvalleeaosteigenhigashichichibunkyon" + + "anaoshimageandsoundandvisionhigashihiroshimanehigashiizumozakita" + + "katakanabeautydalhigashikagawahigashikagurasoedahigashikawakitaa" + + "ikitakyushuaiahigashikurumeiwamarriottrentino-alto-adigehigashim" + + "atsushimarshallstatebankfhappouhigashimatsuyamakitaakitadaitoiga" + + "wahigashimurayamamotorcycleshimotsumahigashinarusembokukitamidor" + + "is-a-socialistmein-vigorgehigashinehigashiomihachimanchesterhiga" + + "shiosakasayamanakakogawahigashishirakawamatakanezawahigashisumiy" + + "oshikawaminamiaikitamotosumitakagildeskaliszhigashitsunotogawahi" + + "gashiurausukitanakagusukumoduminamiminowahigashiyamatokoriyamana" + + "shifteditchyouripaviancarrierhigashiyodogawahigashiyoshinogaris-" + + "a-soxfanhiraizumisatohobby-sitehirakatashinagawahiranais-a-stude" + + "ntalhirarahiratsukagawahirayaizuwakamatsubushikusakadogawahistor" + + "ichouseshinichinanhitachiomiyaginankokubunjis-a-teacherkassymant" + + "echnologyhitachiotagooglecodespotrentino-altoadigehitraeumtgerad" + + "elmenhorstalbanshinjournalistjohnhjartdalhjelmelandholeckobierzy" + + "ceholidayhomeipfizerhomelinkhakassiahomelinuxn--1lqs71dhomeoffic" + + "ehomesecuritymaceratakaokaluganskolevangerhomesecuritypccwindmil" + + "lhomesenseminehomeunixn--1qqw23ahondahoneywellbeingzonehongopocz" + + "northwesternmutualhonjyoitakarazukamakurazakitashiobarahornindal" + + "horseoulminamiogunicomcastresistancehortendofinternet-dnshinjuku" + + "manohospitalhoteleshinkamigotoyohashimotoshimahotmailhoyangerhoy" + + "landetroitskydivinghumanitieshinshinotsurgeryhurdalhurumajis-a-t" + + "echietis-a-therapistoiahyllestadhyogoris-an-accountantshinshiroh" + + "yugawarahyundaiwafunehzchoseiroumuenchenishitosashimizunaminamia" + + "shigarajfkhmelnitskiyamashikejgorajlchoyodobashichikashukujitawa" + + "rajlljmpharmacienshiojirishirifujiedajnjcpgfoggiajoyokaichibahcc" + + "avuotnagareyamalborkdalpha-myqnapcloudapplebesbyglandjpmorganjpn" + + "jprshioyanaizujuniperjurkoshimizumakis-an-engineeringkoshunantok" + + "igawakosugekotohiradomainshirakofuefukihaboromskoguchikuzenkotou" + + "rakouhokutamakis-an-entertainerkounosupplieshiranukamogawakouyam" + + "ashikokuchuokouzushimasoykozagawakozakis-bykpnkppspdnshiraois-ce" + + "rtifieducatorahimeshimamateramochizukirakrasnodarkredirectmelhus" + + "cultureggio-calabriakristiansandcatshiraokanagawakristiansundkro" + + "dsheradkrokstadelvaldaostarostwodzislawindowshiratakahagivestbyk" + + "ryminamisanrikubetsupportrentino-sued-tirolkumatorinokumejimasud" + + "akumenanyokkaichiropractichristmasakikugawatchandclockasukabedzi" + + "n-the-bandaikawachinaganoharamcoachampionshiphoptobishimaizurugb" + + "ydgoszczecinemakeupowiathletajimabariakeisenbahnishiwakis-a-fina" + + "ncialadvisor-aurdalottokonamegatakasugais-a-geekgalaxykunisakis-" + + "foundationkunitachiarailwaykunitomigusukumamotoyamassa-carrara-m" + + "assacarraramassabusinessebytomaritimobarakunneppulawykunstsammlu" + + "ngkunstunddesignkuokgrouphdkureggio-emilia-romagnakatsugawakurga" + + "nkurobelaudiblebtimnetzkurogimilanokuroisoftwarendalenugkuromats" + + "unais-gonekurotakikawasakis-into-animelbournekushirogawakustanai" + + "s-into-carshintomikasaharakusupplykutchanelkutnokuzumakis-into-c" + + "artoonshinyoshitomiokamitsuekvafjordkvalsundkvamfamberkeleykvana" + + "ngenkvinesdalkvinnheradkviteseidskogkvitsoykwpspiegelkzmissilewi" + + "smillermisugitokorozawamitourismolancastermitoyoakemiuramiyazumi" + + "yotamanomjondalenmlbfanmonmouthagebostadmonstermonticellolmontre" + + "alestatefarmequipmentrentino-suedtirolmonza-brianzaporizhzhiamon" + + "za-e-della-brianzapposhishikuis-not-certifiedunetbankharkovanylv" + + "enicemonzabrianzaptokuyamatsusakahoginowaniihamatamakawajimaphil" + + "adelphiaareadmyblogsitemonzaebrianzaramonzaedellabrianzamoonscal" + + "exusdecorativeartshisognemoparachutingmordoviajessheiminamitanem" + + "oriyamatsushigemoriyoshimilitarymormoneymoroyamatsuuramortgagemo" + + "scowinnershisuifuelveruminamiuonumatsumotofukemoseushistorymosjo" + + "enmoskeneshitaramamosshizukuishimofusaitamatsukuris-savedmosvikn" + + "x-serveronakatombetsunndalmoteginozawaonsenmoviemovistargardmtpc" + + "hromedicaltanissettairamtranbymuenstermugithubcloudusercontentre" + + "ntinoa-adigemuikamishihoronobeauxartsandcraftshizuokananporovigo" + + "tpantheonsitemukochikushinonsenergymulhouservebeermunakatanemunc" + + "ieszynmuosattemuphilatelymurmanskolobrzegersundmurotorcraftrenti" + + "noaadigemusashimurayamatsuzakis-slickhersonmusashinoharamuseetre" + + "ntinoalto-adigemuseumverenigingmusicargodaddynaliascoli-picenogi" + + "ftshoujis-uberleetrentino-stirolmutsuzawamy-vigorlicemy-wanggouv" + + "icenzamyactivedirectorymyasustor-elvdalmycdn77-securechtrainingm" + + "ydissentrentinoaltoadigemydrobofagemydshowamyeffectrentinos-tiro" + + "lmyfirewallonieruchomoscienceandindustrynmyfritzmyftpaccesshowti" + + "meteorapphilipsynology-diskstationmyfusionmyhome-serverrankoshig" + + "ayanagawamykolaivaporcloudmymailermymediapchryslermyokohamamatsu" + + "damypepsongdalenviknakanojohanamakinoharamypetshriramlidlugoleka" + + "gaminoduminamiyamashirokawanabelembroideryggeelvincklabudhabikin" + + "okawabarthagakhanamigawamyphotoshibajddarchaeologyeongnamegawalb" + + "rzycharternidmypsxn--30rr7ymysecuritycamerakermyshopblocksienara" + + "shinomytis-a-bookkeeperugiamyvnchungnamdalseidfjordyndns-remotew" + + "dyndns-serverdalouvreggioemiliaromagnakayamatsumaebashikshacknet" + + "oyookanmakiwakunigamidsundyndns-weberlincolnissandnessjoenissayo" + + "koshibahikariwanumatakazakis-a-greenissedalowiczest-le-patrondhe" + + "immobilienisshingugepicturesilkomaganepiemontepilotsimple-urlpim" + + "ientaketomisatolgapinkomakiyosumy-routerpioneerpippuphonefossigd" + + "alpiszpittsburghofauskedsmokorsetagayasells-for-unzenpiwatepizza" + + "pkomatsushimashikizunokunimihoboleslawiechristiansburgroks-thisa" + + "yamanobeokakudamatsueplanetariuminanoplantationplantsirdalplatfo" + + "rmshangrilanciaplaystationplazaplchurchaseljeepostfoldnavyplumbi" + + "ngopmnpodzonepohlpoivronpokerpokrovskomforbarclays3-us-gov-west-" + + "1politiendapolkowicepoltavalle-aostathellezajskommunalforbundpom" + + "orzeszowioslingpordenonepornporsangerporsanguidellogliastradingp" + + "orsgrunnanpoznanpraxis-a-bruinsfanprdpreservationpresidioprgmrpr" + + "imeloyalistockholmestrandprincipeprivatizehealthinsuranceprochow" + + "iceproductionslupskommuneprofbsbxn--12cfi8ixb8lvivano-frankivska" + + "tsuyamasfjordenprogressivegasiapromombetsurfbx-oscholarshipschoo" + + "lpropertyprotectionprotonetrentinosud-tirolprudentialpruszkowitd" + + "komonoprzeworskogptplusgardenpvtrentinosudtirolpwcirclegnicafede" + + "rationiyodogawapzqldqponqslgbtrentinosued-tirolquicksytesnoasait" + + "omobellevuelosangelesjaguarchitecturealtychyattorneyagawalesundq" + + "uipelementsokanazawaqvcircustomerstuff-4-salestufftoread-booksne" + + "solognestuttgartritonsusakis-very-evillagesusonosuzakaneyamazoes" + + "uzukaniepcesuzukis-very-goodhandsonsvalbardunloppacificitadelive" + + "rysveiosvelvikongsbergsvizzeraswedenswidnicartierswiebodzindiana" + + "polis-a-bloggerswiftcoversicherungswinoujscienceandhistoryswissh" + + "ikis-very-nicesynology-dsolundbeckomorotsukamiokamikoaniikappugl" + + "iatushuissier-justicetuvalle-daostaticsomatuxfamilytwmailvennesl" + + "askerrylogisticsomnaritakurashikis-very-badajozoravestfoldvestne" + + "soovestre-slidreamhostersopotrentinosuedtirolvestre-totennishiaw" + + "akuravestvagoyvevelstadvibo-valentiavibovalentiavideovillaskimit" + + "subatamicable-modembetsukuis-very-sweetpeppervinnicartoonartdeco" + + "ffeedbackplaneappspotagervinnytsiavipsinaappiagetmyiphoenixn--32" + + "vp30haibarakitahatakamatsukawavirginiavirtualvirtueeldomeindianm" + + "arketingvirtuelvisakegawavistaprinternationalfirearmsor-odalvite" + + "rboltrogstadvivoldavixn--3bst00minnesotaketakatsukis-into-gamess" + + "inatsukigatakasagotembaixadavlaanderenvladikavkazimierz-dolnyvla" + + "dimirvlogoipictetrentinostirolvolkswagentsor-varangervologdansko" + + "ninjamisonvolvolkenkundenvolyngdalvossevangenvotevotingvotoyonak" + + "agyokutoursorfoldwloclawekonskowolayangroupharmacyshirahamatonbe" + + "tsurnadalwmflabsorreisahayakawakamiichikawamisatotalworldworse-t" + + "handawowithgoogleapisa-hockeynutsiracusakatakinouewritesthisblog" + + "sytewroclawithyoutubeneventoeidsvollwtcitichernigovernmentoyonow" + + "tfbxoschulewuozuwwwiwatsukiyonowruzhgorodeowzmiuwajimaxn--45brj9" + + "civilaviationxn--45q11civilisationxn--4gbriminingxn--4it168dxn--" + + "4it797konyveloftrentino-sudtirolxn--4pvxs4allxn--54b7fta0ccivili" + + "zationxn--55qw42gxn--55qx5dxn--5js045dxn--5rtp49civilwarmanageme" + + "ntoyosatoyakokonoexn--5rtq34kooris-an-anarchistoricalsocietyxn--" + + "5su34j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986" + + "b3xlxn--7t0a264claimsarlucaniaxn--80adxhksortlandxn--80ao21axn--" + + "80aqecdr1axn--80asehdbarreauctionflfanfshostrowiecasertaipeiheij" + + "iiyamanouchikuhokuryugasakitaurayasudaukraanghkeymachineustarhub" + + "alsanagochihayaakasakawaharanzanpachigasakicks-assedicasadelamon" + + "edatingjemnes3-ap-southeast-2xn--80aswgxn--80audnedalnxn--8ltr62" + + "kopervikhmelnytskyivaolbia-tempio-olbiatempioolbialystokkepnogat" + + "aijis-an-actresshintokushimaxn--8pvr4uxn--8y0a063axn--90a3academ" + + "y-firewall-gatewayxn--90aishobaraomoriguchiharahkkeravjuedisches" + + "apeakebayernrtromsakakinokiaxn--90azhytomyrxn--9dbhblg6dietcimdb" + + "arrel-of-knowledgeologyonagoyaurskog-holandroverhalla-speziaerop" + + "ortalaheadjudaicaaarborteaches-yogasawaracingroks-theatree164xn-" + + "-9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--aroport-byandexn--3d" + + "s443gxn--asky-iraxn--aurskog-hland-jnbarrell-of-knowledgeometre-" + + "experts-comptables3-us-west-1xn--avery-yuasakuhokkaidoomdnshome-" + + "webservercellikes-piedmontblancomeeresorumincommbankmpspbarclayc" + + "ards3-us-east-2xn--b-5gaxn--b4w605ferdxn--bck1b9a5dre4cldmailucc" + + "apitalonewportlligatoyotaris-a-gurulsandoyxn--bdddj-mrabdxn--bea" + + "ralvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7ax" + + "n--bidr-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fyaotsurreyxn--bj" + + "ddar-ptamayufuettertdasnetzxn--blt-elabourxn--bmlo-graingerxn--b" + + "od-2naroyxn--brnny-wuaccident-investigation-aptibleaseating-orga" + + "nicbcn-north-1xn--brnnysund-m8accident-prevention-webhopenairbus" + + "antiquest-a-la-maisondre-landebudapest-a-la-masionionjukudoyamag" + + "entositelekommunikationthewifiat-band-campaniaxn--brum-voagatrom" + + "sojampagefrontapphotographysioxn--btsfjord-9zaxn--c1avgxn--c2br7" + + "gxn--c3s14mintelligencexn--cck2b3barsyonlinewhampshirebungoonord" + + "-odalazioceanographics3-us-west-2xn--cg4bkis-with-thebandovre-ei" + + "kerxn--ciqpnxn--clchc0ea0b2g2a9gcdn77-sslattumisakis-leetrentino" + + "-s-tirollagrigentomologyeongbukharkivgucciprianiigataishinomakim" + + "obetsuliguriaxn--comunicaes-v6a2oxn--correios-e-telecomunicaes-g" + + "hc29axn--czr694bashkiriaustevollarvikarasjohkamiminers3-ca-centr" + + "al-1xn--czrs0trusteexn--czru2dxn--czrw28basilicataniaustinnatura" + + "lsciencesnaturelles3-eu-central-1xn--d1acj3basketballfinanzgorau" + + "straliaisondriodejaneirochesterepbodynathomebuiltatarantottoribe" + + "staddnskingjerdrumckinseyokosukanzakiwienaturbruksgymnaturhistor" + + "isches3-eu-west-1xn--d1alfaromeoxn--d1atrvarggatroandinosaureise" + + "nxn--d5qv7z876clickasumigaurawa-mazowszextraspacekitagatajirissa" + + "gamiharaxn--davvenjrga-y4axn--djrs72d6uyxn--djty4koryokamikawane" + + "honbetsurutaharaxn--dnna-grajewolterskluwerxn--drbak-wuaxn--dyry" + + "-iraxn--e1a4clinichernihivanovodkagoshimalvikashiwaraxn--eckvdtc" + + "9dxn--efvn9southcarolinazawaxn--efvy88hair-surveillancexn--ehqz5" + + "6nxn--elqq16hakatanoshiroomuraxn--estv75gxn--eveni-0qa01gaxn--f6" + + "qx53axn--fct429kosaigawaxn--fhbeiarnxn--finny-yuaxn--fiq228c5hso" + + "uthwestfalenxn--fiq64batodayonaguniversityoriikariyaltakasakiyok" + + "awaraustrheimatunduhrennesoyokoteastcoastaldefencebinagisochildr" + + "ensgardenatuurwetenschappenaumburgjerstadotsuruokakegawaetnagaha" + + "maroygardenebakkeshibechambagriculturennebudejjudygarlandd-dnsfo" + + "r-better-thanawawdev-myqnapcloudcontrolapplinzi234xn--fiqs8sowax" + + "n--fiqz9spjelkavikomvuxn--2m4a15exn--fjord-lraxn--fjq720axn--fl-" + + "ziaxn--flor-jraxn--flw351exn--fpcrj9c3dxn--frde-grandrapidspread" + + "bettingxn--frna-woaraisaijotrysiljanxn--frya-hraxn--fzc2c9e2clin" + + "iquenoharaxn--fzys8d69uvgmailxn--g2xx48clintonoshoesarpsborgrond" + + "arxn--gckr3f0fedorapeopleirfjordxn--gecrj9clothingrongaxn--ggavi" + + "ika-8ya47hakodatexn--gildeskl-g0axn--givuotna-8yasakaiminatoyone" + + "zawaxn--gjvik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050isleofmand" + + "alxn--gmqw5axn--h-2failxn--h1aeghakonexn--h2brj9cnsarufutsunomiy" + + "awakasaikaitakoelnxn--h3cuzk1digitalxn--hbmer-xqaxn--hcesuolo-7y" + + "a35batsfjordivtasvuodnakaiwamizawauthordalandroiddnss3-eu-west-2" + + "xn--hery-iraxn--hgebostad-g3axn--hmmrfeasta-s4acctulangevagrarbo" + + "retumbriaxn--hnefoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqa" + + "xn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b6b1a6a2exn--imr" + + "513nxn--indery-fyasugissmarterthanyouxn--io0a7iwchoshibuyachiyod" + + "avvenjargapartmentsardiniaxn--j1aefedoraprojectrani-andria-barle" + + "tta-trani-andriaxn--j1amhakubaghdadxn--j6w193gxn--jlq61u9w7bauha" + + "usposts-and-telecommunicationsncfdivttasvuotnakamagayahababyklec" + + "lercasinordre-landiyoshiokaracoldwarmiamihamadautomotivecoalipay" + + "okozebinorfolkebibleikangereportateshinanomachimkentateyamagroce" + + "rybnikahokutobamaintenancebetsukubank12xn--jlster-byasuokanraxn-" + + "-jrpeland-54axn--jvr189misasaguris-lostre-toteneis-an-actorxn--k" + + "7yn95exn--karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--kl" + + "bu-woaxn--klt787dxn--kltp7dxn--kltx9axn--klty5xn--3e0b707exn--ko" + + "luokta-7ya57hakuis-a-photographerokuappasadenamsosnowiechonanbui" + + "lderschmidtre-gauldalottexn--kprw13dxn--kpry57dxn--kpu716fermoda" + + "lenxn--kput3ixn--krager-gyatomitamamuraxn--kranghke-b0axn--krdsh" + + "erad-m8axn--krehamn-dxaxn--krjohka-hwab49jeonnamerikawauexn--ksn" + + "es-uuaxn--kvfjord-nxaxn--kvitsy-fyatsukanumazuryxn--kvnangen-k0a" + + "xn--l-1fairwindspydebergxn--l1accentureklamborghiniizaxn--lahead" + + "ju-7yatsushiroxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leaga" + + "viika-52bbcateringebugattipschlesisches3-website-ap-northeast-1x" + + "n--lesund-huaxn--lgbbat1ad8jetztrentino-sud-tirolxn--lgrd-poacnt" + + "oyotomiyazakis-a-hard-workerxn--lhppi-xqaxn--linds-pramericanart" + + "unesolutionsokndalxn--lns-qlansrlxn--loabt-0qaxn--lrdal-sraxn--l" + + "renskog-54axn--lt-liacolonialwilliamsburgrossetouchijiwadell-ogl" + + "iastraderxn--lten-granexn--lury-iraxn--m3ch0j3axn--mely-iraxn--m" + + "erker-kuaxn--mgb2ddesrtrentoyokawaxn--mgb9awbferraraxn--mgba3a3e" + + "jtunkongsvingerxn--mgba3a4f16axn--mgba3a4franamizuholdingsmilelx" + + "n--mgba7c0bbn0axn--mgbaakc7dvferrarittogoldpoint2thisamitsukexn-" + + "-mgbaam7a8hakusandiegoodyearxn--mgbab2bdxn--mgbai9a5eva00bbtatto" + + "olsztynsettlers3-website-ap-southeast-1xn--mgbai9azgqp6jevnakers" + + "huscountryestateofdelawarezzoologyxn--mgbayh7gpagespeedmobilizer" + + "oxn--mgbb9fbpobanazawaxn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzd" + + "oxn--mgberp4a5d4a87gxn--mgberp4a5d4arxn--mgbi4ecexposedxn--mgbpl" + + "2fhskodjejuegoshikiminokamoenairportland-4-salernoboribetsucksrv" + + "areserveblogspotrevisohughesolarssonxn--mgbqly7c0a67fbcoloradopl" + + "ateaudioxn--mgbqly7cvafredrikstadtvstordalxn--mgbt3dhdxn--mgbtf8" + + "flatangerxn--mgbtx2bbvacationswatch-and-clockerhcloudns3-website" + + "-ap-southeast-2xn--mgbx4cd0abbotturystykannamifunexn--mix082ferr" + + "eroticanonoichinomiyakexn--mix891fetsundxn--mjndalen-64axn--mk0a" + + "xindustriesteambulancexn--mk1bu44columbusheyxn--mkru45ixn--mlatv" + + "uopmi-s4axn--mli-tlanxesstorehabmerxn--mlselv-iuaxn--moreke-juax" + + "n--mori-qsakuragawaxn--mosjen-eyawaraxn--mot-tlapyatigorskypexn-" + + "-mre-og-romsdal-qqbentleyukinfinitintuitaxihuanhlfanhs3-website-" + + "eu-west-1xn--msy-ula0haldenxn--mtta-vrjjat-k7afamilycompanycommu" + + "nitysfjordyndns-wikinkobayashikaoirminamibosogndalucernexn--muos" + + "t-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--3oq18vl8" + + "pn36axn--nit225kosakaerodromegallupinbarefootballooningjovikarat" + + "suginamikatagamiharuconnectatsunobiraugustowadaegubs3-ap-southea" + + "st-1xn--nmesjevuemie-tcbalestrandabergamoarekexn--nnx388axn--nod" + + "exn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nttery" + + "-byaeservecounterstrikexn--nvuotna-hwaxn--nyqy26axn--o1achattano" + + "oganordreisa-geekoseis-an-artisteinkjerusalemrxn--o3cw4halsaintl" + + "ouis-a-anarchistoiredumbrellanbibaidarxn--o3cyx2axn--od0algxn--o" + + "d0aq3beppublishproxyzgorzeleccolognewyorkshirecipesaro-urbino-pe" + + "sarourbinopesaromasvuotnaharimamurogawatches3-website-sa-east-1x" + + "n--ogbpf8flekkefjordxn--oppegrd-ixaxn--ostery-fyawatahamaxn--osy" + + "ro-wuaxn--p1acfgujolsterxn--p1aixn--pbt977comobilyxn--pgbs0dhlxn" + + "--porsgu-sta26fhvalerxn--pssu33lxn--pssy2uxn--q9jyb4comparemarke" + + "rryhotelsasayamaxn--qcka1pmcdonaldstorfjordxn--qqqt11misconfused" + + "xn--qxamuneuestorjelenia-goraxn--rady-iraxn--rdal-poaxn--rde-ula" + + "quilancashireggiocalabriaxn--rdy-0nabarixn--rennesy-v1axn--rhkke" + + "rvju-01aflakstadaokagakibichuoxn--rholt-mragowoodsidexn--rhqv96g" + + "xn--rht27zxn--rht3dxn--rht61exn--risa-5narusawaxn--risr-iraxn--r" + + "land-uuaxn--rlingen-mxaxn--rmskog-byaxn--rny31hammarfeastafricap" + + "etownnews-stagingxn--rovu88bernuorockartuzyukuhashimoichinosekig" + + "aharautoscanadaejeonbukarasjokarasuyamarylhurstjordalshalsenaust" + + "dalavagiskebizenakaniikawatanaguramusementarnobrzegyptianaturalh" + + "istorymuseumcenterepaircraftarumizusawabogadocscbgdyniabkhaziama" + + "llamagazineat-url-o-g-i-nativeamericanantiques3-ap-northeast-1ka" + + "ppchizippodhaleangaviikadenadexetereit3l3p0rtargets-itargiving12" + + "000emmafanconagawakayamadridvagsoyericssonyoursidealerimo-i-rana" + + "amesjevuemielno-ip6xn--rros-granvindafjordxn--rskog-uuaxn--rst-0" + + "narutokyotangovtuscanyxn--rsta-francaiseharaxn--ryken-vuaxn--ryr" + + "vik-byaxn--s-1faithruherecreationxn--s9brj9compute-1xn--sandness" + + "jen-ogbizxn--sandy-yuaxn--seral-lraxn--ses554gxn--sgne-gratangen" + + "xn--skierv-utazaskoyabearalvahkihokumakogengerdalcestpetersburgx" + + "n--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat-5" + + "narviikamisunagawaxn--slt-elabbvieeexn--smla-hraxn--smna-gratis-" + + "a-bulls-fanxn--snase-nraxn--sndre-land-0cbremangerxn--snes-poaxn" + + "--snsa-roaxn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-" + + "varanger-ggbeskidyn-o-saurlandes3-website-us-east-1xn--srfold-by" + + "axn--srreisa-q1axn--srum-grazxn--stfold-9xaxn--stjrdal-s1axn--st" + + "jrdalshalsen-sqbestbuyshouses3-website-us-west-1xn--stre-toten-z" + + "cbstreamsterdamnserverbaniaxn--t60b56axn--tckweatherchannelxn--t" + + "iq49xqyjewelryxn--tjme-hraxn--tn0agrinet-freakstudioxn--tnsberg-" + + "q1axn--tor131oxn--trany-yuaxn--trgstad-r1axn--trna-woaxn--troms-" + + "zuaxn--tysvr-vraxn--uc0atvaroyxn--uc0ay4axn--uist22hamurakamigor" + + "is-a-playerxn--uisz3gxn--unjrga-rtaobaokinawashirosatochiokinosh" + + "imalatvuopmiasakuchinotsuchiurakawakuyabukievenestudyndns-at-hom" + + "edepotenzamamicrolightingxn--unup4yxn--uuwu58axn--vads-jraxn--va" + + "rd-jraxn--vegrshei-c0axn--vermgensberater-ctbetainaboxfusejnyuri" + + "honjoyentgoryusuharaveroykenglandds3-external-1xn--vermgensberat" + + "ung-pwbieigersundnpalaceu-3utilitiesquare7xn--vestvgy-ixa6oxn--v" + + "g-yiabcgxn--vgan-qoaxn--vgsy-qoa0jewishartgalleryxn--vgu402compu" + + "terhistoryofscience-fictionxn--vhquvbargainstitutelevisionayorov" + + "nobninskarelianceu-2xn--vler-qoaxn--vre-eiker-k8axn--vrggt-xqadx" + + "n--vry-yla5gxn--vuq861bielawalmartjeldsundrangedalillyusuisserve" + + "exchangevents3-website-us-west-2xn--w4r85el8fhu5dnraxn--w4rs40lx" + + "n--wcvs22dxn--wgbh1comsecuritytacticsaseboknowsitallukowhoswhokk" + + "sundyndns-workisboringroundhandlingroznyxn--wgbl6axn--xhq521biel" + + "laakesvuemielecceverbankarlsoyuufcfanikinuyamashinashikitchenikk" + + "oebenhavnikolaevennodessagaeroclubmedecincinnationwidealstahauge" + + "sunderseaportsinfolldalabamagasakishimabarackmazerbaijan-mayendo" + + "ftheinternetflixilovecollegefantasyleaguernseyuzawavocatanzarowe" + + "ddingjesdalavangenaval-d-aosta-valleyolasitehimejibigawaskvolloa" + + "bathsbc66xn--xkc2al3hye2axn--xkc2dl3a5ee0hangglidingxn--y9a3aqua" + + "riumishimatsunoxn--yer-znarvikosherbrookegawaxn--yfro4i67oxn--yg" + + "arden-p1axn--ygbi2ammxn--3pxu8konsulatrobeepilepsydneyxn--ystre-" + + "slidre-ujbieszczadygeyachimataikikonaioirasebastopologyeonggieht" + + "avuoatnagaivuotnagaokakyotambabia-goracleaningatlantabuseekloges" + + "t-mon-blogueurovisionikonantankarmoyxn--zbx025dxn--zf0ao64axn--z" + + "f0avxn--42c2d9axn--zfr164bievatmallorcadaquesakurainvestmentsaky" + + "otanabellunorddalimanowarudavoues3-fips-us-gov-west-1xperiaxz" // nodes is the list of nodes. Each node is represented as a uint32, which // encodes the node's children, wildcard bit and node type (as an index into @@ -483,8127 +489,8268 @@ // [15 bits] text index // [ 6 bits] text length var nodes = [...]uint32{ - 0x32f983, - 0x28a344, - 0x30e286, - 0x371b43, - 0x371b46, - 0x394646, - 0x3a5003, - 0x367844, - 0x260687, - 0x30dec8, - 0x1a04cc2, - 0x316e47, - 0x355d89, - 0x32228a, - 0x32228b, - 0x22eec3, - 0x28fac6, - 0x2327c5, - 0x1e04e02, - 0x217c04, - 0x2a90c3, - 0x3ac705, - 0x2203942, - 0x329e03, - 0x26957c4, - 0x368e05, - 0x2a10182, - 0x3787ce, - 0x253343, - 0x3a03c6, + 0x31a403, + 0x284944, + 0x2dd106, + 0x3706c3, + 0x3706c6, + 0x398706, + 0x3a8103, + 0x2fe244, + 0x38e987, + 0x2dcd48, + 0x1a05702, + 0x316e87, + 0x35c789, + 0x2abb0a, + 0x2abb0b, + 0x22f383, + 0x287506, + 0x232dc5, + 0x1e021c2, + 0x2161c4, + 0x238743, + 0x26fc45, + 0x2214902, + 0x347743, + 0x266f744, + 0x33ddc5, + 0x2a04702, + 0x376b4e, + 0x24c4c3, + 0x38ae46, 0x2e00142, - 0x30e407, - 0x23ae46, - 0x3200c42, - 0x22a343, - 0x254b04, - 0x325a86, - 0x35c208, - 0x28a706, - 0x21ad04, - 0x3601442, - 0x332309, - 0x207587, - 0x256286, - 0x339309, - 0x29d788, - 0x328d44, - 0x364906, - 0x36b606, - 0x3a02942, - 0x27144f, - 0x20f94e, - 0x2131c4, - 0x2c6085, - 0x367745, - 0x385989, - 0x241a89, - 0x368047, - 0x23c9c6, - 0x273a43, - 0x3e02342, - 0x2df283, - 0x205aca, - 0x221d83, - 0x303145, - 0x289c02, - 0x289c09, - 0x4200f82, - 0x203d84, - 0x2250c6, - 0x2eb205, - 0x34cbc4, - 0x4a04c04, - 0x205283, - 0x231ac4, - 0x4e02e02, - 0x209f04, - 0x52f4e04, - 0x24ae0a, - 0x5601342, - 0x303907, - 0x26b8c8, - 0x6202f82, - 0x31cf07, - 0x2c2e04, - 0x2c2e07, - 0x373d85, - 0x357a47, - 0x367e06, - 0x2e8384, - 0x39c0c5, - 0x294847, - 0x7206cc2, - 0x34f703, - 0x200582, - 0x200583, - 0x76125c2, - 0x221ec5, - 0x7a02302, - 0x27bd84, - 0x2810c5, - 0x213107, - 0x269f0e, - 0x224bc4, - 0x206a84, - 0x211503, - 0x2ceac9, - 0x2ed94b, - 0x3a6548, - 0x3148c8, - 0x318dc8, - 0x237908, - 0x33914a, - 0x357947, - 0x318146, - 0x7ea4fc2, - 0x35bc03, - 0x366c43, - 0x371144, - 0x3a5043, - 0x324cc3, - 0x171f542, - 0x8203682, - 0x252185, - 0x2a11c6, - 0x2d6d44, - 0x2f6e07, - 0x382986, - 0x319dc4, - 0x398247, - 0x20f7c3, - 0x86c8902, - 0x8b124c2, - 0x8e1c502, - 0x21c506, + 0x2dd287, + 0x236f46, + 0x3209282, + 0x229d83, + 0x24d9c4, + 0x325e86, + 0x26c588, + 0x2761c6, + 0x2011c4, + 0x3600242, + 0x3335c9, + 0x20a1c7, + 0x351e86, + 0x330c89, + 0x298308, + 0x26e904, + 0x241ec6, + 0x222a46, + 0x3a022c2, + 0x26480f, + 0x20948e, + 0x211d04, + 0x2c2b85, + 0x2fe145, + 0x39e189, + 0x23c409, + 0x349a87, + 0x20fa86, + 0x275a83, + 0x3e02a82, + 0x315503, + 0x34e24a, + 0x20f903, + 0x2af985, + 0x284202, + 0x284209, + 0x4200ec2, + 0x212484, + 0x2b9686, + 0x2f3645, + 0x3552c4, + 0x4a05644, + 0x2030c3, + 0x232344, + 0x4e00c02, + 0x268d44, + 0x52ef6c4, + 0x25ef4a, + 0x5603dc2, + 0x2ba587, + 0x2f3b08, + 0x6208142, + 0x311687, + 0x2bf204, + 0x2bf207, + 0x36e0c5, + 0x34ffc7, + 0x349846, + 0x24f3c4, + 0x38c105, + 0x29e447, + 0x72001c2, + 0x26e503, + 0x200b82, + 0x200b83, + 0x760de02, + 0x2102c5, + 0x7a02a42, + 0x350e04, + 0x2734c5, + 0x211c47, + 0x26bcce, + 0x2b9184, + 0x245544, + 0x202f03, + 0x281d49, + 0x31ee0b, + 0x2e9a88, + 0x379948, + 0x3a9908, + 0x22ae48, + 0x330aca, + 0x34fec7, + 0x318186, + 0x7e87002, + 0x35e203, + 0x367e43, + 0x36f4c4, + 0x3a8143, + 0x3250c3, + 0x1720b82, + 0x8202502, + 0x27a8c5, + 0x296206, + 0x2d1b84, + 0x375487, + 0x2e1886, + 0x331f84, + 0x39d3c7, + 0x203bc3, + 0x86c54c2, + 0x8b0f242, + 0x8e16742, + 0x216746, 0x9200002, - 0x359b85, - 0x320a83, - 0x200004, - 0x2ee344, - 0x2ee345, - 0x203e43, - 0x9768883, - 0x9a07f42, - 0x28e245, - 0x28e24b, - 0x2d0686, - 0x20a0cb, - 0x225b04, - 0x20a7c9, - 0x20be84, - 0x9e0c0c2, - 0x20cf83, - 0x210843, - 0x1600802, - 0x260903, - 0x2109ca, - 0xa211cc2, - 0x217e85, - 0x2983ca, - 0x2dc184, - 0x369f03, - 0x315044, - 0x213643, - 0x213644, - 0x213647, - 0x213985, - 0x213e05, - 0x2150c6, - 0x2167c6, - 0x2182c3, - 0x21c188, - 0x221c43, - 0xa601082, - 0x21cac8, - 0x21ff0b, - 0x2216c8, - 0x2221c6, - 0x222a47, - 0x226488, - 0xb2413c2, - 0xb6c2fc2, - 0x326388, - 0x257ec7, - 0x22bac5, - 0x22bac8, - 0x2bf708, - 0x3871c3, - 0x22a784, - 0x371182, - 0xba2af82, - 0xbe5ba02, - 0xc62c1c2, - 0x22c1c3, - 0xca0e542, - 0x367803, - 0x2f8e04, - 0x218443, - 0x328d04, - 0x25fe4b, - 0x21fe43, - 0x2e4d06, - 0x226284, - 0x2a5a8e, - 0x361c05, - 0x3a04c8, - 0x282247, - 0x28224a, - 0x229d03, - 0x2b3447, - 0x2edb05, - 0x22ea44, - 0x272486, - 0x272487, - 0x32b704, - 0x304ac7, - 0x26a244, - 0x35bc84, - 0x35bc86, - 0x386904, - 0x20e546, - 0x223c83, - 0x22b888, - 0x30c3c8, - 0x24e2c3, - 0x2608c3, - 0x204f04, - 0x395943, - 0xce0d882, - 0xd2db442, - 0x20c043, - 0x201806, - 0x35c383, - 0x28bfc4, - 0xd6081c2, - 0x2081c3, - 0x358243, - 0x219942, - 0xda02ac2, - 0x2c55c6, - 0x2334c7, - 0x2f7a85, - 0x37da44, - 0x3723c5, - 0x367007, - 0x274205, - 0x2d3e89, - 0x2e0586, - 0x2e5488, - 0x2f7986, - 0xde0db42, - 0x362f48, - 0x2f8bc6, - 0x20db45, - 0x304687, - 0x30c2c4, - 0x30c2c5, - 0x28a8c4, - 0x28a8c8, - 0xe20a182, - 0xe60c502, - 0x313646, - 0x2c28c8, - 0x31f145, - 0x332c06, - 0x3356c8, - 0x33e1c8, - 0xea0fd45, - 0xee0c504, - 0x2958c7, - 0xf20bbc2, - 0xf61c402, - 0x1060d1c2, - 0x35aa45, - 0x2a8505, - 0x282606, - 0x3698c7, - 0x376ec7, - 0x10ed0783, - 0x2e3447, - 0x30dc88, - 0x3823c9, - 0x378987, - 0x390287, - 0x3a5b08, - 0x3aa206, - 0x22e546, - 0x22f18c, - 0x230b0a, - 0x230fc7, - 0x23268b, - 0x233307, - 0x23330e, - 0x236244, - 0x23a184, - 0x23b547, - 0x264f47, - 0x240d46, - 0x240d47, - 0x241207, - 0x18a20802, - 0x2420c6, - 0x2420ca, - 0x24294b, - 0x243407, - 0x244ec5, - 0x245203, - 0x246c46, - 0x246c47, - 0x241c43, - 0x18e38702, - 0x24b74a, - 0x19356fc2, - 0x196acdc2, - 0x19a4cec2, - 0x19e26982, - 0x24da85, - 0x24e0c4, - 0x1a604d02, - 0x209f85, - 0x294ac3, - 0x20bf85, - 0x237804, - 0x20a684, - 0x2ba5c6, - 0x26a546, - 0x28e443, - 0x3b1484, - 0x209383, - 0x1aa03b02, - 0x263544, - 0x263546, - 0x295e45, - 0x27fdc6, - 0x304788, - 0x20cb44, - 0x2a8e88, - 0x343fc5, - 0x24a108, - 0x2b1cc6, - 0x2bddc7, - 0x26cdc4, - 0x26cdc6, - 0x25e303, - 0x382e43, - 0x2c9388, - 0x318bc4, - 0x238d47, - 0x220246, - 0x2dad89, - 0x315108, - 0x319f08, - 0x349184, - 0x39b9c3, - 0x23e342, - 0x1ba34682, - 0x1be16102, - 0x3b2783, - 0x1c204a42, - 0x2607c4, - 0x390a46, - 0x39a6c5, - 0x2a4383, - 0x232004, - 0x2b6f47, - 0x26aa43, - 0x250d08, - 0x20e8c5, - 0x370083, - 0x281045, - 0x281184, - 0x2fb8c6, - 0x210384, - 0x211a46, - 0x213046, - 0x263004, - 0x21fd83, - 0x2225c3, - 0x1c604e42, - 0x377905, - 0x222e03, - 0x1ca1c3c2, - 0x22f143, - 0x210085, - 0x231b83, - 0x231b89, - 0x1ce07d02, - 0x1d601142, - 0x28d9c5, - 0x21a746, - 0x2d6906, - 0x2b94c8, - 0x2b94cb, - 0x20538b, - 0x2f7c85, - 0x2e1045, - 0x2c9fc9, - 0x1600742, - 0x2631c8, - 0x206044, - 0x1de001c2, - 0x25fa83, - 0x1e665106, - 0x20f088, - 0x1ea04782, - 0x233ec8, - 0x1ee01742, - 0x225c4a, - 0x1f2d0e43, - 0x3b1e86, - 0x206988, - 0x207d48, - 0x39a9c6, - 0x36d5c7, - 0x271647, - 0x220b0a, - 0x2dc204, - 0x3423c4, - 0x355589, - 0x1fb8fc85, - 0x20fb46, - 0x208203, - 0x251944, - 0x201e44, - 0x201e47, - 0x22cec7, - 0x237044, - 0x220a45, - 0x2826c8, - 0x350707, - 0x3619c7, - 0x1fe041c2, - 0x226004, - 0x298cc8, - 0x381004, - 0x24f0c4, - 0x24fa45, - 0x24fb87, - 0x215809, - 0x2505c4, - 0x2510c9, - 0x251308, - 0x2516c4, - 0x2516c7, - 0x20251c43, - 0x252487, - 0x16101c2, - 0x179d442, - 0x253386, - 0x2539c7, - 0x253e84, - 0x255607, - 0x256907, - 0x257483, - 0x2abc02, - 0x229c02, - 0x258743, - 0x258744, - 0x25874b, - 0x3149c8, - 0x25f184, - 0x2594c5, - 0x25ba87, - 0x25d8c5, - 0x2c4dca, - 0x25f0c3, - 0x2060da42, - 0x22b484, - 0x264d09, - 0x268983, - 0x268a47, - 0x28ee89, - 0x37b5c8, - 0x2d8483, - 0x27ff47, - 0x280689, - 0x2316c3, - 0x288284, - 0x289389, - 0x28c6c6, - 0x28dc83, - 0x2023c2, - 0x24ca43, - 0x36ab47, - 0x2bfa85, - 0x35ba06, - 0x256bc4, - 0x2d1d45, - 0x205a83, - 0x218506, - 0x20a9c2, - 0x391084, - 0x22ad02, - 0x22ad03, - 0x20a00182, - 0x29b083, - 0x216c44, - 0x216c47, - 0x200306, - 0x201e02, - 0x20e01dc2, - 0x21e184, - 0x2123b882, - 0x21600502, - 0x2dfcc4, - 0x2dfcc5, - 0x2b9cc5, - 0x262746, - 0x21a0ca82, - 0x20ca85, - 0x210d85, - 0x225883, - 0x215c06, - 0x216dc5, - 0x21c482, - 0x33de05, - 0x21c484, - 0x2230c3, - 0x223303, - 0x21e097c2, - 0x294a47, - 0x221144, - 0x221149, - 0x251844, - 0x228903, - 0x341cc9, - 0x3777c8, - 0x2a8384, - 0x2a8386, - 0x210503, - 0x259b43, - 0x332ec3, - 0x222ebc02, - 0x30eb82, - 0x22600642, - 0x3238c8, - 0x35c588, - 0x394d86, - 0x24ed45, - 0x2b32c5, - 0x200647, - 0x228fc5, - 0x2630c2, - 0x22a9a502, - 0x1614502, - 0x38fe08, - 0x362e85, - 0x351d04, - 0x2f18c5, - 0x3836c7, - 0x24f5c4, - 0x246f82, - 0x22e01182, - 0x336f04, - 0x2173c7, - 0x28e9c7, - 0x357a04, - 0x298383, - 0x24e204, - 0x24e208, - 0x22e886, - 0x27230a, - 0x2156c4, - 0x298708, - 0x259784, - 0x222b46, - 0x29a4c4, - 0x35ad46, - 0x221409, - 0x25b287, - 0x234483, - 0x23274842, - 0x274843, - 0x20c2c2, - 0x23651b02, - 0x2f0b06, - 0x364148, - 0x2a9d87, - 0x395d09, - 0x297f09, - 0x2ab245, - 0x2ad3c9, - 0x2ae045, - 0x2ae189, - 0x2af5c5, - 0x2b0208, - 0x27f284, - 0x23a8d6c7, - 0x294403, - 0x2b0407, - 0x390646, - 0x2b08c7, - 0x2a6d45, - 0x2a7f83, - 0x23e00dc2, - 0x392604, - 0x2423b8c2, - 0x264403, - 0x24618d82, - 0x307646, - 0x26b845, - 0x2b2bc7, - 0x37f183, - 0x324c44, - 0x2138c3, - 0x2386c3, - 0x24a0a3c2, - 0x25201a02, - 0x394744, - 0x2abbc3, - 0x38c985, - 0x226d85, - 0x25602282, - 0x25e00bc2, - 0x280286, - 0x318d04, - 0x2491c4, - 0x2491ca, - 0x26601d42, - 0x37324a, - 0x204148, - 0x26a964c4, - 0x201d43, - 0x25ff43, - 0x318f09, - 0x2a8909, - 0x2b7046, - 0x26e04303, - 0x328145, - 0x30664d, - 0x204306, - 0x21268b, - 0x27203482, - 0x295048, - 0x27e1c282, - 0x282051c2, - 0x37aa85, - 0x28600b02, - 0x2a3147, - 0x212b87, - 0x201503, - 0x22f848, - 0x28a02f02, - 0x202f04, - 0x217043, - 0x38d045, - 0x386fc3, - 0x2eb106, - 0x30bdc4, - 0x204ec3, - 0x234f83, - 0x28e07042, - 0x2f7c04, - 0x30ed45, - 0x35a587, - 0x27dbc3, - 0x2b36c3, - 0x2b3ec3, - 0x1621ac2, - 0x2b3f83, - 0x2b4b03, - 0x2920ae42, - 0x2cee84, - 0x26a746, - 0x33c7c3, - 0x2b4f83, - 0x296b5e02, - 0x2b5e08, - 0x2b60c4, - 0x2470c6, - 0x2b6547, - 0x24e3c6, - 0x295304, - 0x37200082, - 0x39050b, - 0x2ffbce, - 0x21bb0f, - 0x29da43, - 0x37a4ca02, - 0x166b142, - 0x37e02442, - 0x29c243, - 0x2472c3, - 0x233106, - 0x22ff46, - 0x212307, - 0x31aa84, - 0x3821a882, - 0x3860ec02, - 0x2d4ac5, - 0x2e88c7, - 0x37e046, - 0x38a82882, - 0x2f5b04, - 0x2b9783, - 0x38e01b02, - 0x39352883, - 0x2ba984, - 0x2c06c9, - 0x16c6fc2, - 0x39642682, - 0x351245, - 0x39ac7242, - 0x39e02682, - 0x341687, - 0x2364c9, - 0x35600b, - 0x271405, - 0x2c7c89, - 0x276a46, - 0x2d06c7, - 0x3a2092c4, - 0x32ef49, - 0x374b07, - 0x2255c7, - 0x234003, - 0x37b386, - 0x30f887, - 0x265383, - 0x27c5c6, - 0x3aa022c2, - 0x3ae31e02, - 0x220443, - 0x324845, - 0x257747, - 0x21fac6, - 0x2bfa05, - 0x230044, - 0x2efa45, - 0x2f8284, - 0x3b205e82, - 0x349f07, - 0x2e1c44, - 0x23e244, - 0x33328d, - 0x257249, - 0x381588, - 0x25ac04, - 0x314e85, - 0x3b2607, - 0x205e84, - 0x382a47, - 0x20c705, - 0x3b6aa384, - 0x36dec5, - 0x267644, - 0x24f706, - 0x3696c5, - 0x3ba24742, - 0x369fc4, - 0x369fc5, - 0x3716c6, - 0x2bfb45, - 0x25c104, - 0x3120c3, - 0x204986, - 0x22c085, - 0x22c785, - 0x3697c4, - 0x215743, - 0x21574c, - 0x3be8d002, - 0x3c2045c2, - 0x3c605d82, - 0x205d83, - 0x205d84, - 0x3ca032c2, - 0x2f9648, - 0x35bac5, - 0x33f884, - 0x230e46, - 0x3ce073c2, - 0x3d20fc42, - 0x3d600c02, - 0x321e85, - 0x262ec6, - 0x20b484, - 0x325fc6, - 0x3036c6, - 0x202983, - 0x3db1164a, - 0x264785, - 0x28b4c3, - 0x223886, - 0x305e09, - 0x223887, - 0x293308, - 0x29d649, - 0x248108, - 0x229a46, - 0x208843, - 0x3de017c2, - 0x384b03, - 0x384b09, - 0x368548, - 0x3e2513c2, - 0x3e601f02, - 0x22d603, - 0x2e0405, - 0x258f44, - 0x35e849, - 0x226784, - 0x26f288, - 0x205c03, - 0x2602c4, - 0x2784c3, - 0x21a788, - 0x3331c7, - 0x3ea0f302, - 0x2432c2, - 0x257d85, - 0x3960c9, - 0x20fbc3, - 0x281ac4, - 0x328104, - 0x219e03, - 0x28380a, - 0x3ef73102, - 0x3f2c0202, - 0x2c8883, - 0x374fc3, - 0x1649202, - 0x262a43, - 0x3f60bcc2, - 0x3fa05f02, - 0x3fe22044, - 0x222046, - 0x33e8c6, - 0x277844, - 0x2474c3, - 0x39bc83, - 0x235143, - 0x242cc6, - 0x2ce085, - 0x2c8e47, - 0x2d0589, - 0x2ccac5, - 0x2cdfc6, - 0x2ce548, - 0x2ce746, - 0x245bc4, - 0x29ef8b, - 0x2d3983, - 0x2d3985, - 0x2d3ac8, - 0x226302, - 0x341982, - 0x4024db02, - 0x4060b602, - 0x21a8c3, - 0x40a73fc2, - 0x273fc3, - 0x2d3dc4, - 0x2d4e43, - 0x41201682, - 0x41601686, - 0x2c47c6, - 0x2da008, - 0x41a95242, - 0x41e10882, - 0x42223342, - 0x4265e402, - 0x42a14202, - 0x42e01302, - 0x234103, - 0x261c05, - 0x32d1c6, - 0x43213184, - 0x295c4a, - 0x201306, - 0x2f7ec4, - 0x269ec3, - 0x43e0c002, - 0x202082, - 0x231743, - 0x44204ac3, - 0x362b47, - 0x3695c7, - 0x45a58847, - 0x32d747, - 0x228543, - 0x2977ca, - 0x377004, - 0x220144, - 0x22014a, - 0x202085, - 0x45e04182, - 0x3294c3, - 0x462002c2, - 0x2104c3, - 0x274803, - 0x46a00842, - 0x2e33c4, - 0x21db44, - 0x208285, - 0x30bd05, - 0x249406, - 0x249786, - 0x46e09282, - 0x47201002, - 0x3274c5, - 0x2c44d2, - 0x271ac6, - 0x248803, - 0x2a2486, - 0x248805, - 0x1610a02, - 0x4f611802, - 0x3522c3, - 0x211803, - 0x278203, - 0x4fa11f82, - 0x378ac3, - 0x4fe14602, - 0x200a83, - 0x2ceec8, - 0x24a843, - 0x24a846, - 0x3a1087, - 0x321b06, - 0x321b0b, - 0x2f7e07, - 0x392404, - 0x50603ec2, - 0x364805, - 0x50a04a83, - 0x239f83, - 0x326805, - 0x35b5c3, - 0x35b5c6, - 0x26334a, - 0x2774c3, - 0x23ad04, - 0x2c2806, - 0x20df46, - 0x50e00383, - 0x324b07, - 0x28bb8d, - 0x3adbc7, - 0x2a0685, - 0x250b46, - 0x22c0c3, - 0x52a15e43, - 0x52e04c82, - 0x3b2804, - 0x236d8c, - 0x245309, - 0x24bcc7, - 0x3724c5, - 0x268d84, - 0x27c1c8, - 0x27ed05, - 0x5328a405, - 0x377c09, - 0x256343, - 0x2acd44, - 0x53617902, - 0x21aac3, - 0x53a99f82, - 0x2a3fc6, - 0x16aa082, - 0x53e943c2, - 0x321d88, - 0x2c08c3, - 0x36de07, - 0x305105, - 0x2943c5, - 0x30860b, - 0x2e3906, - 0x308806, - 0x36dbc6, - 0x268f84, - 0x2e5686, - 0x2e5b48, - 0x23e943, - 0x23cf83, - 0x23cf84, - 0x2e6984, - 0x2e6e07, - 0x2e8745, - 0x542e8882, - 0x54606ec2, - 0x206ec5, - 0x2a4a84, - 0x2ebf8b, - 0x2ee248, - 0x2f7304, - 0x290602, - 0x54eb6042, - 0x38c543, - 0x2ee704, - 0x2ee9c5, - 0x2ef087, - 0x2f1404, - 0x2f7cc4, - 0x552054c2, - 0x35d209, - 0x2f2445, - 0x2716c5, - 0x2f3105, - 0x5561aa03, - 0x2f4244, - 0x2f424b, - 0x2f4684, - 0x2f4b0b, - 0x2f5505, - 0x21bc4a, - 0x2f5d08, - 0x2f5f0a, - 0x2f6783, - 0x2f678a, - 0x55a1b282, - 0x55e01202, - 0x26a103, - 0x562f7902, - 0x2f7903, - 0x5673aa42, - 0x56b21202, - 0x2f8104, - 0x21c2c6, - 0x325d05, - 0x2f8b43, - 0x32ff46, - 0x30c845, - 0x2e9784, - 0x56e00e02, - 0x2d7904, - 0x2c9c4a, - 0x2eb487, - 0x26b686, - 0x244007, - 0x236ec3, - 0x265488, - 0x28954b, - 0x386a45, - 0x235905, - 0x235906, - 0x370204, - 0x31d488, - 0x215a83, - 0x2b5984, - 0x36b507, - 0x307206, - 0x200e06, - 0x2a58ca, - 0x24e684, - 0x24e68a, - 0x57201946, - 0x201947, - 0x259547, - 0x279804, - 0x279809, - 0x2ba485, - 0x23b80b, - 0x2769c3, - 0x211c03, - 0x2a3f43, - 0x22ec44, - 0x57600682, - 0x259f06, - 0x2a7d05, - 0x2a26c5, - 0x2564c6, - 0x2531c4, - 0x57a01f82, - 0x245244, - 0x57e00d42, - 0x200d44, - 0x224303, - 0x58211842, - 0x3398c3, - 0x2478c6, - 0x58602602, - 0x2cfb88, - 0x223704, - 0x223706, - 0x375846, - 0x25bb44, - 0x204905, - 0x20c408, - 0x20c907, - 0x20d007, - 0x20d00f, - 0x298bc6, - 0x227843, - 0x227844, - 0x28be84, - 0x210e83, - 0x222c84, - 0x241104, - 0x58a36b82, - 0x28e183, - 0x241383, - 0x58e0c4c2, - 0x22a543, - 0x260883, - 0x213e8a, - 0x22bc87, - 0x241c8c, - 0x241f46, - 0x242406, - 0x246dc7, - 0x592ddb07, - 0x251a09, - 0x21cc04, - 0x252284, - 0x59609f42, - 0x59a01702, - 0x2a5c86, - 0x324904, - 0x2db5c6, - 0x2ab348, - 0x20eec4, - 0x2a3186, - 0x2d68c5, - 0x26ebc8, - 0x205583, - 0x272605, - 0x273583, - 0x2717c3, - 0x2717c4, - 0x273983, - 0x59edeec2, - 0x5a200b42, - 0x276889, - 0x27ec05, - 0x27ee04, - 0x281305, - 0x212504, - 0x2c1247, - 0x33d3c5, - 0x258a04, - 0x258a08, - 0x2dc3c6, - 0x2de404, - 0x2dfdc8, - 0x2e1a87, - 0x5a60e5c2, - 0x305304, - 0x210f44, - 0x2257c7, - 0x5aa53d84, - 0x249682, - 0x5ae01ac2, - 0x21b083, - 0x351144, - 0x242643, - 0x33d945, - 0x5b21de42, - 0x2ebb05, - 0x212bc2, - 0x381dc5, - 0x364305, - 0x5b60c842, - 0x3581c4, - 0x5ba06342, - 0x2a9146, - 0x2ac506, - 0x396208, - 0x2c3608, - 0x3075c4, - 0x2f8905, - 0x2fe809, - 0x2e10c4, - 0x263304, - 0x20aec3, - 0x5be20c45, - 0x2c7087, - 0x25e944, - 0x33a48d, - 0x33c282, - 0x33c283, - 0x355783, - 0x5c200202, - 0x388b45, - 0x26c747, - 0x2a7e04, - 0x32d807, - 0x29d849, - 0x2c9d89, - 0x248ac7, - 0x243843, - 0x27c008, - 0x2f33c9, - 0x2500c7, - 0x370145, - 0x385886, - 0x394246, - 0x3959c5, - 0x257345, - 0x5c603102, - 0x27eb05, - 0x2b8308, - 0x2c5386, - 0x2bcc07, - 0x2f5744, - 0x2ad207, - 0x2faf46, - 0x5ca2fb02, - 0x3713c6, - 0x2fd38a, - 0x2fde45, - 0x5cee4742, - 0x5d245702, - 0x30fbc6, - 0x2b25c8, - 0x5d68eb87, - 0x5da04602, - 0x20edc3, - 0x38c706, - 0x2246c4, - 0x3a0f46, - 0x262446, - 0x26bd0a, - 0x319a45, - 0x204446, - 0x218c83, - 0x218c84, - 0x205302, - 0x30c283, - 0x5de05dc2, - 0x2ce903, - 0x3734c4, - 0x2b2704, - 0x2b270a, - 0x229b03, - 0x28a7c8, - 0x229b0a, - 0x23a407, - 0x301446, - 0x2a9004, - 0x296e42, - 0x219542, - 0x5e206e42, - 0x24e1c3, - 0x259307, - 0x330207, - 0x38fd4b, - 0x28a2c4, - 0x34f9c7, - 0x2ef186, - 0x21c607, - 0x258004, - 0x23c445, - 0x2c17c5, - 0x5e620382, - 0x221a86, - 0x246043, - 0x24a2c2, - 0x24a2c6, - 0x5ea04802, - 0x5ee05bc2, - 0x3abd45, - 0x5f222e82, - 0x5f600a42, - 0x343745, - 0x38e6c5, - 0x204505, - 0x270ac3, - 0x390b05, - 0x2e39c7, - 0x309445, - 0x30a985, - 0x3a05c4, - 0x24c646, - 0x25c1c4, - 0x5fa03382, - 0x6060ce05, - 0x36f447, - 0x2db7c8, - 0x2a32c6, - 0x2a32cd, - 0x2a86c9, - 0x2a86d2, - 0x332705, - 0x33c843, - 0x60a044c2, - 0x2f6d84, - 0x204383, - 0x3623c5, - 0x2fed85, - 0x60e17082, - 0x3700c3, - 0x6124d082, - 0x616c3142, - 0x61a18dc2, - 0x364c05, - 0x329ec3, - 0x319888, - 0x61e02d82, - 0x62206902, - 0x2e3386, - 0x34398a, - 0x272243, - 0x25c083, - 0x2ed703, - 0x62e016c2, - 0x71211fc2, - 0x71a19682, - 0x206602, - 0x3711c9, - 0x2c6404, - 0x22fb48, - 0x71ef8b82, - 0x72202502, - 0x2f4d45, - 0x232ac8, - 0x2cf008, - 0x2fd54c, - 0x23bd83, - 0x267002, - 0x726019c2, - 0x2ccf46, - 0x3022c5, - 0x239103, - 0x383586, - 0x302406, - 0x21e2c3, - 0x304ec3, - 0x3055c6, - 0x306204, - 0x225d46, - 0x2d3b45, - 0x30648a, - 0x240544, - 0x307884, - 0x307a4a, - 0x72a037c2, - 0x234605, - 0x30898a, - 0x309a85, - 0x30a344, - 0x30a446, - 0x30a5c4, - 0x228306, - 0x72e39342, - 0x2eadc6, - 0x3a2445, - 0x26bb87, - 0x3a3c46, - 0x246fc4, - 0x2da807, - 0x311586, - 0x25b5c5, - 0x2d4287, - 0x39cd87, - 0x39cd8e, - 0x24abc6, - 0x382905, - 0x285407, - 0x201c43, - 0x201c47, - 0x3b3445, - 0x2108c4, - 0x211882, - 0x22afc7, - 0x31ab04, - 0x22fec4, - 0x24314b, - 0x21d283, - 0x288fc7, - 0x21d284, - 0x2ace07, - 0x2824c3, - 0x334b4d, - 0x389388, - 0x228e04, - 0x258905, - 0x30ac85, - 0x30b0c3, - 0x73201a82, - 0x30c243, - 0x30cf43, - 0x221c04, - 0x280785, - 0x223387, - 0x218d06, - 0x373203, - 0x24a40b, - 0x3aa70b, - 0x27928b, - 0x28088a, - 0x2ad8cb, - 0x2fc28b, - 0x2e478c, - 0x2e7291, - 0x32170a, - 0x34e48b, - 0x379d0b, - 0x3b048a, - 0x3b4cca, - 0x30ea4d, - 0x31038e, - 0x3109cb, - 0x310c8a, - 0x312191, - 0x3125ca, - 0x312acb, - 0x31300e, - 0x31398c, - 0x313fcb, - 0x31428e, - 0x31460c, - 0x315a4a, - 0x31694c, - 0x73716c4a, - 0x317449, - 0x31b60a, - 0x31b88a, - 0x31bb0b, - 0x31e9ce, - 0x31ed51, - 0x327a09, - 0x327c4a, - 0x32844b, - 0x32a30a, - 0x32ab96, - 0x32c8cb, - 0x32e00a, - 0x32e5ca, - 0x33048b, - 0x332189, - 0x3354c9, - 0x335a4d, - 0x3360cb, - 0x33734b, - 0x337d0b, - 0x3381c9, - 0x33880e, - 0x338f0a, - 0x33a24a, - 0x33a7ca, - 0x33af8b, - 0x33b7cb, - 0x33ba8d, - 0x33cecd, - 0x33da90, - 0x33df4b, - 0x33e54c, - 0x33ea4b, - 0x34118b, - 0x34290b, - 0x3463cb, - 0x346e4f, - 0x34720b, - 0x347d0a, - 0x348249, - 0x348609, - 0x34898b, - 0x348c4e, - 0x34b98b, - 0x34d04f, - 0x34ff0b, - 0x3501cb, - 0x35048b, - 0x35098a, - 0x355c09, - 0x35a20f, - 0x36128c, - 0x36170c, - 0x36208e, - 0x36388f, - 0x363c4e, - 0x3652d0, - 0x3656cf, - 0x365d4e, - 0x36650c, - 0x366812, - 0x36a511, - 0x36ad0e, - 0x36ba0e, - 0x36bf4e, - 0x36c2cf, - 0x36c68e, - 0x36ca13, - 0x36ced1, - 0x36d30e, - 0x36d78c, - 0x36e493, - 0x36fa90, - 0x37070c, - 0x370a0c, - 0x370ecb, - 0x37184e, - 0x371f8b, - 0x3727cb, - 0x37378c, - 0x37914a, - 0x37950c, - 0x37980c, - 0x379b09, - 0x37b7cb, - 0x37ba88, - 0x37bc89, - 0x37bc8f, - 0x37d5cb, - 0x37e44a, - 0x37fd4c, - 0x380e09, - 0x381b88, - 0x38214b, - 0x382c0b, - 0x38418a, - 0x38440b, - 0x38488c, - 0x385548, - 0x38958b, - 0x38c04b, - 0x39000b, - 0x39180b, - 0x39c90b, - 0x39cbc9, - 0x39d10d, - 0x3a264a, - 0x3a3597, - 0x3a3dd8, - 0x3a6309, - 0x3a7b4b, - 0x3a9554, - 0x3a9a4b, - 0x3a9fca, - 0x3ab70a, - 0x3ab98b, - 0x3ad110, - 0x3ad511, - 0x3ae64a, - 0x3afa8d, - 0x3b018d, - 0x3b508b, - 0x3b5c46, - 0x221b83, - 0x73b76c03, - 0x37f706, - 0x292c85, - 0x396787, - 0x3215c6, - 0x1639f02, - 0x2b3809, - 0x32fd44, - 0x2e0bc8, - 0x24e103, - 0x2f6cc7, - 0x241b82, - 0x2b2c03, - 0x73e06c82, - 0x2cb006, - 0x2cc544, - 0x3b2e84, - 0x2616c3, - 0x2616c5, - 0x746c7282, - 0x74aae504, - 0x279747, - 0x1669e02, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x20abc3, - 0x204cc2, - 0x15f048, - 0x20d1c2, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x213e83, - 0x324156, - 0x325393, - 0x34f849, - 0x2957c8, - 0x364689, - 0x308b06, - 0x336f50, - 0x25c9d3, - 0x3072c8, - 0x344207, - 0x27e407, - 0x2475ca, - 0x373549, - 0x239789, - 0x29258b, - 0x367e06, - 0x314aca, - 0x2221c6, - 0x32f943, - 0x294985, - 0x22b888, - 0x2a920d, - 0x35ab0c, - 0x3a2107, - 0x379f8d, - 0x20c504, - 0x22ef0a, - 0x23064a, - 0x230b0a, - 0x20fe87, - 0x240387, - 0x243084, - 0x26cdc6, - 0x3aab84, - 0x2e26c8, - 0x2267c9, - 0x2b94c6, - 0x2b94c8, - 0x24c34d, - 0x2c9fc9, - 0x207d48, - 0x271647, - 0x2f8e8a, - 0x2539c6, - 0x2642c7, - 0x2c96c4, - 0x28e807, - 0x332eca, - 0x36f5ce, - 0x228fc5, - 0x28e70b, - 0x262089, - 0x2a8909, - 0x2129c7, - 0x29998a, - 0x225707, - 0x2ffd09, - 0x326b48, - 0x35dc4b, - 0x2e0405, - 0x38144a, - 0x223109, - 0x23908a, - 0x2ccb4b, - 0x383a0b, - 0x292315, - 0x2e6185, - 0x2716c5, - 0x2f424a, - 0x25980a, - 0x261e07, - 0x21d743, - 0x2a5c08, - 0x2d828a, - 0x223706, - 0x24ff09, - 0x26ebc8, - 0x2de404, - 0x242649, - 0x2c3608, - 0x2b1c07, - 0x20ce06, - 0x36f447, - 0x293cc7, - 0x242ac5, - 0x228e0c, - 0x258905, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x20d1c2, - 0x2d0783, - 0x204ac3, - 0x20abc3, - 0x200383, - 0x2d0783, - 0x204ac3, - 0x24a843, - 0x200383, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x15f048, - 0x20d1c2, - 0x2000c2, - 0x230d42, - 0x202f02, - 0x202382, - 0x261e82, - 0x46d0783, - 0x231b83, - 0x2135c3, - 0x332ec3, - 0x204303, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x201383, - 0x15f048, - 0x32df04, - 0x260087, - 0x263d43, - 0x37aa84, - 0x214543, - 0x212a43, - 0x332ec3, - 0x13ecc7, - 0x204cc2, - 0x168883, - 0x5a0d1c2, - 0x8d54d, - 0x8d88d, - 0x230d42, - 0x964c4, - 0x200382, - 0x5e963c8, - 0xf39c4, - 0x15f048, - 0x14020c2, - 0x1509cc6, - 0x20e443, - 0x26ae03, - 0x66d0783, - 0x22ef04, - 0x6a31b83, - 0x6f32ec3, - 0x20a3c2, - 0x2964c4, - 0x204ac3, - 0x2fc883, - 0x201882, - 0x200383, - 0x21c802, - 0x2f8043, - 0x202602, - 0x203f83, - 0x26ec83, - 0x206d02, - 0x15f048, - 0x20e443, - 0x2fc883, - 0x201882, - 0x2f8043, - 0x202602, + 0x3523c5, + 0x3220c3, + 0x200604, + 0x2e8f84, + 0x2e8f85, + 0x206b43, + 0x978d2c3, + 0x9a0bb42, + 0x289e05, + 0x289e0b, + 0x31e686, + 0x20cb4b, + 0x221344, + 0x20d949, + 0x20e9c4, + 0x9e0ec02, + 0x20f143, + 0x20f403, + 0x16105c2, + 0x268183, + 0x2105ca, + 0xa20b382, + 0x216445, + 0x29224a, + 0x2d7744, + 0x283783, + 0x26cfc4, + 0x212543, + 0x212544, + 0x212547, + 0x2140c5, + 0x2147c5, + 0x214f46, + 0x2157c6, + 0x216a03, + 0x21ae88, + 0x210043, + 0xa601c02, + 0x243448, + 0x213ccb, + 0x220148, + 0x220d86, + 0x221847, + 0x225348, + 0xb642b42, + 0xbabf3c2, + 0x326788, + 0x35e4c7, + 0x246085, + 0x357f48, + 0x2bd408, + 0x34dd83, + 0x22a1c4, + 0x36f502, + 0xbe2bc82, + 0xc238482, + 0xca2e802, + 0x22e803, + 0xce01ec2, + 0x2fe203, + 0x2f1e84, + 0x201ec3, + 0x26e8c4, + 0x201ecb, + 0x213c03, + 0x2de946, + 0x239f84, + 0x29034e, + 0x371145, + 0x38af48, + 0x31ffc7, + 0x31ffca, + 0x229743, + 0x22f147, + 0x31efc5, + 0x22f8c4, + 0x265b06, + 0x265b07, + 0x2c11c4, + 0x2f7a87, + 0x313d44, + 0x26c004, + 0x26c006, + 0x387184, + 0x3510c6, 0x203f83, - 0x26ec83, - 0x206d02, - 0x2f8043, + 0x35e288, + 0x203f88, + 0x245503, + 0x268143, + 0x399a04, + 0x39e003, + 0xd219f02, + 0xd6d6a42, + 0x20bac3, + 0x207146, + 0x241fc3, + 0x377cc4, + 0xdaee982, + 0x3af843, + 0x3507c3, + 0x217a02, + 0xde04142, + 0x2c1946, + 0x233ac7, + 0x2e8945, + 0x37de04, + 0x28c505, + 0x268907, + 0x267805, + 0x2b8649, + 0x2cefc6, + 0x2daa88, + 0x2e8846, + 0xe21a1c2, + 0x32ca08, + 0x2f1c46, + 0x21a1c5, + 0x2f6d87, + 0x309984, + 0x309985, + 0x276384, + 0x276388, + 0xe60cc02, + 0xea09882, + 0x3103c6, + 0x3b8988, + 0x334385, + 0x337306, + 0x342f08, + 0x344a88, + 0xee09885, + 0xf2142c4, + 0x3b0787, + 0xf60e5c2, + 0xfa1b102, + 0x10a099c2, + 0x2b9785, + 0x2a2645, + 0x2fef86, + 0x3b2547, + 0x380747, + 0x112a84c3, + 0x2a84c7, + 0x31eb08, + 0x376ec9, + 0x376d07, + 0x384d07, + 0x3a8ec8, + 0x3ad4c6, + 0x22f3c6, + 0x23000c, + 0x23120a, + 0x231687, + 0x232c8b, + 0x233907, + 0x23390e, + 0x234cc4, + 0x235ac4, + 0x237a47, + 0x3690c7, + 0x23b206, + 0x23b207, + 0x23b4c7, + 0x19604682, + 0x23c886, + 0x23c88a, + 0x23ce8b, + 0x23dbc7, + 0x23ed45, + 0x23f083, + 0x240586, + 0x240587, + 0x38eb43, + 0x19a0c442, + 0x240f4a, + 0x19f5d882, + 0x1a2a5e02, + 0x1a643142, + 0x1aa2cd82, + 0x244bc5, + 0x245304, + 0x1b205742, + 0x268dc5, + 0x23d483, + 0x20eac5, + 0x22ad44, + 0x206804, + 0x314046, + 0x25e206, + 0x28a003, + 0x238284, + 0x3a6803, + 0x1b600dc2, + 0x391c04, + 0x391c06, + 0x3b0d05, + 0x205e06, + 0x2f6e88, + 0x266e84, + 0x27ed08, + 0x2426c5, + 0x228308, + 0x29ff86, + 0x237587, + 0x22e204, + 0x22e206, + 0x33f443, + 0x383ec3, + 0x223d08, + 0x318dc4, + 0x348747, + 0x23e6c6, + 0x2d6389, + 0x250348, + 0x26cd08, + 0x26d084, + 0x351443, + 0x225e02, + 0x1c60f882, + 0x1ca10e82, + 0x3a7403, + 0x1ce04a42, + 0x38eac4, + 0x2862c6, + 0x26e605, + 0x21ba03, + 0x232884, + 0x2b14c7, + 0x33da03, + 0x231a88, + 0x208545, + 0x36e803, + 0x273445, + 0x273584, + 0x2f6a86, + 0x209ec4, + 0x211346, + 0x211b86, + 0x3916c4, + 0x213b43, + 0x1d205882, + 0x247345, + 0x221c03, + 0x1d61b0c2, + 0x22ffc3, + 0x209bc5, + 0x232403, + 0x232409, + 0x1da05f02, + 0x1e205e42, + 0x2893c5, + 0x218786, + 0x2d1746, + 0x2b0a88, + 0x2b0a8b, + 0x20718b, + 0x2e8b45, + 0x2db145, + 0x2c6309, + 0x1600302, + 0x391888, + 0x20dc44, + 0x1ea007c2, + 0x3a7883, + 0x1f2c6086, + 0x20ae88, + 0x1f601402, + 0x2344c8, + 0x1fa2bb82, + 0x3b92ca, + 0x1feccc43, + 0x3ac1c6, + 0x3af408, + 0x3ac008, + 0x31d006, + 0x36bc07, + 0x264a07, + 0x3349ca, + 0x2d77c4, + 0x3474c4, + 0x35c1c9, + 0x20794385, + 0x209686, + 0x20e1c3, + 0x24a044, + 0x20a02644, + 0x202647, + 0x212fc7, + 0x22a584, + 0x285445, + 0x2ff048, + 0x366747, + 0x370f07, + 0x20e18342, + 0x327704, + 0x292b48, + 0x245bc4, + 0x247784, + 0x248085, + 0x2481c7, + 0x223589, + 0x248fc4, + 0x249709, + 0x249948, + 0x249dc4, + 0x249dc7, + 0x2124aa83, + 0x24ad47, + 0x1609d02, + 0x16ad202, + 0x24bec6, + 0x24c507, + 0x24cd44, + 0x24e6c7, + 0x24fa47, + 0x24fdc3, + 0x248902, + 0x229642, + 0x250a03, + 0x250a04, + 0x250a0b, + 0x379a48, + 0x256804, + 0x2523c5, + 0x254007, + 0x2555c5, + 0x2bc00a, + 0x256743, + 0x2160fc82, + 0x226e84, + 0x258d89, + 0x25c343, + 0x25c407, + 0x24a849, + 0x282688, + 0x204743, + 0x278fc7, + 0x279709, + 0x268ac3, + 0x2810c4, + 0x283c89, + 0x2880c6, + 0x289683, + 0x200182, + 0x21f983, + 0x3a8a87, + 0x21f985, + 0x379746, + 0x256e84, + 0x302e85, + 0x2e4403, + 0x216c46, + 0x20db42, + 0x395144, + 0x221402, + 0x221403, + 0x21a00782, + 0x247303, + 0x215c44, + 0x215c47, + 0x200906, 0x202602, - 0x203f83, - 0x26ec83, - 0x206d02, - 0x2d0783, - 0x368883, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x2964c4, - 0x204303, - 0x20fbc3, - 0x213184, - 0x204ac3, - 0x200383, - 0x210582, + 0x21e025c2, + 0x2dca84, + 0x22235e82, + 0x22600b02, + 0x2d4f84, + 0x2d4f85, + 0x2b6dc5, + 0x390e06, + 0x22a05d42, + 0x205d45, + 0x20cf05, + 0x20ae03, + 0x210986, + 0x2126c5, + 0x2166c2, + 0x343605, + 0x2166c4, + 0x221ec3, + 0x227343, + 0x22e0c642, + 0x2d4987, + 0x3669c4, + 0x3669c9, + 0x249f44, + 0x291d43, + 0x2f6609, + 0x367508, + 0x232a24c4, + 0x2a24c6, + 0x21c303, + 0x247bc3, + 0x2e9dc3, + 0x236eb382, + 0x368cc2, + 0x23a05e82, + 0x323cc8, + 0x32a388, + 0x398e46, + 0x2e27c5, + 0x22efc5, + 0x352ec7, + 0x21d205, + 0x228782, + 0x23e38182, + 0x1603002, + 0x2416c8, + 0x32c945, + 0x2e3404, + 0x2ebac5, + 0x23f407, + 0x3207c4, + 0x240e42, + 0x24200582, + 0x338984, + 0x212cc7, + 0x28a2c7, + 0x34ff84, + 0x292203, + 0x245444, + 0x245448, + 0x22f706, + 0x26598a, + 0x223444, + 0x292588, + 0x288504, + 0x221946, + 0x294684, + 0x2b9a86, + 0x366c89, + 0x25da47, + 0x3375c3, + 0x24667e42, + 0x267e43, + 0x20ee02, + 0x24a11ec2, + 0x3085c6, + 0x365c88, + 0x2a4087, + 0x3a3f49, + 0x291c49, + 0x2a5045, + 0x2a6049, + 0x2a6805, + 0x2a6949, + 0x2a8005, + 0x2a9108, + 0x21fb84, + 0x24e890c7, + 0x2a9303, + 0x2a9307, + 0x3850c6, + 0x2a9b87, + 0x2a1085, + 0x2935c3, + 0x2521ae02, + 0x3b40c4, + 0x2562ce82, + 0x258203, + 0x25a17f42, + 0x36d586, + 0x2f3a85, + 0x2ac207, + 0x26cc43, + 0x325044, + 0x20e903, + 0x33e783, + 0x25e02bc2, + 0x266015c2, + 0x398804, + 0x2488c3, + 0x243c85, + 0x26a029c2, + 0x27206482, + 0x2b4506, + 0x318f04, + 0x2e3004, + 0x2e300a, + 0x27a01fc2, + 0x37204a, + 0x3756c8, + 0x27fb1384, + 0x20ad83, + 0x201fc3, + 0x3a9a49, + 0x217649, + 0x285246, + 0x28244183, + 0x3292c5, + 0x30180d, + 0x375886, + 0x3bac8b, + 0x28602e82, + 0x22c1c8, + 0x29206e82, + 0x29606fc2, + 0x2ae585, + 0x29a03942, + 0x258447, + 0x21c907, + 0x21e003, + 0x2306c8, + 0x29e06502, + 0x312684, + 0x212943, + 0x351d45, + 0x34db83, + 0x2f3546, + 0x205904, + 0x268103, + 0x2ae9c3, + 0x2a205fc2, + 0x2e8ac4, + 0x35f6c5, + 0x39f1c7, + 0x275643, + 0x2ad883, + 0x2ae083, + 0x160fec2, + 0x2ae143, + 0x2ae943, + 0x2a605102, + 0x282104, + 0x25e406, + 0x342643, + 0x2aec43, + 0x2aaafd42, + 0x2afd48, + 0x2b0004, + 0x36c246, + 0x2b0387, + 0x249c46, + 0x28e2c4, + 0x38600682, + 0x384f8b, + 0x2fb08e, + 0x21930f, + 0x2985c3, + 0x38ebbbc2, + 0x1600f42, + 0x39201582, + 0x28f403, + 0x2fdec3, + 0x233706, + 0x277c46, + 0x3afd87, + 0x3328c4, + 0x396188c2, + 0x39a08882, + 0x348345, + 0x2e6047, + 0x3b5746, + 0x39e27282, + 0x227284, + 0x2b3ac3, + 0x3a20be02, + 0x3a759ec3, + 0x2b4c44, + 0x2be409, + 0x16c3ac2, + 0x3aa03a82, + 0x203a85, + 0x3aec3d42, + 0x3b203202, + 0x346947, + 0x239689, + 0x35ca0b, + 0x2647c5, + 0x2c4849, + 0x2e8246, + 0x31e6c7, + 0x3b608484, + 0x3199c9, + 0x373487, + 0x20ab47, + 0x20a383, + 0x20a386, + 0x3b68c7, + 0x206a43, + 0x2565c6, + 0x3be02a02, + 0x3c232682, + 0x385803, + 0x324c45, + 0x350f47, + 0x250086, + 0x21f905, + 0x277d44, + 0x2c9fc5, + 0x2f2684, + 0x3c6040c2, + 0x331107, + 0x2dbd44, + 0x217544, + 0x21754d, + 0x257509, + 0x3a4448, + 0x253944, + 0x3abc45, + 0x206447, + 0x2144c4, + 0x2e1947, + 0x21c485, + 0x3caa4604, + 0x2d92c5, + 0x25b004, + 0x24bb86, + 0x3b2345, + 0x3ce250c2, + 0x283844, + 0x283845, + 0x36fa46, + 0x20c3c5, + 0x30c304, + 0x2c5dc3, + 0x2053c6, + 0x358505, + 0x2bb485, + 0x3b2444, + 0x2234c3, + 0x2234cc, + 0x3d288a02, + 0x3d6010c2, + 0x3da00282, + 0x206343, + 0x206344, + 0x3de04bc2, + 0x2f9688, + 0x379805, + 0x235684, + 0x23b086, + 0x3e201f42, + 0x3e609782, + 0x3ea00e82, + 0x306b85, + 0x391586, + 0x211084, + 0x3263c6, + 0x2ba346, + 0x219943, + 0x3ef0de0a, + 0x247b05, + 0x2c8e83, + 0x223186, + 0x300fc9, + 0x223187, + 0x297788, + 0x2981c9, + 0x224348, + 0x229486, + 0x20bf03, + 0x3f2a8542, + 0x385683, + 0x385689, + 0x332448, + 0x3f649a02, + 0x3fa02342, + 0x227f83, + 0x2da905, + 0x251ec4, + 0x2c0909, + 0x22cb84, + 0x266348, + 0x202343, + 0x202344, + 0x278b03, + 0x2187c8, + 0x217487, + 0x4020b102, + 0x274082, + 0x351905, + 0x266689, + 0x209703, + 0x27b184, + 0x329284, + 0x2064c3, + 0x27c3ca, + 0x40752bc2, + 0x40a83802, + 0x2c5443, + 0x3739c3, + 0x1602302, + 0x38ac03, + 0x40e0f242, + 0x4120ec42, + 0x41610444, + 0x210446, + 0x383b06, + 0x26ad44, + 0x36c643, + 0x38bcc3, + 0x226883, + 0x23d206, + 0x2cb8c5, + 0x2c5a07, + 0x31e589, + 0x2ca645, + 0x2cb806, + 0x2cbd88, + 0x2cbf86, + 0x236a04, + 0x29944b, + 0x2ceac3, + 0x2ceac5, + 0x2cec08, + 0x228502, + 0x346c42, + 0x41a44c42, + 0x41e0e602, + 0x218903, + 0x422675c2, + 0x2675c3, + 0x2cef04, + 0x2cf5c3, + 0x42a115c2, + 0x42ed43c6, + 0x2a7306, + 0x43207902, + 0x4360f442, + 0x43a27382, + 0x43e02c82, + 0x4422dd02, + 0x44602d02, + 0x234703, + 0x390685, + 0x319606, + 0x44a11cc4, + 0x3b0b0a, + 0x32fe86, + 0x2e8d84, + 0x281d03, + 0x45604642, + 0x200c82, + 0x25fd03, + 0x45a05503, + 0x2c7b87, + 0x3b2247, + 0x47250b07, + 0x312d87, + 0x227b03, + 0x227b0a, + 0x236b84, + 0x23e5c4, + 0x23e5ca, + 0x213f05, + 0x47609642, + 0x24e683, + 0x47a008c2, + 0x21c2c3, + 0x267e03, + 0x48203342, + 0x2a8444, + 0x21de84, + 0x3b9505, + 0x305005, + 0x2e1ac6, + 0x2e1e46, + 0x48608442, + 0x48a033c2, + 0x3185c5, + 0x2a7012, + 0x2511c6, + 0x220803, + 0x30a746, + 0x220805, + 0x1610602, + 0x50e120c2, + 0x353e83, + 0x2120c3, + 0x2441c3, + 0x512023c2, + 0x376e43, + 0x5160b482, + 0x210483, + 0x282148, + 0x25e983, + 0x25e986, + 0x3a2987, + 0x306806, + 0x30680b, + 0x2e8cc7, + 0x3b3ec4, + 0x51e04ec2, + 0x379685, + 0x522054c3, + 0x2a6e03, + 0x326c05, + 0x329983, + 0x52729986, + 0x391a0a, + 0x26a9c3, + 0x204584, + 0x3b88c6, + 0x21a5c6, + 0x52a00983, + 0x324f07, + 0x285147, + 0x29b0c5, + 0x2318c6, + 0x224a83, + 0x54a10bc3, + 0x54e056c2, + 0x328144, + 0x22a2cc, + 0x236149, + 0x2414c7, + 0x249245, + 0x262a84, + 0x273cc8, + 0x278305, + 0x55284a05, + 0x28c609, + 0x351f43, + 0x2a5d84, + 0x556013c2, + 0x2013c3, + 0x55a94142, + 0x2a4386, + 0x160f982, + 0x55e06e02, + 0x306a88, + 0x2be603, + 0x2d9207, + 0x2e4d05, + 0x2dd685, + 0x32840b, + 0x2dd686, + 0x328606, + 0x2ffac6, + 0x262c84, + 0x3042c6, + 0x2e3508, + 0x23a043, + 0x250dc3, + 0x250dc4, + 0x2e4484, + 0x2e4a07, + 0x2e5ec5, + 0x562e6002, + 0x5660ba02, + 0x20ba05, + 0x2e83c4, + 0x2e83cb, + 0x2e8e88, + 0x228f44, + 0x2272c2, + 0x56e28ec2, + 0x23b903, + 0x2e9344, + 0x2e9605, + 0x2ea047, + 0x2eb604, + 0x2e8b84, + 0x57201302, + 0x360cc9, + 0x2ec405, + 0x264a85, + 0x2ecf85, + 0x57601303, + 0x2ee0c4, + 0x2ee0cb, + 0x2ee644, + 0x2ef3cb, + 0x2ef7c5, + 0x21944a, + 0x2f0048, + 0x2f024a, + 0x2f0ac3, + 0x2f0aca, + 0x57a01742, + 0x57e2d4c2, 0x21aa03, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x368883, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x2964c4, - 0x204ac3, - 0x200383, - 0x370145, - 0x217082, - 0x204cc2, - 0x15f048, - 0x1491b48, - 0x332ec3, - 0x2461c1, - 0x2096c1, - 0x202201, - 0x209441, - 0x24a5c1, - 0x27e081, - 0x24c0c1, - 0x2462c1, - 0x2e7481, - 0x30ed01, + 0x582f1bc2, + 0x2f1bc3, + 0x5875c402, + 0x58b22842, + 0x2f2504, + 0x21afc6, + 0x326105, + 0x2f4503, + 0x31a9c6, + 0x204405, + 0x25e704, + 0x58e05ec2, + 0x2c9244, + 0x2c5f8a, + 0x22d787, + 0x2f38c6, + 0x380b07, + 0x22a403, + 0x283e48, + 0x37f48b, + 0x3736c5, + 0x333ec5, + 0x333ec6, + 0x390884, + 0x3aa248, + 0x222943, + 0x222944, + 0x222947, + 0x38e446, + 0x352686, + 0x29018a, + 0x246604, + 0x24660a, + 0x59282846, + 0x282847, + 0x252447, + 0x270844, + 0x270849, + 0x25e0c5, + 0x235e0b, + 0x2e81c3, + 0x211503, + 0x22f003, + 0x22fac4, + 0x59600482, + 0x25d4c6, + 0x293345, + 0x30a985, + 0x24f6c6, + 0x3395c4, + 0x59a02782, + 0x23f0c4, + 0x59e01c42, + 0x2b9f05, + 0x21ad84, + 0x21bec3, + 0x5a612102, + 0x212103, + 0x23ba46, + 0x5aa03082, + 0x27f488, + 0x223004, + 0x223006, + 0x374246, + 0x2540c4, + 0x205345, + 0x2141c8, + 0x216547, + 0x219687, + 0x21968f, + 0x292a46, + 0x22cf03, + 0x22cf04, + 0x310504, + 0x20d003, + 0x221a84, + 0x240944, + 0x5ae42b02, + 0x289d43, + 0x242b03, + 0x5b209842, + 0x229f83, + 0x38eb83, + 0x21484a, + 0x358107, + 0x2efc0c, + 0x2efec6, + 0x30a146, + 0x248547, + 0x5b64c687, + 0x24f809, + 0x243584, + 0x24fbc4, + 0x5ba18942, + 0x5be027c2, + 0x290546, + 0x324d04, + 0x2d6bc6, + 0x2a5148, + 0x3b8dc4, + 0x258486, + 0x2d1705, + 0x265c88, + 0x207383, + 0x273705, + 0x273e83, + 0x264b83, + 0x264b84, + 0x2759c3, + 0x5c2ec082, + 0x5c602e02, + 0x2e8089, + 0x278205, + 0x278404, + 0x27a9c5, + 0x20dd44, + 0x2e0d07, + 0x343bc5, + 0x250cc4, + 0x250cc8, + 0x2d5086, + 0x2d7984, + 0x2d8e88, + 0x2dbb87, + 0x5ca03902, + 0x2e36c4, + 0x20d0c4, + 0x20ad47, + 0x5ce2b804, + 0x2ccf42, + 0x5d201102, + 0x201543, + 0x203984, + 0x2aa283, + 0x374e05, + 0x5d61e182, + 0x2eb285, + 0x202c42, + 0x34d5c5, + 0x365e45, + 0x5da00c42, + 0x350744, + 0x5de00d02, + 0x2387c6, + 0x29a146, + 0x2667c8, + 0x2bfa08, + 0x36d504, + 0x36d6c5, + 0x3610c9, + 0x2db1c4, + 0x3919c4, + 0x205183, + 0x5e222705, + 0x2c3b87, + 0x2a2744, + 0x341e8d, + 0x361782, + 0x361783, + 0x364503, + 0x5e600802, + 0x388305, + 0x25f9c7, + 0x205b44, + 0x312e47, + 0x2983c9, + 0x2c60c9, + 0x2519c7, + 0x273b03, + 0x273b08, + 0x2ed249, + 0x24e187, + 0x373605, + 0x39e086, + 0x39fb86, + 0x3a3c05, + 0x257605, + 0x5ea02d82, + 0x36ce45, + 0x2b2908, + 0x2c1706, + 0x5eeb7487, + 0x2efa04, + 0x2aa987, + 0x2f62c6, + 0x5f230982, + 0x36f746, + 0x2f83ca, + 0x2f8e85, + 0x5f6de402, + 0x5fa36542, + 0x3b6c06, + 0x2a1e88, + 0x5fe8a487, + 0x60234e42, + 0x2255c3, + 0x311d86, + 0x225044, + 0x3a2846, + 0x390b06, + 0x26ff0a, + 0x331c05, + 0x367ec6, + 0x3759c3, + 0x3759c4, + 0x207102, + 0x309943, + 0x60606382, + 0x2f0f83, + 0x3722c4, + 0x2a1fc4, + 0x2a1fca, + 0x229543, + 0x276288, + 0x22954a, + 0x27b447, + 0x2fcd86, + 0x238684, + 0x290bc2, + 0x2a2e82, + 0x60a04002, + 0x245403, + 0x252207, + 0x31ac87, + 0x2848c4, + 0x26f8c7, + 0x2ea146, + 0x216847, + 0x35e604, + 0x242a05, + 0x2b7985, + 0x60e0fe82, + 0x20fe86, + 0x218283, + 0x220502, + 0x220506, + 0x61203e02, + 0x6160b0c2, + 0x3ba785, + 0x61a21c82, + 0x61e03b42, + 0x33b5c5, + 0x393105, + 0x367f85, + 0x267303, + 0x286385, + 0x2dd747, + 0x307bc5, + 0x306185, + 0x38b044, + 0x3204c6, + 0x23e804, + 0x62201442, + 0x62f630c5, + 0x2ebe07, + 0x2d6dc8, + 0x25fe86, + 0x25fe8d, + 0x260709, + 0x260712, + 0x32f345, + 0x3339c3, + 0x6320a9c2, + 0x309444, + 0x375903, + 0x360fc5, + 0x2fa085, + 0x63612982, + 0x36e843, + 0x63a50b82, + 0x642bf542, + 0x6460fb42, + 0x353805, + 0x37ac43, + 0x37a4c8, + 0x64a07842, + 0x64e000c2, + 0x2a8406, + 0x33b80a, + 0x21bf03, + 0x20c343, + 0x2ee3c3, + 0x65a02dc2, + 0x73e35482, + 0x74601c82, + 0x201682, + 0x36f549, + 0x2c2f04, + 0x2309c8, + 0x74af4542, + 0x74e08602, + 0x2ef605, + 0x2330c8, + 0x282288, + 0x2f858c, + 0x22d543, + 0x25a9c2, + 0x75201f82, + 0x2caac6, + 0x2fdc05, + 0x26d343, + 0x23cc46, + 0x2fdd46, + 0x201f83, + 0x2ff883, + 0x300786, + 0x3013c4, + 0x295586, + 0x2cec85, + 0x30164a, + 0x2eebc4, + 0x302304, + 0x30370a, + 0x7566b082, + 0x337745, + 0x30478a, + 0x305285, + 0x305b44, + 0x305c46, + 0x305dc4, + 0x218dc6, + 0x75a6dac2, + 0x2f3206, + 0x2f3dc5, + 0x3ab6c7, + 0x200206, + 0x248744, + 0x2d5e07, + 0x30dd46, + 0x2b8a45, + 0x381947, + 0x39eb47, + 0x39eb4e, + 0x25ed06, + 0x2e1805, + 0x27dec7, + 0x282b43, + 0x3b2f87, + 0x20f5c5, + 0x212144, + 0x212f82, + 0x3addc7, + 0x332944, + 0x377404, + 0x273f0b, + 0x21d5c3, + 0x2b6987, + 0x21d5c4, + 0x2cc0c7, + 0x228bc3, + 0x33678d, + 0x388b48, + 0x21d044, + 0x250bc5, + 0x307d05, + 0x308143, + 0x75e22f02, + 0x309903, + 0x309fc3, + 0x210004, + 0x279805, + 0x218307, + 0x375a46, + 0x372003, + 0x23ab4b, + 0x26ba4b, + 0x2a654b, + 0x2de44a, + 0x30254b, + 0x31be8b, + 0x356b8c, + 0x378d11, + 0x3b654a, + 0x3ba10b, + 0x30ad8b, + 0x30b34a, + 0x30b88a, + 0x30cb4e, + 0x30d18b, + 0x30d44a, + 0x30ef11, + 0x30f34a, + 0x30f84b, + 0x30fd8e, + 0x31078c, + 0x310c4b, + 0x310f0e, + 0x31128c, + 0x31474a, + 0x31698c, + 0x76316c8a, + 0x317489, + 0x31af4a, + 0x31b1ca, + 0x31b44b, + 0x31f60e, + 0x31f991, + 0x328b89, + 0x328dca, + 0x3295cb, + 0x32a84a, + 0x32b316, + 0x32e14b, + 0x32f10a, + 0x32f50a, + 0x33084b, + 0x333449, + 0x337109, + 0x337d4d, + 0x33870b, + 0x33978b, + 0x33a14b, + 0x33a609, + 0x33ac4e, + 0x33b30a, + 0x33fc8a, + 0x33ffca, + 0x340b8b, + 0x3413cb, + 0x34168d, + 0x342c0d, + 0x343290, + 0x34374b, + 0x34408c, + 0x34480b, + 0x34644b, + 0x34798b, + 0x34c00b, + 0x34ca8f, + 0x34ce4b, + 0x34d94a, + 0x34e689, + 0x34f409, + 0x34f8cb, + 0x34fb8e, + 0x35434b, + 0x35574f, + 0x35864b, + 0x35890b, + 0x358bcb, + 0x3590ca, + 0x35c609, + 0x35f34f, + 0x36424c, + 0x36488c, + 0x364d0e, + 0x3653cf, + 0x36578e, + 0x365fd0, + 0x3663cf, + 0x366f4e, + 0x36770c, + 0x367a12, + 0x3689d1, + 0x36988e, + 0x36a04e, + 0x36a58e, + 0x36a90f, + 0x36acce, + 0x36b053, + 0x36b511, + 0x36b94e, + 0x36bdcc, + 0x36d913, + 0x36e210, + 0x36ea8c, + 0x36ed8c, + 0x36f24b, + 0x3703ce, + 0x370c8b, + 0x3715cb, + 0x37258c, + 0x37814a, + 0x37850c, + 0x37880c, + 0x378b09, + 0x37bb8b, + 0x37be48, + 0x37c049, + 0x37c04f, + 0x37d98b, + 0x7677eb8a, + 0x381fcc, + 0x383189, + 0x383608, + 0x38380b, + 0x383c8b, + 0x38480a, + 0x384a8b, + 0x38540c, + 0x386008, + 0x388d4b, + 0x38b44b, + 0x39484b, + 0x3958cb, + 0x39e6cb, + 0x39e989, + 0x39eecd, + 0x3a464a, + 0x3a5597, + 0x3a6bd8, + 0x3a96c9, + 0x3ab30b, + 0x3ac814, + 0x3acd0b, + 0x3ad28a, + 0x3aea0a, + 0x3aec8b, + 0x3b4250, + 0x3b4651, + 0x3b4d0a, + 0x3b5b4d, + 0x3b624d, + 0x3ba3cb, + 0x3bbd46, + 0x20ff83, + 0x76b80483, + 0x22cdc6, + 0x247645, + 0x27a007, + 0x31bd46, + 0x1656682, + 0x2ad9c9, + 0x31a7c4, + 0x2dacc8, + 0x232b43, + 0x309387, + 0x234f42, + 0x2ac243, + 0x76e07b02, + 0x2c7406, + 0x2c9884, + 0x369f44, + 0x390143, + 0x390145, + 0x776c3d82, + 0x77aa6cc4, + 0x270787, + 0x77e4a282, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x204e83, + 0x205702, + 0x16d208, + 0x2099c2, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x214843, + 0x324556, + 0x325793, + 0x26f749, + 0x3b0688, + 0x379509, + 0x304906, + 0x3389d0, + 0x254b53, + 0x38e508, + 0x28ea47, + 0x36c747, + 0x284d0a, + 0x372349, + 0x38d849, + 0x28decb, + 0x349846, + 0x379b4a, + 0x220d86, + 0x31a3c3, + 0x2d48c5, + 0x35e288, + 0x23888d, + 0x2b984c, + 0x2de0c7, + 0x30b00d, + 0x2142c4, + 0x22fd8a, + 0x230d4a, + 0x23120a, + 0x2099c7, + 0x23af07, + 0x23d844, + 0x22e206, + 0x20c144, + 0x2b4148, + 0x22cbc9, + 0x2b0a86, + 0x2b0a88, + 0x2422cd, + 0x2c6309, + 0x3ac008, + 0x264a07, + 0x2f1f0a, + 0x24c506, + 0x2580c7, + 0x2cc3c4, + 0x23f287, + 0x309c0a, + 0x3ae54e, + 0x21d205, + 0x3b4a4b, + 0x331a09, + 0x217649, + 0x21c747, + 0x2a34ca, + 0x20ac87, + 0x2fb1c9, + 0x38f0c8, + 0x3533cb, + 0x2da905, + 0x3a430a, + 0x266e09, + 0x26d2ca, + 0x2ca6cb, + 0x23f18b, + 0x28dc55, + 0x2e3b85, + 0x264a85, + 0x2ee0ca, + 0x3945ca, + 0x331787, + 0x21da83, + 0x2904c8, + 0x2d2c4a, + 0x223006, + 0x24dfc9, + 0x265c88, + 0x2d7984, + 0x2aa289, + 0x2bfa08, + 0x29fec7, + 0x3630c6, + 0x2ebe07, + 0x289a47, + 0x23d005, + 0x21d04c, + 0x250bc5, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2099c2, + 0x2a84c3, + 0x205503, + 0x204e83, + 0x200983, + 0x2a84c3, + 0x205503, + 0x25e983, + 0x200983, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x16d208, + 0x2099c2, + 0x2006c2, + 0x231442, + 0x206502, + 0x200542, + 0x2decc2, + 0x46a84c3, + 0x232403, + 0x2163c3, + 0x2e9dc3, + 0x244183, + 0x209703, + 0x2d47c6, + 0x205503, + 0x200983, + 0x233183, + 0x16d208, + 0x31ae44, + 0x202107, + 0x392403, + 0x2ae584, + 0x22e043, + 0x21c7c3, + 0x2e9dc3, + 0x16fc07, + 0x205702, + 0x18d2c3, + 0x5a099c2, + 0x88f4d, + 0x8928d, + 0x231442, + 0x1b1384, + 0x200442, + 0x5fb1288, + 0xed844, + 0x16d208, + 0x1411d82, + 0x15054c6, + 0x231783, + 0x200c03, + 0x66a84c3, + 0x22fd84, + 0x6a32403, + 0x6ee9dc3, + 0x202bc2, + 0x3b1384, + 0x205503, + 0x2f78c3, + 0x203ec2, + 0x200983, + 0x21b5c2, + 0x2f2443, + 0x203082, + 0x211643, + 0x265d43, + 0x200202, + 0x16d208, + 0x231783, + 0x2f78c3, + 0x203ec2, + 0x2f2443, + 0x203082, + 0x211643, + 0x265d43, + 0x200202, + 0x2f2443, + 0x203082, + 0x211643, + 0x265d43, + 0x200202, + 0x2a84c3, + 0x38d2c3, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x3b1384, + 0x244183, + 0x209703, + 0x211cc4, + 0x205503, + 0x200983, + 0x20f942, + 0x201303, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x38d2c3, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x3b1384, + 0x205503, + 0x200983, + 0x373605, + 0x212982, + 0x205702, + 0x16d208, + 0x1456108, + 0x2e9dc3, + 0x2274c1, + 0x202901, + 0x202941, + 0x23ad81, + 0x23ad01, + 0x30aec1, + 0x23aec1, + 0x2275c1, + 0x2eea41, + 0x30afc1, 0x200141, 0x200001, - 0x15f048, + 0x129845, + 0x16d208, + 0x201ec1, 0x200701, - 0x200101, - 0x2000c1, - 0x201e41, + 0x200301, + 0x200081, 0x200181, - 0x200941, + 0x200401, 0x200041, - 0x204ec1, - 0x200081, - 0x201481, - 0x200c01, - 0x2002c1, - 0x200381, + 0x201181, + 0x200101, + 0x200281, 0x200e81, - 0x21c2c1, - 0x2003c1, + 0x2008c1, + 0x200441, + 0x201301, + 0x206ec1, + 0x200341, + 0x200801, + 0x2002c1, + 0x2000c1, + 0x201501, 0x200201, - 0x200241, - 0x200a01, - 0x2019c1, - 0x201a81, + 0x200bc1, 0x2005c1, - 0x2007c1, - 0x200cc1, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x200382, - 0x200383, - 0x13ecc7, - 0xfcc7, - 0x28b86, - 0x3dcca, - 0x8cc48, - 0x58dc8, - 0x59207, - 0x62a46, - 0xde185, - 0x63c85, - 0x177ac6, - 0x125886, - 0x24ae04, - 0x31cdc7, - 0x15f048, - 0x2da904, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x2135c3, - 0x332ec3, - 0x204303, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x217082, - 0x2c8dc3, - 0x21fd43, - 0x200603, - 0x202942, - 0x251d43, - 0x205283, - 0x21e743, + 0x201cc1, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x200442, + 0x200983, + 0x16fc07, + 0x9807, + 0x1cdc6, + 0x13ef8a, + 0x88648, + 0x51d48, + 0x52107, + 0x191106, + 0xd8c05, + 0x192345, + 0x5d306, + 0x125c86, + 0x25ef44, + 0x311547, + 0x16d208, + 0x2d5f04, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2163c3, + 0x2e9dc3, + 0x244183, + 0x209703, + 0x205503, + 0x200983, + 0x212982, + 0x2c5983, + 0x2bb143, + 0x32c243, + 0x2022c2, + 0x25d183, + 0x2030c3, + 0x204903, 0x200001, - 0x203e43, - 0x225b04, - 0x37f1c3, - 0x318cc3, - 0x21c403, - 0x360383, - 0xaad0783, - 0x23a184, - 0x21c3c3, - 0x22f143, - 0x231b83, - 0x2318c3, - 0x23a943, - 0x2a85c3, - 0x318c43, - 0x233ec3, - 0x201e43, - 0x253f84, - 0x2abc02, - 0x258683, - 0x25eb43, - 0x27bfc3, - 0x262883, - 0x201dc3, - 0x332ec3, - 0x208803, - 0x209e43, - 0x204143, - 0x210203, - 0x2ff083, - 0xae30043, - 0x2b1083, - 0x2113c3, - 0x22d603, - 0x20fbc3, - 0x226302, - 0x201683, - 0x204ac3, - 0x160abc3, - 0x27d643, - 0x20ff03, - 0x216ec3, - 0x200383, - 0x3b37c3, - 0x21aa03, - 0x241f03, - 0x304f43, - 0x2f8203, - 0x30c845, - 0x2202c3, - 0x2f8243, - 0x35ed83, - 0x218c84, - 0x265203, - 0x311883, - 0x2d8fc3, - 0x201383, - 0x217082, - 0x23bd83, - 0x308484, - 0x22fec4, - 0x22a843, - 0x15f048, - 0x4cc2, - 0x1442, - 0x2942, - 0x5ac2, - 0x2302, - 0x702, - 0x4e242, - 0x1c2, - 0x8a42, - 0xc02, - 0xf302, - 0xb602, - 0x73fc2, - 0x4c82, - 0x61e82, - 0x17902, - 0x3cf82, - 0x54c2, - 0x18b82, - 0xfc2, - 0x682, - 0x1bb82, - 0x1f82, - 0xc4c2, - 0x1702, - 0x20c42, - 0xa42, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x20d1c2, - 0x200383, - 0xc2d0783, - 0x332ec3, - 0x20fbc3, - 0x20dc42, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x6c82, - 0x2031c2, - 0x24ac42, - 0x15f048, - 0xd1c2, - 0x233482, - 0x208842, - 0x22f942, - 0x204182, - 0x209282, - 0x63c85, - 0x204702, - 0x201882, - 0x211f82, - 0x2034c2, - 0x217902, - 0x384982, - 0x201ac2, - 0x245742, - 0x13ecc7, - 0x169a8d, - 0xde209, - 0x56bcb, - 0xe3888, - 0x55109, - 0x332ec3, - 0x15f048, - 0x15f048, - 0x59b46, - 0x204cc2, - 0x24ae04, - 0x20d1c2, - 0x2d0783, - 0x2000c2, - 0x231b83, - 0x208a42, - 0x2da904, - 0x204303, - 0x2513c2, - 0x204ac3, - 0x200382, - 0x200383, - 0x2716c6, - 0x31c0cf, - 0x70d8c3, - 0x15f048, - 0x20d1c2, - 0x2135c3, - 0x332ec3, - 0x20fbc3, - 0x155afcb, - 0xde548, - 0x14ff507, - 0x13ecc7, - 0x20d1c2, - 0x2d0783, - 0x332ec3, - 0x204ac3, - 0x204cc2, - 0x200902, - 0x207f42, - 0xfad0783, - 0x2416c2, - 0x231b83, - 0x2101c2, - 0x22ad02, - 0x332ec3, - 0x2630c2, - 0x255302, - 0x2ae4c2, - 0x203742, - 0x291e02, - 0x209902, - 0x200b82, - 0x274842, - 0x258142, - 0x251b02, - 0x2b36c2, - 0x242602, - 0x246082, - 0x263c42, - 0x20fbc3, - 0x205f02, - 0x204ac3, - 0x231302, - 0x27de02, - 0x200383, - 0x251dc2, - 0x20c4c2, - 0x209f42, - 0x200b42, - 0x20c842, - 0x2e4742, - 0x220382, - 0x24d082, - 0x234f42, - 0x310c8a, - 0x347d0a, - 0x37e80a, - 0x3b5dc2, - 0x2046c2, - 0x204e82, - 0xff4f589, - 0x10324d0a, - 0x15926c7, - 0x1410c43, - 0x243d0, - 0x9402, - 0x24fe44, - 0x10ad0783, - 0x231b83, - 0x251304, - 0x332ec3, - 0x2964c4, - 0x204303, - 0x20fbc3, - 0x204ac3, - 0x20abc3, - 0x200383, - 0x2202c3, - 0x24abc3, - 0x15f048, - 0x14629c4, - 0x614c5, - 0x5f88a, - 0x1168c2, - 0x1a03c6, - 0x102d11, - 0x1134f589, - 0x61548, - 0x82a08, - 0x5e887, - 0xf82, - 0x19a18a, - 0x2ac47, - 0x15f048, - 0x10b708, - 0xbac7, - 0x16c1b74b, - 0x1082, - 0x15de87, - 0xdb4a, - 0x5e58f, - 0xfd4f, - 0x1c402, - 0xd1c2, - 0xa8508, - 0x185b0a, - 0x1681c8, - 0x3b02, - 0x5e30f, - 0xa3d4b, - 0x1672c8, - 0x13edc7, - 0x15104a, - 0x2f64b, - 0x11dd09, - 0x150f47, - 0x100c4c, - 0x1b3c47, - 0x18d18a, - 0x94b88, - 0x195a8e, - 0x28b8e, - 0x2aa8b, - 0x2b2cb, - 0x2d3cb, - 0x2e209, - 0x3558b, - 0x4a68d, - 0xe984b, - 0xec8cd, - 0xecc4d, - 0x18274a, - 0x2fd0b, - 0x3688b, - 0x42305, - 0x14243d0, - 0x125d8f, - 0x1264cf, - 0x48dcd, - 0x25910, - 0x1742, - 0x17203988, - 0xfb48, - 0x176f4745, - 0x505cb, - 0x117050, - 0x57488, - 0x2b48a, - 0x5f4c9, - 0x695c7, - 0x69907, - 0x69ac7, - 0x6c287, - 0x6d307, - 0x6dd07, - 0x6e487, - 0x6e8c7, - 0x6f487, - 0x6f787, - 0x6ffc7, - 0x70187, - 0x70347, - 0x70507, - 0x70807, - 0x70c47, - 0x718c7, - 0x71d87, - 0x729c7, - 0x72f07, - 0x730c7, - 0x73807, - 0x73e87, - 0x74087, - 0x74347, - 0x74507, - 0x746c7, - 0x75047, - 0x754c7, - 0x75987, - 0x76147, - 0x76407, - 0x76bc7, - 0x76d87, - 0x77107, - 0x77d07, - 0x78987, - 0x78d87, - 0x78f47, - 0x79107, - 0x79547, - 0x7a307, - 0x7a607, - 0x7a907, - 0x7aac7, - 0x7ae47, - 0x7b387, - 0xa9c2, - 0x4c94a, - 0x16dc87, - 0x178d528b, - 0x14d5296, - 0x19151, - 0xf080a, - 0xa838a, - 0x59b46, - 0xd2acb, - 0x642, - 0x2e891, - 0x94609, - 0x9a109, - 0x74842, - 0xa4f4a, - 0xaa689, - 0xab24f, - 0xaca4e, - 0xad708, - 0x18d82, - 0x15da89, - 0x18b88e, - 0xfd08c, - 0xf254f, - 0x146ce, - 0x23b4c, - 0x2ccc9, - 0x2db51, - 0x465c8, - 0x482d2, - 0x49fcd, - 0x82bcd, - 0x19090b, - 0x3d2d5, - 0x4c809, - 0x4ec0a, - 0x4f489, - 0x5ecd0, - 0x72c4b, - 0x79f4f, - 0x7c48b, - 0x8340c, - 0x84610, - 0x8894a, - 0x8dd0d, - 0x16618e, - 0x1ae00a, - 0x8f7cc, - 0x93994, - 0x94291, - 0xa494b, - 0xa578f, - 0xa7bcd, - 0xac3ce, - 0xb1acc, - 0xb220c, - 0xdc90b, - 0xdcc0e, - 0x122110, - 0x11640b, - 0x17a64d, - 0x1af38f, - 0xb798c, - 0xb934e, - 0xbb311, - 0xc3ccc, - 0xc5a47, - 0x15e58d, - 0x12b50c, - 0x14be50, - 0xd1b4d, - 0xd8e47, - 0xe2350, - 0xfa008, - 0xfb08b, - 0x150bcf, - 0x17de88, - 0xf0a0d, - 0x181d50, - 0x17fb1846, - 0xb6003, - 0x1b02, - 0xd0309, - 0x5ac0a, - 0x1084c6, - 0x180dff49, - 0x13203, - 0xdab91, - 0xdafc9, - 0xdc047, - 0x5e40b, - 0xe4a90, - 0xe4f4c, - 0xe5385, - 0x126cc8, - 0x19dc0a, - 0x129607, - 0x1002, - 0x12464a, - 0x25e49, - 0x3a20a, - 0x8eacf, - 0x44f4b, - 0x1b280c, - 0x1b2ad2, - 0xaa085, - 0x2124a, - 0x186f2fc5, - 0x17698c, - 0x121203, - 0x184982, - 0xf86ca, - 0x96b88, - 0xeca88, - 0x14a587, - 0xd42, - 0x2602, - 0x3f390, + 0x2dc745, + 0x206b43, + 0x221344, + 0x26cc83, + 0x318ec3, + 0x21b103, + 0x35ff43, + 0xaaa84c3, + 0x235ac4, + 0x23dbc3, + 0x21cc43, + 0x21b0c3, + 0x22ffc3, + 0x232403, + 0x232143, + 0x2459c3, + 0x2a2703, + 0x318e43, + 0x2344c3, + 0x202643, + 0x24ce44, + 0x24e347, + 0x248902, + 0x250943, + 0x256303, + 0x273ac3, + 0x390f43, + 0x2025c3, + 0xaee9dc3, + 0x20bec3, + 0x2143c3, + 0x24a5c3, + 0x328085, + 0x209d43, + 0x2fa383, + 0xb21f903, + 0x365f03, + 0x20d543, + 0x227f83, + 0x209703, + 0x228502, + 0x27d2c3, + 0x205503, + 0x1604e83, + 0x224a43, + 0x209a43, + 0x204a03, + 0x200983, + 0x35fe83, + 0x20f943, + 0x201303, + 0x2efe83, + 0x2ff903, + 0x2f2603, + 0x204405, + 0x23e743, + 0x285346, + 0x2f2643, + 0x36cf43, + 0x3759c4, + 0x2d9083, + 0x2284c3, + 0x267ec3, + 0x233183, + 0x212982, + 0x22d543, + 0x3024c3, + 0x304144, + 0x377404, + 0x20ce83, + 0x16d208, + 0x205702, + 0x200242, + 0x2022c2, + 0x201702, + 0x202a42, + 0x206c02, + 0x245482, + 0x2007c2, + 0x20d882, + 0x200e82, + 0x20b102, + 0x20e602, + 0x2675c2, + 0x2056c2, + 0x2decc2, + 0x2013c2, + 0x2069c2, + 0x201302, + 0x2172c2, + 0x202482, + 0x200482, + 0x219382, + 0x202782, + 0x209842, + 0x2027c2, + 0x222702, + 0x203b42, + 0x5702, + 0x242, + 0x22c2, 0x1702, - 0x1aa2cf, - 0x177ac6, - 0x301ce, - 0xe7fcb, - 0x1ae208, - 0xd6c09, - 0x17cd92, - 0x7c0d, - 0x56608, - 0x56a89, - 0x5700d, - 0x59c89, - 0x5a28b, - 0x5b088, - 0x5f6c8, + 0x2a42, + 0x6c02, + 0x45482, + 0x7c2, + 0xd882, + 0xe82, + 0xb102, + 0xe602, + 0x675c2, + 0x56c2, + 0xdecc2, + 0x13c2, + 0x69c2, + 0x1302, + 0x172c2, + 0x2482, + 0x482, + 0x19382, + 0x2782, + 0x9842, + 0x27c2, + 0x22702, + 0x3b42, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2099c2, + 0x200983, + 0xc6a84c3, + 0x2e9dc3, + 0x209703, + 0x21a2c2, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x7b02, + 0x201bc2, + 0x153f3c5, + 0x25ed82, + 0x16d208, + 0x99c2, + 0x20c182, + 0x208d02, + 0x2024c2, + 0x209642, + 0x208442, + 0x192345, + 0x2038c2, + 0x203ec2, + 0x2023c2, + 0x204dc2, + 0x2013c2, + 0x385502, + 0x201102, + 0x236582, + 0x16fc07, + 0x1b270d, + 0xd8c89, + 0x56e8b, + 0xdd608, + 0x53dc9, + 0xfacc6, + 0x2e9dc3, + 0x16d208, + 0x16d208, + 0x52e06, + 0x1a78c7, + 0x205702, + 0x25ef44, + 0x2099c2, + 0x2a84c3, + 0x2006c2, + 0x232403, + 0x20d882, + 0x2d5f04, + 0x244183, + 0x249a02, + 0x205503, + 0x200442, + 0x200983, + 0x264a86, + 0x31ba0f, + 0x70a403, + 0x16d208, + 0x2099c2, + 0x2163c3, + 0x2e9dc3, + 0x209703, + 0x1526f4b, + 0xd9888, + 0x142b68a, + 0x14fa807, + 0xda405, + 0x16fc07, + 0x2099c2, + 0x2a84c3, + 0x2e9dc3, + 0x205503, + 0x205702, + 0x20c202, + 0x20bb42, + 0xfea84c3, + 0x23c042, + 0x232403, + 0x209d02, + 0x221402, + 0x2e9dc3, + 0x228782, + 0x251442, + 0x2a6c82, + 0x200f82, + 0x28d742, + 0x203442, + 0x202e42, + 0x267e42, + 0x24ecc2, + 0x211ec2, + 0x2ad882, + 0x2eab02, + 0x2182c2, + 0x2ad342, + 0x209703, + 0x20ec42, + 0x205503, + 0x200e42, + 0x281702, + 0x200983, + 0x25d202, + 0x209842, + 0x218942, + 0x202e02, + 0x200c42, + 0x2de402, + 0x20fe82, + 0x250b82, + 0x220642, + 0x30d44a, + 0x34d94a, + 0x37fc4a, + 0x3bbec2, + 0x202cc2, + 0x2058c2, + 0x1026e389, + 0x1072510a, + 0x1594ac7, + 0x1410843, + 0x24d50, + 0x50642, + 0x2030c4, + 0x10ea84c3, + 0x232403, + 0x249944, + 0x2e9dc3, + 0x3b1384, + 0x244183, + 0x209703, + 0x205503, + 0xdc105, + 0x204e83, + 0x200983, + 0x23e743, + 0x25ed03, + 0x16d208, + 0x1591084, + 0x18ff45, + 0x1a768a, + 0x116902, + 0x18ae46, + 0xaf551, + 0x1166e389, + 0x18ffc8, + 0x13f9c8, + 0xff387, + 0xec2, + 0x12984b, + 0x1a5b0a, + 0x21347, + 0x16d208, + 0x108f08, + 0xe4c7, + 0x17818f4b, + 0x1b887, + 0x1c02, + 0x6c707, + 0x1a1ca, + 0x13f6cf, + 0x988f, + 0x1b102, + 0x99c2, + 0xa2648, + 0x19e30a, + 0x1320c8, + 0xdc2, + 0x13f44f, + 0x9e18b, 0x68bc8, - 0x68e49, - 0x6904a, - 0x6c8cc, - 0xe5d0a, - 0x104f87, - 0x16b2cd, - 0xf910b, - 0x12fb4c, - 0x1a05d0, - 0x6902, - 0x1968cd, - 0x16c2, - 0x11fc2, - 0x104eca, - 0xf070a, - 0xf6bcb, - 0x36a4c, - 0x10b48e, - 0x21ccd, - 0x1ab488, - 0x6c82, - 0x1166118e, - 0x11f6a18e, - 0x1266c00a, - 0x12ed0a0e, - 0x137156ce, - 0x13f2a00c, - 0x15926c7, - 0x15926c9, - 0x1410c43, - 0x14731e8c, - 0x14f3a009, - 0x1409402, - 0x610d1, - 0x16a0d1, - 0x6bf4d, - 0xd0951, - 0x11b1d1, - 0x129f4f, - 0x131dcf, - 0x139f4c, - 0x14a94d, - 0x18d555, - 0x1ace0c, - 0x1b41cc, - 0x1b5850, - 0x940c, - 0x5838c, - 0xedc19, - 0x1a6719, - 0x115419, - 0x15c754, - 0x17f854, - 0x198594, - 0x19ae14, - 0x1a9054, - 0x1577fb09, - 0x15d98849, - 0x167b4289, - 0x11b6b089, - 0x9402, - 0x1236b089, - 0x9402, - 0xedc0a, - 0x9402, - 0x12b6b089, - 0x9402, - 0xedc0a, - 0x9402, - 0x1336b089, - 0x9402, - 0x13b6b089, - 0x9402, - 0x1436b089, - 0x9402, - 0xedc0a, - 0x9402, - 0x14b6b089, - 0x9402, - 0xedc0a, - 0x9402, - 0x1536b089, - 0x9402, - 0x15b6b089, - 0x9402, - 0x1636b089, - 0x9402, - 0x16b6b089, - 0x9402, - 0xedc0a, - 0x9402, - 0x102d05, - 0x19a184, - 0x11d644, - 0x1a4884, - 0xbfc04, - 0x2144, - 0x5e884, - 0x1482283, - 0x1420183, - 0xffd84, - 0x1542b83, - 0x1742, - 0x21cc3, - 0x204cc2, - 0x20d1c2, - 0x2000c2, - 0x2041c2, - 0x208a42, - 0x200382, - 0x202602, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204143, - 0x204ac3, - 0x200383, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x204ac3, - 0x200383, - 0x3b943, - 0x332ec3, - 0x204cc2, - 0x368883, - 0x1a2d0783, - 0x20ef47, - 0x332ec3, - 0x205d83, - 0x213184, - 0x204ac3, - 0x200383, - 0x25084a, - 0x2716c5, - 0x21aa03, - 0x205bc2, - 0x15f048, - 0x15f048, - 0xd1c2, - 0x11f0c2, - 0x15dfc5, - 0x15f048, - 0xd0783, - 0x1ae3db07, - 0xcfd46, - 0x1b1acd05, - 0xcfe07, - 0xa54a, - 0xa408, - 0xb747, - 0x5f2c8, - 0x18c407, - 0xed30f, - 0x3ab07, - 0x165bc6, - 0x117050, - 0x122f0f, - 0x108544, - 0x1b4cfece, - 0xafd0c, - 0x11de8a, - 0xac687, - 0x12d54a, - 0x60989, - 0xc2f4a, - 0x77a8a, - 0x1084c6, - 0xac74a, - 0x11a58a, - 0x154009, - 0xda448, - 0xda746, - 0xde74d, - 0xb9905, - 0x5a107, - 0x16df94, - 0xfe58b, - 0x16710a, - 0xa8bcd, - 0x28b83, - 0x28b83, - 0x28b86, - 0x28b83, - 0x168883, - 0x15f048, - 0xd1c2, - 0x51304, - 0x8cdc3, - 0x170145, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x205283, - 0x2d0783, - 0x231b83, - 0x2135c3, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x29a2c3, - 0x24abc3, - 0x205283, - 0x24ae04, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x209103, - 0x2d0783, - 0x231b83, - 0x2041c3, - 0x2135c3, - 0x332ec3, - 0x2964c4, - 0x23a0c3, - 0x22d603, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x21aa03, - 0x38c743, - 0x1d2d0783, - 0x231b83, - 0x2c3ec3, - 0x332ec3, - 0x2075c3, - 0x22d603, - 0x200383, - 0x2054c3, - 0x343c44, - 0x15f048, - 0x1dad0783, - 0x231b83, - 0x2ad7c3, - 0x332ec3, - 0x20fbc3, - 0x213184, - 0x204ac3, - 0x200383, - 0x21d7c3, - 0x15f048, - 0x1e2d0783, - 0x231b83, - 0x2135c3, - 0x20abc3, - 0x200383, - 0x15f048, - 0x15926c7, - 0x368883, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x2964c4, - 0x213184, - 0x204ac3, - 0x200383, - 0x13ecc7, - 0x16e1cb, - 0xdb3c4, - 0xb9905, - 0x1491b48, - 0xae2cd, - 0x1f68a405, - 0x192c4, - 0x1a5c3, - 0x367fc5, - 0x15f048, - 0x1d202, - 0x2803, - 0xf7286, - 0x32f448, - 0x304507, - 0x24ae04, - 0x3b3006, - 0x3b5706, - 0x15f048, - 0x310683, - 0x2384c9, - 0x2bdad5, - 0xbdadf, - 0x2d0783, - 0x39a9d2, - 0xf5806, - 0x10cfc5, - 0x2b48a, - 0x5f4c9, - 0x39a78f, - 0x2da904, - 0x20f345, - 0x2fee50, - 0x2959c7, - 0x20abc3, - 0x2842c8, - 0x1257c6, - 0x2b400a, - 0x200e84, - 0x2f2a03, - 0x2716c6, - 0x205bc2, - 0x26b44b, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x2f74c3, - 0x20d1c2, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x205d83, - 0x223103, - 0x200383, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x204ac3, - 0x200383, - 0x204cc2, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x24ae04, - 0x2d0783, - 0x231b83, - 0x222044, - 0x204ac3, - 0x200383, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x2135c3, - 0x209e43, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x262fc3, - 0x1e303, - 0x5d83, - 0x204ac3, - 0x200383, - 0x310c8a, - 0x32a949, - 0x34184b, - 0x341f8a, - 0x347d0a, - 0x356e8b, - 0x37300a, - 0x37914a, - 0x37e80a, - 0x37ea8b, - 0x39d949, - 0x39f84a, - 0x39fbcb, - 0x3a9d0b, - 0x3b4a8a, - 0x2d0783, - 0x231b83, - 0x2135c3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x10c9c9, - 0x15f048, - 0x2d0783, - 0x2695c4, - 0x200c82, - 0x213184, - 0x3ac705, - 0x205283, - 0x24ae04, - 0x2d0783, - 0x23a184, - 0x231b83, - 0x251304, - 0x2da904, - 0x2964c4, - 0x22d603, - 0x204ac3, - 0x200383, - 0x293ac5, - 0x209103, - 0x21aa03, - 0x22c6c3, - 0x258a04, - 0x262904, - 0x35d705, - 0x15f048, - 0x306e44, - 0x20e546, - 0x28a8c4, - 0x20d1c2, - 0x361ac7, - 0x253587, - 0x24f0c4, - 0x25d8c5, - 0x2d1d45, - 0x2b0405, - 0x2964c4, - 0x23cfc8, - 0x33f306, - 0x311f48, - 0x227b05, - 0x2e0405, - 0x377004, - 0x200383, - 0x2f39c4, - 0x355f46, - 0x2717c3, - 0x258a04, - 0x291a45, - 0x363644, - 0x234e84, - 0x205bc2, - 0x25e206, - 0x392206, - 0x3022c5, - 0x204cc2, - 0x368883, - 0x24e0d1c2, - 0x232dc4, - 0x208a42, - 0x20fbc3, - 0x25e402, - 0x204ac3, - 0x200382, - 0x213e83, - 0x24abc3, - 0x15f048, - 0x15f048, - 0x332ec3, - 0x204cc2, - 0x25a0d1c2, - 0x332ec3, - 0x2702c3, - 0x23a0c3, - 0x32bc44, - 0x204ac3, - 0x200383, - 0x15f048, - 0x204cc2, - 0x2620d1c2, - 0x2d0783, - 0x204ac3, - 0x200383, - 0x682, - 0x2044c2, - 0x217082, - 0x205d83, - 0x2ec383, - 0x204cc2, - 0x15f048, - 0x13ecc7, - 0x20d1c2, - 0x231b83, - 0x251304, - 0x202743, - 0x332ec3, - 0x209e43, - 0x20fbc3, - 0x204ac3, - 0x2183c3, - 0x200383, - 0x21d743, - 0x1286d3, - 0x12cb54, - 0x13ecc7, - 0x1fd86, - 0x5ae0b, - 0x28b86, - 0x58c07, - 0x130089, - 0xe9cca, - 0x8cb0d, - 0x16978c, - 0x13d64a, - 0x63c85, - 0xa588, - 0x177ac6, - 0x125886, - 0x201742, - 0x827cc, - 0x19a347, - 0x23551, - 0x2d0783, - 0x5f245, - 0x102c4, - 0x274341c6, - 0x19146, - 0x178146, - 0x920ca, - 0xb2f03, - 0x27a5c984, - 0x130045, - 0xa383, - 0xd2b8c, - 0xf6188, - 0xbaf48, - 0xa3bc9, - 0x20c48, - 0x141dd06, - 0xfbc88, - 0x5e884, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x204cc2, - 0x20d1c2, - 0x332ec3, - 0x20a3c2, - 0x204ac3, - 0x200383, - 0x213e83, - 0x36388f, - 0x363c4e, - 0x15f048, - 0x2d0783, - 0x4cd07, - 0x231b83, - 0x332ec3, - 0x204303, - 0x204ac3, - 0x200383, - 0x21d0c3, - 0x239c47, + 0x38f47, + 0x388a, + 0x304cb, + 0x4efc9, + 0x11dd07, + 0xfc34c, + 0x2c07, + 0x19b40a, + 0xd4ac8, + 0x1a3cce, + 0x1cdce, + 0x2118b, + 0x26ccb, + 0x27d4b, + 0x2c009, + 0x2da0b, + 0x5e7cd, + 0x85acb, + 0xdfc8d, + 0xe000d, + 0xe164a, + 0x17724b, + 0x1ae0cb, + 0x31c45, + 0x1424d50, + 0x12618f, + 0x1268cf, + 0xe2c0d, + 0x1b8f90, + 0x2bb82, + 0x17fb0388, + 0x9688, + 0x182ee705, + 0x48fcb, + 0x117090, + 0x4fdc8, + 0x26e8a, + 0x56b49, + 0x5cb47, + 0x5ce87, + 0x5d047, + 0x5f507, + 0x60587, + 0x60b87, + 0x61387, + 0x617c7, + 0x61cc7, + 0x61fc7, + 0x62fc7, + 0x63187, + 0x63347, + 0x63507, + 0x63807, + 0x64007, + 0x64c87, + 0x65407, + 0x66547, + 0x66b07, + 0x66cc7, + 0x67047, + 0x67487, + 0x67687, + 0x67947, + 0x67b07, + 0x67cc7, + 0x67f87, + 0x68247, + 0x68f07, + 0x69607, + 0x698c7, + 0x6a047, + 0x6a207, + 0x6a607, + 0x6aec7, + 0x6b147, + 0x6b547, + 0x6b707, + 0x6b8c7, + 0x70587, + 0x71387, + 0x718c7, + 0x71e47, + 0x72007, + 0x72387, + 0x728c7, + 0xdb42, + 0xbbb0a, + 0xffb87, + 0x184cfa0b, + 0x14cfa16, + 0x17e91, + 0x1082ca, + 0xa24ca, + 0x52e06, + 0xd0f8b, + 0x5e82, + 0x2f711, + 0x157789, + 0x942c9, + 0x67e42, + 0x9f54a, + 0xa4909, + 0xa504f, + 0xa5a8e, + 0xa6388, + 0x17f42, + 0x18ef09, + 0x17f08e, + 0xf80cc, + 0xdf20f, + 0x198f4e, + 0xc84c, + 0x11809, + 0x13491, + 0x222c8, + 0x24512, + 0x281cd, + 0x2e0cd, + 0x8618b, + 0xbadd5, + 0xbb9c9, + 0xe268a, + 0x120689, + 0x160310, + 0x39a0b, + 0x4480f, + 0x5648b, + 0x58a8c, + 0x70f90, + 0x7beca, + 0x7d18d, + 0x80d4e, + 0x86cca, + 0x8720c, + 0x89714, + 0x157411, + 0x1a200b, + 0x9004f, + 0x9320d, + 0x9a00e, + 0x9fd8c, + 0xa1acc, + 0xaae8b, + 0xab18e, + 0xab990, + 0x154c0b, + 0x1160cd, + 0x10e80f, + 0x17e50c, + 0xb090e, + 0xb2391, + 0xb3ecc, + 0xc00c7, + 0xc064d, + 0xc0fcc, + 0xc1dd0, + 0x102c8d, + 0x12bc87, + 0xc7750, + 0xd3748, + 0xd51cb, + 0x12aa8f, + 0x17e248, + 0x1084cd, + 0x14d550, + 0x18ba60c6, + 0xaff43, + 0xbe02, + 0x11e309, + 0x5394a, + 0x104186, + 0x18cd9009, + 0x11d43, + 0xd6191, + 0xd65c9, + 0xd7607, + 0xaf6cb, + 0xde6d0, + 0xdeb8c, + 0xdf6c5, + 0x18f248, + 0x19f94a, + 0x111947, + 0x33c2, + 0x124a4a, + 0x127549, + 0x35b4a, + 0x8a3cf, + 0x3edcb, + 0x12814c, + 0x169b92, + 0xaea45, + 0x166aca, + 0x192ece45, + 0x18020c, + 0x122843, + 0x185502, + 0xf2bca, + 0x14f3fcc, + 0x1b1a48, + 0xdfe48, + 0x16fb87, + 0x1c42, + 0x3082, + 0x3f590, + 0x27c2, + 0x1ad58f, + 0x5d306, + 0x77ece, + 0xe598b, + 0x86ec8, + 0xd1a49, + 0x17d152, + 0x1abecd, + 0x55b08, + 0x56d49, + 0x572cd, + 0x57b89, + 0x5c58b, + 0x5d848, + 0x61ac8, + 0x628c8, + 0x62b49, + 0x62d4a, + 0x6398c, + 0xe3cca, + 0xff947, + 0x2270d, + 0xf4b4b, + 0x11a5cc, + 0x18b050, + 0xc2, + 0x7a14d, + 0x2dc2, + 0x35482, + 0xff88a, + 0x1081ca, + 0x10928b, + 0x1ae28c, + 0x108c8e, + 0x100cd, + 0x1b3908, + 0x7b02, + 0x11b5ec4e, + 0x1227020e, + 0x12a83a0a, + 0x1336864e, + 0x13b143ce, + 0x1432ee0c, + 0x1594ac7, + 0x1594ac9, + 0x1410843, + 0x14b3054c, + 0x15333209, + 0x15b49dc9, + 0x50642, + 0x18fb51, + 0x70151, + 0x8394d, + 0x17acd1, + 0x114311, + 0x12ed4f, + 0x13048f, + 0x13314c, + 0x149d0c, + 0x1a688d, + 0x1bb815, + 0x5064c, + 0x11f0cc, + 0xe9c50, + 0x11d44c, + 0x12a54c, + 0x15e999, + 0x168399, + 0x16fd99, + 0x175d54, + 0x181ad4, + 0x19b7d4, + 0x19d714, + 0x1ac314, + 0x16250709, + 0x1699ba89, + 0x1731f189, + 0x11e224c9, + 0x50642, + 0x126224c9, + 0x50642, + 0x15e98a, + 0x50642, + 0x12e224c9, + 0x50642, + 0x15e98a, + 0x50642, + 0x136224c9, + 0x50642, + 0x13e224c9, + 0x50642, + 0x146224c9, + 0x50642, + 0x15e98a, + 0x50642, + 0x14e224c9, + 0x50642, + 0x15e98a, + 0x50642, + 0x156224c9, + 0x50642, + 0x15e224c9, + 0x50642, + 0x15e98a, + 0x50642, + 0x166224c9, + 0x50642, + 0x16e224c9, + 0x50642, + 0x176224c9, + 0x50642, + 0x15e98a, + 0x50642, + 0xaf545, + 0x1a5b04, + 0x2bb84, + 0x1aa404, + 0x1a75c4, + 0xc484, + 0x13fc4, + 0x58f44, + 0xff384, + 0x14ab3c3, + 0x143e603, + 0xfb244, + 0x1547c03, + 0x2bb82, + 0x100c3, + 0x205702, + 0x2099c2, + 0x2006c2, + 0x218342, + 0x20d882, + 0x200442, + 0x203082, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x24a5c3, + 0x205503, + 0x200983, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x205503, + 0x200983, + 0x3fc3, + 0x2e9dc3, + 0x205702, + 0x38d2c3, + 0x1aea84c3, + 0x3b8e47, + 0x2e9dc3, + 0x206343, + 0x211cc4, + 0x205503, + 0x200983, + 0x255cca, + 0x264a85, + 0x201303, + 0x20b0c2, + 0x16d208, + 0x16d208, + 0x99c2, + 0x11fd02, + 0x6c845, + 0x129845, + 0x16d208, + 0x1b887, + 0xa84c3, + 0x1ba38e47, + 0x13ee06, + 0x1bd49c05, + 0x11de07, + 0x66ca, + 0x3748, + 0x65c7, + 0x56948, + 0x28d87, + 0x2c6cf, + 0x30b87, + 0x3b806, + 0x117090, + 0x12330f, + 0x104204, + 0x1c11dece, + 0xa8b4c, + 0x4f14a, + 0x9a2c7, + 0x112b8a, + 0x18f409, + 0xbf34a, + 0x5414a, + 0x104186, + 0x9a38a, + 0x8350a, + 0xe47c9, + 0xd5a48, + 0xd5d46, + 0xd9a8d, + 0xb3c45, + 0x1a78c7, + 0x5d6c7, + 0xd9394, + 0xf938b, + 0x68a0a, + 0xa2d0d, + 0x1cdc3, + 0x1cdc3, + 0x1cdc6, + 0x1cdc3, + 0x18d2c3, + 0x16d208, + 0x99c2, + 0x49944, + 0x887c3, + 0x173605, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2030c3, + 0x2a84c3, + 0x232403, + 0x2163c3, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x294483, + 0x25ed03, + 0x2030c3, + 0x25ef44, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2082c3, + 0x2a84c3, + 0x232403, + 0x218343, + 0x2163c3, + 0x2e9dc3, + 0x3b1384, + 0x353903, + 0x227f83, + 0x209703, + 0x205503, + 0x200983, + 0x201303, + 0x311dc3, + 0x1dea84c3, + 0x232403, + 0x246383, + 0x2e9dc3, + 0x20a203, + 0x227f83, + 0x200983, + 0x2072c3, + 0x33bac4, + 0x16d208, + 0x1e6a84c3, + 0x232403, + 0x2a6443, + 0x2e9dc3, + 0x209703, + 0x211cc4, + 0x205503, + 0x200983, + 0x21db03, + 0x16d208, + 0x1eea84c3, + 0x232403, + 0x2163c3, + 0x204e83, + 0x200983, + 0x16d208, + 0x1594ac7, + 0x38d2c3, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x3b1384, + 0x211cc4, + 0x205503, + 0x200983, + 0x129845, + 0x16fc07, + 0xd95cb, + 0xd69c4, + 0xb3c45, + 0x1456108, + 0xa6a8d, + 0x20284a05, + 0x18004, + 0x169c3, + 0x186345, + 0x349a05, + 0x16d208, + 0x1cdc2, + 0x336c3, + 0xf1446, + 0x319ec8, + 0x313bc7, + 0x25ef44, + 0x3b2c86, + 0x3bb6c6, + 0x16d208, + 0x30ce43, + 0x33e589, + 0x237295, + 0x3729f, + 0x2a84c3, + 0x31d012, + 0xefac6, + 0x10a045, + 0x26e8a, + 0x56b49, + 0x31cdcf, + 0x2d5f04, + 0x20b145, + 0x2fa150, + 0x3b0887, + 0x204e83, + 0x28b148, + 0x125bc6, + 0x2ae1ca, + 0x256044, + 0x2ec883, + 0x264a86, + 0x20b0c2, + 0x22d54b, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x2f1743, + 0x2099c2, + 0x2cd83, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x206343, + 0x221f03, + 0x200983, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x205503, + 0x200983, + 0x205702, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x9885, + 0x25ef44, + 0x2a84c3, + 0x232403, + 0x210444, + 0x205503, + 0x200983, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2163c3, + 0x2143c3, + 0x209703, + 0x205503, + 0x200983, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x391683, + 0x63643, + 0x6343, + 0x205503, + 0x200983, + 0x30d44a, + 0x32b0c9, + 0x346b0b, + 0x34708a, + 0x34d94a, + 0x35d74b, + 0x371e0a, + 0x37814a, + 0x37fc4a, + 0x37fecb, + 0x39f689, + 0x3a140a, + 0x3a178b, + 0x3acfcb, + 0x3b9eca, + 0x2a84c3, + 0x232403, + 0x2163c3, + 0x209703, + 0x205503, + 0x200983, + 0x4589, + 0x16d208, + 0x2a84c3, + 0x25cb44, + 0x207ac2, + 0x211cc4, + 0x26fc45, + 0x2030c3, + 0x25ef44, + 0x2a84c3, + 0x235ac4, + 0x232403, + 0x249944, + 0x2d5f04, + 0x3b1384, + 0x227f83, + 0x205503, + 0x200983, + 0x27a305, + 0x2082c3, + 0x201303, + 0x22ed03, + 0x250cc4, + 0x390fc4, + 0x34ae45, + 0x16d208, + 0x302044, + 0x3510c6, + 0x276384, + 0x2099c2, + 0x371007, + 0x24c0c7, + 0x247784, + 0x2555c5, + 0x302e85, + 0x2a9305, + 0x3b1384, + 0x3b8ac8, + 0x239486, + 0x30c188, + 0x24ed05, + 0x2da905, + 0x236b84, + 0x200983, + 0x2ed844, + 0x35c946, + 0x264b83, + 0x250cc4, + 0x256005, + 0x32d104, + 0x334944, + 0x20b0c2, + 0x2425c6, + 0x3962c6, + 0x2fdc05, + 0x205702, + 0x38d2c3, + 0x262099c2, + 0x2333c4, + 0x20d882, + 0x209703, + 0x202c82, + 0x205503, + 0x200442, + 0x214843, + 0x25ed03, + 0x16d208, + 0x16d208, + 0x2e9dc3, + 0x205702, + 0x26e099c2, + 0x2e9dc3, + 0x245b43, + 0x353903, + 0x327344, + 0x205503, + 0x200983, + 0x16d208, + 0x205702, + 0x276099c2, + 0x2a84c3, + 0x205503, + 0x200983, + 0x482, + 0x20a9c2, + 0x212982, + 0x206343, + 0x2e87c3, + 0x205702, + 0x129845, + 0x16d208, + 0x16fc07, + 0x2099c2, + 0x232403, + 0x249944, + 0x2032c3, + 0x2e9dc3, + 0x2143c3, + 0x209703, + 0x205503, + 0x216b03, + 0x200983, + 0x21da83, + 0x118fd3, + 0x11c954, + 0x16fc07, + 0x13b46, + 0x53b4b, + 0x1cdc6, + 0x51b87, + 0x11ab09, + 0xe6d4a, + 0x8850d, + 0x1b240c, + 0x1ada8a, + 0x192345, + 0x6708, + 0x5d306, + 0x125c86, + 0x22bb82, + 0xff14c, + 0x1a5cc7, + 0x22e51, + 0x2a84c3, + 0x568c5, + 0x77848, + 0x9e04, + 0x288347c6, + 0x17e86, + 0x8cb46, + 0x8da0a, + 0xac543, + 0x28e54b04, + 0x11aac5, + 0xde283, + 0xdc105, + 0xd104c, + 0xf04c8, + 0xb5708, + 0x9e009, + 0x134b08, + 0x141e046, + 0xda40a, + 0x82b48, + 0xf4648, + 0xff384, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x205702, + 0x2099c2, + 0x2e9dc3, + 0x202bc2, + 0x205503, + 0x200983, + 0x214843, + 0x3653cf, + 0x36578e, + 0x16d208, + 0x2a84c3, + 0x42f87, + 0x232403, + 0x2e9dc3, + 0x244183, + 0x205503, + 0x200983, + 0x201bc3, + 0x201bc7, 0x200142, - 0x2c1949, - 0x201442, - 0x23f68b, - 0x2b5b8a, - 0x2bcfc9, - 0x200282, - 0x262b46, - 0x26d615, - 0x23f7d5, - 0x274a13, - 0x23fd53, - 0x202342, - 0x20d605, - 0x3ab1cc, - 0x24698b, - 0x29a745, - 0x205ac2, - 0x289c02, - 0x386746, - 0x200f82, - 0x25fb86, - 0x294d0d, - 0x255dcc, - 0x224444, - 0x201342, - 0x203782, - 0x248688, - 0x202302, - 0x208886, - 0x303bc4, - 0x26d7d5, - 0x274b93, - 0x210b83, - 0x33070a, - 0x2f0187, - 0x3b2209, - 0x32dc47, - 0x3124c2, + 0x32c249, + 0x200242, + 0x23f88b, + 0x297b8a, + 0x2a2a49, + 0x200882, + 0x391206, + 0x34ed15, + 0x23f9d5, + 0x246993, + 0x23ff53, + 0x202a82, + 0x205ac5, + 0x3b364c, + 0x27160b, + 0x2726c5, + 0x201702, + 0x284202, + 0x386fc6, + 0x200ec2, + 0x3695c6, + 0x2d4c4d, + 0x27ef4c, + 0x224dc4, + 0x203dc2, + 0x205942, + 0x2248c8, + 0x202a42, + 0x312fc6, + 0x2ba844, + 0x34eed5, + 0x246b13, + 0x210783, + 0x32fa0a, + 0x3bb147, + 0x3094c9, + 0x37b887, + 0x30f242, 0x200002, - 0x3a4386, - 0x20a0c2, - 0x15f048, - 0x200802, - 0x211cc2, - 0x27d407, - 0x3b3507, - 0x21c7c5, - 0x201082, - 0x21d707, - 0x21d8c8, - 0x2413c2, - 0x2c2fc2, - 0x22c1c2, - 0x20e542, - 0x23b688, - 0x218443, - 0x2b72c8, - 0x2e078d, - 0x21fe43, - 0x226288, - 0x23e88f, - 0x23ec4e, - 0x24ac8a, - 0x229d11, - 0x22a190, - 0x2bf0cd, - 0x2bf40c, - 0x38c5c7, - 0x330887, - 0x3b30c9, - 0x204f02, - 0x200702, - 0x25a6cc, - 0x25a9cb, - 0x202ac2, - 0x2dcac6, - 0x20db42, - 0x20c502, - 0x21c402, - 0x20d1c2, - 0x384684, - 0x23c7c7, - 0x220802, - 0x242c07, - 0x243c47, - 0x2271c2, - 0x20e482, - 0x24cbc5, - 0x204d02, - 0x20cb4e, - 0x36f1cd, - 0x231b83, - 0x353a0e, - 0x2c0b8d, - 0x3ab643, - 0x201842, - 0x206744, - 0x208182, - 0x220a42, - 0x33e805, - 0x348447, - 0x372202, - 0x2041c2, - 0x250f07, - 0x2543c8, - 0x2abc02, - 0x2aa106, - 0x25a54c, - 0x25a88b, - 0x20da42, - 0x26588f, - 0x265c50, - 0x26604f, - 0x266415, - 0x266954, - 0x266e4e, - 0x2671ce, - 0x26754f, - 0x26790e, - 0x267c94, - 0x268193, - 0x26864d, - 0x27b549, - 0x28dbc3, - 0x200182, - 0x237b85, - 0x206506, - 0x208a42, - 0x21a2c7, - 0x332ec3, - 0x200642, - 0x36edc8, - 0x229f51, - 0x22a390, - 0x200bc2, - 0x28d387, - 0x200b02, - 0x205fc7, - 0x201b02, - 0x32f249, - 0x386707, - 0x281408, - 0x234006, - 0x2cf4c3, - 0x2cf4c5, - 0x231e02, - 0x204842, - 0x3a4785, - 0x376e05, + 0x3aef06, + 0x20cb42, + 0x16d208, + 0x2105c2, + 0x20b382, + 0x274e87, + 0x20f687, + 0x21b585, + 0x201c02, + 0x21da47, + 0x21dc08, + 0x242b42, + 0x2bf3c2, + 0x22e802, + 0x201ec2, + 0x237b88, + 0x201ec3, + 0x2b5308, + 0x2cf1cd, + 0x213c03, + 0x327988, + 0x239f8f, + 0x23a34e, + 0x25edca, + 0x229751, + 0x229bd0, + 0x2bcdcd, + 0x2bd10c, + 0x311c47, + 0x32fb87, + 0x3b2d49, + 0x224ec2, + 0x206c02, + 0x25340c, + 0x25370b, + 0x204142, + 0x2ab046, + 0x21a1c2, + 0x209882, + 0x21b102, + 0x2099c2, + 0x383a84, + 0x238bc7, + 0x204682, + 0x23d147, + 0x23e487, + 0x20e142, + 0x2301c2, + 0x242e45, + 0x205742, + 0x362e0e, + 0x2ebb8d, + 0x232403, + 0x2be90e, + 0x2e064d, + 0x37eac3, + 0x200e02, + 0x21fec4, + 0x2454c2, + 0x2175c2, + 0x358e45, + 0x364b47, + 0x383382, + 0x218342, + 0x249547, + 0x24d288, + 0x248902, + 0x2aeac6, + 0x25328c, + 0x2535cb, + 0x20fc82, + 0x25924f, + 0x259610, + 0x259a0f, + 0x259dd5, + 0x25a314, + 0x25a80e, + 0x25ab8e, + 0x25af0f, + 0x25b2ce, + 0x25b654, + 0x25bb53, + 0x25c00d, + 0x272a89, + 0x2895c3, + 0x200782, + 0x22b0c5, + 0x207f86, + 0x20d882, + 0x21f507, + 0x2e9dc3, 0x205e82, - 0x245f43, - 0x3636c7, - 0x210687, - 0x204982, - 0x3aae04, - 0x214183, - 0x2c9209, - 0x2ed188, - 0x205d82, - 0x2032c2, - 0x26e2c7, - 0x282185, - 0x2ab548, - 0x20d2c7, - 0x216143, - 0x372306, - 0x2bef4d, - 0x2bf2cc, - 0x280346, - 0x208842, - 0x2017c2, - 0x201f02, - 0x23e70f, - 0x23eb0e, - 0x2d1dc7, - 0x203cc2, - 0x2c3345, - 0x2c3346, - 0x20bcc2, - 0x205f02, - 0x28f406, - 0x205f03, - 0x205f06, - 0x2ca585, - 0x2ca58d, - 0x2cab55, - 0x2cb38c, - 0x2cc28d, - 0x2cc652, - 0x20b602, - 0x273fc2, + 0x362a08, + 0x229991, + 0x229dd0, + 0x206482, + 0x288d87, + 0x203942, + 0x214607, + 0x20be02, + 0x319cc9, + 0x386f87, + 0x27aac8, + 0x234606, + 0x2e86c3, + 0x32a105, + 0x232682, + 0x202082, + 0x3af305, + 0x380685, + 0x2040c2, + 0x24c543, + 0x32d187, + 0x223787, + 0x200502, + 0x254684, + 0x223b83, + 0x223b89, + 0x22c548, + 0x200282, + 0x204bc2, + 0x3105c7, + 0x31ff05, + 0x2a5348, + 0x219947, + 0x200e83, + 0x28c446, + 0x2bcc4d, + 0x2bcfcc, + 0x2b45c6, + 0x208d02, + 0x2a8542, + 0x202342, + 0x239e0f, + 0x23a20e, + 0x302f07, + 0x203d02, + 0x2bf745, + 0x2bf746, + 0x20f242, + 0x20ec42, + 0x221f06, + 0x214543, + 0x214546, + 0x2c6985, + 0x2c698d, + 0x2c6f55, + 0x2c814c, + 0x2c95cd, + 0x2c9992, + 0x20e602, + 0x2675c2, + 0x202d02, + 0x240806, + 0x2f7f86, + 0x2033c2, + 0x208006, + 0x2023c2, + 0x38b785, + 0x200542, + 0x2ebc89, + 0x31554c, + 0x31588b, + 0x200442, + 0x24e748, + 0x203b02, + 0x2056c2, + 0x26a346, + 0x222445, + 0x226747, + 0x257d85, + 0x29e405, + 0x243002, + 0x2067c2, + 0x2013c2, + 0x2df507, + 0x380c0d, + 0x380f8c, + 0x22f087, + 0x20f982, + 0x2069c2, + 0x241248, + 0x31e488, + 0x2e3988, + 0x308484, + 0x2ab407, + 0x2e90c3, + 0x228ec2, + 0x2082c2, + 0x2eb3c9, + 0x3a40c7, 0x201302, - 0x240fc6, - 0x2fcf46, - 0x201002, - 0x206586, - 0x211f82, - 0x37edc5, - 0x202382, - 0x20cc89, - 0x2df2cc, - 0x2df60b, - 0x200382, - 0x255688, - 0x213a02, - 0x204c82, - 0x246746, - 0x36b005, - 0x235007, - 0x2567c5, - 0x294805, - 0x24cd82, - 0x20a642, - 0x217902, - 0x2f2847, - 0x24410d, - 0x24448c, - 0x2b3387, - 0x2aa082, - 0x23cf82, - 0x24ba48, - 0x2d0488, - 0x2e5f88, - 0x2f09c4, - 0x2dce87, - 0x2ee483, - 0x2b6042, - 0x200e82, - 0x2f11c9, - 0x395e87, - 0x2054c2, - 0x277245, - 0x201202, - 0x26a102, - 0x349c43, - 0x349c46, - 0x2f74c2, - 0x2f7fc2, - 0x201402, - 0x3b3fc6, - 0x206687, - 0x207842, - 0x200e02, - 0x38bc8f, - 0x35384d, - 0x2b714e, - 0x2c0a0c, - 0x2003c2, - 0x205502, - 0x233e45, - 0x3b4e86, - 0x201ec2, - 0x200fc2, - 0x200682, - 0x20d244, - 0x2e0604, - 0x2d29c6, - 0x202602, - 0x27e787, - 0x22d703, - 0x22d708, - 0x24b048, - 0x390787, - 0x240ec6, - 0x20e5c2, - 0x23b383, - 0x23b387, - 0x272846, - 0x2e4385, - 0x2f0d48, - 0x206342, - 0x34a007, - 0x220c42, - 0x33c282, - 0x203b82, - 0x2dbe09, - 0x22fb02, - 0x200242, - 0x240183, - 0x319ac7, + 0x26a745, + 0x22d4c2, + 0x21aa02, + 0x2f9f03, + 0x2f9f06, + 0x2f1742, + 0x2f23c2, + 0x201a42, + 0x202f86, + 0x21fe07, + 0x213bc2, + 0x205ec2, + 0x2b514f, + 0x2be74d, + 0x3872ce, + 0x2e04cc, + 0x2009c2, + 0x207302, + 0x234445, + 0x30ba46, 0x2018c2, - 0x2df44c, - 0x2df74b, - 0x2803c6, - 0x20a2c5, - 0x222e82, - 0x200a42, - 0x2bd306, - 0x235b83, - 0x39c147, - 0x23bb02, - 0x203382, - 0x26d495, - 0x23f995, - 0x2748d3, - 0x23fed3, - 0x2934c7, - 0x2b5948, - 0x2fb310, - 0x30ee4f, - 0x2b5953, - 0x2bcd92, - 0x2c1510, - 0x2ca1cf, - 0x2d57d2, - 0x2d84d1, - 0x2d9513, - 0x2dbbd2, - 0x2dd20f, - 0x2e57ce, - 0x2f5092, - 0x2f6351, - 0x2f754f, - 0x2f834e, - 0x300011, - 0x355810, - 0x35f212, - 0x3702d1, - 0x2f9bc6, - 0x307487, - 0x373387, - 0x204b42, - 0x284e05, - 0x2febc7, - 0x217082, + 0x202482, + 0x200482, + 0x2198c4, + 0x2cf044, + 0x2d0e86, + 0x203082, + 0x36cac7, + 0x203083, + 0x285d48, + 0x34e488, + 0x239887, + 0x240706, + 0x203902, + 0x234b03, + 0x234b07, + 0x273946, + 0x2dee45, + 0x308808, + 0x200d02, + 0x331207, + 0x222702, + 0x361782, + 0x20cfc2, + 0x2c6749, + 0x230982, + 0x200842, + 0x22f303, + 0x331c87, + 0x2002c2, + 0x3156cc, + 0x3159cb, + 0x2b4646, + 0x2de1c5, + 0x221c82, + 0x203b42, + 0x2b7bc6, + 0x260dc3, + 0x38c187, + 0x236102, + 0x201442, + 0x34eb95, + 0x23fb95, + 0x246853, + 0x2400d3, + 0x2585c7, + 0x271a48, + 0x271a50, + 0x28d2cf, + 0x297953, + 0x2a2812, + 0x32be10, + 0x2d544f, + 0x35f7d2, + 0x30c3d1, + 0x2b7613, + 0x2c6512, + 0x2cff4f, + 0x2d2e8e, + 0x2d3f52, + 0x2d71d1, + 0x2d7c8f, + 0x30440e, + 0x2f0691, + 0x2f17d0, + 0x2f2752, + 0x2fc711, + 0x364586, + 0x36d3c7, + 0x372187, 0x203142, - 0x2293c5, - 0x21ee43, - 0x35d986, - 0x2442cd, - 0x24460c, - 0x206602, - 0x3ab04b, - 0x24684a, - 0x30be4a, - 0x2bbf49, - 0x2ef68b, - 0x20d40d, - 0x2ff2cc, - 0x24890a, - 0x275b0c, - 0x27afcb, - 0x29a58c, - 0x2fa34b, - 0x2df243, - 0x35ee06, - 0x3a6502, - 0x2f8b82, - 0x2db2c3, - 0x202502, - 0x202503, - 0x245886, - 0x2665c7, - 0x365146, - 0x385cc8, - 0x2d0188, - 0x2d3186, - 0x2019c2, - 0x301c8d, - 0x301fcc, - 0x2da9c7, - 0x306d07, - 0x21fdc2, - 0x21ac02, - 0x23b302, - 0x254782, - 0x20d1c2, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x213184, - 0x204ac3, - 0x200383, - 0x213e83, - 0x204cc2, - 0x204e02, - 0x29a94005, - 0x29e02e85, - 0x2a3177c6, - 0x15f048, - 0x2a6b5145, - 0x20d1c2, - 0x2000c2, - 0x2ab9c685, - 0x2ae83305, - 0x2b283e07, - 0x2b68b309, - 0x2ba47ac4, - 0x208a42, - 0x200642, - 0x2bf72245, - 0x2c293149, - 0x2c71db88, - 0x2cab2085, - 0x2cf363c7, - 0x2d219b08, - 0x2d6e8605, - 0x2da5b4c6, - 0x2de346c9, - 0x2e2b8648, - 0x2e6c4b48, - 0x2ea9cf0a, - 0x2ee52104, - 0x2f2d6585, - 0x2f6becc8, - 0x2fb51245, - 0x2184c2, - 0x2fe63b83, - 0x302a7786, - 0x3064ea48, - 0x30a24f06, - 0x30ecec88, - 0x3132d1c6, - 0x316e4444, - 0x202082, - 0x31b630c7, - 0x31eaeb84, - 0x3227dc47, - 0x327a1087, - 0x200382, - 0x32aa0685, - 0x32e03bc4, - 0x332d1807, - 0x3362adc7, - 0x33a87406, - 0x33e36085, - 0x3429b807, - 0x346d2688, - 0x34a37f07, - 0x34eb0689, - 0x3538e6c5, - 0x35719c07, - 0x35a92e46, - 0x35e62d48, - 0x2460cd, - 0x24cf09, - 0x2f484b, - 0x25534b, - 0x27de4b, - 0x2aa88b, - 0x30f20b, - 0x30f4cb, - 0x30fd49, - 0x310f0b, - 0x3111cb, - 0x311ccb, - 0x31284a, - 0x312d8a, - 0x31338c, - 0x31608b, - 0x3166ca, - 0x327eca, - 0x3328ce, - 0x333a4e, - 0x333dca, - 0x335d8a, - 0x3369cb, - 0x336c8b, - 0x337a4b, - 0x34c7cb, - 0x34cdca, - 0x34da8b, - 0x34dd4a, - 0x34dfca, - 0x34e24a, - 0x373ecb, - 0x37a2cb, - 0x37c38e, - 0x37c70b, - 0x383ecb, - 0x38500b, - 0x38984a, - 0x389ac9, - 0x389d0a, - 0x38b38a, - 0x39e50b, - 0x39fe8b, - 0x3a09ca, - 0x3a28cb, - 0x3a588b, - 0x3b44cb, - 0x36285b88, - 0x3668c289, - 0x36aa3a49, - 0x36ee0bc8, - 0x33c685, - 0x202943, - 0x212944, - 0x206885, - 0x247806, - 0x25b245, - 0x28adc4, - 0x21a1c8, - 0x30af85, - 0x297a44, - 0x209907, - 0x2a280a, - 0x361d8a, - 0x3101c7, - 0x211f47, + 0x27d8c5, + 0x3933c7, + 0x212982, + 0x209942, + 0x228a85, + 0x21e743, + 0x34b0c6, + 0x380dcd, + 0x38110c, + 0x201682, + 0x3b34cb, + 0x2714ca, + 0x20598a, + 0x2b6449, + 0x2ea64b, + 0x219a8d, + 0x2fa5cc, + 0x25180a, + 0x22090c, + 0x26908b, + 0x27250c, + 0x29474b, + 0x3154c3, + 0x36cfc6, + 0x3a98c2, + 0x2f4542, + 0x20a743, + 0x208602, + 0x21fe83, + 0x2366c6, + 0x259f87, + 0x2c7fc6, + 0x39e4c8, + 0x31e188, + 0x2ce146, + 0x201f82, + 0x2fd5cd, + 0x2fd90c, + 0x2d5fc7, + 0x301f07, + 0x213b82, + 0x201502, + 0x234a82, + 0x24d642, + 0x2099c2, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x211cc4, + 0x205503, + 0x200983, + 0x214843, + 0x205702, + 0x2021c2, + 0x2ae8fdc5, + 0x2b247e45, + 0x2b717806, + 0x16d208, + 0x2baaee05, + 0x2099c2, + 0x2006c2, + 0x2bfb3ac5, + 0x2c27bdc5, + 0x2c67c9c7, + 0x2ca86a09, + 0x2ce3bc44, + 0x20d882, + 0x205e82, + 0x2d24b5c5, + 0x2d68f849, + 0x2db1db88, + 0x2deab805, + 0x2e300187, + 0x2e61ed48, + 0x2eae5d85, + 0x2ee00106, + 0x2f337809, + 0x2f6b5a48, + 0x2fac0488, + 0x2fe9704a, + 0x302732c4, + 0x306d13c5, + 0x30abc9c8, + 0x30e03a85, + 0x20cec2, + 0x31248a43, + 0x316a1686, + 0x31b60148, + 0x31eb94c6, + 0x32281f08, + 0x32719606, + 0x32adef04, + 0x200c82, + 0x32f2cb87, + 0x332a75c4, + 0x336756c7, + 0x33ba2987, + 0x200442, + 0x33e9b0c5, + 0x34334f84, + 0x346cd907, + 0x34a5f187, + 0x34e80886, + 0x3527c585, + 0x356959c7, + 0x35ad0b48, + 0x35e2b447, + 0x363164c9, + 0x36793105, + 0x36b31dc7, + 0x36e8f546, + 0x37391408, + 0x2273cd, + 0x279909, + 0x28174b, + 0x2a4b0b, + 0x34058b, + 0x2ffe8b, + 0x30bc4b, + 0x30bf0b, + 0x30c809, + 0x30d6cb, + 0x30d98b, + 0x30e48b, + 0x30f5ca, + 0x30fb0a, + 0x31010c, + 0x314d8b, + 0x31670a, + 0x32904a, + 0x33404e, + 0x33568e, + 0x335a0a, + 0x33808a, + 0x338dcb, + 0x33908b, + 0x339e8b, + 0x354ecb, + 0x3554ca, + 0x35618b, + 0x35644a, + 0x3566ca, + 0x35694a, + 0x372b0b, + 0x37914b, + 0x37c74e, + 0x37cacb, + 0x38454b, + 0x385acb, + 0x38900a, + 0x389289, + 0x3894ca, + 0x38a94a, + 0x3a00cb, + 0x3a1a4b, + 0x3a22ca, + 0x3a48cb, + 0x3a8c4b, + 0x3b990b, + 0x3767e648, + 0x37a87c89, + 0x37e9de89, + 0x382dacc8, + 0x342505, + 0x217083, + 0x21c6c4, + 0x220005, + 0x23b986, + 0x25da05, + 0x2864c4, + 0x21f408, + 0x308005, + 0x291784, + 0x203447, + 0x29cf8a, + 0x3712ca, + 0x338547, + 0x3af9c7, + 0x2f8f07, + 0x264e87, + 0x2f60c5, + 0x33bb86, + 0x2bb847, + 0x2b4904, + 0x2e4646, + 0x2e4546, + 0x3b9585, + 0x26d1c4, + 0x3519c6, + 0x29bf47, + 0x285746, + 0x2e3247, + 0x25e443, + 0x2b1c06, + 0x2328c5, + 0x27cac7, + 0x2641ca, + 0x260e44, + 0x217c08, + 0x2abd89, + 0x2cd247, + 0x336286, + 0x24e9c8, + 0x2b9c09, + 0x309684, + 0x366944, + 0x244245, + 0x2bb548, + 0x2c4b07, + 0x2a9709, + 0x364688, + 0x345e86, + 0x3204c6, + 0x298048, + 0x359646, + 0x247e45, + 0x280946, + 0x275ec8, + 0x24da46, + 0x2525cb, + 0x298646, + 0x29994d, + 0x3a6005, + 0x2a7486, + 0x208b45, + 0x2f9bc9, + 0x2f9a87, + 0x37a208, + 0x266986, + 0x298bc9, + 0x3793c6, + 0x264145, + 0x268686, + 0x2cae46, + 0x2cb3c9, + 0x3530c6, + 0x339487, + 0x26ad85, + 0x202ac3, + 0x252745, + 0x299c07, + 0x33c6c6, + 0x3a5f09, + 0x317806, + 0x280b86, + 0x210c49, + 0x280349, + 0x29fc07, + 0x282f88, + 0x28c989, + 0x27d548, + 0x378386, + 0x2d5805, + 0x2418ca, + 0x280c06, + 0x3b7986, + 0x2c8985, + 0x265808, + 0x223307, + 0x22f50a, + 0x249e46, + 0x279d45, + 0x37aa46, + 0x21ac47, + 0x336147, + 0x21bbc5, + 0x264305, + 0x357dc6, + 0x2ac5c6, + 0x34dc06, + 0x2b3204, + 0x27f689, + 0x288b46, + 0x2dd38a, + 0x21b388, + 0x3078c8, + 0x3712ca, + 0x20b445, + 0x29be85, + 0x350b88, + 0x2b2c88, + 0x27b5c7, + 0x258946, + 0x322388, 0x2fdec7, - 0x255b47, - 0x2fad45, - 0x343d06, - 0x22cb47, - 0x26fec4, - 0x2e6b46, - 0x2e6a46, - 0x208305, - 0x3492c4, - 0x38ec86, - 0x2a1647, - 0x22d046, - 0x351b47, - 0x26a783, - 0x2b4846, - 0x232045, - 0x283f07, - 0x270e0a, - 0x26dfc4, - 0x218ec8, - 0x2affc9, - 0x2cb147, - 0x334646, - 0x255908, - 0x200a49, - 0x3b23c4, - 0x2210c4, - 0x278285, - 0x22c848, - 0x2c7f47, - 0x2a7109, - 0x2f9cc8, - 0x347a86, - 0x24c646, - 0x29de88, - 0x354c46, - 0x202e85, - 0x2874c6, - 0x27e108, - 0x254b86, - 0x25d14b, - 0x29dac6, - 0x29f50d, - 0x3b1785, - 0x2aea46, - 0x20f505, - 0x349909, - 0x2abe87, - 0x3195c8, - 0x292986, - 0x29e709, - 0x364546, - 0x270d85, - 0x2a4dc6, - 0x2c99c6, - 0x2cdb89, - 0x200846, - 0x253087, - 0x277885, - 0x202383, - 0x25d2c5, - 0x29f7c7, - 0x358e06, - 0x3b1689, - 0x3177c6, - 0x287706, - 0x215ec9, - 0x286ec9, - 0x2a5607, - 0x2cf688, - 0x377f89, - 0x284a88, - 0x379386, - 0x2d9dc5, - 0x23cb4a, - 0x287786, - 0x3a8506, - 0x2cbbc5, - 0x272188, - 0x215587, - 0x22e68a, - 0x251746, - 0x24d345, - 0x329cc6, - 0x2d6347, - 0x334507, - 0x2c4145, - 0x270f45, - 0x2b2f86, - 0x351746, - 0x387046, - 0x2b8bc4, - 0x286209, - 0x28d146, - 0x30e50a, - 0x222848, - 0x309148, - 0x361d8a, - 0x2145c5, - 0x2a1585, - 0x37f588, - 0x2b6348, - 0x21b507, - 0x293846, - 0x320d48, - 0x3674c7, - 0x285188, - 0x2b9206, - 0x2885c8, - 0x29ad46, - 0x227c87, - 0x272b06, - 0x38ec86, - 0x25d9ca, - 0x384706, - 0x2d9dc9, - 0x2b5446, - 0x2e3d8a, - 0x2e4449, - 0x362586, - 0x2ba844, - 0x237c4d, - 0x28c507, - 0x3268c6, - 0x2c4a05, - 0x3645c5, - 0x375846, - 0x2d1649, - 0x2b4287, - 0x27f886, - 0x2c9546, - 0x28ae49, - 0x264a04, - 0x2d4a44, - 0x3ac808, - 0x245c46, - 0x277308, - 0x2e66c8, - 0x202fc7, - 0x3a80c9, - 0x387247, - 0x2b500a, - 0x2498cf, - 0x250b0a, - 0x233c45, - 0x27e345, - 0x218745, - 0x303b07, - 0x20e183, - 0x2cf888, - 0x3028c6, - 0x3029c9, - 0x2d4006, - 0x3aeb47, - 0x29e4c9, - 0x3194c8, - 0x2cbc87, - 0x30d803, - 0x33c705, - 0x20e105, - 0x2b8a0b, - 0x351304, - 0x257984, - 0x27cbc6, - 0x30e887, - 0x38b10a, - 0x2757c7, - 0x38c807, - 0x283305, - 0x200045, - 0x240909, - 0x38ec86, - 0x27564d, - 0x35af05, - 0x29f4c3, - 0x20ad83, - 0x34f785, - 0x347845, - 0x255908, - 0x280047, - 0x2d47c6, - 0x2a36c6, - 0x2296c5, - 0x231e47, - 0x202ac7, - 0x33f1c7, - 0x2d660a, - 0x2b4908, - 0x2b8bc4, - 0x254907, - 0x281607, - 0x3400c6, - 0x26f8c7, - 0x2eaa08, - 0x2e9e88, - 0x2abd86, - 0x2d1ec8, - 0x2008c4, - 0x22cb46, - 0x247d86, - 0x216646, - 0x3a8c46, - 0x22d9c4, - 0x255c06, - 0x2c31c6, - 0x29d406, - 0x235ec6, - 0x20ac46, - 0x2ea846, - 0x2d46c8, - 0x3af1c8, - 0x2d6e48, - 0x25b448, - 0x37f506, - 0x212485, - 0x2e2006, - 0x2b2105, - 0x388c87, - 0x216605, - 0x2136c3, - 0x203ec5, - 0x33fb44, - 0x20ad85, - 0x2266c3, - 0x338007, - 0x34bc88, - 0x351c06, - 0x32250d, - 0x27e306, - 0x29c985, - 0x2d9743, - 0x2be689, - 0x264b86, - 0x23c0c6, - 0x2a4ec4, - 0x250a87, - 0x233006, - 0x2b4545, - 0x234a83, - 0x207ac4, - 0x2817c6, - 0x2ded04, - 0x32b8c8, - 0x39ba49, - 0x24d849, - 0x2a4cca, - 0x387acd, - 0x208d07, - 0x224bc6, - 0x20a684, - 0x28b309, - 0x28a088, - 0x28c106, - 0x23dfc6, - 0x26f8c7, - 0x2b9a46, - 0x21f706, - 0x3ac246, - 0x3a110a, - 0x219b08, - 0x2464c5, - 0x26fd09, - 0x28568a, - 0x2fa988, - 0x2a0ec8, - 0x29bd48, - 0x2af08c, - 0x316305, - 0x2a3948, - 0x2e8e06, - 0x319746, - 0x3aea07, - 0x2756c5, - 0x287645, - 0x24d709, - 0x213487, - 0x302985, - 0x227487, - 0x20ad83, - 0x2c8485, - 0x20b8c8, - 0x25d647, - 0x2a0d89, - 0x2de405, - 0x307784, - 0x2a6508, - 0x363207, - 0x2cbe48, - 0x368c48, - 0x2dc805, - 0x304286, - 0x278686, - 0x2ac1c9, - 0x31c407, - 0x2b29c6, - 0x3b3907, - 0x221d03, - 0x247ac4, - 0x2a7885, - 0x231f84, - 0x383c84, - 0x286947, - 0x35bdc7, - 0x27fa44, - 0x2a0bd0, - 0x367c87, - 0x200045, - 0x2536cc, - 0x225344, - 0x2b1588, - 0x227b89, - 0x2b4e06, - 0x220d88, - 0x247344, - 0x247348, - 0x22ec86, - 0x235d48, - 0x2a1c06, - 0x2d328b, - 0x202385, - 0x2cb988, - 0x216ac4, - 0x39be8a, - 0x2a0d89, - 0x381346, - 0x218808, - 0x25ebc5, - 0x2b69c4, - 0x2b1486, - 0x33f088, - 0x285b88, - 0x340bc6, - 0x31d104, - 0x23cac6, - 0x3872c7, - 0x27db47, - 0x26f8cf, - 0x205547, - 0x362647, - 0x38eb45, - 0x352245, - 0x2a52c9, + 0x27dc48, + 0x2b3846, + 0x281408, + 0x294f06, + 0x24ee87, + 0x299ec6, + 0x3519c6, + 0x3778ca, + 0x2bd8c6, + 0x2d5809, + 0x26dbc6, + 0x2af14a, + 0x2def09, + 0x2fb486, + 0x2b4b04, + 0x22b18d, + 0x287f07, + 0x326cc6, + 0x2c0345, + 0x379445, + 0x374246, + 0x2cd749, + 0x2b1647, + 0x277306, + 0x2cc246, + 0x286549, + 0x247d84, + 0x3482c4, + 0x352cc8, + 0x236a86, + 0x26a808, + 0x2e41c8, + 0x312747, + 0x3b7549, + 0x34de07, + 0x2aecca, + 0x2e1f8f, + 0x23188a, + 0x234245, + 0x276105, + 0x216e85, + 0x2ba787, + 0x21a803, + 0x283188, + 0x396786, + 0x396889, + 0x2b87c6, + 0x3b5207, + 0x298989, + 0x37a108, + 0x2c8a47, + 0x30a343, + 0x342585, + 0x21a785, + 0x2b304b, + 0x203b44, + 0x2c2084, + 0x274646, + 0x30abc7, + 0x382bca, + 0x248ac7, + 0x311e87, + 0x27bdc5, + 0x200645, + 0x2eef89, + 0x3519c6, + 0x24894d, + 0x353305, + 0x2b1383, + 0x205043, + 0x26f685, + 0x345c45, + 0x24e9c8, + 0x2790c7, + 0x348046, + 0x29db06, + 0x229105, + 0x2326c7, + 0x312247, + 0x239347, + 0x2d144a, + 0x2b1cc8, + 0x2b3204, + 0x24d7c7, + 0x27acc7, + 0x339306, + 0x262107, + 0x2dc4c8, + 0x2e6f08, + 0x268506, + 0x303008, + 0x2c87c4, + 0x2bb846, + 0x2353c6, + 0x33bfc6, + 0x2ba986, + 0x286004, + 0x264f46, + 0x2bf5c6, + 0x297546, + 0x247846, + 0x204f06, + 0x26e2c6, + 0x347f48, + 0x2b0748, + 0x2d1c88, + 0x25dc08, + 0x350b06, + 0x20dcc5, + 0x315ec6, + 0x2ab885, + 0x388447, + 0x215305, + 0x2125c3, + 0x211585, + 0x344cc4, + 0x205045, + 0x203b03, + 0x33a447, + 0x354648, + 0x2e3306, + 0x2c218d, + 0x2760c6, + 0x296ac5, + 0x2b7843, + 0x2bc389, + 0x247f06, + 0x28e7c6, + 0x29f4c4, + 0x231807, + 0x233606, + 0x2b1905, + 0x203cc3, + 0x3abd84, + 0x27ae86, + 0x2354c4, + 0x2da048, + 0x38ba89, + 0x215589, + 0x29f2ca, + 0x2a070d, + 0x313447, + 0x2b9186, + 0x206804, + 0x286a09, + 0x284688, + 0x287b06, + 0x33f286, + 0x262107, + 0x2b6b46, + 0x226346, + 0x26d606, + 0x3a2a0a, + 0x21ed48, + 0x2bacc5, + 0x262549, + 0x27e14a, + 0x2f5d08, + 0x29b908, + 0x295f08, + 0x2a7acc, + 0x30e705, + 0x29dd88, + 0x2e6586, + 0x37a386, + 0x3b50c7, + 0x2489c5, + 0x280ac5, + 0x215449, + 0x20e247, + 0x396845, + 0x227887, + 0x205043, + 0x2c5045, + 0x20ef48, + 0x252ac7, + 0x29b7c9, + 0x2d7985, + 0x2fa984, + 0x2a03c8, + 0x32ccc7, + 0x2c8c08, + 0x38d688, + 0x354b05, + 0x3a3946, + 0x278cc6, + 0x244609, + 0x2b01c7, + 0x2ac006, + 0x313787, + 0x210103, + 0x23bc44, + 0x2a1785, + 0x232804, + 0x3833c4, + 0x27fdc7, + 0x26c147, + 0x22e704, + 0x29b610, + 0x3b3c47, + 0x200645, + 0x24c20c, + 0x20a8c4, + 0x2c1488, + 0x24ed89, + 0x35acc6, + 0x334c48, + 0x215244, + 0x36c4c8, + 0x22fb06, + 0x2accc8, + 0x29c506, + 0x2bec0b, + 0x202ac5, + 0x2c8748, + 0x215ac4, + 0x38beca, + 0x29b7c9, + 0x245f06, + 0x216f48, + 0x256385, + 0x2b0f44, + 0x2c1386, + 0x239208, + 0x27e648, + 0x322c06, + 0x3a9ec4, + 0x241846, + 0x34de87, + 0x2755c7, + 0x26210f, + 0x207347, + 0x2fb547, + 0x3709c5, + 0x353e05, + 0x29f8c9, + 0x2dd046, + 0x27cc05, + 0x280647, + 0x2e0bc8, + 0x297645, + 0x299ec6, + 0x21b1c8, + 0x2b94ca, + 0x2db4c8, + 0x28ac87, + 0x2e23c6, + 0x262506, + 0x21a5c3, + 0x216a43, + 0x27e309, + 0x28c809, + 0x2c1286, + 0x2d7985, + 0x33bd48, + 0x216f48, + 0x3597c8, + 0x26d68b, + 0x2c23c7, + 0x30a589, + 0x262388, + 0x343084, + 0x3514c8, + 0x28cd89, + 0x2ac305, + 0x2ba687, + 0x23bcc5, + 0x27e548, + 0x28fc4b, + 0x295710, + 0x2a6dc5, + 0x215a0c, + 0x348205, + 0x27be43, + 0x2a8f86, + 0x2be6c4, + 0x335086, + 0x29bf47, + 0x21b244, + 0x240b88, + 0x28304d, + 0x302945, + 0x29b104, + 0x2243c4, + 0x276949, + 0x2a11c8, + 0x317687, + 0x22fb88, + 0x27f748, + 0x277605, + 0x209287, + 0x277587, + 0x33e347, + 0x264309, + 0x233489, + 0x214c46, + 0x2bd306, + 0x262346, + 0x37f785, + 0x3a7184, + 0x200006, + 0x200386, + 0x277648, + 0x21a90b, + 0x260d07, + 0x206804, + 0x353646, + 0x2fe447, + 0x26dec5, + 0x391d05, + 0x219644, + 0x233406, + 0x200088, + 0x286a09, + 0x2510c6, + 0x284048, + 0x2b19c6, + 0x345248, + 0x306dcc, + 0x2774c6, + 0x29678d, + 0x296c0b, + 0x339545, + 0x312387, + 0x3531c6, + 0x336008, + 0x214cc9, + 0x2d0588, + 0x200645, + 0x277987, + 0x27d648, + 0x349649, + 0x28e946, + 0x250fca, + 0x335d88, + 0x2d03cb, + 0x39818c, + 0x36c5c8, + 0x27a7c6, + 0x208c88, + 0x3b77c7, + 0x32cf49, + 0x28f74d, + 0x299dc6, + 0x27b808, + 0x2b0609, + 0x2bda48, + 0x281508, + 0x2bfe0c, + 0x2c0b47, + 0x2c1887, + 0x264145, + 0x2ad587, + 0x2e0a88, + 0x2c1406, + 0x2556cc, + 0x2ef888, + 0x2ccb88, + 0x25dec6, + 0x21a507, + 0x214e44, + 0x25dc08, + 0x22200c, + 0x2ce24c, + 0x2342c5, + 0x2d0d47, + 0x3a9e46, + 0x21a486, + 0x2f9d88, + 0x3af904, + 0x28574b, + 0x36cc0b, + 0x2e23c6, + 0x282ec7, + 0x37a805, + 0x269a05, + 0x285886, + 0x256345, + 0x203b05, + 0x2cc9c7, + 0x274c49, + 0x2ac784, + 0x2fbb45, + 0x2e4bc5, + 0x2d9dc8, + 0x329d05, + 0x2b72c9, + 0x2ae5c7, + 0x2ae5cb, + 0x381306, + 0x347c89, + 0x26d108, + 0x276545, + 0x33e448, + 0x2334c8, + 0x245747, + 0x3776c7, + 0x27fe49, + 0x2acc07, + 0x28a989, + 0x2aa70c, + 0x3163c8, + 0x2b2ac9, + 0x2b3d47, + 0x27f809, + 0x26c287, + 0x398288, + 0x3b7705, + 0x2bb7c6, + 0x2c0388, + 0x308a88, + 0x27e009, + 0x203b47, + 0x269ac5, + 0x222b09, + 0x2bd6c6, + 0x28f544, 0x30e1c6, - 0x284045, - 0x2871c7, - 0x2c1108, - 0x29d505, - 0x272b06, - 0x222688, - 0x224f0a, - 0x2e13c8, + 0x35ffc8, + 0x232ac7, + 0x21ab08, + 0x3030c9, + 0x3a3707, + 0x29d146, + 0x312444, + 0x211609, + 0x209108, + 0x25dd87, + 0x27eb46, + 0x21a846, + 0x3b7904, + 0x2241c6, + 0x204fc3, + 0x3b1649, + 0x202a86, + 0x303345, + 0x29db06, + 0x26cac5, + 0x27dac8, + 0x36c307, + 0x381646, + 0x3b3b06, + 0x3078c8, + 0x29fa47, + 0x299e05, + 0x29b408, + 0x3a1e48, + 0x335d88, + 0x3480c5, + 0x2bb846, + 0x215349, + 0x244484, + 0x26c94b, + 0x22604b, + 0x2babc9, + 0x205043, + 0x254485, + 0x2214c6, + 0x385208, + 0x2e1f04, + 0x2e3306, + 0x2d1589, + 0x2ca445, + 0x2cc906, + 0x32ccc6, + 0x216f44, + 0x2a764a, + 0x303288, + 0x308a86, + 0x3b8645, + 0x37a687, + 0x2e0fc7, + 0x3a3944, + 0x226287, + 0x2aecc4, + 0x33bf46, + 0x2096c3, + 0x264305, + 0x32ad45, + 0x207588, + 0x24d985, + 0x277209, + 0x25da47, + 0x25da4b, + 0x2a148c, + 0x2a224a, + 0x300187, + 0x203503, + 0x3afc08, + 0x348285, + 0x2976c5, + 0x205104, + 0x398186, + 0x24ed86, + 0x224207, + 0x33448b, + 0x286004, + 0x2e6684, + 0x21f044, + 0x2cafc6, + 0x21b244, + 0x2bb648, + 0x342445, + 0x21ba45, + 0x359707, + 0x312489, + 0x345c45, + 0x37424a, + 0x26ac89, + 0x2996ca, + 0x3a2b49, + 0x33fec4, + 0x2cc305, + 0x2b6c48, + 0x2cd9cb, + 0x244245, + 0x2f2fc6, + 0x213e84, + 0x277746, + 0x3a3589, + 0x353707, + 0x3179c8, + 0x2a0a86, + 0x34de07, + 0x27e648, + 0x3747c6, + 0x375604, + 0x365ac7, + 0x357305, + 0x367287, + 0x200104, + 0x353146, + 0x2f4308, + 0x296dc8, + 0x2e6047, + 0x274fc8, + 0x294fc5, + 0x204e84, + 0x3711c8, + 0x2750c4, + 0x216e05, + 0x2f5fc4, + 0x2fdfc7, + 0x288c07, + 0x27f948, + 0x2c8d86, + 0x24d905, + 0x277008, + 0x2db6c8, + 0x29f209, + 0x226346, + 0x22f588, + 0x38bd4a, + 0x26df48, + 0x2e5d85, + 0x20b306, + 0x26ab48, + 0x277a4a, + 0x210f87, + 0x284c45, + 0x292708, + 0x2ade04, + 0x265886, + 0x2c1c08, + 0x204f06, + 0x38e7c8, 0x28f187, - 0x249d06, - 0x26fcc6, - 0x20df43, - 0x218303, - 0x285849, - 0x377e09, - 0x2b0586, - 0x2de405, - 0x2163c8, - 0x218808, - 0x354dc8, - 0x3ac2cb, - 0x322747, - 0x30b249, - 0x26fb48, - 0x335844, - 0x349588, - 0x291409, - 0x2b2cc5, - 0x303a07, - 0x247b45, - 0x285a88, - 0x293e8b, - 0x29b550, - 0x2ae605, - 0x216a0c, - 0x2d4985, - 0x283383, - 0x29f386, - 0x2c0984, - 0x203cc6, - 0x2a1647, - 0x222704, - 0x24b388, - 0x2cf74d, - 0x35e245, - 0x208d44, - 0x233984, - 0x287bc9, - 0x2990c8, - 0x317647, - 0x22ed08, - 0x2862c8, - 0x27fb85, - 0x20f747, - 0x27fb07, - 0x238287, - 0x270f49, - 0x232e89, - 0x242d86, - 0x2bf606, - 0x26fb06, - 0x289845, - 0x39b744, - 0x3b0e86, - 0x3b5306, - 0x27fbc8, - 0x2d600b, - 0x26de87, - 0x20a684, - 0x364a46, - 0x367a47, - 0x34f0c5, - 0x263645, - 0x212dc4, - 0x232e06, - 0x3b0f08, - 0x28b309, - 0x252f86, - 0x289a48, - 0x2b4606, - 0x342708, - 0x34c34c, - 0x27fa46, - 0x29c64d, - 0x29cacb, - 0x253145, - 0x202c07, - 0x200946, - 0x3343c8, - 0x242e09, - 0x393c88, - 0x200045, - 0x2e2a87, - 0x284b88, - 0x358649, - 0x344106, - 0x252e8a, - 0x334148, - 0x393acb, - 0x3298cc, - 0x247448, - 0x280e46, - 0x303d08, - 0x3a8347, - 0x363489, - 0x29304d, - 0x29f986, - 0x21e608, - 0x3af089, - 0x2bfd08, - 0x2886c8, - 0x2c3a0c, - 0x2c5047, - 0x2c5507, - 0x270d85, - 0x31e5c7, - 0x2c0fc8, - 0x2b1506, - 0x2aaccc, - 0x2f55c8, - 0x2d0d88, - 0x2ba286, - 0x20de87, - 0x242f84, - 0x25b448, - 0x28f50c, - 0x353d0c, - 0x233cc5, - 0x2d2887, - 0x31d086, - 0x20de06, - 0x349ac8, - 0x2027c4, - 0x22d04b, - 0x27e8cb, - 0x249d06, - 0x2cf5c7, - 0x31a2c5, - 0x276545, - 0x22d186, - 0x25eb85, - 0x3512c5, - 0x2cd5c7, - 0x27d1c9, - 0x351904, - 0x34ee05, - 0x2e6fc5, - 0x2dea88, - 0x2287c5, - 0x2bca49, - 0x37aac7, - 0x37aacb, - 0x244806, - 0x2d4409, - 0x349208, - 0x27c385, - 0x238388, - 0x232ec8, - 0x23a6c7, - 0x2e2f87, - 0x2869c9, - 0x235c87, - 0x289149, - 0x2acf8c, - 0x2b0588, - 0x2b6189, - 0x321f87, - 0x286389, - 0x35bf07, - 0x3299c8, - 0x3a8285, - 0x22cac6, - 0x2c4a48, - 0x2f0fc8, - 0x285549, - 0x351307, - 0x276605, - 0x36b6c9, - 0x2b9ec6, - 0x2323c4, - 0x2323c6, - 0x24e8c8, - 0x252847, - 0x2d6208, - 0x2d1f89, - 0x3a1e07, - 0x2a29c6, - 0x202cc4, - 0x203f49, - 0x20f5c8, - 0x2ba147, - 0x343e06, - 0x20e1c6, - 0x3a8484, - 0x247f86, - 0x201b83, - 0x296789, - 0x202346, - 0x2d2205, - 0x2a36c6, - 0x24f305, - 0x285008, - 0x247187, - 0x244b46, - 0x39c6c6, - 0x309148, - 0x2a5447, - 0x29f9c5, - 0x2a09c8, - 0x3ada88, - 0x334148, - 0x2d4845, - 0x22cb46, - 0x24d609, - 0x2ac044, - 0x24f18b, - 0x21f40b, - 0x2463c9, - 0x20ad83, - 0x25bf05, - 0x213a86, - 0x313788, - 0x249844, - 0x351c06, - 0x2d6749, - 0x2bc545, - 0x2cd506, - 0x363206, - 0x2163c4, - 0x2aec0a, - 0x2d2148, - 0x2f0fc6, - 0x2c2585, - 0x3b1987, - 0x231147, - 0x304284, - 0x21f647, - 0x2165c4, - 0x2165c6, - 0x203c83, - 0x270f45, - 0x350e85, - 0x205788, - 0x254ac5, - 0x27f789, - 0x25b287, - 0x25b28b, - 0x2a758c, - 0x2a810a, - 0x3363c7, - 0x204083, - 0x212188, - 0x2d4a05, - 0x29d585, - 0x20ae44, - 0x3298c6, - 0x227b86, - 0x247fc7, - 0x2349cb, - 0x22d9c4, - 0x2e8f04, - 0x219e04, - 0x2cd786, - 0x222704, - 0x22c948, - 0x33c5c5, - 0x244d85, - 0x354d07, - 0x202d09, - 0x347845, - 0x37584a, - 0x277789, - 0x29810a, - 0x3a1249, - 0x335fc4, - 0x2c9605, - 0x2b9b48, - 0x2d18cb, - 0x278285, - 0x2f0086, - 0x2200c4, - 0x27fcc6, - 0x3a1c89, - 0x364b07, - 0x317988, - 0x387e46, - 0x387247, - 0x285b88, - 0x380946, - 0x37f0c4, - 0x363f87, - 0x366085, - 0x377547, - 0x25b4c4, - 0x2008c6, - 0x2f1e08, - 0x29cc88, - 0x2e88c7, - 0x27d548, - 0x29ae05, - 0x20abc4, - 0x361c88, - 0x27d644, - 0x2186c5, - 0x2fac44, - 0x3675c7, - 0x28d207, - 0x2864c8, - 0x2cbfc6, - 0x254a45, - 0x27f588, - 0x2e15c8, - 0x2a4c09, - 0x21f706, - 0x22e708, - 0x39bd0a, - 0x34f148, - 0x2e8605, - 0x2e2206, - 0x277648, - 0x2e2b4a, - 0x20b387, - 0x28a645, - 0x298888, - 0x2b3c44, - 0x272206, - 0x2c5888, - 0x20ac46, - 0x239a88, - 0x29bfc7, - 0x209806, - 0x2ba844, - 0x28ba07, - 0x2b6804, - 0x3a1c47, - 0x23bf0d, - 0x21b585, - 0x2d144b, - 0x2a1d06, - 0x255788, - 0x24b344, - 0x27bc86, - 0x2817c6, - 0x304047, - 0x29c30d, - 0x226dc7, - 0x2b6d48, - 0x271a05, - 0x27f048, - 0x2c7ec6, - 0x29ae88, - 0x223a06, - 0x26a9c7, - 0x336689, - 0x33d2c7, - 0x28c3c8, - 0x279685, - 0x21c848, - 0x20dd45, - 0x396005, - 0x3a14c5, - 0x221443, - 0x235984, - 0x26fd05, - 0x2346c9, - 0x285f86, - 0x2eab08, - 0x2e2d45, - 0x2b8847, - 0x2aee8a, - 0x2cd449, - 0x2c98ca, - 0x2d6ec8, - 0x2272cc, - 0x28724d, - 0x2ff683, - 0x239988, - 0x207a85, - 0x224cc6, - 0x319346, - 0x2e7f05, - 0x3b3a09, - 0x358f45, - 0x27f588, - 0x2841c6, - 0x348806, - 0x2a63c9, - 0x38f247, - 0x294146, - 0x2aee08, - 0x216548, - 0x2e0dc7, - 0x235ece, - 0x2c8105, - 0x358545, - 0x20ab48, - 0x27f3c7, - 0x20e202, - 0x2c3584, - 0x203bca, - 0x2ba208, - 0x367b46, - 0x29e608, - 0x278686, - 0x31a7c8, - 0x2b29c8, - 0x395fc4, - 0x2b8d85, - 0x68a8c4, - 0x68a8c4, - 0x68a8c4, - 0x202403, - 0x20e046, - 0x27fa46, - 0x2a220c, - 0x209843, - 0x285686, - 0x215344, - 0x264b08, - 0x2d6585, - 0x203cc6, - 0x2bedc8, - 0x2d8206, - 0x244ac6, - 0x381148, - 0x2a7907, - 0x235a49, - 0x2d4bca, + 0x203346, + 0x2b4b04, + 0x284fc7, + 0x2b0d84, + 0x3a3547, + 0x28e60d, + 0x27b645, + 0x2cd54b, + 0x29c606, + 0x24e848, + 0x240b44, + 0x350d06, + 0x27ae86, + 0x208fc7, + 0x29644d, + 0x243cc7, + 0x2b12c8, + 0x269b85, + 0x278648, + 0x2c4a86, + 0x295048, + 0x228086, + 0x33d987, + 0x300449, + 0x343ac7, + 0x287dc8, + 0x2706c5, + 0x21b608, + 0x21a3c5, + 0x3a4245, + 0x3a2dc5, + 0x234543, + 0x2809c4, + 0x262545, + 0x337809, + 0x27ea46, + 0x2dc5c8, + 0x377485, + 0x2b2e87, + 0x2a78ca, + 0x2cc849, + 0x2cad4a, + 0x2d1d08, + 0x2276cc, + 0x2806cd, + 0x2fc003, + 0x38e6c8, + 0x3abd45, + 0x2b9286, + 0x379f86, + 0x2e58c5, + 0x313889, + 0x33cc45, + 0x277008, + 0x2552c6, + 0x347806, + 0x2a0289, + 0x393947, + 0x28ff06, + 0x2a7848, + 0x33bec8, + 0x2daec7, + 0x2ace4e, + 0x2c4cc5, + 0x349545, + 0x204e08, + 0x21fcc7, + 0x21a882, + 0x2bf984, + 0x334f8a, + 0x25de48, + 0x2fe546, + 0x298ac8, + 0x278cc6, + 0x332608, + 0x2ac008, + 0x3a4204, + 0x2b33c5, + 0x676384, + 0x676384, + 0x676384, + 0x202b43, + 0x21a6c6, + 0x2774c6, + 0x29cb0c, + 0x203383, + 0x27e146, + 0x2151c4, + 0x247e88, + 0x2d13c5, + 0x335086, + 0x2bcac8, + 0x2d2bc6, + 0x3815c6, + 0x245d08, + 0x2a1807, + 0x2ac9c9, + 0x2f214a, + 0x22b484, + 0x215305, + 0x2a96c5, + 0x247c06, + 0x313486, + 0x29d546, + 0x2f5546, + 0x2acb04, + 0x2acb0b, + 0x231804, + 0x29ccc5, + 0x2aad85, + 0x312806, + 0x3a6308, + 0x280587, + 0x317784, + 0x236203, + 0x2ad905, + 0x306047, + 0x28048b, + 0x207487, + 0x2bc9c8, + 0x2e62c7, + 0x370b06, + 0x279bc8, + 0x2a820b, + 0x21ff46, + 0x212309, + 0x2a8385, + 0x30a343, + 0x2cc906, + 0x28f088, + 0x213403, + 0x24f403, + 0x27e646, + 0x278cc6, + 0x35d10a, + 0x27a805, + 0x27accb, + 0x29da4b, + 0x23ef83, + 0x202843, + 0x2aec44, + 0x278a87, + 0x28f104, + 0x244504, + 0x2e6404, + 0x26e248, + 0x3b8588, + 0x3baf89, + 0x393188, + 0x2b9dc7, + 0x247846, + 0x2dc20f, + 0x2c4e06, + 0x2d1344, + 0x3b83ca, + 0x305f47, + 0x3b9606, + 0x28f589, + 0x3baf05, + 0x2076c5, + 0x3bb046, + 0x21b743, + 0x2ade49, + 0x21eec6, + 0x3afa89, + 0x382bc6, + 0x264305, + 0x2346c5, + 0x207343, + 0x278bc8, + 0x20d787, + 0x396784, + 0x247d08, + 0x2e1244, + 0x2f1006, + 0x2a8f86, + 0x23c346, + 0x2c8609, + 0x297645, + 0x3519c6, + 0x2582c9, + 0x2c41c6, + 0x26e2c6, + 0x387886, + 0x2160c5, + 0x2f5fc6, + 0x33d984, + 0x3b7705, + 0x2c0384, + 0x2b2246, + 0x3532c4, + 0x203c43, + 0x284745, + 0x2331c8, + 0x25e607, + 0x2b8209, + 0x284b48, + 0x297e11, + 0x32cd4a, + 0x2e2307, + 0x2e7246, + 0x2151c4, + 0x2c0488, + 0x22e448, + 0x297fca, + 0x2b708d, + 0x268686, + 0x245e06, + 0x285086, + 0x21ba47, + 0x2b1385, + 0x3912c7, + 0x247dc5, + 0x2ae704, + 0x2a6206, + 0x224047, + 0x2adb4d, + 0x26aa87, + 0x21f308, + 0x277309, + 0x20b206, + 0x28e8c5, + 0x22cb04, + 0x3600c6, + 0x3a3846, + 0x25dfc6, + 0x299348, + 0x215f83, + 0x208fc3, + 0x352105, + 0x277dc6, + 0x2abfc5, + 0x2a0c88, + 0x29c10a, + 0x282084, + 0x247e88, + 0x295f08, + 0x312647, + 0x377549, + 0x2bc6c8, + 0x286a87, + 0x2587c6, + 0x204f0a, + 0x360148, + 0x2f98c9, + 0x2a1288, + 0x221609, + 0x2e7107, + 0x2f2f05, + 0x26d886, + 0x2c1288, + 0x27e7c8, + 0x296088, + 0x2e24c8, + 0x29ccc5, 0x208a84, - 0x216605, - 0x2a70c5, - 0x264886, - 0x208d46, - 0x2a2dc6, - 0x2f9ec6, - 0x235b84, - 0x235b8b, - 0x231144, - 0x2a23c5, - 0x2b19c5, - 0x203086, - 0x3b5548, - 0x287107, - 0x317744, - 0x2453c3, - 0x2b3745, - 0x30a847, - 0x28700b, - 0x205687, - 0x2becc8, - 0x2e8b47, - 0x231646, - 0x24d1c8, - 0x2e318b, - 0x2067c6, - 0x213bc9, - 0x2e3305, - 0x30d803, - 0x2cd506, - 0x29bec8, - 0x214cc3, - 0x200a03, - 0x285b86, - 0x278686, - 0x375dca, - 0x280e85, - 0x28160b, - 0x2a360b, - 0x245103, - 0x202043, - 0x2b4f84, - 0x278447, - 0x247444, - 0x202ec4, - 0x2e8c84, - 0x34f448, - 0x2c24c8, - 0x3b2049, - 0x38e748, - 0x200c07, - 0x235ec6, - 0x2ea74f, - 0x2c8246, - 0x2d6504, - 0x2c230a, - 0x30a747, - 0x208386, - 0x292e89, - 0x3b1fc5, - 0x2058c5, - 0x3b2106, - 0x21c983, - 0x2b3c89, - 0x219c86, - 0x212009, - 0x38b106, - 0x270f45, - 0x2340c5, - 0x205543, - 0x278588, - 0x211607, - 0x3028c4, - 0x264988, - 0x2313c4, - 0x338d86, - 0x29f386, - 0x2419c6, - 0x2cb849, - 0x29d505, - 0x38ec86, - 0x2a2fc9, - 0x2c7606, - 0x2ea846, - 0x386e86, - 0x200b45, - 0x2fac46, - 0x26a9c4, - 0x3a8285, - 0x2c4a44, - 0x2b7846, - 0x35aec4, - 0x20f843, - 0x28a145, - 0x232bc8, - 0x2e9687, - 0x2bd949, - 0x28a548, - 0x29dc51, - 0x36328a, - 0x249c47, - 0x2ea1c6, - 0x215344, - 0x2c4b48, - 0x282f48, - 0x29de0a, - 0x2bc80d, - 0x2a4dc6, - 0x381246, - 0x28bac6, - 0x2c3fc7, - 0x2b6e05, - 0x262c07, - 0x264a45, - 0x37ac04, - 0x2ad586, - 0x216287, - 0x2b398d, - 0x277587, - 0x21a0c8, - 0x27f889, - 0x2e2106, - 0x344085, - 0x226704, - 0x24e9c6, - 0x304186, - 0x2ba386, - 0x29ee88, - 0x2179c3, - 0x203043, - 0x3598c5, - 0x2300c6, - 0x2b2985, - 0x388048, - 0x2a180a, - 0x2cee04, - 0x264b08, - 0x29bd48, - 0x202ec7, - 0x2e2e09, - 0x2be9c8, - 0x28b387, - 0x2936c6, - 0x20ac4a, - 0x24ea48, - 0x396449, - 0x299188, - 0x21cec9, - 0x2ea087, - 0x2effc5, - 0x3ac4c6, - 0x2b1388, - 0x285d08, - 0x2a1048, - 0x249e08, - 0x2a23c5, - 0x20f444, - 0x211308, - 0x208484, - 0x3a1044, - 0x270f45, - 0x297a87, - 0x202ac9, - 0x303e47, - 0x215f45, - 0x27cdc6, - 0x34ebc6, - 0x203d44, - 0x2a6706, - 0x254884, - 0x27ef46, - 0x202886, - 0x214b06, - 0x200045, - 0x387f07, - 0x204083, - 0x206b49, - 0x308f48, - 0x264984, - 0x28b20d, - 0x29cd88, - 0x3053c8, - 0x3963c6, - 0x336789, - 0x2cd449, - 0x3a1985, - 0x2a190a, - 0x2adb4a, - 0x2af7cc, - 0x2af946, - 0x27d9c6, - 0x2c83c6, - 0x273209, - 0x224f06, - 0x262c46, - 0x359006, - 0x25b448, - 0x27d546, - 0x2d36cb, - 0x297c05, - 0x244d85, - 0x27dc45, - 0x366f46, - 0x20ac03, - 0x241946, - 0x277507, - 0x2c4a05, - 0x24c705, - 0x3645c5, - 0x327346, + 0x20d488, + 0x23e2c4, + 0x3a2944, + 0x264305, + 0x2917c7, + 0x312249, + 0x208dc7, + 0x210cc5, + 0x274846, + 0x34f606, + 0x212444, + 0x2a05c6, + 0x24d744, + 0x278546, + 0x312006, + 0x213246, + 0x200645, + 0x2a0b47, + 0x203503, + 0x2079c9, + 0x3076c8, + 0x247d04, + 0x28690d, + 0x296ec8, + 0x2e3788, + 0x2f9846, + 0x300549, + 0x2cc849, + 0x3a3285, + 0x29c20a, + 0x27cf4a, + 0x29d74c, + 0x29d8c6, + 0x275446, + 0x2c4f86, + 0x2b4749, + 0x2b94c6, + 0x29fa86, + 0x33cd06, + 0x25dc08, + 0x274fc6, + 0x2ce80b, + 0x291945, + 0x21ba45, + 0x2756c5, + 0x352a46, + 0x204ec3, + 0x23c2c6, + 0x26aa07, + 0x2c0345, + 0x320585, + 0x379445, + 0x318446, 0x31da84, 0x31da86, - 0x3add49, - 0x366dcc, - 0x37a948, - 0x33f004, - 0x2fa886, - 0x2a1e06, - 0x29bec8, - 0x218808, - 0x366cc9, - 0x3b1987, - 0x245989, - 0x254106, - 0x22c2c4, - 0x20bf04, - 0x286cc4, - 0x285b88, - 0x20290a, - 0x3477c6, - 0x352107, - 0x36f007, - 0x2d4505, - 0x2a7084, - 0x2913c6, - 0x2b6e46, - 0x202803, - 0x308d87, - 0x368b48, - 0x3a1aca, - 0x2ce348, - 0x2cec88, - 0x35af05, - 0x253245, - 0x26df85, - 0x2d48c6, - 0x33d4c6, - 0x35bd05, - 0x2969c9, - 0x2a6e8c, - 0x26e047, - 0x29de88, - 0x381a45, - 0x68a8c4, - 0x24df84, - 0x25d784, - 0x214486, - 0x2a450e, - 0x205947, - 0x2c41c5, - 0x2abfcc, - 0x231287, - 0x216207, - 0x218089, - 0x218f89, - 0x28a645, - 0x308f48, - 0x24d609, - 0x334005, - 0x2c4948, - 0x322906, - 0x361f06, - 0x2e4444, - 0x2ae848, - 0x251f43, - 0x303084, - 0x2b37c5, - 0x3ac0c7, - 0x210445, - 0x39bbc9, - 0x28aa8d, - 0x299886, - 0x245404, - 0x2937c8, - 0x27d00a, - 0x224107, - 0x23be45, - 0x203143, - 0x2a37ce, - 0x27868c, - 0x2faa87, - 0x2a46c7, - 0x203c03, - 0x224f45, - 0x25d785, - 0x29e9c8, - 0x29bb89, - 0x33ef06, - 0x247444, - 0x249b86, - 0x21e3cb, - 0x2cd1cc, - 0x221507, - 0x2d5c45, - 0x3ad988, - 0x2e0b85, - 0x2c2307, - 0x3630c7, - 0x251f45, - 0x20ac03, - 0x39a644, - 0x212905, - 0x351805, - 0x351806, - 0x34fd08, - 0x216287, - 0x319646, - 0x35c106, - 0x3a1406, - 0x2d5e89, - 0x20f847, - 0x26a5c6, - 0x2cd346, - 0x252006, - 0x2aeb45, - 0x219646, - 0x3768c5, - 0x228848, - 0x2973cb, - 0x291086, - 0x36f044, - 0x2e2909, - 0x25b284, - 0x322888, - 0x2324c7, - 0x2885c4, - 0x2be288, - 0x2c5304, - 0x2aeb84, - 0x28b145, - 0x35e286, - 0x34f387, - 0x239b43, - 0x2a2a85, - 0x322e84, - 0x358586, - 0x3a1a08, - 0x368885, - 0x297089, - 0x3363c5, - 0x2e1e88, - 0x215207, - 0x388dc8, - 0x2bd787, - 0x362709, - 0x255a86, - 0x32b3c6, - 0x359004, - 0x293605, - 0x30150c, - 0x27dc47, - 0x27e207, - 0x36eec8, - 0x299886, - 0x277444, - 0x32e344, - 0x286849, - 0x2c84c6, - 0x240987, - 0x3a8bc4, - 0x286086, - 0x343905, - 0x2cbb07, - 0x2d3646, - 0x252d49, - 0x2aab07, - 0x26f8c7, - 0x2a6246, - 0x3879c5, - 0x283988, - 0x219b08, - 0x2646c6, - 0x3688c5, - 0x261b06, - 0x209983, - 0x29e849, - 0x2a2b4e, - 0x2bd488, - 0x2314c8, - 0x2644cb, - 0x2972c6, - 0x2089c4, - 0x244ac4, - 0x2a2c4a, - 0x216907, - 0x26a685, - 0x213bc9, - 0x2c3285, - 0x3a1087, - 0x2b4c04, - 0x284487, - 0x2e65c8, - 0x2cb206, - 0x21e789, - 0x2beaca, - 0x216886, - 0x29c8c6, - 0x2b1945, - 0x37ccc5, - 0x31a107, - 0x24dd08, - 0x343848, - 0x395fc6, - 0x234145, - 0x208ace, - 0x2b8bc4, - 0x264645, - 0x27c749, - 0x30dfc8, - 0x28f0c6, - 0x2a04cc, - 0x2a1410, - 0x2a414f, - 0x2a51c8, - 0x3363c7, - 0x200045, - 0x26fd05, - 0x34f209, - 0x298a89, - 0x23cbc6, - 0x278307, - 0x2d2805, - 0x21b509, - 0x340146, - 0x224d4d, - 0x286b89, - 0x202ec4, - 0x2bd208, - 0x2113c9, - 0x347986, - 0x27cec5, - 0x32b3c6, - 0x317849, - 0x26ba08, - 0x212485, - 0x2ae844, - 0x2a068b, - 0x347845, - 0x2a07c6, - 0x287586, - 0x26ed86, - 0x287fcb, - 0x297189, - 0x35c045, - 0x388b87, - 0x363206, - 0x220f06, - 0x25d508, - 0x35e389, - 0x219e8c, - 0x30a648, - 0x360406, - 0x340bc3, - 0x303c06, - 0x287e05, - 0x281948, - 0x233b46, - 0x2cbd48, - 0x275845, - 0x29dfc5, - 0x215348, - 0x31a947, - 0x319287, - 0x247fc7, - 0x220d88, - 0x336508, - 0x31e4c6, - 0x2b7687, - 0x247987, - 0x287cca, - 0x254003, - 0x366f46, - 0x202a45, - 0x203bc4, - 0x27f889, - 0x362684, - 0x2a7e44, - 0x2a1c84, - 0x2a46cb, - 0x211547, - 0x208d05, - 0x29ab08, - 0x27cdc6, - 0x27cdc8, - 0x280dc6, - 0x2900c5, - 0x290385, - 0x291f46, - 0x292b08, - 0x292dc8, - 0x27fa46, - 0x29a94f, - 0x29e310, - 0x3b1785, - 0x204083, - 0x22c385, - 0x30b188, - 0x298989, - 0x334148, - 0x2d5d08, - 0x224788, - 0x211607, - 0x27ca89, - 0x2cbf48, - 0x25bd44, - 0x2a1b08, - 0x2deb49, - 0x2b81c7, - 0x29f904, - 0x303f08, - 0x387cca, - 0x2ebe06, - 0x2a4dc6, - 0x21f5c9, - 0x2a1647, - 0x2ce1c8, - 0x30cc88, - 0x3a8a48, - 0x356245, - 0x37dc45, - 0x244d85, - 0x25d745, - 0x37e287, - 0x20ac05, - 0x2c4a05, - 0x2b5546, - 0x334087, - 0x2d1807, - 0x387fc6, - 0x2d7405, - 0x2a07c6, - 0x212245, - 0x2b84c8, - 0x2f1d84, - 0x2c7686, - 0x343744, - 0x2b69c8, - 0x2c778a, - 0x28004c, - 0x234bc5, - 0x2c4086, - 0x21a046, - 0x368706, - 0x30b384, - 0x343bc5, - 0x280c07, - 0x2a16c9, - 0x2cdc87, - 0x68a8c4, - 0x68a8c4, - 0x3175c5, - 0x32dd04, - 0x29fe8a, - 0x27cc46, - 0x24d404, - 0x208305, - 0x37a545, - 0x2b6d44, - 0x2871c7, - 0x36b847, - 0x2cd788, - 0x368ec8, - 0x212489, - 0x340248, - 0x2a004b, - 0x250b44, - 0x221005, - 0x2840c5, - 0x247f49, - 0x35e389, - 0x2e2808, - 0x232248, - 0x203084, - 0x2a1e45, - 0x202943, - 0x264845, - 0x38ed06, - 0x29b9cc, - 0x20f4c6, - 0x247246, - 0x28f345, - 0x3273c8, - 0x2bd606, - 0x2ea346, - 0x2a4dc6, - 0x2297cc, - 0x2ba544, - 0x3a154a, - 0x28f288, - 0x29b807, - 0x322d86, - 0x33efc7, - 0x2f2185, - 0x343e06, - 0x34af86, - 0x356707, - 0x2be7c4, - 0x3676c5, - 0x27c744, - 0x37ac87, - 0x27c988, - 0x27d84a, - 0x284a07, - 0x2d22c7, - 0x336347, - 0x2e0cc9, - 0x29b9ca, - 0x219e43, - 0x2e9645, - 0x200c83, - 0x2e8cc9, - 0x26ac48, - 0x38eb47, - 0x334249, - 0x219c06, - 0x2d4108, - 0x337f85, - 0x2e16ca, - 0x2d8c49, - 0x2abc49, - 0x3aea07, - 0x283049, - 0x214a08, - 0x3568c6, - 0x2c4248, - 0x217b07, - 0x235c87, - 0x277787, - 0x2d2688, - 0x2fa706, - 0x387a85, - 0x280c07, - 0x29c3c8, - 0x3436c4, - 0x30e3c4, - 0x294047, - 0x2b2d47, - 0x24d48a, - 0x356846, - 0x330f0a, - 0x2c34c7, - 0x2b8987, - 0x257e44, - 0x289204, - 0x2d3546, - 0x3b3d44, - 0x3b3d4c, - 0x203505, - 0x218649, - 0x2dfc44, - 0x2b6e05, - 0x27cf88, - 0x292e85, - 0x375846, - 0x217f84, - 0x3ae3ca, - 0x32b7c6, - 0x2a68ca, - 0x237f07, - 0x2d3385, - 0x21c985, - 0x2d454a, - 0x2a6805, - 0x2a4cc6, - 0x208484, - 0x2b5106, - 0x31a1c5, - 0x233c06, - 0x2e88cc, - 0x2cd90a, - 0x2936c4, - 0x235ec6, - 0x2a1647, - 0x2d5204, - 0x25b448, - 0x38e5c6, - 0x208949, - 0x2bb109, - 0x2b0689, - 0x24f346, - 0x217c06, - 0x2c4387, - 0x296908, - 0x217a09, - 0x211547, - 0x29ac86, - 0x3872c7, - 0x28b985, - 0x2b8bc4, - 0x2c3f47, - 0x247b45, - 0x28b085, - 0x235247, - 0x251e08, + 0x292f49, + 0x3528cc, + 0x2ae448, + 0x239184, + 0x2f5c06, + 0x29c706, + 0x28f088, + 0x216f48, + 0x3527c9, + 0x37a687, + 0x2367c9, + 0x24cfc6, + 0x22e904, + 0x20ea44, + 0x280144, + 0x27e648, + 0x31208a, + 0x345bc6, + 0x353cc7, + 0x362c47, + 0x347d85, + 0x2a9684, + 0x28cd46, + 0x2b13c6, + 0x2336c3, + 0x307507, + 0x38d588, + 0x3a33ca, + 0x2cbb88, + 0x281f08, + 0x353305, + 0x339645, + 0x260e05, + 0x348146, 0x3ad906, - 0x29d24d, - 0x29ebcf, - 0x2a360d, - 0x215f84, - 0x232cc6, - 0x2d91c8, - 0x358fc5, - 0x287e88, - 0x23a58a, - 0x202ec4, - 0x21e946, - 0x239607, - 0x22d9c7, - 0x2a79c9, - 0x2c4205, - 0x2b6d44, - 0x2b8cca, - 0x2be589, - 0x283147, - 0x272086, - 0x347986, - 0x2a1d86, - 0x364046, - 0x2d890f, - 0x2d9089, - 0x27d546, - 0x282e46, - 0x32fd89, - 0x2b7787, - 0x226743, - 0x229946, - 0x218303, - 0x2e7dc8, - 0x387107, - 0x2a53c9, - 0x29f208, - 0x3193c8, - 0x351446, - 0x20f409, - 0x23c1c5, - 0x2b7844, - 0x2a73c7, - 0x273285, - 0x215f84, - 0x208dc8, - 0x216bc4, - 0x2b74c7, - 0x34bc06, - 0x2b3045, - 0x299188, - 0x34784b, - 0x319c07, - 0x2d47c6, - 0x2c82c4, - 0x32d146, - 0x270f45, - 0x247b45, - 0x283709, - 0x286dc9, - 0x235cc4, - 0x235d05, - 0x235f05, - 0x2e1546, - 0x309048, - 0x2c2c46, - 0x36898b, - 0x2b4c8a, - 0x2b6905, - 0x290406, - 0x3025c5, - 0x2e0a45, - 0x2ab6c7, - 0x3ac808, - 0x245984, - 0x26c586, - 0x292e46, - 0x214bc7, - 0x30d7c4, - 0x2817c6, - 0x2b9f85, - 0x2b9f89, - 0x2135c4, - 0x2a7209, - 0x27fa46, - 0x2c5108, - 0x235f05, - 0x36f105, - 0x233c06, - 0x219d89, - 0x218f89, - 0x2472c6, - 0x30e0c8, - 0x28abc8, - 0x302584, - 0x2b9004, - 0x2b9008, - 0x3269c8, - 0x245a89, - 0x38ec86, - 0x2a4dc6, - 0x320c0d, - 0x351c06, - 0x34c209, - 0x23d1c5, - 0x3b2106, - 0x262d48, - 0x31d9c5, - 0x2479c4, - 0x270f45, - 0x2866c8, - 0x29fc49, - 0x27c804, - 0x2008c6, - 0x39660a, - 0x2fa988, - 0x24d609, - 0x244c4a, - 0x3341c6, - 0x29ed88, - 0x2c20c5, - 0x2c0e48, - 0x2bd885, - 0x219ac9, - 0x36bd09, - 0x203602, - 0x2e3305, - 0x276286, - 0x27f987, - 0x295705, - 0x2f0ec6, - 0x306288, - 0x299886, - 0x2b9a09, - 0x27e306, - 0x25d388, - 0x2afb85, - 0x25c586, - 0x26aac8, - 0x285b88, - 0x2e9f88, - 0x347b08, - 0x219644, - 0x209fc3, - 0x2b9c44, - 0x249b06, - 0x28b9c4, - 0x231407, - 0x2ea249, - 0x2c7a05, - 0x30cc86, - 0x229946, - 0x34fb4b, - 0x2b6846, - 0x20edc6, - 0x2cb6c8, - 0x24c646, - 0x2bcb03, - 0x2080c3, - 0x2b8bc4, - 0x22e605, - 0x2b4447, - 0x27c988, - 0x27c98f, - 0x280b0b, - 0x308e48, - 0x200946, - 0x30914e, - 0x233c03, - 0x2b43c4, - 0x2b67c5, - 0x2b6bc6, - 0x2914cb, - 0x297b46, - 0x222709, - 0x2b3045, - 0x38a208, - 0x211d88, - 0x218e4c, - 0x2a4706, - 0x264886, - 0x2de405, - 0x28c188, - 0x26aac5, - 0x335848, - 0x2a084a, - 0x2a3a49, - 0x68a8c4, - 0x3760d1c2, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x368883, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x2964c4, - 0x204ac3, - 0x200383, - 0x210e03, - 0x24ae04, - 0x2d0783, - 0x23a184, - 0x231b83, - 0x2da904, - 0x332ec3, + 0x26c085, + 0x3b1889, + 0x2a948c, + 0x260ec7, + 0x298048, + 0x2e5c05, + 0x676384, + 0x320944, + 0x252c04, + 0x22df86, + 0x29eb0e, + 0x207747, + 0x21bc45, + 0x24440c, + 0x2e1107, + 0x223fc7, + 0x225109, + 0x217cc9, + 0x284c45, + 0x3076c8, + 0x215349, + 0x335c45, + 0x2c0288, + 0x2c2586, + 0x371446, + 0x2def04, + 0x2553c8, + 0x20b3c3, + 0x2af8c4, + 0x2ad985, + 0x3bab07, + 0x21c245, + 0x38bc09, + 0x28b30d, + 0x2a33c6, + 0x225fc4, + 0x2588c8, + 0x274a8a, + 0x2611c7, + 0x235d45, + 0x23b403, + 0x29dc0e, + 0x278ccc, + 0x2f5e07, + 0x29ecc7, + 0x200143, + 0x2b9505, + 0x252c05, + 0x298e88, + 0x295d49, + 0x239086, + 0x28f104, + 0x2e2246, + 0x27b5cb, + 0x2cc5cc, + 0x366d87, + 0x2d0305, + 0x3a1d48, + 0x2dac85, + 0x3b83c7, + 0x32cb87, + 0x247585, + 0x204ec3, + 0x26e584, + 0x21c685, + 0x2ac685, + 0x2ac686, + 0x292008, + 0x224047, + 0x37a286, + 0x26c486, + 0x3a2d06, + 0x268789, + 0x209387, + 0x25e286, + 0x2cc746, + 0x2731c6, + 0x2a7585, + 0x3b2b46, + 0x380145, + 0x329d88, + 0x29114b, + 0x28c346, + 0x362c84, + 0x2b4389, + 0x25da44, + 0x2c2508, + 0x30e2c7, + 0x281404, + 0x2bbd88, + 0x2c1684, + 0x2a75c4, + 0x286845, + 0x302986, + 0x26e187, + 0x203043, + 0x29d205, + 0x323284, + 0x349586, + 0x3a3308, + 0x38d2c5, + 0x290e09, + 0x222d05, + 0x2dbf88, + 0x215087, + 0x388588, + 0x2b8047, + 0x2fb609, + 0x264dc6, + 0x32bb46, + 0x28cac4, + 0x258705, + 0x2fce4c, + 0x2756c7, + 0x275fc7, + 0x362b08, + 0x2a33c6, + 0x26a944, + 0x328004, + 0x27fcc9, + 0x2c5086, + 0x298a07, + 0x208c04, + 0x23da46, + 0x33b785, + 0x2c88c7, + 0x2ce786, + 0x250e89, + 0x27cd87, + 0x262107, + 0x2a0106, + 0x23d985, + 0x27c548, + 0x21ed48, + 0x247a46, + 0x38d305, + 0x390586, + 0x2034c3, + 0x298d09, + 0x29d2ce, + 0x2b7d48, + 0x2e1348, + 0x24784b, + 0x291046, + 0x313104, + 0x2802c4, + 0x29d3ca, + 0x215907, + 0x25e345, + 0x212309, + 0x2bf685, + 0x3a2987, + 0x245c84, + 0x287087, + 0x2e40c8, + 0x2cd306, + 0x27b989, + 0x2bc7ca, + 0x215886, + 0x296a06, + 0x2aad05, + 0x37d085, + 0x282d07, + 0x244e48, + 0x33b6c8, + 0x3a4206, + 0x234745, + 0x31320e, + 0x2b3204, + 0x2479c5, + 0x2741c9, + 0x2dce48, + 0x28abc6, + 0x29af0c, + 0x29bd10, + 0x29e74f, + 0x29f7c8, + 0x300187, + 0x200645, + 0x262545, + 0x26e009, + 0x292909, + 0x241946, + 0x2442c7, + 0x2d0cc5, + 0x337b09, + 0x339386, + 0x2b930d, + 0x280009, + 0x244504, + 0x2b7ac8, + 0x20d549, + 0x345d86, + 0x274945, + 0x32bb46, + 0x317889, + 0x2f3c48, + 0x20dcc5, + 0x2553c4, + 0x29b0cb, + 0x345c45, + 0x29b206, + 0x280a06, + 0x265e46, + 0x276d4b, + 0x290f09, + 0x26c3c5, + 0x388347, + 0x32ccc6, + 0x334dc6, + 0x252988, + 0x302a89, + 0x21f0cc, + 0x305e48, + 0x309e46, + 0x322c03, + 0x2ba886, + 0x276b85, + 0x27b008, + 0x234146, + 0x2c8b08, + 0x248b45, + 0x279305, + 0x32eb08, + 0x332787, + 0x379ec7, + 0x224207, + 0x334c48, + 0x3002c8, + 0x2ad486, + 0x2b2087, + 0x23bb07, + 0x276a4a, + 0x201e03, + 0x352a46, + 0x2392c5, + 0x334f84, + 0x277309, + 0x2fb584, + 0x25e684, + 0x29c584, + 0x29eccb, + 0x20d6c7, + 0x313445, + 0x294cc8, + 0x274846, + 0x274848, + 0x27a746, + 0x28b085, + 0x28b645, + 0x28d886, + 0x28ee48, + 0x28f4c8, + 0x2774c6, + 0x294b0f, + 0x2987d0, + 0x3a6005, + 0x203503, + 0x22e9c5, + 0x30a4c8, + 0x292809, + 0x335d88, + 0x268608, + 0x2b8d48, + 0x20d787, + 0x274509, + 0x2c8d08, + 0x265304, + 0x29c408, + 0x2d9e89, + 0x2b27c7, + 0x299d44, + 0x208e88, + 0x2a090a, + 0x2e77c6, + 0x268686, + 0x226209, + 0x29bf47, + 0x2cba08, + 0x204848, + 0x2ddd88, + 0x35cc45, + 0x37e005, + 0x21ba45, + 0x252bc5, + 0x3b5987, + 0x204ec5, + 0x2c0345, + 0x313686, + 0x335cc7, + 0x2cd907, + 0x2a0c06, + 0x2d2245, + 0x29b206, + 0x27ba85, + 0x2b58c8, + 0x2f4284, + 0x2c4246, + 0x33b5c4, + 0x2b0f48, + 0x2c434a, + 0x2790cc, + 0x334685, + 0x21bb06, + 0x21f286, + 0x351fc6, + 0x309ec4, + 0x33ba45, + 0x27a587, + 0x29bfc9, + 0x2cb4c7, + 0x676384, + 0x676384, + 0x317605, + 0x37b944, + 0x29a8ca, + 0x2746c6, + 0x279e04, + 0x3b9585, + 0x37e405, + 0x2b12c4, + 0x280647, + 0x222c87, + 0x2cafc8, + 0x33de88, + 0x20dcc9, + 0x29cd88, + 0x29aa8b, + 0x2318c4, + 0x366885, + 0x27cc85, + 0x224189, + 0x302a89, + 0x2b4288, + 0x30e048, + 0x2d6604, + 0x29c745, + 0x217083, + 0x247bc5, + 0x351a46, + 0x295b8c, + 0x208b06, + 0x36c3c6, + 0x28ae45, + 0x3184c8, + 0x2b7ec6, + 0x2e73c6, + 0x268686, + 0x22920c, + 0x25e184, + 0x3a2e4a, + 0x28ad88, 0x2959c7, - 0x20fbc3, - 0x20abc3, - 0x2842c8, - 0x200383, - 0x2b400b, - 0x2f2a03, - 0x2716c6, - 0x205bc2, - 0x26b44b, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x200383, - 0x200e03, - 0x203383, - 0x204cc2, - 0x15f048, - 0x325b45, - 0x247bc8, - 0x2ec408, - 0x20d1c2, - 0x329dc5, - 0x39c307, - 0x2001c2, - 0x24b587, - 0x208a42, - 0x246f87, - 0x239ec9, - 0x2c1c88, - 0x3a88c9, - 0x338b02, - 0x270647, - 0x2abac4, - 0x39c3c7, - 0x2b4b87, - 0x24ca02, - 0x20fbc3, - 0x20b602, - 0x202082, - 0x200382, - 0x217902, - 0x200e02, - 0x20c4c2, - 0x2af685, - 0x24dec5, - 0xd1c2, - 0x31b83, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x117c3, - 0x701, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x2964c4, - 0x204303, - 0x204ac3, - 0x200383, - 0x21bd03, - 0x3a40d686, - 0x5e303, - 0x854c5, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x8082, - 0x15f048, - 0x4dcc4, - 0xe0f85, - 0x204cc2, - 0x2cfa44, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x236d03, - 0x2b0405, - 0x204303, - 0x205d83, - 0x204ac3, - 0x2104c3, - 0x200383, - 0x213e83, - 0x24ae83, - 0x24abc3, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x20d1c2, - 0x200383, - 0x15f048, - 0x332ec3, - 0x15f048, - 0x26ae03, - 0x2d0783, - 0x22ef04, - 0x231b83, - 0x332ec3, - 0x20a3c2, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20a3c2, - 0x22d603, - 0x204ac3, - 0x200383, - 0x2ec383, - 0x213e83, - 0x204cc2, - 0x20d1c2, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x2716c5, - 0x1540c6, - 0x24ae04, - 0x205bc2, - 0x15f048, - 0x204cc2, - 0x1d508, - 0x20d1c2, - 0x97606, - 0x1681c4, - 0x16e1cb, - 0x3dc06, - 0xfcc7, - 0x231b83, - 0x332ec3, - 0x15ae05, - 0x19c804, - 0x221543, - 0x53fc7, - 0xdc304, - 0x204ac3, - 0x94fc4, - 0x200383, - 0x2f39c4, - 0xfe588, - 0x125886, - 0x114f85, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x20abc3, - 0x200383, - 0x2f2a03, - 0x205bc2, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204143, - 0x213184, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x2da904, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x2716c6, - 0x231b83, - 0x332ec3, - 0x178ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0xfcc7, - 0x15f048, - 0x332ec3, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x40ed0783, - 0x231b83, - 0x204ac3, - 0x200383, - 0x15f048, - 0x204cc2, - 0x20d1c2, - 0x2d0783, - 0x332ec3, - 0x204ac3, - 0x200382, - 0x200383, - 0x316e47, - 0x23860b, - 0x2396c3, - 0x24be08, - 0x296687, - 0x225246, - 0x2c6145, - 0x373549, - 0x20f948, - 0x260d09, - 0x260d10, - 0x35d28b, - 0x385989, - 0x209303, - 0x2b5649, - 0x230806, - 0x23080c, - 0x260f08, - 0x3ae848, - 0x35d7c9, - 0x2a5d0e, - 0x20780b, - 0x2eb20c, - 0x205283, - 0x26cc4c, - 0x205289, - 0x257a87, - 0x231acc, - 0x36aa8a, - 0x24fe44, - 0x393f4d, - 0x26cb08, - 0x210e0d, - 0x272746, - 0x29258b, - 0x31a3c9, - 0x23d087, - 0x339606, - 0x349d89, - 0x38ce8a, - 0x37a0c8, - 0x2f24c4, - 0x34ecc7, - 0x3ac5c7, - 0x3a8dc4, - 0x32d984, - 0x237209, - 0x2ceac9, - 0x237908, - 0x210b85, - 0x392545, - 0x20aa06, - 0x393e09, - 0x23a80d, - 0x2eac88, - 0x20a907, - 0x2c61c8, - 0x382986, - 0x37ed04, - 0x359b85, - 0x202246, - 0x203204, - 0x205187, - 0x206d8a, + 0x323186, + 0x239147, + 0x2ec145, + 0x27eb46, + 0x34d406, + 0x35b847, + 0x25e6c4, + 0x2fe0c5, + 0x2741c4, + 0x2ae787, + 0x274408, + 0x2752ca, + 0x27d4c7, + 0x303407, + 0x300107, + 0x2dadc9, + 0x295b8a, + 0x21f083, + 0x25e5c5, + 0x213283, + 0x2e6449, + 0x33dc08, + 0x3709c7, + 0x335e89, + 0x21ee46, + 0x2b88c8, + 0x33a3c5, + 0x2db7ca, + 0x2d3549, + 0x2683c9, + 0x3b50c7, + 0x22e549, + 0x213148, + 0x35ba06, + 0x21bcc8, + 0x2160c7, + 0x2acc07, + 0x26ac87, + 0x2d0b48, + 0x2f5a86, + 0x2a06c5, + 0x27a587, + 0x296508, + 0x33b544, + 0x2dd244, + 0x28fe07, + 0x2ac387, + 0x2151ca, + 0x35b986, + 0x38c74a, + 0x2bf8c7, + 0x2b2fc7, + 0x246004, + 0x28aa44, + 0x2ce686, + 0x202d04, + 0x202d0c, + 0x3aff05, + 0x216d89, + 0x2d4f04, + 0x2b1385, + 0x274a08, + 0x279fc5, + 0x374246, + 0x223ec4, + 0x293c4a, + 0x2b00c6, + 0x29ba8a, + 0x22b447, + 0x21ac45, + 0x21b745, + 0x347dca, + 0x28efc5, + 0x26dfc6, + 0x23e2c4, + 0x2aedc6, + 0x282dc5, + 0x234206, + 0x2e604c, + 0x2cb14a, + 0x2587c4, + 0x247846, + 0x29bf47, + 0x2cf984, + 0x25dc08, + 0x393006, + 0x313089, + 0x2c7549, + 0x3164c9, + 0x26cb06, + 0x2161c6, + 0x21be07, + 0x3b17c8, + 0x215fc9, + 0x20d6c7, + 0x294e46, + 0x34de87, + 0x284f45, + 0x2b3204, + 0x21b9c7, + 0x23bcc5, + 0x286785, + 0x226987, + 0x247448, + 0x3a1cc6, + 0x29738d, + 0x29908f, + 0x29da4d, + 0x210d04, + 0x2332c6, + 0x2d3c08, + 0x33ccc5, + 0x276c08, + 0x24560a, + 0x244504, + 0x27bb46, + 0x26f3c7, + 0x286007, + 0x2a18c9, + 0x21bc85, + 0x2b12c4, + 0x2b330a, + 0x2bc289, + 0x22e647, + 0x265706, + 0x345d86, + 0x29c686, + 0x365b86, + 0x2d320f, + 0x2d3ac9, + 0x274fc6, + 0x22e346, + 0x31a809, + 0x2b2187, + 0x217443, + 0x229386, + 0x216a43, + 0x2e5788, + 0x34dcc7, + 0x29f9c9, + 0x2a8e08, + 0x37a008, + 0x203c86, + 0x208a49, + 0x242785, + 0x2b2244, + 0x2a99c7, + 0x2b47c5, + 0x210d04, + 0x313508, + 0x215bc4, + 0x2b1ec7, + 0x3545c6, + 0x357e85, + 0x2a1288, + 0x345c4b, + 0x331dc7, + 0x348046, + 0x2c4e84, + 0x319586, + 0x264305, + 0x23bcc5, + 0x27c2c9, + 0x280249, + 0x2acc44, + 0x2acc85, + 0x247885, + 0x2db646, + 0x3077c8, + 0x2bf046, + 0x38d3cb, + 0x35ab4a, + 0x2b0e85, + 0x28b6c6, + 0x396485, + 0x2cf485, + 0x2a54c7, + 0x352cc8, + 0x2367c4, + 0x25f806, + 0x28f546, + 0x213307, + 0x30a304, + 0x27ae86, + 0x237cc5, + 0x237cc9, + 0x2163c4, + 0x2a9809, + 0x2774c6, + 0x2c0c08, + 0x247885, + 0x362d45, + 0x234206, + 0x21efc9, + 0x217cc9, + 0x36c446, + 0x2dcf48, + 0x244508, + 0x396444, + 0x2b3644, + 0x2b3648, + 0x326dc8, + 0x2368c9, + 0x3519c6, + 0x268686, + 0x32224d, + 0x2e3306, + 0x306c89, + 0x315fc5, + 0x3bb046, + 0x391408, + 0x31d9c5, + 0x23bb44, + 0x264305, + 0x27fb48, + 0x29a689, + 0x274284, + 0x353146, + 0x279e8a, + 0x2f5d08, + 0x215349, + 0x38174a, + 0x335e06, + 0x299248, + 0x3b8185, + 0x2e0908, + 0x2b8145, + 0x21ed09, + 0x36a349, + 0x20d8c2, + 0x2a8385, + 0x269746, + 0x277407, + 0x3b05c5, + 0x308986, + 0x301448, + 0x2a33c6, + 0x2b6b09, + 0x2760c6, + 0x252808, + 0x2a89c5, + 0x23ebc6, + 0x33da88, + 0x27e648, + 0x2e7008, + 0x345f08, + 0x3b2b44, + 0x22a183, + 0x2b6d44, + 0x27d6c6, + 0x284f84, + 0x2e1287, + 0x2e72c9, + 0x2c45c5, + 0x204846, + 0x229386, + 0x291e4b, + 0x2b0dc6, + 0x3b8cc6, + 0x2c8488, + 0x3204c6, + 0x21aa43, + 0x3af743, + 0x2b3204, + 0x22f485, + 0x2b1807, + 0x274408, + 0x27440f, + 0x27a48b, + 0x3075c8, + 0x3531c6, + 0x3078ce, + 0x2319c3, + 0x2b1784, + 0x2b0d45, + 0x2b1146, + 0x28ce4b, + 0x291886, + 0x21b249, + 0x357e85, + 0x3899c8, + 0x20c688, + 0x217b8c, + 0x29ed06, + 0x247c06, + 0x2d7985, + 0x287b88, + 0x2790c5, + 0x343088, + 0x29b28a, + 0x29de89, + 0x676384, + 0x38a099c2, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x38d2c3, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x3b1384, + 0x205503, + 0x200983, + 0x20cf83, + 0x25ef44, + 0x2a84c3, + 0x235ac4, + 0x232403, + 0x2d5f04, + 0x2e9dc3, + 0x3b0887, + 0x209703, + 0x204e83, + 0x28b148, + 0x200983, + 0x2ae1cb, + 0x2ec883, + 0x264a86, + 0x20b0c2, + 0x22d54b, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x200983, + 0x26be43, + 0x204783, + 0x205702, + 0x16d208, + 0x325f45, + 0x23bd48, + 0x2df7c8, + 0x2099c2, + 0x37ab45, + 0x38c347, + 0x2007c2, + 0x240d87, + 0x20d882, + 0x248707, + 0x32c589, + 0x3b7d48, + 0x2ddc09, + 0x23e202, + 0x263647, + 0x36c1c4, + 0x38c407, + 0x35aa47, + 0x2bbbc2, + 0x209703, + 0x20e602, + 0x200c82, + 0x200442, + 0x2013c2, + 0x205ec2, + 0x209842, + 0x2a80c5, + 0x320885, + 0x99c2, + 0x32403, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x12083, + 0x1ec1, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x3b1384, + 0x244183, + 0x205503, + 0x200983, + 0x219503, + 0x3b819d06, + 0x13f443, + 0x7df85, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x4a82, + 0x16d208, + 0x44e04, + 0xdb085, + 0x205702, + 0x26f544, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x2358c3, + 0x2a9305, + 0x244183, + 0x206343, + 0x205503, + 0x21c2c3, + 0x200983, + 0x214843, + 0x2387c3, + 0x25ed03, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2099c2, + 0x200983, + 0x16d208, + 0x2e9dc3, + 0x16d208, + 0x200c03, + 0x2a84c3, + 0x22fd84, + 0x232403, + 0x2e9dc3, + 0x202bc2, + 0x209703, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x202bc2, + 0x227f83, + 0x205503, + 0x200983, + 0x2e87c3, + 0x214843, + 0x205702, + 0x2099c2, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x264a85, + 0xe4886, + 0x25ef44, + 0x20b0c2, + 0x16d208, + 0x205702, + 0x1d848, + 0x1b4183, + 0x2099c2, + 0x3fc91386, + 0x1320c4, + 0xd95cb, + 0x13eec6, + 0x9807, + 0x232403, + 0x47208, + 0x2e9dc3, + 0xb9b45, + 0x13fb84, + 0x260f83, + 0x4ce87, + 0xd78c4, + 0x205503, + 0x7f1c4, + 0x200983, + 0x2ed844, + 0xd9388, + 0x125c86, + 0x82b48, + 0x6cf05, + 0x1fa49, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x204e83, + 0x200983, + 0x2ec883, + 0x20b0c2, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x24a5c3, 0x211cc4, - 0x2167c6, - 0x2182c9, - 0x2182cf, - 0x2197cd, - 0x21a486, - 0x21d110, - 0x21d506, - 0x21dc47, - 0x21ebc7, - 0x21ebcf, - 0x21f889, - 0x2242c6, - 0x226487, - 0x226488, - 0x227649, - 0x2b3108, - 0x2e7907, - 0x20a203, - 0x378c86, - 0x3abf08, - 0x2a5fca, - 0x21fe49, - 0x20fa83, - 0x39c206, - 0x26c3ca, - 0x2fca47, - 0x2578ca, - 0x26a24e, - 0x21f9c6, - 0x2e3507, - 0x227086, - 0x201806, - 0x37da4b, - 0x30c58a, - 0x317ecd, - 0x217cc7, - 0x359188, - 0x359189, - 0x35918f, - 0x20e28c, - 0x281bc9, - 0x2e928e, - 0x295aca, - 0x3035c6, - 0x2fbbc6, - 0x3b06cc, - 0x3106cc, - 0x311448, - 0x33d1c7, - 0x25b7c5, - 0x2251c4, - 0x2438ce, - 0x38d104, - 0x257bc7, - 0x26d08a, - 0x36e914, - 0x373a4f, - 0x21ed88, - 0x378b48, - 0x357e8d, - 0x357e8e, - 0x3823c9, - 0x3a5b08, - 0x3a5b0f, - 0x2317cc, - 0x2317cf, - 0x232a07, - 0x23acca, - 0x21cc4b, - 0x23bcc8, - 0x23e5c7, - 0x264f4d, - 0x3151c6, - 0x394106, - 0x2417c9, - 0x259888, - 0x24c108, - 0x24c10e, - 0x238707, - 0x226985, - 0x24da85, - 0x205e04, - 0x225506, - 0x237808, - 0x260183, - 0x2efb8e, - 0x265308, - 0x2f198b, - 0x26afc7, - 0x395e05, - 0x26cdc6, - 0x2b0e07, - 0x307048, - 0x319f09, - 0x298fc5, - 0x28a188, - 0x217306, - 0x3a02ca, - 0x2437c9, - 0x231b89, - 0x231b8b, - 0x201148, - 0x3a8c89, - 0x210c46, - 0x22c54a, - 0x2b7f4a, - 0x23aecc, - 0x3acb87, - 0x2c1a8a, - 0x328ecb, - 0x328ed9, - 0x30fa48, - 0x271745, - 0x265106, - 0x258fc9, - 0x261cc6, - 0x21324a, - 0x20fb46, - 0x201e44, - 0x2c9ecd, - 0x201e47, - 0x20b549, - 0x383305, - 0x24e548, - 0x24ee89, - 0x24f0c4, - 0x24fd47, - 0x24fd48, - 0x250287, - 0x26ea08, - 0x2545c7, - 0x35c2c5, - 0x25c70c, - 0x25cf49, - 0x2c4dca, - 0x38f0c9, - 0x2b5749, - 0x2739cc, - 0x263e0b, - 0x2640c8, - 0x265688, - 0x268a44, - 0x288288, - 0x289389, - 0x36ab47, - 0x218506, - 0x317287, - 0x21e1c9, - 0x328b0b, - 0x32cfc7, - 0x200407, - 0x238047, - 0x210d84, - 0x210d85, - 0x2ac905, - 0x33c00b, - 0x399404, - 0x369d08, - 0x26f08a, - 0x2173c7, - 0x341dc7, - 0x290c12, - 0x27ee46, - 0x22e886, - 0x35898e, - 0x281346, - 0x298708, - 0x29938f, - 0x2111c8, - 0x38bb08, - 0x3af64a, - 0x3af651, - 0x2a6b4e, - 0x254e4a, - 0x254e4c, - 0x2014c7, - 0x3a5d10, - 0x3b5388, - 0x2a6d45, - 0x2b114a, - 0x20324c, - 0x29afcd, - 0x2fce06, - 0x2fce07, - 0x2fce0c, - 0x305c8c, - 0x32814c, - 0x28f98b, - 0x289b84, - 0x21f744, - 0x374149, - 0x2fe3c7, - 0x23e389, - 0x2b7d89, - 0x35a587, - 0x36a906, - 0x36a909, - 0x39d403, - 0x2129ca, - 0x32f807, - 0x238acb, - 0x317d4a, - 0x2abb44, - 0x39c546, - 0x284c89, - 0x3b3bc4, - 0x2035ca, - 0x2d4ac5, - 0x2c0005, - 0x2c000d, - 0x2c034e, - 0x378205, - 0x323506, - 0x2712c7, - 0x38684a, - 0x38d406, - 0x35ecc4, - 0x2f8987, - 0x2da18b, - 0x382a47, - 0x282ac4, - 0x24f706, - 0x24f70d, - 0x21de8c, - 0x204986, - 0x2eae8a, - 0x235806, - 0x2f3248, - 0x28bf47, - 0x33f88a, - 0x23d986, - 0x217bc3, - 0x262ec6, - 0x3abd88, - 0x2a024a, - 0x2766c7, - 0x2766c8, - 0x27dd84, - 0x2cc0c7, - 0x23ccc8, - 0x29e008, - 0x288b48, - 0x33110a, - 0x2e0405, - 0x2e0687, - 0x254c93, - 0x2d0806, - 0x26f288, - 0x222c09, - 0x24b448, - 0x3514cb, - 0x2cddc8, - 0x273704, - 0x215446, - 0x3b4f06, - 0x35e0c9, - 0x2c72c7, - 0x25c808, - 0x29e186, - 0x235144, - 0x2ce085, - 0x2c8a08, - 0x2c900a, - 0x2c9b48, - 0x2ce746, - 0x29ef8a, - 0x351988, - 0x2d5008, - 0x2d6a88, - 0x2d70c6, - 0x2d93c6, - 0x20168c, - 0x2d99d0, - 0x28de45, - 0x210fc8, - 0x306790, - 0x210fd0, - 0x260b8e, - 0x20130e, - 0x201314, - 0x31abcf, - 0x31af86, - 0x3319d1, - 0x339793, - 0x339c08, - 0x3aafc5, - 0x35b6c8, - 0x385785, - 0x22854c, - 0x229489, - 0x282449, - 0x245d47, - 0x377009, - 0x243d87, - 0x2fadc6, - 0x359987, - 0x261245, - 0x211803, - 0x260349, - 0x222ec9, - 0x378ac3, - 0x39a544, - 0x35c40d, - 0x3b1b0f, - 0x235185, - 0x35b5c6, - 0x211b07, - 0x325987, - 0x28cd86, - 0x28cd8b, - 0x2a82c5, - 0x25f106, - 0x2fba47, - 0x276ec9, - 0x2290c6, - 0x22e405, - 0x31190b, - 0x23bb46, - 0x3724c5, - 0x28b548, - 0x321d88, - 0x2d75cc, - 0x2d75d0, - 0x2e0149, - 0x2e7107, - 0x30860b, - 0x2e6186, - 0x2e77ca, - 0x2ea4cb, - 0x2eb74a, - 0x2eb9c6, - 0x2ec245, - 0x32f546, - 0x27e4c8, - 0x245e0a, - 0x357b1c, - 0x2f2acc, - 0x2f2dc8, - 0x2716c5, - 0x2f4f07, - 0x26a106, - 0x27d385, - 0x21c2c6, - 0x28cf48, - 0x2be807, - 0x2a5c08, - 0x2e360a, - 0x34a10c, - 0x34a389, - 0x37ee87, - 0x20d244, - 0x24db46, - 0x38b68a, - 0x2b7e85, - 0x20734c, - 0x20b088, - 0x377648, - 0x20d98c, - 0x21be8c, - 0x2206c9, - 0x220907, - 0x342c0c, - 0x3aa644, - 0x23c54a, - 0x2580cc, - 0x278acb, - 0x24140b, - 0x241f46, - 0x383847, - 0x2ddb07, - 0x3a5f4f, - 0x2fda11, - 0x2ddb12, - 0x30d0cd, - 0x30d0ce, - 0x30d40e, - 0x31ad88, - 0x31ad92, - 0x252288, - 0x2962c7, - 0x25260a, - 0x204748, - 0x281305, - 0x37e0ca, - 0x21da47, - 0x305304, - 0x21b083, - 0x2b0fc5, - 0x3af8c7, - 0x2fea07, - 0x29b1ce, - 0x30ff4d, - 0x313c49, - 0x220c45, - 0x33aa03, - 0x25fac6, - 0x36ffc5, - 0x2f1bc8, - 0x30c009, - 0x265145, - 0x26514f, - 0x2ec087, - 0x373485, - 0x21b2ca, - 0x299b86, - 0x2f33c9, - 0x384d0c, - 0x2f99c9, - 0x207b06, - 0x26ee8c, - 0x340cc6, - 0x2fc548, - 0x2fc746, - 0x30fbc6, - 0x349344, - 0x264443, - 0x2b270a, - 0x35b211, - 0x281d8a, - 0x255d05, - 0x277947, - 0x259307, - 0x23cdc4, - 0x23cdcb, - 0x3a8748, - 0x2bd306, - 0x36ef45, - 0x3a05c4, - 0x291949, - 0x330304, - 0x25cd87, - 0x332705, - 0x332707, - 0x358bc5, - 0x2af743, - 0x296188, - 0x34398a, - 0x239b43, - 0x325b8a, - 0x3b4086, - 0x264ecf, - 0x353689, - 0x2efb10, - 0x2dee88, - 0x2d0e89, - 0x29d087, - 0x24f68f, - 0x334604, - 0x2da984, - 0x21d386, - 0x2b3546, - 0x256dca, - 0x383586, - 0x32a787, - 0x3055c8, - 0x3057c7, - 0x306047, - 0x307a4a, - 0x309b4b, - 0x3a2445, - 0x2dd748, - 0x2166c3, - 0x3b120c, - 0x37140f, - 0x25b5cd, - 0x2c4607, - 0x313d89, - 0x217687, - 0x23e148, - 0x36eb0c, - 0x273608, - 0x258908, - 0x3188ce, - 0x32bad4, - 0x32bfe4, - 0x3424ca, - 0x35ea8b, - 0x243e44, - 0x243e49, - 0x21e9c8, - 0x24e105, - 0x25fc8a, - 0x239d87, - 0x2957c4, - 0x368883, - 0x2d0783, - 0x23a184, - 0x231b83, - 0x332ec3, - 0x2964c4, - 0x204303, - 0x20fbc3, - 0x201686, - 0x213184, - 0x204ac3, - 0x200383, - 0x21aa03, - 0x204cc2, - 0x368883, - 0x20d1c2, - 0x2d0783, - 0x23a184, - 0x231b83, - 0x332ec3, - 0x204303, - 0x201686, - 0x204ac3, - 0x200383, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x2135c3, - 0x204ac3, - 0x200383, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x213184, - 0x204ac3, - 0x200383, - 0x204cc2, - 0x21fd43, - 0x20d1c2, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x20e542, - 0x20d882, - 0x20d1c2, - 0x2d0783, - 0x209c02, - 0x201d42, - 0x2964c4, - 0x222044, - 0x223342, - 0x213184, - 0x200382, - 0x200383, - 0x21aa03, - 0x241f46, - 0x217082, - 0x2016c2, - 0x201a82, - 0x436111c3, - 0x43a014c3, - 0x59a86, - 0x59a86, - 0x24ae04, - 0x143768a, - 0x2608c, - 0x21ecc, - 0x852cd, - 0x2ac47, - 0x1a608, - 0x218c8, - 0x19834a, - 0x446db445, - 0x12b089, - 0x103008, - 0x8ed4a, - 0x14a60e, - 0x144b24b, - 0x1681c4, - 0x1672c8, - 0x13edc7, - 0x16f07, - 0x11dd09, - 0x1b3c47, - 0x94b88, - 0x61f49, - 0x4bfc5, - 0x12494e, - 0xafbcd, - 0xfb48, - 0x44a37046, - 0x45437048, - 0x79c88, - 0x117050, - 0x69c87, - 0x6cf47, - 0x71187, - 0x75f87, - 0xa9c2, - 0x62507, - 0x10c74c, - 0x3b9c7, - 0xa9f46, - 0xaa689, - 0xad708, - 0x18d82, - 0x1d42, - 0x24a0b, - 0x2ccc9, - 0x4c809, - 0x17de88, - 0xb5e02, - 0x104389, - 0xd2fca, - 0xdb9c9, - 0xdd048, - 0xddfc7, - 0xe0389, - 0xe4685, - 0xe4a90, - 0x1a8e86, - 0x63c85, - 0x4a84d, - 0x1b3806, - 0xee547, - 0xf39d8, - 0x96b88, - 0xba9ca, - 0x53b4d, - 0x1702, - 0x177ac6, - 0x91788, - 0x1ae208, - 0x15ef09, - 0x56608, - 0x5dece, - 0xd68d, - 0xf8805, - 0x62288, - 0x59688, - 0x6902, - 0x125886, - 0x6c82, - 0x3c1, - 0x8b4c3, - 0x44ef4244, - 0x4529a283, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2d5f04, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x264a86, + 0x232403, + 0x2e9dc3, + 0x176e43, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x9807, + 0x16d208, + 0x2e9dc3, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x426a84c3, + 0x232403, + 0x205503, + 0x200983, + 0x16d208, + 0x205702, + 0x2099c2, + 0x2a84c3, + 0x2e9dc3, + 0x205503, + 0x200442, + 0x200983, + 0x316e87, + 0x33e6cb, + 0x22d703, + 0x241608, + 0x3b1547, + 0x20a7c6, + 0x2c2c45, + 0x372349, + 0x209488, + 0x360d49, + 0x38f790, + 0x360d4b, + 0x39e189, + 0x201b03, + 0x20fb89, + 0x230f06, + 0x230f0c, + 0x326008, + 0x3b4f08, + 0x34af09, + 0x2905ce, + 0x2dd9cb, + 0x2f364c, + 0x2030c3, + 0x263d0c, + 0x207089, + 0x2fee47, + 0x23234c, + 0x3a89ca, + 0x2030c4, + 0x2d084d, + 0x263bc8, + 0x20cf8d, + 0x273846, + 0x28decb, + 0x283349, + 0x3b8b87, + 0x32fd06, + 0x330f89, + 0x351b8a, + 0x30b148, + 0x2ec484, + 0x2fba07, + 0x34f707, + 0x2bab04, + 0x37b5c4, + 0x22a749, + 0x281d49, + 0x22ae48, + 0x210785, + 0x3b4005, + 0x20db86, + 0x2d0709, + 0x24588d, + 0x2f30c8, + 0x20da87, + 0x2c2cc8, + 0x2e1886, + 0x38b6c4, + 0x3523c5, + 0x202986, + 0x204b04, + 0x206f87, + 0x20b8ca, + 0x212244, + 0x2157c6, + 0x216a09, + 0x216a0f, + 0x21788d, + 0x2184c6, + 0x21d450, + 0x21d846, + 0x21df87, + 0x21e4c7, + 0x21e4cf, + 0x21f6c9, + 0x224c46, + 0x225347, + 0x225348, + 0x225809, + 0x246088, + 0x2e52c7, + 0x20cc83, + 0x372986, + 0x3ba948, + 0x29088a, + 0x213c09, + 0x2095c3, + 0x38c246, + 0x25f64a, + 0x29e587, + 0x2fec8a, + 0x313d4e, + 0x21f806, + 0x2a8587, + 0x20e006, + 0x207146, + 0x37de0b, + 0x20414a, + 0x317f0d, + 0x216287, + 0x33ce88, + 0x33ce89, + 0x33ce8f, + 0x2b838c, + 0x27b289, + 0x2e6a0e, + 0x3b098a, + 0x2ba246, + 0x2f4586, + 0x30b58c, + 0x30ce8c, + 0x30dc08, + 0x3439c7, + 0x2b8c45, + 0x351e04, + 0x33c90e, + 0x228d04, + 0x351747, + 0x26030a, + 0x362554, + 0x36dd8f, + 0x21e688, + 0x372848, + 0x35040d, + 0x35040e, + 0x376ec9, + 0x3a8ec8, + 0x3a8ecf, + 0x23204c, + 0x23204f, + 0x233007, + 0x236dca, + 0x2435cb, + 0x238508, + 0x239cc7, + 0x3690cd, + 0x250406, + 0x2d0a06, + 0x23c149, + 0x394648, + 0x242088, + 0x24208e, + 0x2b5007, + 0x243885, + 0x244bc5, + 0x2063c4, + 0x20aa86, + 0x22ad48, + 0x202203, + 0x2ca10e, + 0x369488, + 0x2a2fcb, + 0x200dc7, + 0x3a4045, + 0x22e206, + 0x2aa0c7, + 0x333d08, + 0x26cd09, + 0x292e45, + 0x284788, + 0x212c06, + 0x38ad4a, + 0x33c809, + 0x232409, + 0x23240b, + 0x38dc48, + 0x2ba9c9, + 0x210846, + 0x22eb8a, + 0x2dc80a, + 0x236fcc, + 0x3a6687, + 0x32c38a, + 0x26ea8b, + 0x26ea99, + 0x3b6a88, + 0x264b05, + 0x2c6086, + 0x211e49, + 0x390746, + 0x28550a, + 0x209686, + 0x202644, + 0x2c620d, + 0x202647, + 0x211149, + 0x246385, + 0x2464c8, + 0x246fc9, + 0x247784, + 0x248387, + 0x248388, + 0x248c87, + 0x261908, + 0x24d487, + 0x26c645, + 0x25488c, + 0x2550c9, + 0x2bc00a, + 0x3937c9, + 0x20fc89, + 0x275a0c, + 0x25774b, + 0x257ec8, + 0x259048, + 0x25c404, + 0x2810c8, + 0x283c89, + 0x3a8a87, + 0x216c46, + 0x2835c7, + 0x2dcac9, + 0x26e6cb, + 0x319407, + 0x200a07, + 0x22b587, + 0x20cf04, + 0x20cf05, + 0x29a545, + 0x341c0b, + 0x39c644, + 0x3b2988, + 0x26614a, + 0x212cc7, + 0x2f6707, + 0x28bed2, + 0x278446, + 0x22f706, + 0x33c24e, + 0x27aa06, + 0x292588, + 0x29374f, + 0x20d348, + 0x37f308, + 0x30eaca, + 0x30ead1, + 0x2a0e8e, + 0x24dd0a, + 0x24dd0c, + 0x21e307, + 0x3a90d0, + 0x200408, + 0x2a1085, + 0x2aa4ca, + 0x204b4c, + 0x29518d, + 0x2f7e46, + 0x2f7e47, + 0x2f7e4c, + 0x300e4c, + 0x3292cc, + 0x2873cb, + 0x284184, + 0x226384, + 0x346d89, + 0x3050c7, + 0x225e49, + 0x37e909, + 0x39f1c7, + 0x3a8846, + 0x3a8849, + 0x2ad1c3, + 0x21c74a, + 0x31a287, + 0x33eb8b, + 0x317d8a, + 0x248844, + 0x22ba46, + 0x27d749, + 0x202b84, + 0x3affca, + 0x348345, + 0x2bdd45, + 0x2bdd4d, + 0x2be08e, + 0x28cc05, + 0x323906, + 0x264687, + 0x3870ca, + 0x39b686, + 0x3616c4, + 0x36d747, + 0x2c3f0b, + 0x2e1947, + 0x33fa84, + 0x24bb86, + 0x24bb8d, + 0x21e1cc, + 0x2053c6, + 0x2f32ca, + 0x2e03c6, + 0x2ed0c8, + 0x377c47, + 0x23568a, + 0x23d6c6, + 0x216183, + 0x391586, + 0x3ba7c8, + 0x29ac8a, + 0x275807, + 0x275808, + 0x281684, + 0x24b687, + 0x279348, + 0x2bd748, + 0x27c0c8, + 0x38c94a, + 0x2da905, + 0x2cf0c7, + 0x24db53, + 0x31e806, + 0x266348, + 0x221a09, + 0x240c48, + 0x203d0b, + 0x2cb608, + 0x2a5f44, + 0x32ec06, + 0x30bac6, + 0x3027c9, + 0x2c3dc7, + 0x254988, + 0x28af06, + 0x226884, + 0x2cb8c5, + 0x2c55c8, + 0x2c5bca, + 0x2c5e88, + 0x2cbf86, + 0x29944a, + 0x2ac808, + 0x2cf788, + 0x2d18c8, + 0x2d1f06, + 0x2d3e06, + 0x38e18c, + 0x2d43d0, + 0x27d2c5, + 0x20d148, + 0x301950, + 0x20d150, + 0x38f60e, + 0x38de0e, + 0x38de14, + 0x32fe8f, + 0x330246, + 0x332d51, + 0x33d213, + 0x33d688, + 0x3b3445, + 0x241b48, + 0x386245, + 0x329a8c, + 0x291549, + 0x228b49, + 0x3201c7, + 0x236b89, + 0x380887, + 0x2f6146, + 0x3521c7, + 0x269c45, + 0x2120c3, + 0x2023c9, + 0x221cc9, + 0x376e43, + 0x27f384, + 0x32a20d, + 0x206bcf, + 0x2268c5, + 0x329986, + 0x211407, + 0x325d87, + 0x288786, + 0x28878b, + 0x2a2405, + 0x256786, + 0x2f6c07, + 0x24e489, + 0x3a7486, + 0x21d305, + 0x22854b, + 0x235946, + 0x249245, + 0x357988, + 0x306a88, + 0x2c8f0c, + 0x2c8f10, + 0x2d2409, + 0x2ffd07, + 0x32840b, + 0x2e3b86, + 0x2e518a, + 0x2e754b, + 0x2e794a, + 0x2e7bc6, + 0x2e8685, + 0x319fc6, + 0x36c808, + 0x32028a, + 0x35009c, + 0x2ec94c, + 0x2ecc48, + 0x264a85, + 0x34ea07, + 0x26bec6, + 0x274e05, + 0x21afc6, + 0x288948, + 0x2bc507, + 0x2904c8, + 0x2a868a, + 0x33130c, + 0x331589, + 0x38b847, + 0x2198c4, + 0x244c86, + 0x37ee8a, + 0x37ea05, + 0x209f8c, + 0x20e648, + 0x367388, + 0x21a00c, + 0x22550c, + 0x225a09, + 0x225c47, + 0x231d4c, + 0x23aa84, + 0x23c60a, + 0x35e6cc, + 0x26b28b, + 0x242b8b, + 0x2efec6, + 0x24a107, + 0x24c687, + 0x3a930f, + 0x2f8a51, + 0x2d8592, + 0x24c68d, + 0x24c68e, + 0x24c9ce, + 0x330048, + 0x330052, + 0x24fbc8, + 0x3b1187, + 0x24aeca, + 0x3681c8, + 0x27a9c5, + 0x3b57ca, + 0x21dd87, + 0x2e36c4, + 0x201543, + 0x2a57c5, + 0x30ed47, + 0x2f5007, + 0x29538e, + 0x3382cd, + 0x33af89, + 0x222705, + 0x35c3c3, + 0x3a78c6, + 0x36e745, + 0x2a3208, + 0x205b49, + 0x2983c5, + 0x3692cf, + 0x2d96c7, + 0x372285, + 0x20178a, + 0x2a36c6, + 0x2ed249, + 0x396ccc, + 0x2f51c9, + 0x3abdc6, + 0x265f4c, + 0x322d06, + 0x2f7588, + 0x2f7786, + 0x3b6c06, + 0x3b96c4, + 0x258243, + 0x2a1fca, + 0x327191, + 0x3a9c0a, + 0x27ee85, + 0x265047, + 0x252207, + 0x279444, + 0x27944b, + 0x3b7bc8, + 0x2b7bc6, + 0x362b85, + 0x38b044, + 0x255f09, + 0x31ad84, + 0x254f07, + 0x32f345, + 0x32f347, + 0x33c485, + 0x2a8183, + 0x3b1048, + 0x33b80a, + 0x203043, + 0x325f8a, + 0x203046, + 0x36904f, + 0x2b4f89, + 0x2ca090, + 0x2f1548, + 0x2ccc89, + 0x2971c7, + 0x24bb0f, + 0x336244, + 0x2d5f84, + 0x21d6c6, + 0x22f246, + 0x25708a, + 0x23cc46, + 0x2f58c7, + 0x300788, + 0x300987, + 0x301207, + 0x30370a, + 0x30534b, + 0x2f3dc5, + 0x2d81c8, + 0x21bb03, + 0x23800c, + 0x36f78f, + 0x2b8a4d, + 0x2a7147, + 0x33b0c9, + 0x22bcc7, + 0x24a2c8, + 0x36274c, + 0x2a5e48, + 0x250bc8, + 0x318ace, + 0x32d354, + 0x32d864, + 0x3475ca, + 0x36148b, + 0x380944, + 0x380949, + 0x27bbc8, + 0x245345, + 0x201d0a, + 0x3696c7, + 0x26f744, + 0x38d2c3, + 0x2a84c3, + 0x235ac4, + 0x232403, + 0x2e9dc3, + 0x3b1384, + 0x244183, + 0x209703, + 0x2d43c6, + 0x211cc4, + 0x205503, + 0x200983, + 0x201303, + 0x205702, + 0x38d2c3, + 0x2099c2, + 0x2a84c3, + 0x235ac4, + 0x232403, + 0x2e9dc3, + 0x244183, + 0x2d43c6, + 0x205503, + 0x200983, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2163c3, + 0x205503, + 0x200983, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x211cc4, + 0x205503, + 0x200983, + 0x205702, + 0x2bb143, + 0x2099c2, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x201ec2, + 0x219f02, + 0x2099c2, + 0x2a84c3, + 0x202242, + 0x201fc2, + 0x3b1384, + 0x210444, + 0x227382, + 0x211cc4, + 0x200442, + 0x200983, + 0x201303, + 0x2efec6, + 0x212982, + 0x202dc2, + 0x222f02, + 0x44e0d343, + 0x4521e303, + 0x52d46, + 0x52d46, + 0x25ef44, + 0x204e83, + 0x142abca, + 0x12778c, + 0x102cc, + 0x7dd8d, + 0x129845, + 0x21347, + 0x18648, + 0x1b887, + 0x20348, + 0x19d4ca, + 0x45ed6a45, + 0x12b809, + 0xaf848, + 0x4a70a, + 0x8a64e, + 0x1440a4b, + 0x1320c4, + 0x77848, + 0x68bc8, + 0x38f47, + 0x12807, + 0x4efc9, + 0x2c07, + 0xd4ac8, + 0x1318c9, + 0x3adc5, + 0x124d4e, + 0xa8a0d, + 0x9688, + 0x4622a586, + 0x46c2a588, + 0x70cc8, + 0x117090, + 0x5f347, + 0x601c7, + 0x64547, + 0x69447, + 0xdb42, + 0x190bc7, + 0x430c, + 0x35fc7, + 0xa4246, + 0xa4909, + 0xa6388, + 0x17f42, + 0x1fc2, + 0xb8fcb, + 0x7f247, + 0x11809, + 0xbb9c9, + 0x17e248, + 0xafd42, + 0x113a49, + 0xcdf8a, + 0xc9e09, + 0xd6fc9, + 0xd7ac8, + 0xd8a47, + 0xda889, + 0xde345, + 0xde6d0, + 0x175b86, + 0x192345, + 0x5e98d, + 0xf986, + 0xe9187, + 0xed858, + 0x1b1a48, + 0xb4c8a, + 0x1c42, + 0x52f4d, + 0x27c2, + 0x5d306, + 0x8d108, + 0x86ec8, + 0x16d0c9, + 0x55b08, + 0x5fb4e, + 0x1a78c7, + 0x19d0d, + 0xf2d05, + 0x190948, + 0x194448, + 0xfacc6, + 0xc2, + 0x125c86, + 0x7b02, + 0x341, + 0x57a07, + 0xc8e83, + 0x466ee0c4, + 0x46a94443, 0x141, - 0x15c06, + 0x10986, 0x141, 0x1, - 0x15c06, - 0x8b4c3, - 0x14e4285, - 0x24fe44, - 0x2d0783, - 0x251304, - 0x2964c4, - 0x204ac3, - 0x222ac5, - 0x21bd03, - 0x2202c3, - 0x370145, - 0x24abc3, - 0x466d0783, - 0x231b83, - 0x332ec3, + 0x10986, + 0xc8e83, + 0x1596bc5, + 0x2030c4, + 0x2a84c3, + 0x249944, + 0x3b1384, + 0x205503, + 0x2218c5, + 0x219503, + 0x23e743, + 0x373605, + 0x25ed03, + 0x47ea84c3, + 0x232403, + 0x2e9dc3, 0x200041, - 0x20fbc3, - 0x222044, - 0x213184, - 0x204ac3, - 0x200383, - 0x213e83, - 0x15f048, - 0x204cc2, - 0x368883, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x2135c3, - 0x201d42, - 0x2964c4, - 0x204303, - 0x20fbc3, - 0x204ac3, - 0x20abc3, - 0x200383, - 0x24abc3, - 0x15f048, - 0x371182, - 0xd1c2, - 0x1491b48, - 0x10598e, - 0x47608c42, - 0x32f9c8, - 0x233d86, - 0x210186, - 0x233707, - 0x47a00902, - 0x47f53508, - 0x20ebca, - 0x269708, - 0x201442, - 0x32f649, - 0x3a2487, - 0x218486, - 0x295ec9, - 0x247ec4, - 0x2e4186, - 0x2e1bc4, - 0x26bdc4, - 0x25bf49, - 0x326286, - 0x24df85, - 0x291285, - 0x390387, + 0x209703, + 0x210444, + 0x211cc4, + 0x205503, + 0x200983, + 0x214843, + 0x16d208, + 0x205702, + 0x38d2c3, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x2163c3, + 0x201fc2, + 0x3b1384, + 0x244183, + 0x209703, + 0x205503, + 0x204e83, + 0x200983, + 0x25ed03, + 0x16d208, + 0x36f502, + 0x99c2, + 0x1456108, + 0x100b4e, + 0x48e016c2, + 0x31a448, + 0x234386, + 0x209cc6, + 0x233d07, + 0x4920c202, + 0x49768ec8, + 0x20884a, + 0x25cc88, + 0x200242, + 0x31a0c9, + 0x2f3e07, + 0x216bc6, + 0x3b0d89, + 0x2cf204, + 0x20a6c6, + 0x2dbcc4, + 0x26ffc4, + 0x2544c9, + 0x326686, + 0x320945, + 0x22c445, + 0x384e07, + 0x2bfb47, + 0x28fa44, + 0x233f46, + 0x2fb005, + 0x2fde45, + 0x3963c5, + 0x3b3dc7, + 0x200c05, + 0x314b49, + 0x312945, + 0x333e44, + 0x39b5c7, + 0x31974e, + 0x32e5c9, + 0x33c109, + 0x3a64c6, + 0x23d408, + 0x26d98b, + 0x2aeecc, + 0x37f806, + 0x2dd887, + 0x20a305, + 0x37b5ca, + 0x22af49, + 0x20bf49, + 0x24ff86, + 0x2f69c5, + 0x27ce45, + 0x3490c9, + 0x39654b, + 0x273346, + 0x33a786, + 0x202504, + 0x28bb86, + 0x243908, + 0x3ba646, + 0x214386, + 0x207c08, + 0x20bb47, + 0x20bd09, + 0x20c585, + 0x16d208, + 0x212784, + 0x3ada04, + 0x283785, + 0x399a49, + 0x220f07, + 0x220f0b, + 0x22394a, + 0x227a45, + 0x49a08d42, + 0x33ea47, + 0x49e28908, + 0x2afb87, + 0x350e85, + 0x20c1ca, + 0x99c2, + 0x34dfcb, + 0x24d5ca, + 0x221bc6, + 0x282bc3, + 0x28e34d, + 0x3492cc, + 0x35084d, + 0x245c45, + 0x32ae05, + 0x202247, + 0x3aba49, + 0x208746, + 0x23cac5, + 0x2d29c8, + 0x28ba83, + 0x2dfac8, + 0x28ba88, 0x2c3747, - 0x2911c4, - 0x233946, - 0x2ffb45, - 0x367445, - 0x302505, - 0x392307, - 0x26ae05, - 0x315e49, - 0x32d305, - 0x307184, - 0x38d347, - 0x32ecce, - 0x330a09, - 0x358849, - 0x3ac9c6, - 0x2fe248, - 0x2b520b, - 0x2e3b0c, - 0x2898c6, - 0x2076c7, - 0x37b305, - 0x32d98a, - 0x237a09, - 0x3aa989, - 0x257646, - 0x2fb805, - 0x2aabc5, - 0x348f89, - 0x30268b, - 0x280f46, - 0x338346, - 0x20a904, - 0x2908c6, - 0x226a08, - 0x3abc06, - 0x20c5c6, - 0x206188, - 0x207f47, - 0x208649, - 0x209705, - 0x15f048, - 0x216e84, - 0x33d5c4, - 0x369f05, - 0x204f49, - 0x222347, - 0x22234b, - 0x223e4a, - 0x228485, - 0x4820a002, - 0x238987, - 0x48629248, - 0x27be07, - 0x2bf945, - 0x3aac0a, - 0xd1c2, - 0x38740b, - 0x25470a, - 0x222dc6, - 0x395e03, - 0x29538d, - 0x3582cc, - 0x37f24d, - 0x381085, - 0x227dc5, - 0x2601c7, - 0x209c09, - 0x20eac6, - 0x383405, - 0x2d8008, - 0x2907c3, - 0x2ec708, - 0x2907c8, - 0x2c6c47, - 0x3b2448, - 0x39b7c9, - 0x2c9747, - 0x238187, - 0x302b88, - 0x38ca44, - 0x38ca47, - 0x272648, - 0x2024c6, - 0x206fcf, - 0x2118c7, - 0x2e7a86, - 0x23e2c5, - 0x223783, - 0x365a47, - 0x36da03, - 0x250446, - 0x251c46, - 0x252a06, - 0x296e85, - 0x26ea03, - 0x388a48, - 0x370c89, - 0x37ffcb, - 0x252b88, - 0x254285, - 0x256405, - 0x48aabc02, - 0x359a49, - 0x296547, - 0x25f185, - 0x25be47, - 0x25dd86, - 0x363f05, - 0x36fe0b, - 0x2640c4, - 0x2692c5, - 0x269407, - 0x27b786, - 0x27bbc5, - 0x288487, - 0x288d47, - 0x2d1784, - 0x28e04a, - 0x28e508, - 0x2c2149, - 0x3648c5, - 0x2951c6, - 0x226bca, - 0x387646, - 0x26f5c7, - 0x2c1e0d, - 0x2a1f09, - 0x3597c5, - 0x339dc7, - 0x368388, - 0x26a888, - 0x314d07, - 0x20b246, - 0x217807, - 0x221143, - 0x33c004, - 0x3607c5, - 0x38dcc7, - 0x391d09, - 0x22a8c8, - 0x33fac5, - 0x242844, - 0x2f5bc5, - 0x38174d, - 0x203742, - 0x386ac6, - 0x377a06, - 0x2c8bca, - 0x37e686, - 0x38b5c5, - 0x368fc5, - 0x368fc7, - 0x3a010c, - 0x279b0a, - 0x290586, - 0x225085, - 0x290706, - 0x290a47, - 0x292846, - 0x296d8c, - 0x296009, - 0x48e16087, - 0x299745, - 0x299746, - 0x299d08, - 0x236785, - 0x2a8b45, - 0x2a9548, - 0x2a974a, - 0x49258142, - 0x4960c2c2, - 0x2e8f85, - 0x28b9c3, - 0x22b108, - 0x241d03, - 0x2a99c4, - 0x2f350b, - 0x34ef48, - 0x305148, - 0x49b67ec9, - 0x2af389, - 0x2afac6, - 0x2b0a88, - 0x2b0c89, - 0x2b1786, - 0x2b1905, - 0x372a86, - 0x2b1e49, - 0x319d87, - 0x25c446, - 0x233147, - 0x20e947, - 0x362e04, - 0x49f453c9, - 0x2cd008, - 0x353408, - 0x383d07, - 0x2c8686, - 0x235389, - 0x210147, - 0x34970a, - 0x330d48, - 0x349407, - 0x3b1546, - 0x2e834a, - 0x2733c8, - 0x30de45, - 0x36dac5, - 0x2f9807, - 0x371d49, - 0x3097cb, - 0x31e0c8, - 0x32d389, - 0x253487, - 0x2bad4c, - 0x2bb74c, - 0x2bba4a, - 0x2bbccc, - 0x2c5c08, - 0x2c5e08, - 0x2c6004, - 0x2c63c9, - 0x2c6609, - 0x2c684a, - 0x2c6ac9, - 0x2c6e07, - 0x3a448c, - 0x24b946, - 0x35d588, - 0x387706, - 0x330c06, - 0x3596c7, - 0x238ec8, - 0x2618cb, - 0x303207, - 0x359c49, - 0x251489, - 0x25bbc7, - 0x2e1e04, - 0x3643c7, - 0x2e1246, - 0x214046, - 0x2eb045, - 0x2c7408, - 0x2976c4, - 0x2976c6, - 0x2799cb, - 0x212cc9, - 0x209e06, - 0x20c709, - 0x392486, - 0x3aae08, - 0x214183, - 0x2fb985, - 0x215a09, - 0x224085, - 0x2f9644, - 0x27acc6, - 0x2ed005, - 0x2f7346, - 0x309ec7, - 0x328dc6, - 0x3a174b, - 0x22c447, - 0x234886, - 0x3742c6, - 0x390446, - 0x291189, - 0x240aca, - 0x2b8ec5, - 0x21898d, - 0x2a9846, - 0x2babc6, - 0x2ded86, - 0x2f31c5, - 0x2e4d87, - 0x29fa87, - 0x22bd4e, - 0x20fbc3, - 0x2c8649, - 0x263709, - 0x32dd87, - 0x2804c7, - 0x2a2ec5, - 0x343f05, - 0x4a23734f, - 0x2d10c7, - 0x2d1288, - 0x2d25c4, - 0x2d2e86, - 0x4a64db02, - 0x2d7346, - 0x201686, - 0x2638ce, - 0x2ec54a, - 0x28b6c6, - 0x22d88a, - 0x209a09, - 0x323d05, - 0x393948, - 0x3aef46, - 0x359508, - 0x2392c8, - 0x34434b, - 0x233805, - 0x26ae88, - 0x2062cc, - 0x2bf807, - 0x252546, - 0x281fc8, - 0x2253c8, - 0x4aa09282, - 0x25604b, - 0x37b489, - 0x2cf2c9, - 0x2f02c7, - 0x3b3648, - 0x4ae289c8, - 0x20e64b, - 0x37dd09, - 0x33f58d, - 0x27d648, - 0x290188, - 0x4b201882, - 0x3b2f44, - 0x4b60dc42, - 0x2f9486, - 0x4ba038c2, - 0x2448ca, - 0x210546, - 0x22d208, - 0x289e88, - 0x2e4086, - 0x2eb5c6, - 0x2f7106, - 0x2f1b45, - 0x23c804, - 0x4be1de04, - 0x20ae86, - 0x29a787, - 0x4c2f7d07, - 0x2dc60b, - 0x32f089, - 0x227e0a, - 0x263144, - 0x369108, - 0x25c20d, - 0x2f1509, - 0x2f1748, - 0x2f2009, - 0x2f39c4, - 0x20ce44, - 0x283cc5, - 0x317b0b, - 0x34eec6, - 0x33c645, - 0x21fb89, - 0x233a08, - 0x263844, - 0x32db09, - 0x208f45, - 0x2c3788, - 0x238847, - 0x358c48, - 0x284e86, - 0x22b987, - 0x2984c9, - 0x311a89, - 0x372545, - 0x295645, - 0x4c626a82, - 0x306f44, - 0x30ce05, - 0x2c1846, - 0x327285, - 0x2b4707, - 0x20af85, - 0x27b7c4, - 0x3aca86, - 0x383487, - 0x232106, - 0x21e105, - 0x202608, - 0x233f85, - 0x205d07, - 0x20bc49, - 0x212e0a, - 0x2494c7, - 0x2494cc, - 0x24df46, - 0x2e9ac9, - 0x230505, - 0x2366c8, - 0x210c03, - 0x210c05, - 0x2f7b45, - 0x26e707, - 0x4ca27202, - 0x227a07, - 0x2e5206, - 0x345306, - 0x2e62c6, - 0x225306, - 0x2091c8, - 0x35b805, - 0x2e7b47, - 0x2e7b4d, - 0x21b083, - 0x21f305, - 0x21b087, - 0x26b308, - 0x21ac45, - 0x2281c8, - 0x2ab9c6, - 0x32b247, - 0x2c7bc5, - 0x233886, - 0x2cfac5, - 0x22dfca, - 0x2efec6, - 0x25dbc7, - 0x2bc605, - 0x2f44c7, - 0x2f8904, - 0x2f95c6, - 0x3624c5, - 0x32608b, - 0x2e10c9, - 0x23d74a, - 0x3725c8, - 0x3007c8, - 0x300f0c, - 0x306b47, - 0x308c48, - 0x30aa88, - 0x30dac5, - 0x338b4a, - 0x33aa09, - 0x4ce00202, - 0x200206, - 0x20d684, - 0x2ef889, - 0x275d49, - 0x27b1c7, - 0x2fa547, - 0x2b7c09, - 0x331308, - 0x33130f, - 0x2dfa86, - 0x2db10b, - 0x361545, - 0x361547, - 0x374c89, - 0x2171c6, - 0x32da87, - 0x2dde85, - 0x22f544, - 0x26e186, - 0x211984, - 0x2e6c47, - 0x34c5c8, - 0x4d2fb708, - 0x2fbe85, - 0x2fbfc7, - 0x245709, - 0x208444, - 0x208448, - 0x4d7190c8, - 0x23cdc4, - 0x230c88, - 0x3396c4, - 0x220389, - 0x333105, - 0x4da05bc2, - 0x2dfac5, - 0x2e6845, - 0x271b88, - 0x232847, - 0x4de03382, - 0x30cbc5, - 0x2d4e86, - 0x27a786, - 0x306f08, - 0x318308, - 0x327246, - 0x32e246, - 0x249009, - 0x345246, - 0x21708b, - 0x2a12c5, - 0x204686, - 0x382588, - 0x3152c6, - 0x298e46, - 0x21b94a, - 0x22f9ca, - 0x2e8245, - 0x35b8c7, - 0x2f0cc6, - 0x4e206602, - 0x21b1c7, - 0x2a9085, - 0x226b44, - 0x226b45, - 0x263046, - 0x27a447, - 0x20d405, - 0x22fb44, - 0x365008, - 0x298f05, - 0x33c8c7, - 0x39fa85, - 0x22df05, - 0x256b44, - 0x28fbc9, - 0x2ff988, - 0x2ecec6, - 0x2de9c6, - 0x2b9d46, - 0x4e700448, - 0x300647, - 0x3009cd, - 0x30120c, - 0x301809, - 0x301a49, - 0x4eb546c2, - 0x3a5503, - 0x20b303, - 0x2e1305, - 0x38ddca, - 0x327106, - 0x307905, - 0x30a084, - 0x30a08b, - 0x31bdcc, - 0x31c5cc, - 0x31c8d5, + 0x309708, + 0x3a7209, + 0x2cc447, + 0x33e247, + 0x396a48, + 0x251f44, + 0x251f47, + 0x273748, + 0x3a3ac6, + 0x205f4f, + 0x211a07, + 0x2e5446, + 0x225d85, + 0x223083, + 0x371847, + 0x36c043, + 0x248e46, + 0x24aa86, + 0x24b286, + 0x290c05, + 0x261903, + 0x388208, + 0x36f009, + 0x38224b, + 0x24b408, + 0x24d145, + 0x24f605, + 0x4a248902, + 0x352289, + 0x3b1407, + 0x256805, + 0x2543c7, + 0x2559c6, + 0x365a45, + 0x36e58b, + 0x257ec4, + 0x25c845, + 0x25c987, + 0x272cc6, + 0x273105, + 0x2812c7, + 0x281a07, + 0x2cd884, + 0x289c0a, + 0x28a0c8, + 0x3b8209, + 0x241e85, + 0x207886, + 0x243aca, + 0x22c346, + 0x261e07, + 0x3b7ecd, + 0x29c809, + 0x38d185, + 0x314187, + 0x332288, + 0x33d848, + 0x3b3107, + 0x379d86, + 0x215dc7, + 0x249f43, + 0x341c04, + 0x363485, + 0x392707, + 0x395dc9, + 0x22be48, + 0x344c45, + 0x23cd84, + 0x246245, + 0x24b80d, + 0x200f82, + 0x373746, + 0x25d246, + 0x2c578a, + 0x376546, + 0x37edc5, + 0x33df85, + 0x33df87, + 0x38ab8c, + 0x270b4a, + 0x28b846, + 0x2b9645, + 0x28b9c6, + 0x28bd07, + 0x28e186, + 0x290b0c, + 0x3b0ec9, + 0x4a610e07, + 0x293b05, + 0x293b06, + 0x293ec8, + 0x23b705, + 0x2a2c85, + 0x2a3848, + 0x2a3a4a, + 0x4aa4ecc2, + 0x4ae0ee02, + 0x2e6705, + 0x284f83, + 0x3adf08, + 0x204043, + 0x2a3cc4, + 0x2ed38b, + 0x26dd48, + 0x2e4d48, + 0x4b349909, + 0x2a7dc9, + 0x2a8906, + 0x2a9d48, + 0x2a9f49, + 0x2aab46, + 0x2aacc5, + 0x3843c6, + 0x2ab5c9, + 0x331f47, + 0x23ea86, + 0x233747, + 0x2085c7, + 0x32c8c4, + 0x4b7b1d49, + 0x2cab88, + 0x368dc8, + 0x383447, + 0x2c5246, + 0x226ac9, + 0x209c87, + 0x32e90a, + 0x38c588, + 0x3af5c7, + 0x3b9786, + 0x24f38a, + 0x262708, + 0x2dccc5, + 0x226645, + 0x2ee487, + 0x2f7349, + 0x36510b, + 0x315008, + 0x3129c9, + 0x24bfc7, + 0x2b550c, + 0x2b5c4c, + 0x2b5f4a, + 0x2b61cc, + 0x2c2708, + 0x2c2908, + 0x2c2b04, + 0x2c2ec9, + 0x2c3109, + 0x2c334a, + 0x2c35c9, + 0x2c3907, + 0x3af00c, + 0x241146, + 0x34acc8, + 0x22c406, + 0x32e7c6, + 0x38d087, + 0x3b3288, + 0x39034b, + 0x2afa47, + 0x352489, + 0x3445c9, + 0x249ac7, + 0x278a04, + 0x265187, + 0x2db346, + 0x214a06, + 0x2f3485, + 0x2a5888, + 0x291444, + 0x291446, + 0x270a0b, + 0x21ca49, + 0x214b46, + 0x21c489, + 0x3b3f46, + 0x254688, + 0x223b83, + 0x2f6b45, + 0x22edc9, + 0x261145, + 0x2f9684, + 0x272206, + 0x231545, + 0x228f86, + 0x3056c7, + 0x26e986, + 0x3a304b, + 0x22ea87, + 0x3379c6, + 0x346f06, + 0x384ec6, + 0x28fa09, + 0x2ef14a, + 0x2b3505, + 0x2170cd, + 0x2a3b46, + 0x235546, + 0x2b4e86, + 0x2ed045, + 0x2de9c7, + 0x2e14c7, + 0x3581ce, + 0x209703, + 0x2c5209, + 0x391dc9, + 0x37b9c7, + 0x358f07, + 0x29d645, + 0x27ec45, + 0x4ba2a88f, + 0x2ccec7, + 0x2cd088, + 0x2cd484, + 0x2cde46, + 0x4be44c42, + 0x2d2186, + 0x2d43c6, + 0x391f8e, + 0x2df90a, + 0x357b06, + 0x285eca, + 0x203549, + 0x324105, + 0x398008, + 0x3b5606, + 0x38cec8, + 0x26f088, + 0x28eb8b, + 0x233e05, + 0x200c88, + 0x207d4c, + 0x2bd507, + 0x24ae06, + 0x2e28c8, + 0x20a948, + 0x4c208442, + 0x20a48b, + 0x282549, + 0x329f09, + 0x3bb287, + 0x20f7c8, + 0x4c61bf48, + 0x3511cb, + 0x37e0c9, + 0x234fcd, + 0x2750c8, + 0x224a48, + 0x4ca03ec2, + 0x20e3c4, + 0x4ce1a2c2, + 0x2f4ec6, + 0x4d2004c2, + 0x3813ca, + 0x21c346, + 0x285908, + 0x284488, + 0x2af446, + 0x22d8c6, + 0x2f12c6, + 0x2a3185, + 0x238c04, + 0x4d61e144, + 0x205146, + 0x272707, + 0x4dae8bc7, + 0x35490b, + 0x319b09, + 0x32ae4a, + 0x391804, + 0x33e0c8, + 0x23e84d, + 0x2eb709, + 0x2eb948, + 0x2ebfc9, + 0x2ed844, + 0x243484, + 0x27c885, + 0x317b4b, + 0x26dcc6, + 0x3424c5, + 0x250149, + 0x234008, + 0x2047c4, + 0x37b749, + 0x208105, + 0x2bfb88, + 0x33e907, + 0x33c508, + 0x27d946, + 0x35e387, + 0x292349, + 0x2286c9, + 0x2492c5, + 0x334ec5, + 0x4de2d902, + 0x333c04, + 0x2049c5, + 0x32c146, + 0x318385, + 0x2b1ac7, + 0x205245, + 0x272d04, + 0x3a6586, + 0x23cb47, + 0x232986, + 0x2dca05, + 0x203188, + 0x234585, + 0x2062c7, + 0x20f1c9, + 0x21cb8a, + 0x2e1b87, + 0x2e1b8c, + 0x320906, + 0x343cc9, + 0x23b385, + 0x23b648, + 0x210803, + 0x210805, + 0x2e8a05, + 0x261607, + 0x4e20c002, + 0x22d0c7, + 0x2e4f06, + 0x342786, + 0x2e7d06, + 0x20a886, + 0x208388, + 0x241c85, + 0x2e5507, + 0x2e550d, + 0x201543, + 0x21ec05, + 0x201547, + 0x22d408, + 0x201105, + 0x218c88, + 0x36c0c6, + 0x32b9c7, + 0x2c4785, + 0x233e86, + 0x26f5c5, + 0x21390a, + 0x2f2e06, + 0x377ac7, + 0x2ca505, + 0x3612c7, + 0x36d6c4, + 0x2f9606, + 0x2fb3c5, + 0x32648b, + 0x2db1c9, + 0x2bb24a, + 0x249348, + 0x301d08, + 0x304a4c, + 0x306287, + 0x3073c8, + 0x310a48, + 0x31e945, + 0x34020a, + 0x35c3c9, + 0x4e600802, + 0x200806, + 0x219d04, + 0x2ea849, + 0x220b49, + 0x269287, + 0x294947, + 0x37e789, + 0x38cb48, + 0x38cb4f, + 0x315d06, + 0x2d670b, + 0x36e8c5, + 0x36e8c7, + 0x385889, + 0x212ac6, + 0x37b6c7, + 0x2d8905, + 0x2303c4, + 0x261006, + 0x211ac4, + 0x2ce4c7, + 0x307048, + 0x4eaf68c8, + 0x2f7085, + 0x2f71c7, + 0x236549, + 0x23e284, + 0x23e288, + 0x4ee2b888, + 0x279444, + 0x231388, + 0x32fdc4, + 0x3ab849, + 0x2173c5, + 0x4f20b0c2, + 0x315d45, + 0x2e4345, + 0x251288, + 0x232e47, + 0x4f601442, + 0x204785, + 0x2cf606, + 0x24b106, + 0x333bc8, + 0x302108, + 0x318346, + 0x327f06, + 0x2e2e49, + 0x3426c6, + 0x21298b, + 0x296305, + 0x368106, + 0x377088, + 0x250506, + 0x292cc6, + 0x21914a, + 0x23084a, + 0x245005, + 0x241d47, + 0x308786, + 0x4fa01682, + 0x201687, + 0x238705, + 0x243a44, + 0x243a45, + 0x391706, + 0x26a447, + 0x219a85, + 0x220c04, + 0x2c7e88, + 0x292d85, + 0x333a47, + 0x3a1645, + 0x213845, + 0x256e04, + 0x287609, + 0x2fae48, + 0x2e0286, + 0x2d9d06, + 0x2b6e46, + 0x4fefbc88, + 0x2fbe87, + 0x2fc0cd, + 0x2fcb4c, + 0x2fd149, + 0x2fd389, + 0x5035b2c2, + 0x3a8603, + 0x207943, + 0x2db405, + 0x39280a, + 0x327dc6, + 0x302385, + 0x305884, + 0x30588b, + 0x31b70c, + 0x31c14c, + 0x31c455, 0x31d74d, - 0x31f44f, - 0x31f812, - 0x31fc8f, - 0x320052, - 0x3204d3, - 0x32098d, - 0x320f4d, - 0x3212ce, - 0x322a8e, - 0x3232cc, - 0x32368c, - 0x323acb, - 0x323e4e, - 0x324f92, - 0x326ecc, - 0x327610, - 0x3335d2, - 0x3347cc, - 0x334e8d, - 0x3351cc, - 0x337611, - 0x3384cd, - 0x33ac4d, - 0x33b24a, - 0x33b4cc, - 0x33bdcc, - 0x33c34c, - 0x33cbcc, - 0x33fc53, - 0x340450, - 0x340850, - 0x340e4d, - 0x34144c, - 0x342209, - 0x342f0d, - 0x343253, - 0x344911, - 0x344d53, - 0x34560f, - 0x3459cc, - 0x345ccf, - 0x34608d, - 0x34668f, - 0x346a50, - 0x3474ce, - 0x34ac8e, - 0x34b590, - 0x34ca8d, - 0x34d40e, - 0x34d78c, - 0x34e753, - 0x351e0e, - 0x352390, - 0x352791, - 0x352bcf, - 0x352f93, - 0x35424d, - 0x35458f, - 0x35494e, - 0x354fd0, - 0x3553c9, - 0x356390, - 0x356acf, - 0x35714f, - 0x357512, - 0x359e8e, - 0x35a74d, - 0x35cc4d, - 0x35cf8d, - 0x35f68d, - 0x35f9cd, - 0x35fd10, - 0x36010b, - 0x36058c, - 0x36090c, - 0x360c0c, - 0x360f0e, - 0x372c10, - 0x374452, - 0x3748cb, - 0x374ece, - 0x37524e, - 0x375ace, - 0x37604b, - 0x4ef76396, - 0x37724d, - 0x378354, - 0x378e0d, - 0x37ae55, - 0x37c04d, - 0x37c9cf, - 0x37d20f, - 0x38028f, - 0x38064e, - 0x380acd, - 0x382f11, - 0x385ecc, - 0x3861cc, - 0x3864cb, - 0x386c4c, - 0x38824f, - 0x388612, - 0x388fcd, - 0x389f8c, - 0x38a40c, - 0x38a70d, - 0x38aa4f, - 0x38ae0e, - 0x38da8c, - 0x38e04d, - 0x38e38b, - 0x38ee8c, - 0x38f40d, - 0x38f74e, - 0x38fac9, - 0x390c53, - 0x39118d, - 0x3914cd, - 0x391acc, - 0x391f4e, - 0x39290f, - 0x392ccc, - 0x392fcd, - 0x39330f, - 0x3936cc, - 0x3943cc, - 0x39484c, - 0x394b4c, - 0x39520d, - 0x395552, - 0x396c0c, - 0x396f0c, - 0x397211, - 0x39764f, - 0x397a0f, - 0x397dd3, - 0x398a8e, - 0x398e0f, - 0x3991cc, - 0x4f39950e, - 0x39988f, - 0x399c56, - 0x39b312, - 0x39d64c, - 0x39e14f, - 0x39e7cd, - 0x39eb0f, - 0x39eecc, - 0x39f1cd, - 0x39f50d, - 0x3a0c4e, - 0x3a2b8c, - 0x3a2e8c, - 0x3a3190, - 0x3a4991, - 0x3a4dcb, - 0x3a510c, - 0x3a540e, - 0x3a7051, - 0x3a748e, - 0x3a780d, - 0x3aed0b, - 0x3afdcf, - 0x3b09d4, - 0x2630c2, - 0x2630c2, - 0x202583, - 0x2630c2, - 0x202583, - 0x2630c2, - 0x20ae82, - 0x372ac5, - 0x3a6d4c, - 0x2630c2, - 0x2630c2, - 0x20ae82, - 0x2630c2, - 0x29a385, - 0x212e05, - 0x2630c2, - 0x2630c2, - 0x211cc2, - 0x29a385, - 0x31e789, - 0x34460c, - 0x2630c2, - 0x2630c2, - 0x2630c2, - 0x2630c2, - 0x372ac5, - 0x2630c2, - 0x2630c2, - 0x2630c2, - 0x2630c2, - 0x211cc2, - 0x31e789, - 0x2630c2, - 0x2630c2, - 0x2630c2, - 0x212e05, - 0x2630c2, - 0x212e05, - 0x34460c, - 0x3a6d4c, - 0x368883, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x2964c4, - 0x204ac3, - 0x200383, - 0x1f08, - 0x15444, - 0xc1348, - 0x204cc2, - 0x5020d1c2, - 0x243403, - 0x24c944, - 0x202743, - 0x38e8c4, - 0x22e886, - 0x213843, - 0x31aa84, - 0x288845, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x25084a, - 0x241f46, - 0x3755cc, - 0x15f048, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x22d603, - 0x201686, - 0x204ac3, - 0x200383, - 0x21aa03, - 0xaa288, + 0x320a8f, + 0x320e52, + 0x3212cf, + 0x321692, + 0x321b13, + 0x321fcd, + 0x32258d, + 0x32290e, + 0x322e8e, + 0x3236cc, + 0x323a8c, + 0x323ecb, + 0x32424e, + 0x325392, + 0x327b8c, + 0x328790, + 0x335212, + 0x33640c, + 0x336acd, + 0x336e0c, + 0x339a51, + 0x33a90d, + 0x34084d, + 0x340e4a, + 0x3410cc, + 0x3419cc, + 0x3421cc, + 0x34290c, + 0x344dd3, + 0x345450, + 0x345850, + 0x34610d, + 0x34670c, + 0x347309, + 0x34890d, + 0x348c53, + 0x34a311, + 0x34a753, + 0x34b24f, + 0x34b60c, + 0x34b90f, + 0x34bccd, + 0x34c2cf, + 0x34c690, + 0x34d10e, + 0x3539ce, + 0x353f50, + 0x35518d, + 0x355b0e, + 0x355e8c, + 0x356e93, + 0x35934e, + 0x3599d0, + 0x359dd1, + 0x35a20f, + 0x35a5d3, + 0x35ae4d, + 0x35b18f, + 0x35b54e, + 0x35bc10, + 0x35c009, + 0x35cd90, + 0x35d38f, + 0x35da0f, + 0x35ddd2, + 0x35efce, + 0x35fc4d, + 0x36070d, + 0x360a4d, + 0x36184d, + 0x361b8d, + 0x361ed0, + 0x3622cb, + 0x36324c, + 0x3635cc, + 0x363bcc, + 0x363ece, + 0x371a10, + 0x372dd2, + 0x37324b, + 0x3738ce, + 0x373c4e, + 0x3744ce, + 0x37494b, + 0x50774f56, + 0x37624d, + 0x3766d4, + 0x377e0d, + 0x37b115, + 0x37c40d, + 0x37cd8f, + 0x37d5cf, + 0x38250f, + 0x3828ce, + 0x382e4d, + 0x383f91, + 0x38674c, + 0x386a4c, + 0x386d4b, + 0x38764c, + 0x387a0f, + 0x387dd2, + 0x38878d, + 0x38974c, + 0x389bcc, + 0x389ecd, + 0x38a20f, + 0x38a5ce, + 0x3924cc, + 0x392a8d, + 0x392dcb, + 0x39358c, + 0x393b0d, + 0x393e4e, + 0x3941c9, + 0x394d13, + 0x39524d, + 0x39558d, + 0x395b8c, + 0x39600e, + 0x396fcf, + 0x39738c, + 0x39768d, + 0x3979cf, + 0x397d8c, + 0x39848c, + 0x39890c, + 0x398c0c, + 0x3992cd, + 0x399612, + 0x399c8c, + 0x399f8c, + 0x39a291, + 0x39a6cf, + 0x39aa8f, + 0x39ae53, + 0x39bcce, + 0x39c04f, + 0x39c40c, + 0x50b9c74e, + 0x39cacf, + 0x39ce96, + 0x39dc12, + 0x39f38c, + 0x39fd0f, + 0x3a038d, + 0x3a06cf, + 0x3a0a8c, + 0x3a0d8d, + 0x3a10cd, + 0x3a254e, + 0x3a4b8c, + 0x3a4e8c, + 0x3a5190, + 0x3a7a91, + 0x3a7ecb, + 0x3a820c, + 0x3a850e, + 0x3aa811, + 0x3aac4e, + 0x3aafcd, + 0x3b53cb, + 0x3b5e8f, + 0x3b6d94, + 0x228782, + 0x228782, + 0x200c83, + 0x228782, + 0x200c83, + 0x228782, + 0x205142, + 0x384405, + 0x3aa50c, + 0x228782, + 0x228782, + 0x205142, + 0x228782, + 0x294545, + 0x21cb85, + 0x228782, + 0x228782, + 0x20b382, + 0x294545, + 0x31f3c9, + 0x34a00c, + 0x228782, + 0x228782, + 0x228782, + 0x228782, + 0x384405, + 0x228782, + 0x228782, + 0x228782, + 0x228782, + 0x20b382, + 0x31f3c9, + 0x228782, + 0x228782, + 0x228782, + 0x21cb85, + 0x228782, + 0x21cb85, + 0x34a00c, + 0x3aa50c, + 0x38d2c3, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x3b1384, + 0x205503, + 0x200983, + 0x2708, + 0x5fc84, + 0xe0e08, + 0x205702, + 0x51a099c2, + 0x23dbc3, + 0x24f2c4, + 0x2032c3, + 0x393304, + 0x22f706, + 0x20e883, + 0x3328c4, + 0x286bc5, + 0x209703, + 0x205503, + 0x200983, + 0x255cca, + 0x2efec6, + 0x373fcc, + 0x16d208, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x227f83, + 0x2d43c6, + 0x205503, + 0x200983, + 0x201303, + 0xa4508, + 0x129845, + 0x14902, + 0x52f86185, + 0x21347, + 0xc93c8, + 0xec0e, + 0x88192, + 0xfe20b, + 0x532d6a45, + 0x536d6a4c, + 0xb007, + 0x16fc07, + 0x1b254a, + 0x3a6d0, + 0x149c05, + 0xd95cb, + 0x68bc8, + 0x38f47, + 0x304cb, + 0x4efc9, + 0x11dd07, + 0x2c07, + 0x73587, + 0x1c106, + 0xd4ac8, + 0x53c1cdc6, + 0xa8a0d, + 0x1b1f10, + 0x5402bb82, + 0x9688, + 0x4a450, + 0x14434c, + 0x5474e88d, + 0x655c7, + 0x78749, + 0x52e06, + 0x940c8, + 0x67e42, + 0x9f54a, + 0x27f07, + 0x35fc7, + 0xa4909, + 0xa6388, + 0xb9b45, + 0xec50e, + 0xb54e, + 0xdecf, + 0x11809, + 0xbb9c9, + 0x43e4b, + 0x7664f, + 0x8780c, + 0x9ef4b, + 0xbbf48, + 0x154807, + 0xcdc48, + 0xfb80b, + 0xf568c, + 0xf640c, + 0xf908c, + 0xfe68d, + 0x17e248, + 0xeab02, + 0x113a49, + 0x185d4b, + 0xc5446, + 0x116fcb, + 0xd804a, + 0xd8c05, + 0xde6d0, + 0x111806, + 0x192345, + 0xe3f48, + 0xe9187, + 0xe9447, + 0xff487, + 0xf4d0a, + 0xc924a, + 0x5d306, + 0x91a0d, + 0x86ec8, + 0x55b08, + 0x56d49, + 0xb3c45, + 0xf484c, + 0xfe88b, + 0x165044, + 0xfaa89, + 0xfacc6, + 0x1af7c6, + 0x2dc2, + 0x125c86, + 0x107247, + 0x7b02, + 0xc83c5, + 0x29544, + 0x1ec1, + 0x4c983, + 0x53a85146, + 0x94443, + 0xd882, + 0x27f04, + 0x242, + 0x5ef44, + 0x3dc2, + 0x8142, + 0x2502, + 0x10f242, + 0x1ec2, + 0xd6a42, + 0x4142, + 0x1b102, + 0x2cd82, + 0x5742, + 0xdc2, + 0xf882, + 0x32403, + 0x5f02, + 0x7c2, + 0x18342, + 0xfc82, + 0x5e82, + 0x1ae02, + 0x17f42, + 0x15c2, + 0x29c2, + 0x1fc2, + 0x44183, 0x3942, - 0x513856c5, - 0x2ac47, - 0xd7a88, - 0xc0ce, - 0x8c792, - 0x16780b, - 0x516db445, - 0x51adb44c, - 0xf207, - 0x13ecc7, - 0x1698ca, - 0x3efd0, - 0x1acd05, - 0x16e1cb, - 0x1672c8, - 0x13edc7, - 0x2f64b, - 0x11dd09, - 0x150f47, - 0x1b3c47, - 0x81187, - 0x20586, - 0x94b88, - 0x52028b86, - 0xafbcd, - 0x169290, - 0x52401742, - 0xfb48, - 0x71f47, - 0x7f149, - 0x59b46, - 0x99f08, - 0x74842, - 0xa4f4a, - 0x2d587, - 0x3b9c7, - 0xaa689, - 0xad708, - 0x15ae05, - 0x194e8e, - 0x14d4e, - 0x26f4f, - 0x2ccc9, - 0x4c809, - 0x77e8b, - 0x878cf, - 0x8fdcc, - 0xadd8b, - 0xc4d08, - 0xdc507, - 0x162908, - 0xfe04b, - 0x12a54c, - 0x141acc, - 0x147f4c, - 0x14b0cd, - 0x17de88, - 0x42602, - 0x104389, - 0x18528b, - 0xc8886, - 0x116f8b, - 0xdd5ca, - 0xde185, - 0xe4a90, - 0x1294c6, - 0x63c85, - 0xe6448, - 0xee547, - 0xee807, - 0x5e987, - 0xf92ca, - 0xd790a, - 0x177ac6, - 0x97ccd, - 0x1ae208, - 0x56608, - 0x56a89, - 0xb9905, - 0x19de4c, - 0x14b2cb, - 0x171c84, - 0xff749, - 0x8146, - 0x16c2, - 0x125886, - 0x10d947, - 0x6c82, - 0xcb605, - 0x29b04, - 0x701, - 0x2bc43, - 0x51fadbc6, - 0x9a283, - 0x8a42, - 0x2d584, + 0x6502, + 0xafd42, + 0xbe02, + 0x282, + 0x4bc2, + 0x1f42, + 0xa8542, + 0x2342, + 0x152bc2, + 0x675c2, + 0x2c82, + 0x5503, + 0x8c2, + 0x8442, + 0x33c2, + 0xb482, + 0x49245, + 0xba02, + 0x2d4c2, + 0x3c083, + 0x482, + 0x1c42, + 0x27c2, + 0x3902, + 0x1102, 0x1442, - 0x4ae04, - 0x1342, - 0x2f82, - 0x3682, - 0x1124c2, - 0xe542, - 0xdb442, - 0x2ac2, - 0x1c402, - 0x26982, - 0x4d02, - 0x3b02, - 0x34682, - 0x31b83, - 0x7d02, - 0x1c2, - 0x41c2, - 0xda42, - 0x642, - 0xdc2, - 0x18d82, - 0x1a02, - 0x2282, - 0x1d42, - 0x4303, - 0xb02, - 0x2f02, - 0xb5e02, - 0x1b02, - 0x5d82, - 0x32c2, - 0x73c2, - 0x17c2, - 0x1f02, - 0x173102, - 0x73fc2, - 0x5e402, - 0x4ac3, - 0x2c2, - 0x9282, - 0x1002, - 0x14602, - 0x1724c5, - 0x6ec2, - 0x1202, - 0x41703, - 0x682, - 0xd42, - 0x1702, - 0xe5c2, - 0x1ac2, - 0x3382, - 0x6902, - 0x16c2, - 0x73c07, - 0x213dc3, - 0x204cc2, - 0x2d0783, - 0x231b83, - 0x2135c3, - 0x201d43, - 0x22d603, - 0x204ac3, - 0x20abc3, - 0x200383, - 0x29a2c3, - 0x1a5c3, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x2135c3, - 0x20fbc3, - 0x204ac3, - 0x20abc3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, + 0xc2, + 0x2dc2, + 0x9885, + 0x75c47, + 0x212503, + 0x205702, + 0x2a84c3, + 0x232403, + 0x2163c3, + 0x20ad83, + 0x227f83, + 0x205503, + 0x204e83, + 0x200983, + 0x294483, + 0x169c3, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2163c3, + 0x209703, + 0x205503, + 0x204e83, + 0x200983, + 0x2a84c3, + 0x232403, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, 0x200041, - 0x20fbc3, - 0x204ac3, - 0x2104c3, - 0x200383, - 0x368883, - 0x2d0783, - 0x231b83, - 0x20fb43, - 0x2135c3, - 0x2300c3, - 0x287703, - 0x210503, - 0x234743, - 0x332ec3, - 0x2964c4, - 0x204ac3, - 0x200383, - 0x24abc3, - 0x200604, - 0x250c83, - 0x5283, - 0x3abd03, - 0x329b88, - 0x2e8384, - 0x2c264a, - 0x224906, - 0x10f9c4, - 0x38c2c7, - 0x21eeca, - 0x2df949, - 0x3a3b07, - 0x3a7dca, - 0x368883, - 0x2e900b, - 0x303349, - 0x2b9e45, - 0x2d7187, - 0xd1c2, - 0x2d0783, - 0x204d07, - 0x248d45, - 0x2e1cc9, - 0x231b83, - 0x233606, - 0x2c56c3, - 0xe1183, - 0x109686, - 0x60546, - 0x137c7, - 0x217546, - 0x222645, - 0x2cf187, - 0x2da587, - 0x54b32ec3, - 0x334a07, - 0x3642c3, - 0x3a2385, - 0x2964c4, - 0x32e3c8, - 0x2751cc, - 0x3a5745, - 0x2a2086, - 0x204bc7, - 0x37ef47, - 0x25b8c7, - 0x31f248, - 0x307ecf, - 0x2dfb85, - 0x243507, - 0x2394c7, - 0x2a9b0a, - 0x2d7e49, - 0x30bc85, - 0x32194a, - 0x1b06, - 0x2c5745, - 0x376284, - 0x289dc6, - 0x2f8cc7, - 0x242507, - 0x38cbc8, - 0x214185, - 0x248c46, - 0x20c545, - 0x387845, - 0x212c04, - 0x2e3f87, - 0x20900a, - 0x234d48, - 0x356946, - 0x2d603, - 0x2e0405, - 0x26c686, - 0x3a46c6, - 0x263b86, - 0x20fbc3, - 0x389247, - 0x239445, - 0x204ac3, - 0x2dd88d, - 0x20abc3, - 0x38ccc8, - 0x39a5c4, - 0x27ba85, - 0x2a9a06, - 0x2362c6, - 0x204587, - 0x2ae707, - 0x270b05, - 0x200383, - 0x27f2c7, - 0x329709, - 0x22b689, - 0x2f590a, - 0x24cd82, - 0x3a2344, - 0x2e76c4, - 0x261787, - 0x2278c8, - 0x2ef309, - 0x21f1c9, - 0x2f0487, - 0x303806, - 0xf22c6, - 0x2f39c4, - 0x2f3fca, - 0x2f6a08, - 0x2f6fc9, - 0x2bfe86, - 0x2b6ec5, - 0x234c08, - 0x2c9c4a, - 0x22c6c3, - 0x200786, - 0x2f0587, - 0x217f85, - 0x39a485, - 0x2717c3, - 0x258a04, - 0x36da85, - 0x288e47, - 0x2ffac5, - 0x2ed686, - 0xfff05, - 0x264a03, - 0x28b789, - 0x27b84c, - 0x2a7e0c, - 0x2d3bc8, - 0x3ade87, - 0x2fc8c8, - 0x2fcc0a, - 0x2fd84b, - 0x303488, - 0x33f408, - 0x2363c6, - 0x262685, - 0x200f4a, - 0x219545, - 0x205bc2, - 0x2c7a87, - 0x2a32c6, - 0x355ec5, - 0x38e989, - 0x26b785, - 0x285ec5, - 0x3a1f49, - 0x257cc6, - 0x3b1088, - 0x23e0c3, - 0x3b3306, - 0x27ac06, - 0x30ba85, - 0x30ba89, - 0x2bc289, - 0x24d0c7, - 0x10b904, - 0x30b907, - 0x21f0c9, - 0x23c905, - 0x4bbc8, - 0x3b3205, - 0x339505, - 0x376c89, - 0x205ac2, - 0x2e95c4, - 0x20d782, - 0x200b02, - 0x2ce985, - 0x30f748, - 0x2b9845, - 0x2c6fc3, - 0x2c6fc5, - 0x2d7543, - 0x210882, - 0x2e30c4, - 0x351903, - 0x204c82, - 0x35bb44, - 0x2e85c3, - 0x200e82, - 0x25e903, - 0x291704, - 0x2e7083, - 0x246f04, - 0x202602, - 0x21a903, - 0x215b43, - 0x206342, - 0x33c282, - 0x2bc0c9, - 0x202d82, - 0x28d304, - 0x201782, - 0x234a84, - 0x3037c4, - 0x2bcc44, - 0x2016c2, - 0x241a02, - 0x220883, - 0x225f83, - 0x387944, - 0x269e44, - 0x2bc484, - 0x2ce884, - 0x30b143, - 0x34f743, - 0x201a84, - 0x30d784, - 0x30e786, - 0x2e7782, - 0x20d1c2, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x204cc2, - 0x368883, - 0x2d0783, - 0x231b83, - 0x2001c3, - 0x332ec3, - 0x2964c4, - 0x2bc384, - 0x213184, - 0x204ac3, - 0x200383, + 0x209703, + 0x205503, + 0x21c2c3, + 0x200983, + 0x38d2c3, + 0x2a84c3, + 0x232403, + 0x209683, + 0x2163c3, + 0x277dc3, + 0x280b83, + 0x21c303, + 0x252c03, + 0x2e9dc3, + 0x3b1384, + 0x205503, + 0x200983, + 0x25ed03, + 0x352e84, + 0x231a03, + 0x30c3, + 0x228483, + 0x37a908, + 0x24f3c4, + 0x3b870a, + 0x2b8ec6, + 0x1b6a04, + 0x39b2c7, + 0x21e7ca, + 0x315bc9, + 0x3ab587, + 0x3b724a, + 0x38d2c3, + 0x2e678b, + 0x2b9fc9, + 0x2bd645, + 0x2d1fc7, + 0x99c2, + 0x2a84c3, + 0x205747, + 0x2e2b85, + 0x2dbdc9, + 0x232403, + 0x233c06, + 0x2c1a43, + 0xdb283, + 0x104e46, + 0x18ec46, + 0xe807, + 0x212e46, + 0x21b185, + 0x282407, + 0x2d5b87, + 0x56ae9dc3, + 0x336647, + 0x365e03, + 0x206a05, + 0x3b1384, + 0x220688, + 0x38644c, + 0x2ad745, + 0x29c986, + 0x205607, + 0x38b907, + 0x238347, + 0x245108, + 0x303b8f, + 0x315e05, + 0x23dcc7, + 0x26f287, + 0x2a3e0a, + 0x2d2809, + 0x304f85, + 0x30664a, + 0x82a06, + 0x2c1ac5, + 0x374b84, + 0x2843c6, + 0x2f1d47, + 0x2eaa07, + 0x3bb408, + 0x22dc85, + 0x2e2a86, + 0x214305, + 0x3adcc5, + 0x21c984, + 0x2af347, + 0x2081ca, + 0x334808, + 0x35ba86, + 0x27f83, + 0x2da905, + 0x25f906, + 0x3af246, + 0x392246, + 0x209703, + 0x388a07, + 0x26f205, + 0x205503, + 0x2d830d, + 0x204e83, + 0x3bb508, + 0x27f404, + 0x272fc5, + 0x2a3d06, + 0x234d46, + 0x368007, + 0x2a6ec7, + 0x267345, + 0x200983, + 0x21fbc7, + 0x2788c9, + 0x311a49, + 0x22708a, + 0x243002, + 0x2069c4, + 0x2e5084, + 0x390207, + 0x22cf88, + 0x2ea2c9, + 0x21eac9, + 0x2eaf47, + 0x2ba486, + 0xec286, + 0x2ed844, + 0x2ede4a, + 0x2f0d48, + 0x2f1189, + 0x2bdbc6, + 0x2b1445, + 0x3346c8, + 0x2c5f8a, + 0x22ed03, + 0x353006, + 0x2eb047, + 0x223ec5, + 0x3a5e05, + 0x264b83, + 0x250cc4, + 0x226605, + 0x281b07, + 0x2faf85, + 0x2ee346, + 0xfc605, + 0x247d83, + 0x357bc9, + 0x272d8c, + 0x29344c, + 0x2ced08, + 0x293087, + 0x2f7908, + 0x2f7c4a, + 0x2f888b, + 0x2ba108, + 0x234e48, + 0x239586, + 0x390d45, + 0x38da4a, + 0x3a6205, + 0x20b0c2, + 0x2c4647, + 0x25fe86, + 0x35c8c5, + 0x370809, + 0x2f39c5, + 0x27e985, + 0x2ddf09, + 0x351846, + 0x237e88, + 0x33f383, + 0x20f486, + 0x272146, + 0x306445, + 0x306449, + 0x2b6789, + 0x279ac7, + 0x109104, + 0x309107, + 0x21e9c9, + 0x238d05, + 0x413c8, + 0x3b2e85, + 0x330e85, + 0x380509, + 0x201702, + 0x25e544, + 0x201e82, + 0x203942, + 0x31ecc5, + 0x3b6788, + 0x2b3b85, + 0x2c3ac3, + 0x2c3ac5, + 0x2d2383, + 0x20f442, + 0x377804, + 0x2ac783, + 0x2056c2, + 0x379884, + 0x2e5d43, + 0x2082c2, + 0x2b3c03, + 0x28d084, + 0x2e4c83, + 0x248684, + 0x203082, + 0x218943, + 0x22ef03, + 0x200d02, + 0x361782, + 0x2b65c9, + 0x207842, + 0x288d04, + 0x203cc2, + 0x334544, + 0x2ba444, + 0x2b74c4, + 0x202dc2, + 0x2391c2, + 0x225bc3, + 0x2f8403, + 0x23d904, + 0x281c84, + 0x2eb1c4, + 0x2f0f04, + 0x30a483, + 0x26e543, + 0x282984, + 0x30a2c4, + 0x30aac6, + 0x22a282, + 0x2099c2, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x205702, + 0x38d2c3, + 0x2a84c3, + 0x232403, + 0x2007c3, + 0x2e9dc3, + 0x3b1384, + 0x2b6884, + 0x211cc4, + 0x205503, + 0x200983, + 0x201303, + 0x2ee644, + 0x31a403, + 0x2bd0c3, + 0x34ab84, + 0x3b2c86, + 0x202f03, + 0x16fc07, + 0x222403, + 0x2459c3, + 0x2b0543, + 0x206a43, + 0x227f83, + 0x2d6cc5, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x282c43, + 0x2a5143, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x244183, + 0x205503, + 0x23a504, + 0x200983, + 0x26bec4, + 0x2bf145, + 0x16fc07, + 0x2099c2, + 0x2006c2, + 0x20d882, + 0x200c82, + 0x200442, + 0x2a84c3, + 0x235ac4, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x211cc4, + 0x205503, + 0x200983, + 0x214843, + 0x25ef44, + 0x16d208, + 0x2a84c3, + 0x204e83, + 0x169c3, + 0x2030c4, + 0x16d208, + 0x2a84c3, + 0x249944, + 0x3b1384, + 0x204e83, + 0x203ec2, + 0x200983, + 0x23e743, + 0x50cc4, + 0x373605, + 0x20b0c2, + 0x30a403, + 0x205702, + 0x16d208, + 0x2099c2, + 0x232403, + 0x2e9dc3, + 0x201fc2, + 0x200983, + 0x205702, + 0x1b7407, + 0x12e3c9, + 0x6f83, + 0x16d208, + 0x18ebc3, + 0x5a31fd87, + 0xa84c3, + 0x708, + 0x232403, + 0x2e9dc3, + 0x1ae886, + 0x244183, + 0x8f2c8, + 0xc0e08, + 0x41a46, + 0x209703, + 0xca988, + 0xb1b43, + 0xdf145, + 0x32607, + 0x8003, + 0x174c0a, + 0x11ed83, + 0x308d44, + 0x10398b, + 0x103f48, + 0x8d742, + 0x205702, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x2d5f04, + 0x2e9dc3, + 0x244183, + 0x209703, + 0x205503, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x227f83, + 0x205503, + 0x200983, 0x21aa03, - 0x2f4684, - 0x32f983, - 0x2bf3c3, - 0x345184, - 0x3b3006, - 0x211503, - 0x13ecc7, - 0x234fc3, - 0x23a943, - 0x2b6703, - 0x265383, - 0x22d603, - 0x2db6c5, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x2ed143, - 0x2ab343, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204303, - 0x204ac3, - 0x23ee04, - 0x200383, - 0x26a104, - 0x2c2d45, - 0x13ecc7, - 0x20d1c2, - 0x2000c2, - 0x208a42, - 0x202082, - 0x200382, - 0x2d0783, - 0x23a184, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x213184, - 0x204ac3, - 0x200383, - 0x213e83, - 0x24ae04, - 0x15f048, - 0x2d0783, - 0x20abc3, - 0x1a5c3, - 0x24fe44, - 0x15f048, - 0x2d0783, - 0x251304, - 0x2964c4, - 0x20abc3, - 0x201882, - 0x200383, - 0x2202c3, - 0x58a04, - 0x370145, - 0x205bc2, - 0x30d8c3, - 0x204cc2, - 0x15f048, - 0x20d1c2, - 0x231b83, - 0x332ec3, - 0x201d42, - 0x200383, - 0x204cc2, - 0x15f048, - 0x231b83, - 0x332ec3, - 0x204303, - 0x20fbc3, - 0x30b544, - 0x204cc2, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x2da904, - 0x332ec3, - 0x204303, - 0x20fbc3, - 0x204ac3, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x22d603, - 0x204ac3, - 0x200383, - 0x26a103, - 0x213e83, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x1a5c3, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x2964c4, - 0x22d603, - 0x204ac3, - 0x200383, - 0x217082, + 0x214843, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x169c3, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x3b1384, + 0x227f83, + 0x205503, + 0x200983, + 0x212982, 0x200141, - 0x204cc2, + 0x205702, 0x200001, - 0x31f542, - 0x15f048, - 0x21d105, + 0x320b82, + 0x16d208, + 0x21d445, + 0x201ec1, + 0xa84c3, 0x200701, - 0xd0783, - 0x200101, - 0x2000c1, - 0x201e41, - 0x29da82, - 0x36da04, - 0x372a43, + 0x200301, + 0x200081, + 0x298602, + 0x36c044, + 0x384383, 0x200181, - 0x200941, + 0x200401, 0x200041, - 0x200081, - 0x2ed7c7, - 0x2eeccf, - 0x2fc146, - 0x201481, - 0x289786, - 0x200c01, - 0x2002c1, - 0x33168e, - 0x200381, - 0x200383, + 0x200101, + 0x2e9907, + 0x2eab8f, + 0x340446, + 0x200281, + 0x37f6c6, 0x200e81, - 0x279e45, - 0x210582, - 0x2716c5, - 0x2003c1, + 0x2008c1, + 0x332a0e, + 0x200441, + 0x200983, + 0x201301, + 0x270e85, + 0x20f942, + 0x264a85, + 0x200341, + 0x200801, + 0x2002c1, + 0x20b0c2, + 0x2000c1, 0x200201, - 0x200241, - 0x205bc2, - 0x200a01, - 0x201a81, + 0x200bc1, 0x2005c1, - 0x2007c1, - 0x200cc1, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x21bd03, - 0x2d0783, - 0x332ec3, - 0x91d48, - 0x20fbc3, - 0x204ac3, - 0x48803, - 0x200383, - 0x14ebc48, - 0x15f048, - 0x4dcc4, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x204ac3, - 0x200383, - 0x205283, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x2da904, - 0x200383, - 0x293ac5, - 0x343984, - 0x2d0783, - 0x204ac3, - 0x200383, - 0x16b18a, - 0x20d1c2, - 0x2d0783, - 0x22f489, - 0x231b83, - 0x2d2389, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x2f37c8, - 0x226647, - 0x370145, - 0x3a7f87, - 0x26b0cb, - 0x215cc8, - 0x32eac9, - 0x228087, - 0x200108, - 0x36f906, - 0x2344c7, - 0x29c108, - 0x2ab806, - 0x31d407, - 0x2aa449, - 0x2ba749, - 0x2c2ac6, - 0x2c38c5, - 0x2cce08, - 0x2b4783, - 0x2d7c88, - 0x231d87, - 0x206583, - 0x31d287, - 0x217905, - 0x2eeb08, - 0x359105, - 0x2cea43, - 0x23c289, - 0x2b0e87, - 0x35d504, - 0x2ff244, - 0x307ccb, - 0x308288, - 0x309587, - 0x2d0783, - 0x231b83, - 0x2135c3, - 0x200383, - 0x236ec3, - 0x332ec3, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x77fcb, - 0x204cc2, - 0x20d1c2, - 0x200383, - 0x15f048, - 0x204cc2, - 0x20d1c2, - 0x208a42, - 0x201d42, - 0x203cc2, - 0x204ac3, - 0x200382, - 0x204cc2, - 0x368883, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x208a42, - 0x332ec3, - 0x204303, - 0x20fbc3, - 0x213184, - 0x204ac3, - 0x2183c3, - 0x200383, - 0x30b544, - 0x24abc3, - 0x332ec3, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x20abc3, - 0x200383, - 0x39db07, - 0x2d0783, - 0x26e5c7, - 0x362a86, - 0x215ac3, - 0x2041c3, - 0x332ec3, - 0x209e43, - 0x2964c4, - 0x38b704, - 0x30dbc6, + 0x201cc1, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x219503, + 0x2a84c3, + 0x2e9dc3, + 0x8d688, + 0x209703, + 0x205503, + 0x20803, + 0x200983, + 0x14e7e88, + 0x16d208, + 0x44e04, + 0x14e7e8a, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x205503, + 0x200983, + 0x2030c3, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2d5f04, + 0x200983, + 0x27a305, + 0x33b804, + 0x2a84c3, + 0x205503, + 0x200983, + 0x225ca, + 0xd5284, + 0x10c9c6, + 0x2099c2, + 0x2a84c3, + 0x230309, + 0x232403, + 0x3034c9, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x2ed648, + 0x22ca47, + 0x373605, + 0x18ed88, + 0x1b7407, + 0x2d20a, + 0xecb, + 0x4ab87, + 0x3d2c8, + 0x1b1b8a, + 0x10a48, + 0x12e3c9, + 0x264c7, + 0x3be87, + 0x152b08, + 0x708, + 0x3df8f, + 0x11d85, + 0xa07, + 0x1ae886, + 0x137607, + 0x3d586, + 0x8f2c8, + 0xa5606, + 0x151647, + 0x19c9, + 0x1aa1c7, + 0xa46c9, + 0xb4a09, + 0xbeec6, + 0xc0e08, + 0xbfcc5, + 0x4eb4a, + 0xca988, + 0xb1b43, + 0xd2648, + 0x32607, + 0x6d505, + 0x69c50, + 0x8003, + 0x1aa047, + 0x15ec5, + 0xe9748, + 0x13ce05, + 0x11ed83, + 0x6fd48, + 0xcd46, + 0x42849, + 0xaa147, + 0x6fa0b, + 0x14ac44, + 0xfa544, + 0x10398b, + 0x103f48, + 0x104d47, + 0x129845, + 0x2a84c3, + 0x232403, + 0x2163c3, + 0x200983, + 0x22a403, + 0x2e9dc3, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x43f8b, + 0x205702, + 0x2099c2, + 0x200983, + 0x16d208, + 0x205702, + 0x2099c2, + 0x20d882, + 0x201fc2, + 0x203d02, + 0x205503, + 0x200442, + 0x205702, + 0x38d2c3, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x20d882, + 0x2e9dc3, + 0x244183, + 0x209703, + 0x211cc4, + 0x205503, + 0x216b03, + 0x200983, + 0x308d44, + 0x25ed03, + 0x2e9dc3, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x204e83, + 0x200983, + 0x39f847, + 0x2a84c3, + 0x2614c7, + 0x2c7ac6, + 0x219203, + 0x218343, + 0x2e9dc3, + 0x2143c3, + 0x3b1384, + 0x37ef04, + 0x31ea46, + 0x20d143, + 0x205503, + 0x200983, + 0x27a305, + 0x318284, + 0x3b2a43, + 0x38b743, + 0x2c4647, + 0x33e885, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x28e87, + 0x205942, + 0x287003, + 0x2bf143, + 0x38d2c3, + 0x626a84c3, + 0x202242, + 0x232403, + 0x2032c3, + 0x2e9dc3, + 0x3b1384, + 0x353903, + 0x315e03, + 0x209703, + 0x211cc4, + 0x62a04642, + 0x205503, + 0x200983, + 0x2082c3, + 0x229543, + 0x212982, + 0x25ed03, + 0x16d208, + 0x2e9dc3, + 0x169c3, + 0x26f744, + 0x38d2c3, + 0x2099c2, + 0x2a84c3, + 0x235ac4, + 0x232403, + 0x2e9dc3, + 0x3b1384, + 0x244183, + 0x282104, + 0x210444, + 0x2d43c6, + 0x211cc4, + 0x205503, + 0x200983, 0x201303, - 0x204ac3, - 0x200383, - 0x293ac5, - 0x318244, - 0x369dc3, - 0x37ed83, - 0x2c7a87, - 0x2387c5, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x203782, - 0x3ae343, - 0x2c2d43, - 0x368883, - 0x5fed0783, - 0x209c02, - 0x231b83, - 0x202743, - 0x332ec3, - 0x2964c4, - 0x23a0c3, - 0x2dfb83, - 0x20fbc3, - 0x213184, - 0x6020c002, - 0x204ac3, - 0x200383, - 0x209103, - 0x229b03, - 0x217082, - 0x24abc3, - 0x15f048, - 0x332ec3, - 0x1a5c3, - 0x2957c4, - 0x368883, - 0x20d1c2, - 0x2d0783, - 0x23a184, - 0x231b83, - 0x332ec3, - 0x2964c4, - 0x204303, - 0x2cee84, - 0x222044, - 0x201686, - 0x213184, - 0x204ac3, - 0x200383, - 0x21aa03, - 0x2a32c6, - 0x3ddcb, - 0x28b86, - 0x4aa0a, - 0x10adca, - 0x15f048, - 0x20c504, - 0x2d0783, - 0x368844, - 0x231b83, - 0x256bc4, - 0x332ec3, - 0x262fc3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x32e84b, - 0x39f84a, - 0x3b478c, - 0x204cc2, - 0x20d1c2, - 0x208a42, - 0x2b0405, - 0x2964c4, - 0x201f02, - 0x20fbc3, - 0x222044, - 0x202082, - 0x200382, - 0x20c4c2, - 0x217082, - 0x168883, - 0xd882, - 0x2b2409, - 0x259f88, - 0x332d49, - 0x234309, - 0x23b18a, - 0x24550a, - 0x20a182, - 0x21c402, - 0xd1c2, - 0x2d0783, - 0x220802, - 0x2436c6, - 0x356fc2, - 0x20a542, - 0x21ad8e, - 0x21a94e, - 0x281a47, - 0x204a47, - 0x221202, - 0x231b83, - 0x332ec3, - 0x20b502, - 0x201d42, - 0x4143, - 0x24058f, - 0x26b142, - 0x362cc7, - 0x2fa1c7, - 0x39d487, - 0x31e28c, - 0x364d0c, - 0x202444, - 0x283b0a, - 0x21a882, - 0x201b02, - 0x2bc744, - 0x22b1c2, - 0x2c5c02, - 0x364f44, - 0x2184c2, - 0x205d82, - 0x5d83, - 0x2ab887, - 0x33d885, - 0x2073c2, - 0x240504, - 0x373102, - 0x2df088, - 0x204ac3, - 0x203808, - 0x203ac2, - 0x232d85, - 0x203ac6, - 0x200383, - 0x206ec2, - 0x2ef547, - 0x10582, - 0x350845, - 0x31d185, - 0x207c82, - 0x236b82, - 0x3a860a, - 0x27098a, - 0x212bc2, - 0x353f84, - 0x2018c2, - 0x3a2208, - 0x219682, - 0x2a2588, - 0x304987, - 0x304c89, - 0x2037c2, - 0x309e45, - 0x247e85, - 0x21424b, - 0x2ca84c, - 0x22c208, - 0x3186c8, - 0x2e7782, - 0x204642, - 0x204cc2, - 0x15f048, - 0x20d1c2, - 0x2d0783, - 0x208a42, - 0x202082, - 0x200382, - 0x200383, - 0x20c4c2, - 0x204cc2, - 0x6260d1c2, - 0x62b32ec3, - 0x205d83, - 0x201f02, - 0x204ac3, - 0x3a8fc3, - 0x200383, - 0x2ec383, - 0x273d06, - 0x1613e83, - 0x15f048, - 0x63c85, - 0xae2cd, - 0xaafca, - 0x6ebc7, - 0x63201b82, - 0x63601442, - 0x63a00f82, - 0x63e02e02, - 0x642125c2, - 0x6460e542, - 0x13ecc7, - 0x64a0d1c2, - 0x64e0e482, - 0x6520fe42, - 0x65603b02, - 0x21a943, - 0x102c4, - 0x220a43, - 0x65a14002, - 0x65e023c2, - 0x51847, - 0x66214502, - 0x66600b82, - 0x66a00542, - 0x66e0a3c2, - 0x67202282, - 0x67601d42, - 0xbe445, - 0x221443, - 0x3b3bc4, - 0x67a2b1c2, - 0x67e42682, - 0x68202682, - 0x7e5cb, - 0x68600c02, - 0x68e513c2, - 0x69201f02, - 0x69603cc2, - 0x69a0bcc2, - 0x69e05f02, - 0x6a20b602, - 0x6a673fc2, - 0x6aa0c002, - 0x6ae04a02, - 0x6b202082, - 0x6b603702, - 0x6ba12982, - 0x6be31302, - 0x94fc4, - 0x358183, - 0x6c2126c2, - 0x6c61a582, - 0x6ca098c2, - 0x6ce00982, - 0x6d200382, - 0x6d604c82, - 0x78147, - 0x6da054c2, - 0x6de05502, - 0x6e20c4c2, - 0x6e609f42, - 0x19de4c, - 0x6ea22e82, - 0x6ee79242, - 0x6f200a02, - 0x6f606602, - 0x6fa019c2, - 0x6fe3b302, - 0x70206d02, - 0x70613882, - 0x70a7af82, - 0x70e43e02, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x75c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x68a3a0c3, - 0x2075c3, - 0x2db744, - 0x259e86, - 0x2f74c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x20d882, - 0x23a0c3, - 0x2075c3, + 0x25fe86, + 0x13f08b, + 0x1cdc6, + 0x5eb4a, + 0x107e4a, + 0x16d208, + 0x2142c4, + 0x63ea84c3, + 0x38d284, + 0x232403, + 0x256e84, + 0x2e9dc3, + 0x391683, + 0x209703, + 0x205503, + 0x200983, + 0x56243, + 0x32f78b, + 0x3a140a, + 0x3b9bcc, + 0xda688, + 0x205702, + 0x2099c2, 0x20d882, + 0x2a9305, + 0x3b1384, + 0x202342, + 0x209703, + 0x210444, + 0x200c82, + 0x200442, + 0x209842, + 0x212982, + 0x18d2c3, + 0x19f02, + 0x2a1cc9, + 0x25d548, + 0x309a89, + 0x337449, + 0x23490a, + 0x23634a, + 0x20cc02, + 0x21b102, + 0x99c2, + 0x2a84c3, + 0x204682, + 0x23de86, + 0x35d882, + 0x201242, + 0x20124e, + 0x21898e, + 0x27b107, + 0x205487, + 0x275d02, + 0x232403, + 0x2e9dc3, + 0x200042, + 0x201fc2, + 0x4a5c3, + 0x2eec0f, + 0x200f42, + 0x32c787, + 0x2c7d07, + 0x2d3907, + 0x2ad24c, + 0x3151cc, + 0x3a3a44, + 0x27c6ca, + 0x2188c2, + 0x20be02, + 0x2b6fc4, + 0x2226c2, + 0x2c2702, + 0x315404, + 0x20cec2, + 0x200282, + 0x6343, + 0x2a5687, + 0x2352c5, + 0x201f42, + 0x2eeb84, + 0x352bc2, + 0x2da248, + 0x205503, + 0x3b0208, + 0x200d42, + 0x233385, + 0x3b04c6, + 0x200983, + 0x20ba02, + 0x2ea507, + 0xf942, + 0x26b005, + 0x3a9f45, + 0x201642, + 0x242b02, + 0x3b7a8a, + 0x2671ca, + 0x202c42, + 0x2e4744, + 0x2002c2, + 0x206888, + 0x201c82, + 0x30a848, + 0x2feb47, + 0x2ff649, + 0x26b082, + 0x305645, + 0x33bc85, + 0x22dd4b, + 0x2c6c4c, + 0x22e848, + 0x3188c8, + 0x22a282, + 0x35f782, + 0x205702, + 0x16d208, + 0x2099c2, + 0x2a84c3, 0x20d882, - 0x23a0c3, - 0x2075c3, - 0x716d0783, - 0x231b83, - 0x329e83, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x15f048, - 0x20d1c2, - 0x2d0783, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x24fe44, - 0x20d1c2, - 0x2d0783, - 0x3303c3, - 0x231b83, - 0x251304, - 0x2135c3, - 0x332ec3, - 0x2964c4, - 0x204303, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x2202c3, - 0x370145, - 0x2b2703, - 0x24abc3, - 0x20d1c2, - 0x2d0783, - 0x23a0c3, - 0x204ac3, - 0x200383, - 0x204cc2, - 0x368883, - 0x15f048, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x22e886, - 0x2964c4, - 0x204303, - 0x213184, - 0x204ac3, - 0x200383, - 0x21aa03, - 0x2d0783, - 0x231b83, - 0x204ac3, - 0x200383, - 0x2d0783, - 0x28b86, - 0x231b83, - 0x332ec3, - 0xe1946, - 0x204ac3, - 0x200383, - 0x315cc8, - 0x318509, - 0x327a09, - 0x332548, - 0x37d888, - 0x37d889, - 0x9da85, - 0x204cc2, - 0x238605, - 0x205d43, - 0x7420d1c2, - 0x231b83, - 0x332ec3, - 0x33e387, - 0x265383, - 0x20fbc3, - 0x204ac3, - 0x2104c3, - 0x212483, - 0x20abc3, - 0x200383, - 0x241f46, - 0x205bc2, - 0x24abc3, - 0x15f048, - 0x204cc2, - 0x368883, - 0x20d1c2, - 0x2d0783, - 0x231b83, - 0x332ec3, - 0x2964c4, - 0x20fbc3, - 0x204ac3, - 0x200383, - 0x213e83, - 0x153ca46, + 0x200c82, + 0x200442, + 0x200983, + 0x209842, + 0x205702, + 0x652099c2, + 0x656e9dc3, + 0x206343, + 0x202342, + 0x205503, + 0x375cc3, + 0x200983, + 0x2e87c3, + 0x275d46, + 0x1614843, + 0x16d208, + 0x192345, + 0xa6a8d, + 0xa4dca, + 0x65c87, + 0x65e011c2, + 0x66200242, + 0x66600ec2, + 0x66a00c02, + 0x66e0de02, + 0x67201ec2, + 0x16fc07, + 0x676099c2, + 0x67a301c2, + 0x67e09982, + 0x68200dc2, + 0x218983, + 0x9e04, + 0x225d83, + 0x686149c2, + 0x68a00182, + 0x49f47, + 0x68e03002, + 0x69202e42, + 0x69600b42, + 0x69a02bc2, + 0x69e029c2, + 0x6a201fc2, + 0xb3985, + 0x234543, + 0x202b84, + 0x6a6226c2, + 0x6aa03a82, + 0x6ae03202, + 0x16c90b, + 0x6b200e82, + 0x6ba49a02, + 0x6be02342, + 0x6c203d02, + 0x6c60f242, + 0x6ca0ec42, + 0x6ce0e602, + 0x6d2675c2, + 0x6d604642, + 0x6da01b42, + 0x6de00c82, + 0x6e2042c2, + 0x6e61c702, + 0x6ea00e42, + 0x7f1c4, + 0x350703, + 0x6ee33082, + 0x6f216982, + 0x6f603402, + 0x6fa089c2, + 0x6fe00442, + 0x702056c2, + 0x44107, + 0x70601302, + 0x70a07302, + 0x70e09842, + 0x71218942, + 0xf484c, + 0x71621c82, + 0x71a3ab02, + 0x71e11602, + 0x72201682, + 0x72601f82, + 0x72a34a82, + 0x72e00202, + 0x7320e8c2, + 0x736724c2, + 0x73a56642, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0xa203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x6b753903, + 0x20a203, + 0x2d6d44, + 0x25d446, + 0x2f1743, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x353903, + 0x20a203, + 0x219f02, + 0x219f02, + 0x353903, + 0x20a203, + 0x742a84c3, + 0x232403, + 0x37ac03, + 0x209703, + 0x205503, + 0x200983, + 0x16d208, + 0x2099c2, + 0x2a84c3, + 0x205503, + 0x200983, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x209703, + 0x205503, + 0x200983, + 0x2030c4, + 0x2099c2, + 0x2a84c3, + 0x2028c3, + 0x232403, + 0x249944, + 0x2163c3, + 0x2e9dc3, + 0x3b1384, + 0x244183, + 0x209703, + 0x205503, + 0x200983, + 0x23e743, + 0x373605, + 0x2a1fc3, + 0x25ed03, + 0x2099c2, + 0x2a84c3, + 0x353903, + 0x205503, + 0x200983, + 0x205702, + 0x38d2c3, + 0x16d208, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x22f706, + 0x3b1384, + 0x244183, + 0x211cc4, + 0x205503, + 0x200983, + 0x201303, + 0x2a84c3, + 0x232403, + 0x205503, + 0x200983, + 0x14bb147, + 0x2a84c3, + 0x1cdc6, + 0x232403, + 0x2e9dc3, + 0xdba46, + 0x205503, + 0x200983, + 0x3149c8, + 0x318709, + 0x328b89, + 0x333808, + 0x37dc48, + 0x37dc49, + 0x24318d, + 0x2ee80f, + 0x251490, + 0x34848d, + 0x3638cc, + 0x37f98b, + 0x98605, + 0x205702, + 0x33e6c5, + 0x200243, + 0x772099c2, + 0x232403, + 0x2e9dc3, + 0x343ec7, + 0x206a43, + 0x209703, + 0x205503, + 0x21c2c3, + 0x20dcc3, + 0x204e83, + 0x200983, + 0x2efec6, + 0x20b0c2, + 0x25ed03, + 0x16d208, + 0x205702, + 0x38d2c3, + 0x2099c2, + 0x2a84c3, + 0x232403, + 0x2e9dc3, + 0x3b1384, + 0x209703, + 0x205503, + 0x200983, + 0x214843, + 0x14f53c6, + 0x205702, + 0x2099c2, + 0x2e9dc3, + 0x209703, + 0x200983, } // children is the list of nodes' children, the parent's wildcard bit and the @@ -8623,442 +8770,409 @@ 0x40000000, 0x50000000, 0x60000000, - 0x1860612, - 0x1864618, - 0x1884619, - 0x19e0621, + 0x184c60d, + 0x1850613, + 0x1870614, + 0x19cc61c, + 0x19e0673, 0x19f4678, - 0x1a0867d, - 0x1a18682, - 0x1a34686, - 0x1a3868d, - 0x1a5068e, - 0x1a74694, - 0x1a7869d, - 0x1a9069e, - 0x1a946a4, - 0x1a986a5, - 0x1ac06a6, - 0x1ac46b0, - 0x21acc6b1, - 0x1b146b3, - 0x1b186c5, - 0x1b386c6, - 0x1b4c6ce, - 0x1b506d3, - 0x1b806d4, - 0x1b9c6e0, - 0x1bc46e7, - 0x1bd06f1, - 0x1bd46f4, - 0x1c686f5, - 0x1c7c71a, - 0x1c9071f, - 0x1cc0724, - 0x1cd0730, - 0x1ce4734, - 0x1d08739, - 0x1e20742, - 0x1e24788, - 0x1e90789, - 0x1ea47a4, - 0x1eb87a9, - 0x1ec07ae, - 0x1ed07b0, - 0x1ed47b4, - 0x1eec7b5, - 0x1f347bb, - 0x1f4c7cd, - 0x1f507d3, + 0x1a0467d, + 0x1a20681, + 0x1a24688, + 0x1a3c689, + 0x1a6468f, + 0x1a68699, + 0x1a8069a, + 0x1a846a0, + 0x1a886a1, + 0x1ab06a2, + 0x1ab46ac, + 0x21abc6ad, + 0x1b046af, + 0x1b086c1, + 0x1b286c2, + 0x1b3c6ca, + 0x1b406cf, + 0x1b706d0, + 0x1b8c6dc, + 0x1bb46e3, + 0x1bc06ed, + 0x1bc46f0, + 0x1c5c6f1, + 0x1c70717, + 0x1c8471c, + 0x1cb4721, + 0x1cc472d, + 0x1cd8731, + 0x1cfc736, + 0x1e3473f, + 0x1e3878d, + 0x1ea478e, + 0x1f107a9, + 0x1f247c4, + 0x1f387c9, + 0x1f407ce, + 0x1f507d0, 0x1f547d4, - 0x1f5c7d5, - 0x1f987d7, - 0x61f9c7e6, - 0x1fb07e7, - 0x1fbc7ec, - 0x1fc07ef, - 0x1fd07f0, - 0x20807f4, - 0x2084820, - 0x22090821, - 0x22098824, - 0x20cc826, - 0x20d0833, - 0x2514834, - 0x225ac945, - 0x225b096b, - 0x225b496c, - 0x225c096d, - 0x225c4970, - 0x225d0971, - 0x225d4974, - 0x225d8975, - 0x225dc976, - 0x225e0977, - 0x225e4978, - 0x225f0979, - 0x225f497c, - 0x2260097d, - 0x22604980, - 0x22608981, - 0x2260c982, - 0x22610983, - 0x22614984, - 0x2618985, - 0x2261c986, - 0x22628987, - 0x2262c98a, - 0x263498b, - 0x2264498d, - 0x22648991, - 0x2654992, - 0x22658995, - 0x265c996, + 0x1f6c7d5, + 0x1fb87db, + 0x1fd47ee, + 0x1fd87f5, + 0x1fdc7f6, + 0x1fe87f7, + 0x20247fa, + 0x62028809, + 0x203c80a, + 0x205080f, + 0x2054814, + 0x2064815, + 0x2114819, + 0x2118845, + 0x22124846, + 0x2212c849, + 0x216484b, + 0x2168859, + 0x25b885a, + 0x2265896e, + 0x2265c996, 0x22660997, - 0x267c998, - 0x269499f, - 0x26989a5, - 0x26a89a6, - 0x26b09aa, - 0x26e49ac, - 0x26e89b9, - 0x26f89ba, - 0x27909be, - 0x227949e4, - 0x279c9e5, - 0x27a09e7, - 0x27b89e8, - 0x27cc9ee, - 0x27f49f3, - 0x28149fd, - 0x2844a05, - 0x286ca11, + 0x2266c998, + 0x2267099b, + 0x2267c99c, + 0x2268099f, + 0x226849a0, + 0x226889a1, + 0x2268c9a2, + 0x226909a3, + 0x2269c9a4, + 0x226a09a7, + 0x226ac9a8, + 0x226b09ab, + 0x226b49ac, + 0x226b89ad, + 0x226c49ae, + 0x226c89b1, + 0x226cc9b2, + 0x226d09b3, + 0x26d49b4, + 0x226d89b5, + 0x226e49b6, + 0x226e89b9, + 0x26f09ba, + 0x227089bc, + 0x2270c9c2, + 0x27189c3, + 0x2271c9c6, + 0x27209c7, + 0x227249c8, + 0x27409c9, + 0x27589d0, + 0x275c9d6, + 0x276c9d7, + 0x27749db, + 0x27a89dd, + 0x27ac9ea, + 0x27bc9eb, + 0x28609ef, + 0x22864a18, + 0x286ca19, 0x2870a1b, - 0x2894a1c, - 0x2898a25, - 0x28aca26, - 0x28b0a2b, - 0x28b4a2c, - 0x28d4a2d, - 0x28eca35, - 0x28f0a3b, - 0x228f4a3c, - 0x28f8a3d, - 0x2908a3e, - 0x290ca42, - 0x2984a43, - 0x29a0a61, - 0x29aca68, - 0x29c0a6b, - 0x29d8a70, - 0x29eca76, - 0x2a04a7b, - 0x2a1ca81, - 0x2a34a87, - 0x2a50a8d, - 0x2a68a94, - 0x2ac8a9a, + 0x2888a1c, + 0x289ca22, + 0x28c4a27, + 0x28e4a31, + 0x2914a39, + 0x293ca45, + 0x2940a4f, + 0x2964a50, + 0x2968a59, + 0x297ca5a, + 0x2980a5f, + 0x2984a60, + 0x29a4a61, + 0x29c0a69, + 0x29c4a70, + 0x229c8a71, + 0x29cca72, + 0x29d0a73, + 0x29e0a74, + 0x29e4a78, + 0x2a5ca79, + 0x2a78a97, + 0x2a88a9e, + 0x2a9caa2, + 0x2ab4aa7, + 0x2ac8aad, 0x2ae0ab2, 0x2ae4ab8, - 0x2af8ab9, - 0x2b3cabe, - 0x2bbcacf, - 0x2be8aef, - 0x2becafa, - 0x2bf4afb, - 0x2c14afd, - 0x2c18b05, - 0x2c38b06, - 0x2c40b0e, - 0x2c78b10, - 0x2cb8b1e, - 0x2cbcb2e, - 0x2d0cb2f, - 0x2d10b43, - 0x22d14b44, - 0x2d2cb45, - 0x2d50b4b, - 0x2d70b54, - 0x3334b5c, - 0x3340ccd, - 0x3360cd0, - 0x351ccd8, - 0x35ecd47, - 0x365cd7b, - 0x36b4d97, - 0x379cdad, - 0x37f4de7, - 0x3830dfd, - 0x392ce0c, - 0x39f8e4b, - 0x3a90e7e, - 0x3b20ea4, - 0x3b84ec8, - 0x3dbcee1, - 0x3e74f6f, - 0x3f40f9d, - 0x3f8cfd0, - 0x4014fe3, - 0x4051005, - 0x40a1014, - 0x4119028, - 0x6411d046, - 0x64121047, - 0x64125048, - 0x41a1049, - 0x41fd068, - 0x427907f, - 0x42f109e, - 0x43710bc, - 0x43dd0dc, - 0x45090f7, - 0x4561142, - 0x64565158, - 0x45fd159, - 0x468517f, - 0x46d11a1, - 0x47391b4, - 0x47e11ce, - 0x48a91f8, - 0x491122a, - 0x4a25244, - 0x64a29289, - 0x64a2d28a, - 0x4a8928b, - 0x4ae52a2, - 0x4b752b9, - 0x4bf12dd, - 0x4c352fc, - 0x4d1930d, - 0x4d4d346, - 0x4dad353, - 0x4e2136b, - 0x4ea9388, - 0x4ee93aa, - 0x4f593ba, - 0x64f5d3d6, - 0x64f613d7, - 0x24f653d8, - 0x4f7d3d9, - 0x4f993df, - 0x4fdd3e6, - 0x4fed3f7, - 0x50053fb, - 0x507d401, - 0x508541f, - 0x5099421, - 0x50b1426, - 0x50d942c, - 0x50dd436, - 0x50e5437, - 0x50f9439, - 0x511543e, - 0x5119445, - 0x5121446, - 0x515d448, - 0x5171457, + 0x2afcab9, + 0x2b14abf, + 0x2b30ac5, + 0x2b48acc, + 0x2ba8ad2, + 0x2bc0aea, + 0x2bc4af0, + 0x2bd8af1, + 0x2c1caf6, + 0x2c9cb07, + 0x2cc8b27, + 0x2cccb32, + 0x2cd4b33, + 0x2cf4b35, + 0x2cf8b3d, + 0x2d18b3e, + 0x2d20b46, + 0x2d5cb48, + 0x2d9cb57, + 0x2da0b67, + 0x2e00b68, + 0x2e04b80, + 0x22e08b81, + 0x2e20b82, + 0x2e44b88, + 0x2e64b91, + 0x3428b99, + 0x3434d0a, + 0x3454d0d, + 0x3610d15, + 0x36e0d84, + 0x3750db8, + 0x37a8dd4, + 0x3890dea, + 0x38e8e24, + 0x3924e3a, + 0x3a20e49, + 0x3aece88, + 0x3b84ebb, + 0x3c14ee1, + 0x3c78f05, + 0x3eb0f1e, + 0x3f68fac, + 0x4034fda, + 0x408100d, + 0x4109020, + 0x4145042, + 0x4195051, + 0x420d065, + 0x64211083, + 0x64215084, + 0x64219085, + 0x4295086, + 0x42f10a5, + 0x436d0bc, + 0x43e50db, + 0x44650f9, + 0x44d1119, + 0x45fd134, + 0x465517f, + 0x64659195, + 0x46f1196, + 0x47791bc, + 0x47c51de, + 0x482d1f1, + 0x48d520b, + 0x499d235, + 0x4a05267, + 0x4b19281, + 0x64b1d2c6, + 0x64b212c7, + 0x4b7d2c8, + 0x4bd92df, + 0x4c692f6, + 0x4ce531a, + 0x4d29339, + 0x4e0d34a, + 0x4e41383, + 0x4ea1390, + 0x4f153a8, + 0x4f9d3c5, + 0x4fdd3e7, + 0x504d3f7, + 0x65051413, + 0x65055414, + 0x25059415, + 0x5071416, + 0x508d41c, + 0x50d1423, + 0x50e1434, + 0x50f9438, + 0x517143e, 0x517945c, - 0x518145e, - 0x5185460, - 0x51a9461, - 0x51cd46a, - 0x51e5473, - 0x51e9479, - 0x51f147a, - 0x51f547c, - 0x524d47d, - 0x5271493, - 0x529149c, - 0x52ad4a4, - 0x52bd4ab, - 0x52d14af, - 0x52d54b4, - 0x52dd4b5, - 0x52f14b7, - 0x53014bc, - 0x53054c0, - 0x53214c1, - 0x5bb14c8, - 0x5be96ec, - 0x5c156fa, - 0x5c2d705, - 0x5c4d70b, - 0x5c6d713, - 0x5cb171b, - 0x5cb972c, - 0x25cbd72e, - 0x25cc172f, - 0x5cc5730, - 0x5e01731, - 0x25e05780, - 0x25e11781, - 0x25e19784, - 0x25e25786, - 0x5e29789, - 0x5e2d78a, - 0x5e5578b, - 0x5e7d795, - 0x5e8179f, - 0x5eb97a0, - 0x5ecd7ae, - 0x6a257b3, - 0x6a29a89, - 0x6a2da8a, - 0x26a31a8b, - 0x6a35a8c, - 0x26a39a8d, - 0x6a3da8e, - 0x26a49a8f, - 0x6a4da92, - 0x6a51a93, - 0x26a55a94, - 0x6a59a95, - 0x26a61a96, - 0x6a65a98, - 0x6a69a99, - 0x26a79a9a, - 0x6a7da9e, - 0x6a81a9f, - 0x6a85aa0, - 0x6a89aa1, - 0x26a8daa2, - 0x6a91aa3, - 0x6a95aa4, - 0x6a99aa5, - 0x6a9daa6, - 0x26aa5aa7, - 0x6aa9aa9, - 0x6aadaaa, - 0x6ab1aab, - 0x26ab5aac, - 0x6ab9aad, - 0x26ac1aae, - 0x26ac5ab0, - 0x6ae1ab1, - 0x6aedab8, - 0x6b2dabb, - 0x6b31acb, - 0x6b55acc, + 0x518d45e, + 0x51a5463, + 0x51cd469, + 0x51d1473, + 0x51d9474, + 0x51ed476, + 0x520947b, + 0x520d482, + 0x5215483, + 0x5251485, + 0x5265494, + 0x526d499, + 0x527549b, + 0x527949d, + 0x529d49e, + 0x52c14a7, + 0x52d94b0, + 0x52dd4b6, + 0x52e54b7, + 0x52e94b9, + 0x534d4ba, + 0x53514d3, + 0x53754d4, + 0x53954dd, + 0x53b14e5, + 0x53c14ec, + 0x53d54f0, + 0x53d94f5, + 0x53e14f6, + 0x53f54f8, + 0x54054fd, + 0x5409501, + 0x5425502, + 0x5cb5509, + 0x5ced72d, + 0x5d1973b, + 0x5d31746, + 0x5d5174c, + 0x5d71754, + 0x5db575c, + 0x5dbd76d, + 0x25dc176f, + 0x25dc5770, + 0x5dcd771, + 0x5f29773, + 0x25f2d7ca, + 0x25f3d7cb, + 0x25f457cf, + 0x25f517d1, + 0x5f557d4, + 0x5f597d5, + 0x5f817d6, + 0x5fa97e0, + 0x5fad7ea, + 0x5fe57eb, + 0x5ff97f9, + 0x6b517fe, + 0x6b55ad4, 0x6b59ad5, - 0x6cc1ad6, - 0x26cc5b30, - 0x26ccdb31, - 0x26cd1b33, - 0x26cd5b34, - 0x6cddb35, - 0x6db9b37, - 0x6dbdb6e, - 0x6de9b6f, - 0x6dedb7a, - 0x6e0db7b, - 0x6e19b83, - 0x6e39b86, - 0x6e71b8e, - 0x7109b9c, - 0x71c5c42, - 0x71d9c71, - 0x720dc76, - 0x723dc83, - 0x7259c8f, - 0x727dc96, - 0x7299c9f, - 0x72b5ca6, - 0x72d9cad, - 0x72e9cb6, - 0x72edcba, - 0x7321cbb, - 0x733dcc8, - 0x7359ccf, - 0x737dcd6, - 0x739dcdf, - 0x73b1ce7, - 0x73c5cec, - 0x73c9cf1, - 0x73e9cf2, - 0x748dcfa, - 0x74a9d23, - 0x74c9d2a, - 0x74cdd32, - 0x74d1d33, - 0x74d5d34, - 0x74e9d35, - 0x7509d3a, - 0x7515d42, - 0x7519d45, - 0x7549d46, - 0x75c9d52, - 0x75ddd72, - 0x75e1d77, - 0x75f9d78, - 0x75fdd7e, - 0x7609d7f, - 0x760dd82, - 0x7629d83, - 0x7665d8a, - 0x7669d99, - 0x7689d9a, - 0x76d9da2, - 0x76f1db6, - 0x7745dbc, - 0x7749dd1, - 0x774ddd2, - 0x7751dd3, - 0x7795dd4, - 0x77a5de5, - 0x77ddde9, - 0x780ddf7, - 0x7955e03, - 0x7979e55, - 0x79a5e5e, - 0x79b1e69, - 0x79b9e6c, - 0x7ac9e6e, - 0x7ad5eb2, - 0x7ae1eb5, - 0x7aedeb8, - 0x7af9ebb, - 0x7b05ebe, - 0x7b11ec1, - 0x7b1dec4, - 0x7b29ec7, - 0x7b35eca, - 0x7b41ecd, - 0x7b4ded0, - 0x7b59ed3, - 0x7b65ed6, - 0x7b6ded9, - 0x7b79edb, - 0x7b85ede, - 0x7b91ee1, - 0x7b9dee4, - 0x7ba9ee7, + 0x26b5dad6, + 0x6b61ad7, + 0x26b65ad8, + 0x6b69ad9, + 0x26b75ada, + 0x6b79add, + 0x6b7dade, + 0x26b81adf, + 0x6b85ae0, + 0x26b8dae1, + 0x6b91ae3, + 0x6b95ae4, + 0x26ba5ae5, + 0x6ba9ae9, + 0x6badaea, + 0x6bb1aeb, + 0x6bb5aec, + 0x26bb9aed, + 0x6bbdaee, + 0x6bc1aef, + 0x6bc5af0, + 0x6bc9af1, + 0x26bd1af2, + 0x6bd5af4, + 0x6bd9af5, + 0x6bddaf6, + 0x26be1af7, + 0x6be5af8, + 0x26bedaf9, + 0x26bf1afb, + 0x6c0dafc, + 0x6c19b03, + 0x6c59b06, + 0x6c5db16, + 0x6c81b17, + 0x6c85b20, + 0x6c89b21, + 0x6e01b22, + 0x26e05b80, + 0x26e0db81, + 0x26e11b83, + 0x26e15b84, + 0x6e1db85, + 0x6ef9b87, + 0x26efdbbe, + 0x6f01bbf, + 0x6f2dbc0, + 0x6f31bcb, + 0x6f51bcc, + 0x6f5dbd4, + 0x6f7dbd7, + 0x6fb5bdf, + 0x724dbed, + 0x7309c93, + 0x731dcc2, + 0x7351cc7, + 0x7381cd4, + 0x739dce0, + 0x73c1ce7, + 0x73ddcf0, + 0x73f9cf7, + 0x741dcfe, + 0x742dd07, + 0x7431d0b, + 0x7465d0c, + 0x7481d19, + 0x74edd20, + 0x274f1d3b, + 0x7515d3c, + 0x7535d45, + 0x7549d4d, + 0x755dd52, + 0x7561d57, + 0x7581d58, + 0x7625d60, + 0x7641d89, + 0x7661d90, + 0x7665d98, + 0x766dd99, + 0x7671d9b, + 0x7685d9c, + 0x76a5da1, + 0x76b1da9, + 0x76bddac, + 0x76eddaf, + 0x77bddbb, + 0x77c1def, + 0x77d5df0, + 0x77d9df5, + 0x77f1df6, + 0x77f5dfc, + 0x7801dfd, + 0x7805e00, + 0x7821e01, + 0x785de08, + 0x7861e17, + 0x7881e18, + 0x78d1e20, + 0x78ede34, + 0x7941e3b, + 0x7945e50, + 0x7949e51, + 0x794de52, + 0x7991e53, + 0x79a1e64, + 0x79dde68, + 0x79e1e77, + 0x7a11e78, + 0x7b59e84, + 0x7b7ded6, + 0x7ba9edf, 0x7bb5eea, - 0x7bc1eed, - 0x7bcdef0, - 0x7bd9ef3, - 0x7be5ef6, - 0x7bf1ef9, - 0x7bfdefc, - 0x7c09eff, - 0x7c15f02, - 0x7c21f05, - 0x7c2df08, - 0x7c39f0b, - 0x7c41f0e, - 0x7c4df10, - 0x7c59f13, - 0x7c65f16, - 0x7c71f19, - 0x7c7df1c, - 0x7c89f1f, - 0x7c95f22, - 0x7ca1f25, - 0x7cadf28, - 0x7cb9f2b, - 0x7cc5f2e, - 0x7cd1f31, - 0x7cddf34, - 0x7ce5f37, + 0x7bbdeed, + 0x7ccdeef, + 0x7cd9f33, + 0x7ce5f36, 0x7cf1f39, 0x7cfdf3c, 0x7d09f3f, @@ -9067,27 +9181,73 @@ 0x7d2df48, 0x7d39f4b, 0x7d45f4e, - 0x7d49f51, - 0x7d55f52, - 0x7d6df55, - 0x7d71f5b, - 0x7d81f5c, - 0x7d99f60, - 0x7dddf66, - 0x7df1f77, - 0x7e25f7c, - 0x7e35f89, - 0x7e51f8d, - 0x7e69f94, - 0x7e6df9a, - 0x27eb1f9b, - 0x7eb5fac, - 0x7ee1fad, - 0x7ee5fb8, + 0x7d51f51, + 0x7d5df54, + 0x7d69f57, + 0x7d71f5a, + 0x7d7df5c, + 0x7d89f5f, + 0x7d95f62, + 0x7da1f65, + 0x7dadf68, + 0x7db9f6b, + 0x7dc5f6e, + 0x7dd1f71, + 0x7dddf74, + 0x7de9f77, + 0x7df5f7a, + 0x7e01f7d, + 0x7e0df80, + 0x7e19f83, + 0x7e25f86, + 0x7e31f89, + 0x7e3df8c, + 0x7e45f8f, + 0x7e51f91, + 0x7e5df94, + 0x7e69f97, + 0x7e75f9a, + 0x7e81f9d, + 0x7e8dfa0, + 0x7e99fa3, + 0x7ea5fa6, + 0x7eb1fa9, + 0x7ebdfac, + 0x7ec9faf, + 0x7ed5fb2, + 0x7ee1fb5, + 0x7ee9fb8, + 0x7ef5fba, + 0x7f01fbd, + 0x7f0dfc0, + 0x7f19fc3, + 0x7f25fc6, + 0x7f31fc9, + 0x7f3dfcc, + 0x7f49fcf, + 0x7f4dfd2, + 0x7f59fd3, + 0x7f71fd6, + 0x7f75fdc, + 0x7f85fdd, + 0x7f9dfe1, + 0x7fe1fe7, + 0x7ff5ff8, + 0x8029ffd, + 0x803a00a, + 0x805a00e, + 0x8072016, + 0x808a01c, + 0x808e022, + 0x280d2023, + 0x80d6034, + 0x8102035, + 0x8106040, + 0x811a041, } -// max children 466 (capacity 511) -// max text offset 28023 (capacity 32767) +// max children 479 (capacity 511) +// max text offset 28411 (capacity 32767) // max text length 36 (capacity 63) -// max hi 8121 (capacity 16383) -// max lo 8120 (capacity 16383) +// max hi 8262 (capacity 16383) +// max lo 8257 (capacity 16383) diff -Nru lxd-2.14/dist/src/golang.org/x/net/publicsuffix/table_test.go lxd-2.15/dist/src/golang.org/x/net/publicsuffix/table_test.go --- lxd-2.14/dist/src/golang.org/x/net/publicsuffix/table_test.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/publicsuffix/table_test.go 2017-06-28 03:01:38.000000000 +0000 @@ -148,6 +148,7 @@ "gov.ar", "int.ar", "mil.ar", + "musica.ar", "net.ar", "org.ar", "tur.ar", @@ -317,6 +318,7 @@ "art.br", "ato.br", "b.br", + "belem.br", "bio.br", "blog.br", "bmd.br", @@ -325,6 +327,8 @@ "cnt.br", "com.br", "coop.br", + "cri.br", + "def.br", "ecn.br", "eco.br", "edu.br", @@ -335,6 +339,7 @@ "eti.br", "far.br", "flog.br", + "floripa.br", "fm.br", "fnd.br", "fot.br", @@ -342,9 +347,37 @@ "g12.br", "ggf.br", "gov.br", + "ac.gov.br", + "al.gov.br", + "am.gov.br", + "ap.gov.br", + "ba.gov.br", + "ce.gov.br", + "df.gov.br", + "es.gov.br", + "go.gov.br", + "ma.gov.br", + "mg.gov.br", + "ms.gov.br", + "mt.gov.br", + "pa.gov.br", + "pb.gov.br", + "pe.gov.br", + "pi.gov.br", + "pr.gov.br", + "rj.gov.br", + "rn.gov.br", + "ro.gov.br", + "rr.gov.br", + "rs.gov.br", + "sc.gov.br", + "se.gov.br", + "sp.gov.br", + "to.gov.br", "imb.br", "ind.br", "inf.br", + "jampa.br", "jor.br", "jus.br", "leg.br", @@ -360,6 +393,7 @@ "ntr.br", "odo.br", "org.br", + "poa.br", "ppg.br", "pro.br", "psc.br", @@ -367,6 +401,7 @@ "qsl.br", "radio.br", "rec.br", + "recife.br", "slg.br", "srv.br", "taxi.br", @@ -376,6 +411,7 @@ "tur.br", "tv.br", "vet.br", + "vix.br", "vlog.br", "wiki.br", "zlg.br", @@ -3943,6 +3979,7 @@ "name", "nc", "asso.nc", + "nom.nc", "ne", "net", "nf", @@ -5262,38 +5299,6 @@ "saotome.st", "store.st", "su", - "adygeya.su", - "arkhangelsk.su", - "balashov.su", - "bashkiria.su", - "bryansk.su", - "dagestan.su", - "grozny.su", - "ivanovo.su", - "kalmykia.su", - "kaluga.su", - "karelia.su", - "khakassia.su", - "krasnodar.su", - "kurgan.su", - "lenug.su", - "mordovia.su", - "msk.su", - "murmansk.su", - "nalchik.su", - "nov.su", - "obninsk.su", - "penza.su", - "pokrovsk.su", - "sochi.su", - "spb.su", - "togliatti.su", - "troitsk.su", - "tula.su", - "tuva.su", - "vladikavkaz.su", - "vladimir.su", - "vologda.su", "sv", "com.sv", "edu.sv", @@ -5900,6 +5905,12 @@ "xn--ogbpf8fl", "xn--mgbtf8fl", "xn--o3cw4h", + "xn--12c1fe0br.xn--o3cw4h", + "xn--12co0c3b4eva.xn--o3cw4h", + "xn--h3cuzk1di.xn--o3cw4h", + "xn--o3cyx2a.xn--o3cw4h", + "xn--m3ch0j3a.xn--o3cw4h", + "xn--12cfi8ixb8l.xn--o3cw4h", "xn--pgbs0dh", "xn--kpry57d", "xn--kprw13d", @@ -5937,7 +5948,12 @@ "net.zm", "org.zm", "sch.zm", - "*.zw", + "zw", + "ac.zw", + "co.zw", + "gov.zw", + "mil.zw", + "org.zw", "aaa", "aarp", "abarth", @@ -6248,7 +6264,6 @@ "durban", "dvag", "dvr", - "dwg", "earth", "eat", "eco", @@ -6438,7 +6453,6 @@ "icu", "ieee", "ifm", - "iinet", "ikano", "imamat", "imdb", @@ -6628,7 +6642,6 @@ "mtpc", "mtr", "mutual", - "mutuelle", "nab", "nadex", "nagoya", @@ -6686,7 +6699,6 @@ "oracle", "orange", "organic", - "orientexpress", "origins", "osaka", "otsuka", @@ -6795,6 +6807,7 @@ "rogers", "room", "rsvp", + "rugby", "ruhr", "run", "rwe", @@ -6937,7 +6950,6 @@ "thd", "theater", "theatre", - "theguardian", "tiaa", "tickets", "tienda", @@ -7062,7 +7074,6 @@ "xn--42c2d9a", "xn--45q11c", "xn--4gbrim", - "xn--4gq48lf9j", "xn--55qw42g", "xn--55qx5d", "xn--5su34j936bgsg", @@ -7165,6 +7176,9 @@ "zippo", "zone", "zuerich", + "cc.ua", + "inf.ua", + "ltd.ua", "beep.pl", "*.compute.estate", "*.alces.network", @@ -7178,7 +7192,7 @@ "*.elasticbeanstalk.com", "*.elb.amazonaws.com", "*.elb.amazonaws.com.cn", - "*.s3.amazonaws.com", + "s3.amazonaws.com", "s3-ap-northeast-1.amazonaws.com", "s3-ap-northeast-2.amazonaws.com", "s3-ap-south-1.amazonaws.com", @@ -7187,6 +7201,7 @@ "s3-ca-central-1.amazonaws.com", "s3-eu-central-1.amazonaws.com", "s3-eu-west-1.amazonaws.com", + "s3-eu-west-2.amazonaws.com", "s3-external-1.amazonaws.com", "s3-fips-us-gov-west-1.amazonaws.com", "s3-sa-east-1.amazonaws.com", @@ -7199,6 +7214,7 @@ "s3.cn-north-1.amazonaws.com.cn", "s3.ca-central-1.amazonaws.com", "s3.eu-central-1.amazonaws.com", + "s3.eu-west-2.amazonaws.com", "s3.us-east-2.amazonaws.com", "s3.dualstack.ap-northeast-1.amazonaws.com", "s3.dualstack.ap-northeast-2.amazonaws.com", @@ -7208,6 +7224,7 @@ "s3.dualstack.ca-central-1.amazonaws.com", "s3.dualstack.eu-central-1.amazonaws.com", "s3.dualstack.eu-west-1.amazonaws.com", + "s3.dualstack.eu-west-2.amazonaws.com", "s3.dualstack.sa-east-1.amazonaws.com", "s3.dualstack.us-east-1.amazonaws.com", "s3.dualstack.us-east-2.amazonaws.com", @@ -7223,6 +7240,7 @@ "s3-website.ap-south-1.amazonaws.com", "s3-website.ca-central-1.amazonaws.com", "s3-website.eu-central-1.amazonaws.com", + "s3-website.eu-west-2.amazonaws.com", "s3-website.us-east-2.amazonaws.com", "t3l3p0rt.net", "tele.amune.org", @@ -7234,10 +7252,18 @@ "sweetpepper.org", "myasustor.com", "myfritz.net", + "*.awdev.ca", + "*.advisor.ws", "backplaneapp.io", "betainabox.com", "bnr.la", "boxfuse.io", + "square7.ch", + "bplaced.com", + "bplaced.de", + "square7.de", + "bplaced.net", + "square7.net", "browsersafetymark.io", "mycd.eu", "ae.org", @@ -7277,6 +7303,7 @@ "certmgr.org", "xenapponazure.com", "virtueeldomein.nl", + "c66.me", "cloudcontrolled.com", "cloudcontrolapp.com", "co.ca", @@ -7299,7 +7326,6 @@ "cloudns.us", "co.nl", "co.no", - "*.platform.sh", "dyn.cosidns.de", "dynamisches-dns.de", "dnsupdater.de", @@ -7315,6 +7341,7 @@ "cyon.link", "cyon.site", "daplie.me", + "localhost.daplie.me", "biz.dk", "co.dk", "firm.dk", @@ -7617,6 +7644,8 @@ "dyn.home-webserver.de", "myhome-server.de", "ddnss.org", + "definima.net", + "definima.io", "dynv6.net", "e4.cz", "enonic.io", @@ -7679,18 +7708,102 @@ "us.eu.org", "eu-1.evennode.com", "eu-2.evennode.com", + "eu-3.evennode.com", "us-1.evennode.com", "us-2.evennode.com", + "us-3.evennode.com", + "twmail.cc", + "twmail.net", + "twmail.org", + "mymailer.com.tw", + "url.tw", "apps.fbsbx.com", + "ru.net", + "adygeya.ru", + "bashkiria.ru", + "bir.ru", + "cbg.ru", + "com.ru", + "dagestan.ru", + "grozny.ru", + "kalmykia.ru", + "kustanai.ru", + "marine.ru", + "mordovia.ru", + "msk.ru", + "mytis.ru", + "nalchik.ru", + "nov.ru", + "pyatigorsk.ru", + "spb.ru", + "vladikavkaz.ru", + "vladimir.ru", + "abkhazia.su", + "adygeya.su", + "aktyubinsk.su", + "arkhangelsk.su", + "armenia.su", + "ashgabad.su", + "azerbaijan.su", + "balashov.su", + "bashkiria.su", + "bryansk.su", + "bukhara.su", + "chimkent.su", + "dagestan.su", + "east-kazakhstan.su", + "exnet.su", + "georgia.su", + "grozny.su", + "ivanovo.su", + "jambyl.su", + "kalmykia.su", + "kaluga.su", + "karacol.su", + "karaganda.su", + "karelia.su", + "khakassia.su", + "krasnodar.su", + "kurgan.su", + "kustanai.su", + "lenug.su", + "mangyshlak.su", + "mordovia.su", + "msk.su", + "murmansk.su", + "nalchik.su", + "navoi.su", + "north-kazakhstan.su", + "nov.su", + "obninsk.su", + "penza.su", + "pokrovsk.su", + "sochi.su", + "spb.su", + "tashkent.su", + "termez.su", + "togliatti.su", + "troitsk.su", + "tselinograd.su", + "tula.su", + "tuva.su", + "vladikavkaz.su", + "vladimir.su", + "vologda.su", + "fastlylb.net", + "map.fastlylb.net", + "freetls.fastly.net", "map.fastly.net", "a.prod.fastly.net", "global.prod.fastly.net", "a.ssl.fastly.net", "b.ssl.fastly.net", "global.ssl.fastly.net", - "fastlylb.net", - "map.fastlylb.net", "fhapp.xyz", + "fedorainfracloud.org", + "fedorapeople.org", + "cloud.fedoraproject.org", + "filegear.me", "firebaseapp.com", "flynnhub.com", "freebox-os.com", @@ -7795,6 +7908,7 @@ "blogspot.ug", "blogspot.vn", "cloudfunctions.net", + "cloud.goog", "codespot.com", "googleapis.com", "googlecode.com", @@ -7807,6 +7921,7 @@ "hepforge.org", "herokuapp.com", "herokussl.com", + "moonscale.net", "iki.fi", "biz.at", "info.at", @@ -7837,6 +7952,7 @@ "se.leg.br", "sp.leg.br", "to.leg.br", + "ipifony.net", "*.triton.zone", "*.cns.joyent.com", "js.org", @@ -7844,7 +7960,16 @@ "knightpoint.systems", "co.krd", "edu.krd", + "barsy.bg", + "barsyonline.com", + "barsy.de", + "barsy.eu", + "barsy.in", + "barsy.net", + "barsy.online", + "barsy.support", "*.magentosite.cloud", + "hb.cldmail.ru", "meteorapp.com", "eu.meteorapp.com", "co.pl", @@ -7942,7 +8067,10 @@ "sytes.net", "webhop.me", "zapto.org", + "nodum.co", + "nodum.io", "nyc.mn", + "cya.gg", "nid.io", "opencraft.hosting", "operaunite.com", @@ -7961,6 +8089,8 @@ "gotpantheon.com", "mypep.link", "on-web.fr", + "*.platform.sh", + "*.platformsh.site", "xen.prgmr.com", "priv.at", "protonet.io", @@ -7969,6 +8099,9 @@ "dev-myqnapcloud.com", "alpha-myqnapcloud.com", "myqnapcloud.com", + "*.quipelements.com", + "vapor.cloud", + "vaporcloud.io", "rackmaze.com", "rackmaze.net", "rhcloud.com", @@ -7989,6 +8122,7 @@ "my-firewall.org", "myfirewall.org", "spdns.org", + "*.sensiosite.cloud", "biz.ua", "co.ua", "pp.ua", @@ -8009,6 +8143,7 @@ "*.stolos.io", "spacekit.io", "stackspace.space", + "storj.farm", "diskstation.me", "dscloud.biz", "dscloud.me", @@ -8022,6 +8157,7 @@ "i234.me", "myds.me", "synology.me", + "vpnplus.to", "taifun-dns.de", "gda.pl", "gdansk.pl", @@ -8047,14 +8183,18 @@ "syno-ds.de", "synology-diskstation.de", "synology-ds.de", + "uber.space", "hk.com", "hk.org", "ltd.hk", "inc.hk", "lib.de.us", "router.management", + "wedeploy.io", + "wedeploy.me", "remotewd.com", "wmflabs.org", + "xs4all.space", "yolasite.com", "ybo.faith", "yombo.me", @@ -8066,9 +8206,6 @@ "za.net", "za.org", "now.sh", - "cc.ua", - "inf.ua", - "ltd.ua", } var nodeLabels = [...]string{ @@ -8449,7 +8586,6 @@ "durban", "dvag", "dvr", - "dwg", "dz", "earth", "eat", @@ -8682,7 +8818,6 @@ "ie", "ieee", "ifm", - "iinet", "ikano", "il", "im", @@ -8929,7 +9064,6 @@ "mu", "museum", "mutual", - "mutuelle", "mv", "mw", "mx", @@ -9009,7 +9143,6 @@ "orange", "org", "organic", - "orientexpress", "origins", "osaka", "otsuka", @@ -9139,6 +9272,7 @@ "rs", "rsvp", "ru", + "rugby", "ruhr", "run", "rw", @@ -9309,7 +9443,6 @@ "thd", "theater", "theatre", - "theguardian", "tiaa", "tickets", "tienda", @@ -9463,7 +9596,6 @@ "xn--45brj9c", "xn--45q11c", "xn--4gbrim", - "xn--4gq48lf9j", "xn--54b7fta0cc", "xn--55qw42g", "xn--55qx5d", @@ -9762,6 +9894,7 @@ "gov", "int", "mil", + "musica", "net", "org", "tur", @@ -9865,6 +9998,7 @@ "9", "a", "b", + "barsy", "blogspot", "c", "d", @@ -9938,6 +10072,7 @@ "art", "ato", "b", + "belem", "bio", "blog", "bmd", @@ -9946,6 +10081,8 @@ "cnt", "com", "coop", + "cri", + "def", "ecn", "eco", "edu", @@ -9956,6 +10093,7 @@ "eti", "far", "flog", + "floripa", "fm", "fnd", "fot", @@ -9966,6 +10104,7 @@ "imb", "ind", "inf", + "jampa", "jor", "jus", "leg", @@ -9981,6 +10120,7 @@ "ntr", "odo", "org", + "poa", "ppg", "pro", "psc", @@ -9988,6 +10128,7 @@ "qsl", "radio", "rec", + "recife", "slg", "srv", "taxi", @@ -9997,6 +10138,7 @@ "tur", "tv", "vet", + "vix", "vlog", "wiki", "zlg", @@ -10028,6 +10170,33 @@ "se", "sp", "to", + "ac", + "al", + "am", + "ap", + "ba", + "ce", + "df", + "es", + "go", + "ma", + "mg", + "ms", + "mt", + "pa", + "pb", + "pe", + "pi", + "pr", + "rj", + "rn", + "ro", + "rr", + "rs", + "sc", + "se", + "sp", + "to", "com", "edu", "gov", @@ -10052,6 +10221,7 @@ "org", "za", "ab", + "awdev", "bc", "blogspot", "co", @@ -10075,10 +10245,12 @@ "game-server", "myphotos", "scrapping", + "twmail", "gov", "blogspot", "blogspot", "gotdns", + "square7", "ac", "asso", "co", @@ -10102,7 +10274,9 @@ "mil", "magentosite", "myfusion", + "sensiosite", "statics", + "vapor", "cloudns", "co", "com", @@ -10167,6 +10341,7 @@ "int", "mil", "net", + "nodum", "nom", "org", "rec", @@ -10183,12 +10358,14 @@ "applinzi", "appspot", "ar", + "barsyonline", "betainabox", "blogdns", "blogspot", "blogsyte", "bloxcms", "bounty-full", + "bplaced", "br", "cechire", "ciscofreak", @@ -10401,6 +10578,7 @@ "qa2", "qc", "quicksytes", + "quipelements", "rackmaze", "remotewd", "rhcloud", @@ -10456,6 +10634,7 @@ "elb", "eu-central-1", "eu-west-1", + "eu-west-2", "s3", "s3-ap-northeast-1", "s3-ap-northeast-2", @@ -10465,6 +10644,7 @@ "s3-ca-central-1", "s3-eu-central-1", "s3-eu-west-1", + "s3-eu-west-2", "s3-external-1", "s3-fips-us-gov-west-1", "s3-sa-east-1", @@ -10509,6 +10689,10 @@ "s3", "dualstack", "s3", + "s3-website", + "s3", + "dualstack", + "s3", "dualstack", "s3", "dualstack", @@ -10519,8 +10703,10 @@ "beta", "eu-1", "eu-2", + "eu-3", "us-1", "us-2", + "us-3", "apps", "api", "ext", @@ -10566,7 +10752,9 @@ "co", "e4", "realm", + "barsy", "blogspot", + "bplaced", "com", "cosidns", "dd-dns", @@ -10599,6 +10787,7 @@ "my-wan", "myhome-server", "spdns", + "square7", "syno-ds", "synology-diskstation", "synology-ds", @@ -10685,6 +10874,7 @@ "name", "net", "org", + "barsy", "cloudns", "diskstation", "mycd", @@ -10694,6 +10884,7 @@ "party", "user", "ybo", + "storj", "aland", "blogspot", "dy", @@ -10737,6 +10928,7 @@ "org", "pvt", "co", + "cya", "net", "org", "com", @@ -10761,6 +10953,7 @@ "gov", "net", "org", + "cloud", "asso", "com", "edu", @@ -10905,6 +11098,7 @@ "ltd", "plc", "ac", + "barsy", "blogspot", "cloudns", "co", @@ -10940,6 +11134,7 @@ "browsersafetymark", "com", "dedyn", + "definima", "drud", "enonic", "github", @@ -10949,12 +11144,15 @@ "lair", "ngrok", "nid", + "nodum", "pantheonsite", "protonet", "sandcats", "shiftedit", "spacekit", "stolos", + "vaporcloud", + "wedeploy", "customer", "apps", "com", @@ -13319,6 +13517,7 @@ "blogspot", "ac", "brasilia", + "c66", "co", "daplie", "ddns", @@ -13326,6 +13525,7 @@ "dnsfor", "dscloud", "edu", + "filegear", "gov", "hopto", "i234", @@ -13338,7 +13538,9 @@ "priv", "synology", "webhop", + "wedeploy", "yombo", + "localhost", "co", "com", "edu", @@ -14009,12 +14211,15 @@ "forgot", "forgot", "asso", + "nom", "alwaysdata", "at-band-camp", "azure-mobile", "azurewebsites", + "barsy", "blogdns", "bounceme", + "bplaced", "broke-it", "buyshouses", "cdn77", @@ -14024,6 +14229,7 @@ "cloudfunctions", "cryptonomic", "ddns", + "definima", "dnsalias", "dnsdojo", "does-it", @@ -14053,12 +14259,14 @@ "hu", "in", "in-the-band", + "ipifony", "is-a-chef", "is-a-geek", "isa-geek", "jp", "kicks-ass", "knx-server", + "moonscale", "mydissent", "myeffect", "myfritz", @@ -14073,6 +14281,7 @@ "privatizehealthinsurance", "rackmaze", "redirectme", + "ru", "scrapper-site", "se", "selfip", @@ -14081,14 +14290,17 @@ "serveblog", "serveftp", "serveminecraft", + "square7", "static-access", "sytes", "t3l3p0rt", "thruhere", + "twmail", "uk", "webhop", "za", "r", + "freetls", "map", "prod", "ssl", @@ -14942,6 +15154,7 @@ "org", "pro", "homelink", + "barsy", "ae", "amune", "blogdns", @@ -14971,6 +15184,9 @@ "endoftheinternet", "eu", "familyds", + "fedorainfracloud", + "fedorapeople", + "fedoraproject", "from-me", "game-host", "gotdns", @@ -15026,6 +15242,7 @@ "sweetpepper", "tunk", "tuxfamily", + "twmail", "ufcfan", "us", "webhop", @@ -15094,6 +15311,7 @@ "tr", "uk", "us", + "cloud", "nerdpol", "abo", "ac", @@ -15448,12 +15666,33 @@ "in", "org", "ac", + "adygeya", + "bashkiria", + "bir", "blogspot", + "cbg", + "cldmail", + "com", + "dagestan", "edu", "gov", + "grozny", "int", + "kalmykia", + "kustanai", + "marine", "mil", + "mordovia", + "msk", + "mytis", + "nalchik", + "nov", + "pyatigorsk", + "spb", "test", + "vladikavkaz", + "vladimir", + "hb", "ac", "co", "com", @@ -15548,6 +15787,7 @@ "platform", "blogspot", "cyon", + "platformsh", "blogspot", "com", "edu", @@ -15566,6 +15806,8 @@ "net", "org", "stackspace", + "uber", + "xs4all", "co", "com", "consulado", @@ -15578,38 +15820,59 @@ "principe", "saotome", "store", + "abkhazia", "adygeya", + "aktyubinsk", "arkhangelsk", + "armenia", + "ashgabad", + "azerbaijan", "balashov", "bashkiria", "bryansk", + "bukhara", + "chimkent", "dagestan", + "east-kazakhstan", + "exnet", + "georgia", "grozny", "ivanovo", + "jambyl", "kalmykia", "kaluga", + "karacol", + "karaganda", "karelia", "khakassia", "krasnodar", "kurgan", + "kustanai", "lenug", + "mangyshlak", "mordovia", "msk", "murmansk", "nalchik", + "navoi", + "north-kazakhstan", "nov", "obninsk", "penza", "pokrovsk", "sochi", "spb", + "tashkent", + "termez", "togliatti", "troitsk", + "tselinograd", "tula", "tuva", "vladikavkaz", "vladimir", "vologda", + "barsy", "com", "edu", "gob", @@ -15684,6 +15947,7 @@ "mil", "net", "org", + "vpnplus", "av", "bbs", "bel", @@ -15740,9 +16004,11 @@ "mil", "net", "org", + "url", "xn--czrw28b", "xn--uc0atv", "xn--zf0ao64a", + "mymailer", "ac", "co", "go", @@ -16149,6 +16415,7 @@ "edu", "net", "org", + "advisor", "com", "dyndns", "edu", @@ -16162,6 +16429,12 @@ "xn--d1at", "xn--o1ac", "xn--o1ach", + "xn--12c1fe0br", + "xn--12cfi8ixb8l", + "xn--12co0c3b4eva", + "xn--h3cuzk1di", + "xn--m3ch0j3a", + "xn--o3cyx2a", "fhapp", "ac", "agric", @@ -16193,4 +16466,9 @@ "org", "sch", "triton", + "ac", + "co", + "gov", + "mil", + "org", } diff -Nru lxd-2.14/dist/src/golang.org/x/net/trace/events.go lxd-2.15/dist/src/golang.org/x/net/trace/events.go --- lxd-2.14/dist/src/golang.org/x/net/trace/events.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/trace/events.go 2017-06-28 03:01:38.000000000 +0000 @@ -39,9 +39,9 @@ } // RenderEvents renders the HTML page typically served at /debug/events. -// It does not do any auth checking; see AuthRequest for the default auth check -// used by the handler registered on http.DefaultServeMux. -// req may be nil. +// It does not do any auth checking. The request may be nil. +// +// Most users will use the Events handler. func RenderEvents(w http.ResponseWriter, req *http.Request, sensitive bool) { now := time.Now() data := &struct { diff -Nru lxd-2.14/dist/src/golang.org/x/net/trace/trace.go lxd-2.15/dist/src/golang.org/x/net/trace/trace.go --- lxd-2.14/dist/src/golang.org/x/net/trace/trace.go 2017-05-30 19:04:53.000000000 +0000 +++ lxd-2.15/dist/src/golang.org/x/net/trace/trace.go 2017-06-28 03:01:38.000000000 +0000 @@ -110,30 +110,46 @@ } func init() { - http.HandleFunc("/debug/requests", func(w http.ResponseWriter, req *http.Request) { - any, sensitive := AuthRequest(req) - if !any { - http.Error(w, "not allowed", http.StatusUnauthorized) - return - } - w.Header().Set("Content-Type", "text/html; charset=utf-8") - Render(w, req, sensitive) - }) - http.HandleFunc("/debug/events", func(w http.ResponseWriter, req *http.Request) { - any, sensitive := AuthRequest(req) - if !any { - http.Error(w, "not allowed", http.StatusUnauthorized) - return - } - w.Header().Set("Content-Type", "text/html; charset=utf-8") - RenderEvents(w, req, sensitive) - }) + // TODO(jbd): Serve Traces from /debug/traces in the future? + // There is no requirement for a request to be present to have traces. + http.HandleFunc("/debug/requests", Traces) + http.HandleFunc("/debug/events", Events) +} + +// Traces responds with traces from the program. +// The package initialization registers it in http.DefaultServeMux +// at /debug/requests. +// +// It performs authorization by running AuthRequest. +func Traces(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + Render(w, req, sensitive) +} + +// Events responds with a page of events collected by EventLogs. +// The package initialization registers it in http.DefaultServeMux +// at /debug/events. +// +// It performs authorization by running AuthRequest. +func Events(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + RenderEvents(w, req, sensitive) } // Render renders the HTML page typically served at /debug/requests. -// It does not do any auth checking; see AuthRequest for the default auth check -// used by the handler registered on http.DefaultServeMux. -// req may be nil. +// It does not do any auth checking. The request may be nil. +// +// Most users will use the Traces handler. func Render(w io.Writer, req *http.Request, sensitive bool) { data := &struct { Families []string diff -Nru lxd-2.14/doc/rest-api.md lxd-2.15/doc/rest-api.md --- lxd-2.14/doc/rest-api.md 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/doc/rest-api.md 2017-06-28 03:00:23.000000000 +0000 @@ -194,6 +194,7 @@ * /1.0/images * /1.0/images/\ * /1.0/images/\/export + * /1.0/images/\/refresh * /1.0/images/aliases * /1.0/images/aliases/\ * /1.0/networks @@ -1419,6 +1420,15 @@ token which it'll then pass to the target LXD. That target LXD will then GET the image as a guest, passing the secret token. +## /1.0/images/\/refresh +### POST + * Description: Refresh an image from its origin + * Authentication: trusted + * Operation: async + * Return: Background operation or standard error + +This creates an operation to refresh the specified image from its origin. + ## /1.0/images/\/secret ### POST * Description: Generate a random token and tell LXD to expect it be used by a guest diff -Nru lxd-2.14/doc/storage.md lxd-2.15/doc/storage.md --- lxd-2.14/doc/storage.md 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/doc/storage.md 2017-06-28 03:00:23.000000000 +0000 @@ -5,30 +5,28 @@ overridden on a per-volume basis. ## Storage pool configuration - -Key | Type | Condition | Default | Description -:-- | :-- | :-- | :-- | :-- -size | string | appropriate driver and source | 0 | Size of the storage pool in bytes (suffixes supported). (Currently valid for loop based pools and zfs.) -source | string | - | - | Path to block device or loop file or filesystem entry -btrfs.mount\_options | string | btrfs driver | user_subvol_rm_allowed | Mount options for block devices -lvm.thinpool\_name | string | lvm driver | LXDPool | Thin pool where images and containers are created. -lvm.use\_thinpool | bool | lvm driver | true | Whether the storage pool uses a thinpool for logical volumes. -lvm.vg\_name | string | lvm driver | name of the pool | Name of the volume group to create. -rsync.bwlimit | string | - | 0 (no limit) | Specifies the upper limit to be placed on the socket I/O whenever rsync has to be used to transfer storage entities. -volume.block.filesystem | string | block based driver (lvm) | ext4 | Filesystem to use for new volumes -volume.block.mount\_options | string | block based driver (lvm) | discard | Mount options for block devices -volume.size | string | appropriate driver | 0 | Default volume size -volume.zfs.remove\_snapshots | bool | zfs driver | false | Remove snapshots as needed -volume.zfs.use\_refquota | bool | zfs driver | false | Use refquota instead of quota for space. -zfs.clone\_copy | bool | zfs driver | true | Whether to use ZFS lightweight clones rather than full dataset copies. -zfs.pool\_name | string | zfs driver | name of the pool | Name of the zpool +Key | Type | Condition | Default | Description +:-- | :-- | :-- | :-- | :-- +size | string | appropriate driver and source | 0 | Size of the storage pool in bytes (suffixes supported). (Currently valid for loop based pools and zfs.) +source | string | - | - | Path to block device or loop file or filesystem entry +btrfs.mount\_options | string | btrfs driver | user\_subvol\_rm\_allowed | Mount options for block devices +lvm.thinpool\_name | string | lvm driver | LXDPool | Thin pool where images and containers are created. +lvm.use\_thinpool | bool | lvm driver | true | Whether the storage pool uses a thinpool for logical volumes. +lvm.vg\_name | string | lvm driver | name of the pool | Name of the volume group to create. +rsync.bwlimit | string | - | 0 (no limit) | Specifies the upper limit to be placed on the socket I/O whenever rsync has to be used to transfer storage entities. +volume.block.filesystem | string | block based driver (lvm) | ext4 | Filesystem to use for new volumes +volume.block.mount\_options | string | block based driver (lvm) | discard | Mount options for block devices +volume.size | string | appropriate driver | 0 | Default volume size +volume.zfs.remove\_snapshots | bool | zfs driver | false | Remove snapshots as needed +volume.zfs.use\_refquota | bool | zfs driver | false | Use refquota instead of quota for space. +zfs.clone\_copy | bool | zfs driver | true | Whether to use ZFS lightweight clones rather than full dataset copies. +zfs.pool\_name | string | zfs driver | name of the pool | Name of the zpool Storage pool configuration keys can be set using the lxc tool with: lxc storage set [:] ## Storage volume configuration - Key | Type | Condition | Default | Description :-- | :-- | :-- | :-- | :-- size | string | appropriate driver | same as volume.size | Size of the storage volume @@ -112,6 +110,22 @@ lxc profile device add default root disk path=/ pool=default ``` +## I/O limits +I/O limits in IOp/s or MB/s can be set on storage devices when attached to a container (see containers.md). + +Those are applied through the Linux "blkio" cgroup controller which makes it possible +to restrict I/O at the disk level (but nothing finer grained than that). + +Because those apply to a whole physical disk rather than a partition or path, the following restrictions apply: + - Limits will not apply to filesystems that are backed by virtual devices (e.g. device mapper). + - If a fileystem is backed by multiple block devices, each device will get the same limit. + - If the container is passed two disk devices that are each backed by the same disk, + the limits of the two devices will be averaged. + +It's also worth noting that all I/O limits only apply to actual block device access, +so you will need to consider the filesystem's own overhead when setting limits. +This also means that access to cached data will not be affected by the limit. + ## Notes and examples ### Directory @@ -170,7 +184,7 @@ - The filesystem used for the LVs is ext4 (can be configured to use xfs instead). - By default, all LVM storage pools use an LVM thinpool in which logical volumes for all LXD storage entities (images, containers, etc.) are created. - This behavior can be changed by setting "lvm.use_thinpool" to "false". In + This behavior can be changed by setting "lvm.use\_thinpool" to "false". In this case, LXD will use normal logical volumes for all non-container snapshot storage entities (images, containers etc.). This means most storage operations will need to fallback to rsyncing since non-thinpool logical @@ -202,7 +216,7 @@ - Create a new pool called "pool1" using "/dev/sdX" with the LVM Volume Group called "my-pool". ``` -lxc storage create pool1 lvm source=/dev/sdX lvm.vg_name=my-pool +lxc storage create pool1 lvm source=/dev/sdX lvm.vg\_name=my-pool ``` ### ZFS @@ -232,10 +246,14 @@ a LXD zfs pool or dataset since LXD might delete them. - When quotas are used on a ZFS dataset LXD will set the ZFS "quota" property. In order to have LXD set the ZFS "refquota" property, either set - "zfs.use_refquota" to "true" for the given dataset or set - "volume.zfs.use_refquota" to true on the storage pool. The former option + "zfs.use\_refquota" to "true" for the given dataset or set + "volume.zfs.use\_refquota" to true on the storage pool. The former option will make LXD use refquota only for the given storage volume the latter will make LXD use refquota for all storage volumes in the storage pool. + - I/O quotas (IOps/MBs) are unlikely to affect ZFS filesystems very + much. That's because of ZFS being a port of a Solaris module (using SPL) + and not a native Linux filesystem using the Linux VFS API which is where + I/O limits are applied. #### The following commands can be used to create ZFS storage pools diff -Nru lxd-2.14/lxc/action.go lxd-2.15/lxc/action.go --- lxd-2.14/lxc/action.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/action.go 2017-06-28 03:00:23.000000000 +0000 @@ -5,7 +5,7 @@ "os" "strings" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" @@ -50,7 +50,7 @@ gnuflag.BoolVar(&c.stateless, "stateless", false, i18n.G("Ignore the container state (only for start)")) } -func (c *actionCmd) doAction(config *lxd.Config, nameArg string) error { +func (c *actionCmd) doAction(conf *config.Config, nameArg string) error { state := false // Only store state if asked to @@ -58,8 +58,12 @@ state = true } - remote, name := config.ParseRemoteAndContainer(nameArg) - d, err := lxd.NewClient(config, remote) + remote, name, err := conf.ParseRemote(nameArg) + if err != nil { + return err + } + + d, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -69,7 +73,7 @@ } if c.action == shared.Start { - current, err := d.ContainerInfo(name) + current, _, err := d.GetContainer(name) if err != nil { return err } @@ -85,29 +89,33 @@ } } - resp, err := d.Action(name, c.action, c.timeout, c.force, state) - if err != nil { - return err + req := api.ContainerStatePut{ + Action: string(c.action), + Timeout: c.timeout, + Force: c.force, + Stateful: state, } - if resp.Type != api.AsyncResponse { - return fmt.Errorf(i18n.G("bad result type from action")) + op, err := d.UpdateContainerState(name, req, "") + if err != nil { + return err } - if err := d.WaitForSuccess(resp.Operation); err != nil { + err = op.Wait() + if err != nil { return fmt.Errorf("%s\n"+i18n.G("Try `lxc info --show-log %s` for more info"), err, nameArg) } return nil } -func (c *actionCmd) run(config *lxd.Config, args []string) error { +func (c *actionCmd) run(conf *config.Config, args []string) error { if len(args) == 0 { return errArgs } // Run the action for every listed container - results := runBatch(args, func(name string) error { return c.doAction(config, name) }) + results := runBatch(args, func(name string) error { return c.doAction(conf, name) }) // Single container is easy if len(results) == 1 { diff -Nru lxd-2.14/lxc/config.go lxd-2.15/lxc/config.go --- lxd-2.14/lxc/config.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/config.go 2017-06-28 03:00:23.000000000 +0000 @@ -2,6 +2,7 @@ import ( "crypto/x509" + "encoding/base64" "encoding/pem" "fmt" "io/ioutil" @@ -13,7 +14,8 @@ "github.com/olekukonko/tablewriter" "gopkg.in/yaml.v2" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" @@ -129,14 +131,18 @@ Will set the server's trust password to blah.`) } -func (c *configCmd) doSet(config *lxd.Config, args []string, unset bool) error { +func (c *configCmd) doSet(conf *config.Config, args []string, unset bool) error { if len(args) != 4 { return errArgs } // [[lxc config]] set dakara:c1 limits.memory 200000 - remote, container := config.ParseRemoteAndContainer(args[1]) - d, err := lxd.NewClient(config, remote) + remote, name, err := conf.ParseRemote(args[1]) + if err != nil { + return err + } + + d, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -152,22 +158,31 @@ value = string(buf[:]) } - if unset { - st, err := d.ContainerInfo(container) - if err != nil { - return err - } + container, etag, err := d.GetContainer(name) + if err != nil { + return err + } - _, ok := st.Config[key] + if unset { + _, ok := container.Config[key] if !ok { - return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set."), key) + return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set"), key) } + + delete(container.Config, key) + } else { + container.Config[key] = value + } + + op, err := d.UpdateContainer(name, container.Writable(), etag) + if err != nil { + return err } - return d.SetContainerConfig(container, key, value) + return op.Wait() } -func (c *configCmd) run(config *lxd.Config, args []string) error { +func (c *configCmd) run(conf *config.Config, args []string) error { if len(args) < 1 { return errUsage } @@ -181,50 +196,54 @@ // Deal with local server if len(args) == 2 { - c, err := lxd.NewClient(config, config.DefaultRemote) + c, err := conf.GetContainerServer(conf.DefaultRemote) if err != nil { return err } - ss, err := c.ServerStatus() + server, etag, err := c.GetServer() if err != nil { return err } - _, ok := ss.Config[args[1]] + _, ok := server.Config[args[1]] if !ok { return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set."), args[1]) } - _, err = c.SetServerConfig(args[1], "") - return err + delete(server.Config, args[1]) + return c.UpdateServer(server.Writable(), etag) } // Deal with remote server - remote, container := config.ParseRemoteAndContainer(args[1]) + remote, container, err := conf.ParseRemote(args[1]) + if err != nil { + return err + } + if container == "" { - c, err := lxd.NewClient(config, remote) + c, err := conf.GetContainerServer(remote) if err != nil { return err } - ss, err := c.ServerStatus() + server, etag, err := c.GetServer() if err != nil { return err } - _, ok := ss.Config[args[1]] + _, ok := server.Config[args[2]] if !ok { return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set."), args[1]) } - _, err = c.SetServerConfig(args[2], "") - return err + delete(server.Config, args[2]) + return c.UpdateServer(server.Writable(), etag) } // Deal with container args = append(args, "") - return c.doSet(config, args, true) + return c.doSet(conf, args, true) case "set": if len(args) < 3 { @@ -233,29 +252,45 @@ // Deal with local server if len(args) == 3 { - c, err := lxd.NewClient(config, config.DefaultRemote) + c, err := conf.GetContainerServer(conf.DefaultRemote) if err != nil { return err } - _, err = c.SetServerConfig(args[1], args[2]) - return err + server, etag, err := c.GetServer() + if err != nil { + return err + } + + server.Config[args[1]] = args[2] + + return c.UpdateServer(server.Writable(), etag) } // Deal with remote server - remote, container := config.ParseRemoteAndContainer(args[1]) + remote, container, err := conf.ParseRemote(args[1]) + if err != nil { + return err + } + if container == "" { - c, err := lxd.NewClient(config, remote) + c, err := conf.GetContainerServer(remote) if err != nil { return err } - _, err = c.SetServerConfig(args[2], args[3]) - return err + server, etag, err := c.GetServer() + if err != nil { + return err + } + + server.Config[args[2]] = args[3] + + return c.UpdateServer(server.Writable(), etag) } // Deal with container - return c.doSet(config, args, false) + return c.doSet(conf, args, false) case "trust": if len(args) < 2 { @@ -266,17 +301,21 @@ case "list": var remote string if len(args) == 3 { - remote = config.ParseRemote(args[2]) + var err error + remote, _, err = conf.ParseRemote(args[2]) + if err != nil { + return err + } } else { - remote = config.DefaultRemote + remote = conf.DefaultRemote } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } - trust, err := d.CertificateList() + trust, err := d.GetCertificates() if err != nil { return err } @@ -310,7 +349,7 @@ i18n.G("COMMON NAME"), i18n.G("ISSUE DATE"), i18n.G("EXPIRY DATE")}) - sort.Sort(SortImage(data)) + sort.Sort(StringList(data)) table.AppendBulk(data) table.Render() @@ -320,52 +359,69 @@ if len(args) < 3 { return fmt.Errorf(i18n.G("No certificate provided to add")) } else if len(args) == 4 { - remote = config.ParseRemote(args[2]) + var err error + remote, _, err = conf.ParseRemote(args[2]) + if err != nil { + return err + } } else { - remote = config.DefaultRemote + remote = conf.DefaultRemote } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } fname := args[len(args)-1] - cert, err := shared.ReadCert(fname) + x509Cert, err := shared.ReadCert(fname) if err != nil { return err } - name, _ := shared.SplitExt(fname) - return d.CertificateAdd(cert, name) + + cert := api.CertificatesPost{} + cert.Certificate = base64.StdEncoding.EncodeToString(x509Cert.Raw) + cert.Name = name + cert.Type = "client" + + return d.CreateCertificate(cert) case "remove": var remote string if len(args) < 3 { return fmt.Errorf(i18n.G("No fingerprint specified.")) } else if len(args) == 4 { - remote = config.ParseRemote(args[2]) + var err error + remote, _, err = conf.ParseRemote(args[2]) + if err != nil { + return err + } } else { - remote = config.DefaultRemote + remote = conf.DefaultRemote } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } - return d.CertificateRemove(args[len(args)-1]) + return d.DeleteCertificate(args[len(args)-1]) default: return errArgs } case "show": - remote := config.DefaultRemote + remote := conf.DefaultRemote container := "" if len(args) > 1 { - remote, container = config.ParseRemoteAndContainer(args[1]) + var err error + remote, container, err = conf.ParseRemote(args[1]) + if err != nil { + return err + } } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -373,12 +429,12 @@ var data []byte if len(args) == 1 || container == "" { - config, err := d.ServerStatus() + server, _, err := d.GetServer() if err != nil { return err } - brief := config.Writable() + brief := server.Writable() data, err = yaml.Marshal(&brief) if err != nil { return err @@ -386,35 +442,37 @@ } else { var brief api.ContainerPut if shared.IsSnapshot(container) { - config, err := d.SnapshotInfo(container) + fields := strings.Split(container, shared.SnapshotDelimiter) + + snap, _, err := d.GetContainerSnapshot(fields[0], fields[1]) if err != nil { return err } brief = api.ContainerPut{ - Profiles: config.Profiles, - Config: config.Config, - Devices: config.Devices, - Ephemeral: config.Ephemeral, + Profiles: snap.Profiles, + Config: snap.Config, + Devices: snap.Devices, + Ephemeral: snap.Ephemeral, } if c.expanded { brief = api.ContainerPut{ - Profiles: config.Profiles, - Config: config.ExpandedConfig, - Devices: config.ExpandedDevices, - Ephemeral: config.Ephemeral, + Profiles: snap.Profiles, + Config: snap.ExpandedConfig, + Devices: snap.ExpandedDevices, + Ephemeral: snap.Ephemeral, } } } else { - config, err := d.ContainerInfo(container) + container, _, err := d.GetContainer(container) if err != nil { return err } - brief = config.Writable() + brief = container.Writable() if c.expanded { - brief.Config = config.ExpandedConfig - brief.Devices = config.ExpandedDevices + brief.Config = container.ExpandedConfig + brief.Devices = container.ExpandedDevices } } @@ -433,27 +491,31 @@ return errArgs } - remote := config.DefaultRemote + remote := conf.DefaultRemote container := "" key := args[1] if len(args) > 2 { - remote, container = config.ParseRemoteAndContainer(args[1]) + var err error + remote, container, err = conf.ParseRemote(args[1]) + if err != nil { + return err + } key = args[2] } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } if container != "" { - resp, err := d.ContainerInfo(container) + resp, _, err := d.GetContainer(container) if err != nil { return err } fmt.Println(resp.Config[key]) } else { - resp, err := d.ServerStatus() + resp, _, err := d.GetServer() if err != nil { return err } @@ -478,19 +540,19 @@ } switch args[1] { case "list": - return c.deviceList(config, "container", args) + return c.deviceList(conf, "container", args) case "add": - return c.deviceAdd(config, "container", args) + return c.deviceAdd(conf, "container", args) case "remove": - return c.deviceRm(config, "container", args) + return c.deviceRm(conf, "container", args) case "get": - return c.deviceGet(config, "container", args) + return c.deviceGet(conf, "container", args) case "set": - return c.deviceSet(config, "container", args) + return c.deviceSet(conf, "container", args) case "unset": - return c.deviceUnset(config, "container", args) + return c.deviceUnset(conf, "container", args) case "show": - return c.deviceShow(config, "container", args) + return c.deviceShow(conf, "container", args) default: return errArgs } @@ -500,13 +562,17 @@ return errArgs } - remote := config.DefaultRemote + remote := conf.DefaultRemote container := "" if len(args) > 1 { - remote, container = config.ParseRemoteAndContainer(args[1]) + var err error + remote, container, err = conf.ParseRemote(args[1]) + if err != nil { + return err + } } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -524,7 +590,7 @@ return errArgs } -func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error { +func (c *configCmd) doContainerConfigEdit(client lxd.ContainerServer, cont string) error { // If stdin isn't a terminal, read text from it if !termios.IsTerminal(int(syscall.Stdin)) { contents, err := ioutil.ReadAll(os.Stdin) @@ -537,16 +603,22 @@ if err != nil { return err } - return client.UpdateContainerConfig(cont, newdata) + + op, err := client.UpdateContainer(cont, newdata, "") + if err != nil { + return err + } + + return op.Wait() } // Extract the current value - config, err := client.ContainerInfo(cont) + container, etag, err := client.GetContainer(cont) if err != nil { return err } - brief := config.Writable() + brief := container.Writable() data, err := yaml.Marshal(&brief) if err != nil { return err @@ -563,7 +635,11 @@ newdata := api.ContainerPut{} err = yaml.Unmarshal(content, &newdata) if err == nil { - err = client.UpdateContainerConfig(cont, newdata) + var op *lxd.Operation + op, err = client.UpdateContainer(cont, newdata, etag) + if err == nil { + err = op.Wait() + } } // Respawn the editor @@ -584,10 +660,11 @@ } break } + return nil } -func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error { +func (c *configCmd) doDaemonConfigEdit(client lxd.ContainerServer) error { // If stdin isn't a terminal, read text from it if !termios.IsTerminal(int(syscall.Stdin)) { contents, err := ioutil.ReadAll(os.Stdin) @@ -601,17 +678,16 @@ return err } - _, err = client.UpdateServerConfig(newdata) - return err + return client.UpdateServer(newdata, "") } // Extract the current value - config, err := client.ServerStatus() + server, etag, err := client.GetServer() if err != nil { return err } - brief := config.Writable() + brief := server.Writable() data, err := yaml.Marshal(&brief) if err != nil { return err @@ -628,7 +704,7 @@ newdata := api.ServerPut{} err = yaml.Unmarshal(content, &newdata) if err == nil { - _, err = client.UpdateServerConfig(newdata) + err = client.UpdateServer(newdata, etag) } // Respawn the editor @@ -649,55 +725,96 @@ } break } + return nil } -func (c *configCmd) deviceAdd(config *lxd.Config, which string, args []string) error { +func (c *configCmd) deviceAdd(conf *config.Config, which string, args []string) error { if len(args) < 5 { return errArgs } - remote, name := config.ParseRemoteAndContainer(args[2]) - client, err := lxd.NewClient(config, remote) + remote, name, err := conf.ParseRemote(args[2]) + if err != nil { + return err + } + + client, err := conf.GetContainerServer(remote) if err != nil { return err } devname := args[3] - devtype := args[4] - var props []string + device := map[string]string{} + device["type"] = args[4] if len(args) > 5 { - props = args[5:] - } else { - props = []string{} + for _, prop := range args[5:] { + results := strings.SplitN(prop, "=", 2) + if len(results) != 2 { + return fmt.Errorf("No value found in %q", prop) + } + k := results[0] + v := results[1] + device[k] = v + } } - var resp *api.Response if which == "profile" { - resp, err = client.ProfileDeviceAdd(name, devname, devtype, props) + profile, etag, err := client.GetProfile(name) + if err != nil { + return err + } + + _, ok := profile.Devices[devname] + if ok { + return fmt.Errorf(i18n.G("The device already exists")) + } + + profile.Devices[devname] = device + + err = client.UpdateProfile(name, profile.Writable(), etag) + if err != nil { + return err + } } else { - resp, err = client.ContainerDeviceAdd(name, devname, devtype, props) - } - if err != nil { - return err - } - if which != "profile" { - err = client.WaitForSuccess(resp.Operation) - } - if err == nil { - fmt.Printf(i18n.G("Device %s added to %s")+"\n", devname, name) + container, etag, err := client.GetContainer(name) + if err != nil { + return err + } + + _, ok := container.Devices[devname] + if ok { + return fmt.Errorf(i18n.G("The device already exists")) + } + + container.Devices[devname] = device + + op, err := client.UpdateContainer(name, container.Writable(), etag) + if err != nil { + return err + } + + err = op.Wait() + if err != nil { + return err + } } - return err + + fmt.Printf(i18n.G("Device %s added to %s")+"\n", devname, name) + return nil } -func (c *configCmd) deviceGet(config *lxd.Config, which string, args []string) error { +func (c *configCmd) deviceGet(conf *config.Config, which string, args []string) error { if len(args) < 5 { return errArgs } - remote, name := config.ParseRemoteAndContainer(args[2]) + remote, name, err := conf.ParseRemote(args[2]) + if err != nil { + return err + } - client, err := lxd.NewClient(config, remote) + client, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -706,24 +823,24 @@ key := args[4] if which == "profile" { - st, err := client.ProfileConfig(name) + profile, _, err := client.GetProfile(name) if err != nil { return err } - dev, ok := st.Devices[devname] + dev, ok := profile.Devices[devname] if !ok { return fmt.Errorf(i18n.G("The device doesn't exist")) } fmt.Println(dev[key]) } else { - st, err := client.ContainerInfo(name) + container, _, err := client.GetContainer(name) if err != nil { return err } - dev, ok := st.Devices[devname] + dev, ok := container.Devices[devname] if !ok { return fmt.Errorf(i18n.G("The device doesn't exist")) } @@ -734,14 +851,17 @@ return nil } -func (c *configCmd) deviceSet(config *lxd.Config, which string, args []string) error { +func (c *configCmd) deviceSet(conf *config.Config, which string, args []string) error { if len(args) < 6 { return errArgs } - remote, name := config.ParseRemoteAndContainer(args[2]) + remote, name, err := conf.ParseRemote(args[2]) + if err != nil { + return err + } - client, err := lxd.NewClient(config, remote) + client, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -751,54 +871,62 @@ value := args[5] if which == "profile" { - st, err := client.ProfileConfig(name) + profile, etag, err := client.GetProfile(name) if err != nil { return err } - dev, ok := st.Devices[devname] + dev, ok := profile.Devices[devname] if !ok { return fmt.Errorf(i18n.G("The device doesn't exist")) } dev[key] = value - st.Devices[devname] = dev + profile.Devices[devname] = dev - err = client.PutProfile(name, st.Writable()) + err = client.UpdateProfile(name, profile.Writable(), etag) if err != nil { return err } } else { - st, err := client.ContainerInfo(name) + container, etag, err := client.GetContainer(name) if err != nil { return err } - dev, ok := st.Devices[devname] + dev, ok := container.Devices[devname] if !ok { return fmt.Errorf(i18n.G("The device doesn't exist")) } dev[key] = value - st.Devices[devname] = dev + container.Devices[devname] = dev + + op, err := client.UpdateContainer(name, container.Writable(), etag) + if err != nil { + return err + } - err = client.UpdateContainerConfig(name, st.Writable()) + err = op.Wait() if err != nil { return err } } - return err + return nil } -func (c *configCmd) deviceUnset(config *lxd.Config, which string, args []string) error { +func (c *configCmd) deviceUnset(conf *config.Config, which string, args []string) error { if len(args) < 5 { return errArgs } - remote, name := config.ParseRemoteAndContainer(args[2]) + remote, name, err := conf.ParseRemote(args[2]) + if err != nil { + return err + } - client, err := lxd.NewClient(config, remote) + client, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -807,127 +935,179 @@ key := args[4] if which == "profile" { - st, err := client.ProfileConfig(name) + profile, etag, err := client.GetProfile(name) if err != nil { return err } - dev, ok := st.Devices[devname] + dev, ok := profile.Devices[devname] if !ok { return fmt.Errorf(i18n.G("The device doesn't exist")) } - delete(dev, key) - st.Devices[devname] = dev + profile.Devices[devname] = dev - err = client.PutProfile(name, st.Writable()) + err = client.UpdateProfile(name, profile.Writable(), etag) if err != nil { return err } } else { - st, err := client.ContainerInfo(name) + container, etag, err := client.GetContainer(name) if err != nil { return err } - dev, ok := st.Devices[devname] + dev, ok := container.Devices[devname] if !ok { return fmt.Errorf(i18n.G("The device doesn't exist")) } - delete(dev, key) - st.Devices[devname] = dev + container.Devices[devname] = dev + + op, err := client.UpdateContainer(name, container.Writable(), etag) + if err != nil { + return err + } - err = client.UpdateContainerConfig(name, st.Writable()) + err = op.Wait() if err != nil { return err } } - return err + return nil } -func (c *configCmd) deviceRm(config *lxd.Config, which string, args []string) error { +func (c *configCmd) deviceRm(conf *config.Config, which string, args []string) error { if len(args) < 4 { return errArgs } - remote, name := config.ParseRemoteAndContainer(args[2]) - client, err := lxd.NewClient(config, remote) + remote, name, err := conf.ParseRemote(args[2]) if err != nil { return err } - devname := args[3] - var resp *api.Response - if which == "profile" { - resp, err = client.ProfileDeviceDelete(name, devname) - } else { - resp, err = client.ContainerDeviceDelete(name, devname) - } + client, err := conf.GetContainerServer(remote) if err != nil { return err } - if which != "profile" { - err = client.WaitForSuccess(resp.Operation) - } - if err == nil { - fmt.Printf(i18n.G("Device %s removed from %s")+"\n", devname, name) + + devname := args[3] + + if which == "profile" { + profile, etag, err := client.GetProfile(name) + if err != nil { + return err + } + + _, ok := profile.Devices[devname] + if !ok { + return fmt.Errorf(i18n.G("The device doesn't exist")) + } + delete(profile.Devices, devname) + + err = client.UpdateProfile(name, profile.Writable(), etag) + if err != nil { + return err + } + } else { + container, etag, err := client.GetContainer(name) + if err != nil { + return err + } + + _, ok := container.Devices[devname] + if !ok { + return fmt.Errorf(i18n.G("The device doesn't exist")) + } + delete(container.Devices, devname) + + op, err := client.UpdateContainer(name, container.Writable(), etag) + if err != nil { + return err + } + + err = op.Wait() + if err != nil { + return err + } } - return err + + fmt.Printf(i18n.G("Device %s removed from %s")+"\n", devname, name) + return nil } -func (c *configCmd) deviceList(config *lxd.Config, which string, args []string) error { +func (c *configCmd) deviceList(conf *config.Config, which string, args []string) error { if len(args) < 3 { return errArgs } - remote, name := config.ParseRemoteAndContainer(args[2]) - client, err := lxd.NewClient(config, remote) + remote, name, err := conf.ParseRemote(args[2]) if err != nil { return err } - var resp []string - if which == "profile" { - resp, err = client.ProfileListDevices(name) - } else { - resp, err = client.ContainerListDevices(name) - } + client, err := conf.GetContainerServer(remote) if err != nil { return err } - fmt.Printf("%s\n", strings.Join(resp, "\n")) + var devices []string + if which == "profile" { + profile, _, err := client.GetProfile(name) + if err != nil { + return err + } + + for k := range profile.Devices { + devices = append(devices, k) + } + } else { + container, _, err := client.GetContainer(name) + if err != nil { + return err + } + + for k := range container.Devices { + devices = append(devices, k) + } + } + + fmt.Printf("%s\n", strings.Join(devices, "\n")) return nil } -func (c *configCmd) deviceShow(config *lxd.Config, which string, args []string) error { +func (c *configCmd) deviceShow(conf *config.Config, which string, args []string) error { if len(args) < 3 { return errArgs } - remote, name := config.ParseRemoteAndContainer(args[2]) - client, err := lxd.NewClient(config, remote) + remote, name, err := conf.ParseRemote(args[2]) + if err != nil { + return err + } + + client, err := conf.GetContainerServer(remote) if err != nil { return err } var devices map[string]map[string]string if which == "profile" { - resp, err := client.ProfileConfig(name) + profile, _, err := client.GetProfile(name) if err != nil { return err } - devices = resp.Devices + devices = profile.Devices } else { - resp, err := client.ContainerInfo(name) + container, _, err := client.GetContainer(name) if err != nil { return err } - devices = resp.Devices + devices = container.Devices } data, err := yaml.Marshal(&devices) @@ -936,6 +1116,5 @@ } fmt.Printf(string(data)) - return nil } diff -Nru lxd-2.14/lxc/copy.go lxd-2.15/lxc/copy.go --- lxd-2.14/lxc/copy.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/copy.go 2017-06-28 03:00:23.000000000 +0000 @@ -4,9 +4,9 @@ "fmt" "strings" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" - "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" ) @@ -39,260 +39,197 @@ gnuflag.BoolVar(&c.containerOnly, "container-only", false, i18n.G("Copy the container without its snapshots")) } -func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destResource string, keepVolatile bool, ephemeral int, stateful bool, containerOnly bool) error { - sourceRemote, sourceName := config.ParseRemoteAndContainer(sourceResource) - destRemote, destName := config.ParseRemoteAndContainer(destResource) +func (c *copyCmd) copyContainer(conf *config.Config, sourceResource string, destResource string, keepVolatile bool, ephemeral int, stateful bool, containerOnly bool) error { + // Parse the source + sourceRemote, sourceName, err := conf.ParseRemote(sourceResource) + if err != nil { + return err + } + // Parse the destination + destRemote, destName, err := conf.ParseRemote(destResource) + if err != nil { + return err + } + + // Make sure we have a container or snapshot name if sourceName == "" { - return fmt.Errorf(i18n.G("you must specify a source container name")) + return fmt.Errorf(i18n.G("You must specify a source container name")) } + // If no destination name was provided, use the same as the source if destName == "" && destResource != "" { destName = sourceName } - source, err := lxd.NewClient(config, sourceRemote) + // Connect to the source host + source, err := conf.GetContainerServer(sourceRemote) if err != nil { return err } - var status struct { - Architecture string - Devices map[string]map[string]string - Config map[string]string - Profiles []string - } - - // TODO: presumably we want to do this for copying snapshots too? We - // need to think a bit more about how we track the baseImage in the - // face of LVM and snapshots in general; this will probably make more - // sense once that work is done. - baseImage := "" - - if !shared.IsSnapshot(sourceName) { - result, err := source.ContainerInfo(sourceName) + // Connect to the destination host + var dest lxd.ContainerServer + if sourceRemote == destRemote { + // Source and destination are the same + dest = source + } else { + // Destination is different, connect to it + dest, err = conf.GetContainerServer(destRemote) if err != nil { return err } + } - status.Architecture = result.Architecture - status.Devices = result.Devices - status.Config = result.Config - status.Profiles = result.Profiles + var op *lxd.RemoteOperation + if shared.IsSnapshot(sourceName) { + // Prepare the container creation request + args := lxd.ContainerSnapshotCopyArgs{ + Name: destName, + } - } else { - result, err := source.SnapshotInfo(sourceName) + // Copy of a snapshot into a new container + srcFields := strings.SplitN(sourceName, shared.SnapshotDelimiter, 2) + entry, _, err := source.GetContainerSnapshot(srcFields[0], srcFields[1]) if err != nil { return err } - status.Architecture = result.Architecture - status.Devices = result.Devices - status.Config = result.Config - status.Profiles = result.Profiles - } + // Allow adding additional profiles + if c.profArgs != nil { + entry.Profiles = append(entry.Profiles, c.profArgs...) + } - if c.profArgs != nil { - status.Profiles = append(status.Profiles, c.profArgs...) - } + // Allow setting additional config keys + if configMap != nil { + for key, value := range configMap { + entry.Config[key] = value + } + } - if configMap != nil { - for key, value := range configMap { - status.Config[key] = value + // Allow overriding the ephemeral status + if ephemeral == 1 { + entry.Ephemeral = true + } else if ephemeral == 0 { + entry.Ephemeral = false } - } - baseImage = status.Config["volatile.base_image"] + // Strip the volatile keys if requested + if !keepVolatile { + for k := range entry.Config { + if k == "volatile.base_image" { + continue + } - if !keepVolatile { - for k := range status.Config { - if strings.HasPrefix(k, "volatile") { - delete(status.Config, k) + if strings.HasPrefix(k, "volatile") { + delete(entry.Config, k) + } } } - } - // Do a local copy if the remotes are the same, otherwise do a migration - if sourceRemote == destRemote { - if sourceName == destName { - return fmt.Errorf(i18n.G("can't copy to the same container name")) - } - - cp, err := source.LocalCopy(sourceName, destName, status.Config, status.Profiles, ephemeral == 1, containerOnly) + // Do the actual copy + op, err = dest.CopyContainerSnapshot(source, *entry, &args) if err != nil { return err } + } else { + // Prepare the container creation request + args := lxd.ContainerCopyArgs{ + Name: destName, + Live: stateful, + ContainerOnly: containerOnly, + } - err = source.WaitForSuccess(cp.Operation) + // Copy of a container into a new container + entry, _, err := source.GetContainer(sourceName) if err != nil { return err } - if destResource == "" { - op, err := cp.MetadataAsOperation() - if err != nil { - return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server")) - } + // Allow adding additional profiles + if c.profArgs != nil { + entry.Profiles = append(entry.Profiles, c.profArgs...) + } - containers, ok := op.Resources["containers"] - if !ok || len(containers) == 0 { - return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server")) + // Allow setting additional config keys + if configMap != nil { + for key, value := range configMap { + entry.Config[key] = value } - - fields := strings.Split(containers[0], "/") - fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1]) } - return nil - } - - dest, err := lxd.NewClient(config, destRemote) - if err != nil { - return err - } - - sourceProfs := shared.NewStringSet(status.Profiles) - destProfs := []string{} + // Allow overriding the ephemeral status + if ephemeral == 1 { + entry.Ephemeral = true + } else if ephemeral == 0 { + entry.Ephemeral = false + } - profiles, err := dest.ListProfiles() - if err != nil { - return err - } + // Strip the volatile keys if requested + if !keepVolatile { + for k := range entry.Config { + if k == "volatile.base_image" { + continue + } - for _, profile := range profiles { - destProfs = append(destProfs, profile.Name) - } - - if !sourceProfs.IsSubset(shared.NewStringSet(destProfs)) { - return fmt.Errorf(i18n.G("not all the profiles from the source exist on the target")) - } + if strings.HasPrefix(k, "volatile") { + delete(entry.Config, k) + } + } + } - if ephemeral == -1 { - ct, err := source.ContainerInfo(sourceName) + // Do the actual copy + op, err = dest.CopyContainer(source, *entry, &args) if err != nil { return err } - - if ct.Ephemeral { - ephemeral = 1 - } else { - ephemeral = 0 - } } - sourceWSResponse, err := source.GetMigrationSourceWS(sourceName, stateful, containerOnly) + // Wait for the copy to complete + err = op.Wait() if err != nil { return err } - secrets := map[string]string{} - - op, err := sourceWSResponse.MetadataAsOperation() - if err != nil { - return err - } - - for k, v := range op.Metadata { - secrets[k] = v.(string) - } - - addresses, err := source.Addresses() - if err != nil { - return err - } - - /* Since we're trying a bunch of different network ports that - * may be invalid, we can get "bad handshake" errors when the - * websocket code tries to connect. If the first error is a - * real error, but the subsequent errors are only network - * errors, we should try to report the first real error. Of - * course, if all the errors are websocket errors, let's just - * report that. - */ - waitchan := make(chan map[int]error, 2) - wait := func(cli *lxd.Client, op string, ch chan map[int]error, senderid int) { - ch <- map[int]error{senderid: cli.WaitForSuccess(op)} - } - - var migrationErrFromClient error - for _, addr := range addresses { - var migration *api.Response - - sourceWSUrl := "https://" + addr + sourceWSResponse.Operation - migration, migrationErrFromClient = dest.MigrateFrom(destName, sourceWSUrl, source.Certificate, secrets, status.Architecture, status.Config, status.Devices, status.Profiles, baseImage, ephemeral == 1, false, source, sourceWSResponse.Operation, containerOnly) - if migrationErrFromClient != nil { - continue - } - - // If push mode is implemented then MigrateFrom will return a - // non-waitable operation. So this needs to be conditionalized - // on pull mode. - destOpId := 0 - go wait(dest, migration.Operation, waitchan, destOpId) - sourceOpId := 1 - go wait(source, sourceWSResponse.Operation, waitchan, sourceOpId) - - var sourceOpErr error - var destOpErr error - for i := 0; i < cap(waitchan); i++ { - tmp := <-waitchan - err, ok := tmp[sourceOpId] - if ok { - sourceOpErr = err - } else { - destOpErr = err - } - } - - if destOpErr != nil { - continue - } - - if sourceOpErr != nil { - return sourceOpErr + // If choosing a random name, show it to the user + if destResource == "" { + // Get the succesful operation data + opInfo, err := op.GetTarget() + if err != nil { + return err } - if destResource == "" { - op, err := migration.MetadataAsOperation() - if err != nil { - return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server")) - } - - containers, ok := op.Resources["containers"] - if !ok || len(containers) == 0 { - return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server")) - } - - fields := strings.Split(containers[0], "/") - fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1]) + // Extract the list of affected containers + containers, ok := opInfo.Resources["containers"] + if !ok || len(containers) != 1 { + return fmt.Errorf(i18n.G("Failed to get the new container name")) } - return nil - } - - // Check for an error at the source - sourceOp, sourceErr := source.GetOperation(sourceWSResponse.Operation) - if sourceErr == nil && sourceOp.Err != "" { - return fmt.Errorf(i18n.G("Migration failed on source host: %s"), sourceOp.Err) + // Extract the name of the container + fields := strings.Split(containers[0], "/") + fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1]) } - // Return the error from destination - return fmt.Errorf(i18n.G("Migration failed on target host: %s"), migrationErrFromClient) + return nil } -func (c *copyCmd) run(config *lxd.Config, args []string) error { +func (c *copyCmd) run(conf *config.Config, args []string) error { + // We at least need a source container name if len(args) < 1 { return errArgs } + // For copies, default to non-ephemeral and allow override (move uses -1) ephem := 0 if c.ephem { ephem = 1 } + // If not target name is specified, one will be chosed by the server if len(args) < 2 { - return c.copyContainer(config, args[0], "", false, ephem, false, c.containerOnly) + return c.copyContainer(conf, args[0], "", false, ephem, false, c.containerOnly) } - return c.copyContainer(config, args[0], args[1], false, ephem, false, c.containerOnly) + // Normal copy with a pre-determined name + return c.copyContainer(conf, args[0], args[1], false, ephem, false, c.containerOnly) } diff -Nru lxd-2.14/lxc/delete.go lxd-2.15/lxc/delete.go --- lxd-2.14/lxc/delete.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/delete.go 2017-06-28 03:00:23.000000000 +0000 @@ -6,7 +6,8 @@ "os" "strings" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" @@ -48,24 +49,37 @@ return nil } -func (c *deleteCmd) doDelete(d *lxd.Client, name string) error { - resp, err := d.Delete(name) +func (c *deleteCmd) doDelete(d lxd.ContainerServer, name string) error { + var op *lxd.Operation + var err error + + if shared.IsSnapshot(name) { + // Snapshot delete + fields := strings.SplitN(name, shared.SnapshotDelimiter, 2) + op, err = d.DeleteContainerSnapshot(fields[0], fields[1]) + } else { + // Container delete + op, err = d.DeleteContainer(name) + } if err != nil { return err } - return d.WaitForSuccess(resp.Operation) + return op.Wait() } -func (c *deleteCmd) run(config *lxd.Config, args []string) error { +func (c *deleteCmd) run(conf *config.Config, args []string) error { if len(args) == 0 { return errArgs } for _, nameArg := range args { - remote, name := config.ParseRemoteAndContainer(nameArg) + remote, name, err := conf.ParseRemote(nameArg) + if err != nil { + return err + } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -81,7 +95,7 @@ return c.doDelete(d, name) } - ct, err := d.ContainerInfo(name) + ct, _, err := d.GetContainer(name) if err != nil { return err } @@ -91,18 +105,20 @@ return fmt.Errorf(i18n.G("The container is currently running, stop it first or pass --force.")) } - resp, err := d.Action(name, shared.Stop, -1, true, false) - if err != nil { - return err + req := api.ContainerStatePut{ + Action: "stop", + Timeout: -1, + Force: true, } - op, err := d.WaitFor(resp.Operation) + op, err := d.UpdateContainerState(name, req, "") if err != nil { return err } - if op.StatusCode == api.Failure { - return fmt.Errorf(i18n.G("Stopping container failed!")) + err = op.Wait() + if err != nil { + return fmt.Errorf(i18n.G("Stopping the container failed: %s"), err) } if ct.Ephemeral == true { diff -Nru lxd-2.14/lxc/exec.go lxd-2.15/lxc/exec.go --- lxd-2.14/lxc/exec.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/exec.go 2017-06-28 03:00:23.000000000 +0000 @@ -13,7 +13,8 @@ "github.com/gorilla/websocket" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" @@ -116,7 +117,7 @@ return err } -func (c *execCmd) run(config *lxd.Config, args []string) error { +func (c *execCmd) run(conf *config.Config, args []string) error { if len(args) < 2 { return errArgs } @@ -129,8 +130,12 @@ return fmt.Errorf(i18n.G("You can't pass -t or -T at the same time as --mode")) } - remote, name := config.ParseRemoteAndContainer(args[0]) - d, err := lxd.NewClient(config, remote) + remote, name, err := conf.ParseRemote(args[0]) + if err != nil { + return err + } + + d, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -194,11 +199,39 @@ } stdout := c.getStdout() - ret, err := d.Exec(name, args[1:], env, stdin, stdout, os.Stderr, handler, width, height) + + req := api.ContainerExecPost{ + Command: args[1:], + WaitForWS: true, + Interactive: interactive, + Environment: env, + Width: width, + Height: height, + } + + execArgs := lxd.ContainerExecArgs{ + Stdin: stdin, + Stdout: stdout, + Stderr: os.Stderr, + Control: handler, + DataDone: make(chan bool), + } + + // Run the command in the container + op, err := d.ExecContainer(name, req, &execArgs) if err != nil { return err } + // Wait for the operation to complete + err = op.Wait() + if err != nil { + return err + } + + // Wait for any remaining I/O to be flushed + <-execArgs.DataDone + if oldttystate != nil { /* A bit of a special case here: we want to exit with the same code as * the process inside the container, so we explicitly exit here @@ -210,6 +243,6 @@ termios.Restore(cfd, oldttystate) } - os.Exit(ret) - return fmt.Errorf(i18n.G("unreachable return reached")) + os.Exit(int(op.Metadata["return"].(float64))) + return nil } diff -Nru lxd-2.14/lxc/exec_unix.go lxd-2.15/lxc/exec_unix.go --- lxd-2.14/lxc/exec_unix.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/exec_unix.go 2017-06-28 03:00:23.000000000 +0000 @@ -10,7 +10,6 @@ "github.com/gorilla/websocket" - "github.com/lxc/lxd" "github.com/lxc/lxd/shared/logger" ) @@ -22,7 +21,7 @@ return os.LookupEnv("TERM") } -func (c *execCmd) controlSocketHandler(d *lxd.Client, control *websocket.Conn) { +func (c *execCmd) controlSocketHandler(control *websocket.Conn) { ch := make(chan os.Signal, 10) signal.Notify(ch, syscall.SIGWINCH, diff -Nru lxd-2.14/lxc/exec_windows.go lxd-2.15/lxc/exec_windows.go --- lxd-2.14/lxc/exec_windows.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/exec_windows.go 2017-06-28 03:00:23.000000000 +0000 @@ -9,7 +9,6 @@ "github.com/gorilla/websocket" "github.com/mattn/go-colorable" - "github.com/lxc/lxd" "github.com/lxc/lxd/shared/logger" ) @@ -32,7 +31,7 @@ return "dumb", true } -func (c *execCmd) controlSocketHandler(d *lxd.Client, control *websocket.Conn) { +func (c *execCmd) controlSocketHandler(control *websocket.Conn) { // TODO: figure out what the equivalent of signal.SIGWINCH is on // windows and use that; for now if you resize your terminal it just // won't work quite correctly. diff -Nru lxd-2.14/lxc/file.go lxd-2.15/lxc/file.go --- lxd-2.14/lxc/file.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/file.go 2017-06-28 03:00:23.000000000 +0000 @@ -6,11 +6,13 @@ "io/ioutil" "os" "path" + "path/filepath" "strconv" "strings" "syscall" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" @@ -68,7 +70,150 @@ gnuflag.BoolVar(&c.mkdirs, "p", false, i18n.G("Create any directories necessary")) } -func (c *fileCmd) push(config *lxd.Config, send_file_perms bool, args []string) error { +func (c *fileCmd) recursivePullFile(d lxd.ContainerServer, container string, p string, targetDir string) error { + buf, resp, err := d.GetContainerFile(container, p) + if err != nil { + return err + } + + target := filepath.Join(targetDir, filepath.Base(p)) + if resp.Type == "directory" { + err := os.Mkdir(target, os.FileMode(resp.Mode)) + if err != nil { + return err + } + + for _, ent := range resp.Entries { + nextP := path.Join(p, ent) + + err := c.recursivePullFile(d, container, nextP, target) + if err != nil { + return err + } + } + } else if resp.Type == "file" { + f, err := os.Create(target) + if err != nil { + return err + } + defer f.Close() + + err = os.Chmod(target, os.FileMode(resp.Mode)) + if err != nil { + return err + } + + _, err = io.Copy(f, buf) + if err != nil { + return err + } + } else { + return fmt.Errorf(i18n.G("Unknown file type '%s'"), resp.Type) + } + + return nil +} + +func (c *fileCmd) recursivePushFile(d lxd.ContainerServer, container string, source string, target string) error { + source = filepath.Clean(source) + sourceDir, _ := filepath.Split(source) + sourceLen := len(sourceDir) + + sendFile := func(p string, fInfo os.FileInfo, err error) error { + if err != nil { + return fmt.Errorf(i18n.G("Failed to walk path for %s: %s"), p, err) + } + + // Detect symlinks + if !fInfo.Mode().IsRegular() && !fInfo.Mode().IsDir() { + return fmt.Errorf(i18n.G("'%s' isn't a regular file or directory."), p) + } + + targetPath := path.Join(target, filepath.ToSlash(p[sourceLen:])) + if fInfo.IsDir() { + mode, uid, gid := shared.GetOwnerMode(fInfo) + args := lxd.ContainerFileArgs{ + UID: int64(uid), + GID: int64(gid), + Mode: int(mode.Perm()), + Type: "directory", + } + + return d.CreateContainerFile(container, targetPath, args) + } + + f, err := os.Open(p) + if err != nil { + return err + } + defer f.Close() + + mode, uid, gid := shared.GetOwnerMode(fInfo) + + args := lxd.ContainerFileArgs{ + Content: f, + UID: int64(uid), + GID: int64(gid), + Mode: int(mode.Perm()), + Type: "file", + } + + return d.CreateContainerFile(container, targetPath, args) + } + + return filepath.Walk(source, sendFile) +} + +func (c *fileCmd) recursiveMkdir(d lxd.ContainerServer, container string, p string, mode os.FileMode, uid int64, gid int64) error { + /* special case, every container has a /, we don't need to do anything */ + if p == "/" { + return nil + } + + // Remove trailing "/" e.g. /A/B/C/. Otherwise we will end up with an + // empty array entry "" which will confuse the Mkdir() loop below. + pclean := filepath.Clean(p) + parts := strings.Split(pclean, "/") + i := len(parts) + + for ; i >= 1; i-- { + cur := filepath.Join(parts[:i]...) + _, resp, err := d.GetContainerFile(container, cur) + if err != nil { + continue + } + + if resp.Type != "directory" { + return fmt.Errorf(i18n.G("%s is not a directory"), cur) + } + + i++ + break + } + + for ; i <= len(parts); i++ { + cur := filepath.Join(parts[:i]...) + if cur == "" { + continue + } + + args := lxd.ContainerFileArgs{ + UID: uid, + GID: gid, + Mode: int(mode.Perm()), + Type: "directory", + } + + err := d.CreateContainerFile(container, cur, args) + if err != nil { + return err + } + } + + return nil +} + +func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string) error { if len(args) < 2 { return errArgs } @@ -80,7 +225,10 @@ return fmt.Errorf(i18n.G("Invalid target %s"), target) } - remote, container := config.ParseRemoteAndContainer(pathSpec[0]) + remote, container, err := conf.ParseRemote(pathSpec[0]) + if err != nil { + return err + } targetIsDir := strings.HasSuffix(target, "/") // re-add leading / that got stripped by the SplitN @@ -95,7 +243,7 @@ logger.Debugf("Pushing to: %s (isdir: %t)", targetPath, targetIsDir) - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -137,13 +285,16 @@ } mode, uid, gid := shared.GetOwnerMode(finfo) - if err := d.MkdirP(container, targetPath, mode, uid, gid); err != nil { + + err = c.recursiveMkdir(d, container, targetPath, mode, int64(uid), int64(gid)) + if err != nil { return err } } for _, fname := range sourcefilenames { - if err := d.RecursivePushFile(container, fname, targetPath); err != nil { + err := c.recursivePushFile(d, container, fname, targetPath) + if err != nil { return err } } @@ -210,11 +361,19 @@ } } - if err := d.MkdirP(container, path.Dir(fpath), mode, uid, gid); err != nil { + err = c.recursiveMkdir(d, container, path.Dir(fpath), mode, int64(uid), int64(gid)) + if err != nil { return err } } + args := lxd.ContainerFileArgs{ + Content: f, + UID: -1, + GID: -1, + Mode: -1, + } + if send_file_perms { if c.mode == "" || c.uid == -1 || c.gid == -1 { finfo, err := f.Stat() @@ -240,11 +399,12 @@ } } - err = d.PushFile(container, fpath, gid, uid, fmt.Sprintf("%04o", mode.Perm()), f) - } else { - err = d.PushFile(container, fpath, -1, -1, "", f) + args.UID = int64(uid) + args.GID = int64(gid) + args.Mode = int(mode.Perm()) } + err = d.CreateContainerFile(container, fpath, args) if err != nil { return err } @@ -253,7 +413,7 @@ return nil } -func (c *fileCmd) pull(config *lxd.Config, args []string) error { +func (c *fileCmd) pull(conf *config.Config, args []string) error { if len(args) < 2 { return errArgs } @@ -279,7 +439,8 @@ return fmt.Errorf(i18n.G("More than one file to download, but target is not a directory")) } } else if strings.HasSuffix(target, string(os.PathSeparator)) || len(args)-1 > 1 || c.recursive { - if err := os.MkdirAll(target, 0755); err != nil { + err := os.MkdirAll(target, 0755) + if err != nil { return err } targetIsDir = true @@ -291,27 +452,32 @@ return fmt.Errorf(i18n.G("Invalid source %s"), f) } - remote, container := config.ParseRemoteAndContainer(pathSpec[0]) - d, err := lxd.NewClient(config, remote) + remote, container, err := conf.ParseRemote(pathSpec[0]) + if err != nil { + return err + } + + d, err := conf.GetContainerServer(remote) if err != nil { return err } if c.recursive { - if err := d.RecursivePullFile(container, pathSpec[1], target); err != nil { + err := c.recursivePullFile(d, container, pathSpec[1], target) + if err != nil { return err } continue } - _, _, mode, type_, buf, _, err := d.PullFile(container, pathSpec[1]) + buf, resp, err := d.GetContainerFile(container, pathSpec[1]) if err != nil { return err } - if type_ == "directory" { - return fmt.Errorf(i18n.G("can't pull a directory without --recursive")) + if resp.Type == "directory" { + return fmt.Errorf(i18n.G("Can't pull a directory without --recursive")) } var targetPath string @@ -331,7 +497,7 @@ } defer f.Close() - err = os.Chmod(targetPath, os.FileMode(mode)) + err = os.Chmod(targetPath, os.FileMode(resp.Mode)) if err != nil { return err } @@ -346,7 +512,7 @@ return nil } -func (c *fileCmd) delete(config *lxd.Config, args []string) error { +func (c *fileCmd) delete(conf *config.Config, args []string) error { if len(args) < 1 { return errArgs } @@ -357,13 +523,17 @@ return fmt.Errorf(i18n.G("Invalid path %s"), f) } - remote, container := config.ParseRemoteAndContainer(pathSpec[0]) - d, err := lxd.NewClient(config, remote) + remote, container, err := conf.ParseRemote(pathSpec[0]) + if err != nil { + return err + } + + d, err := conf.GetContainerServer(remote) if err != nil { return err } - err = d.DeleteFile(container, pathSpec[1]) + err = d.DeleteContainerFile(container, pathSpec[1]) if err != nil { return err } @@ -372,7 +542,7 @@ return nil } -func (c *fileCmd) edit(config *lxd.Config, args []string) error { +func (c *fileCmd) edit(conf *config.Config, args []string) error { if len(args) != 1 { return errArgs } @@ -383,7 +553,7 @@ // If stdin isn't a terminal, read text from it if !termios.IsTerminal(int(syscall.Stdin)) { - return c.push(config, false, append([]string{os.Stdin.Name()}, args[0])) + return c.push(conf, false, append([]string{os.Stdin.Name()}, args[0])) } // Create temp file @@ -394,7 +564,7 @@ defer os.Remove(fname) // Extract current value - err = c.pull(config, append([]string{args[0]}, fname)) + err = c.pull(conf, append([]string{args[0]}, fname)) if err != nil { return err } @@ -404,7 +574,7 @@ return err } - err = c.push(config, false, append([]string{fname}, args[0])) + err = c.push(conf, false, append([]string{fname}, args[0])) if err != nil { return err } @@ -412,20 +582,20 @@ return nil } -func (c *fileCmd) run(config *lxd.Config, args []string) error { +func (c *fileCmd) run(conf *config.Config, args []string) error { if len(args) < 1 { return errUsage } switch args[0] { case "push": - return c.push(config, true, args[1:]) + return c.push(conf, true, args[1:]) case "pull": - return c.pull(config, args[1:]) + return c.pull(conf, args[1:]) case "delete": - return c.delete(config, args[1:]) + return c.delete(conf, args[1:]) case "edit": - return c.edit(config, args[1:]) + return c.edit(conf, args[1:]) default: return errArgs } diff -Nru lxd-2.14/lxc/finger.go lxd-2.15/lxc/finger.go --- lxd-2.14/lxc/finger.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/finger.go 2017-06-28 03:00:23.000000000 +0000 @@ -1,7 +1,7 @@ package main import ( - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared/i18n" ) @@ -20,25 +20,26 @@ func (c *fingerCmd) flags() {} -func (c *fingerCmd) run(config *lxd.Config, args []string) error { +func (c *fingerCmd) run(conf *config.Config, args []string) error { if len(args) > 1 { return errArgs } - var remote string - if len(args) == 1 { - remote = config.ParseRemote(args[0]) - } else { - remote = config.DefaultRemote + // Parse the remote + remote := conf.DefaultRemote + if len(args) > 0 { + var err error + remote, _, err = conf.ParseRemote(args[0]) + if err != nil { + return err + } } - // New client may or may not need to connect to the remote host, but - // client.ServerStatus will at least request the basic information from - // the server. - client, err := lxd.NewClient(config, remote) + // Attempt to connect + _, err := conf.GetContainerServer(remote) if err != nil { return err } - _, err = client.ServerStatus() - return err + + return nil } diff -Nru lxd-2.14/lxc/help.go lxd-2.15/lxc/help.go --- lxd-2.14/lxc/help.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/help.go 2017-06-28 03:00:23.000000000 +0000 @@ -5,7 +5,7 @@ "os" "sort" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" ) @@ -29,7 +29,7 @@ gnuflag.BoolVar(&c.showAll, "all", false, i18n.G("Show all commands (not just interesting ones)")) } -func (c *helpCmd) run(config *lxd.Config, args []string) error { +func (c *helpCmd) run(conf *config.Config, args []string) error { if len(args) > 0 { for _, name := range args { cmd, ok := commands[name] diff -Nru lxd-2.14/lxc/image.go lxd-2.15/lxc/image.go --- lxd-2.14/lxc/image.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/image.go 2017-06-28 03:00:23.000000000 +0000 @@ -1,10 +1,13 @@ package main import ( + "encoding/csv" "encoding/json" "fmt" + "io" "io/ioutil" "os" + "path/filepath" "regexp" "sort" "strings" @@ -13,7 +16,8 @@ "github.com/olekukonko/tablewriter" "gopkg.in/yaml.v2" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" @@ -36,12 +40,18 @@ return nil } +type imageColumn struct { + Name string + Data func(api.Image) string +} + type imageCmd struct { addAliases aliasList publicImage bool copyAliases bool autoUpdate bool format string + columnsRaw string } func (c *imageCmd) showByDefault() bool { @@ -109,11 +119,35 @@ lxc image info [:] Print everything LXD knows about a given image. -lxc image list [:] [filter] [--format table|json] +lxc image list [:] [filter] [--format csv|json|table|yaml] [-c ] List images in the LXD image store. Filters may be of the = form for property based filtering, or part of the image hash or part of the image alias name. + The -c option takes a (optionally comma-separated) list of arguments that + control which image attributes to output when displaying in table or csv + format. + + Default column layout is: lfpdasu + + Column shorthand chars: + + l - Shortest image alias (and optionally number of other aliases) + + L - Newline-separated list of all image aliases + + f - Fingerprint + + p - Whether image is public + + d - Description + + a - Architecture + + s - Size + + u - Upload date + lxc image show [:] Yaml output of the user modifiable properties of an image. @@ -133,15 +167,96 @@ } func (c *imageCmd) flags() { + gnuflag.StringVar(&c.columnsRaw, "c", "lfpdasu", i18n.G("Columns")) + gnuflag.StringVar(&c.columnsRaw, "columns", "lfpdasu", i18n.G("Columns")) gnuflag.BoolVar(&c.publicImage, "public", false, i18n.G("Make image public")) gnuflag.BoolVar(&c.copyAliases, "copy-aliases", false, i18n.G("Copy aliases from source")) gnuflag.BoolVar(&c.autoUpdate, "auto-update", false, i18n.G("Keep the image up to date after initial copy")) gnuflag.Var(&c.addAliases, "alias", i18n.G("New alias to define at target")) - gnuflag.StringVar(&c.format, "format", "table", i18n.G("Format")) + gnuflag.StringVar(&c.format, "format", "table", i18n.G("Format (csv|json|table|yaml)")) } -func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error { +func (c *imageCmd) aliasColumnData(image api.Image) string { + shortest := c.shortestAlias(image.Aliases) + if len(image.Aliases) > 1 { + shortest = fmt.Sprintf(i18n.G("%s (%d more)"), shortest, len(image.Aliases)-1) + } + + return shortest +} + +func (c *imageCmd) aliasesColumnData(image api.Image) string { + aliases := []string{} + for _, alias := range image.Aliases { + aliases = append(aliases, alias.Name) + } + sort.Strings(aliases) + return strings.Join(aliases, "\n") +} + +func (c *imageCmd) fingerprintColumnData(image api.Image) string { + return image.Fingerprint[0:12] +} + +func (c *imageCmd) publicColumnData(image api.Image) string { + if image.Public { + return i18n.G("yes") + } + return i18n.G("no") +} + +func (c *imageCmd) descriptionColumnData(image api.Image) string { + return c.findDescription(image.Properties) +} + +func (c *imageCmd) architectureColumnData(image api.Image) string { + return image.Architecture +} + +func (c *imageCmd) sizeColumnData(image api.Image) string { + return fmt.Sprintf("%.2fMB", float64(image.Size)/1024.0/1024.0) +} + +func (c *imageCmd) uploadDateColumnData(image api.Image) string { + return image.UploadedAt.UTC().Format("Jan 2, 2006 at 3:04pm (MST)") +} + +func (c *imageCmd) parseColumns() ([]imageColumn, error) { + columnsShorthandMap := map[rune]imageColumn{ + 'l': {i18n.G("ALIAS"), c.aliasColumnData}, + 'L': {i18n.G("ALIASES"), c.aliasesColumnData}, + 'f': {i18n.G("FINGERPRINT"), c.fingerprintColumnData}, + 'p': {i18n.G("PUBLIC"), c.publicColumnData}, + 'd': {i18n.G("DESCRIPTION"), c.descriptionColumnData}, + 'a': {i18n.G("ARCH"), c.architectureColumnData}, + 's': {i18n.G("SIZE"), c.sizeColumnData}, + 'u': {i18n.G("UPLOAD DATE"), c.uploadDateColumnData}, + } + + columnList := strings.Split(c.columnsRaw, ",") + + columns := []imageColumn{} + for _, columnEntry := range columnList { + if columnEntry == "" { + return nil, fmt.Errorf("Empty column entry (redundant, leading or trailing command) in '%s'", c.columnsRaw) + } + + for _, columnRune := range columnEntry { + if column, ok := columnsShorthandMap[columnRune]; ok { + columns = append(columns, column) + } else { + return nil, fmt.Errorf("Unknown column shorthand char '%c' in '%s'", columnRune, columnEntry) + } + } + } + + return columns, nil +} + +func (c *imageCmd) doImageAlias(conf *config.Config, args []string) error { var remote string + var err error + switch args[1] { case "list": filters := []string{} @@ -150,12 +265,21 @@ result := strings.SplitN(args[2], ":", 2) if len(result) == 1 { filters = append(filters, args[2]) - remote, _ = config.ParseRemoteAndContainer("") + remote, _, err = conf.ParseRemote("") + if err != nil { + return err + } } else { - remote, _ = config.ParseRemoteAndContainer(args[2]) + remote, _, err = conf.ParseRemote(args[2]) + if err != nil { + return err + } } } else { - remote, _ = config.ParseRemoteAndContainer("") + remote, _, err = conf.ParseRemote("") + if err != nil { + return err + } } if len(args) > 3 { @@ -164,12 +288,12 @@ } } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetImageServer(remote) if err != nil { return err } - resp, err := d.ListAliases() + resp, err := d.GetImageAliases() if err != nil { return err } @@ -182,32 +306,45 @@ if len(args) < 4 { return errArgs } - remote, alias := config.ParseRemoteAndContainer(args[2]) - target := args[3] - d, err := lxd.NewClient(config, remote) + + remote, name, err := conf.ParseRemote(args[2]) if err != nil { return err } - /* TODO - what about description? */ - err = d.PostAlias(alias, alias, target) - return err + + d, err := conf.GetContainerServer(remote) + if err != nil { + return err + } + + alias := api.ImageAliasesPost{} + alias.Name = name + alias.Target = args[3] + + return d.CreateImageAlias(alias) case "delete": /* alias delete [:] */ if len(args) < 3 { return errArgs } - remote, alias := config.ParseRemoteAndContainer(args[2]) - d, err := lxd.NewClient(config, remote) + + remote, alias, err := conf.ParseRemote(args[2]) if err != nil { return err } - err = d.DeleteAlias(alias) + + d, err := conf.GetContainerServer(remote) + if err != nil { + return err + } + + err = d.DeleteImageAlias(alias) return err } return errArgs } -func (c *imageCmd) run(config *lxd.Config, args []string) error { +func (c *imageCmd) run(conf *config.Config, args []string) error { var remote string if len(args) < 1 { @@ -219,7 +356,7 @@ if len(args) < 2 { return errArgs } - return c.doImageAlias(config, args) + return c.doImageAlias(conf, args) case "copy": /* copy [:] [:] */ @@ -227,34 +364,77 @@ return errArgs } - remote, inName := config.ParseRemoteAndContainer(args[1]) - if inName == "" { - inName = "default" + remote, inName, err := conf.ParseRemote(args[1]) + if err != nil { + return err + } + + destRemote, outName, err := conf.ParseRemote(args[2]) + if err != nil { + return err } - destRemote, outName := config.ParseRemoteAndContainer(args[2]) if outName != "" { return errArgs } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetImageServer(remote) if err != nil { return err } - dest, err := lxd.NewClient(config, destRemote) + dest, err := conf.GetContainerServer(destRemote) if err != nil { return err } + // Check if an alias + fingerprint := c.dereferenceAlias(d, inName) + + // Get the image + image, _, err := d.GetImage(fingerprint) + if err != nil { + return err + } + + // Setup the copy arguments + aliases := []api.ImageAlias{} + for _, entry := range c.addAliases { + alias := api.ImageAlias{} + alias.Name = entry + aliases = append(aliases, alias) + } + + args := lxd.ImageCopyArgs{ + Aliases: aliases, + AutoUpdate: c.autoUpdate, + CopyAliases: c.copyAliases, + Public: c.publicImage, + } + + // Do the copy + op, err := dest.CopyImage(d, *image, &args) + if err != nil { + return err + } + + // Register progress handler progress := ProgressRenderer{Format: i18n.G("Copying the image: %s")} - err = d.CopyImage(inName, dest, c.copyAliases, c.addAliases, c.publicImage, c.autoUpdate, progress.Update) - if err == nil { - progress.Done(i18n.G("Image copied successfully!")) + _, err = op.AddHandler(progress.UpdateOp) + if err != nil { + progress.Done("") + return err } - progress.Done("") - return err + // Wait for operation to finish + err = op.Wait() + if err != nil { + progress.Done("") + return err + } + + progress.Done(i18n.G("Image copied successfully!")) + return nil case "delete": /* delete [:] [:][...] */ @@ -263,18 +443,24 @@ } for _, arg := range args[1:] { - remote, inName := config.ParseRemoteAndContainer(arg) - if inName == "" { - inName = "default" + var err error + remote, inName, err := conf.ParseRemote(arg) + if err != nil { + return err } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } image := c.dereferenceAlias(d, inName) - err = d.DeleteImage(image) + op, err := d.DeleteImage(image) + if err != nil { + return err + } + + err = op.Wait() if err != nil { return err } @@ -289,23 +475,33 @@ } for _, arg := range args[1:] { - remote, inName := config.ParseRemoteAndContainer(arg) - if inName == "" { - inName = "default" + remote, inName, err := conf.ParseRemote(arg) + if err != nil { + return err } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } image := c.dereferenceAlias(d, inName) progress := ProgressRenderer{Format: i18n.G("Refreshing the image: %s")} - refreshed, err := d.RefreshImage(image, progress.Update) + op, err := d.RefreshImage(image) if err != nil { return err } + // Register progress handler + _, err = op.AddHandler(progress.UpdateOp) + + // Check if refreshed + refreshed := false + flag, ok := op.Metadata["refreshed"] + if ok { + refreshed = flag.(bool) + } + if refreshed { progress.Done(i18n.G("Image refreshed successfully!")) } else { @@ -320,18 +516,18 @@ return errArgs } - remote, inName := config.ParseRemoteAndContainer(args[1]) - if inName == "" { - inName = "default" + remote, inName, err := conf.ParseRemote(args[1]) + if err != nil { + return err } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetImageServer(remote) if err != nil { return err } image := c.dereferenceAlias(d, inName) - info, err := d.GetImageInfo(image) + info, _, err := d.GetImage(image) if err != nil { return err } @@ -392,7 +588,6 @@ return errArgs } - var fingerprint string var imageFile string var rootfsFile string var properties []string @@ -402,7 +597,11 @@ split := strings.Split(arg, "=") if len(split) == 1 || shared.PathExists(arg) { if strings.HasSuffix(arg, ":") { - remote = config.ParseRemote(arg) + var err error + remote, _, err = conf.ParseRemote(arg) + if err != nil { + return err + } } else { if imageFile == "" { imageFile = args[1] @@ -416,7 +615,7 @@ } if remote == "" { - remote = config.DefaultRemote + remote = conf.DefaultRemote } if imageFile == "" { @@ -424,50 +623,132 @@ properties = properties[1:] } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } - if strings.HasPrefix(imageFile, "https://") { - progress := ProgressRenderer{Format: i18n.G("Importing the image: %s")} - fingerprint, err = d.PostImageURL(imageFile, properties, c.publicImage, c.addAliases, progress.Update) - if err == nil { - progress.Done(fmt.Sprintf(i18n.G("Image imported with fingerprint: %s"), fingerprint)) - } - } else if strings.HasPrefix(imageFile, "http://") { + if strings.HasPrefix(imageFile, "http://") { return fmt.Errorf(i18n.G("Only https:// is supported for remote image import.")) + } + + var args *lxd.ImageCreateArgs + image := api.ImagesPost{} + image.Public = c.publicImage + + // Handle aliases + aliases := []api.ImageAlias{} + for _, entry := range c.addAliases { + alias := api.ImageAlias{} + alias.Name = entry + aliases = append(aliases, alias) + } + + // Handle properties + for _, entry := range properties { + fields := strings.SplitN(entry, "=", 2) + if len(fields) < 2 { + return fmt.Errorf(i18n.G("Bad property: %s"), entry) + } + + image.Properties[strings.TrimSpace(fields[0])] = strings.TrimSpace(fields[1]) + } + + progress := ProgressRenderer{Format: i18n.G("Transferring image: %s")} + if strings.HasPrefix(imageFile, "https://") { + image.Source = &api.ImagesPostSource{} + image.Source.Type = "url" + image.Source.Mode = "pull" + image.Source.Protocol = "direct" + image.Source.URL = imageFile } else { - progress := ProgressRenderer{Format: i18n.G("Transferring image: %s")} - handler := func(percent int64, speed int64) { - progress.Update(fmt.Sprintf("%d%% (%s/s)", percent, shared.GetByteSizeString(speed, 2))) + var meta io.ReadCloser + var rootfs io.ReadCloser + + // Open meta + meta, err = os.Open(imageFile) + if err != nil { + return err + } + defer meta.Close() + + // Open rootfs + if rootfsFile != "" { + rootfs, err = os.Open(rootfsFile) + if err != nil { + return err + } + defer rootfs.Close() } - fingerprint, err = d.PostImage(imageFile, rootfsFile, properties, c.publicImage, c.addAliases, handler) - if err == nil { - progress.Done(fmt.Sprintf(i18n.G("Image imported with fingerprint: %s"), fingerprint)) + args = &lxd.ImageCreateArgs{ + MetaFile: meta, + MetaName: filepath.Base(imageFile), + RootfsFile: rootfs, + RootfsName: filepath.Base(rootfsFile), + ProgressHandler: progress.UpdateProgress, } + image.Filename = args.MetaName } + // Start the transfer + op, err := d.CreateImage(image, args) if err != nil { + progress.Done("") return err } + err = op.Wait() + if err != nil { + progress.Done("") + return err + } + + // Get the fingerprint + fingerprint := op.Metadata["fingerprint"].(string) + progress.Done(fmt.Sprintf(i18n.G("Image imported with fingerprint: %s"), fingerprint)) + + // Add the aliases + for _, entry := range c.addAliases { + alias := api.ImageAliasesPost{} + alias.Name = entry + alias.Target = fingerprint + + err = d.CreateImageAlias(alias) + if err != nil { + return err + } + } + return nil case "list": - filters := []string{} + columns, err := c.parseColumns() + if err != nil { + return err + } + filters := []string{} if len(args) > 1 { result := strings.SplitN(args[1], ":", 2) if len(result) == 1 { filters = append(filters, args[1]) - remote, _ = config.ParseRemoteAndContainer("") + + remote, _, err = conf.ParseRemote("") + if err != nil { + return err + } } else { - remote, _ = config.ParseRemoteAndContainer(args[1]) + remote, _, err = conf.ParseRemote(args[1]) + if err != nil { + return err + } } } else { - remote, _ = config.ParseRemoteAndContainer("") + remote, _, err = conf.ParseRemote("") + if err != nil { + return err + } } if len(args) > 2 { @@ -476,13 +757,13 @@ } } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetImageServer(remote) if err != nil { return err } var images []api.Image - allImages, err := d.ListImages() + allImages, err := d.GetImages() if err != nil { return err } @@ -495,19 +776,19 @@ images = append(images, image) } - return c.showImages(images, filters) + return c.showImages(images, filters, columns) case "edit": if len(args) < 2 { return errArgs } - remote, inName := config.ParseRemoteAndContainer(args[1]) - if inName == "" { - inName = "default" + remote, inName, err := conf.ParseRemote(args[1]) + if err != nil { + return err } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -524,31 +805,97 @@ return errArgs } - remote, inName := config.ParseRemoteAndContainer(args[1]) - if inName == "" { - inName = "default" + remote, inName, err := conf.ParseRemote(args[1]) + if err != nil { + return err } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetImageServer(remote) if err != nil { return err } - image := c.dereferenceAlias(d, inName) + // Resolve aliases + fingerprint := c.dereferenceAlias(d, inName) + // Default target is current directory target := "." + targetMeta := fingerprint if len(args) > 2 { target = args[2] + if shared.IsDir(args[2]) { + targetMeta = filepath.Join(args[2], targetMeta) + } else { + targetMeta = args[2] + } + } + targetRootfs := targetMeta + ".root" + + // Prepare the files + dest, err := os.Create(targetMeta) + if err != nil { + return err + } + defer dest.Close() + + destRootfs, err := os.Create(targetRootfs) + if err != nil { + return err + } + defer destRootfs.Close() + + // Prepare the download request + progress := ProgressRenderer{Format: i18n.G("Exporting the image: %s")} + req := lxd.ImageFileRequest{ + MetaFile: io.WriteSeeker(dest), + RootfsFile: io.WriteSeeker(destRootfs), + ProgressHandler: progress.UpdateProgress, } - outfile, err := d.ExportImage(image, target) + // Download the image + resp, err := d.GetImageFile(fingerprint, req) if err != nil { + os.Remove(targetMeta) + os.Remove(targetRootfs) + progress.Done("") return err } - if target != "-" { - fmt.Printf(i18n.G("Output is in %s")+"\n", outfile) + // Cleanup + if resp.RootfsSize == 0 { + err := os.Remove(targetRootfs) + if err != nil { + os.Remove(targetMeta) + os.Remove(targetRootfs) + progress.Done("") + return err + } + } + + // Rename files + if shared.IsDir(target) { + if resp.MetaName != "" { + err := os.Rename(targetMeta, filepath.Join(target, resp.MetaName)) + if err != nil { + os.Remove(targetMeta) + os.Remove(targetRootfs) + progress.Done("") + return err + } + } + + if resp.RootfsSize > 0 && resp.RootfsName != "" { + err := os.Rename(targetRootfs, filepath.Join(target, resp.RootfsName)) + if err != nil { + os.Remove(targetMeta) + os.Remove(targetRootfs) + progress.Done("") + return err + } + } } + + progress.Done(i18n.G("Image exported successfully!")) return nil case "show": @@ -556,18 +903,18 @@ return errArgs } - remote, inName := config.ParseRemoteAndContainer(args[1]) - if inName == "" { - inName = "default" + remote, inName, err := conf.ParseRemote(args[1]) + if err != nil { + return err } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetImageServer(remote) if err != nil { return err } image := c.dereferenceAlias(d, inName) - info, err := d.GetImageInfo(image) + info, _, err := d.GetImage(image) if err != nil { return err } @@ -583,12 +930,17 @@ } } -func (c *imageCmd) dereferenceAlias(d *lxd.Client, inName string) string { - result := d.GetAlias(inName) - if result == "" { +func (c *imageCmd) dereferenceAlias(d lxd.ImageServer, inName string) string { + if inName == "" { + inName = "default" + } + + result, _, _ := d.GetImageAlias(inName) + if result == nil { return inName } - return result + + return result.Target } func (c *imageCmd) shortestAlias(list []api.ImageAlias) string { @@ -615,47 +967,44 @@ return "" } -func (c *imageCmd) showImages(images []api.Image, filters []string) error { - switch c.format { - case listFormatTable: +func (c *imageCmd) showImages(images []api.Image, filters []string, columns []imageColumn) error { + tableData := func() [][]string { data := [][]string{} for _, image := range images { if !c.imageShouldShow(filters, &image) { continue } - shortest := c.shortestAlias(image.Aliases) - if len(image.Aliases) > 1 { - shortest = fmt.Sprintf(i18n.G("%s (%d more)"), shortest, len(image.Aliases)-1) - } - fp := image.Fingerprint[0:12] - public := i18n.G("no") - description := c.findDescription(image.Properties) - - if image.Public { - public = i18n.G("yes") - } - - const layout = "Jan 2, 2006 at 3:04pm (MST)" - uploaded := image.UploadedAt.UTC().Format(layout) - size := fmt.Sprintf("%.2fMB", float64(image.Size)/1024.0/1024.0) - data = append(data, []string{shortest, fp, public, description, image.Architecture, size, uploaded}) + row := []string{} + for _, column := range columns { + row = append(row, column.Data(image)) + } + data = append(data, row) + } + + sort.Sort(StringList(data)) + return data + } + + switch c.format { + case listFormatCSV: + w := csv.NewWriter(os.Stdout) + w.WriteAll(tableData()) + if err := w.Error(); err != nil { + return err } + case listFormatTable: table := tablewriter.NewWriter(os.Stdout) table.SetAutoWrapText(false) table.SetAlignment(tablewriter.ALIGN_LEFT) table.SetRowLine(true) - table.SetHeader([]string{ - i18n.G("ALIAS"), - i18n.G("FINGERPRINT"), - i18n.G("PUBLIC"), - i18n.G("DESCRIPTION"), - i18n.G("ARCH"), - i18n.G("SIZE"), - i18n.G("UPLOAD DATE")}) - sort.Sort(SortImage(data)) - table.AppendBulk(data) + headers := []string{} + for _, column := range columns { + headers = append(headers, column.Name) + } + table.SetHeader(headers) + table.AppendBulk(tableData()) table.Render() case listFormatJSON: data := make([]*api.Image, len(images)) @@ -667,6 +1016,17 @@ if err != nil { return err } + case listFormatYAML: + data := make([]*api.Image, len(images)) + for i := range images { + data[i] = &images[i] + } + + out, err := yaml.Marshal(data) + if err != nil { + return err + } + fmt.Printf("%s", out) default: return fmt.Errorf("invalid format %q", c.format) } @@ -692,14 +1052,14 @@ i18n.G("ALIAS"), i18n.G("FINGERPRINT"), i18n.G("DESCRIPTION")}) - sort.Sort(SortImage(data)) + sort.Sort(StringList(data)) table.AppendBulk(data) table.Render() return nil } -func (c *imageCmd) doImageEdit(client *lxd.Client, image string) error { +func (c *imageCmd) doImageEdit(client lxd.ContainerServer, image string) error { // If stdin isn't a terminal, read text from it if !termios.IsTerminal(int(syscall.Stdin)) { contents, err := ioutil.ReadAll(os.Stdin) @@ -712,16 +1072,17 @@ if err != nil { return err } - return client.PutImageInfo(image, newdata) + + return client.UpdateImage(image, newdata, "") } // Extract the current value - config, err := client.GetImageInfo(image) + imgInfo, etag, err := client.GetImage(image) if err != nil { return err } - brief := config.Writable() + brief := imgInfo.Writable() data, err := yaml.Marshal(&brief) if err != nil { return err @@ -738,7 +1099,7 @@ newdata := api.ImagePut{} err = yaml.Unmarshal(content, &newdata) if err == nil { - err = client.PutImageInfo(image, newdata) + err = client.UpdateImage(image, newdata, etag) } // Respawn the editor diff -Nru lxd-2.14/lxc/info.go lxd-2.15/lxc/info.go --- lxd-2.14/lxc/info.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/info.go 2017-06-28 03:00:23.000000000 +0000 @@ -7,7 +7,8 @@ "gopkg.in/yaml.v2" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" @@ -38,16 +39,23 @@ gnuflag.BoolVar(&c.showLog, "show-log", false, i18n.G("Show the container's last 100 log lines?")) } -func (c *infoCmd) run(config *lxd.Config, args []string) error { +func (c *infoCmd) run(conf *config.Config, args []string) error { var remote string var cName string + var err error if len(args) == 1 { - remote, cName = config.ParseRemoteAndContainer(args[0]) + remote, cName, err = conf.ParseRemote(args[0]) + if err != nil { + return err + } } else { - remote, cName = config.ParseRemoteAndContainer("") + remote, cName, err = conf.ParseRemote("") + if err != nil { + return err + } } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -55,12 +63,12 @@ if cName == "" { return c.remoteInfo(d) } else { - return c.containerInfo(d, cName, c.showLog) + return c.containerInfo(d, conf.Remotes[remote], cName, c.showLog) } } -func (c *infoCmd) remoteInfo(d *lxd.Client) error { - serverStatus, err := d.ServerStatus() +func (c *infoCmd) remoteInfo(d lxd.ContainerServer) error { + serverStatus, _, err := d.GetServer() if err != nil { return err } @@ -75,13 +83,13 @@ return nil } -func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error { - ct, err := d.ContainerInfo(name) +func (c *infoCmd) containerInfo(d lxd.ContainerServer, remote config.Remote, name string, showLog bool) error { + ct, _, err := d.GetContainer(name) if err != nil { return err } - cs, err := d.ContainerState(name) + cs, _, err := d.GetContainerState(name) if err != nil { return err } @@ -89,9 +97,10 @@ const layout = "2006/01/02 15:04 UTC" fmt.Printf(i18n.G("Name: %s")+"\n", ct.Name) - if d.Remote != nil && d.Remote.Addr != "" { - fmt.Printf(i18n.G("Remote: %s")+"\n", d.Remote.Addr) + if remote.Addr != "" { + fmt.Printf(i18n.G("Remote: %s")+"\n", remote.Addr) } + fmt.Printf(i18n.G("Architecture: %s")+"\n", ct.Architecture) if shared.TimeIsSet(ct.CreatedAt) { fmt.Printf(i18n.G("Created: %s")+"\n", ct.CreatedAt.UTC().Format(layout)) @@ -200,7 +209,7 @@ // List snapshots first_snapshot := true - snaps, err := d.ListSnapshots(name) + snaps, err := d.GetContainerSnapshots(name) if err != nil { return nil } @@ -228,7 +237,7 @@ } if showLog { - log, err := d.GetLog(name, "lxc.log") + log, err := d.GetContainerLogfile(name, "lxc.log") if err != nil { return err } diff -Nru lxd-2.14/lxc/init.go lxd-2.15/lxc/init.go --- lxd-2.14/lxc/init.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/init.go 2017-06-28 03:00:23.000000000 +0000 @@ -5,7 +5,8 @@ "os" "strings" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" @@ -144,28 +145,40 @@ gnuflag.StringVar(&c.storagePool, "s", "", i18n.G("Storage pool name")) } -func (c *initCmd) run(config *lxd.Config, args []string) error { +func (c *initCmd) run(conf *config.Config, args []string) error { + _, _, err := c.create(conf, args) + return err +} + +func (c *initCmd) create(conf *config.Config, args []string) (lxd.ContainerServer, string, error) { if len(args) > 2 || len(args) < 1 { - return errArgs + return nil, "", errArgs } - iremote, image := config.ParseRemoteAndContainer(args[0]) + iremote, image, err := conf.ParseRemote(args[0]) + if err != nil { + return nil, "", err + } var name string var remote string if len(args) == 2 { - remote, name = config.ParseRemoteAndContainer(args[1]) + remote, name, err = conf.ParseRemote(args[1]) + if err != nil { + return nil, "", err + } } else { - remote, name = config.ParseRemoteAndContainer("") + remote, name, err = conf.ParseRemote("") + if err != nil { + return nil, "", err + } } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { - return err + return nil, "", err } - // TODO: implement the syntax for supporting other image types/remotes - /* * initRequestedEmptyProfiles means user requested empty * !initRequestedEmptyProfiles but len(profArgs) == 0 means use profile default @@ -175,20 +188,17 @@ profiles = append(profiles, p) } - var resp *api.Response if name == "" { fmt.Printf(i18n.G("Creating the container") + "\n") } else { fmt.Printf(i18n.G("Creating %s")+"\n", name) } - iremote, image = c.guessImage(config, d, remote, iremote, image) - devicesMap := map[string]map[string]string{} if c.network != "" { - network, err := d.NetworkGet(c.network) + network, _, err := d.GetNetwork(c.network) if err != nil { - return err + return nil, "", err } if network.Type == "bridge" { @@ -200,10 +210,11 @@ // Check if the specified storage pool exists. if c.storagePool != "" { - _, err := d.StoragePoolGet(c.storagePool) + _, _, err := d.GetStoragePool(c.storagePool) if err != nil { - return err + return nil, "", err } + devicesMap["root"] = map[string]string{ "type": "disk", "path": "/", @@ -211,32 +222,90 @@ } } + // Get the image server and image info + iremote, image = c.guessImage(conf, d, remote, iremote, image) + var imgRemote lxd.ImageServer + var imgInfo *api.Image + + // Connect to the image server + if iremote == remote { + imgRemote = d + } else { + imgRemote, err = conf.GetImageServer(iremote) + if err != nil { + return nil, "", err + } + } + + // Deal with the default image + if image == "" { + image = "default" + } + + // Setup container creation request + req := api.ContainersPost{ + Name: name, + } + req.Config = configMap + req.Devices = devicesMap if !initRequestedEmptyProfiles && len(profiles) == 0 { - resp, err = d.Init(name, iremote, image, nil, configMap, devicesMap, c.ephem) + req.Profiles = nil } else { - resp, err = d.Init(name, iremote, image, &profiles, configMap, devicesMap, c.ephem) + req.Profiles = profiles } - if err != nil { - return err + req.Ephemeral = c.ephem + + // Optimisation for simplestreams + if conf.Remotes[iremote].Protocol == "simplestreams" { + imgInfo = &api.Image{} + imgInfo.Fingerprint = image + imgInfo.Public = true + req.Source.Alias = image + } else { + // Attempt to resolve an image alias + alias, _, err := imgRemote.GetImageAlias(image) + if err == nil { + req.Source.Alias = image + image = alias.Target + } + + // Get the image info + imgInfo, _, err = imgRemote.GetImage(image) + if err != nil { + return nil, "", err + } } - progress := ProgressRenderer{} - c.initProgressTracker(d, &progress, resp.Operation) + // Create the container + op, err := d.CreateContainerFromImage(imgRemote, *imgInfo, req) + if err != nil { + return nil, "", err + } - err = d.WaitForSuccess(resp.Operation) - progress.Done("") + // Watch the background operation + progress := ProgressRenderer{Format: i18n.G("Retrieving image: %s")} + _, err = op.AddHandler(progress.UpdateOp) + if err != nil { + progress.Done("") + return nil, "", err + } + err = op.Wait() if err != nil { - return err + progress.Done("") + return nil, "", err } - op, err := resp.MetadataAsOperation() + progress.Done("") + + // Extract the container name + opInfo, err := op.GetTarget() if err != nil { - return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server")) + return nil, "", err } - containers, ok := op.Resources["containers"] + containers, ok := opInfo.Resources["containers"] if !ok || len(containers) == 0 { - return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server")) + return nil, "", fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server")) } if len(containers) == 1 && name == "" { @@ -244,65 +313,28 @@ fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1]) } + // Validate the network setup c.checkNetwork(d, name) - return nil + return d, name, nil } -func (c *initCmd) initProgressTracker(d *lxd.Client, progress *ProgressRenderer, operation string) { - progress.Format = i18n.G("Retrieving image: %s") - handler := func(msg interface{}) { - if msg == nil { - return - } - - event := msg.(map[string]interface{}) - if event["type"].(string) != "operation" { - return - } - - if event["metadata"] == nil { - return - } - - md := event["metadata"].(map[string]interface{}) - if !strings.HasSuffix(operation, md["id"].(string)) { - return - } - - if md["metadata"] == nil { - return - } - - if api.StatusCode(md["status_code"].(float64)).IsFinal() { - return - } - - opMd := md["metadata"].(map[string]interface{}) - _, ok := opMd["download_progress"] - if ok { - progress.Update(opMd["download_progress"].(string)) - } - } - go d.Monitor([]string{"operation"}, handler, nil) -} - -func (c *initCmd) guessImage(config *lxd.Config, d *lxd.Client, remote string, iremote string, image string) (string, string) { +func (c *initCmd) guessImage(conf *config.Config, d lxd.ContainerServer, remote string, iremote string, image string) (string, string) { if remote != iremote { return iremote, image } - _, ok := config.Remotes[image] + _, ok := conf.Remotes[image] if !ok { return iremote, image } - target := d.GetAlias(image) - if target != "" { + _, _, err := d.GetImageAlias(image) + if err == nil { return iremote, image } - _, err := d.GetImageInfo(image) + _, _, err = d.GetImage(image) if err == nil { return iremote, image } @@ -311,8 +343,8 @@ return image, "default" } -func (c *initCmd) checkNetwork(d *lxd.Client, name string) { - ct, err := d.ContainerInfo(name) +func (c *initCmd) checkNetwork(d lxd.ContainerServer, name string) { + ct, _, err := d.GetContainer(name) if err != nil { return } diff -Nru lxd-2.14/lxc/launch.go lxd-2.15/lxc/launch.go --- lxd-2.14/lxc/launch.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/launch.go 2017-06-28 03:00:23.000000000 +0000 @@ -2,13 +2,10 @@ import ( "fmt" - "strings" - "github.com/lxc/lxd" - "github.com/lxc/lxd/shared" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/i18n" - "github.com/lxc/lxd/shared/version" ) type launchCmd struct { @@ -37,125 +34,40 @@ c.init.flags() } -func (c *launchCmd) run(config *lxd.Config, args []string) error { - if len(args) > 2 || len(args) < 1 { - return errArgs - } - - iremote, image := config.ParseRemoteAndContainer(args[0]) - - var name string - var remote string - if len(args) == 2 { - remote, name = config.ParseRemoteAndContainer(args[1]) - } else { - remote, name = config.ParseRemoteAndContainer("") - } - - d, err := lxd.NewClient(config, remote) +func (c *launchCmd) run(conf *config.Config, args []string) error { + // Call the matching code from init + d, name, err := c.init.create(conf, args) if err != nil { return err } - /* - * initRequestedEmptyProfiles means user requested empty - * !initRequestedEmptyProfiles but len(profArgs) == 0 means use profile default - */ - var resp *api.Response - profiles := []string{} - for _, p := range c.init.profArgs { - profiles = append(profiles, p) - } - - iremote, image = c.init.guessImage(config, d, remote, iremote, image) - - devicesMap := map[string]map[string]string{} - if c.init.network != "" { - network, err := d.NetworkGet(c.init.network) - if err != nil { - return err - } - - if network.Type == "bridge" { - devicesMap[c.init.network] = map[string]string{"type": "nic", "nictype": "bridged", "parent": c.init.network} - } else { - devicesMap[c.init.network] = map[string]string{"type": "nic", "nictype": "macvlan", "parent": c.init.network} - } - } - - // Check if the specified storage pool exists. - if c.init.storagePool != "" { - _, err := d.StoragePoolGet(c.init.storagePool) + // Get the remote + var remote string + if len(args) == 2 { + remote, _, err = conf.ParseRemote(args[1]) if err != nil { return err } - devicesMap["root"] = map[string]string{ - "type": "disk", - "path": "/", - "pool": c.init.storagePool, - } - } - - if !initRequestedEmptyProfiles && len(profiles) == 0 { - resp, err = d.Init(name, iremote, image, nil, configMap, devicesMap, c.init.ephem) } else { - resp, err = d.Init(name, iremote, image, &profiles, configMap, devicesMap, c.init.ephem) - } - if err != nil { - return err - } - - progress := ProgressRenderer{} - c.init.initProgressTracker(d, &progress, resp.Operation) - - if name == "" { - op, err := resp.MetadataAsOperation() + remote, _, err = conf.ParseRemote("") if err != nil { - progress.Done("") - return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server")) - } - - containers, ok := op.Resources["containers"] - if !ok || len(containers) == 0 { - progress.Done("") - return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server")) - } - - var restVersion string - toScan := strings.Replace(containers[0], "/", " ", -1) - count, err := fmt.Sscanf(toScan, " %s containers %s", &restVersion, &name) - if err != nil { - progress.Done("") return err } - - if count != 2 { - progress.Done("") - return fmt.Errorf(i18n.G("bad number of things scanned from image, container or snapshot")) - } - - if restVersion != version.APIVersion { - progress.Done("") - return fmt.Errorf(i18n.G("got bad version")) - } } - fmt.Printf(i18n.G("Creating %s")+"\n", name) - if err = d.WaitForSuccess(resp.Operation); err != nil { - progress.Done("") - return err + // Start the container + fmt.Printf(i18n.G("Starting %s")+"\n", name) + req := api.ContainerStatePut{ + Action: "start", + Timeout: -1, } - progress.Done("") - c.init.checkNetwork(d, name) - - fmt.Printf(i18n.G("Starting %s")+"\n", name) - resp, err = d.Action(name, shared.Start, -1, false, false) + op, err := d.UpdateContainerState(name, req, "") if err != nil { return err } - err = d.WaitForSuccess(resp.Operation) + err = op.Wait() if err != nil { prettyName := name if remote != "" { diff -Nru lxd-2.14/lxc/list.go lxd-2.15/lxc/list.go --- lxd-2.14/lxc/list.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/list.go 2017-06-28 03:00:23.000000000 +0000 @@ -12,8 +12,9 @@ "sync" "github.com/olekukonko/tablewriter" + "gopkg.in/yaml.v2" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" @@ -29,12 +30,6 @@ type columnData func(api.Container, *api.ContainerState, []api.ContainerSnapshot) string -const ( - listFormatTable = "table" - listFormatJSON = "json" - listFormatCSV = "csv" -) - type listCmd struct { columnsRaw string fast bool @@ -47,7 +42,7 @@ func (c *listCmd) usage() string { return i18n.G( - `Usage: lxc list [:] [filters] [--format table|json|csv] [-c ] [--fast] + `Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c ] [--fast] List the existing containers. @@ -132,7 +127,7 @@ func (c *listCmd) flags() { gnuflag.StringVar(&c.columnsRaw, "c", "ns46tS", i18n.G("Columns")) gnuflag.StringVar(&c.columnsRaw, "columns", "ns46tS", i18n.G("Columns")) - gnuflag.StringVar(&c.format, "format", "table", i18n.G("Format (table|json|csv)")) + gnuflag.StringVar(&c.format, "format", "table", i18n.G("Format (csv|json|table|yaml)")) gnuflag.BoolVar(&c.fast, "fast", false, i18n.G("Fast mode (same as --columns=nsacPt)")) } @@ -219,7 +214,7 @@ return true } -func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters []string, columns []column) error { +func (c *listCmd) listContainers(conf *config.Config, remote string, cinfos []api.Container, filters []string, columns []column) error { headers := []string{} for _, column := range columns { headers = append(headers, column.Name) @@ -243,7 +238,7 @@ for i := 0; i < threads; i++ { cStatesWg.Add(1) go func() { - d, err := lxd.NewClient(&d.Config, d.Name) + d, err := conf.GetContainerServer(remote) if err != nil { cStatesWg.Done() return @@ -255,7 +250,7 @@ break } - state, err := d.ContainerState(cName) + state, _, err := d.GetContainerState(cName) if err != nil { continue } @@ -269,7 +264,7 @@ cSnapshotsWg.Add(1) go func() { - d, err := lxd.NewClient(&d.Config, d.Name) + d, err := conf.GetContainerServer(remote) if err != nil { cSnapshotsWg.Done() return @@ -281,7 +276,7 @@ break } - snaps, err := d.ListSnapshots(cName) + snaps, err := d.GetContainerSnapshots(cName) if err != nil { continue } @@ -378,6 +373,19 @@ if err != nil { return err } + case listFormatYAML: + data := make([]listContainerItem, len(cinfos)) + for i := range cinfos { + data[i].Container = &cinfos[i] + data[i].State = cStates[cinfos[i].Name] + data[i].Snapshots = cSnapshots[cinfos[i].Name] + } + + out, err := yaml.Marshal(data) + if err != nil { + return err + } + fmt.Printf("%s", out) default: return fmt.Errorf("invalid format %q", c.format) } @@ -392,7 +400,7 @@ Snapshots []api.ContainerSnapshot `json:"snapshots" yaml:"snapshots"` } -func (c *listCmd) run(config *lxd.Config, args []string) error { +func (c *listCmd) run(conf *config.Config, args []string) error { var remote string name := "" @@ -401,26 +409,31 @@ if len(args) != 0 { filters = args if strings.Contains(args[0], ":") && !strings.Contains(args[0], "=") { - remote, name = config.ParseRemoteAndContainer(args[0]) + var err error + remote, name, err = conf.ParseRemote(args[0]) + if err != nil { + return err + } + filters = args[1:] } else if !strings.Contains(args[0], "=") { - remote = config.DefaultRemote + remote = conf.DefaultRemote name = args[0] } } filters = append(filters, name) if remote == "" { - remote = config.DefaultRemote + remote = conf.DefaultRemote } - d, err := lxd.NewClient(config, remote) + d, err := conf.GetContainerServer(remote) if err != nil { return err } var cts []api.Container - ctslist, err := d.ListContainers() + ctslist, err := d.GetContainers() if err != nil { return err } @@ -438,7 +451,7 @@ return err } - return c.listContainers(d, cts, filters, columns) + return c.listContainers(conf, remote, cts, filters, columns) } func (c *listCmd) parseColumns() ([]column, error) { diff -Nru lxd-2.14/lxc/main.go lxd-2.15/lxc/main.go --- lxd-2.14/lxc/main.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/main.go 2017-06-28 03:00:23.000000000 +0000 @@ -5,15 +5,17 @@ "os" "os/exec" "path" + "path/filepath" "strings" "syscall" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" "github.com/lxc/lxd/shared/logger" "github.com/lxc/lxd/shared/logging" + "github.com/lxc/lxd/shared/version" ) var configPath string @@ -25,7 +27,7 @@ if err := run(); err != nil { msg := fmt.Sprintf(i18n.G("error: %v"), err) - lxdErr := lxd.GetLocalLXDErr(err) + lxdErr := getLocalErr(err) switch lxdErr { case syscall.ENOENT: msg = i18n.G("LXD socket not found; is LXD installed and running?") @@ -74,18 +76,24 @@ os.Exit(1) } - var config *lxd.Config + var conf *config.Config var err error if *forceLocal { - config = &lxd.DefaultConfig - } else { - config, err = lxd.LoadConfig(configPath) + conf = &config.DefaultConfig + } else if shared.PathExists(configPath) { + conf, err = config.LoadConfig(configPath) if err != nil { return err } + } else { + conf = &config.DefaultConfig + conf.ConfigDir = filepath.Dir(configPath) } + // Set the user agent + conf.UserAgent = version.UserAgent + // This is quite impolite, but it seems gnuflag needs us to shift our // own exename out of the arguments before parsing them. However, this // is useful for execIfAlias, which wants to know exactly the command @@ -98,7 +106,7 @@ * --no-alias by hand. */ if !shared.StringInSlice("--no-alias", origArgs) { - execIfAliases(config, origArgs) + execIfAliases(conf, origArgs) } cmd, ok := commands[name] if !ok { @@ -128,10 +136,16 @@ // and this is the first time the client has been run by the user, then check to see // if LXD has been properly configured. Don't display the message if the var path // does not exist (LXD not installed), as the user may be targeting a remote daemon. - if os.Args[0] != "help" && os.Args[0] != "version" && shared.PathExists(shared.VarPath("")) && !shared.PathExists(config.ConfigDir) { + if os.Args[0] != "help" && os.Args[0] != "version" && shared.PathExists(shared.VarPath("")) && !shared.PathExists(conf.ConfigDir) { // Create the config dir so that we don't get in here again for this user. - err = os.MkdirAll(config.ConfigDir, 0750) + err = os.MkdirAll(conf.ConfigDir, 0750) + if err != nil { + return err + } + + // And save the initial configuration + err = conf.SaveConfig(configPath) if err != nil { return err } @@ -140,7 +154,7 @@ fmt.Fprintf(os.Stderr, i18n.G("To start your first container, try: lxc launch ubuntu:16.04")+"\n\n") } - err = cmd.run(config, gnuflag.Args()) + err = cmd.run(conf, gnuflag.Args()) if err == errArgs || err == errUsage { out := os.Stdout if err == errArgs { @@ -148,7 +162,7 @@ * expand this as an alias */ if !*noAlias { - execIfAliases(config, origArgs) + execIfAliases(conf, origArgs) } out = os.Stderr @@ -177,7 +191,7 @@ usage() string flags() showByDefault() bool - run(config *lxd.Config, args []string) error + run(conf *config.Config, args []string) error } var commands = map[string]command{ @@ -286,8 +300,8 @@ return aliasKey, aliasValue, foundAlias } -func expandAlias(config *lxd.Config, origArgs []string) ([]string, bool) { - aliasKey, aliasValue, foundAlias := findAlias(config.Aliases, origArgs) +func expandAlias(conf *config.Config, origArgs []string) ([]string, bool) { + aliasKey, aliasValue, foundAlias := findAlias(conf.Aliases, origArgs) if !foundAlias { aliasKey, aliasValue, foundAlias = findAlias(defaultAliases, origArgs) if !foundAlias { @@ -320,8 +334,8 @@ return newArgs, true } -func execIfAliases(config *lxd.Config, origArgs []string) { - newArgs, expanded := expandAlias(config, origArgs) +func execIfAliases(conf *config.Config, origArgs []string) { + newArgs, expanded := expandAlias(conf, origArgs) if !expanded { return } diff -Nru lxd-2.14/lxc/main_test.go lxd-2.15/lxc/main_test.go --- lxd-2.14/lxc/main_test.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/main_test.go 2017-06-28 03:00:23.000000000 +0000 @@ -3,7 +3,7 @@ import ( "testing" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" ) type aliasTestcase struct { @@ -54,7 +54,7 @@ }, } - conf := &lxd.Config{Aliases: aliases} + conf := &config.Config{Aliases: aliases} for _, tc := range testcases { result, expanded := expandAlias(conf, tc.input) diff -Nru lxd-2.14/lxc/manpage.go lxd-2.15/lxc/manpage.go --- lxd-2.14/lxc/manpage.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/manpage.go 2017-06-28 03:00:23.000000000 +0000 @@ -6,7 +6,7 @@ "os/exec" "path/filepath" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared/i18n" ) @@ -26,7 +26,7 @@ func (c *manpageCmd) flags() { } -func (c *manpageCmd) run(_ *lxd.Config, args []string) error { +func (c *manpageCmd) run(conf *config.Config, args []string) error { if len(args) != 1 { return errArgs } diff -Nru lxd-2.14/lxc/monitor.go lxd-2.15/lxc/monitor.go --- lxd-2.14/lxc/monitor.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/monitor.go 2017-06-28 03:00:23.000000000 +0000 @@ -5,7 +5,7 @@ "gopkg.in/yaml.v2" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" ) @@ -56,7 +56,8 @@ gnuflag.Var(&c.typeArgs, "type", i18n.G("Event type to listen for")) } -func (c *monitorCmd) run(config *lxd.Config, args []string) error { +func (c *monitorCmd) run(conf *config.Config, args []string) error { + var err error var remote string if len(args) > 1 { @@ -64,12 +65,23 @@ } if len(args) == 0 { - remote, _ = config.ParseRemoteAndContainer("") + remote, _, err = conf.ParseRemote("") + if err != nil { + return err + } } else { - remote, _ = config.ParseRemoteAndContainer(args[0]) + remote, _, err = conf.ParseRemote(args[0]) + if err != nil { + return err + } + } + + d, err := conf.GetContainerServer(remote) + if err != nil { + return err } - d, err := lxd.NewClient(config, remote) + listener, err := d.GetEvents() if err != nil { return err } @@ -84,5 +96,10 @@ fmt.Printf("%s\n\n", render) } - return d.Monitor(c.typeArgs, handler, nil) + _, err = listener.AddHandler(c.typeArgs, handler) + if err != nil { + return err + } + + return listener.Wait() } diff -Nru lxd-2.14/lxc/move.go lxd-2.15/lxc/move.go --- lxd-2.14/lxc/move.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/move.go 2017-06-28 03:00:23.000000000 +0000 @@ -1,10 +1,13 @@ package main import ( - "github.com/lxc/lxd" - "github.com/lxc/lxd/shared/i18n" + "strings" + "github.com/lxc/lxd/lxc/config" + "github.com/lxc/lxd/shared" + "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" + "github.com/lxc/lxd/shared/i18n" ) type moveCmd struct { @@ -35,13 +38,20 @@ gnuflag.BoolVar(&c.containerOnly, "container-only", false, i18n.G("Move the container without its snapshots")) } -func (c *moveCmd) run(config *lxd.Config, args []string) error { +func (c *moveCmd) run(conf *config.Config, args []string) error { if len(args) != 2 { return errArgs } - sourceRemote, sourceName := config.ParseRemoteAndContainer(args[0]) - destRemote, destName := config.ParseRemoteAndContainer(args[1]) + sourceRemote, sourceName, err := conf.ParseRemote(args[0]) + if err != nil { + return err + } + + destRemote, destName, err := conf.ParseRemote(args[1]) + if err != nil { + return err + } // As an optimization, if the source an destination are the same, do // this via a simple rename. This only works for containers that aren't @@ -49,27 +59,41 @@ // course, this changing of hostname isn't supported right now, so this // simply won't work). if sourceRemote == destRemote { - source, err := lxd.NewClient(config, sourceRemote) + source, err := conf.GetContainerServer(sourceRemote) if err != nil { return err } - rename, err := source.Rename(sourceName, destName) + if shared.IsSnapshot(sourceName) { + // Snapshot rename + srcFields := strings.SplitN(sourceName, shared.SnapshotDelimiter, 2) + dstFields := strings.SplitN(destName, shared.SnapshotDelimiter, 2) + + op, err := source.RenameContainerSnapshot(srcFields[0], srcFields[1], api.ContainerSnapshotPost{Name: dstFields[1]}) + if err != nil { + return err + } + + return op.Wait() + } + + // Container rename + op, err := source.RenameContainer(sourceName, api.ContainerPost{Name: destName}) if err != nil { return err } - return source.WaitForSuccess(rename.Operation) + return op.Wait() } cpy := copyCmd{} // A move is just a copy followed by a delete; however, we want to // keep the volatile entries around since we are moving the container. - err := cpy.copyContainer(config, args[0], args[1], true, -1, true, c.containerOnly) + err = cpy.copyContainer(conf, args[0], args[1], true, -1, true, c.containerOnly) if err != nil { return err } - return commands["delete"].run(config, args[:1]) + return commands["delete"].run(conf, args[:1]) } diff -Nru lxd-2.14/lxc/network.go lxd-2.15/lxc/network.go --- lxd-2.14/lxc/network.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/network.go 2017-06-28 03:00:23.000000000 +0000 @@ -11,7 +11,8 @@ "github.com/olekukonko/tablewriter" "gopkg.in/yaml.v2" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/i18n" @@ -94,21 +95,25 @@ func (c *networkCmd) flags() {} -func (c *networkCmd) run(config *lxd.Config, args []string) error { +func (c *networkCmd) run(conf *config.Config, args []string) error { if len(args) < 1 { return errUsage } if args[0] == "list" { - return c.doNetworkList(config, args) + return c.doNetworkList(conf, args) } if len(args) < 2 { return errArgs } - remote, network := config.ParseRemoteAndContainer(args[1]) - client, err := lxd.NewClient(config, remote) + remote, network, err := conf.ParseRemote(args[1]) + if err != nil { + return err + } + + client, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -141,72 +146,92 @@ } } -func (c *networkCmd) doNetworkAttach(client *lxd.Client, name string, args []string) error { +func (c *networkCmd) doNetworkAttach(client lxd.ContainerServer, name string, args []string) error { if len(args) < 1 || len(args) > 3 { return errArgs } - container := args[0] + // Default name is same as network devName := name if len(args) > 1 { devName = args[1] } - network, err := client.NetworkGet(name) + // Get the network entry + network, _, err := client.GetNetwork(name) if err != nil { return err } - nicType := "macvlan" + // Prepare the container's device entry + device := map[string]string{ + "type": "nic", + "nictype": "macvlan", + "parent": name, + } + if network.Type == "bridge" { - nicType = "bridged" + device["nictype"] = "bridged" } - props := []string{fmt.Sprintf("nictype=%s", nicType), fmt.Sprintf("parent=%s", name)} if len(args) > 2 { - props = append(props, fmt.Sprintf("name=%s", args[2])) + device["name"] = args[2] } - resp, err := client.ContainerDeviceAdd(container, devName, "nic", props) + // Add the device to the container + err = containerDeviceAdd(client, args[0], devName, device) if err != nil { return err } - return client.WaitForSuccess(resp.Operation) + return nil } -func (c *networkCmd) doNetworkAttachProfile(client *lxd.Client, name string, args []string) error { +func (c *networkCmd) doNetworkAttachProfile(client lxd.ContainerServer, name string, args []string) error { if len(args) < 1 || len(args) > 3 { return errArgs } - profile := args[0] + // Default name is same as network devName := name if len(args) > 1 { devName = args[1] } - network, err := client.NetworkGet(name) + // Get the network entry + network, _, err := client.GetNetwork(name) if err != nil { return err } - nicType := "macvlan" + // Prepare the profile's device entry + device := map[string]string{ + "type": "nic", + "nictype": "macvlan", + "parent": name, + } + if network.Type == "bridge" { - nicType = "bridged" + device["nictype"] = "bridged" } - props := []string{fmt.Sprintf("nictype=%s", nicType), fmt.Sprintf("parent=%s", name)} if len(args) > 2 { - props = append(props, fmt.Sprintf("name=%s", args[2])) + device["name"] = args[2] + } + + // Add the device to the profile + err = profileDeviceAdd(client, args[0], devName, device) + if err != nil { + return err } - _, err = client.ProfileDeviceAdd(profile, devName, "nic", props) - return err + return nil } -func (c *networkCmd) doNetworkCreate(client *lxd.Client, name string, args []string) error { - config := map[string]string{} +func (c *networkCmd) doNetworkCreate(client lxd.ContainerServer, name string, args []string) error { + network := api.NetworksPost{} + network.Name = name + network.Config = map[string]string{} for i := 0; i < len(args); i++ { entry := strings.SplitN(args[i], "=", 2) @@ -214,33 +239,36 @@ return errArgs } - config[entry[0]] = entry[1] + network.Config[entry[0]] = entry[1] } - err := client.NetworkCreate(name, config) - if err == nil { - fmt.Printf(i18n.G("Network %s created")+"\n", name) + err := client.CreateNetwork(network) + if err != nil { + return err } - return err + fmt.Printf(i18n.G("Network %s created")+"\n", name) + return nil } -func (c *networkCmd) doNetworkDetach(client *lxd.Client, name string, args []string) error { +func (c *networkCmd) doNetworkDetach(client lxd.ContainerServer, name string, args []string) error { if len(args) < 1 || len(args) > 2 { return errArgs } - containerName := args[0] + // Default name is same as network devName := "" if len(args) > 1 { devName = args[1] } - container, err := client.ContainerInfo(containerName) + // Get the container entry + container, etag, err := client.GetContainer(args[0]) if err != nil { return err } + // Find the device if devName == "" { for n, d := range container.Devices { if d["type"] == "nic" && d["parent"] == name { @@ -266,30 +294,34 @@ return fmt.Errorf(i18n.G("The specified device doesn't match the network")) } - resp, err := client.ContainerDeviceDelete(containerName, devName) + // Remove the device + delete(container.Devices, devName) + op, err := client.UpdateContainer(args[0], container.Writable(), etag) if err != nil { return err } - return client.WaitForSuccess(resp.Operation) + return op.Wait() } -func (c *networkCmd) doNetworkDetachProfile(client *lxd.Client, name string, args []string) error { +func (c *networkCmd) doNetworkDetachProfile(client lxd.ContainerServer, name string, args []string) error { if len(args) < 1 || len(args) > 2 { return errArgs } - profileName := args[0] + // Default name is same as network devName := "" if len(args) > 1 { devName = args[1] } - profile, err := client.ProfileConfig(profileName) + // Get the profile entry + profile, etag, err := client.GetProfile(args[0]) if err != nil { return err } + // Find the device if devName == "" { for n, d := range profile.Devices { if d["type"] == "nic" && d["parent"] == name { @@ -315,20 +347,27 @@ return fmt.Errorf(i18n.G("The specified device doesn't match the network")) } - _, err = client.ProfileDeviceDelete(profileName, devName) - return err + // Remove the device + delete(profile.Devices, devName) + err = client.UpdateProfile(args[0], profile.Writable(), etag) + if err != nil { + return err + } + + return nil } -func (c *networkCmd) doNetworkDelete(client *lxd.Client, name string) error { - err := client.NetworkDelete(name) - if err == nil { - fmt.Printf(i18n.G("Network %s deleted")+"\n", name) +func (c *networkCmd) doNetworkDelete(client lxd.ContainerServer, name string) error { + err := client.DeleteNetwork(name) + if err != nil { + return err } - return err + fmt.Printf(i18n.G("Network %s deleted")+"\n", name) + return nil } -func (c *networkCmd) doNetworkEdit(client *lxd.Client, name string) error { +func (c *networkCmd) doNetworkEdit(client lxd.ContainerServer, name string) error { // If stdin isn't a terminal, read text from it if !termios.IsTerminal(int(syscall.Stdin)) { contents, err := ioutil.ReadAll(os.Stdin) @@ -341,11 +380,12 @@ if err != nil { return err } - return client.NetworkPut(name, newdata) + + return client.UpdateNetwork(name, newdata, "") } // Extract the current value - network, err := client.NetworkGet(name) + network, etag, err := client.GetNetwork(name) if err != nil { return err } @@ -370,7 +410,7 @@ newdata := api.NetworkPut{} err = yaml.Unmarshal(content, &newdata) if err == nil { - err = client.NetworkPut(name, newdata) + err = client.UpdateNetwork(name, newdata, etag) } // Respawn the editor @@ -394,13 +434,13 @@ return nil } -func (c *networkCmd) doNetworkGet(client *lxd.Client, name string, args []string) error { +func (c *networkCmd) doNetworkGet(client lxd.ContainerServer, name string, args []string) error { // we shifted @args so so it should read "" if len(args) != 1 { return errArgs } - resp, err := client.NetworkGet(name) + resp, _, err := client.GetNetwork(name) if err != nil { return err } @@ -413,24 +453,30 @@ return nil } -func (c *networkCmd) doNetworkList(config *lxd.Config, args []string) error { +func (c *networkCmd) doNetworkList(conf *config.Config, args []string) error { var remote string + var err error + if len(args) > 1 { var name string - remote, name = config.ParseRemoteAndContainer(args[1]) + remote, name, err = conf.ParseRemote(args[1]) + if err != nil { + return err + } + if name != "" { return fmt.Errorf(i18n.G("Cannot provide container name to list")) } } else { - remote = config.DefaultRemote + remote = conf.DefaultRemote } - client, err := lxd.NewClient(config, remote) + client, err := conf.GetContainerServer(remote) if err != nil { return err } - networks, err := client.ListNetworks() + networks, err := client.GetNetworks() if err != nil { return err } @@ -467,13 +513,13 @@ return nil } -func (c *networkCmd) doNetworkSet(client *lxd.Client, name string, args []string) error { +func (c *networkCmd) doNetworkSet(client lxd.ContainerServer, name string, args []string) error { // we shifted @args so so it should read " []" if len(args) < 1 { return errArgs } - network, err := client.NetworkGet(name) + network, etag, err := client.GetNetwork(name) if err != nil { return err } @@ -500,15 +546,15 @@ network.Config[key] = value - return client.NetworkPut(name, network.Writable()) + return client.UpdateNetwork(name, network.Writable(), etag) } -func (c *networkCmd) doNetworkShow(client *lxd.Client, name string) error { +func (c *networkCmd) doNetworkShow(client lxd.ContainerServer, name string) error { if name == "" { return errArgs } - network, err := client.NetworkGet(name) + network, _, err := client.GetNetwork(name) if err != nil { return err } diff -Nru lxd-2.14/lxc/profile.go lxd-2.15/lxc/profile.go --- lxd-2.14/lxc/profile.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/profile.go 2017-06-28 03:00:23.000000000 +0000 @@ -5,12 +5,14 @@ "io/ioutil" "os" "sort" + "strings" "syscall" "github.com/olekukonko/tablewriter" "gopkg.in/yaml.v2" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/i18n" @@ -127,21 +129,25 @@ func (c *profileCmd) flags() {} -func (c *profileCmd) run(config *lxd.Config, args []string) error { +func (c *profileCmd) run(conf *config.Config, args []string) error { if len(args) < 1 { return errUsage } if args[0] == "list" { - return c.doProfileList(config, args) + return c.doProfileList(conf, args) } if len(args) < 2 { return errArgs } - remote, profile := config.ParseRemoteAndContainer(args[1]) - client, err := lxd.NewClient(config, remote) + remote, profile, err := conf.ParseRemote(args[1]) + if err != nil { + return err + } + + client, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -152,7 +158,7 @@ case "delete": return c.doProfileDelete(client, profile) case "device": - return c.doProfileDevice(config, args) + return c.doProfileDevice(conf, args) case "edit": return c.doProfileEdit(client, profile) case "apply", "assign": @@ -195,7 +201,7 @@ case "unset": return c.doProfileUnset(client, profile, args[2:]) case "copy": - return c.doProfileCopy(config, client, profile, args[2:]) + return c.doProfileCopy(conf, client, profile, args[2:]) case "show": return c.doProfileShow(client, profile) default: @@ -203,15 +209,18 @@ } } -func (c *profileCmd) doProfileCreate(client *lxd.Client, p string) error { - err := client.ProfileCreate(p) +func (c *profileCmd) doProfileCreate(client lxd.ContainerServer, p string) error { + profile := api.ProfilesPost{} + profile.Name = p + + err := client.CreateProfile(profile) if err == nil { fmt.Printf(i18n.G("Profile %s created")+"\n", p) } return err } -func (c *profileCmd) doProfileEdit(client *lxd.Client, p string) error { +func (c *profileCmd) doProfileEdit(client lxd.ContainerServer, p string) error { // If stdin isn't a terminal, read text from it if !termios.IsTerminal(int(syscall.Stdin)) { contents, err := ioutil.ReadAll(os.Stdin) @@ -224,11 +233,12 @@ if err != nil { return err } - return client.PutProfile(p, newdata) + + return client.UpdateProfile(p, newdata, "") } // Extract the current value - profile, err := client.ProfileConfig(p) + profile, etag, err := client.GetProfile(p) if err != nil { return err } @@ -249,7 +259,7 @@ newdata := api.ProfilePut{} err = yaml.Unmarshal(content, &newdata) if err == nil { - err = client.PutProfile(p, newdata) + err = client.UpdateProfile(p, newdata, etag) } // Respawn the editor @@ -273,61 +283,80 @@ return nil } -func (c *profileCmd) doProfileDelete(client *lxd.Client, p string) error { - err := client.ProfileDelete(p) - if err == nil { - fmt.Printf(i18n.G("Profile %s deleted")+"\n", p) +func (c *profileCmd) doProfileDelete(client lxd.ContainerServer, p string) error { + err := client.DeleteProfile(p) + if err != nil { + return err } - return err + + fmt.Printf(i18n.G("Profile %s deleted")+"\n", p) + return nil } -func (c *profileCmd) doProfileAssign(client *lxd.Client, d string, p string) error { - resp, err := client.AssignProfile(d, p) +func (c *profileCmd) doProfileAssign(client lxd.ContainerServer, d string, p string) error { + container, etag, err := client.GetContainer(d) if err != nil { return err } - err = client.WaitForSuccess(resp.Operation) - if err == nil { - if p == "" { - p = i18n.G("(none)") - } - fmt.Printf(i18n.G("Profiles %s applied to %s")+"\n", p, d) + if p != "" { + container.Profiles = strings.Split(p, ",") + } else { + container.Profiles = nil } - return err + op, err := client.UpdateContainer(d, container.Writable(), etag) + if err != nil { + return err + } + + err = op.Wait() + if err != nil { + return err + } + + if p == "" { + p = i18n.G("(none)") + } + fmt.Printf(i18n.G("Profiles %s applied to %s")+"\n", p, d) + + return nil } -func (c *profileCmd) doProfileAdd(client *lxd.Client, d string, p string) error { - ct, err := client.ContainerInfo(d) +func (c *profileCmd) doProfileAdd(client lxd.ContainerServer, d string, p string) error { + container, etag, err := client.GetContainer(d) if err != nil { return err } - ct.Profiles = append(ct.Profiles, p) + container.Profiles = append(container.Profiles, p) - err = client.UpdateContainerConfig(d, ct.Writable()) + op, err := client.UpdateContainer(d, container.Writable(), etag) if err != nil { return err } - fmt.Printf(i18n.G("Profile %s added to %s")+"\n", p, d) + err = op.Wait() + if err != nil { + return err + } - return err + fmt.Printf(i18n.G("Profile %s added to %s")+"\n", p, d) + return nil } -func (c *profileCmd) doProfileRemove(client *lxd.Client, d string, p string) error { - ct, err := client.ContainerInfo(d) +func (c *profileCmd) doProfileRemove(client lxd.ContainerServer, d string, p string) error { + container, etag, err := client.GetContainer(d) if err != nil { return err } - if !shared.StringInSlice(p, ct.Profiles) { + if !shared.StringInSlice(p, container.Profiles) { return fmt.Errorf("Profile %s isn't currently applied to %s", p, d) } profiles := []string{} - for _, profile := range ct.Profiles { + for _, profile := range container.Profiles { if profile == p { continue } @@ -335,20 +364,24 @@ profiles = append(profiles, profile) } - ct.Profiles = profiles + container.Profiles = profiles - err = client.UpdateContainerConfig(d, ct.Writable()) + op, err := client.UpdateContainer(d, container.Writable(), etag) if err != nil { return err } - fmt.Printf(i18n.G("Profile %s removed from %s")+"\n", p, d) + err = op.Wait() + if err != nil { + return err + } - return err + fmt.Printf(i18n.G("Profile %s removed from %s")+"\n", p, d) + return nil } -func (c *profileCmd) doProfileShow(client *lxd.Client, p string) error { - profile, err := client.ProfileConfig(p) +func (c *profileCmd) doProfileShow(client lxd.ContainerServer, p string) error { + profile, _, err := client.GetProfile(p) if err != nil { return err } @@ -363,24 +396,39 @@ return nil } -func (c *profileCmd) doProfileCopy(config *lxd.Config, client *lxd.Client, p string, args []string) error { +func (c *profileCmd) doProfileCopy(conf *config.Config, client lxd.ContainerServer, p string, args []string) error { if len(args) != 1 { return errArgs } - remote, newname := config.ParseRemoteAndContainer(args[0]) + + remote, newname, err := conf.ParseRemote(args[0]) + if err != nil { + return err + } + if newname == "" { newname = p } - dest, err := lxd.NewClient(config, remote) + dest, err := conf.GetContainerServer(remote) + if err != nil { + return err + } + + profile, _, err := client.GetProfile(p) if err != nil { return err } - return client.ProfileCopy(p, newname, dest) + newProfile := api.ProfilesPost{ + ProfilePut: profile.Writable(), + Name: newname, + } + + return dest.CreateProfile(newProfile) } -func (c *profileCmd) doProfileDevice(config *lxd.Config, args []string) error { +func (c *profileCmd) doProfileDevice(conf *config.Config, args []string) error { // device add b1 eth0 nic type=bridged // device list b1 // device remove b1 eth0 @@ -392,43 +440,40 @@ switch args[1] { case "add": - return cfg.deviceAdd(config, "profile", args) + return cfg.deviceAdd(conf, "profile", args) case "remove": - return cfg.deviceRm(config, "profile", args) + return cfg.deviceRm(conf, "profile", args) case "list": - return cfg.deviceList(config, "profile", args) + return cfg.deviceList(conf, "profile", args) case "show": - return cfg.deviceShow(config, "profile", args) + return cfg.deviceShow(conf, "profile", args) case "get": - return cfg.deviceGet(config, "profile", args) + return cfg.deviceGet(conf, "profile", args) case "set": - return cfg.deviceSet(config, "profile", args) + return cfg.deviceSet(conf, "profile", args) case "unset": - return cfg.deviceUnset(config, "profile", args) + return cfg.deviceUnset(conf, "profile", args) default: return errArgs } } -func (c *profileCmd) doProfileGet(client *lxd.Client, p string, args []string) error { +func (c *profileCmd) doProfileGet(client lxd.ContainerServer, p string, args []string) error { // we shifted @args so so it should read "" if len(args) != 1 { return errArgs } - resp, err := client.GetProfileConfig(p) + profile, _, err := client.GetProfile(p) if err != nil { return err } - for k, v := range resp { - if k == args[0] { - fmt.Printf("%s\n", v) - } - } + + fmt.Printf("%s\n", profile.Config[args[0]]) return nil } -func (c *profileCmd) doProfileSet(client *lxd.Client, p string, args []string) error { +func (c *profileCmd) doProfileSet(client lxd.ContainerServer, p string, args []string) error { // we shifted @args so so it should read " []" if len(args) < 1 { return errArgs @@ -450,11 +495,17 @@ value = string(buf[:]) } - err := client.SetProfileConfigItem(p, key, value) - return err + profile, etag, err := client.GetProfile(p) + if err != nil { + return err + } + + profile.Config[key] = value + + return client.UpdateProfile(p, profile.Writable(), etag) } -func (c *profileCmd) doProfileUnset(client *lxd.Client, p string, args []string) error { +func (c *profileCmd) doProfileUnset(client lxd.ContainerServer, p string, args []string) error { // we shifted @args so so it should read " []" if len(args) != 1 { return errArgs @@ -463,24 +514,29 @@ return c.doProfileSet(client, p, args) } -func (c *profileCmd) doProfileList(config *lxd.Config, args []string) error { +func (c *profileCmd) doProfileList(conf *config.Config, args []string) error { var remote string if len(args) > 1 { var name string - remote, name = config.ParseRemoteAndContainer(args[1]) + var err error + remote, name, err = conf.ParseRemote(args[1]) + if err != nil { + return err + } + if name != "" { return fmt.Errorf(i18n.G("Cannot provide container name to list")) } } else { - remote = config.DefaultRemote + remote = conf.DefaultRemote } - client, err := lxd.NewClient(config, remote) + client, err := conf.GetContainerServer(remote) if err != nil { return err } - profiles, err := client.ListProfiles() + profiles, err := client.GetProfiles() if err != nil { return err } diff -Nru lxd-2.14/lxc/publish.go lxd-2.15/lxc/publish.go --- lxd-2.14/lxc/publish.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/publish.go 2017-06-28 03:00:23.000000000 +0000 @@ -4,7 +4,8 @@ "fmt" "strings" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" @@ -38,9 +39,7 @@ gnuflag.StringVar(&c.compression_algorithm, "compression", "", i18n.G("Define a compression algorithm: for image or none")) } -func (c *publishCmd) run(config *lxd.Config, args []string) error { - var cRemote string - var cName string +func (c *publishCmd) run(conf *config.Config, args []string) error { iName := "" iRemote := "" properties := map[string]string{} @@ -50,12 +49,22 @@ return errArgs } - cRemote, cName = config.ParseRemoteAndContainer(args[0]) + cRemote, cName, err := conf.ParseRemote(args[0]) + if err != nil { + return err + } + if len(args) >= 2 && !strings.Contains(args[1], "=") { firstprop = 2 - iRemote, iName = config.ParseRemoteAndContainer(args[1]) + iRemote, iName, err = conf.ParseRemote(args[1]) + if err != nil { + return err + } } else { - iRemote, iName = config.ParseRemoteAndContainer("") + iRemote, iName, err = conf.ParseRemote("") + if err != nil { + return err + } } if cName == "" { @@ -65,21 +74,21 @@ return fmt.Errorf(i18n.G("There is no \"image name\". Did you want an alias?")) } - d, err := lxd.NewClient(config, iRemote) + d, err := conf.GetContainerServer(iRemote) if err != nil { return err } s := d if cRemote != iRemote { - s, err = lxd.NewClient(config, cRemote) + s, err = conf.GetContainerServer(cRemote) if err != nil { return err } } if !shared.IsSnapshot(cName) { - ct, err := s.ContainerInfo(cName) + ct, etag, err := s.GetContainer(cName) if err != nil { return err } @@ -94,38 +103,57 @@ if ct.Ephemeral { ct.Ephemeral = false - err := s.UpdateContainerConfig(cName, ct.Writable()) + op, err := s.UpdateContainer(cName, ct.Writable(), etag) + if err != nil { + return err + } + + err = op.Wait() + if err != nil { + return err + } + + // Refresh the ETag + _, etag, err = s.GetContainer(cName) if err != nil { return err } } - resp, err := s.Action(cName, shared.Stop, -1, true, false) - if err != nil { - return err + req := api.ContainerStatePut{ + Action: string(shared.Stop), + Timeout: -1, + Force: true, } - op, err := s.WaitFor(resp.Operation) + op, err := s.UpdateContainerState(cName, req, "") if err != nil { return err } - if op.StatusCode == api.Failure { + err = op.Wait() + if err != nil { return fmt.Errorf(i18n.G("Stopping container failed!")) } defer func() { - resp, err := s.Action(cName, shared.Start, -1, true, false) + req.Action = string(shared.Start) + op, err = s.UpdateContainerState(cName, req, "") if err != nil { return } - s.WaitFor(resp.Operation) + op.Wait() }() if wasEphemeral { ct.Ephemeral = true - err := s.UpdateContainerConfig(cName, ct.Writable()) + op, err := s.UpdateContainer(cName, ct.Writable(), etag) + if err != nil { + return err + } + + err = op.Wait() if err != nil { return err } @@ -151,27 +179,74 @@ properties = nil } - // Optimized local publish + // Reformat aliases + aliases := []api.ImageAlias{} + for _, entry := range c.pAliases { + alias := api.ImageAlias{} + alias.Name = entry + aliases = append(aliases, alias) + } + + // Create the image + req := api.ImagesPost{ + Source: &api.ImagesPostSource{ + Type: "container", + Name: cName, + }, + CompressionAlgorithm: c.compression_algorithm, + } + req.Properties = properties + + if shared.IsSnapshot(cName) { + req.Source.Type = "snapshot" + } + if cRemote == iRemote { - fp, err = d.ImageFromContainer(cName, c.makePublic, c.pAliases, properties, c.compression_algorithm) - if err != nil { - return err - } - fmt.Printf(i18n.G("Container published with fingerprint: %s")+"\n", fp) - return nil + req.Aliases = aliases + req.Public = c.makePublic } - fp, err = s.ImageFromContainer(cName, false, nil, properties, c.compression_algorithm) + op, err := s.CreateImage(req, nil) if err != nil { return err } - defer s.DeleteImage(fp) - err = s.CopyImage(fp, d, false, c.pAliases, c.makePublic, false, nil) + err = op.Wait() if err != nil { return err } + // Grab the fingerprint + fingerprint := op.Metadata["fingerprint"].(string) + + // For remote publish, copy to target now + if cRemote != iRemote { + defer s.DeleteImage(fingerprint) + + // Get the source image + image, _, err := s.GetImage(fingerprint) + if err != nil { + return err + } + + // Image copy arguments + args := lxd.ImageCopyArgs{ + Aliases: aliases, + Public: c.makePublic, + } + + // Copy the image to the destination host + op, err := d.CopyImage(s, *image, &args) + if err != nil { + return err + } + + err = op.Wait() + if err != nil { + return err + } + } + fmt.Printf(i18n.G("Container published with fingerprint: %s")+"\n", fp) return nil diff -Nru lxd-2.14/lxc/remote.go lxd-2.15/lxc/remote.go --- lxd-2.14/lxc/remote.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/remote.go 2017-06-28 03:00:23.000000000 +0000 @@ -16,8 +16,9 @@ "golang.org/x/crypto/ssh/terminal" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" + "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" "github.com/lxc/lxd/shared/logger" @@ -69,13 +70,13 @@ gnuflag.BoolVar(&c.public, "public", false, i18n.G("Public image server")) } -func (c *remoteCmd) generateClientCertificate(config *lxd.Config) error { +func (c *remoteCmd) generateClientCertificate(conf *config.Config) error { // Generate a client certificate if necessary. The default repositories are // either local or public, neither of which requires a client certificate. // Generation of the cert is delayed to avoid unnecessary overhead, e.g in // testing scenarios where only the default repositories are used. - certf := config.ConfigPath("client.crt") - keyf := config.ConfigPath("client.key") + certf := conf.ConfigPath("client.crt") + keyf := conf.ConfigPath("client.key") if !shared.PathExists(certf) || !shared.PathExists(keyf) { fmt.Fprintf(os.Stderr, i18n.G("Generating a client certificate. This may take a minute...")+"\n") @@ -113,14 +114,14 @@ return resp.TLS.PeerCertificates[0], nil } -func (c *remoteCmd) addServer(config *lxd.Config, server string, addr string, acceptCert bool, password string, public bool, protocol string) error { +func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, acceptCert bool, password string, public bool, protocol string) error { var rScheme string var rHost string var rPort string // Setup the remotes list - if config.Remotes == nil { - config.Remotes = make(map[string]lxd.RemoteConfig) + if conf.Remotes == nil { + conf.Remotes = make(map[string]config.Remote) } /* Complex remote URL parsing */ @@ -135,7 +136,7 @@ return fmt.Errorf(i18n.G("Only https URLs are supported for simplestreams")) } - config.Remotes[server] = lxd.RemoteConfig{Addr: addr, Public: true, Protocol: protocol} + conf.Remotes[server] = config.Remote{Addr: addr, Public: true, Protocol: protocol} return nil } @@ -194,29 +195,23 @@ // HTTPS server then we need to ensure we have a client certificate before // adding the remote server. if rScheme != "unix" && !public { - err = c.generateClientCertificate(config) + err = c.generateClientCertificate(conf) if err != nil { return err } } - config.Remotes[server] = lxd.RemoteConfig{Addr: addr, Protocol: protocol} + conf.Remotes[server] = config.Remote{Addr: addr, Protocol: protocol} - remote := config.ParseRemote(server) - d, err := lxd.NewClient(config, remote) - if err != nil { - return err - } + // Attempt to connect + d, err := conf.GetContainerServer(server) + // Handle Unix socket connections if strings.HasPrefix(addr, "unix:") { - // NewClient succeeded so there was a lxd there (we fingered - // it) so just accept it - return nil + return err } + // Check if the system CA worked for the TLS connection var certificate *x509.Certificate - - /* Attempt to connect using the system root CA */ - _, err = d.GetServerConfig() if err != nil { // Failed to connect using the system CA, so retrieve the remote certificate certificate, err = c.getRemoteCertificate(addr) @@ -225,6 +220,7 @@ } } + // Handle certificate prompt if certificate != nil { if !acceptCert { digest := shared.CertFingerprint(certificate) @@ -241,13 +237,13 @@ } } - dnam := d.Config.ConfigPath("servercerts") + dnam := conf.ConfigPath("servercerts") err := os.MkdirAll(dnam, 0750) if err != nil { return fmt.Errorf(i18n.G("Could not create server cert dir")) } - certf := fmt.Sprintf("%s/%s.crt", dnam, d.Name) + certf := fmt.Sprintf("%s/%s.crt", dnam, server) certOut, err := os.Create(certf) if err != nil { return err @@ -257,27 +253,30 @@ certOut.Close() // Setup a new connection, this time with the remote certificate - d, err = lxd.NewClient(config, remote) + d, err = conf.GetContainerServer(server) if err != nil { return err } } - if d.IsPublic() || public { - config.Remotes[server] = lxd.RemoteConfig{Addr: addr, Public: true} - - if _, err := d.GetServerConfig(); err != nil { - return err - } + // Get server information + srv, _, err := d.GetServer() + if err != nil { + return err + } + // Detect a public remote + if srv.Public || public { + conf.Remotes[server] = config.Remote{Addr: addr, Public: true} return nil } - if d.AmTrusted() { - // server already has our cert, so we're done + // Check if our cert is already trusted + if srv.Auth == "trusted" { return nil } + // Prompt for trust password if password == "" { fmt.Printf(i18n.G("Admin password for %s: "), server) pwd, err := terminal.ReadPassword(0) @@ -293,12 +292,24 @@ password = string(pwd) } - err = d.AddMyCertToServer(password) + // Add client certificate to trust store + req := api.CertificatesPost{ + Password: password, + } + req.Type = "client" + + err = d.CreateCertificate(req) + if err != nil { + return err + } + + // And check if trusted now + srv, _, err = d.GetServer() if err != nil { return err } - if !d.AmTrusted() { + if srv.Auth != "trusted" { return fmt.Errorf(i18n.G("Server doesn't trust us after adding our cert")) } @@ -306,14 +317,14 @@ return nil } -func (c *remoteCmd) removeCertificate(config *lxd.Config, remote string) { - certf := config.ServerCertPath(remote) +func (c *remoteCmd) removeCertificate(conf *config.Config, remote string) { + certf := conf.ServerCertPath(remote) logger.Debugf("Trying to remove %s", certf) os.Remove(certf) } -func (c *remoteCmd) run(config *lxd.Config, args []string) error { +func (c *remoteCmd) run(conf *config.Config, args []string) error { if len(args) < 1 { return errUsage } @@ -330,14 +341,14 @@ fqdn = args[2] } - if rc, ok := config.Remotes[remote]; ok { + if rc, ok := conf.Remotes[remote]; ok { return fmt.Errorf(i18n.G("remote %s exists as <%s>"), remote, rc.Addr) } - err := c.addServer(config, remote, fqdn, c.acceptCert, c.password, c.public, c.protocol) + err := c.addServer(conf, remote, fqdn, c.acceptCert, c.password, c.public, c.protocol) if err != nil { - delete(config.Remotes, remote) - c.removeCertificate(config, remote) + delete(conf.Remotes, remote) + c.removeCertificate(conf, remote) return err } @@ -346,7 +357,7 @@ return errArgs } - rc, ok := config.Remotes[args[1]] + rc, ok := conf.Remotes[args[1]] if !ok { return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1]) } @@ -355,17 +366,17 @@ return fmt.Errorf(i18n.G("remote %s is static and cannot be modified"), args[1]) } - if config.DefaultRemote == args[1] { + if conf.DefaultRemote == args[1] { return fmt.Errorf(i18n.G("can't remove the default remote")) } - delete(config.Remotes, args[1]) + delete(conf.Remotes, args[1]) - c.removeCertificate(config, args[1]) + c.removeCertificate(conf, args[1]) case "list": data := [][]string{} - for name, rc := range config.Remotes { + for name, rc := range conf.Remotes { strPublic := i18n.G("NO") if rc.Public { strPublic = i18n.G("YES") @@ -381,7 +392,7 @@ } strName := name - if name == config.DefaultRemote { + if name == conf.DefaultRemote { strName = fmt.Sprintf("%s (%s)", name, i18n.G("default")) } data = append(data, []string{strName, rc.Addr, rc.Protocol, strPublic, strStatic}) @@ -408,7 +419,7 @@ return errArgs } - rc, ok := config.Remotes[args[1]] + rc, ok := conf.Remotes[args[1]] if !ok { return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1]) } @@ -417,13 +428,13 @@ return fmt.Errorf(i18n.G("remote %s is static and cannot be modified"), args[1]) } - if _, ok := config.Remotes[args[2]]; ok { + if _, ok := conf.Remotes[args[2]]; ok { return fmt.Errorf(i18n.G("remote %s already exists"), args[2]) } // Rename the certificate file - oldPath := filepath.Join(config.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[1])) - newPath := filepath.Join(config.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[2])) + oldPath := filepath.Join(conf.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[1])) + newPath := filepath.Join(conf.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[2])) if shared.PathExists(oldPath) { err := os.Rename(oldPath, newPath) if err != nil { @@ -431,11 +442,11 @@ } } - config.Remotes[args[2]] = rc - delete(config.Remotes, args[1]) + conf.Remotes[args[2]] = rc + delete(conf.Remotes, args[1]) - if config.DefaultRemote == args[1] { - config.DefaultRemote = args[2] + if conf.DefaultRemote == args[1] { + conf.DefaultRemote = args[2] } case "set-url": @@ -443,7 +454,7 @@ return errArgs } - rc, ok := config.Remotes[args[1]] + rc, ok := conf.Remotes[args[1]] if !ok { return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1]) } @@ -452,28 +463,28 @@ return fmt.Errorf(i18n.G("remote %s is static and cannot be modified"), args[1]) } - config.Remotes[args[1]] = lxd.RemoteConfig{Addr: args[2]} + conf.Remotes[args[1]] = config.Remote{Addr: args[2]} case "set-default": if len(args) != 2 { return errArgs } - _, ok := config.Remotes[args[1]] + _, ok := conf.Remotes[args[1]] if !ok { return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1]) } - config.DefaultRemote = args[1] + conf.DefaultRemote = args[1] case "get-default": if len(args) != 1 { return errArgs } - fmt.Println(config.DefaultRemote) + fmt.Println(conf.DefaultRemote) return nil default: return errArgs } - return lxd.SaveConfig(config, configPath) + return conf.SaveConfig(configPath) } diff -Nru lxd-2.14/lxc/restore.go lxd-2.15/lxc/restore.go --- lxd-2.14/lxc/restore.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/restore.go 2017-06-28 03:00:23.000000000 +0000 @@ -3,8 +3,9 @@ import ( "fmt" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" + "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" ) @@ -37,15 +38,19 @@ gnuflag.BoolVar(&c.stateful, "stateful", false, i18n.G("Whether or not to restore the container's running state from snapshot (if available)")) } -func (c *restoreCmd) run(config *lxd.Config, args []string) error { +func (c *restoreCmd) run(conf *config.Config, args []string) error { if len(args) < 2 { return errArgs } var snapname = args[1] - remote, name := config.ParseRemoteAndContainer(args[0]) - d, err := lxd.NewClient(config, remote) + remote, name, err := conf.ParseRemote(args[0]) + if err != nil { + return err + } + + d, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -54,10 +59,15 @@ snapname = fmt.Sprintf("%s/%s", name, snapname) } - resp, err := d.RestoreSnapshot(name, snapname, c.stateful) + req := api.ContainerPut{ + Restore: snapname, + Stateful: c.stateful, + } + + op, err := d.UpdateContainer(name, req, "") if err != nil { return err } - return d.WaitForSuccess(resp.Operation) + return op.Wait() } diff -Nru lxd-2.14/lxc/snapshot.go lxd-2.15/lxc/snapshot.go --- lxd-2.14/lxc/snapshot.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/snapshot.go 2017-06-28 03:00:23.000000000 +0000 @@ -3,8 +3,9 @@ import ( "fmt" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" + "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/gnuflag" "github.com/lxc/lxd/shared/i18n" ) @@ -35,7 +36,7 @@ gnuflag.BoolVar(&c.stateful, "stateful", false, i18n.G("Whether or not to snapshot the container's running state")) } -func (c *snapshotCmd) run(config *lxd.Config, args []string) error { +func (c *snapshotCmd) run(conf *config.Config, args []string) error { if len(args) < 1 { return errArgs } @@ -47,21 +48,30 @@ snapname = args[1] } - remote, name := config.ParseRemoteAndContainer(args[0]) - d, err := lxd.NewClient(config, remote) + // we don't allow '/' in snapshot names + if shared.IsSnapshot(snapname) { + return fmt.Errorf(i18n.G("'/' not allowed in snapshot name")) + } + + remote, name, err := conf.ParseRemote(args[0]) if err != nil { return err } - // we don't allow '/' in snapshot names - if shared.IsSnapshot(snapname) { - return fmt.Errorf(i18n.G("'/' not allowed in snapshot name")) + d, err := conf.GetContainerServer(remote) + if err != nil { + return err + } + + req := api.ContainerSnapshotsPost{ + Name: snapname, + Stateful: c.stateful, } - resp, err := d.Snapshot(name, snapname, c.stateful) + op, err := d.CreateContainerSnapshot(name, req) if err != nil { return err } - return d.WaitForSuccess(resp.Operation) + return op.Wait() } diff -Nru lxd-2.14/lxc/storage.go lxd-2.15/lxc/storage.go --- lxd-2.14/lxc/storage.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/storage.go 2017-06-28 03:00:23.000000000 +0000 @@ -12,7 +12,8 @@ "github.com/olekukonko/tablewriter" "gopkg.in/yaml.v2" - "github.com/lxc/lxd" + "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/i18n" @@ -143,21 +144,25 @@ func (c *storageCmd) flags() {} -func (c *storageCmd) run(config *lxd.Config, args []string) error { +func (c *storageCmd) run(conf *config.Config, args []string) error { if len(args) < 1 { return errUsage } if args[0] == "list" { - return c.doStoragePoolsList(config, args) + return c.doStoragePoolsList(conf, args) } if len(args) < 2 { return errArgs } - remote, sub := config.ParseRemoteAndContainer(args[1]) - client, err := lxd.NewClient(config, remote) + remote, sub, err := conf.ParseRemote(args[1]) + if err != nil { + return err + } + + client, err := conf.GetContainerServer(remote) if err != nil { return err } @@ -225,7 +230,7 @@ return errArgs } pool := args[2] - return c.doStoragePoolVolumesList(config, remote, pool, args) + return c.doStoragePoolVolumesList(conf, remote, pool, args) case "set": if len(args) < 4 { return errArgs @@ -300,12 +305,11 @@ return fields[1], fields[0] } -func (c *storageCmd) doStoragePoolVolumeAttach(client *lxd.Client, pool string, volume string, args []string) error { +func (c *storageCmd) doStoragePoolVolumeAttach(client lxd.ContainerServer, pool string, volume string, args []string) error { if len(args) < 2 || len(args) > 3 { return errArgs } - container := args[0] devPath := "" devName := "" if len(args) == 2 { @@ -323,38 +327,46 @@ return fmt.Errorf(i18n.G("Only \"custom\" volumes can be attached to containers.")) } - // Check if the requested storage volume actually - // exists on the requested storage pool. - vol, err := client.StoragePoolVolumeTypeGet(pool, volName, volType) + // Check if the requested storage volume actually exists + vol, _, err := client.GetStoragePoolVolume(pool, volType, volName) if err != nil { return err } - props := []string{fmt.Sprintf("pool=%s", pool), fmt.Sprintf("path=%s", devPath), fmt.Sprintf("source=%s", vol.Name)} - resp, err := client.ContainerDeviceAdd(container, devName, "disk", props) + // Prepare the container's device entry + device := map[string]string{ + "type": "disk", + "pool": pool, + "path": devPath, + "source": vol.Name, + } + + // Add the device to the container + err = containerDeviceAdd(client, args[0], devName, device) if err != nil { return err } - return client.WaitForSuccess(resp.Operation) + return nil } -func (c *storageCmd) doStoragePoolVolumeDetach(client *lxd.Client, pool string, volume string, args []string) error { +func (c *storageCmd) doStoragePoolVolumeDetach(client lxd.ContainerServer, pool string, volume string, args []string) error { if len(args) < 1 || len(args) > 2 { return errArgs } - containerName := args[0] devName := "" if len(args) == 2 { devName = args[1] } - container, err := client.ContainerInfo(containerName) + // Get the container entry + container, etag, err := client.GetContainer(args[0]) if err != nil { return err } + // Find the device if devName == "" { for n, d := range container.Devices { if d["type"] == "disk" && d["pool"] == pool && d["source"] == volume { @@ -376,20 +388,21 @@ return fmt.Errorf(i18n.G("The specified device doesn't exist")) } - resp, err := client.ContainerDeviceDelete(containerName, devName) + // Remove the device + delete(container.Devices, devName) + op, err := client.UpdateContainer(args[0], container.Writable(), etag) if err != nil { return err } - return client.WaitForSuccess(resp.Operation) + return op.Wait() } -func (c *storageCmd) doStoragePoolVolumeAttachProfile(client *lxd.Client, pool string, volume string, args []string) error { +func (c *storageCmd) doStoragePoolVolumeAttachProfile(client lxd.ContainerServer, pool string, volume string, args []string) error { if len(args) < 2 || len(args) > 3 { return errArgs } - profile := args[0] devPath := "" devName := "" if len(args) == 2 { @@ -407,54 +420,73 @@ return fmt.Errorf(i18n.G("Only \"custom\" volumes can be attached to containers.")) } - // Check if the requested storage volume actually - // exists on the requested storage pool. - vol, err := client.StoragePoolVolumeTypeGet(pool, volName, volType) + // Check if the requested storage volume actually exists + vol, _, err := client.GetStoragePoolVolume(pool, volType, volName) if err != nil { return err } - props := []string{fmt.Sprintf("pool=%s", pool), fmt.Sprintf("path=%s", devPath), fmt.Sprintf("source=%s", vol.Name)} + // Prepare the container's device entry + device := map[string]string{ + "type": "disk", + "pool": pool, + "path": devPath, + "source": vol.Name, + } + + // Add the device to the container + err = profileDeviceAdd(client, args[0], devName, device) + if err != nil { + return err + } - _, err = client.ProfileDeviceAdd(profile, devName, "disk", props) - return err + return nil } -func (c *storageCmd) doStoragePoolCreate(client *lxd.Client, name string, driver string, args []string) error { - config := map[string]string{} +func (c *storageCmd) doStoragePoolCreate(client lxd.ContainerServer, name string, driver string, args []string) error { + // Create the new storage pool entry + pool := api.StoragePoolsPost{} + pool.Name = name + pool.Config = map[string]string{} + pool.Driver = driver for i := 0; i < len(args); i++ { entry := strings.SplitN(args[i], "=", 2) if len(entry) < 2 { return errArgs } - config[entry[0]] = entry[1] + + pool.Config[entry[0]] = entry[1] } - err := client.StoragePoolCreate(name, driver, config) - if err == nil { - fmt.Printf(i18n.G("Storage pool %s created")+"\n", name) + // Create the pool + err := client.CreateStoragePool(pool) + if err != nil { + return err } - return err + fmt.Printf(i18n.G("Storage pool %s created")+"\n", name) + + return nil } -func (c *storageCmd) doStoragePoolVolumeDetachProfile(client *lxd.Client, pool string, volume string, args []string) error { +func (c *storageCmd) doStoragePoolVolumeDetachProfile(client lxd.ContainerServer, pool string, volume string, args []string) error { if len(args) < 1 || len(args) > 2 { return errArgs } - profileName := args[0] devName := "" if len(args) > 1 { devName = args[1] } - profile, err := client.ProfileConfig(profileName) + // Get the profile entry + profile, etag, err := client.GetProfile(args[0]) if err != nil { return err } + // Find the device if devName == "" { for n, d := range profile.Devices { if d["type"] == "disk" && d["pool"] == pool && d["source"] == volume { @@ -476,20 +508,28 @@ return fmt.Errorf(i18n.G("The specified device doesn't exist")) } - _, err = client.ProfileDeviceDelete(profileName, devName) - return err + // Remove the device + delete(profile.Devices, devName) + err = client.UpdateProfile(args[0], profile.Writable(), etag) + if err != nil { + return err + } + + return nil } -func (c *storageCmd) doStoragePoolDelete(client *lxd.Client, name string) error { - err := client.StoragePoolDelete(name) - if err == nil { - fmt.Printf(i18n.G("Storage pool %s deleted")+"\n", name) +func (c *storageCmd) doStoragePoolDelete(client lxd.ContainerServer, name string) error { + err := client.DeleteStoragePool(name) + if err != nil { + return err } - return err + fmt.Printf(i18n.G("Storage pool %s deleted")+"\n", name) + + return nil } -func (c *storageCmd) doStoragePoolEdit(client *lxd.Client, name string) error { +func (c *storageCmd) doStoragePoolEdit(client lxd.ContainerServer, name string) error { // If stdin isn't a terminal, read text from it if !termios.IsTerminal(int(syscall.Stdin)) { contents, err := ioutil.ReadAll(os.Stdin) @@ -497,16 +537,17 @@ return err } - newdata := api.StoragePool{} + newdata := api.StoragePoolPut{} err = yaml.Unmarshal(contents, &newdata) if err != nil { return err } - return client.StoragePoolPut(name, newdata) + + return client.UpdateStoragePool(name, newdata, "") } // Extract the current value - pool, err := client.StoragePoolGet(name) + pool, etag, err := client.GetStoragePool(name) if err != nil { return err } @@ -524,10 +565,10 @@ for { // Parse the text received from the editor - newdata := api.StoragePool{} + newdata := api.StoragePoolPut{} err = yaml.Unmarshal(content, &newdata) if err == nil { - err = client.StoragePoolPut(name, newdata) + err = client.UpdateStoragePool(name, newdata, etag) } // Respawn the editor @@ -551,13 +592,13 @@ return nil } -func (c *storageCmd) doStoragePoolGet(client *lxd.Client, name string, args []string) error { +func (c *storageCmd) doStoragePoolGet(client lxd.ContainerServer, name string, args []string) error { // we shifted @args so so it should read "" if len(args) != 1 { return errArgs } - resp, err := client.StoragePoolGet(name) + resp, _, err := client.GetStoragePool(name) if err != nil { return err } @@ -570,24 +611,29 @@ return nil } -func (c *storageCmd) doStoragePoolsList(config *lxd.Config, args []string) error { +func (c *storageCmd) doStoragePoolsList(conf *config.Config, args []string) error { var remote string if len(args) > 1 { var name string - remote, name = config.ParseRemoteAndContainer(args[1]) + var err error + remote, name, err = conf.ParseRemote(args[1]) + if err != nil { + return err + } + if name != "" { return fmt.Errorf(i18n.G("Cannot provide container name to list")) } } else { - remote = config.DefaultRemote + remote = conf.DefaultRemote } - client, err := lxd.NewClient(config, remote) + client, err := conf.GetContainerServer(remote) if err != nil { return err } - pools, err := client.ListStoragePools() + pools, err := client.GetStoragePools() if err != nil { return err } @@ -616,18 +662,18 @@ return nil } -func (c *storageCmd) doStoragePoolSet(client *lxd.Client, name string, args []string) error { - // we shifted @args so so it should read " []" +func (c *storageCmd) doStoragePoolSet(client lxd.ContainerServer, name string, args []string) error { if len(args) < 1 { return errArgs } - pool, err := client.StoragePoolGet(name) + // Get the pool entry + pool, etag, err := client.GetStoragePool(name) if err != nil { return err } - key := args[0] + // Read the value var value string if len(args) < 2 { value = "" @@ -643,17 +689,23 @@ value = string(buf[:]) } - pool.Config[key] = value + // Update the pool + pool.Config[args[0]] = value + + err = client.UpdateStoragePool(name, pool.Writable(), etag) + if err != nil { + return err + } - return client.StoragePoolPut(name, pool) + return nil } -func (c *storageCmd) doStoragePoolShow(client *lxd.Client, name string) error { +func (c *storageCmd) doStoragePoolShow(client lxd.ContainerServer, name string) error { if name == "" { return errArgs } - pool, err := client.StoragePoolGet(name) + pool, _, err := client.GetStoragePool(name) if err != nil { return err } @@ -670,13 +722,13 @@ return nil } -func (c *storageCmd) doStoragePoolVolumesList(config *lxd.Config, remote string, pool string, args []string) error { - client, err := lxd.NewClient(config, remote) +func (c *storageCmd) doStoragePoolVolumesList(conf *config.Config, remote string, pool string, args []string) error { + client, err := conf.GetContainerServer(remote) if err != nil { return err } - volumes, err := client.StoragePoolVolumesList(pool) + volumes, err := client.GetStoragePoolVolumes(pool) if err != nil { return err } @@ -703,44 +755,60 @@ return nil } -func (c *storageCmd) doStoragePoolVolumeCreate(client *lxd.Client, pool string, volume string, args []string) error { - config := map[string]string{} +func (c *storageCmd) doStoragePoolVolumeCreate(client lxd.ContainerServer, pool string, volume string, args []string) error { + // Parse the input + volName, volType := c.parseVolume(volume) + + // Create the storage volume entry + vol := api.StorageVolumesPost{} + vol.Name = volName + vol.Type = volType + vol.Config = map[string]string{} for i := 0; i < len(args); i++ { entry := strings.SplitN(args[i], "=", 2) if len(entry) < 2 { return errArgs } - config[entry[0]] = entry[1] + + vol.Config[entry[0]] = entry[1] } - volName, volType := c.parseVolume(volume) - err := client.StoragePoolVolumeTypeCreate(pool, volName, volType, config) - if err == nil { - fmt.Printf(i18n.G("Storage volume %s created")+"\n", volume) + err := client.CreateStoragePoolVolume(pool, vol) + if err != nil { + return err } - return err + fmt.Printf(i18n.G("Storage volume %s created")+"\n", volume) + + return nil } -func (c *storageCmd) doStoragePoolVolumeDelete(client *lxd.Client, pool string, volume string) error { +func (c *storageCmd) doStoragePoolVolumeDelete(client lxd.ContainerServer, pool string, volume string) error { + // Parse the input volName, volType := c.parseVolume(volume) - err := client.StoragePoolVolumeTypeDelete(pool, volName, volType) - if err == nil { - fmt.Printf(i18n.G("Storage volume %s deleted")+"\n", volume) + + // Delete the volume + err := client.DeleteStoragePoolVolume(pool, volType, volName) + if err != nil { + return err } - return err + fmt.Printf(i18n.G("Storage volume %s deleted")+"\n", volume) + + return nil } -func (c *storageCmd) doStoragePoolVolumeGet(client *lxd.Client, pool string, volume string, args []string) error { - // we shifted @args so so it should read "" +func (c *storageCmd) doStoragePoolVolumeGet(client lxd.ContainerServer, pool string, volume string, args []string) error { if len(args) != 2 { return errArgs } + // Parse input volName, volType := c.parseVolume(volume) - resp, err := client.StoragePoolVolumeTypeGet(pool, volName, volType) + + // Get the storage volume entry + resp, _, err := client.GetStoragePoolVolume(pool, volType, volName) if err != nil { return err } @@ -750,21 +818,25 @@ fmt.Printf("%s\n", v) } } + return nil } -func (c *storageCmd) doStoragePoolVolumeSet(client *lxd.Client, pool string, volume string, args []string) error { - // we shifted @args so so it should read " []" +func (c *storageCmd) doStoragePoolVolumeSet(client lxd.ContainerServer, pool string, volume string, args []string) error { if len(args) < 2 { return errArgs } + // Parse the input volName, volType := c.parseVolume(volume) - volumeConfig, err := client.StoragePoolVolumeTypeGet(pool, volName, volType) + + // Get the storage volume entry + vol, etag, err := client.GetStoragePoolVolume(pool, volType, volName) if err != nil { return err } + // Get the value key := args[1] var value string if len(args) < 3 { @@ -781,21 +853,29 @@ value = string(buf[:]) } - volumeConfig.Config[key] = value + // Update the volume + vol.Config[key] = value + err = client.UpdateStoragePoolVolume(pool, vol.Type, vol.Name, vol.Writable(), etag) + if err != nil { + return err + } - return client.StoragePoolVolumeTypePut(pool, volName, volType, volumeConfig) + return nil } -func (c *storageCmd) doStoragePoolVolumeShow(client *lxd.Client, pool string, volume string) error { +func (c *storageCmd) doStoragePoolVolumeShow(client lxd.ContainerServer, pool string, volume string) error { + // Parse the input volName, volType := c.parseVolume(volume) - volumeStruct, err := client.StoragePoolVolumeTypeGet(pool, volName, volType) + + // Get the storage volume entry + vol, _, err := client.GetStoragePoolVolume(pool, volType, volName) if err != nil { return err } - sort.Strings(volumeStruct.UsedBy) + sort.Strings(vol.UsedBy) - data, err := yaml.Marshal(&volumeStruct) + data, err := yaml.Marshal(&vol) if err != nil { return err } @@ -805,7 +885,8 @@ return nil } -func (c *storageCmd) doStoragePoolVolumeEdit(client *lxd.Client, pool string, volume string) error { +func (c *storageCmd) doStoragePoolVolumeEdit(client lxd.ContainerServer, pool string, volume string) error { + // Parse the input volName, volType := c.parseVolume(volume) // If stdin isn't a terminal, read text from it @@ -815,17 +896,17 @@ return err } - newdata := api.StorageVolume{} + newdata := api.StorageVolumePut{} err = yaml.Unmarshal(contents, &newdata) if err != nil { return err } - return client.StoragePoolVolumeTypePut(pool, volName, volType, newdata) + return client.UpdateStoragePoolVolume(pool, volType, volName, newdata, "") } // Extract the current value - vol, err := client.StoragePoolVolumeTypeGet(pool, volName, volType) + vol, etag, err := client.GetStoragePoolVolume(pool, volType, volName) if err != nil { return err } @@ -846,7 +927,7 @@ newdata := api.StorageVolume{} err = yaml.Unmarshal(content, &newdata) if err == nil { - err = client.StoragePoolVolumeTypePut(pool, volName, volType, newdata) + err = client.UpdateStoragePoolVolume(pool, vol.Type, vol.Name, newdata.Writable(), etag) } // Respawn the editor diff -Nru lxd-2.14/lxc/utils.go lxd-2.15/lxc/utils.go --- lxd-2.14/lxc/utils.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/utils.go 2017-06-28 03:00:23.000000000 +0000 @@ -2,13 +2,25 @@ import ( "fmt" + "net" + "net/url" + "os" "strings" + "syscall" "github.com/lxc/lxd/client" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/i18n" ) +// Lists +const ( + listFormatCSV = "csv" + listFormatJSON = "json" + listFormatTable = "table" + listFormatYAML = "yaml" +) + // Progress tracking type ProgressRenderer struct { Format string @@ -66,39 +78,33 @@ } } -// Image fingerprint and alias sorting -type SortImage [][]string +type StringList [][]string -func (a SortImage) Len() int { +func (a StringList) Len() int { return len(a) } -func (a SortImage) Swap(i, j int) { +func (a StringList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a SortImage) Less(i, j int) bool { - if a[i][0] == a[j][0] { - if a[i][3] == "" { - return false - } - - if a[j][3] == "" { - return true +func (a StringList) Less(i, j int) bool { + x := 0 + for x = range a[i] { + if a[i][x] != a[j][x] { + break } - - return a[i][3] < a[j][3] } - if a[i][0] == "" { + if a[i][x] == "" { return false } - if a[j][0] == "" { + if a[j][x] == "" { return true } - return a[i][0] < a[j][0] + return a[i][x] < a[j][x] } // Container name sorting @@ -192,3 +198,87 @@ return i18n.G("Missing summary.") } + +// Used to return a user friendly error +func getLocalErr(err error) error { + t, ok := err.(*url.Error) + if !ok { + return nil + } + + u, ok := t.Err.(*net.OpError) + if !ok { + return nil + } + + if u.Op == "dial" && u.Net == "unix" { + var lxdErr error + + sysErr, ok := u.Err.(*os.SyscallError) + if ok { + lxdErr = sysErr.Err + } else { + // syscall.Errno may be returned on some systems, e.g. CentOS + lxdErr, ok = u.Err.(syscall.Errno) + if !ok { + return nil + } + } + + switch lxdErr { + case syscall.ENOENT, syscall.ECONNREFUSED, syscall.EACCES: + return lxdErr + } + } + + return nil +} + +// Add a device to a container +func containerDeviceAdd(client lxd.ContainerServer, name string, devName string, dev map[string]string) error { + // Get the container entry + container, etag, err := client.GetContainer(name) + if err != nil { + return err + } + + // Check if the device already exists + _, ok := container.Devices[devName] + if ok { + return fmt.Errorf(i18n.G("Device already exists: %s"), devName) + } + + container.Devices[devName] = dev + + op, err := client.UpdateContainer(name, container.Writable(), etag) + if err != nil { + return err + } + + return op.Wait() +} + +// Add a device to a profile +func profileDeviceAdd(client lxd.ContainerServer, name string, devName string, dev map[string]string) error { + // Get the profile entry + profile, profileEtag, err := client.GetProfile(name) + if err != nil { + return err + } + + // Check if the device already exists + _, ok := profile.Devices[devName] + if ok { + return fmt.Errorf(i18n.G("Device already exists: %s"), devName) + } + + // Add the device to the container + profile.Devices[devName] = dev + + err = client.UpdateProfile(name, profile.Writable(), profileEtag) + if err != nil { + return err + } + + return nil +} diff -Nru lxd-2.14/lxc/utils_test.go lxd-2.15/lxc/utils_test.go --- lxd-2.14/lxc/utils_test.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/lxc/utils_test.go 2017-06-28 03:00:23.000000000 +0000 @@ -0,0 +1,37 @@ +package main + +import ( + "sort" + "testing" + + "github.com/stretchr/testify/suite" +) + +type utilsTestSuite struct { + suite.Suite +} + +func TestUtilsTestSuite(t *testing.T) { + suite.Run(t, new(utilsTestSuite)) +} + +// StringList can be used to sort a list of strings. +func (s *utilsTestSuite) Test_StringList() { + data := [][]string{{"foo", "bar"}, {"baz", "bza"}} + sort.Sort(StringList(data)) + s.Equal([][]string{{"baz", "bza"}, {"foo", "bar"}}, data) +} + +// The first different string is used in sorting. +func (s *utilsTestSuite) Test_StringList_sort_by_column() { + data := [][]string{{"foo", "baz"}, {"foo", "bar"}} + sort.Sort(StringList(data)) + s.Equal([][]string{{"foo", "bar"}, {"foo", "baz"}}, data) +} + +// Empty strings are sorted last. +func (s *utilsTestSuite) Test_StringList_empty_strings() { + data := [][]string{{"", "bar"}, {"foo", "baz"}} + sort.Sort(StringList(data)) + s.Equal([][]string{{"foo", "baz"}, {"", "bar"}}, data) +} diff -Nru lxd-2.14/lxc/version.go lxd-2.15/lxc/version.go --- lxd-2.14/lxc/version.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxc/version.go 2017-06-28 03:00:23.000000000 +0000 @@ -3,7 +3,7 @@ import ( "fmt" - "github.com/lxc/lxd" + "github.com/lxc/lxd/lxc/config" "github.com/lxc/lxd/shared/i18n" "github.com/lxc/lxd/shared/version" ) @@ -24,7 +24,7 @@ func (c *versionCmd) flags() { } -func (c *versionCmd) run(_ *lxd.Config, args []string) error { +func (c *versionCmd) run(conf *config.Config, args []string) error { if len(args) > 0 { return errArgs } diff -Nru lxd-2.14/lxd/api_1.0.go lxd-2.15/lxd/api_1.0.go --- lxd-2.14/lxd/api_1.0.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/api_1.0.go 2017-06-28 03:00:23.000000000 +0000 @@ -231,7 +231,7 @@ func api10Put(d *Daemon, r *http.Request) Response { oldConfig, err := dbConfigValuesGet(d.db) if err != nil { - return InternalError(err) + return SmartError(err) } err = etagCheck(r, daemonConfigRender()) @@ -250,7 +250,7 @@ func api10Patch(d *Daemon, r *http.Request) Response { oldConfig, err := dbConfigValuesGet(d.db) if err != nil { - return InternalError(err) + return SmartError(err) } err = etagCheck(r, daemonConfigRender()) diff -Nru lxd-2.14/lxd/api_internal.go lxd-2.15/lxd/api_internal.go --- lxd-2.14/lxd/api_internal.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/api_internal.go 2017-06-28 03:00:23.000000000 +0000 @@ -206,12 +206,12 @@ // Create the storage pool db entry if it doesn't exist. err := storagePoolDBCreate(d, containerPoolName, pool.Description, backup.Pool.Driver, backup.Pool.Config) if err != nil { - return InternalError(err) + return SmartError(err) } poolID, err = dbStoragePoolGetID(d.db, containerPoolName) if err != nil { - return InternalError(err) + return SmartError(err) } } else { if backup.Pool.Name != containerPoolName { @@ -227,7 +227,7 @@ _, volume, ctVolErr := dbStoragePoolVolumeGetType(d.db, req.Name, storagePoolVolumeTypeContainer, poolID) if ctVolErr != nil { if ctVolErr != NoSuchObjectError { - return InternalError(ctVolErr) + return SmartError(ctVolErr) } } // If a storage volume entry exists only proceed if force was specified. @@ -239,7 +239,7 @@ _, containerErr := dbContainerId(d.db, req.Name) if containerErr != nil { if containerErr != sql.ErrNoRows { - return InternalError(containerErr) + return SmartError(containerErr) } } // If a db entry exists only proceed if force was specified. @@ -291,7 +291,7 @@ _, snapErr := dbContainerId(d.db, snap.Name) if snapErr != nil { if snapErr != sql.ErrNoRows { - return InternalError(snapErr) + return SmartError(snapErr) } } @@ -304,7 +304,7 @@ _, _, snapVolErr := dbStoragePoolVolumeGetType(d.db, snap.Name, storagePoolVolumeTypeContainer, poolID) if snapVolErr != nil { if snapVolErr != NoSuchObjectError { - return InternalError(snapVolErr) + return SmartError(snapVolErr) } } @@ -340,7 +340,7 @@ // force was specified. err := dbContainerRemove(d.db, req.Name) if err != nil { - return InternalError(err) + return SmartError(err) } } @@ -377,7 +377,7 @@ _, snapErr := dbContainerId(d.db, snapName) if snapErr != nil { if snapErr != sql.ErrNoRows { - return InternalError(snapErr) + return SmartError(snapErr) } } @@ -390,7 +390,7 @@ _, _, csVolErr := dbStoragePoolVolumeGetType(d.db, snapName, storagePoolVolumeTypeContainer, poolID) if csVolErr != nil { if csVolErr != NoSuchObjectError { - return InternalError(csVolErr) + return SmartError(csVolErr) } } @@ -402,7 +402,7 @@ if snapErr == nil { err := dbContainerRemove(d.db, snapName) if err != nil { - return InternalError(err) + return SmartError(err) } } diff -Nru lxd-2.14/lxd/certificates.go lxd-2.15/lxd/certificates.go --- lxd-2.14/lxd/certificates.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/certificates.go 2017-06-28 03:00:23.000000000 +0000 @@ -247,7 +247,7 @@ err := dbCertUpdate(d.db, fingerprint, req.Name, 1) if err != nil { - return InternalError(err) + return SmartError(err) } return EmptySyncResponse diff -Nru lxd-2.14/lxd/container_exec.go lxd-2.15/lxd/container_exec.go --- lxd-2.14/lxd/container_exec.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/container_exec.go 2017-06-28 03:00:23.000000000 +0000 @@ -227,10 +227,12 @@ conn := s.conns[0] s.connsLock.Unlock() + logger.Debugf("Starting to mirror websocket") readDone, writeDone := shared.WebsocketExecMirror(conn, ptys[0], ptys[0], attachedChildIsDead, int(ptys[0].Fd())) <-readDone <-writeDone + logger.Debugf("Finished to mirror websocket") conn.Close() wgEOF.Done() diff -Nru lxd-2.14/lxd/container_get.go lxd-2.15/lxd/container_get.go --- lxd-2.14/lxd/container_get.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/container_get.go 2017-06-28 03:00:23.000000000 +0000 @@ -15,7 +15,7 @@ state, etag, err := c.Render() if err != nil { - return InternalError(err) + return SmartError(err) } return SyncResponseETag(true, state, etag) diff -Nru lxd-2.14/lxd/container_lxc.go lxd-2.15/lxd/container_lxc.go --- lxd-2.14/lxd/container_lxc.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/container_lxc.go 2017-06-28 03:00:23.000000000 +0000 @@ -149,7 +149,12 @@ return fmt.Errorf("Setting lxc.ephemeral is not allowed") } - if strings.HasPrefix(key, "lxc.network.") { + networkKeyPrefix := "lxc.net." + if !lxc.VersionAtLeast(2, 1, 0) { + networkKeyPrefix = "lxc.network." + } + + if strings.HasPrefix(key, networkKeyPrefix) { fields := strings.Split(key, ".") if len(fields) == 4 && shared.StringInSlice(fields[3], []string{"ipv4", "ipv6"}) { continue @@ -159,7 +164,7 @@ continue } - return fmt.Errorf("Only interface-specific ipv4/ipv6 lxc.network keys are allowed") + return fmt.Errorf("Only interface-specific ipv4/ipv6 %s keys are allowed", networkKeyPrefix) } } @@ -1187,6 +1192,7 @@ } // Setup devices + networkidx := 0 for _, k := range c.expandedDevices.DeviceNames() { m := c.expandedDevices[k] if shared.StringInSlice(m["type"], []string{"unix-char", "unix-block"}) { @@ -1216,41 +1222,46 @@ return err } + networkKeyPrefix := "lxc.net" + if !lxc.VersionAtLeast(2, 1, 0) { + networkKeyPrefix = "lxc.network" + } + // Interface type specific configuration if shared.StringInSlice(m["nictype"], []string{"bridged", "p2p"}) { - err = lxcSetConfigItem(cc, "lxc.network.type", "veth") + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.type", networkKeyPrefix, networkidx), "veth") if err != nil { return err } } else if m["nictype"] == "physical" { - err = lxcSetConfigItem(cc, "lxc.network.type", "phys") + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.type", networkKeyPrefix, networkidx), "phys") if err != nil { return err } } else if m["nictype"] == "macvlan" { - err = lxcSetConfigItem(cc, "lxc.network.type", "macvlan") + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.type", networkKeyPrefix, networkidx), "macvlan") if err != nil { return err } - err = lxcSetConfigItem(cc, "lxc.network.macvlan.mode", "bridge") + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.macvlan.mode", networkKeyPrefix, networkidx), "bridge") if err != nil { return err } } - err = lxcSetConfigItem(cc, "lxc.network.flags", "up") + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.flags", networkKeyPrefix, networkidx), "up") if err != nil { return err } if shared.StringInSlice(m["nictype"], []string{"bridged", "physical"}) { - err = lxcSetConfigItem(cc, "lxc.network.link", m["parent"]) + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.link", networkKeyPrefix, networkidx), m["parent"]) if err != nil { return err } } else if m["nictype"] == "macvlan" { - err = lxcSetConfigItem(cc, "lxc.network.link", networkGetHostDevice(m["parent"], m["vlan"])) + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.link", networkKeyPrefix, networkidx), networkGetHostDevice(m["parent"], m["vlan"])) if err != nil { return err } @@ -1266,7 +1277,7 @@ } if vethName != "" { - err = lxcSetConfigItem(cc, "lxc.network.veth.pair", vethName) + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.veth.pair", networkKeyPrefix, networkidx), vethName) if err != nil { return err } @@ -1274,7 +1285,7 @@ // MAC address if m["hwaddr"] != "" { - err = lxcSetConfigItem(cc, "lxc.network.hwaddr", m["hwaddr"]) + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.hwaddr", networkKeyPrefix, networkidx), m["hwaddr"]) if err != nil { return err } @@ -1282,7 +1293,7 @@ // MTU if m["mtu"] != "" { - err = lxcSetConfigItem(cc, "lxc.network.mtu", m["mtu"]) + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.mtu", networkKeyPrefix, networkidx), m["mtu"]) if err != nil { return err } @@ -1290,11 +1301,13 @@ // Name if m["name"] != "" { - err = lxcSetConfigItem(cc, "lxc.network.name", m["name"]) + err = lxcSetConfigItem(cc, fmt.Sprintf("%s.%d.name", networkKeyPrefix, networkidx), m["name"]) if err != nil { return err } } + // bump network index + networkidx++ } else if m["type"] == "disk" { // Prepare all the paths srcPath := m["source"] @@ -1775,20 +1788,25 @@ return "", err } + networkKeyPrefix := "lxc.net" + if !lxc.VersionAtLeast(2, 1, 0) { + networkKeyPrefix = "lxc.network" + } + // Read device name from config vethName := "" - for i := 0; i < len(c.c.ConfigItem("lxc.network")); i++ { - val := c.c.ConfigItem(fmt.Sprintf("lxc.network.%d.hwaddr", i)) + for i := 0; i < len(c.c.ConfigItem(networkKeyPrefix)); i++ { + val := c.c.ConfigItem(fmt.Sprintf("%s.%d.hwaddr", networkKeyPrefix, i)) if len(val) == 0 || val[0] != m["hwaddr"] { continue } - val = c.c.ConfigItem(fmt.Sprintf("lxc.network.%d.link", i)) + val = c.c.ConfigItem(fmt.Sprintf("%s.%d.link", networkKeyPrefix, i)) if len(val) == 0 || val[0] != m["parent"] { continue } - val = c.c.ConfigItem(fmt.Sprintf("lxc.network.%d.veth.pair", i)) + val = c.c.ConfigItem(fmt.Sprintf("%s.%d.veth.pair", networkKeyPrefix, i)) if len(val) == 0 { continue } @@ -2026,7 +2044,7 @@ c.fromHook = true // Start the storage for this container - ourStart, err := c.StorageStart() + ourStart, err := c.StorageStartSensitive() if err != nil { return err } @@ -5177,6 +5195,23 @@ return false, err } + isOurOperation, err := c.StorageStartSensitive() + // Remove this as soon as zfs is fixed + if c.storage.GetStorageType() == storageTypeZfs && err == syscall.EBUSY { + return isOurOperation, nil + } + + return isOurOperation, err +} + +// Kill this function as soon as zfs is fixed. +func (c *containerLXC) StorageStartSensitive() (bool, error) { + // Initialize storage interface for the container. + err := c.initStorage() + if err != nil { + return false, err + } + isOurOperation := false if c.IsSnapshot() { isOurOperation, err = c.storage.ContainerSnapshotStart(c) @@ -6121,7 +6156,7 @@ // Initialize a new storage interface and check if the // pool/volume is mounted. If it is not, mount it. volumeType, _ := storagePoolVolumeTypeNameToType(volumeTypeName) - s, err := storagePoolVolumeInit(c.daemon, m["pool"], volumeName, volumeType) + s, err := storagePoolVolumeAttachInit(c.daemon, m["pool"], volumeName, volumeType, c) if err != nil && !isOptional { return "", fmt.Errorf("Failed to initialize storage volume \"%s\" of type \"%s\" on storage pool \"%s\": %s.", volumeName, @@ -6264,6 +6299,11 @@ devName := fmt.Sprintf("disk.%s", strings.Replace(tgtPath, "/", "-", -1)) devPath := filepath.Join(c.DevicesPath(), devName) + // The dsk device doesn't exist and cannot be mounted. + if !shared.PathExists(devPath) { + return nil + } + // Remove the bind-mount from the container if c.FileExists(tgtPath) == nil { err := c.removeMount(m["path"]) @@ -6519,13 +6559,18 @@ func (c *containerLXC) getHostInterface(name string) string { if c.IsRunning() { - for i := 0; i < len(c.c.ConfigItem("lxc.network")); i++ { - nicName := c.c.RunningConfigItem(fmt.Sprintf("lxc.network.%d.name", i))[0] + networkKeyPrefix := "lxc.net" + if !lxc.VersionAtLeast(2, 1, 0) { + networkKeyPrefix = "lxc.network" + } + + for i := 0; i < len(c.c.ConfigItem(networkKeyPrefix)); i++ { + nicName := c.c.RunningConfigItem(fmt.Sprintf("%s.%d.name", networkKeyPrefix, i))[0] if nicName != name { continue } - veth := c.c.RunningConfigItem(fmt.Sprintf("lxc.network.%d.veth.pair", i))[0] + veth := c.c.RunningConfigItem(fmt.Sprintf("%s.%d.veth.pair", networkKeyPrefix, i))[0] if veth != "" { return veth } @@ -6740,17 +6785,7 @@ return c.IdmapSet() } - lastIdmap := new(shared.IdmapSet) - err := json.Unmarshal([]byte(lastJsonIdmap), &lastIdmap.Idmap) - if err != nil { - return nil, err - } - - if len(lastIdmap.Idmap) == 0 { - return nil, nil - } - - return lastIdmap, nil + return idmapsetFromString(lastJsonIdmap) } func (c *containerLXC) NextIdmapSet() (*shared.IdmapSet, error) { diff -Nru lxd-2.14/lxd/container_lxc_utils.go lxd-2.15/lxd/container_lxc_utils.go --- lxd-2.14/lxd/container_lxc_utils.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/lxd/container_lxc_utils.go 2017-06-28 03:00:23.000000000 +0000 @@ -0,0 +1,30 @@ +package main + +import ( + "encoding/json" + + "github.com/lxc/lxd/shared" +) + +func idmapsetFromString(idmap string) (*shared.IdmapSet, error) { + lastIdmap := new(shared.IdmapSet) + err := json.Unmarshal([]byte(idmap), &lastIdmap.Idmap) + if err != nil { + return nil, err + } + + if len(lastIdmap.Idmap) == 0 { + return nil, nil + } + + return lastIdmap, nil +} + +func idmapsetToJSON(idmap *shared.IdmapSet) (string, error) { + idmapBytes, err := json.Marshal(idmap.Idmap) + if err != nil { + return "", err + } + + return string(idmapBytes), nil +} diff -Nru lxd-2.14/lxd/containers_get.go lxd-2.15/lxd/containers_get.go --- lxd-2.14/lxd/containers_get.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/containers_get.go 2017-06-28 03:00:23.000000000 +0000 @@ -18,7 +18,7 @@ } if !isDbLockedError(err) { logger.Debugf("DBERR: containersGet: error %q", err) - return InternalError(err) + return SmartError(err) } // 1 s may seem drastic, but we really don't want to thrash // perhaps we should use a random amount diff -Nru lxd-2.14/lxd/containers_post.go lxd-2.15/lxd/containers_post.go --- lxd-2.14/lxd/containers_post.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/containers_post.go 2017-06-28 03:00:23.000000000 +0000 @@ -32,7 +32,7 @@ } else { _, alias, err := dbImageAliasGet(d.db, req.Source.Alias, true) if err != nil { - return InternalError(err) + return SmartError(err) } hash = alias.Target @@ -44,7 +44,7 @@ hashes, err := dbImagesGet(d.db, false) if err != nil { - return InternalError(err) + return SmartError(err) } var image *api.Image @@ -213,7 +213,7 @@ for _, pName := range req.Profiles { _, p, err := dbProfileGet(d.db, pName) if err != nil { - return InternalError(err) + return SmartError(err) } k, v, _ := containerGetRootDiskDevice(p.Devices) @@ -233,7 +233,7 @@ if err == NoSuchObjectError { return BadRequest(fmt.Errorf("This LXD instance does not have any storage pools configured.")) } - return InternalError(err) + return SmartError(err) } if len(pools) == 1 { @@ -508,7 +508,7 @@ if req.Name == "" { cs, err := dbContainersList(d.db, cTypeRegular) if err != nil { - return InternalError(err) + return SmartError(err) } i := 0 diff -Nru lxd-2.14/lxd/daemon_images.go lxd-2.15/lxd/daemon_images.go --- lxd-2.14/lxd/daemon_images.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/daemon_images.go 2017-06-28 03:00:23.000000000 +0000 @@ -17,6 +17,7 @@ "github.com/lxc/lxd/client" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" + "github.com/lxc/lxd/shared/cancel" "github.com/lxc/lxd/shared/ioprogress" "github.com/lxc/lxd/shared/logger" "github.com/lxc/lxd/shared/version" @@ -353,6 +354,12 @@ } } + var canceler *cancel.Canceler + if op != nil { + canceler = &cancel.Canceler{} + op.canceler = canceler + } + if protocol == "lxd" || protocol == "simplestreams" { // Create the target files dest, err := os.Create(destName) @@ -371,11 +378,18 @@ if info == nil { if secret != "" { info, _, err = remote.GetPrivateImage(fp, secret) + if err != nil { + return nil, err + } + + // Expand the fingerprint now and mark alias string to match + fp = info.Fingerprint + alias = info.Fingerprint } else { info, _, err = remote.GetImage(fp) - } - if err != nil { - return nil, err + if err != nil { + return nil, err + } } } @@ -385,6 +399,7 @@ MetaFile: io.WriteSeeker(dest), RootfsFile: io.WriteSeeker(destRootfs), ProgressHandler: progress, + Canceler: canceler, } if secret != "" { @@ -418,7 +433,8 @@ req.Header.Set("User-Agent", version.UserAgent) // Make the request - raw, err := httpClient.Do(req) + raw, err, doneCh := cancel.CancelableDownload(canceler, httpClient, req) + defer close(doneCh) if err != nil { return nil, err } @@ -466,6 +482,8 @@ return nil, err } + info = &api.Image{} + info.Fingerprint = fp info.Size = size info.Architecture = imageMeta.Architecture info.CreatedAt = time.Unix(imageMeta.CreationDate, 0) diff -Nru lxd-2.14/lxd/daemon_images_test.go lxd-2.15/lxd/daemon_images_test.go --- lxd-2.14/lxd/daemon_images_test.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/daemon_images_test.go 2017-06-28 03:00:23.000000000 +0000 @@ -19,7 +19,7 @@ // newer image even if available, and just use the cached one. func (suite *daemonImagesTestSuite) TestUseCachedImagesIfAvailable() { // Create an image with alias "test" and fingerprint "abcd". - err := dbImageInsert(suite.d.db, "abcd", "foo.xz", 1, true, false, "amd64", time.Now(), time.Now(), map[string]string{}) + err := dbImageInsert(suite.d.db, "abcd", "foo.xz", 1, false, true, "amd64", time.Now(), time.Now(), map[string]string{}) suite.Req.Nil(err) id, _, err := dbImageGet(suite.d.db, "abcd", false, true) suite.Req.Nil(err) diff -Nru lxd-2.14/lxd/db_images.go lxd-2.15/lxd/db_images.go --- lxd-2.14/lxd/db_images.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/db_images.go 2017-06-28 03:00:23.000000000 +0000 @@ -124,7 +124,8 @@ FROM images_source INNER JOIN images ON images_source.image_id=images.id - WHERE server=? AND protocol=? AND alias=?` + WHERE server=? AND protocol=? AND alias=? AND auto_update=1 + ORDER BY creation_date DESC` fingerprint := "" diff -Nru lxd-2.14/lxd/db_storage_pools.go lxd-2.15/lxd/db_storage_pools.go --- lxd-2.14/lxd/db_storage_pools.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/db_storage_pools.go 2017-06-28 03:00:23.000000000 +0000 @@ -132,7 +132,7 @@ } // Create new storage pool. -func dbStoragePoolCreate(db *sql.DB, poolName, poolDescription string, poolDriver string, poolConfig map[string]string) (int64, error) { +func dbStoragePoolCreate(db *sql.DB, poolName string, poolDescription string, poolDriver string, poolConfig map[string]string) (int64, error) { tx, err := dbBegin(db) if err != nil { return -1, err diff -Nru lxd-2.14/lxd/db_test.go lxd-2.15/lxd/db_test.go --- lxd-2.14/lxd/db_test.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/db_test.go 2017-06-28 03:00:23.000000000 +0000 @@ -21,7 +21,7 @@ INSERT INTO containers_config (container_id, key, value) VALUES (1, 'thekey', 'thevalue'); INSERT INTO containers_devices (container_id, name, type) VALUES (1, 'somename', 1); INSERT INTO containers_devices_config (key, value, container_device_id) VALUES ('configkey', 'configvalue', 1); - INSERT INTO images (fingerprint, filename, size, architecture, creation_date, expiry_date, upload_date) VALUES ('fingerprint', 'filename', 1024, 0, 1431547174, 1431547175, 1431547176); + INSERT INTO images (fingerprint, filename, size, architecture, creation_date, expiry_date, upload_date, auto_update) VALUES ('fingerprint', 'filename', 1024, 0, 1431547174, 1431547175, 1431547176, 1); INSERT INTO images_aliases (name, image_id, description) VALUES ('somealias', 1, 'some description'); INSERT INTO images_properties (image_id, type, key, value) VALUES (1, 0, 'thekey', 'some value'); INSERT INTO profiles_config (profile_id, key, value) VALUES (2, 'thekey', 'thevalue'); diff -Nru lxd-2.14/lxd/images.go lxd-2.15/lxd/images.go --- lxd-2.14/lxd/images.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/images.go 2017-06-28 03:00:23.000000000 +0000 @@ -715,40 +715,31 @@ // Begin background operation run := func(op *operation) error { + var err error var info *api.Image // Setup the cleanup function defer cleanup(builddir, post) - if !imageUpload { + if imageUpload { + /* Processing image upload */ + info, err = getImgPostInfo(d, r, builddir, post) + } else { if req.Source.Type == "image" { /* Processing image copy from remote */ info, err = imgPostRemoteInfo(d, req, op) - if err != nil { - return err - } } else if req.Source.Type == "url" { /* Processing image copy from URL */ info, err = imgPostURLInfo(d, req, op) - if err != nil { - return err - } } else { /* Processing image creation from container */ imagePublishLock.Lock() info, err = imgPostContInfo(d, r, req, builddir) - if err != nil { - imagePublishLock.Unlock() - return err - } imagePublishLock.Unlock() } - } else { - /* Processing image upload */ - info, err = getImgPostInfo(d, r, builddir, post) - if err != nil { - return err - } + } + if err != nil { + return err } // Apply any provided alias @@ -1206,15 +1197,15 @@ public := !d.isTrustedClient(r) secret := r.FormValue("secret") - if public == true && imageValidSecret(fingerprint, secret) == true { - public = false - } - - info, response := doImageGet(d, fingerprint, public) + info, response := doImageGet(d, fingerprint, false) if response != nil { return response } + if !info.Public && public && !imageValidSecret(info.Fingerprint, secret) { + return NotFound + } + etag := []interface{}{info.Public, info.AutoUpdate, info.Properties} return SyncResponseETag(true, info, etag) } @@ -1338,7 +1329,7 @@ err = dbImageAliasAdd(d.db, req.Name, id, req.Description) if err != nil { - return InternalError(err) + return SmartError(err) } return SyncResponseLocation(true, nil, fmt.Sprintf("/%s/images/aliases/%s", version.APIVersion, req.Name)) @@ -1526,15 +1517,15 @@ public := !d.isTrustedClient(r) secret := r.FormValue("secret") - if public == true && imageValidSecret(fingerprint, secret) == true { - public = false - } - - _, imgInfo, err := dbImageGet(d.db, fingerprint, public, false) + _, imgInfo, err := dbImageGet(d.db, fingerprint, false, false) if err != nil { return SmartError(err) } + if !imgInfo.Public && public && !imageValidSecret(imgInfo.Fingerprint, secret) { + return NotFound + } + imagePath := shared.VarPath("images", imgInfo.Fingerprint) rootfsPath := imagePath + ".rootfs" @@ -1576,7 +1567,7 @@ func imageSecret(d *Daemon, r *http.Request) Response { fingerprint := mux.Vars(r)["fingerprint"] - _, _, err := dbImageGet(d.db, fingerprint, false, false) + _, imgInfo, err := dbImageGet(d.db, fingerprint, false, false) if err != nil { return SmartError(err) } @@ -1591,7 +1582,7 @@ meta["secret"] = secret resources := map[string][]string{} - resources["images"] = []string{fingerprint} + resources["images"] = []string{imgInfo.Fingerprint} op, err := operationCreate(operationClassToken, resources, meta, nil, nil, nil) if err != nil { diff -Nru lxd-2.14/lxd/main_shutdown.go lxd-2.15/lxd/main_shutdown.go --- lxd-2.14/lxd/main_shutdown.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/main_shutdown.go 2017-06-28 03:00:23.000000000 +0000 @@ -8,14 +8,6 @@ ) func cmdShutdown() error { - var timeout int - - if *argTimeout == -1 { - timeout = 60 - } else { - timeout = *argTimeout - } - c, err := lxd.ConnectLXDUnix("", nil) if err != nil { return err @@ -38,11 +30,15 @@ close(chMonitor) }() - select { - case <-chMonitor: - break - case <-time.After(time.Second * time.Duration(timeout)): - return fmt.Errorf("LXD still running after %ds timeout.", timeout) + if *argTimeout > 0 { + select { + case <-chMonitor: + break + case <-time.After(time.Second * time.Duration(*argTimeout)): + return fmt.Errorf("LXD still running after %ds timeout.", *argTimeout) + } + } else { + <-chMonitor } return nil diff -Nru lxd-2.14/lxd/main_test.go lxd-2.15/lxd/main_test.go --- lxd-2.14/lxd/main_test.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/main_test.go 2017-06-28 03:00:23.000000000 +0000 @@ -77,7 +77,7 @@ } func (suite *lxdTestSuite) SetupTest() { - initializeDbObject(suite.d, shared.VarPath("lxd.db")) + initializeDbObject(suite.d, ":memory:") daemonConfigInit(suite.d.db) // Create default storage pool. Make sure that we don't pass a nil to @@ -124,8 +124,4 @@ func (suite *lxdTestSuite) TearDownTest() { suite.d.db.Close() - err := os.Remove(shared.VarPath("lxd.db")) - if err != nil { - os.Exit(1) - } } diff -Nru lxd-2.14/lxd/migrate.go lxd-2.15/lxd/migrate.go --- lxd-2.14/lxd/migrate.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/migrate.go 2017-06-28 03:00:23.000000000 +0000 @@ -401,7 +401,7 @@ return err } - err = driver.SendWhileRunning(s.fsConn, migrateOp, bwlimit) + err = driver.SendWhileRunning(s.fsConn, migrateOp, bwlimit, s.containerOnly) if err != nil { return abort(err) } diff -Nru lxd-2.14/lxd/networks.go lxd-2.15/lxd/networks.go --- lxd-2.14/lxd/networks.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/networks.go 2017-06-28 03:00:23.000000000 +0000 @@ -673,19 +673,21 @@ // Configure IPv4 firewall (includes fan) if n.config["bridge.mode"] == "fan" || !shared.StringInSlice(n.config["ipv4.address"], []string{"", "none"}) { - // Setup basic iptables overrides - rules := [][]string{ - {"ipv4", n.name, "", "INPUT", "-i", n.name, "-p", "udp", "--dport", "67", "-j", "ACCEPT"}, - {"ipv4", n.name, "", "INPUT", "-i", n.name, "-p", "udp", "--dport", "53", "-j", "ACCEPT"}, - {"ipv4", n.name, "", "INPUT", "-i", n.name, "-p", "tcp", "--dport", "53", "-j", "ACCEPT"}, - {"ipv4", n.name, "", "OUTPUT", "-o", n.name, "-p", "udp", "--sport", "67", "-j", "ACCEPT"}, - {"ipv4", n.name, "", "OUTPUT", "-o", n.name, "-p", "udp", "--sport", "53", "-j", "ACCEPT"}, - {"ipv4", n.name, "", "OUTPUT", "-o", n.name, "-p", "tcp", "--sport", "53", "-j", "ACCEPT"}} + if n.config["ipv4.dhcp"] == "" || shared.IsTrue(n.config["ipv4.dhcp"]) { + // Setup basic iptables overrides for DHCP/DNS + rules := [][]string{ + {"ipv4", n.name, "", "INPUT", "-i", n.name, "-p", "udp", "--dport", "67", "-j", "ACCEPT"}, + {"ipv4", n.name, "", "INPUT", "-i", n.name, "-p", "udp", "--dport", "53", "-j", "ACCEPT"}, + {"ipv4", n.name, "", "INPUT", "-i", n.name, "-p", "tcp", "--dport", "53", "-j", "ACCEPT"}, + {"ipv4", n.name, "", "OUTPUT", "-o", n.name, "-p", "udp", "--sport", "67", "-j", "ACCEPT"}, + {"ipv4", n.name, "", "OUTPUT", "-o", n.name, "-p", "udp", "--sport", "53", "-j", "ACCEPT"}, + {"ipv4", n.name, "", "OUTPUT", "-o", n.name, "-p", "tcp", "--sport", "53", "-j", "ACCEPT"}} - for _, rule := range rules { - err = networkIptablesPrepend(rule[0], rule[1], rule[2], rule[3], rule[4:]...) - if err != nil { - return err + for _, rule := range rules { + err = networkIptablesPrepend(rule[0], rule[1], rule[2], rule[3], rule[4:]...) + if err != nil { + return err + } } } @@ -829,6 +831,23 @@ // Update the dnsmasq config dnsmasqCmd = append(dnsmasqCmd, []string{fmt.Sprintf("--listen-address=%s", ip.String()), "--enable-ra"}...) if n.config["ipv6.dhcp"] == "" || shared.IsTrue(n.config["ipv6.dhcp"]) { + // Setup basic iptables overrides for DHCP/DNS + rules := [][]string{ + {"ipv6", n.name, "", "INPUT", "-i", n.name, "-p", "udp", "--dport", "546", "-j", "ACCEPT"}, + {"ipv6", n.name, "", "INPUT", "-i", n.name, "-p", "udp", "--dport", "53", "-j", "ACCEPT"}, + {"ipv6", n.name, "", "INPUT", "-i", n.name, "-p", "tcp", "--dport", "53", "-j", "ACCEPT"}, + {"ipv6", n.name, "", "OUTPUT", "-o", n.name, "-p", "udp", "--sport", "546", "-j", "ACCEPT"}, + {"ipv6", n.name, "", "OUTPUT", "-o", n.name, "-p", "udp", "--sport", "53", "-j", "ACCEPT"}, + {"ipv6", n.name, "", "OUTPUT", "-o", n.name, "-p", "tcp", "--sport", "53", "-j", "ACCEPT"}} + + for _, rule := range rules { + err = networkIptablesPrepend(rule[0], rule[1], rule[2], rule[3], rule[4:]...) + if err != nil { + return err + } + } + + // Build DHCP configuration if !shared.StringInSlice("--dhcp-no-override", dnsmasqCmd) { dnsmasqCmd = append(dnsmasqCmd, []string{"--dhcp-no-override", "--dhcp-authoritative", fmt.Sprintf("--dhcp-leasefile=%s", shared.VarPath("networks", n.name, "dnsmasq.leases")), fmt.Sprintf("--dhcp-hostsfile=%s", shared.VarPath("networks", n.name, "dnsmasq.hosts"))}...) } @@ -854,22 +873,6 @@ dnsmasqCmd = append(dnsmasqCmd, []string{"--dhcp-range", fmt.Sprintf("::,constructor:%s,ra-only", n.name)}...) } - // Setup basic iptables overrides - rules := [][]string{ - {"ipv6", n.name, "", "INPUT", "-i", n.name, "-p", "udp", "--dport", "546", "-j", "ACCEPT"}, - {"ipv6", n.name, "", "INPUT", "-i", n.name, "-p", "udp", "--dport", "53", "-j", "ACCEPT"}, - {"ipv6", n.name, "", "INPUT", "-i", n.name, "-p", "tcp", "--dport", "53", "-j", "ACCEPT"}, - {"ipv6", n.name, "", "OUTPUT", "-o", n.name, "-p", "udp", "--sport", "546", "-j", "ACCEPT"}, - {"ipv6", n.name, "", "OUTPUT", "-o", n.name, "-p", "udp", "--sport", "53", "-j", "ACCEPT"}, - {"ipv6", n.name, "", "OUTPUT", "-o", n.name, "-p", "tcp", "--sport", "53", "-j", "ACCEPT"}} - - for _, rule := range rules { - err = networkIptablesPrepend(rule[0], rule[1], rule[2], rule[3], rule[4:]...) - if err != nil { - return err - } - } - // Allow forwarding if n.config["ipv6.routing"] == "" || shared.IsTrue(n.config["ipv6.routing"]) { // Get a list of proc entries @@ -1156,14 +1159,12 @@ dnsmasqCmd = append(dnsmasqCmd, []string{"-s", dnsDomain, "-S", fmt.Sprintf("/%s/", dnsDomain)}...) } - // Create raw config file - if n.config["raw.dnsmasq"] != "" { - err = ioutil.WriteFile(shared.VarPath("networks", n.name, "dnsmasq.raw"), []byte(fmt.Sprintf("%s\n", n.config["raw.dnsmasq"])), 0) - if err != nil { - return err - } - dnsmasqCmd = append(dnsmasqCmd, fmt.Sprintf("--conf-file=%s", shared.VarPath("networks", n.name, "dnsmasq.raw"))) + // Create a config file to contain additional config (and to prevent dnsmasq from reading /etc/dnsmasq.conf) + err = ioutil.WriteFile(shared.VarPath("networks", n.name, "dnsmasq.raw"), []byte(fmt.Sprintf("%s\n", n.config["raw.dnsmasq"])), 0) + if err != nil { + return err } + dnsmasqCmd = append(dnsmasqCmd, fmt.Sprintf("--conf-file=%s", shared.VarPath("networks", n.name, "dnsmasq.raw"))) // Create DHCP hosts file if !shared.PathExists(shared.VarPath("networks", n.name, "dnsmasq.hosts")) { diff -Nru lxd-2.14/lxd/networks_utils.go lxd-2.15/lxd/networks_utils.go --- lxd-2.14/lxd/networks_utils.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/networks_utils.go 2017-06-28 03:00:23.000000000 +0000 @@ -366,7 +366,7 @@ return cidr, nil } - return "", fmt.Errorf("Unable to find a free IPv4 subnet") + return "", fmt.Errorf("Failed to automatically find an unused IPv4 subnet, manual configuration required") } func networkRandomSubnetV6() (string, error) { @@ -388,7 +388,7 @@ return cidr, nil } - return "", fmt.Errorf("Unable to find a free IPv6 subnet") + return "", fmt.Errorf("Failed to automatically find an unused IPv6 subnet, manual configuration required") } func networkDefaultGatewaySubnetV4() (*net.IPNet, string, error) { @@ -850,6 +850,28 @@ return ioutil.WriteFile(fmt.Sprintf("/proc/sys/net/%s", path), []byte(value), 0) } +func networkGetMacSlice(hwaddr string) []string { + var buf []string + + if !strings.Contains(hwaddr, ":") { + if s, err := strconv.ParseUint(hwaddr, 10, 64); err == nil { + hwaddr = fmt.Sprintln(fmt.Sprintf("%x", s)) + var tuple string + for i, r := range hwaddr { + tuple = tuple + string(r) + if i > 0 && (i+1)%2 == 0 { + buf = append(buf, tuple) + tuple = "" + } + } + } + } else { + buf = strings.Split(strings.ToLower(hwaddr), ":") + } + + return buf +} + func networkClearLease(d *Daemon, network string, hwaddr string) error { leaseFile := shared.VarPath("networks", network, "dnsmasq.leases") @@ -888,8 +910,15 @@ } fields := strings.Fields(lease) - if len(fields) > 2 && strings.ToLower(fields[1]) == strings.ToLower(hwaddr) { - continue + if len(fields) > 2 { + leaseMac := networkGetMacSlice(fields[1]) + leaseMacStr := strings.Join(leaseMac, ":") + knownMac := networkGetMacSlice(hwaddr) + knownMacStr := strings.Join( + knownMac[len(knownMac)-len(leaseMac):], ":") + if knownMacStr == leaseMacStr { + continue + } } _, err := fd.WriteString(fmt.Sprintf("%s\n", lease)) diff -Nru lxd-2.14/lxd/operations.go lxd-2.15/lxd/operations.go --- lxd-2.14/lxd/operations.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/operations.go 2017-06-28 03:00:23.000000000 +0000 @@ -13,6 +13,7 @@ "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" + "github.com/lxc/lxd/shared/cancel" "github.com/lxc/lxd/shared/logger" "github.com/lxc/lxd/shared/version" ) @@ -47,6 +48,7 @@ metadata map[string]interface{} err string readonly bool + canceler *cancel.Canceler // Those functions are called at various points in the operation lifecycle onRun func(*operation) error @@ -195,6 +197,13 @@ _, md, _ := op.Render() eventSend("operation", md) + if op.canceler != nil { + err := op.canceler.Cancel() + if err != nil { + return nil, err + } + } + if op.onCancel == nil { op.lock.Lock() op.status = api.Cancelled @@ -244,7 +253,19 @@ } func (op *operation) mayCancel() bool { - return op.onCancel != nil || op.class == operationClassToken + if op.class == operationClassToken { + return true + } + + if op.onCancel != nil { + return true + } + + if op.canceler != nil && op.canceler.Cancelable() { + return true + } + + return false } func (op *operation) Render() (string, *api.Operation, error) { @@ -428,7 +449,7 @@ _, body, err := op.Render() if err != nil { - return InternalError(err) + return SmartError(err) } return SyncResponse(true, body) @@ -511,7 +532,7 @@ _, body, err := op.Render() if err != nil { - return InternalError(err) + return SmartError(err) } return SyncResponse(true, body) diff -Nru lxd-2.14/lxd/patches.go lxd-2.15/lxd/patches.go --- lxd-2.14/lxd/patches.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/patches.go 2017-06-28 03:00:23.000000000 +0000 @@ -43,6 +43,7 @@ {name: "storage_api_update_storage_configs", run: patchStorageApiUpdateStorageConfigs}, {name: "storage_api_lxd_on_btrfs", run: patchStorageApiLxdOnBtrfs}, {name: "storage_api_lvm_detect_lv_size", run: patchStorageApiDetectLVSize}, + {name: "storage_api_insert_zfs_driver", run: patchStorageApiInsertZfsDriver}, } type patch struct { @@ -1433,7 +1434,7 @@ } // (Use a tmp variable as Go's scoping is freaking me out.) - tmp, err := dbStoragePoolCreate(d.db, poolName, defaultStorageTypeName, "", poolConfig) + tmp, err := dbStoragePoolCreate(d.db, poolName, "", defaultStorageTypeName, poolConfig) if err != nil { logger.Warnf("Storage pool already exists in the database. Proceeding...") } @@ -1793,7 +1794,6 @@ k, _, _ = containerGetRootDiskDevice(localDevices) if k != "" { localDevices[k]["pool"] = poolName - args.Devices = localDevices } else { rootDev := map[string]string{} rootDev["type"] = "disk" @@ -1814,6 +1814,7 @@ localDevices[rootDevName] = rootDev } + args.Devices = localDevices err = c.Update(args, false) if err != nil { @@ -2235,6 +2236,15 @@ } return nil +} + +func patchStorageApiInsertZfsDriver(name string, d *Daemon) error { + _, err := dbExec(d.db, "UPDATE storage_pools SET driver='zfs', description='' WHERE driver=''") + if err != nil { + return err + } + + return nil } // Patches end here diff -Nru lxd-2.14/lxd/profiles.go lxd-2.15/lxd/profiles.go --- lxd-2.14/lxd/profiles.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/profiles.go 2017-06-28 03:00:23.000000000 +0000 @@ -90,7 +90,7 @@ // Update DB entry _, err = dbProfileCreate(d.db, req.Name, req.Description, req.Config, req.Devices) if err != nil { - return InternalError( + return SmartError( fmt.Errorf("Error inserting %s into database: %s", req.Name, err)) } @@ -159,7 +159,7 @@ name := mux.Vars(r)["name"] id, profile, err := dbProfileGet(d.db, name) if err != nil { - return InternalError(fmt.Errorf("Failed to retrieve profile='%s'", name)) + return SmartError(fmt.Errorf("Failed to retrieve profile='%s'", name)) } // Validate the ETag @@ -182,7 +182,7 @@ name := mux.Vars(r)["name"] id, profile, err := dbProfileGet(d.db, name) if err != nil { - return InternalError(fmt.Errorf("Failed to retrieve profile='%s'", name)) + return SmartError(fmt.Errorf("Failed to retrieve profile='%s'", name)) } // Validate the ETag @@ -273,7 +273,7 @@ err := dbProfileUpdate(d.db, name, req.Name) if err != nil { - return InternalError(err) + return SmartError(err) } return SyncResponseLocation(true, nil, fmt.Sprintf("/%s/profiles/%s", version.APIVersion, req.Name)) diff -Nru lxd-2.14/lxd/profiles_utils.go lxd-2.15/lxd/profiles_utils.go --- lxd-2.14/lxd/profiles_utils.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/profiles_utils.go 2017-06-28 03:00:23.000000000 +0000 @@ -43,7 +43,7 @@ for i := len(profiles) - 1; i >= 0; i-- { _, profile, err := dbProfileGet(d.db, profiles[i]) if err != nil { - return InternalError(err) + return SmartError(err) } // Check if we find a match for the device @@ -65,14 +65,14 @@ // Update the database tx, err := dbBegin(d.db) if err != nil { - return InternalError(err) + return SmartError(err) } if profile.Description != req.Description { err = dbProfileDescriptionUpdate(tx, id, req.Description) if err != nil { tx.Rollback() - return InternalError(err) + return SmartError(err) } } @@ -80,7 +80,7 @@ if reflect.DeepEqual(profile.Config, req.Config) && reflect.DeepEqual(profile.Devices, req.Devices) { err = txCommit(tx) if err != nil { - return InternalError(err) + return SmartError(err) } return EmptySyncResponse @@ -89,7 +89,7 @@ err = dbProfileConfigClear(tx, id) if err != nil { tx.Rollback() - return InternalError(err) + return SmartError(err) } err = dbProfileConfigAdd(tx, id, req.Config) @@ -106,7 +106,7 @@ err = txCommit(tx) if err != nil { - return InternalError(err) + return SmartError(err) } // Update all the containers using the profile. Must be done after txCommit due to DB lock. @@ -129,7 +129,7 @@ for cname, err := range failures { msg += fmt.Sprintf(" - %s: %s\n", cname, err) } - return InternalError(fmt.Errorf("%s", msg)) + return SmartError(fmt.Errorf("%s", msg)) } return EmptySyncResponse diff -Nru lxd-2.14/lxd/rsync.go lxd-2.15/lxd/rsync.go --- lxd-2.14/lxd/rsync.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/rsync.go 2017-06-28 03:00:23.000000000 +0000 @@ -34,6 +34,7 @@ return shared.RunCommand("rsync", "-a", "-HAX", + "--sparse", "--devices", "--delete", "--checksum", @@ -91,6 +92,7 @@ "--devices", "--numeric-ids", "--partial", + "--sparse", path, "localhost:/tmp/foo", "-e", @@ -165,6 +167,7 @@ "--numeric-ids", "--devices", "--partial", + "--sparse", ".", path) diff -Nru lxd-2.14/lxd/storage_btrfs.go lxd-2.15/lxd/storage_btrfs.go --- lxd-2.14/lxd/storage_btrfs.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/storage_btrfs.go 2017-06-28 03:00:23.000000000 +0000 @@ -222,16 +222,9 @@ return err1 } - // Enable quotas - output, err := shared.RunCommand( - "btrfs", "quota", "enable", poolMntPoint) - if err != nil && !runningInUserns { - return fmt.Errorf("Failed to enable quotas on BTRFS pool: %s", output) - } - // Create default subvolumes. dummyDir := getContainerMountPoint(s.pool.Name, "") - err = btrfsSubVolumeCreate(dummyDir) + err := btrfsSubVolumeCreate(dummyDir) if err != nil { return fmt.Errorf("Could not create btrfs subvolume: %s", dummyDir) } @@ -361,7 +354,6 @@ } lxdStorageMapLock.Unlock() } - defer removeLockFromMap() // Check whether the mount poolMntPoint exits. @@ -376,7 +368,7 @@ return false, nil } - mountFlags := uintptr(0) + mountFlags, mountOptions := lxdResolveMountoptions(s.getBtrfsMountOptions()) mountSource := source isBlockDev := shared.IsBlockdevPath(source) if filepath.IsAbs(source) { @@ -398,7 +390,7 @@ defer loopF.Close() } else if !isBlockDev && cleanSource != poolMntPoint { mountSource = source - mountFlags = syscall.MS_BIND + mountFlags |= syscall.MS_BIND } else if !isBlockDev && cleanSource == poolMntPoint && s.d.BackingFs == "btrfs" { return false, nil } @@ -419,14 +411,12 @@ // detection task. return false, nil } - } - mountFlags, mountOptions := lxdResolveMountoptions(s.getBtrfsMountOptions()) mountFlags |= s.remount err := syscall.Mount(mountSource, poolMntPoint, "btrfs", mountFlags, mountOptions) if err != nil { - logger.Errorf("failed to mount BTRFS storage pool \"%s\" onto \"%s\" with mountoptions \"%s\": %s", mountSource, poolMntPoint, mountOptions, err) + logger.Errorf("Failed to mount BTRFS storage pool \"%s\" onto \"%s\" with mountoptions \"%s\": %s", mountSource, poolMntPoint, mountOptions, err) return false, err } @@ -1070,7 +1060,17 @@ _, err := btrfsSubVolumeQGroup(subvol) if err != nil { - return err + if err != NoSuchObjectError { + return err + } + + // Enable quotas + poolMntPoint := getStoragePoolMountPoint(s.pool.Name) + output, err := shared.RunCommand( + "btrfs", "quota", "enable", poolMntPoint) + if err != nil && !runningInUserns { + return fmt.Errorf("Failed to enable quotas on BTRFS pool: %s", output) + } } output, err := shared.RunCommand( @@ -1450,7 +1450,7 @@ "-f") if err != nil { - return "", fmt.Errorf("BTRFS quotas not supported. Try enabling them with \"btrfs quota enable\"") + return "", NoSuchObjectError } var qgroup string @@ -1767,7 +1767,7 @@ return err } -func (s *btrfsMigrationSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string) error { +func (s *btrfsMigrationSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string, containerOnly bool) error { _, containerPool := s.container.Storage().GetContainerPoolInfo() containerName := s.container.Name() containersPath := getContainerMountPoint(containerPool, "") @@ -1803,16 +1803,18 @@ return s.send(conn, migrationSendSnapshot, "", wrapper) } - for i, snap := range s.snapshots { - prev := "" - if i > 0 { - prev = getSnapshotMountPoint(containerPool, s.snapshots[i-1].Name()) - } + if !containerOnly { + for i, snap := range s.snapshots { + prev := "" + if i > 0 { + prev = getSnapshotMountPoint(containerPool, s.snapshots[i-1].Name()) + } - snapMntPoint := getSnapshotMountPoint(containerPool, snap.Name()) - wrapper := StorageProgressReader(op, "fs_progress", snap.Name()) - if err := s.send(conn, snapMntPoint, prev, wrapper); err != nil { - return err + snapMntPoint := getSnapshotMountPoint(containerPool, snap.Name()) + wrapper := StorageProgressReader(op, "fs_progress", snap.Name()) + if err := s.send(conn, snapMntPoint, prev, wrapper); err != nil { + return err + } } } diff -Nru lxd-2.14/lxd/storage_dir.go lxd-2.15/lxd/storage_dir.go --- lxd-2.14/lxd/storage_dir.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/storage_dir.go 2017-06-28 03:00:23.000000000 +0000 @@ -607,17 +607,17 @@ err := sourceContainer.Freeze() if err != nil { logger.Errorf("Trying to freeze and rsync again failed.") - return nil + goto onSuccess } + defer sourceContainer.Unfreeze() err = rsync(snapshotContainer, sourceContainerMntPoint, targetContainerMntPoint, bwlimit) if err != nil { return err } - - defer sourceContainer.Unfreeze() } +onSuccess: // Check if the symlink // ${LXD_DIR}/snapshots/ -> ${POOL_PATH}/snapshots/ // exists and if not create it. diff -Nru lxd-2.14/lxd/storage.go lxd-2.15/lxd/storage.go --- lxd-2.14/lxd/storage.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/storage.go 2017-06-28 03:00:23.000000000 +0000 @@ -16,6 +16,7 @@ "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/ioprogress" "github.com/lxc/lxd/shared/logger" + "github.com/lxc/lxd/shared/version" ) // lxdStorageLockMap is a hashmap that allows functions to check whether the @@ -387,6 +388,129 @@ return storageInit(d, poolName, "", -1) } +func storagePoolVolumeAttachInit(d *Daemon, poolName string, volumeName string, volumeType int, c container) (storage, error) { + st, err := storageInit(d, poolName, volumeName, volumeType) + if err != nil { + return nil, err + } + + poolVolumePut := st.GetStoragePoolVolumeWritable() + + // get last idmapset + var lastIdmap *shared.IdmapSet + if poolVolumePut.Config["volatile.idmap.last"] != "" { + lastIdmap, err = idmapsetFromString(poolVolumePut.Config["volatile.idmap.last"]) + if err != nil { + logger.Errorf("failed to unmarshal last idmapping: %s", poolVolumePut.Config["volatile.idmap.last"]) + return nil, err + } + } + + // get next idmapset + nextIdmap, err := c.IdmapSet() + if err != nil { + return nil, err + } + + nextJsonMap := "[]" + if nextIdmap != nil { + nextJsonMap, err = idmapsetToJSON(nextIdmap) + if err != nil { + return nil, err + } + } + poolVolumePut.Config["volatile.idmap.next"] = nextJsonMap + + // get mountpoint of storage volume + remapPath := getStoragePoolVolumeMountPoint(poolName, volumeName) + + // Convert the volume type name to our internal integer representation. + volumeTypeName, err := storagePoolVolumeTypeToName(volumeType) + if err != nil { + return nil, err + } + + if !reflect.DeepEqual(nextIdmap, lastIdmap) { + logger.Debugf("Shifting storage volume") + volumeUsedBy, err := storagePoolVolumeUsedByGet(d, volumeName, volumeTypeName) + if err != nil { + return nil, err + } + + if len(volumeUsedBy) > 1 { + return nil, fmt.Errorf("idmaps of container and storage volume are not identical") + } else if len(volumeUsedBy) == 1 { + // If we're the only one who's attached that container + // we can shift the storage volume. + // I'm not sure if we want some locking here. + if volumeUsedBy[0] != fmt.Sprintf("/%s/containers/%s", version.APIVersion, c.Name()) { + return nil, fmt.Errorf("idmaps of container and storage volume are not identical") + } + } + + // mount storage volume + ourMount, err := st.StoragePoolVolumeMount() + if err != nil { + return nil, err + } + if ourMount { + defer func() { + _, err := st.StoragePoolVolumeUmount() + if err != nil { + logger.Warnf("failed to unmount storage volume") + } + }() + } + + // unshift rootfs + if lastIdmap != nil { + err := lastIdmap.UnshiftRootfs(remapPath) + if err != nil { + logger.Errorf("Failed to unshift \"%s\"", remapPath) + return nil, err + } + logger.Debugf("Unshifted \"%s\"", remapPath) + } + + // shift rootfs + if nextIdmap != nil { + err := nextIdmap.ShiftRootfs(remapPath) + if err != nil { + logger.Errorf("Failed to shift \"%s\"", remapPath) + return nil, err + } + logger.Debugf("Shifted \"%s\"", remapPath) + } + logger.Debugf("Shifted storage volume") + } + + jsonIdmap := "[]" + if nextIdmap != nil { + var err error + jsonIdmap, err = idmapsetToJSON(nextIdmap) + if err != nil { + logger.Errorf("Failed to marshal idmap") + return nil, err + } + } + + // update last idmap + poolVolumePut.Config["volatile.idmap.last"] = jsonIdmap + + st.SetStoragePoolVolumeWritable(&poolVolumePut) + + poolID, err := dbStoragePoolGetID(d.db, poolName) + if err != nil { + return nil, err + } + err = dbStoragePoolVolumeUpdate(d.db, volumeName, volumeType, poolID, poolVolumePut.Description, poolVolumePut.Config) + if err != nil { + return nil, err + } + + return st, nil +} + func storagePoolVolumeInit(d *Daemon, poolName string, volumeName string, volumeType int) (storage, error) { // No need to detect storage here, its a new container. return storageInit(d, poolName, volumeName, volumeType) diff -Nru lxd-2.14/lxd/storage_lvm.go lxd-2.15/lxd/storage_lvm.go --- lxd-2.14/lxd/storage_lvm.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/storage_lvm.go 2017-06-28 03:00:23.000000000 +0000 @@ -260,11 +260,11 @@ } empty := true - if count > 1 || count == 1 && !s.useThinpool { + if count > 0 && !s.useThinpool { empty = false } - if count == 1 && s.useThinpool { + if count > 0 && s.useThinpool { ok, err := storageLVMThinpoolExists(poolName, s.thinPoolName) if err != nil { logger.Errorf("failed to determine whether thinpool \"%s\" exists in volume group \"%s\": %s", poolName, s.thinPoolName, err) diff -Nru lxd-2.14/lxd/storage_migration.go lxd-2.15/lxd/storage_migration.go --- lxd-2.14/lxd/storage_migration.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/storage_migration.go 2017-06-28 03:00:23.000000000 +0000 @@ -18,7 +18,7 @@ /* send any bits of the container/snapshots that are possible while the * container is still running. */ - SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string) error + SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string, containerOnly bool) error /* send the final bits (e.g. a final delta snapshot for zfs, btrfs, or * do a final rsync) of the fs after the container has been @@ -42,22 +42,25 @@ return s.snapshots } -func (s rsyncStorageSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string) error { +func (s rsyncStorageSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string, containerOnly bool) error { ctName, _, _ := containerGetParentAndSnapshotName(s.container.Name()) - for _, send := range s.snapshots { - ourStart, err := send.StorageStart() - if err != nil { - return err - } - if ourStart { - defer send.StorageStop() - } - path := send.Path() - wrapper := StorageProgressReader(op, "fs_progress", send.Name()) - err = RsyncSend(ctName, shared.AddSlash(path), conn, wrapper, bwlimit) - if err != nil { - return err + if !containerOnly { + for _, send := range s.snapshots { + ourStart, err := send.StorageStart() + if err != nil { + return err + } + if ourStart { + defer send.StorageStop() + } + + path := send.Path() + wrapper := StorageProgressReader(op, "fs_progress", send.Name()) + err = RsyncSend(ctName, shared.AddSlash(path), conn, wrapper, bwlimit) + if err != nil { + return err + } } } diff -Nru lxd-2.14/lxd/storage_pools.go lxd-2.15/lxd/storage_pools.go --- lxd-2.14/lxd/storage_pools.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/storage_pools.go 2017-06-28 03:00:23.000000000 +0000 @@ -23,7 +23,7 @@ pools, err := dbStoragePools(d.db) if err != nil && err != NoSuchObjectError { - return InternalError(err) + return SmartError(err) } resultString := []string{} @@ -103,7 +103,7 @@ } pool.UsedBy = poolUsedBy - etag := []interface{}{pool.Name, pool.UsedBy, pool.Config} + etag := []interface{}{pool.Name, pool.Driver, pool.Config} return SyncResponseETag(true, &pool, etag) } @@ -120,7 +120,7 @@ } // Validate the ETag - etag := []interface{}{dbInfo.Name, dbInfo.UsedBy, dbInfo.Config} + etag := []interface{}{dbInfo.Name, dbInfo.Driver, dbInfo.Config} err = etagCheck(r, etag) if err != nil { @@ -158,7 +158,7 @@ } // Validate the ETag - etag := []interface{}{dbInfo.Name, dbInfo.UsedBy, dbInfo.Config} + etag := []interface{}{dbInfo.Name, dbInfo.Driver, dbInfo.Config} err = etagCheck(r, etag) if err != nil { @@ -216,7 +216,7 @@ // Check if the storage pool is still referenced in any profiles. profiles, err := profilesUsingPoolGetNames(d.db, poolName) if err != nil { - return InternalError(err) + return SmartError(err) } if len(profiles) > 0 { return BadRequest(fmt.Errorf("Storage pool \"%s\" has profiles using it:\n%s", poolName, strings.Join(profiles, "\n"))) @@ -234,7 +234,7 @@ err = dbStoragePoolDelete(d.db, poolName) if err != nil { - return InternalError(err) + return SmartError(err) } return EmptySyncResponse diff -Nru lxd-2.14/lxd/storage_volumes_config.go lxd-2.15/lxd/storage_volumes_config.go --- lxd-2.14/lxd/storage_volumes_config.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/storage_volumes_config.go 2017-06-28 03:00:23.000000000 +0000 @@ -23,6 +23,8 @@ }, "zfs.use_refquota": shared.IsBool, "zfs.remove_snapshots": shared.IsBool, + "volatile.idmap.last": shared.IsAny, + "volatile.idmap.next": shared.IsAny, } func storageVolumeValidateConfig(name string, config map[string]string, parentPool *api.StoragePool) error { diff -Nru lxd-2.14/lxd/storage_volumes.go lxd-2.15/lxd/storage_volumes.go --- lxd-2.14/lxd/storage_volumes.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/storage_volumes.go 2017-06-28 03:00:23.000000000 +0000 @@ -101,7 +101,7 @@ // attached to the storage pool. volumes, err := dbStoragePoolVolumesGetType(d.db, volumeType, poolID) if err != nil { - return InternalError(err) + return SmartError(err) } resultString := []string{} @@ -121,7 +121,7 @@ volumeUsedBy, err := storagePoolVolumeUsedByGet(d, vol.Name, vol.Type) if err != nil { - return InternalError(err) + return SmartError(err) } vol.UsedBy = volumeUsedBy @@ -204,7 +204,7 @@ // attached to. poolID, err := dbStoragePoolGetID(d.db, poolName) if err != nil { - return InternalError(err) + return SmartError(err) } // Get the storage volume. @@ -215,7 +215,7 @@ volumeUsedBy, err := storagePoolVolumeUsedByGet(d, volume.Name, volume.Type) if err != nil { - return InternalError(err) + return SmartError(err) } volume.UsedBy = volumeUsedBy @@ -278,7 +278,7 @@ err = storagePoolVolumeUpdate(d, poolName, volumeName, volumeType, req.Description, req.Config) if err != nil { - return InternalError(err) + return SmartError(err) } return EmptySyncResponse @@ -351,7 +351,7 @@ err = storagePoolVolumeUpdate(d, poolName, volumeName, volumeType, req.Description, req.Config) if err != nil { - return InternalError(err) + return SmartError(err) } return EmptySyncResponse @@ -385,7 +385,7 @@ volumeUsedBy, err := storagePoolVolumeUsedByGet(d, volumeName, volumeTypeName) if err != nil { - return InternalError(err) + return SmartError(err) } if len(volumeUsedBy) > 0 { @@ -399,17 +399,17 @@ err = s.StoragePoolVolumeDelete() if err != nil { - return InternalError(err) + return SmartError(err) } poolID, err := dbStoragePoolGetID(d.db, poolName) if err != nil { - return InternalError(err) + return SmartError(err) } err = dbStoragePoolVolumeDelete(d.db, volumeName, volumeType, poolID) if err != nil { - return InternalError(err) + return SmartError(err) } return EmptySyncResponse diff -Nru lxd-2.14/lxd/storage_zfs.go lxd-2.15/lxd/storage_zfs.go --- lxd-2.14/lxd/storage_zfs.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/storage_zfs.go 2017-06-28 03:00:23.000000000 +0000 @@ -462,7 +462,7 @@ // tracking. So ignore them for now, report back that // the mount isn't ours and proceed. logger.Warnf("ZFS returned EBUSY while \"%s\" is actually not a mountpoint.", containerPoolVolumeMntPoint) - return false, nil + return false, mounterr } ourMount = true } @@ -958,7 +958,7 @@ zfsSendCmd := exec.Command("zfs", args...) targetSnapshotDataset := fmt.Sprintf("%s/containers/%s@snapshot-%s", poolName, targetParentName, targetSnapOnlyName) - zfsRecvCmd := exec.Command("zfs", "receive", targetSnapshotDataset) + zfsRecvCmd := exec.Command("zfs", "receive", "-F", targetSnapshotDataset) zfsRecvCmd.Stdin, _ = zfsSendCmd.StdoutPipe() zfsRecvCmd.Stdout = os.Stdout @@ -1019,8 +1019,9 @@ return err } + prev := "" + prevSnapOnlyName := "" for i, snap := range snapshots { - prev := "" if i > 0 { prev = snapshots[i-1].Name() } @@ -1031,6 +1032,7 @@ } _, snapOnlyName, _ := containerGetParentAndSnapshotName(snap.Name()) + prevSnapOnlyName = snapOnlyName newSnapName := fmt.Sprintf("%s/%s", target.Name(), snapOnlyName) targetSnapshot, err := containerLoadByName(s.d, newSnapName) if err != nil { @@ -1043,6 +1045,47 @@ } } + // send actual container + tmpSnapshotName := fmt.Sprintf("copy-send-%s", uuid.NewRandom().String()) + err = s.zfsPoolVolumeSnapshotCreate(fmt.Sprintf("containers/%s", source.Name()), tmpSnapshotName) + if err != nil { + return err + } + + poolName := s.getOnDiskPoolName() + currentSnapshotDataset := fmt.Sprintf("%s/containers/%s@%s", poolName, source.Name(), tmpSnapshotName) + args := []string{"send", currentSnapshotDataset} + if prevSnapOnlyName != "" { + parentSnapshotDataset := fmt.Sprintf("%s/containers/%s@snapshot-%s", poolName, source.Name(), prevSnapOnlyName) + args = append(args, "-i", parentSnapshotDataset) + } + + zfsSendCmd := exec.Command("zfs", args...) + targetSnapshotDataset := fmt.Sprintf("%s/containers/%s@%s", poolName, target.Name(), tmpSnapshotName) + zfsRecvCmd := exec.Command("zfs", "receive", "-F", targetSnapshotDataset) + + zfsRecvCmd.Stdin, _ = zfsSendCmd.StdoutPipe() + zfsRecvCmd.Stdout = os.Stdout + zfsRecvCmd.Stderr = os.Stderr + + err = zfsRecvCmd.Start() + if err != nil { + return err + } + + err = zfsSendCmd.Run() + if err != nil { + return err + } + + err = zfsRecvCmd.Wait() + if err != nil { + return err + } + + s.zfsPoolVolumeSnapshotDestroy(fmt.Sprintf("containers/%s", source.Name()), tmpSnapshotName) + s.zfsPoolVolumeSnapshotDestroy(fmt.Sprintf("containers/%s", target.Name()), tmpSnapshotName) + fs := fmt.Sprintf("containers/%s", target.Name()) err = s.zfsPoolVolumeSet(fs, "mountpoint", targetContainerMountPoint) if err != nil { @@ -1778,6 +1821,12 @@ logger.Errorf("zfs create failed: %s.", output) return fmt.Errorf("Failed to create ZFS filesystem: %s", output) } + } else { + msg, err := zfsPoolVolumeSet(vdev, "mountpoint", "none") + if err != nil { + logger.Errorf("zfs set failed to unset dataset mountpoint %s", msg) + return err + } } } else { err := s.zfsPoolCheck(vdev) @@ -1793,81 +1842,90 @@ if len(subvols) > 0 { return fmt.Errorf("Provided ZFS pool (or dataset) isn't empty") } + + msg, err := zfsPoolVolumeSet(vdev, "mountpoint", "none") + if err != nil { + logger.Errorf("zfs set failed to unset dataset mountpoint %s", msg) + return err + } } } } // Create default dummy datasets to avoid zfs races during container // creation. - err := s.zfsPoolVolumeCreate("containers") + poolName := s.getOnDiskPoolName() + dataset := fmt.Sprintf("%s/containers", poolName) + msg, err := zfsPoolVolumeCreate(dataset, "mountpoint=none") if err != nil { + logger.Errorf("failed to create containers dataset: %s", msg) return err } - err = s.zfsPoolVolumeSet("containers", "mountpoint", "none") - if err != nil { + fixperms := shared.VarPath("storage-pools", s.pool.Name, "containers") + err = os.MkdirAll(fixperms, containersDirMode) + if err != nil && !os.IsNotExist(err) { return err } - fixperms := shared.VarPath("storage-pools", s.pool.Name, "containers") err = os.Chmod(fixperms, containersDirMode) if err != nil { logger.Warnf("failed to chmod \"%s\" to \"0%s\": %s", fixperms, strconv.FormatInt(int64(containersDirMode), 8), err) } - err = s.zfsPoolVolumeCreate("images") + dataset = fmt.Sprintf("%s/images", poolName) + msg, err = zfsPoolVolumeCreate(dataset, "mountpoint=none") if err != nil { + logger.Errorf("failed to create images dataset: %s", msg) return err } - err = s.zfsPoolVolumeSet("images", "mountpoint", "none") - if err != nil { + fixperms = shared.VarPath("storage-pools", s.pool.Name, "images") + err = os.MkdirAll(fixperms, imagesDirMode) + if err != nil && !os.IsNotExist(err) { return err } - - fixperms = shared.VarPath("storage-pools", s.pool.Name, "images") err = os.Chmod(fixperms, imagesDirMode) if err != nil { logger.Warnf("failed to chmod \"%s\" to \"0%s\": %s", fixperms, strconv.FormatInt(int64(imagesDirMode), 8), err) } - err = s.zfsPoolVolumeCreate("custom") + dataset = fmt.Sprintf("%s/custom", poolName) + msg, err = zfsPoolVolumeCreate(dataset, "mountpoint=none") if err != nil { + logger.Errorf("failed to create custom dataset: %s", msg) return err } - err = s.zfsPoolVolumeSet("custom", "mountpoint", "none") - if err != nil { + fixperms = shared.VarPath("storage-pools", s.pool.Name, "custom") + err = os.MkdirAll(fixperms, customDirMode) + if err != nil && !os.IsNotExist(err) { return err } - - fixperms = shared.VarPath("storage-pools", s.pool.Name, "custom") err = os.Chmod(fixperms, customDirMode) if err != nil { logger.Warnf("failed to chmod \"%s\" to \"0%s\": %s", fixperms, strconv.FormatInt(int64(customDirMode), 8), err) } - err = s.zfsPoolVolumeCreate("deleted") - if err != nil { - return err - } - - err = s.zfsPoolVolumeSet("deleted", "mountpoint", "none") + dataset = fmt.Sprintf("%s/deleted", poolName) + msg, err = zfsPoolVolumeCreate(dataset, "mountpoint=none") if err != nil { + logger.Errorf("failed to create deleted dataset: %s", msg) return err } - err = s.zfsPoolVolumeCreate("snapshots") + dataset = fmt.Sprintf("%s/snapshots", poolName) + msg, err = zfsPoolVolumeCreate(dataset, "mountpoint=none") if err != nil { + logger.Errorf("failed to create snapshots dataset: %s", msg) return err } - err = s.zfsPoolVolumeSet("snapshots", "mountpoint", "none") - if err != nil { + fixperms = shared.VarPath("storage-pools", s.pool.Name, "snapshots") + err = os.MkdirAll(fixperms, snapshotsDirMode) + if err != nil && !os.IsNotExist(err) { return err } - - fixperms = shared.VarPath("storage-pools", s.pool.Name, "snapshots") err = os.Chmod(fixperms, snapshotsDirMode) if err != nil { logger.Warnf("failed to chmod \"%s\" to \"0%s\": %s", fixperms, strconv.FormatInt(int64(snapshotsDirMode), 8), err) @@ -2467,7 +2525,7 @@ return err } -func (s *zfsMigrationSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string) error { +func (s *zfsMigrationSourceDriver) SendWhileRunning(conn *websocket.Conn, op *operation, bwlimit string, containerOnly bool) error { if s.container.IsSnapshot() { _, snapOnlyName, _ := containerGetParentAndSnapshotName(s.container.Name()) snapshotName := fmt.Sprintf("snapshot-%s", snapOnlyName) @@ -2476,18 +2534,19 @@ } lastSnap := "" + if !containerOnly { + for i, snap := range s.zfsSnapshotNames { + prev := "" + if i > 0 { + prev = s.zfsSnapshotNames[i-1] + } - for i, snap := range s.zfsSnapshotNames { - prev := "" - if i > 0 { - prev = s.zfsSnapshotNames[i-1] - } - - lastSnap = snap + lastSnap = snap - wrapper := StorageProgressReader(op, "fs_progress", snap) - if err := s.send(conn, snap, prev, wrapper); err != nil { - return err + wrapper := StorageProgressReader(op, "fs_progress", snap) + if err := s.send(conn, snap, prev, wrapper); err != nil { + return err + } } } @@ -2550,6 +2609,10 @@ zfs: s, } + if containerOnly { + return &driver, nil + } + /* List all the snapshots in order of reverse creation. The idea here * is that we send the oldest to newest snapshot, hopefully saving on * xfer costs. Then, after all that, we send the container itself. diff -Nru lxd-2.14/lxd/storage_zfs_utils.go lxd-2.15/lxd/storage_zfs_utils.go --- lxd-2.14/lxd/storage_zfs_utils.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/lxd/storage_zfs_utils.go 2017-06-28 03:00:23.000000000 +0000 @@ -1,6 +1,7 @@ package main import ( + "fmt" "strings" "github.com/lxc/lxd/shared" @@ -11,3 +12,10 @@ p := strings.Join(properties, ",") return shared.RunCommand("zfs", "create", "-o", p, "-p", dataset) } + +func zfsPoolVolumeSet(dataset string, key string, value string) (string, error) { + return shared.RunCommand("zfs", + "set", + fmt.Sprintf("%s=%s", key, value), + dataset) +} diff -Nru lxd-2.14/Makefile lxd-2.15/Makefile --- lxd-2.14/Makefile 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/Makefile 2017-06-28 03:00:23.000000000 +0000 @@ -80,7 +80,7 @@ rm -Rf $(TMP) .PHONY: i18n update-po update-pot build-mo static-analysis -i18n: update-po update-pot +i18n: update-pot update-po po/%.mo: po/%.po msgfmt --statistics -o $@ $< diff -Nru lxd-2.14/po/de.po lxd-2.15/po/de.po --- lxd-2.14/po/de.po 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/de.po 2017-06-28 03:00:23.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: LXD\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2017-05-30 14:59-0400\n" +"POT-Creation-Date: 2017-06-27 00:23-0400\n" "PO-Revision-Date: 2017-02-14 17:11+0000\n" "Last-Translator: Tim Rose \n" "Language-Team: German [options]\n" @@ -1337,7 +1380,7 @@ "\n" "lxc copy \n" -#: lxc/delete.go:26 +#: lxc/delete.go:27 #, fuzzy msgid "" "Usage: lxc delete [:][/] " @@ -1350,7 +1393,7 @@ "Entfernt einen Container (oder Sicherungspunkt) und alle dazugehörigen\n" "Daten (Konfiguration, Sicherungspunkte, ...).\n" -#: lxc/exec.go:52 +#: lxc/exec.go:53 #, fuzzy msgid "" "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|" @@ -1365,7 +1408,7 @@ "\n" "lxc exec [--env EDITOR=/usr/bin/vim]... \n" -#: lxc/file.go:36 +#: lxc/file.go:38 #, fuzzy msgid "" "Usage: lxc file [options]\n" @@ -1418,7 +1461,7 @@ "Help page for the LXD client." msgstr "" -#: lxc/image.go:62 +#: lxc/image.go:72 msgid "" "Usage: lxc image [options]\n" "\n" @@ -1472,11 +1515,38 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" -"lxc image list [:] [filter] [--format table|json]\n" +"lxc image list [:] [filter] [--format csv|json|table|yaml] [-c " +"]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" +" The -c option takes a (optionally comma-separated) list of arguments " +"that\n" +" control which image attributes to output when displaying in table or " +"csv\n" +" format.\n" +"\n" +" Default column layout is: lfpdasu\n" +"\n" +" Column shorthand chars:\n" +"\n" +" l - Shortest image alias (and optionally number of other aliases)\n" +"\n" +" L - Newline-separated list of all image aliases\n" +"\n" +" f - Fingerprint\n" +"\n" +" p - Whether image is public\n" +"\n" +" d - Description\n" +"\n" +" a - Architecture\n" +"\n" +" s - Size\n" +"\n" +" u - Upload date\n" +"\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1496,7 +1566,7 @@ "image alias name." msgstr "" -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "" "Usage: lxc info [:][] [--show-log]\n" "\n" @@ -1509,7 +1579,7 @@ " For LXD server information." msgstr "" -#: lxc/init.go:75 +#: lxc/init.go:76 #, fuzzy msgid "" "Usage: lxc init [:] [:][] [--ephemeral|-e] [--" @@ -1536,7 +1606,7 @@ "Beispiel:\n" "lxc launch ubuntu u1\n" -#: lxc/launch.go:23 +#: lxc/launch.go:20 #, fuzzy msgid "" "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--" @@ -1563,10 +1633,10 @@ "Beispiel:\n" "lxc launch ubuntu u1\n" -#: lxc/list.go:49 +#: lxc/list.go:44 #, fuzzy msgid "" -"Usage: lxc list [:] [filters] [--format table|json|csv] [-c " +"Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c " "] [--fast]\n" "\n" "List the existing containers.\n" @@ -1692,7 +1762,7 @@ " Only show log message." msgstr "" -#: lxc/move.go:19 +#: lxc/move.go:22 #, fuzzy msgid "" "Usage: lxc move [:][/] [:][[/" @@ -1715,7 +1785,7 @@ "\n" "lxc move \n" -#: lxc/network.go:49 +#: lxc/network.go:50 msgid "" "Usage: lxc network [options]\n" "\n" @@ -1768,7 +1838,7 @@ " Update a network using the content of network.yaml" msgstr "" -#: lxc/profile.go:49 +#: lxc/profile.go:51 #, fuzzy msgid "" "Usage: lxc profile [options]\n" @@ -1884,7 +1954,7 @@ "Containern hinzu,\n" " die dieses Profil verwenden.\n" -#: lxc/publish.go:27 +#: lxc/publish.go:28 msgid "" "Usage: lxc publish [:][/] [:] [--" "alias=ALIAS...] [prop-key=prop-value...]\n" @@ -1892,7 +1962,7 @@ "Publish containers as images." msgstr "" -#: lxc/remote.go:38 +#: lxc/remote.go:39 #, fuzzy msgid "" "Usage: lxc remote [options]\n" @@ -1938,7 +2008,7 @@ "lxc remote get-default " "Gibt die Standard Instanz aus.\n" -#: lxc/restore.go:21 +#: lxc/restore.go:22 msgid "" "Usage: lxc restore [:] [--stateful]\n" "\n" @@ -1954,7 +2024,7 @@ " Restore the snapshot." msgstr "" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 msgid "" "Usage: lxc snapshot [:] [--stateful]\n" "\n" @@ -1968,7 +2038,7 @@ " Create a snapshot of \"u1\" called \"snap0\"." msgstr "" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "" "Usage: lxc storage [options]\n" "\n" @@ -2072,11 +2142,11 @@ "\n" "lxc version\n" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "" -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "" "Whether or not to restore the container's running state from snapshot (if " "available)" @@ -2084,153 +2154,138 @@ "Laufenden Zustand des Containers aus dem Sicherungspunkt (falls vorhanden) " "wiederherstellen oder nicht" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "Zustand des laufenden Containers sichern oder nicht" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "" -#: lxc/exec.go:129 +#: lxc/exec.go:130 #, fuzzy msgid "You can't pass -t or -T at the same time as --mode" msgstr "kann nicht zum selben Container Namen kopieren" -#: lxc/main.go:56 -msgid "`lxc config profile` is deprecated, please use `lxc profile`" -msgstr "" - -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "" -"Falsche Anzahl an Objekten im Abbild, Container oder Sicherungspunkt gelesen." - -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" -msgstr "kann nicht zum selben Container Namen kopieren" +#: lxc/copy.go:57 +#, fuzzy +msgid "You must specify a source container name" +msgstr "der Name des Ursprung Containers muss angegeben werden" -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" +#: lxc/main.go:58 +msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "" -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 -#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, fuzzy, c-format msgid "error: %v" msgstr "Fehler: %v\n" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, fuzzy, c-format msgid "error: unknown command: %s" msgstr "Fehler: unbekannter Befehl: %s\n" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "Versionskonflikt" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" msgstr "" -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "nicht alle Profile der Quelle sind am Ziel vorhanden." - -#: lxc/remote.go:233 +#: lxc/remote.go:229 #, fuzzy msgid "ok (y/n)?" msgstr "OK (y/n)? " -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" msgstr "" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" msgstr "entfernte Instanz %s existiert bereits" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" msgstr "entfernte Instanz %s existiert nicht" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" msgstr "entfernte Instanz %s existiert als <%s>" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" msgstr "" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" msgstr "" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" msgstr "" -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "" - -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" msgstr "falsche Anzahl an Parametern für Unterbefehl" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" msgstr "" -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "der Name des Ursprung Containers muss angegeben werden" +#~ msgid "bad number of things scanned from image, container or snapshot" +#~ msgstr "" +#~ "Falsche Anzahl an Objekten im Abbild, Container oder Sicherungspunkt " +#~ "gelesen." + +#~ msgid "can't copy to the same container name" +#~ msgstr "kann nicht zum selben Container Namen kopieren" + +#~ msgid "got bad version" +#~ msgstr "Versionskonflikt" + +#~ msgid "not all the profiles from the source exist on the target" +#~ msgstr "nicht alle Profile der Quelle sind am Ziel vorhanden." #, fuzzy #~ msgid "" @@ -2290,10 +2345,6 @@ #~ "Abbilder importieren.\n" #, fuzzy -#~ msgid "Bad image property: %s" -#~ msgstr "Ungültige Abbild Eigenschaft: %s\n" - -#, fuzzy #~ msgid "" #~ "Create a read-only snapshot of a container.\n" #~ "\n" @@ -2390,10 +2441,6 @@ #~ msgstr "Falsche Version in Profil URL" #, fuzzy -#~ msgid "device already exists" -#~ msgstr "entfernte Instanz %s existiert bereits" - -#, fuzzy #~ msgid "error." #~ msgstr "Fehler: %v\n" @@ -2440,10 +2487,6 @@ #~ msgstr "ungültiges Argument %s" #, fuzzy -#~ msgid "unknown profile cmd %s" -#~ msgstr "Unbekannter Befehl %s für Abbild" - -#, fuzzy #~ msgid "Publish to remote server is not supported yet" #~ msgstr "" #~ "Anzeigen von Informationen über entfernte Instanzen wird noch nicht " diff -Nru lxd-2.14/po/el.po lxd-2.15/po/el.po --- lxd-2.14/po/el.po 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/el.po 2017-06-28 03:00:23.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2017-05-30 14:59-0400\n" +"POT-Creation-Date: 2017-06-27 00:23-0400\n" "PO-Revision-Date: 2017-02-14 08:00+0000\n" "Last-Translator: Simos Xenitellis \n" "Language-Team: Greek [options]" msgstr "" -#: lxc/config.go:58 +#: lxc/config.go:60 msgid "" "Usage: lxc config [options]\n" "\n" @@ -1175,7 +1216,7 @@ "Copy containers within or in between LXD instances." msgstr "" -#: lxc/delete.go:26 +#: lxc/delete.go:27 msgid "" "Usage: lxc delete [:][/] " "[[:][/]...]\n" @@ -1183,7 +1224,7 @@ "Delete containers and snapshots." msgstr "" -#: lxc/exec.go:52 +#: lxc/exec.go:53 msgid "" "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|" "interactive|non-interactive] [--env KEY=VALUE...] [--] \n" @@ -1194,7 +1235,7 @@ "AND stdout are terminals (stderr is ignored)." msgstr "" -#: lxc/file.go:36 +#: lxc/file.go:38 msgid "" "Usage: lxc file [options]\n" "\n" @@ -1238,7 +1279,7 @@ "Help page for the LXD client." msgstr "" -#: lxc/image.go:62 +#: lxc/image.go:72 msgid "" "Usage: lxc image [options]\n" "\n" @@ -1292,11 +1333,38 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" -"lxc image list [:] [filter] [--format table|json]\n" +"lxc image list [:] [filter] [--format csv|json|table|yaml] [-c " +"]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" +" The -c option takes a (optionally comma-separated) list of arguments " +"that\n" +" control which image attributes to output when displaying in table or " +"csv\n" +" format.\n" +"\n" +" Default column layout is: lfpdasu\n" +"\n" +" Column shorthand chars:\n" +"\n" +" l - Shortest image alias (and optionally number of other aliases)\n" +"\n" +" L - Newline-separated list of all image aliases\n" +"\n" +" f - Fingerprint\n" +"\n" +" p - Whether image is public\n" +"\n" +" d - Description\n" +"\n" +" a - Architecture\n" +"\n" +" s - Size\n" +"\n" +" u - Upload date\n" +"\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1316,7 +1384,7 @@ "image alias name." msgstr "" -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "" "Usage: lxc info [:][] [--show-log]\n" "\n" @@ -1329,7 +1397,7 @@ " For LXD server information." msgstr "" -#: lxc/init.go:75 +#: lxc/init.go:76 msgid "" "Usage: lxc init [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1344,7 +1412,7 @@ " lxc init ubuntu:16.04 u1" msgstr "" -#: lxc/launch.go:23 +#: lxc/launch.go:20 msgid "" "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1359,9 +1427,9 @@ " lxc launch ubuntu:16.04 u1" msgstr "" -#: lxc/list.go:49 +#: lxc/list.go:44 msgid "" -"Usage: lxc list [:] [filters] [--format table|json|csv] [-c " +"Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c " "] [--fast]\n" "\n" "List the existing containers.\n" @@ -1473,7 +1541,7 @@ " Only show log message." msgstr "" -#: lxc/move.go:19 +#: lxc/move.go:22 msgid "" "Usage: lxc move [:][/] [:][[/" "]] [--container-only]\n" @@ -1492,7 +1560,7 @@ " Rename a snapshot." msgstr "" -#: lxc/network.go:49 +#: lxc/network.go:50 msgid "" "Usage: lxc network [options]\n" "\n" @@ -1545,7 +1613,7 @@ " Update a network using the content of network.yaml" msgstr "" -#: lxc/profile.go:49 +#: lxc/profile.go:51 msgid "" "Usage: lxc profile [options]\n" "\n" @@ -1627,7 +1695,7 @@ " Remove all profile from \"foo\"" msgstr "" -#: lxc/publish.go:27 +#: lxc/publish.go:28 msgid "" "Usage: lxc publish [:][/] [:] [--" "alias=ALIAS...] [prop-key=prop-value...]\n" @@ -1635,7 +1703,7 @@ "Publish containers as images." msgstr "" -#: lxc/remote.go:38 +#: lxc/remote.go:39 msgid "" "Usage: lxc remote [options]\n" "\n" @@ -1664,7 +1732,7 @@ " Print the default remote." msgstr "" -#: lxc/restore.go:21 +#: lxc/restore.go:22 msgid "" "Usage: lxc restore [:] [--stateful]\n" "\n" @@ -1680,7 +1748,7 @@ " Restore the snapshot." msgstr "" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 msgid "" "Usage: lxc snapshot [:] [--stateful]\n" "\n" @@ -1694,7 +1762,7 @@ " Create a snapshot of \"u1\" called \"snap0\"." msgstr "" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "" "Usage: lxc storage [options]\n" "\n" @@ -1794,157 +1862,128 @@ "Print the version number of this client tool." msgstr "" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "" -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "" "Whether or not to restore the container's running state from snapshot (if " "available)" msgstr "" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "" -#: lxc/exec.go:129 +#: lxc/exec.go:130 msgid "You can't pass -t or -T at the same time as --mode" msgstr "" -#: lxc/main.go:56 -msgid "`lxc config profile` is deprecated, please use `lxc profile`" +#: lxc/copy.go:57 +msgid "You must specify a source container name" msgstr "" -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "" - -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" -msgstr "" - -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" +#: lxc/main.go:58 +msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "" -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 -#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, c-format msgid "error: %v" msgstr "" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, c-format msgid "error: unknown command: %s" msgstr "" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" msgstr "" -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "" - -#: lxc/remote.go:233 +#: lxc/remote.go:229 msgid "ok (y/n)?" msgstr "" -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" msgstr "" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" msgstr "" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" msgstr "" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" msgstr "" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" msgstr "" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" msgstr "" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" msgstr "" -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "" - -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" msgstr "" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" msgstr "" - -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "" diff -Nru lxd-2.14/po/fr.po lxd-2.15/po/fr.po --- lxd-2.14/po/fr.po 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/fr.po 2017-06-28 03:00:23.000000000 +0000 @@ -7,9 +7,9 @@ msgstr "" "Project-Id-Version: LXD\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2017-05-30 14:59-0400\n" -"PO-Revision-Date: 2017-03-30 21:35+0000\n" -"Last-Translator: HazWard \n" +"POT-Creation-Date: 2017-06-27 00:23-0400\n" +"PO-Revision-Date: 2017-06-07 15:24+0000\n" +"Last-Translator: Stéphane Graber \n" "Language-Team: French \n" "Language: fr\n" @@ -17,9 +17,9 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 2.13-dev\n" +"X-Generator: Weblate 2.15-dev\n" -#: lxc/storage.go:30 +#: lxc/storage.go:31 msgid "" "### This is a yaml representation of a storage pool.\n" "### Any line starting with a '# will be ignored.\n" @@ -50,7 +50,7 @@ "### source: /home/chb/mnt/lxd_test/default.img\n" "### zfs.pool_name: default" -#: lxc/storage.go:47 +#: lxc/storage.go:48 #, fuzzy msgid "" "### This is a yaml representation of a storage volume.\n" @@ -71,7 +71,7 @@ "### Un exemple serait :\n" "### description: Mon image personnalisée" -#: lxc/config.go:37 +#: lxc/config.go:39 msgid "" "### This is a yaml representation of the configuration.\n" "### Any line starting with a '# will be ignored.\n" @@ -109,7 +109,7 @@ "###\n" "### Notez que le nom est affiché mais ne peut être modifié" -#: lxc/image.go:52 +#: lxc/image.go:62 msgid "" "### This is a yaml representation of the image properties.\n" "### Any line starting with a '# will be ignored.\n" @@ -125,7 +125,7 @@ "### Un exemple serait :\n" "### description: Mon image personnalisée" -#: lxc/network.go:29 +#: lxc/network.go:30 msgid "" "### This is a yaml representation of the network.\n" "### Any line starting with a '# will be ignored.\n" @@ -162,7 +162,7 @@ "###\n" "### Notez que seule la configuration peut être modifiée." -#: lxc/profile.go:28 +#: lxc/profile.go:30 msgid "" "### This is a yaml representation of the profile.\n" "### Any line starting with a '# will be ignored.\n" @@ -199,103 +199,134 @@ "###\n" "### Notez que le nom est affiché mais ne peut être modifié" -#: lxc/image.go:629 +#: lxc/image.go:182 #, c-format msgid "%s (%d more)" msgstr "%s (%d de plus)" -#: lxc/snapshot.go:58 +#: lxc/file.go:186 +#, c-format +msgid "%s is not a directory" +msgstr "" + +#: lxc/file.go:128 +#, c-format +msgid "'%s' isn't a regular file or directory." +msgstr "" + +#: lxc/snapshot.go:53 msgid "'/' not allowed in snapshot name" msgstr "'/' n'est pas autorisé dans le nom d'un instantané" -#: lxc/profile.go:293 +#: lxc/profile.go:319 msgid "(none)" msgstr "(aucun)" -#: lxc/image.go:650 lxc/image.go:692 +#: lxc/image.go:226 lxc/image.go:1052 msgid "ALIAS" msgstr "ALIAS" -#: lxc/image.go:654 +#: lxc/image.go:227 +#, fuzzy +msgid "ALIASES" +msgstr "ALIAS" + +#: lxc/image.go:231 msgid "ARCH" msgstr "ARCH" -#: lxc/list.go:448 +#: lxc/list.go:461 msgid "ARCHITECTURE" msgstr "ARCHITECTURE" -#: lxc/remote.go:66 +#: lxc/remote.go:67 msgid "Accept certificate" msgstr "Accepter le certificat" -#: lxc/remote.go:282 +#: lxc/remote.go:281 #, c-format msgid "Admin password for %s: " msgstr "Mot de passe administrateur pour %s : " -#: lxc/image.go:373 +#: lxc/image.go:569 msgid "Aliases:" msgstr "Alias :" -#: lxc/image.go:351 lxc/info.go:95 +#: lxc/image.go:547 lxc/info.go:104 #, c-format msgid "Architecture: %s" msgstr "Architecture : %s" -#: lxc/image.go:381 +#: lxc/image.go:577 #, c-format msgid "Auto update: %s" msgstr "Mise à jour auto. : %s" -#: lxc/info.go:188 +#: lxc/image.go:651 +#, c-format +msgid "Bad property: %s" +msgstr "" + +#: lxc/info.go:197 msgid "Bytes received" msgstr "Octets reçus" -#: lxc/info.go:189 +#: lxc/info.go:198 msgid "Bytes sent" msgstr "Octets émis" -#: lxc/config.go:310 +#: lxc/config.go:349 msgid "COMMON NAME" msgstr "COMMON NAME" -#: lxc/info.go:152 +#: lxc/info.go:161 msgid "CPU usage (in seconds)" msgstr "CPU utilisé (en secondes)" -#: lxc/info.go:156 +#: lxc/info.go:165 msgid "CPU usage:" msgstr "CPU utilisé :" -#: lxc/list.go:449 +#: lxc/list.go:462 msgid "CREATED AT" msgstr "CRÉÉ À" -#: lxc/config.go:150 lxc/network.go:496 +#: lxc/file.go:479 +#, fuzzy +msgid "Can't pull a directory without --recursive" +msgstr "impossible de récupérer un répertoire sans --recursive" + +#: lxc/config.go:156 lxc/network.go:542 #, c-format msgid "Can't read from stdin: %s" msgstr "Impossible de lire depuis stdin : %s" -#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218 +#: lxc/config.go:169 +#, fuzzy, c-format +msgid "Can't unset key '%s', it's not currently set" +msgstr "" +"Impossible de désaffecter la clé '%s', elle n'est pas définie actuellement." + +#: lxc/config.go:211 lxc/config.go:237 #, c-format msgid "Can't unset key '%s', it's not currently set." msgstr "" "Impossible de désaffecter la clé '%s', elle n'est pas définie actuellement." -#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579 +#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625 msgid "Cannot provide container name to list" msgstr "Impossible de fournir le nom du conteneur à lister" -#: lxc/remote.go:232 +#: lxc/remote.go:228 #, fuzzy, c-format msgid "Certificate fingerprint: %s" msgstr "Empreinte du certificat : %x" -#: lxc/remote.go:305 +#: lxc/remote.go:316 msgid "Client certificate stored at server: " msgstr "Certificat client enregistré sur le serveur : " -#: lxc/list.go:133 lxc/list.go:134 +#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129 msgid "Columns" msgstr "Colonnes" @@ -303,35 +334,35 @@ msgid "Commands:" msgstr "Commandes:" -#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136 +#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137 msgid "Config key/value to apply to the new container" msgstr "Clé/valeur de configuration à appliquer au nouveau conteneur" -#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:746 lxc/network.go:378 -#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854 +#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418 +#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935 #, c-format msgid "Config parsing error: %s" msgstr "Erreur lors de la lecture de la configuration : %s" -#: lxc/main.go:33 +#: lxc/main.go:35 msgid "Connection refused; is LXD running?" msgstr "Connexion refusée ; LXD est-il actif ?" -#: lxc/publish.go:62 +#: lxc/publish.go:71 msgid "Container name is mandatory" msgstr "Le nom du conteneur est obligatoire" -#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244 +#: lxc/copy.go:210 lxc/init.go:313 #, c-format msgid "Container name is: %s" msgstr "Le nom du conteneur est : %s" -#: lxc/publish.go:160 lxc/publish.go:175 +#: lxc/publish.go:250 #, c-format msgid "Container published with fingerprint: %s" msgstr "Conteneur publié avec l'empreinte : %s" -#: lxc/image.go:137 +#: lxc/image.go:173 msgid "Copy aliases from source" msgstr "Copier les alias depuis la source" @@ -340,86 +371,91 @@ msgid "Copy the container without its snapshots" msgstr "Forcer le conteneur à s'arrêter" -#: lxc/image.go:250 +#: lxc/image.go:422 #, c-format msgid "Copying the image: %s" msgstr "Copie de l'image : %s" -#: lxc/remote.go:247 +#: lxc/remote.go:243 msgid "Could not create server cert dir" msgstr "Impossible de créer le dossier de stockage des certificats serveurs" -#: lxc/file.go:67 lxc/file.go:68 +#: lxc/file.go:69 lxc/file.go:70 msgid "Create any directories necessary" msgstr "Créer tous répertoires nécessaires" -#: lxc/image.go:356 lxc/info.go:97 +#: lxc/image.go:552 lxc/info.go:106 #, c-format msgid "Created: %s" msgstr "Créé : %s" -#: lxc/init.go:182 lxc/launch.go:142 +#: lxc/init.go:194 #, c-format msgid "Creating %s" msgstr "Création de %s" -#: lxc/init.go:180 +#: lxc/init.go:192 msgid "Creating the container" msgstr "Création du conteneur" -#: lxc/image.go:653 lxc/image.go:694 lxc/list.go:450 lxc/network.go:461 -#: lxc/storage.go:608 lxc/storage.go:697 +#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507 +#: lxc/storage.go:654 lxc/storage.go:749 msgid "DESCRIPTION" msgstr "DESCRIPTION" -#: lxc/storage.go:609 +#: lxc/storage.go:655 msgid "DRIVER" msgstr "PILOTE" -#: lxc/publish.go:38 +#: lxc/publish.go:39 msgid "Define a compression algorithm: for image or none" msgstr "Définir un algorithme de compression : pour image ou aucun" -#: lxc/config.go:688 +#: lxc/config.go:803 #, c-format msgid "Device %s added to %s" msgstr "Périphérique %s ajouté à %s" -#: lxc/config.go:875 +#: lxc/config.go:1037 #, c-format msgid "Device %s removed from %s" msgstr "Périphérique %s retiré de %s" -#: lxc/exec.go:64 +#: lxc/utils.go:248 lxc/utils.go:272 +#, fuzzy, c-format +msgid "Device already exists: %s" +msgstr "le serveur distant %s existe déjà" + +#: lxc/exec.go:65 msgid "Disable pseudo-terminal allocation" msgstr "Désactiver l'allocation pseudo-terminal" -#: lxc/exec.go:65 +#: lxc/exec.go:66 msgid "Disable stdin (reads from /dev/null)" msgstr "Désactiver stdin (lecture à partir de /dev/null)" -#: lxc/info.go:145 +#: lxc/info.go:154 #, fuzzy msgid "Disk usage:" msgstr " Disque utilisé :" -#: lxc/list.go:601 +#: lxc/list.go:614 msgid "EPHEMERAL" msgstr "ÉPHÉMÈRE" -#: lxc/config.go:312 +#: lxc/config.go:351 msgid "EXPIRY DATE" msgstr "DATE D'EXPIRATION" -#: lxc/main.go:45 +#: lxc/main.go:47 msgid "Enable debug mode" msgstr "Activer le mode de débogage" -#: lxc/main.go:44 +#: lxc/main.go:46 msgid "Enable verbose mode" msgstr "Activer le mode verbeux" -#: lxc/exec.go:61 +#: lxc/exec.go:62 msgid "Environment variable to set (e.g. HOME=/home/foo)" msgstr "Variable d'environnement (de la forme HOME=/home/foo) à positionner" @@ -427,7 +463,7 @@ msgid "Environment:" msgstr "Environnement :" -#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140 +#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141 msgid "Ephemeral container" msgstr "Conteneur éphémère" @@ -435,16 +471,21 @@ msgid "Event type to listen for" msgstr "Type d'évènements à surveiller" -#: lxc/image.go:360 +#: lxc/image.go:556 #, c-format msgid "Expires: %s" msgstr "Expire : %s" -#: lxc/image.go:362 +#: lxc/image.go:558 msgid "Expires: never" msgstr "N'expire jamais" -#: lxc/config.go:309 lxc/image.go:651 lxc/image.go:693 +#: lxc/image.go:848 +#, fuzzy, c-format +msgid "Exporting the image: %s" +msgstr "Import de l'image : %s" + +#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053 msgid "FINGERPRINT" msgstr "EMPREINTE" @@ -458,17 +499,27 @@ msgid "Failed to generate 'lxc.1': %v" msgstr "Échec lors de la génération de 'lxc.1': %v" -#: lxc/list.go:136 +#: lxc/copy.go:205 +#, fuzzy +msgid "Failed to get the new container name" +msgstr "Profil à appliquer au nouveau conteneur" + +#: lxc/file.go:123 +#, c-format +msgid "Failed to walk path for %s: %s" +msgstr "" + +#: lxc/list.go:131 #, fuzzy msgid "Fast mode (same as --columns=nsacPt)" msgstr "Mode rapide (identique à --columns=nsacPt" -#: lxc/image.go:349 +#: lxc/image.go:545 #, c-format msgid "Fingerprint: %s" msgstr "Empreinte : %s" -#: lxc/exec.go:63 +#: lxc/exec.go:64 msgid "Force pseudo-terminal allocation" msgstr "Forcer l'allocation de pseudo-terminal " @@ -476,46 +527,42 @@ msgid "Force the container to shutdown" msgstr "Forcer le conteneur à s'arrêter" -#: lxc/delete.go:33 lxc/delete.go:34 +#: lxc/delete.go:34 lxc/delete.go:35 msgid "Force the removal of stopped containers" msgstr "Forcer la suppression des conteneurs arrêtés" -#: lxc/main.go:46 +#: lxc/main.go:48 msgid "Force using the local unix socket" msgstr "Forcer l'utilisation de la socket unix locale" -#: lxc/image.go:140 -msgid "Format" -msgstr "Format" - -#: lxc/list.go:135 -msgid "Format (table|json|csv)" +#: lxc/image.go:176 lxc/list.go:130 +msgid "Format (csv|json|table|yaml)" msgstr "" -#: lxc/remote.go:80 +#: lxc/remote.go:81 msgid "Generating a client certificate. This may take a minute..." msgstr "Génération d'un certificat client. Ceci peut prendre une minute…" -#: lxc/list.go:446 +#: lxc/list.go:459 msgid "IPV4" msgstr "IPv4" -#: lxc/list.go:447 +#: lxc/list.go:460 msgid "IPV6" msgstr "IPv6" -#: lxc/config.go:311 +#: lxc/config.go:350 msgid "ISSUE DATE" msgstr "DATE D'ÉMISSION" -#: lxc/main.go:139 +#: lxc/main.go:153 #, fuzzy msgid "If this is your first time using LXD, you should also run: lxd init" msgstr "" "Si c'est la première fois que vous lancez LXD, vous devriez aussi lancer : " "sudo lxd init" -#: lxc/main.go:47 +#: lxc/main.go:49 msgid "Ignore aliases when determining what command to run" msgstr "Ignorer les alias pour déterminer la commande à exécuter" @@ -523,251 +570,236 @@ msgid "Ignore the container state (only for start)" msgstr "Ignorer l'état du conteneur (seulement pour start)" -#: lxc/image.go:312 +#: lxc/image.go:508 msgid "Image already up to date." msgstr "" -#: lxc/image.go:253 +#: lxc/image.go:436 msgid "Image copied successfully!" msgstr "Image copiée avec succès !" -#: lxc/image.go:436 lxc/image.go:448 +#: lxc/image.go:898 +#, fuzzy +msgid "Image exported successfully!" +msgstr "Image copiée avec succès !" + +#: lxc/image.go:709 #, c-format msgid "Image imported with fingerprint: %s" msgstr "Image importée avec l'empreinte : %s" -#: lxc/image.go:310 +#: lxc/image.go:506 #, fuzzy msgid "Image refreshed successfully!" msgstr "Image copiée avec succès !" -#: lxc/image.go:433 -#, c-format -msgid "Importing the image: %s" -msgstr "Import de l'image : %s" - -#: lxc/remote.go:150 +#: lxc/remote.go:151 #, c-format msgid "Invalid URL scheme \"%s\" in \"%s\"" msgstr "Schème d'URL invalide \"%s\" in \"%s\"" -#: lxc/config.go:290 +#: lxc/config.go:329 msgid "Invalid certificate" msgstr "Certificat invalide" -#: lxc/init.go:30 lxc/init.go:35 +#: lxc/init.go:31 lxc/init.go:36 msgid "Invalid configuration key" msgstr "Clé de configuration invalide" -#: lxc/file.go:357 +#: lxc/file.go:522 #, fuzzy, c-format msgid "Invalid path %s" msgstr "Cible invalide %s" -#: lxc/file.go:291 +#: lxc/file.go:451 #, c-format msgid "Invalid source %s" msgstr "Source invalide %s" -#: lxc/file.go:80 +#: lxc/file.go:224 #, c-format msgid "Invalid target %s" msgstr "Cible invalide %s" -#: lxc/info.go:126 +#: lxc/info.go:135 msgid "Ips:" msgstr "IPs :" -#: lxc/image.go:138 +#: lxc/image.go:174 msgid "Keep the image up to date after initial copy" msgstr "Garder l'image à jour après la copie initiale" -#: lxc/list.go:451 +#: lxc/list.go:464 msgid "LAST USED AT" msgstr "DERNIÈRE UTILISATION À" -#: lxc/main.go:31 +#: lxc/main.go:33 msgid "LXD socket not found; is LXD installed and running?" msgstr "Socket LXD introuvable ; LXD est-il installé et actif ?" -#: lxc/image.go:365 +#: lxc/image.go:561 #, c-format msgid "Last used: %s" msgstr "Dernière utilisation : %s" -#: lxc/image.go:367 +#: lxc/image.go:563 msgid "Last used: never" msgstr "Dernière utilisation : jamais" -#: lxc/info.go:241 +#: lxc/info.go:250 msgid "Log:" msgstr "Journal : " -#: lxc/network.go:460 +#: lxc/network.go:506 msgid "MANAGED" msgstr "GÉRÉ" -#: lxc/image.go:136 +#: lxc/image.go:172 msgid "Make image public" msgstr "Rendre l'image publique" -#: lxc/publish.go:34 +#: lxc/publish.go:35 msgid "Make the image public" msgstr "Rendre l'image publique" -#: lxc/info.go:163 +#: lxc/info.go:172 msgid "Memory (current)" msgstr "Mémoire (courante)" -#: lxc/info.go:167 +#: lxc/info.go:176 msgid "Memory (peak)" msgstr "Mémoire (pointe)" -#: lxc/info.go:179 +#: lxc/info.go:188 #, fuzzy msgid "Memory usage:" msgstr " Mémoire utilisée :" -#: lxc/copy.go:276 -#, c-format -msgid "Migration failed on source host: %s" -msgstr "Échec lors de la migration vers l'hôte source: %s" - -#: lxc/copy.go:280 -#, c-format -msgid "Migration failed on target host: %s" -msgstr "" - -#: lxc/utils.go:193 +#: lxc/utils.go:199 msgid "Missing summary." msgstr "Résumé manquant." -#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462 +#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494 msgid "More than one device matches, specify the device name." msgstr "Plus d'un périphérique correspond, spécifier le nom du périphérique." -#: lxc/file.go:279 +#: lxc/file.go:438 msgid "More than one file to download, but target is not a directory" msgstr "" "Plusieurs fichiers à télécharger, mais la destination n'est pas un dossier" -#: lxc/move.go:35 +#: lxc/move.go:38 #, fuzzy msgid "Move the container without its snapshots" msgstr "Forcer le conteneur à s'arrêter" -#: lxc/action.go:68 +#: lxc/action.go:72 msgid "Must supply container name for: " msgstr "Vous devez fournir le nom d'un conteneur pour : " -#: lxc/list.go:452 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395 -#: lxc/storage.go:607 lxc/storage.go:696 +#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406 +#: lxc/storage.go:653 lxc/storage.go:748 msgid "NAME" msgstr "NOM" -#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374 +#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385 msgid "NO" msgstr "NON" -#: lxc/info.go:91 +#: lxc/info.go:99 #, c-format msgid "Name: %s" msgstr "Nom : %s" -#: lxc/network.go:222 +#: lxc/network.go:250 #, c-format msgid "Network %s created" msgstr "Le réseau %s a été créé" -#: lxc/network.go:325 +#: lxc/network.go:366 #, c-format msgid "Network %s deleted" msgstr "Le réseau %s a été supprimé" -#: lxc/init.go:141 lxc/init.go:142 +#: lxc/init.go:142 lxc/init.go:143 msgid "Network name" msgstr "Nom du réseau" -#: lxc/info.go:196 +#: lxc/info.go:205 #, fuzzy msgid "Network usage:" msgstr " Réseau utilisé :" -#: lxc/image.go:139 lxc/publish.go:35 +#: lxc/image.go:175 lxc/publish.go:36 msgid "New alias to define at target" msgstr "Nouvel alias à définir sur la cible" -#: lxc/config.go:321 +#: lxc/config.go:360 msgid "No certificate provided to add" msgstr "Un certificat à ajouter n'a pas été fourni" -#: lxc/network.go:257 lxc/network.go:306 +#: lxc/network.go:285 lxc/network.go:338 msgid "No device found for this network" msgstr "Aucun périphérique existant pour ce réseau" -#: lxc/storage.go:371 lxc/storage.go:471 +#: lxc/storage.go:383 lxc/storage.go:503 #, fuzzy msgid "No device found for this storage volume." msgstr "Aucun périphérique existant pour ce réseau" -#: lxc/config.go:344 +#: lxc/config.go:392 msgid "No fingerprint specified." msgstr "Aucune empreinte n'a été indiquée." -#: lxc/storage.go:323 lxc/storage.go:407 +#: lxc/storage.go:327 lxc/storage.go:420 msgid "Only \"custom\" volumes can be attached to containers." msgstr "Seul les volumes \"personnalisés\" peuvent être attaché aux conteneurs" -#: lxc/remote.go:135 +#: lxc/remote.go:136 msgid "Only https URLs are supported for simplestreams" msgstr "Seules les URLs https sont supportées par simplestreams" -#: lxc/image.go:439 +#: lxc/image.go:632 msgid "Only https:// is supported for remote image import." msgstr "Seul https:// est supporté par l'import d'images distantes." -#: lxc/network.go:354 lxc/network.go:482 +#: lxc/network.go:394 lxc/network.go:528 msgid "Only managed networks can be modified." msgstr "Seuls les réseaux gérés par LXD peuvent être modifiés." -#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163 +#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177 msgid "Options:" msgstr "Options :" -#: lxc/image.go:550 -#, c-format -msgid "Output is in %s" -msgstr "Le résultat est dans %s" - -#: lxc/exec.go:62 +#: lxc/exec.go:63 msgid "Override the terminal mode (auto, interactive or non-interactive)" msgstr "Surcharger le mode terminal (auto, interactif ou non-interactif)" -#: lxc/list.go:603 +#: lxc/list.go:616 msgid "PERSISTENT" msgstr "PERSISTANT" -#: lxc/list.go:453 +#: lxc/list.go:466 msgid "PID" msgstr "PID" -#: lxc/list.go:454 +#: lxc/list.go:467 msgid "PROFILES" msgstr "PROFILS" -#: lxc/remote.go:397 +#: lxc/remote.go:408 msgid "PROTOCOL" msgstr "PROTOCOLE" -#: lxc/image.go:652 lxc/remote.go:398 +#: lxc/image.go:229 lxc/remote.go:409 msgid "PUBLIC" msgstr "PUBLIC" -#: lxc/info.go:190 +#: lxc/info.go:199 msgid "Packets received" msgstr "Paquets reçus" -#: lxc/info.go:191 +#: lxc/info.go:200 msgid "Packets sent" msgstr "Paquets émis" @@ -779,25 +811,25 @@ msgid "Path to an alternate server directory" msgstr "Chemin vers un dossier de configuration serveur alternatif" -#: lxc/main.go:202 +#: lxc/main.go:216 #, fuzzy msgid "Pause containers." msgstr "Création du conteneur" -#: lxc/main.go:35 +#: lxc/main.go:37 msgid "Permission denied, are you in the lxd group?" msgstr "Permission refusée, êtes-vous dans le groupe lxd ?" -#: lxc/info.go:108 +#: lxc/info.go:117 #, c-format msgid "Pid: %d" msgstr "Pid : %d" -#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855 +#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936 msgid "Press enter to open the editor again" msgstr "Appuyer sur Entrée pour ouvrir à nouveau l'éditeur" -#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:747 +#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108 msgid "Press enter to start the editor again" msgstr "Appuyer sur Entrée pour lancer à nouveau l'éditeur" @@ -813,145 +845,145 @@ msgid "Print verbose information" msgstr "Afficher des informations supplémentaires" -#: lxc/info.go:132 +#: lxc/info.go:141 #, c-format msgid "Processes: %d" msgstr "Processus : %d" -#: lxc/profile.go:314 +#: lxc/profile.go:344 #, c-format msgid "Profile %s added to %s" msgstr "Profil %s ajouté à %s" -#: lxc/profile.go:209 +#: lxc/profile.go:218 #, c-format msgid "Profile %s created" msgstr "Profil %s créé" -#: lxc/profile.go:279 +#: lxc/profile.go:292 #, c-format msgid "Profile %s deleted" msgstr "Profil %s supprimé" -#: lxc/profile.go:345 +#: lxc/profile.go:379 #, c-format msgid "Profile %s removed from %s" msgstr "Profil %s supprimé de %s" -#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138 +#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139 msgid "Profile to apply to the new container" msgstr "Profil à appliquer au nouveau conteneur" -#: lxc/profile.go:295 +#: lxc/profile.go:321 #, c-format msgid "Profiles %s applied to %s" msgstr "Profils %s appliqués à %s" -#: lxc/info.go:106 +#: lxc/info.go:115 #, c-format msgid "Profiles: %s" msgstr "Profils : %s" -#: lxc/image.go:369 +#: lxc/image.go:565 msgid "Properties:" msgstr "Propriétés :" -#: lxc/remote.go:69 +#: lxc/remote.go:70 msgid "Public image server" msgstr "Serveur d'images public" -#: lxc/image.go:352 +#: lxc/image.go:548 #, c-format msgid "Public: %s" msgstr "Public : %s" -#: lxc/file.go:65 lxc/file.go:66 +#: lxc/file.go:67 lxc/file.go:68 msgid "Recursively push or pull files" msgstr "Pousser ou récupérer des fichiers récursivement" -#: lxc/image.go:303 +#: lxc/image.go:489 #, fuzzy, c-format msgid "Refreshing the image: %s" msgstr "Récupération de l'image : %s" -#: lxc/remote.go:67 +#: lxc/remote.go:68 msgid "Remote admin password" msgstr "Mot de passe de l'administrateur distant" -#: lxc/info.go:93 +#: lxc/info.go:101 #, c-format msgid "Remote: %s" msgstr "Serveur distant : %s" -#: lxc/delete.go:41 +#: lxc/delete.go:42 #, c-format msgid "Remove %s (yes/no): " msgstr "Supprimer %s (oui/non) : " -#: lxc/delete.go:35 lxc/delete.go:36 +#: lxc/delete.go:36 lxc/delete.go:37 msgid "Require user confirmation" msgstr "Requérir une confirmation de l'utilisateur" -#: lxc/info.go:129 +#: lxc/info.go:138 msgid "Resources:" msgstr "Ressources :" -#: lxc/main.go:210 +#: lxc/main.go:224 #, fuzzy msgid "Restart containers." msgstr "Création du conteneur" -#: lxc/init.go:253 +#: lxc/init.go:286 #, c-format msgid "Retrieving image: %s" msgstr "Récupération de l'image : %s" -#: lxc/image.go:655 +#: lxc/image.go:232 msgid "SIZE" msgstr "TAILLE" -#: lxc/list.go:455 +#: lxc/list.go:468 msgid "SNAPSHOTS" msgstr "INSTANTANÉS" -#: lxc/storage.go:610 +#: lxc/storage.go:656 msgid "SOURCE" msgstr "SOURCE" -#: lxc/list.go:456 +#: lxc/list.go:469 msgid "STATE" msgstr "ÉTAT" -#: lxc/remote.go:399 +#: lxc/remote.go:410 msgid "STATIC" msgstr "STATIQUE" -#: lxc/list.go:458 +#: lxc/list.go:471 msgid "STORAGE POOL" msgstr "ENSEMBLE DE STOCKAGE" -#: lxc/remote.go:240 +#: lxc/remote.go:236 msgid "Server certificate NACKed by user" msgstr "Certificat serveur rejeté par l'utilisateur" -#: lxc/remote.go:302 +#: lxc/remote.go:313 msgid "Server doesn't trust us after adding our cert" msgstr "" "Le serveur ne nous fait pas confiance après l'ajout de notre certificat" -#: lxc/remote.go:68 +#: lxc/remote.go:69 msgid "Server protocol (lxd or simplestreams)" msgstr "Protocole du serveur (lxd ou simplestreams)" -#: lxc/file.go:63 +#: lxc/file.go:65 msgid "Set the file's gid on push" msgstr "Définir le gid du fichier lors de l'envoi" -#: lxc/file.go:64 +#: lxc/file.go:66 msgid "Set the file's perms on push" msgstr "Définir les permissions du fichier lors de l'envoi" -#: lxc/file.go:62 +#: lxc/file.go:64 msgid "Set the file's uid on push" msgstr "Définir l'uid du fichier lors de l'envoi" @@ -963,80 +995,85 @@ msgid "Show client version" msgstr "Afficher la version du client" -#: lxc/info.go:38 +#: lxc/info.go:39 msgid "Show the container's last 100 log lines?" msgstr "Afficher les 100 dernières lignes du journal du conteneur ?" -#: lxc/config.go:33 +#: lxc/config.go:35 msgid "Show the expanded configuration" msgstr "Afficher la configuration étendue" -#: lxc/image.go:350 +#: lxc/image.go:546 #, c-format msgid "Size: %.2fMB" msgstr "Taille : %.2f Mo" -#: lxc/info.go:210 +#: lxc/info.go:219 msgid "Snapshots:" msgstr "Instantanés :" -#: lxc/action.go:134 +#: lxc/action.go:142 #, fuzzy, c-format msgid "Some containers failed to %s" msgstr "L'arrêt du conteneur a échoué !" -#: lxc/image.go:383 +#: lxc/image.go:579 msgid "Source:" msgstr "Source :" -#: lxc/main.go:220 +#: lxc/main.go:234 #, fuzzy msgid "Start containers." msgstr "Création du conteneur" -#: lxc/launch.go:152 +#: lxc/launch.go:59 #, c-format msgid "Starting %s" msgstr "Démarrage de %s" -#: lxc/info.go:100 +#: lxc/info.go:109 #, c-format msgid "Status: %s" msgstr "État : %s" -#: lxc/main.go:226 +#: lxc/main.go:240 #, fuzzy msgid "Stop containers." msgstr "L'arrêt du conteneur a échoué !" -#: lxc/publish.go:36 lxc/publish.go:37 +#: lxc/publish.go:37 lxc/publish.go:38 msgid "Stop the container if currently running" msgstr "Arrêter le conteneur s'il est en cours d'exécution" -#: lxc/delete.go:105 lxc/publish.go:114 +#: lxc/publish.go:136 msgid "Stopping container failed!" msgstr "L'arrêt du conteneur a échoué !" -#: lxc/storage.go:436 +#: lxc/delete.go:121 +#, fuzzy, c-format +msgid "Stopping the container failed: %s" +msgstr "L'arrêt du conteneur a échoué !" + +#: lxc/storage.go:468 #, fuzzy, c-format msgid "Storage pool %s created" msgstr "Le réseau %s a été créé" -#: lxc/storage.go:486 +#: lxc/storage.go:527 #, fuzzy, c-format msgid "Storage pool %s deleted" msgstr "Le réseau %s a été supprimé" -#: lxc/init.go:143 lxc/init.go:144 +#: lxc/init.go:144 lxc/init.go:145 msgid "Storage pool name" msgstr "Nom de l'ensemble de stockage" -#: lxc/storage.go:720 +#: lxc/storage.go:782 #, fuzzy, c-format msgid "Storage volume %s created" msgstr "Profil %s créé" -#: lxc/storage.go:730 +#: lxc/storage.go:797 #, fuzzy, c-format msgid "Storage volume %s deleted" msgstr "Profil %s supprimé" @@ -1045,24 +1082,24 @@ msgid "Store the container state (only for stop)" msgstr "Forcer l'arrêt du conteneur (seulement pour stop)" -#: lxc/info.go:171 +#: lxc/info.go:180 msgid "Swap (current)" msgstr "Swap (courant)" -#: lxc/info.go:175 +#: lxc/info.go:184 msgid "Swap (peak)" msgstr "Swap (pointe)" -#: lxc/list.go:457 lxc/network.go:459 lxc/storage.go:695 +#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747 msgid "TYPE" msgstr "TYPE" -#: lxc/delete.go:91 +#: lxc/delete.go:105 msgid "The container is currently running, stop it first or pass --force." msgstr "" "Le conteneur est en cours d'exécution, l'arrêter d'abord ou ajouter --force." -#: lxc/publish.go:92 +#: lxc/publish.go:101 msgid "" "The container is currently running. Use --force to have it stopped and " "restarted." @@ -1070,17 +1107,22 @@ "Le conteneur est en cours d'exécution. Utiliser --force pour qu'il soit " "arrêté et redémarré." -#: lxc/init.go:326 +#: lxc/init.go:358 msgid "The container you are starting doesn't have any network attached to it." msgstr "" "Le conteneur que vous démarrez n'est attaché à aucune interface réseau." -#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779 -#: lxc/config.go:817 lxc/config.go:835 +#: lxc/config.go:770 lxc/config.go:787 +#, fuzzy +msgid "The device already exists" +msgstr "Le périphérique n'existe pas" + +#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899 +#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022 msgid "The device doesn't exist" msgstr "Le périphérique n'existe pas" -#: lxc/init.go:310 +#: lxc/init.go:342 #, c-format msgid "The local image '%s' couldn't be found, trying '%s:' instead." msgstr "L'image locale '%s' n'a pas été trouvée, essayer '%s:' à la place." @@ -1090,15 +1132,15 @@ msgid "The opposite of \"lxc pause\" is \"lxc start\"." msgstr "Le pendant de `lxc pause` est `lxc start`." -#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476 +#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508 msgid "The specified device doesn't exist" msgstr "Le périphérique indiqué n'existe pas" -#: lxc/network.go:266 lxc/network.go:315 +#: lxc/network.go:294 lxc/network.go:347 msgid "The specified device doesn't match the network" msgstr "le périphérique indiqué ne correspond pas au réseau" -#: lxc/publish.go:65 +#: lxc/publish.go:74 msgid "There is no \"image name\". Did you want an alias?" msgstr "Il n'existe pas d'\"image\". Vouliez-vous un alias ?" @@ -1113,57 +1155,56 @@ "\n" "Toutes les fonctionnalités de LXD peuvent être utilisées à l'aide des " "commandes ci-dessous.\n" -"Pour de l'aide avec l'une des commandes, simplement les utiliser avec --" -"help.\n" +"Pour de l'aide avec l'une des commandes, simplement les utiliser avec --help." #: lxc/action.go:45 msgid "Time to wait for the container before killing it" msgstr "Temps d'attente du conteneur avant de le tuer" -#: lxc/image.go:353 +#: lxc/image.go:549 msgid "Timestamps:" msgstr "Horodatage :" -#: lxc/init.go:328 +#: lxc/init.go:360 msgid "To attach a network to a container, use: lxc network attach" msgstr "Pour attacher un réseau à un conteneur, utiliser : lxc network attach" -#: lxc/init.go:327 +#: lxc/init.go:359 msgid "To create a new network, use: lxc network create" msgstr "Pour créer un réseau, utiliser : lxc network create" -#: lxc/main.go:140 +#: lxc/main.go:154 msgid "To start your first container, try: lxc launch ubuntu:16.04" msgstr "" "Pour démarrer votre premier conteneur, essayer : lxc launch ubuntu:16.04" -#: lxc/image.go:441 +#: lxc/image.go:657 #, c-format msgid "Transferring image: %s" msgstr "Transfert de l'image : %s" -#: lxc/action.go:98 lxc/launch.go:165 +#: lxc/action.go:106 lxc/launch.go:77 #, c-format msgid "Try `lxc info --show-log %s` for more info" msgstr "Essayer `lxc info --show-log %s` pour plus d'informations" -#: lxc/info.go:102 +#: lxc/info.go:111 msgid "Type: ephemeral" msgstr "Type : éphémère" -#: lxc/info.go:104 +#: lxc/info.go:113 msgid "Type: persistent" msgstr "Type : persistant" -#: lxc/image.go:656 +#: lxc/image.go:233 msgid "UPLOAD DATE" msgstr "DATE DE PUBLICATION" -#: lxc/remote.go:396 +#: lxc/remote.go:407 msgid "URL" msgstr "URL" -#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698 +#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750 msgid "USED BY" msgstr "UTILISÉ PAR" @@ -1171,11 +1212,16 @@ msgid "Unable to find help2man." msgstr "Impossible de trouver help2man" -#: lxc/remote.go:110 +#: lxc/remote.go:111 msgid "Unable to read remote TLS certificate" msgstr "Impossible de lire le certificat TLS distant" -#: lxc/image.go:358 +#: lxc/file.go:111 +#, c-format +msgid "Unknown file type '%s'" +msgstr "" + +#: lxc/image.go:554 #, c-format msgid "Uploaded: %s" msgstr "Publié : %s" @@ -1195,7 +1241,7 @@ msgid "Usage: lxc [options]" msgstr "Utilisation : lxc [options]" -#: lxc/config.go:58 +#: lxc/config.go:60 #, fuzzy msgid "" "Usage: lxc config [options]\n" @@ -1343,7 +1389,7 @@ "lxc copy [:][/] [[:]] [--" "ephemeral|e] [--profile|-p ...] [--config|-c ...]" -#: lxc/delete.go:26 +#: lxc/delete.go:27 #, fuzzy msgid "" "Usage: lxc delete [:][/] " @@ -1359,7 +1405,7 @@ "Détruit les conteneurs ou les instantanés ainsi que toute donnée associée " "(configuration, instantanés, …)." -#: lxc/exec.go:52 +#: lxc/exec.go:53 #, fuzzy msgid "" "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|" @@ -1379,7 +1425,7 @@ "sélectionné si à la fois stdin et stdout sont des terminaux (stderr\n" "est ignoré)." -#: lxc/file.go:36 +#: lxc/file.go:38 #, fuzzy msgid "" "Usage: lxc file [options]\n" @@ -1448,7 +1494,7 @@ "\n" "Page d'aide pour le client LXD." -#: lxc/image.go:62 +#: lxc/image.go:72 #, fuzzy msgid "" "Usage: lxc image [options]\n" @@ -1503,11 +1549,38 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" -"lxc image list [:] [filter] [--format table|json]\n" +"lxc image list [:] [filter] [--format csv|json|table|yaml] [-c " +"]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" +" The -c option takes a (optionally comma-separated) list of arguments " +"that\n" +" control which image attributes to output when displaying in table or " +"csv\n" +" format.\n" +"\n" +" Default column layout is: lfpdasu\n" +"\n" +" Column shorthand chars:\n" +"\n" +" l - Shortest image alias (and optionally number of other aliases)\n" +"\n" +" L - Newline-separated list of all image aliases\n" +"\n" +" f - Fingerprint\n" +"\n" +" p - Whether image is public\n" +"\n" +" d - Description\n" +"\n" +" a - Architecture\n" +"\n" +" s - Size\n" +"\n" +" u - Upload date\n" +"\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1603,7 +1676,7 @@ " Lister les alias. Les filtres peuvent être une partie de l'empreinte\n" " de l'image ou une partie de l'alias de l'image." -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "" "Usage: lxc info [:][] [--show-log]\n" "\n" @@ -1625,7 +1698,7 @@ "lxc info [:]\n" " Pour l'information du serveur LXD." -#: lxc/init.go:75 +#: lxc/init.go:76 #, fuzzy msgid "" "Usage: lxc init [:] [:][] [--ephemeral|-e] [--" @@ -1653,7 +1726,7 @@ "Exemple :\n" " lxc init ubuntu:16.04 u1" -#: lxc/launch.go:23 +#: lxc/launch.go:20 #, fuzzy msgid "" "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--" @@ -1682,10 +1755,10 @@ "Exemple :\n" " lxc launch ubuntu:16.04 u1" -#: lxc/list.go:49 +#: lxc/list.go:44 #, fuzzy msgid "" -"Usage: lxc list [:] [filters] [--format table|json|csv] [-c " +"Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c " "] [--fast]\n" "\n" "List the existing containers.\n" @@ -1871,7 +1944,7 @@ "Exemple :\n" "lxc monitor --type=logging" -#: lxc/move.go:19 +#: lxc/move.go:22 #, fuzzy msgid "" "Usage: lxc move [:][/] [:][[/" @@ -1902,7 +1975,7 @@ "lxc move / /\n" " Renomme un instantané." -#: lxc/network.go:49 +#: lxc/network.go:50 #, fuzzy msgid "" "Usage: lxc network [options]\n" @@ -1983,7 +2056,7 @@ "lxc network detach [:] [device name]\n" "lxc network detach-profile [:] [device name]" -#: lxc/profile.go:49 +#: lxc/profile.go:51 #, fuzzy msgid "" "Usage: lxc profile [options]\n" @@ -2124,7 +2197,7 @@ " Ajouter un périphérique de profil, comme un disque ou une\n" " interface réseau, aux conteneurs utilisant le profil indiqué." -#: lxc/publish.go:27 +#: lxc/publish.go:28 #, fuzzy msgid "" "Usage: lxc publish [:][/] [:] [--" @@ -2137,7 +2210,7 @@ "lxc publish [:][/] [:] [--" "alias=ALIAS...] [prop-key=prop-value...]" -#: lxc/remote.go:38 +#: lxc/remote.go:39 #, fuzzy msgid "" "Usage: lxc remote [options]\n" @@ -2185,7 +2258,7 @@ "lxc remote get-default " "Afficher le serveur distant par défaut." -#: lxc/restore.go:21 +#: lxc/restore.go:22 #, fuzzy msgid "" "Usage: lxc restore [:] [--stateful]\n" @@ -2215,7 +2288,7 @@ "Restaurer un instantané :\n" " lxc restore u1 snap0" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 #, fuzzy msgid "" "Usage: lxc snapshot [:] [--stateful]\n" @@ -2245,7 +2318,7 @@ "Exemple :\n" " lxc snapshot u1 snap0" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "" "Usage: lxc storage [options]\n" "\n" @@ -2349,11 +2422,11 @@ "\n" "lxc version" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "L'utilisateur a annulé l'opération de suppression." -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "" "Whether or not to restore the container's running state from snapshot (if " "available)" @@ -2361,153 +2434,152 @@ "Restaurer ou pas l'état de fonctionnement du conteneur depuis l'instantané " "(s'il est disponible)" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "Réaliser ou pas l'instantané de l'état de fonctionnement du conteneur" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "OUI" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "Il est impossible de passer -t et -T simultanément" -#: lxc/exec.go:129 +#: lxc/exec.go:130 #, fuzzy msgid "You can't pass -t or -T at the same time as --mode" msgstr "impossible de copier vers le même nom de conteneur" -#: lxc/main.go:56 +#: lxc/copy.go:57 +#, fuzzy +msgid "You must specify a source container name" +msgstr "vous devez spécifier un nom de conteneur source" + +#: lxc/main.go:58 msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "" "La commande `lxc config profile` est dépréciée, merci d'utiliser `lxc " "profile`" -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "mauvais nombre d'éléments dans l'image, conteneur ou instantané" - -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "mauvais type de réponse renvoyé par l'action !" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" -msgstr "impossible de copier vers le même nom de conteneur" - -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" -msgstr "impossible de récupérer un répertoire sans --recursive" - -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "impossible de supprimer le serveur distant par défaut" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "impossible de spécifier uid/gid/mode en mode récursif" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "par défaut" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 -#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "pas d'image, conteneur ou instantané affecté sur ce serveur" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "désactivé" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "activé" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, c-format msgid "error: %v" msgstr "erreur : %v" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, c-format msgid "error: unknown command: %s" msgstr "erreur : commande inconnue: %s" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "reçu une mauvaise version" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" msgstr "non" -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "tous les profils de la source n'existent pas sur la cible" - -#: lxc/remote.go:233 +#: lxc/remote.go:229 msgid "ok (y/n)?" msgstr "ok (y/n) ?" -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" msgstr "l'analyse des alias a échoué %s\n" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "l'édition récursive ne fait aucun sens :(" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" msgstr "le serveur distant %s existe déjà" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" msgstr "le serveur distant %s n'existe pas" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" msgstr "le serveur distant %s existe en tant que <%s>" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" msgstr "le serveur distant %s est statique et ne peut être modifié" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "à suivi d'état" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" msgstr "sans suivi d'état" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" msgstr "pris à %s" -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "Un retour impossible à été renvoyé" - -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" msgstr "nombre d'arguments incorrect pour la sous-comande" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" msgstr "oui" -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "vous devez spécifier un nom de conteneur source" +#~ msgid "Migration failed on source host: %s" +#~ msgstr "Échec lors de la migration vers l'hôte source: %s" + +#~ msgid "Output is in %s" +#~ msgstr "Le résultat est dans %s" + +#~ msgid "bad number of things scanned from image, container or snapshot" +#~ msgstr "mauvais nombre d'éléments dans l'image, conteneur ou instantané" + +#~ msgid "bad result type from action" +#~ msgstr "mauvais type de réponse renvoyé par l'action !" + +#~ msgid "can't copy to the same container name" +#~ msgstr "impossible de copier vers le même nom de conteneur" + +#~ msgid "got bad version" +#~ msgstr "reçu une mauvaise version" + +#~ msgid "not all the profiles from the source exist on the target" +#~ msgstr "tous les profils de la source n'existent pas sur la cible" + +#~ msgid "unreachable return reached" +#~ msgstr "Un retour impossible à été renvoyé" + +#~ msgid "Format" +#~ msgstr "Format" #~ msgid "Could not sanitize path %s" #~ msgstr "Impossible d'assainir le chemin %s" diff -Nru lxd-2.14/po/it.po lxd-2.15/po/it.po --- lxd-2.14/po/it.po 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/it.po 2017-06-28 03:00:23.000000000 +0000 @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2017-05-30 14:59-0400\n" -"PO-Revision-Date: 2017-05-09 20:42+0000\n" +"POT-Creation-Date: 2017-06-27 00:23-0400\n" +"PO-Revision-Date: 2017-06-15 22:46+0000\n" "Last-Translator: Alberto Donato \n" "Language-Team: Italian \n" @@ -17,9 +17,9 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.14-dev\n" +"X-Generator: Weblate 2.15-dev\n" -#: lxc/storage.go:30 +#: lxc/storage.go:31 msgid "" "### This is a yaml representation of a storage pool.\n" "### Any line starting with a '# will be ignored.\n" @@ -35,8 +35,22 @@ "### source: /home/chb/mnt/lxd_test/default.img\n" "### zfs.pool_name: default" msgstr "" +"### Questa è una rappresentazione yaml di un pool di storage.\n" +"### Le linee che iniziano con '# saranno ignorate.\n" +"###\n" +"### Un pool di storage consiste di un insieme di elementi di\n" +"### configurazione.\n" +"###\n" +"### Un esempio è il seguente:\n" +"### name: default\n" +"### driver: zfs\n" +"### used_by: []\n" +"### config:\n" +"### size: \"61203283968\"\n" +"### source: /home/chb/mnt/lxd_test/default.img\n" +"### zfs.pool_name: default" -#: lxc/storage.go:47 +#: lxc/storage.go:48 msgid "" "### This is a yaml representation of a storage volume.\n" "### Any line starting with a '# will be ignored.\n" @@ -50,7 +64,7 @@ "### size: \"61203283968\"" msgstr "" -#: lxc/config.go:37 +#: lxc/config.go:39 msgid "" "### This is a yaml representation of the configuration.\n" "### Any line starting with a '# will be ignored.\n" @@ -71,7 +85,7 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:52 +#: lxc/image.go:62 msgid "" "### This is a yaml representation of the image properties.\n" "### Any line starting with a '# will be ignored.\n" @@ -80,8 +94,15 @@ "### An example would be:\n" "### description: My custom image" msgstr "" +"### Questa è una rappresentazione yaml delle proprietà di\n" +"### un'immagine.\n" +"### Le linee che iniziano con '# saranno ignorate.\n" +"###\n" +"### Ogni proprietà è rappresentata da una singola linea.\n" +"### Un esempio è il seguente:\n" +"### description: My custom image" -#: lxc/network.go:29 +#: lxc/network.go:30 msgid "" "### This is a yaml representation of the network.\n" "### Any line starting with a '# will be ignored.\n" @@ -101,7 +122,7 @@ "### Note that only the configuration can be changed." msgstr "" -#: lxc/profile.go:28 +#: lxc/profile.go:30 msgid "" "### This is a yaml representation of the profile.\n" "### Any line starting with a '# will be ignored.\n" @@ -122,102 +143,130 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:629 +#: lxc/image.go:182 #, c-format msgid "%s (%d more)" msgstr "%s (altri %d)" -#: lxc/snapshot.go:58 +#: lxc/file.go:186 +#, c-format +msgid "%s is not a directory" +msgstr "" + +#: lxc/file.go:128 +#, c-format +msgid "'%s' isn't a regular file or directory." +msgstr "" + +#: lxc/snapshot.go:53 msgid "'/' not allowed in snapshot name" msgstr "'/' non è permesso nel nome di uno snapshot" -#: lxc/profile.go:293 +#: lxc/profile.go:319 msgid "(none)" msgstr "(nessuno)" -#: lxc/image.go:650 lxc/image.go:692 +#: lxc/image.go:226 lxc/image.go:1052 msgid "ALIAS" +msgstr "ALIAS" + +#: lxc/image.go:227 +msgid "ALIASES" msgstr "" -#: lxc/image.go:654 +#: lxc/image.go:231 msgid "ARCH" msgstr "ARCH" -#: lxc/list.go:448 +#: lxc/list.go:461 msgid "ARCHITECTURE" msgstr "ARCHITETTURA" -#: lxc/remote.go:66 +#: lxc/remote.go:67 msgid "Accept certificate" -msgstr "" +msgstr "Accetta certificato" -#: lxc/remote.go:282 +#: lxc/remote.go:281 #, c-format msgid "Admin password for %s: " -msgstr "" +msgstr "Password amministratore per %s: " -#: lxc/image.go:373 +#: lxc/image.go:569 msgid "Aliases:" -msgstr "" +msgstr "Alias:" -#: lxc/image.go:351 lxc/info.go:95 +#: lxc/image.go:547 lxc/info.go:104 #, c-format msgid "Architecture: %s" -msgstr "" +msgstr "Architettura: %s" -#: lxc/image.go:381 +#: lxc/image.go:577 #, c-format msgid "Auto update: %s" +msgstr "Aggiornamento automatico: %s" + +#: lxc/image.go:651 +#, c-format +msgid "Bad property: %s" msgstr "" -#: lxc/info.go:188 +#: lxc/info.go:197 msgid "Bytes received" msgstr "Bytes ricevuti" -#: lxc/info.go:189 +#: lxc/info.go:198 msgid "Bytes sent" -msgstr "" +msgstr "Byte inviati" -#: lxc/config.go:310 +#: lxc/config.go:349 msgid "COMMON NAME" msgstr "" -#: lxc/info.go:152 +#: lxc/info.go:161 msgid "CPU usage (in seconds)" -msgstr "" +msgstr "Utilizzo CPU (in secondi)" -#: lxc/info.go:156 +#: lxc/info.go:165 msgid "CPU usage:" -msgstr "" +msgstr "Utilizzo CPU:" -#: lxc/list.go:449 +#: lxc/list.go:462 msgid "CREATED AT" +msgstr "CREATO IL" + +#: lxc/file.go:479 +msgid "Can't pull a directory without --recursive" msgstr "" -#: lxc/config.go:150 lxc/network.go:496 +#: lxc/config.go:156 lxc/network.go:542 #, c-format msgid "Can't read from stdin: %s" msgstr "" -#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218 +#: lxc/config.go:169 +#, c-format +msgid "Can't unset key '%s', it's not currently set" +msgstr "" + +#: lxc/config.go:211 lxc/config.go:237 #, c-format msgid "Can't unset key '%s', it's not currently set." msgstr "" -#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579 +#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625 msgid "Cannot provide container name to list" msgstr "" -#: lxc/remote.go:232 +#: lxc/remote.go:228 #, c-format msgid "Certificate fingerprint: %s" msgstr "" -#: lxc/remote.go:305 +#: lxc/remote.go:316 msgid "Client certificate stored at server: " msgstr "" -#: lxc/list.go:133 lxc/list.go:134 +#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129 msgid "Columns" msgstr "" @@ -225,35 +274,35 @@ msgid "Commands:" msgstr "" -#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136 +#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137 msgid "Config key/value to apply to the new container" msgstr "" -#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:746 lxc/network.go:378 -#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854 +#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418 +#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935 #, c-format msgid "Config parsing error: %s" msgstr "" -#: lxc/main.go:33 +#: lxc/main.go:35 msgid "Connection refused; is LXD running?" msgstr "" -#: lxc/publish.go:62 +#: lxc/publish.go:71 msgid "Container name is mandatory" msgstr "" -#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244 +#: lxc/copy.go:210 lxc/init.go:313 #, c-format msgid "Container name is: %s" msgstr "" -#: lxc/publish.go:160 lxc/publish.go:175 +#: lxc/publish.go:250 #, c-format msgid "Container published with fingerprint: %s" msgstr "" -#: lxc/image.go:137 +#: lxc/image.go:173 msgid "Copy aliases from source" msgstr "" @@ -261,85 +310,90 @@ msgid "Copy the container without its snapshots" msgstr "" -#: lxc/image.go:250 +#: lxc/image.go:422 #, c-format msgid "Copying the image: %s" msgstr "" -#: lxc/remote.go:247 +#: lxc/remote.go:243 msgid "Could not create server cert dir" msgstr "" -#: lxc/file.go:67 lxc/file.go:68 +#: lxc/file.go:69 lxc/file.go:70 msgid "Create any directories necessary" msgstr "" -#: lxc/image.go:356 lxc/info.go:97 +#: lxc/image.go:552 lxc/info.go:106 #, c-format msgid "Created: %s" msgstr "" -#: lxc/init.go:182 lxc/launch.go:142 +#: lxc/init.go:194 #, c-format msgid "Creating %s" msgstr "" -#: lxc/init.go:180 +#: lxc/init.go:192 msgid "Creating the container" msgstr "" -#: lxc/image.go:653 lxc/image.go:694 lxc/list.go:450 lxc/network.go:461 -#: lxc/storage.go:608 lxc/storage.go:697 +#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507 +#: lxc/storage.go:654 lxc/storage.go:749 msgid "DESCRIPTION" msgstr "" -#: lxc/storage.go:609 +#: lxc/storage.go:655 msgid "DRIVER" msgstr "" -#: lxc/publish.go:38 +#: lxc/publish.go:39 msgid "Define a compression algorithm: for image or none" msgstr "" -#: lxc/config.go:688 +#: lxc/config.go:803 #, c-format msgid "Device %s added to %s" msgstr "" -#: lxc/config.go:875 +#: lxc/config.go:1037 #, c-format msgid "Device %s removed from %s" msgstr "" -#: lxc/exec.go:64 +#: lxc/utils.go:248 lxc/utils.go:272 +#, fuzzy, c-format +msgid "Device already exists: %s" +msgstr "il remote %s esiste già" + +#: lxc/exec.go:65 msgid "Disable pseudo-terminal allocation" msgstr "" -#: lxc/exec.go:65 +#: lxc/exec.go:66 msgid "Disable stdin (reads from /dev/null)" msgstr "" -#: lxc/info.go:145 +#: lxc/info.go:154 msgid "Disk usage:" msgstr "" -#: lxc/list.go:601 +#: lxc/list.go:614 msgid "EPHEMERAL" msgstr "" -#: lxc/config.go:312 +#: lxc/config.go:351 msgid "EXPIRY DATE" msgstr "" -#: lxc/main.go:45 +#: lxc/main.go:47 msgid "Enable debug mode" msgstr "" -#: lxc/main.go:44 +#: lxc/main.go:46 msgid "Enable verbose mode" msgstr "" -#: lxc/exec.go:61 +#: lxc/exec.go:62 msgid "Environment variable to set (e.g. HOME=/home/foo)" msgstr "" @@ -347,7 +401,7 @@ msgid "Environment:" msgstr "" -#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140 +#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141 msgid "Ephemeral container" msgstr "" @@ -355,16 +409,21 @@ msgid "Event type to listen for" msgstr "" -#: lxc/image.go:360 +#: lxc/image.go:556 #, c-format msgid "Expires: %s" msgstr "" -#: lxc/image.go:362 +#: lxc/image.go:558 msgid "Expires: never" msgstr "" -#: lxc/config.go:309 lxc/image.go:651 lxc/image.go:693 +#: lxc/image.go:848 +#, c-format +msgid "Exporting the image: %s" +msgstr "" + +#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053 msgid "FINGERPRINT" msgstr "" @@ -378,16 +437,25 @@ msgid "Failed to generate 'lxc.1': %v" msgstr "" -#: lxc/list.go:136 +#: lxc/copy.go:205 +msgid "Failed to get the new container name" +msgstr "" + +#: lxc/file.go:123 +#, c-format +msgid "Failed to walk path for %s: %s" +msgstr "" + +#: lxc/list.go:131 msgid "Fast mode (same as --columns=nsacPt)" msgstr "" -#: lxc/image.go:349 +#: lxc/image.go:545 #, c-format msgid "Fingerprint: %s" msgstr "" -#: lxc/exec.go:63 +#: lxc/exec.go:64 msgid "Force pseudo-terminal allocation" msgstr "" @@ -395,43 +463,39 @@ msgid "Force the container to shutdown" msgstr "" -#: lxc/delete.go:33 lxc/delete.go:34 +#: lxc/delete.go:34 lxc/delete.go:35 msgid "Force the removal of stopped containers" msgstr "" -#: lxc/main.go:46 +#: lxc/main.go:48 msgid "Force using the local unix socket" msgstr "" -#: lxc/image.go:140 -msgid "Format" +#: lxc/image.go:176 lxc/list.go:130 +msgid "Format (csv|json|table|yaml)" msgstr "" -#: lxc/list.go:135 -msgid "Format (table|json|csv)" -msgstr "" - -#: lxc/remote.go:80 +#: lxc/remote.go:81 msgid "Generating a client certificate. This may take a minute..." msgstr "" -#: lxc/list.go:446 +#: lxc/list.go:459 msgid "IPV4" msgstr "" -#: lxc/list.go:447 +#: lxc/list.go:460 msgid "IPV6" msgstr "" -#: lxc/config.go:311 +#: lxc/config.go:350 msgid "ISSUE DATE" msgstr "" -#: lxc/main.go:139 +#: lxc/main.go:153 msgid "If this is your first time using LXD, you should also run: lxd init" msgstr "" -#: lxc/main.go:47 +#: lxc/main.go:49 msgid "Ignore aliases when determining what command to run" msgstr "" @@ -439,245 +503,229 @@ msgid "Ignore the container state (only for start)" msgstr "" -#: lxc/image.go:312 +#: lxc/image.go:508 msgid "Image already up to date." msgstr "" -#: lxc/image.go:253 +#: lxc/image.go:436 msgid "Image copied successfully!" msgstr "" -#: lxc/image.go:436 lxc/image.go:448 +#: lxc/image.go:898 +msgid "Image exported successfully!" +msgstr "" + +#: lxc/image.go:709 #, c-format msgid "Image imported with fingerprint: %s" msgstr "" -#: lxc/image.go:310 +#: lxc/image.go:506 msgid "Image refreshed successfully!" msgstr "" -#: lxc/image.go:433 -#, c-format -msgid "Importing the image: %s" -msgstr "" - -#: lxc/remote.go:150 +#: lxc/remote.go:151 #, c-format msgid "Invalid URL scheme \"%s\" in \"%s\"" msgstr "" -#: lxc/config.go:290 +#: lxc/config.go:329 msgid "Invalid certificate" msgstr "" -#: lxc/init.go:30 lxc/init.go:35 +#: lxc/init.go:31 lxc/init.go:36 msgid "Invalid configuration key" msgstr "" -#: lxc/file.go:357 +#: lxc/file.go:522 #, c-format msgid "Invalid path %s" msgstr "" -#: lxc/file.go:291 +#: lxc/file.go:451 #, c-format msgid "Invalid source %s" msgstr "" -#: lxc/file.go:80 +#: lxc/file.go:224 #, c-format msgid "Invalid target %s" msgstr "" -#: lxc/info.go:126 +#: lxc/info.go:135 msgid "Ips:" msgstr "" -#: lxc/image.go:138 +#: lxc/image.go:174 msgid "Keep the image up to date after initial copy" msgstr "" -#: lxc/list.go:451 +#: lxc/list.go:464 msgid "LAST USED AT" msgstr "" -#: lxc/main.go:31 +#: lxc/main.go:33 msgid "LXD socket not found; is LXD installed and running?" msgstr "" -#: lxc/image.go:365 +#: lxc/image.go:561 #, c-format msgid "Last used: %s" msgstr "" -#: lxc/image.go:367 +#: lxc/image.go:563 msgid "Last used: never" msgstr "" -#: lxc/info.go:241 +#: lxc/info.go:250 msgid "Log:" msgstr "" -#: lxc/network.go:460 +#: lxc/network.go:506 msgid "MANAGED" msgstr "" -#: lxc/image.go:136 +#: lxc/image.go:172 msgid "Make image public" msgstr "" -#: lxc/publish.go:34 +#: lxc/publish.go:35 msgid "Make the image public" msgstr "" -#: lxc/info.go:163 +#: lxc/info.go:172 msgid "Memory (current)" msgstr "" -#: lxc/info.go:167 +#: lxc/info.go:176 msgid "Memory (peak)" msgstr "" -#: lxc/info.go:179 +#: lxc/info.go:188 msgid "Memory usage:" msgstr "" -#: lxc/copy.go:276 -#, c-format -msgid "Migration failed on source host: %s" -msgstr "" - -#: lxc/copy.go:280 -#, c-format -msgid "Migration failed on target host: %s" -msgstr "" - -#: lxc/utils.go:193 +#: lxc/utils.go:199 msgid "Missing summary." msgstr "" -#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462 +#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494 msgid "More than one device matches, specify the device name." msgstr "" -#: lxc/file.go:279 +#: lxc/file.go:438 msgid "More than one file to download, but target is not a directory" msgstr "" -#: lxc/move.go:35 +#: lxc/move.go:38 msgid "Move the container without its snapshots" msgstr "" -#: lxc/action.go:68 +#: lxc/action.go:72 msgid "Must supply container name for: " msgstr "" -#: lxc/list.go:452 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395 -#: lxc/storage.go:607 lxc/storage.go:696 +#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406 +#: lxc/storage.go:653 lxc/storage.go:748 msgid "NAME" msgstr "" -#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374 +#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385 msgid "NO" msgstr "" -#: lxc/info.go:91 +#: lxc/info.go:99 #, c-format msgid "Name: %s" msgstr "" -#: lxc/network.go:222 +#: lxc/network.go:250 #, c-format msgid "Network %s created" msgstr "" -#: lxc/network.go:325 +#: lxc/network.go:366 #, c-format msgid "Network %s deleted" msgstr "" -#: lxc/init.go:141 lxc/init.go:142 +#: lxc/init.go:142 lxc/init.go:143 msgid "Network name" msgstr "" -#: lxc/info.go:196 +#: lxc/info.go:205 msgid "Network usage:" msgstr "" -#: lxc/image.go:139 lxc/publish.go:35 +#: lxc/image.go:175 lxc/publish.go:36 msgid "New alias to define at target" msgstr "" -#: lxc/config.go:321 +#: lxc/config.go:360 msgid "No certificate provided to add" msgstr "" -#: lxc/network.go:257 lxc/network.go:306 +#: lxc/network.go:285 lxc/network.go:338 msgid "No device found for this network" msgstr "" -#: lxc/storage.go:371 lxc/storage.go:471 +#: lxc/storage.go:383 lxc/storage.go:503 msgid "No device found for this storage volume." msgstr "" -#: lxc/config.go:344 +#: lxc/config.go:392 msgid "No fingerprint specified." msgstr "" -#: lxc/storage.go:323 lxc/storage.go:407 +#: lxc/storage.go:327 lxc/storage.go:420 msgid "Only \"custom\" volumes can be attached to containers." msgstr "" -#: lxc/remote.go:135 +#: lxc/remote.go:136 msgid "Only https URLs are supported for simplestreams" msgstr "" -#: lxc/image.go:439 +#: lxc/image.go:632 msgid "Only https:// is supported for remote image import." msgstr "" -#: lxc/network.go:354 lxc/network.go:482 +#: lxc/network.go:394 lxc/network.go:528 msgid "Only managed networks can be modified." msgstr "" -#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163 +#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177 msgid "Options:" msgstr "" -#: lxc/image.go:550 -#, c-format -msgid "Output is in %s" -msgstr "" - -#: lxc/exec.go:62 +#: lxc/exec.go:63 msgid "Override the terminal mode (auto, interactive or non-interactive)" msgstr "" -#: lxc/list.go:603 +#: lxc/list.go:616 msgid "PERSISTENT" msgstr "" -#: lxc/list.go:453 +#: lxc/list.go:466 msgid "PID" msgstr "" -#: lxc/list.go:454 +#: lxc/list.go:467 msgid "PROFILES" msgstr "" -#: lxc/remote.go:397 +#: lxc/remote.go:408 msgid "PROTOCOL" msgstr "" -#: lxc/image.go:652 lxc/remote.go:398 +#: lxc/image.go:229 lxc/remote.go:409 msgid "PUBLIC" msgstr "" -#: lxc/info.go:190 +#: lxc/info.go:199 msgid "Packets received" msgstr "" -#: lxc/info.go:191 +#: lxc/info.go:200 msgid "Packets sent" msgstr "" @@ -689,24 +737,24 @@ msgid "Path to an alternate server directory" msgstr "" -#: lxc/main.go:202 +#: lxc/main.go:216 msgid "Pause containers." msgstr "" -#: lxc/main.go:35 +#: lxc/main.go:37 msgid "Permission denied, are you in the lxd group?" msgstr "" -#: lxc/info.go:108 +#: lxc/info.go:117 #, c-format msgid "Pid: %d" msgstr "" -#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855 +#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936 msgid "Press enter to open the editor again" msgstr "" -#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:747 +#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108 msgid "Press enter to start the editor again" msgstr "" @@ -722,143 +770,143 @@ msgid "Print verbose information" msgstr "" -#: lxc/info.go:132 +#: lxc/info.go:141 #, c-format msgid "Processes: %d" msgstr "" -#: lxc/profile.go:314 +#: lxc/profile.go:344 #, c-format msgid "Profile %s added to %s" msgstr "" -#: lxc/profile.go:209 +#: lxc/profile.go:218 #, c-format msgid "Profile %s created" msgstr "" -#: lxc/profile.go:279 +#: lxc/profile.go:292 #, c-format msgid "Profile %s deleted" msgstr "" -#: lxc/profile.go:345 +#: lxc/profile.go:379 #, c-format msgid "Profile %s removed from %s" msgstr "" -#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138 +#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139 msgid "Profile to apply to the new container" msgstr "" -#: lxc/profile.go:295 +#: lxc/profile.go:321 #, c-format msgid "Profiles %s applied to %s" msgstr "" -#: lxc/info.go:106 +#: lxc/info.go:115 #, c-format msgid "Profiles: %s" msgstr "" -#: lxc/image.go:369 +#: lxc/image.go:565 msgid "Properties:" msgstr "" -#: lxc/remote.go:69 +#: lxc/remote.go:70 msgid "Public image server" msgstr "" -#: lxc/image.go:352 +#: lxc/image.go:548 #, c-format msgid "Public: %s" msgstr "" -#: lxc/file.go:65 lxc/file.go:66 +#: lxc/file.go:67 lxc/file.go:68 msgid "Recursively push or pull files" msgstr "" -#: lxc/image.go:303 +#: lxc/image.go:489 #, c-format msgid "Refreshing the image: %s" msgstr "" -#: lxc/remote.go:67 +#: lxc/remote.go:68 msgid "Remote admin password" msgstr "" -#: lxc/info.go:93 +#: lxc/info.go:101 #, c-format msgid "Remote: %s" msgstr "" -#: lxc/delete.go:41 +#: lxc/delete.go:42 #, c-format msgid "Remove %s (yes/no): " msgstr "" -#: lxc/delete.go:35 lxc/delete.go:36 +#: lxc/delete.go:36 lxc/delete.go:37 msgid "Require user confirmation" msgstr "" -#: lxc/info.go:129 +#: lxc/info.go:138 msgid "Resources:" msgstr "" -#: lxc/main.go:210 +#: lxc/main.go:224 msgid "Restart containers." msgstr "" -#: lxc/init.go:253 +#: lxc/init.go:286 #, c-format msgid "Retrieving image: %s" msgstr "" -#: lxc/image.go:655 +#: lxc/image.go:232 msgid "SIZE" msgstr "" -#: lxc/list.go:455 +#: lxc/list.go:468 msgid "SNAPSHOTS" msgstr "" -#: lxc/storage.go:610 +#: lxc/storage.go:656 msgid "SOURCE" msgstr "" -#: lxc/list.go:456 +#: lxc/list.go:469 msgid "STATE" msgstr "" -#: lxc/remote.go:399 +#: lxc/remote.go:410 msgid "STATIC" msgstr "" -#: lxc/list.go:458 +#: lxc/list.go:471 msgid "STORAGE POOL" msgstr "" -#: lxc/remote.go:240 +#: lxc/remote.go:236 msgid "Server certificate NACKed by user" msgstr "" -#: lxc/remote.go:302 +#: lxc/remote.go:313 msgid "Server doesn't trust us after adding our cert" msgstr "" -#: lxc/remote.go:68 +#: lxc/remote.go:69 msgid "Server protocol (lxd or simplestreams)" msgstr "" -#: lxc/file.go:63 +#: lxc/file.go:65 msgid "Set the file's gid on push" msgstr "" -#: lxc/file.go:64 +#: lxc/file.go:66 msgid "Set the file's perms on push" msgstr "" -#: lxc/file.go:62 +#: lxc/file.go:64 msgid "Set the file's uid on push" msgstr "" @@ -870,78 +918,83 @@ msgid "Show client version" msgstr "" -#: lxc/info.go:38 +#: lxc/info.go:39 msgid "Show the container's last 100 log lines?" msgstr "" -#: lxc/config.go:33 +#: lxc/config.go:35 msgid "Show the expanded configuration" msgstr "" -#: lxc/image.go:350 +#: lxc/image.go:546 #, c-format msgid "Size: %.2fMB" msgstr "" -#: lxc/info.go:210 +#: lxc/info.go:219 msgid "Snapshots:" msgstr "" -#: lxc/action.go:134 +#: lxc/action.go:142 #, c-format msgid "Some containers failed to %s" msgstr "" -#: lxc/image.go:383 +#: lxc/image.go:579 msgid "Source:" msgstr "" -#: lxc/main.go:220 +#: lxc/main.go:234 msgid "Start containers." msgstr "" -#: lxc/launch.go:152 +#: lxc/launch.go:59 #, c-format msgid "Starting %s" msgstr "" -#: lxc/info.go:100 +#: lxc/info.go:109 #, c-format msgid "Status: %s" msgstr "" -#: lxc/main.go:226 +#: lxc/main.go:240 msgid "Stop containers." msgstr "" -#: lxc/publish.go:36 lxc/publish.go:37 +#: lxc/publish.go:37 lxc/publish.go:38 msgid "Stop the container if currently running" msgstr "" -#: lxc/delete.go:105 lxc/publish.go:114 +#: lxc/publish.go:136 msgid "Stopping container failed!" msgstr "" -#: lxc/storage.go:436 +#: lxc/delete.go:121 +#, c-format +msgid "Stopping the container failed: %s" +msgstr "" + +#: lxc/storage.go:468 #, c-format msgid "Storage pool %s created" msgstr "" -#: lxc/storage.go:486 +#: lxc/storage.go:527 #, c-format msgid "Storage pool %s deleted" msgstr "" -#: lxc/init.go:143 lxc/init.go:144 +#: lxc/init.go:144 lxc/init.go:145 msgid "Storage pool name" msgstr "" -#: lxc/storage.go:720 +#: lxc/storage.go:782 #, c-format msgid "Storage volume %s created" msgstr "" -#: lxc/storage.go:730 +#: lxc/storage.go:797 #, c-format msgid "Storage volume %s deleted" msgstr "" @@ -950,38 +1003,43 @@ msgid "Store the container state (only for stop)" msgstr "" -#: lxc/info.go:171 +#: lxc/info.go:180 msgid "Swap (current)" msgstr "" -#: lxc/info.go:175 +#: lxc/info.go:184 msgid "Swap (peak)" msgstr "" -#: lxc/list.go:457 lxc/network.go:459 lxc/storage.go:695 +#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747 msgid "TYPE" msgstr "" -#: lxc/delete.go:91 +#: lxc/delete.go:105 msgid "The container is currently running, stop it first or pass --force." msgstr "" -#: lxc/publish.go:92 +#: lxc/publish.go:101 msgid "" "The container is currently running. Use --force to have it stopped and " "restarted." msgstr "" -#: lxc/init.go:326 +#: lxc/init.go:358 msgid "The container you are starting doesn't have any network attached to it." msgstr "" -#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779 -#: lxc/config.go:817 lxc/config.go:835 +#: lxc/config.go:770 lxc/config.go:787 +#, fuzzy +msgid "The device already exists" +msgstr "il remote %s esiste già" + +#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899 +#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022 msgid "The device doesn't exist" msgstr "" -#: lxc/init.go:310 +#: lxc/init.go:342 #, c-format msgid "The local image '%s' couldn't be found, trying '%s:' instead." msgstr "" @@ -990,15 +1048,15 @@ msgid "The opposite of \"lxc pause\" is \"lxc start\"." msgstr "" -#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476 +#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508 msgid "The specified device doesn't exist" msgstr "" -#: lxc/network.go:266 lxc/network.go:315 +#: lxc/network.go:294 lxc/network.go:347 msgid "The specified device doesn't match the network" msgstr "" -#: lxc/publish.go:65 +#: lxc/publish.go:74 msgid "There is no \"image name\". Did you want an alias?" msgstr "" @@ -1014,49 +1072,49 @@ msgid "Time to wait for the container before killing it" msgstr "" -#: lxc/image.go:353 +#: lxc/image.go:549 msgid "Timestamps:" msgstr "" -#: lxc/init.go:328 +#: lxc/init.go:360 msgid "To attach a network to a container, use: lxc network attach" msgstr "" -#: lxc/init.go:327 +#: lxc/init.go:359 msgid "To create a new network, use: lxc network create" msgstr "" -#: lxc/main.go:140 +#: lxc/main.go:154 msgid "To start your first container, try: lxc launch ubuntu:16.04" msgstr "" -#: lxc/image.go:441 +#: lxc/image.go:657 #, c-format msgid "Transferring image: %s" msgstr "" -#: lxc/action.go:98 lxc/launch.go:165 +#: lxc/action.go:106 lxc/launch.go:77 #, c-format msgid "Try `lxc info --show-log %s` for more info" msgstr "" -#: lxc/info.go:102 +#: lxc/info.go:111 msgid "Type: ephemeral" msgstr "" -#: lxc/info.go:104 +#: lxc/info.go:113 msgid "Type: persistent" msgstr "" -#: lxc/image.go:656 +#: lxc/image.go:233 msgid "UPLOAD DATE" msgstr "" -#: lxc/remote.go:396 +#: lxc/remote.go:407 msgid "URL" msgstr "" -#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698 +#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750 msgid "USED BY" msgstr "" @@ -1064,11 +1122,16 @@ msgid "Unable to find help2man." msgstr "" -#: lxc/remote.go:110 +#: lxc/remote.go:111 msgid "Unable to read remote TLS certificate" msgstr "" -#: lxc/image.go:358 +#: lxc/file.go:111 +#, c-format +msgid "Unknown file type '%s'" +msgstr "" + +#: lxc/image.go:554 #, c-format msgid "Uploaded: %s" msgstr "" @@ -1085,7 +1148,7 @@ msgid "Usage: lxc [options]" msgstr "" -#: lxc/config.go:58 +#: lxc/config.go:60 msgid "" "Usage: lxc config [options]\n" "\n" @@ -1171,7 +1234,7 @@ "Copy containers within or in between LXD instances." msgstr "" -#: lxc/delete.go:26 +#: lxc/delete.go:27 msgid "" "Usage: lxc delete [:][/] " "[[:][/]...]\n" @@ -1179,7 +1242,7 @@ "Delete containers and snapshots." msgstr "" -#: lxc/exec.go:52 +#: lxc/exec.go:53 msgid "" "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|" "interactive|non-interactive] [--env KEY=VALUE...] [--] \n" @@ -1190,7 +1253,7 @@ "AND stdout are terminals (stderr is ignored)." msgstr "" -#: lxc/file.go:36 +#: lxc/file.go:38 msgid "" "Usage: lxc file [options]\n" "\n" @@ -1234,7 +1297,7 @@ "Help page for the LXD client." msgstr "" -#: lxc/image.go:62 +#: lxc/image.go:72 msgid "" "Usage: lxc image [options]\n" "\n" @@ -1288,11 +1351,38 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" -"lxc image list [:] [filter] [--format table|json]\n" +"lxc image list [:] [filter] [--format csv|json|table|yaml] [-c " +"]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" +" The -c option takes a (optionally comma-separated) list of arguments " +"that\n" +" control which image attributes to output when displaying in table or " +"csv\n" +" format.\n" +"\n" +" Default column layout is: lfpdasu\n" +"\n" +" Column shorthand chars:\n" +"\n" +" l - Shortest image alias (and optionally number of other aliases)\n" +"\n" +" L - Newline-separated list of all image aliases\n" +"\n" +" f - Fingerprint\n" +"\n" +" p - Whether image is public\n" +"\n" +" d - Description\n" +"\n" +" a - Architecture\n" +"\n" +" s - Size\n" +"\n" +" u - Upload date\n" +"\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1312,7 +1402,7 @@ "image alias name." msgstr "" -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "" "Usage: lxc info [:][] [--show-log]\n" "\n" @@ -1325,7 +1415,7 @@ " For LXD server information." msgstr "" -#: lxc/init.go:75 +#: lxc/init.go:76 msgid "" "Usage: lxc init [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1340,7 +1430,7 @@ " lxc init ubuntu:16.04 u1" msgstr "" -#: lxc/launch.go:23 +#: lxc/launch.go:20 msgid "" "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1355,9 +1445,9 @@ " lxc launch ubuntu:16.04 u1" msgstr "" -#: lxc/list.go:49 +#: lxc/list.go:44 msgid "" -"Usage: lxc list [:] [filters] [--format table|json|csv] [-c " +"Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c " "] [--fast]\n" "\n" "List the existing containers.\n" @@ -1469,7 +1559,7 @@ " Only show log message." msgstr "" -#: lxc/move.go:19 +#: lxc/move.go:22 msgid "" "Usage: lxc move [:][/] [:][[/" "]] [--container-only]\n" @@ -1488,7 +1578,7 @@ " Rename a snapshot." msgstr "" -#: lxc/network.go:49 +#: lxc/network.go:50 msgid "" "Usage: lxc network [options]\n" "\n" @@ -1541,7 +1631,7 @@ " Update a network using the content of network.yaml" msgstr "" -#: lxc/profile.go:49 +#: lxc/profile.go:51 msgid "" "Usage: lxc profile [options]\n" "\n" @@ -1623,7 +1713,7 @@ " Remove all profile from \"foo\"" msgstr "" -#: lxc/publish.go:27 +#: lxc/publish.go:28 msgid "" "Usage: lxc publish [:][/] [:] [--" "alias=ALIAS...] [prop-key=prop-value...]\n" @@ -1631,7 +1721,7 @@ "Publish containers as images." msgstr "" -#: lxc/remote.go:38 +#: lxc/remote.go:39 msgid "" "Usage: lxc remote [options]\n" "\n" @@ -1660,7 +1750,7 @@ " Print the default remote." msgstr "" -#: lxc/restore.go:21 +#: lxc/restore.go:22 msgid "" "Usage: lxc restore [:] [--stateful]\n" "\n" @@ -1676,7 +1766,7 @@ " Restore the snapshot." msgstr "" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 msgid "" "Usage: lxc snapshot [:] [--stateful]\n" "\n" @@ -1690,7 +1780,7 @@ " Create a snapshot of \"u1\" called \"snap0\"." msgstr "" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "" "Usage: lxc storage [options]\n" "\n" @@ -1790,157 +1880,132 @@ "Print the version number of this client tool." msgstr "" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "" -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "" "Whether or not to restore the container's running state from snapshot (if " "available)" msgstr "" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "" -#: lxc/exec.go:129 +#: lxc/exec.go:130 msgid "You can't pass -t or -T at the same time as --mode" msgstr "" -#: lxc/main.go:56 -msgid "`lxc config profile` is deprecated, please use `lxc profile`" -msgstr "" - -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "" +#: lxc/copy.go:57 +#, fuzzy +msgid "You must specify a source container name" +msgstr "occorre specificare un nome di container come origine" -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" -msgstr "" - -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" +#: lxc/main.go:58 +msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "" -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 -#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, c-format msgid "error: %v" msgstr "" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, c-format msgid "error: unknown command: %s" msgstr "" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" -msgstr "" - -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "" +msgstr "no" -#: lxc/remote.go:233 +#: lxc/remote.go:229 msgid "ok (y/n)?" -msgstr "" +msgstr "ok (y/n)?" -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" -msgstr "" +msgstr "errore di processamento degli alias %s\n" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" -msgstr "" +msgstr "il remote %s esiste già" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" -msgstr "" +msgstr "il remote %s non esiste" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" -msgstr "" +msgstr "il remote %s esiste come %s" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" -msgstr "" +msgstr "il remote %s è statico e non può essere modificato" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" -msgstr "" +msgstr "senza stato" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" -msgstr "" - -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "" +msgstr "salvato alle %s" -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" -msgstr "" +msgstr "numero errato di argomenti del sottocomando" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" -msgstr "" +msgstr "si" -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "" +#~ msgid "not all the profiles from the source exist on the target" +#~ msgstr "non tutti i profili dell'origine esistono nella destinazione" diff -Nru lxd-2.14/po/ja.po lxd-2.15/po/ja.po --- lxd-2.14/po/ja.po 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/ja.po 2017-06-28 03:00:23.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: LXD\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2017-05-30 14:59-0400\n" +"POT-Creation-Date: 2017-06-27 00:23-0400\n" "PO-Revision-Date: 2017-03-23 12:03+0000\n" "Last-Translator: KATOH Yasufumi \n" "Language-Team: Japanese [options]" msgstr "使い方: lxc <コマンド> [オプション]" -#: lxc/config.go:58 +#: lxc/config.go:60 msgid "" "Usage: lxc config [options]\n" "\n" @@ -1258,7 +1304,7 @@ "\n" "LXDインスタンス内もしくはLXDインスタンス間でコンテナをコピーします。" -#: lxc/delete.go:26 +#: lxc/delete.go:27 msgid "" "Usage: lxc delete [:][/] " "[[:][/]...]\n" @@ -1270,7 +1316,7 @@ "\n" "コンテナとコンテナのスナップショットを消去します。" -#: lxc/exec.go:52 +#: lxc/exec.go:53 msgid "" "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|" "interactive|non-interactive] [--env KEY=VALUE...] [--] \n" @@ -1288,7 +1334,7 @@ "デフォルトのモードは non-interactive です。もし標準入出力が両方ともターミナル" "の場合は interactive モードが選択されます (標準エラー出力は無視されます)。" -#: lxc/file.go:36 +#: lxc/file.go:38 msgid "" "Usage: lxc file [options]\n" "\n" @@ -1364,7 +1410,7 @@ "\n" "LXD クライアントのヘルプを表示します。" -#: lxc/image.go:62 +#: lxc/image.go:72 #, fuzzy msgid "" "Usage: lxc image [options]\n" @@ -1419,11 +1465,38 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" -"lxc image list [:] [filter] [--format table|json]\n" +"lxc image list [:] [filter] [--format csv|json|table|yaml] [-c " +"]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" +" The -c option takes a (optionally comma-separated) list of arguments " +"that\n" +" control which image attributes to output when displaying in table or " +"csv\n" +" format.\n" +"\n" +" Default column layout is: lfpdasu\n" +"\n" +" Column shorthand chars:\n" +"\n" +" l - Shortest image alias (and optionally number of other aliases)\n" +"\n" +" L - Newline-separated list of all image aliases\n" +"\n" +" f - Fingerprint\n" +"\n" +" p - Whether image is public\n" +"\n" +" d - Description\n" +"\n" +" a - Architecture\n" +"\n" +" s - Size\n" +"\n" +" u - Upload date\n" +"\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1516,7 +1589,7 @@ "ス\n" " 名の一部をフィルタとして指定できます。" -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "" "Usage: lxc info [:][] [--show-log]\n" "\n" @@ -1538,7 +1611,7 @@ "lxc info [:]\n" " LXD サーバの情報を表示します。" -#: lxc/init.go:75 +#: lxc/init.go:76 msgid "" "Usage: lxc init [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1564,7 +1637,7 @@ "例:\n" " lxc init ubuntu:16.04 u1" -#: lxc/launch.go:23 +#: lxc/launch.go:20 msgid "" "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1590,10 +1663,10 @@ "例:\n" " lxc launch ubuntu:16.04 u1" -#: lxc/list.go:49 +#: lxc/list.go:44 #, fuzzy msgid "" -"Usage: lxc list [:] [filters] [--format table|json|csv] [-c " +"Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c " "] [--fast]\n" "\n" "List the existing containers.\n" @@ -1807,7 +1880,7 @@ "lxc monitor --type=logging\n" " ログメッセージのみ表示します。" -#: lxc/move.go:19 +#: lxc/move.go:22 msgid "" "Usage: lxc move [:][/] [:][[/" "]] [--container-only]\n" @@ -1840,7 +1913,7 @@ "lxc move / /\n" " スナップショットをリネームします。" -#: lxc/network.go:49 +#: lxc/network.go:50 msgid "" "Usage: lxc network [options]\n" "\n" @@ -1943,7 +2016,7 @@ "cat network.yaml | lxc network edit \n" " network.yaml の内容でネットワークを更新します。" -#: lxc/profile.go:49 +#: lxc/profile.go:51 msgid "" "Usage: lxc profile [options]\n" "\n" @@ -2103,7 +2176,7 @@ "lxc profile assign foo ''\n" " \"foo\" からすべてのプロファイルを削除します。" -#: lxc/publish.go:27 +#: lxc/publish.go:28 msgid "" "Usage: lxc publish [:][/] [:] [--" "alias=ALIAS...] [prop-key=prop-value...]\n" @@ -2115,7 +2188,7 @@ "\n" "イメージとしてコンテナを publish します。" -#: lxc/remote.go:38 +#: lxc/remote.go:39 msgid "" "Usage: lxc remote [options]\n" "\n" @@ -2169,7 +2242,7 @@ "lxc remote get-default\n" " デフォルトに設定されているリモートホストを表示します。" -#: lxc/restore.go:21 +#: lxc/restore.go:22 msgid "" "Usage: lxc restore [:] [--stateful]\n" "\n" @@ -2197,7 +2270,7 @@ "lxc restore u1 snap0\n" " スナップショットからリストアします。" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 msgid "" "Usage: lxc snapshot [:] [--stateful]\n" "\n" @@ -2221,7 +2294,7 @@ "lxc snapshot u1 snap0\n" " \"u1\" のスナップショットを \"snap0\" という名前で作成します。" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "" "Usage: lxc storage [options]\n" "\n" @@ -2413,165 +2486,166 @@ "\n" "お使いのクライアントのバージョン番号を表示します。" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "ユーザが削除操作を中断しました。" -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "" "Whether or not to restore the container's running state from snapshot (if " "available)" msgstr "" "スナップショットからコンテナの稼動状態をリストアするかどうか (取得可能な場合)" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "コンテナの稼動状態のスナップショットを取得するかどうか" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "-t と -T は同時に指定できません" -#: lxc/exec.go:129 +#: lxc/exec.go:130 msgid "You can't pass -t or -T at the same time as --mode" msgstr "--mode と同時に -t または -T は指定できません" -#: lxc/main.go:56 +#: lxc/copy.go:57 +#, fuzzy +msgid "You must specify a source container name" +msgstr "コピー元のコンテナ名を指定してください" + +#: lxc/main.go:58 msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "`lxc config profile` は廃止されました。`lxc profile` を使ってください" -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "" -"イメージ、コンテナ、スナップショットのいずれかからスキャンされた数が不正" - -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "アクションからの結果タイプが不正です" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" -msgstr "同じコンテナ名へはコピーできません" - -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" -msgstr "" -"ディレクトリを pull する場合は --recursive オプションを使用してください" - -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "デフォルトのリモートは削除できません" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "再帰 (recursive) モードでは uid/gid/mode を指定できません" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 -#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "" "サーバから変更されたイメージ、コンテナ、スナップショットを取得できませんで\n" "した" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "無効" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "有効" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, c-format msgid "error: %v" msgstr "エラー: %v" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, c-format msgid "error: unknown command: %s" msgstr "エラー: 未知のコマンド: %s" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "不正なバージョンを得ました" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" msgstr "" -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "コピー元の全てのプロファイルがターゲットに存在しません" - -#: lxc/remote.go:233 +#: lxc/remote.go:229 msgid "ok (y/n)?" msgstr "ok (y/n)?" -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" msgstr "エイリアスの処理が失敗しました %s\n" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "再帰的な edit は意味がありません :(" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" msgstr "リモート %s は既に存在します" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" msgstr "リモート %s は存在しません" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" msgstr "リモート %s は <%s> として存在します" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" msgstr "リモート %s は static ですので変更できません" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" msgstr "" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" msgstr "%s に取得しました" -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "到達しないはずのreturnに到達しました" - -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" msgstr "サブコマンドの引数の数が正しくありません" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" msgstr "" -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "コピー元のコンテナ名を指定してください" +#~ msgid "Migration failed on source host: %s" +#~ msgstr "ソースのホスト上でマイグレーションが失敗しました: %s" + +#~ msgid "Migration failed on target host: %s" +#~ msgstr "コピー先のホストでマイグレーションが失敗しました: %s" + +#~ msgid "Output is in %s" +#~ msgstr "%s に出力されます" + +#~ msgid "bad number of things scanned from image, container or snapshot" +#~ msgstr "" +#~ "イメージ、コンテナ、スナップショットのいずれかからスキャンされた数が不正" + +#~ msgid "bad result type from action" +#~ msgstr "アクションからの結果タイプが不正です" + +#~ msgid "can't copy to the same container name" +#~ msgstr "同じコンテナ名へはコピーできません" + +#~ msgid "got bad version" +#~ msgstr "不正なバージョンを得ました" + +#~ msgid "not all the profiles from the source exist on the target" +#~ msgstr "コピー元の全てのプロファイルがターゲットに存在しません" + +#~ msgid "unreachable return reached" +#~ msgstr "到達しないはずのreturnに到達しました" + +#~ msgid "Format" +#~ msgstr "フォーマット" #~ msgid "Could not sanitize path %s" #~ msgstr "パス %s をサニタイズできません" @@ -2621,10 +2695,6 @@ #~ msgstr "使い方: %s" #, fuzzy -#~ msgid "Bad image property: %s" -#~ msgstr "(不正なイメージプロパティ形式: %s\n" - -#, fuzzy #~ msgid "" #~ "Create a read-only snapshot of a container.\n" #~ "\n" @@ -2651,10 +2721,6 @@ #~ msgstr "プロファイルURL内のバージョンが不正" #, fuzzy -#~ msgid "device already exists" -#~ msgstr "リモート %s は既に存在します" - -#, fuzzy #~ msgid "error." #~ msgstr "エラー: %v\n" @@ -2706,10 +2772,6 @@ #~ msgstr "不正な引数 %s" #, fuzzy -#~ msgid "unknown profile cmd %s" -#~ msgstr "未知の設定コマンド %s" - -#, fuzzy #~ msgid "Publish to remote server is not supported yet" #~ msgstr "リモートの情報表示はまだサポートされていません。\n" diff -Nru lxd-2.14/po/lxd.pot lxd-2.15/po/lxd.pot --- lxd-2.14/po/lxd.pot 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/lxd.pot 2017-06-28 03:00:23.000000000 +0000 @@ -7,7 +7,7 @@ msgid "" msgstr "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" - "POT-Creation-Date: 2017-05-30 14:59-0400\n" + "POT-Creation-Date: 2017-06-27 00:23-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,7 @@ "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: lxc/storage.go:30 +#: lxc/storage.go:31 msgid "### This is a yaml representation of a storage pool.\n" "### Any line starting with a '# will be ignored.\n" "###\n" @@ -32,7 +32,7 @@ "### zfs.pool_name: default" msgstr "" -#: lxc/storage.go:47 +#: lxc/storage.go:48 msgid "### This is a yaml representation of a storage volume.\n" "### Any line starting with a '# will be ignored.\n" "###\n" @@ -45,7 +45,7 @@ "### size: \"61203283968\"" msgstr "" -#: lxc/config.go:37 +#: lxc/config.go:39 msgid "### This is a yaml representation of the configuration.\n" "### Any line starting with a '# will be ignored.\n" "###\n" @@ -65,7 +65,7 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:52 +#: lxc/image.go:62 msgid "### This is a yaml representation of the image properties.\n" "### Any line starting with a '# will be ignored.\n" "###\n" @@ -74,7 +74,7 @@ "### description: My custom image" msgstr "" -#: lxc/network.go:29 +#: lxc/network.go:30 msgid "### This is a yaml representation of the network.\n" "### Any line starting with a '# will be ignored.\n" "###\n" @@ -93,7 +93,7 @@ "### Note that only the configuration can be changed." msgstr "" -#: lxc/profile.go:28 +#: lxc/profile.go:30 msgid "### This is a yaml representation of the profile.\n" "### Any line starting with a '# will be ignored.\n" "###\n" @@ -113,102 +113,130 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:629 +#: lxc/image.go:182 #, c-format msgid "%s (%d more)" msgstr "" -#: lxc/snapshot.go:58 +#: lxc/file.go:186 +#, c-format +msgid "%s is not a directory" +msgstr "" + +#: lxc/file.go:128 +#, c-format +msgid "'%s' isn't a regular file or directory." +msgstr "" + +#: lxc/snapshot.go:53 msgid "'/' not allowed in snapshot name" msgstr "" -#: lxc/profile.go:293 +#: lxc/profile.go:319 msgid "(none)" msgstr "" -#: lxc/image.go:650 lxc/image.go:692 +#: lxc/image.go:226 lxc/image.go:1052 msgid "ALIAS" msgstr "" -#: lxc/image.go:654 +#: lxc/image.go:227 +msgid "ALIASES" +msgstr "" + +#: lxc/image.go:231 msgid "ARCH" msgstr "" -#: lxc/list.go:448 +#: lxc/list.go:461 msgid "ARCHITECTURE" msgstr "" -#: lxc/remote.go:66 +#: lxc/remote.go:67 msgid "Accept certificate" msgstr "" -#: lxc/remote.go:282 +#: lxc/remote.go:281 #, c-format msgid "Admin password for %s: " msgstr "" -#: lxc/image.go:373 +#: lxc/image.go:569 msgid "Aliases:" msgstr "" -#: lxc/image.go:351 lxc/info.go:95 +#: lxc/image.go:547 lxc/info.go:104 #, c-format msgid "Architecture: %s" msgstr "" -#: lxc/image.go:381 +#: lxc/image.go:577 #, c-format msgid "Auto update: %s" msgstr "" -#: lxc/info.go:188 +#: lxc/image.go:651 +#, c-format +msgid "Bad property: %s" +msgstr "" + +#: lxc/info.go:197 msgid "Bytes received" msgstr "" -#: lxc/info.go:189 +#: lxc/info.go:198 msgid "Bytes sent" msgstr "" -#: lxc/config.go:310 +#: lxc/config.go:349 msgid "COMMON NAME" msgstr "" -#: lxc/info.go:152 +#: lxc/info.go:161 msgid "CPU usage (in seconds)" msgstr "" -#: lxc/info.go:156 +#: lxc/info.go:165 msgid "CPU usage:" msgstr "" -#: lxc/list.go:449 +#: lxc/list.go:462 msgid "CREATED AT" msgstr "" -#: lxc/config.go:150 lxc/network.go:496 +#: lxc/file.go:479 +msgid "Can't pull a directory without --recursive" +msgstr "" + +#: lxc/config.go:156 lxc/network.go:542 #, c-format msgid "Can't read from stdin: %s" msgstr "" -#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218 +#: lxc/config.go:169 +#, c-format +msgid "Can't unset key '%s', it's not currently set" +msgstr "" + +#: lxc/config.go:211 lxc/config.go:237 #, c-format msgid "Can't unset key '%s', it's not currently set." msgstr "" -#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579 +#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625 msgid "Cannot provide container name to list" msgstr "" -#: lxc/remote.go:232 +#: lxc/remote.go:228 #, c-format msgid "Certificate fingerprint: %s" msgstr "" -#: lxc/remote.go:305 +#: lxc/remote.go:316 msgid "Client certificate stored at server: " msgstr "" -#: lxc/list.go:133 lxc/list.go:134 +#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129 msgid "Columns" msgstr "" @@ -216,34 +244,34 @@ msgid "Commands:" msgstr "" -#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136 +#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137 msgid "Config key/value to apply to the new container" msgstr "" -#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:746 lxc/network.go:378 lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854 +#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418 lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935 #, c-format msgid "Config parsing error: %s" msgstr "" -#: lxc/main.go:33 +#: lxc/main.go:35 msgid "Connection refused; is LXD running?" msgstr "" -#: lxc/publish.go:62 +#: lxc/publish.go:71 msgid "Container name is mandatory" msgstr "" -#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244 +#: lxc/copy.go:210 lxc/init.go:313 #, c-format msgid "Container name is: %s" msgstr "" -#: lxc/publish.go:160 lxc/publish.go:175 +#: lxc/publish.go:250 #, c-format msgid "Container published with fingerprint: %s" msgstr "" -#: lxc/image.go:137 +#: lxc/image.go:173 msgid "Copy aliases from source" msgstr "" @@ -251,84 +279,89 @@ msgid "Copy the container without its snapshots" msgstr "" -#: lxc/image.go:250 +#: lxc/image.go:422 #, c-format msgid "Copying the image: %s" msgstr "" -#: lxc/remote.go:247 +#: lxc/remote.go:243 msgid "Could not create server cert dir" msgstr "" -#: lxc/file.go:67 lxc/file.go:68 +#: lxc/file.go:69 lxc/file.go:70 msgid "Create any directories necessary" msgstr "" -#: lxc/image.go:356 lxc/info.go:97 +#: lxc/image.go:552 lxc/info.go:106 #, c-format msgid "Created: %s" msgstr "" -#: lxc/init.go:182 lxc/launch.go:142 +#: lxc/init.go:194 #, c-format msgid "Creating %s" msgstr "" -#: lxc/init.go:180 +#: lxc/init.go:192 msgid "Creating the container" msgstr "" -#: lxc/image.go:653 lxc/image.go:694 lxc/list.go:450 lxc/network.go:461 lxc/storage.go:608 lxc/storage.go:697 +#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507 lxc/storage.go:654 lxc/storage.go:749 msgid "DESCRIPTION" msgstr "" -#: lxc/storage.go:609 +#: lxc/storage.go:655 msgid "DRIVER" msgstr "" -#: lxc/publish.go:38 +#: lxc/publish.go:39 msgid "Define a compression algorithm: for image or none" msgstr "" -#: lxc/config.go:688 +#: lxc/config.go:803 #, c-format msgid "Device %s added to %s" msgstr "" -#: lxc/config.go:875 +#: lxc/config.go:1037 #, c-format msgid "Device %s removed from %s" msgstr "" -#: lxc/exec.go:64 -msgid "Disable pseudo-terminal allocation" +#: lxc/utils.go:248 lxc/utils.go:272 +#, c-format +msgid "Device already exists: %s" msgstr "" #: lxc/exec.go:65 +msgid "Disable pseudo-terminal allocation" +msgstr "" + +#: lxc/exec.go:66 msgid "Disable stdin (reads from /dev/null)" msgstr "" -#: lxc/info.go:145 +#: lxc/info.go:154 msgid "Disk usage:" msgstr "" -#: lxc/list.go:601 +#: lxc/list.go:614 msgid "EPHEMERAL" msgstr "" -#: lxc/config.go:312 +#: lxc/config.go:351 msgid "EXPIRY DATE" msgstr "" -#: lxc/main.go:45 +#: lxc/main.go:47 msgid "Enable debug mode" msgstr "" -#: lxc/main.go:44 +#: lxc/main.go:46 msgid "Enable verbose mode" msgstr "" -#: lxc/exec.go:61 +#: lxc/exec.go:62 msgid "Environment variable to set (e.g. HOME=/home/foo)" msgstr "" @@ -336,7 +369,7 @@ msgid "Environment:" msgstr "" -#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140 +#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141 msgid "Ephemeral container" msgstr "" @@ -344,16 +377,21 @@ msgid "Event type to listen for" msgstr "" -#: lxc/image.go:360 +#: lxc/image.go:556 #, c-format msgid "Expires: %s" msgstr "" -#: lxc/image.go:362 +#: lxc/image.go:558 msgid "Expires: never" msgstr "" -#: lxc/config.go:309 lxc/image.go:651 lxc/image.go:693 +#: lxc/image.go:848 +#, c-format +msgid "Exporting the image: %s" +msgstr "" + +#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053 msgid "FINGERPRINT" msgstr "" @@ -367,16 +405,25 @@ msgid "Failed to generate 'lxc.1': %v" msgstr "" -#: lxc/list.go:136 +#: lxc/copy.go:205 +msgid "Failed to get the new container name" +msgstr "" + +#: lxc/file.go:123 +#, c-format +msgid "Failed to walk path for %s: %s" +msgstr "" + +#: lxc/list.go:131 msgid "Fast mode (same as --columns=nsacPt)" msgstr "" -#: lxc/image.go:349 +#: lxc/image.go:545 #, c-format msgid "Fingerprint: %s" msgstr "" -#: lxc/exec.go:63 +#: lxc/exec.go:64 msgid "Force pseudo-terminal allocation" msgstr "" @@ -384,43 +431,39 @@ msgid "Force the container to shutdown" msgstr "" -#: lxc/delete.go:33 lxc/delete.go:34 +#: lxc/delete.go:34 lxc/delete.go:35 msgid "Force the removal of stopped containers" msgstr "" -#: lxc/main.go:46 +#: lxc/main.go:48 msgid "Force using the local unix socket" msgstr "" -#: lxc/image.go:140 -msgid "Format" +#: lxc/image.go:176 lxc/list.go:130 +msgid "Format (csv|json|table|yaml)" msgstr "" -#: lxc/list.go:135 -msgid "Format (table|json|csv)" -msgstr "" - -#: lxc/remote.go:80 +#: lxc/remote.go:81 msgid "Generating a client certificate. This may take a minute..." msgstr "" -#: lxc/list.go:446 +#: lxc/list.go:459 msgid "IPV4" msgstr "" -#: lxc/list.go:447 +#: lxc/list.go:460 msgid "IPV6" msgstr "" -#: lxc/config.go:311 +#: lxc/config.go:350 msgid "ISSUE DATE" msgstr "" -#: lxc/main.go:139 +#: lxc/main.go:153 msgid "If this is your first time using LXD, you should also run: lxd init" msgstr "" -#: lxc/main.go:47 +#: lxc/main.go:49 msgid "Ignore aliases when determining what command to run" msgstr "" @@ -428,244 +471,228 @@ msgid "Ignore the container state (only for start)" msgstr "" -#: lxc/image.go:312 +#: lxc/image.go:508 msgid "Image already up to date." msgstr "" -#: lxc/image.go:253 +#: lxc/image.go:436 msgid "Image copied successfully!" msgstr "" -#: lxc/image.go:436 lxc/image.go:448 +#: lxc/image.go:898 +msgid "Image exported successfully!" +msgstr "" + +#: lxc/image.go:709 #, c-format msgid "Image imported with fingerprint: %s" msgstr "" -#: lxc/image.go:310 +#: lxc/image.go:506 msgid "Image refreshed successfully!" msgstr "" -#: lxc/image.go:433 -#, c-format -msgid "Importing the image: %s" -msgstr "" - -#: lxc/remote.go:150 +#: lxc/remote.go:151 #, c-format msgid "Invalid URL scheme \"%s\" in \"%s\"" msgstr "" -#: lxc/config.go:290 +#: lxc/config.go:329 msgid "Invalid certificate" msgstr "" -#: lxc/init.go:30 lxc/init.go:35 +#: lxc/init.go:31 lxc/init.go:36 msgid "Invalid configuration key" msgstr "" -#: lxc/file.go:357 +#: lxc/file.go:522 #, c-format msgid "Invalid path %s" msgstr "" -#: lxc/file.go:291 +#: lxc/file.go:451 #, c-format msgid "Invalid source %s" msgstr "" -#: lxc/file.go:80 +#: lxc/file.go:224 #, c-format msgid "Invalid target %s" msgstr "" -#: lxc/info.go:126 +#: lxc/info.go:135 msgid "Ips:" msgstr "" -#: lxc/image.go:138 +#: lxc/image.go:174 msgid "Keep the image up to date after initial copy" msgstr "" -#: lxc/list.go:451 +#: lxc/list.go:464 msgid "LAST USED AT" msgstr "" -#: lxc/main.go:31 +#: lxc/main.go:33 msgid "LXD socket not found; is LXD installed and running?" msgstr "" -#: lxc/image.go:365 +#: lxc/image.go:561 #, c-format msgid "Last used: %s" msgstr "" -#: lxc/image.go:367 +#: lxc/image.go:563 msgid "Last used: never" msgstr "" -#: lxc/info.go:241 +#: lxc/info.go:250 msgid "Log:" msgstr "" -#: lxc/network.go:460 +#: lxc/network.go:506 msgid "MANAGED" msgstr "" -#: lxc/image.go:136 +#: lxc/image.go:172 msgid "Make image public" msgstr "" -#: lxc/publish.go:34 +#: lxc/publish.go:35 msgid "Make the image public" msgstr "" -#: lxc/info.go:163 +#: lxc/info.go:172 msgid "Memory (current)" msgstr "" -#: lxc/info.go:167 +#: lxc/info.go:176 msgid "Memory (peak)" msgstr "" -#: lxc/info.go:179 +#: lxc/info.go:188 msgid "Memory usage:" msgstr "" -#: lxc/copy.go:276 -#, c-format -msgid "Migration failed on source host: %s" -msgstr "" - -#: lxc/copy.go:280 -#, c-format -msgid "Migration failed on target host: %s" -msgstr "" - -#: lxc/utils.go:193 +#: lxc/utils.go:199 msgid "Missing summary." msgstr "" -#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462 +#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494 msgid "More than one device matches, specify the device name." msgstr "" -#: lxc/file.go:279 +#: lxc/file.go:438 msgid "More than one file to download, but target is not a directory" msgstr "" -#: lxc/move.go:35 +#: lxc/move.go:38 msgid "Move the container without its snapshots" msgstr "" -#: lxc/action.go:68 +#: lxc/action.go:72 msgid "Must supply container name for: " msgstr "" -#: lxc/list.go:452 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395 lxc/storage.go:607 lxc/storage.go:696 +#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406 lxc/storage.go:653 lxc/storage.go:748 msgid "NAME" msgstr "" -#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374 +#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385 msgid "NO" msgstr "" -#: lxc/info.go:91 +#: lxc/info.go:99 #, c-format msgid "Name: %s" msgstr "" -#: lxc/network.go:222 +#: lxc/network.go:250 #, c-format msgid "Network %s created" msgstr "" -#: lxc/network.go:325 +#: lxc/network.go:366 #, c-format msgid "Network %s deleted" msgstr "" -#: lxc/init.go:141 lxc/init.go:142 +#: lxc/init.go:142 lxc/init.go:143 msgid "Network name" msgstr "" -#: lxc/info.go:196 +#: lxc/info.go:205 msgid "Network usage:" msgstr "" -#: lxc/image.go:139 lxc/publish.go:35 +#: lxc/image.go:175 lxc/publish.go:36 msgid "New alias to define at target" msgstr "" -#: lxc/config.go:321 +#: lxc/config.go:360 msgid "No certificate provided to add" msgstr "" -#: lxc/network.go:257 lxc/network.go:306 +#: lxc/network.go:285 lxc/network.go:338 msgid "No device found for this network" msgstr "" -#: lxc/storage.go:371 lxc/storage.go:471 +#: lxc/storage.go:383 lxc/storage.go:503 msgid "No device found for this storage volume." msgstr "" -#: lxc/config.go:344 +#: lxc/config.go:392 msgid "No fingerprint specified." msgstr "" -#: lxc/storage.go:323 lxc/storage.go:407 +#: lxc/storage.go:327 lxc/storage.go:420 msgid "Only \"custom\" volumes can be attached to containers." msgstr "" -#: lxc/remote.go:135 +#: lxc/remote.go:136 msgid "Only https URLs are supported for simplestreams" msgstr "" -#: lxc/image.go:439 +#: lxc/image.go:632 msgid "Only https:// is supported for remote image import." msgstr "" -#: lxc/network.go:354 lxc/network.go:482 +#: lxc/network.go:394 lxc/network.go:528 msgid "Only managed networks can be modified." msgstr "" -#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163 +#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177 msgid "Options:" msgstr "" -#: lxc/image.go:550 -#, c-format -msgid "Output is in %s" -msgstr "" - -#: lxc/exec.go:62 +#: lxc/exec.go:63 msgid "Override the terminal mode (auto, interactive or non-interactive)" msgstr "" -#: lxc/list.go:603 +#: lxc/list.go:616 msgid "PERSISTENT" msgstr "" -#: lxc/list.go:453 +#: lxc/list.go:466 msgid "PID" msgstr "" -#: lxc/list.go:454 +#: lxc/list.go:467 msgid "PROFILES" msgstr "" -#: lxc/remote.go:397 +#: lxc/remote.go:408 msgid "PROTOCOL" msgstr "" -#: lxc/image.go:652 lxc/remote.go:398 +#: lxc/image.go:229 lxc/remote.go:409 msgid "PUBLIC" msgstr "" -#: lxc/info.go:190 +#: lxc/info.go:199 msgid "Packets received" msgstr "" -#: lxc/info.go:191 +#: lxc/info.go:200 msgid "Packets sent" msgstr "" @@ -677,24 +704,24 @@ msgid "Path to an alternate server directory" msgstr "" -#: lxc/main.go:202 +#: lxc/main.go:216 msgid "Pause containers." msgstr "" -#: lxc/main.go:35 +#: lxc/main.go:37 msgid "Permission denied, are you in the lxd group?" msgstr "" -#: lxc/info.go:108 +#: lxc/info.go:117 #, c-format msgid "Pid: %d" msgstr "" -#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855 +#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936 msgid "Press enter to open the editor again" msgstr "" -#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:747 +#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108 msgid "Press enter to start the editor again" msgstr "" @@ -710,143 +737,143 @@ msgid "Print verbose information" msgstr "" -#: lxc/info.go:132 +#: lxc/info.go:141 #, c-format msgid "Processes: %d" msgstr "" -#: lxc/profile.go:314 +#: lxc/profile.go:344 #, c-format msgid "Profile %s added to %s" msgstr "" -#: lxc/profile.go:209 +#: lxc/profile.go:218 #, c-format msgid "Profile %s created" msgstr "" -#: lxc/profile.go:279 +#: lxc/profile.go:292 #, c-format msgid "Profile %s deleted" msgstr "" -#: lxc/profile.go:345 +#: lxc/profile.go:379 #, c-format msgid "Profile %s removed from %s" msgstr "" -#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138 +#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139 msgid "Profile to apply to the new container" msgstr "" -#: lxc/profile.go:295 +#: lxc/profile.go:321 #, c-format msgid "Profiles %s applied to %s" msgstr "" -#: lxc/info.go:106 +#: lxc/info.go:115 #, c-format msgid "Profiles: %s" msgstr "" -#: lxc/image.go:369 +#: lxc/image.go:565 msgid "Properties:" msgstr "" -#: lxc/remote.go:69 +#: lxc/remote.go:70 msgid "Public image server" msgstr "" -#: lxc/image.go:352 +#: lxc/image.go:548 #, c-format msgid "Public: %s" msgstr "" -#: lxc/file.go:65 lxc/file.go:66 +#: lxc/file.go:67 lxc/file.go:68 msgid "Recursively push or pull files" msgstr "" -#: lxc/image.go:303 +#: lxc/image.go:489 #, c-format msgid "Refreshing the image: %s" msgstr "" -#: lxc/remote.go:67 +#: lxc/remote.go:68 msgid "Remote admin password" msgstr "" -#: lxc/info.go:93 +#: lxc/info.go:101 #, c-format msgid "Remote: %s" msgstr "" -#: lxc/delete.go:41 +#: lxc/delete.go:42 #, c-format msgid "Remove %s (yes/no): " msgstr "" -#: lxc/delete.go:35 lxc/delete.go:36 +#: lxc/delete.go:36 lxc/delete.go:37 msgid "Require user confirmation" msgstr "" -#: lxc/info.go:129 +#: lxc/info.go:138 msgid "Resources:" msgstr "" -#: lxc/main.go:210 +#: lxc/main.go:224 msgid "Restart containers." msgstr "" -#: lxc/init.go:253 +#: lxc/init.go:286 #, c-format msgid "Retrieving image: %s" msgstr "" -#: lxc/image.go:655 +#: lxc/image.go:232 msgid "SIZE" msgstr "" -#: lxc/list.go:455 +#: lxc/list.go:468 msgid "SNAPSHOTS" msgstr "" -#: lxc/storage.go:610 +#: lxc/storage.go:656 msgid "SOURCE" msgstr "" -#: lxc/list.go:456 +#: lxc/list.go:469 msgid "STATE" msgstr "" -#: lxc/remote.go:399 +#: lxc/remote.go:410 msgid "STATIC" msgstr "" -#: lxc/list.go:458 +#: lxc/list.go:471 msgid "STORAGE POOL" msgstr "" -#: lxc/remote.go:240 +#: lxc/remote.go:236 msgid "Server certificate NACKed by user" msgstr "" -#: lxc/remote.go:302 +#: lxc/remote.go:313 msgid "Server doesn't trust us after adding our cert" msgstr "" -#: lxc/remote.go:68 +#: lxc/remote.go:69 msgid "Server protocol (lxd or simplestreams)" msgstr "" -#: lxc/file.go:63 +#: lxc/file.go:65 msgid "Set the file's gid on push" msgstr "" -#: lxc/file.go:64 +#: lxc/file.go:66 msgid "Set the file's perms on push" msgstr "" -#: lxc/file.go:62 +#: lxc/file.go:64 msgid "Set the file's uid on push" msgstr "" @@ -858,78 +885,83 @@ msgid "Show client version" msgstr "" -#: lxc/info.go:38 +#: lxc/info.go:39 msgid "Show the container's last 100 log lines?" msgstr "" -#: lxc/config.go:33 +#: lxc/config.go:35 msgid "Show the expanded configuration" msgstr "" -#: lxc/image.go:350 +#: lxc/image.go:546 #, c-format msgid "Size: %.2fMB" msgstr "" -#: lxc/info.go:210 +#: lxc/info.go:219 msgid "Snapshots:" msgstr "" -#: lxc/action.go:134 +#: lxc/action.go:142 #, c-format msgid "Some containers failed to %s" msgstr "" -#: lxc/image.go:383 +#: lxc/image.go:579 msgid "Source:" msgstr "" -#: lxc/main.go:220 +#: lxc/main.go:234 msgid "Start containers." msgstr "" -#: lxc/launch.go:152 +#: lxc/launch.go:59 #, c-format msgid "Starting %s" msgstr "" -#: lxc/info.go:100 +#: lxc/info.go:109 #, c-format msgid "Status: %s" msgstr "" -#: lxc/main.go:226 +#: lxc/main.go:240 msgid "Stop containers." msgstr "" -#: lxc/publish.go:36 lxc/publish.go:37 +#: lxc/publish.go:37 lxc/publish.go:38 msgid "Stop the container if currently running" msgstr "" -#: lxc/delete.go:105 lxc/publish.go:114 +#: lxc/publish.go:136 msgid "Stopping container failed!" msgstr "" -#: lxc/storage.go:436 +#: lxc/delete.go:121 +#, c-format +msgid "Stopping the container failed: %s" +msgstr "" + +#: lxc/storage.go:468 #, c-format msgid "Storage pool %s created" msgstr "" -#: lxc/storage.go:486 +#: lxc/storage.go:527 #, c-format msgid "Storage pool %s deleted" msgstr "" -#: lxc/init.go:143 lxc/init.go:144 +#: lxc/init.go:144 lxc/init.go:145 msgid "Storage pool name" msgstr "" -#: lxc/storage.go:720 +#: lxc/storage.go:782 #, c-format msgid "Storage volume %s created" msgstr "" -#: lxc/storage.go:730 +#: lxc/storage.go:797 #, c-format msgid "Storage volume %s deleted" msgstr "" @@ -938,35 +970,39 @@ msgid "Store the container state (only for stop)" msgstr "" -#: lxc/info.go:171 +#: lxc/info.go:180 msgid "Swap (current)" msgstr "" -#: lxc/info.go:175 +#: lxc/info.go:184 msgid "Swap (peak)" msgstr "" -#: lxc/list.go:457 lxc/network.go:459 lxc/storage.go:695 +#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747 msgid "TYPE" msgstr "" -#: lxc/delete.go:91 +#: lxc/delete.go:105 msgid "The container is currently running, stop it first or pass --force." msgstr "" -#: lxc/publish.go:92 +#: lxc/publish.go:101 msgid "The container is currently running. Use --force to have it stopped and restarted." msgstr "" -#: lxc/init.go:326 +#: lxc/init.go:358 msgid "The container you are starting doesn't have any network attached to it." msgstr "" -#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779 lxc/config.go:817 lxc/config.go:835 +#: lxc/config.go:770 lxc/config.go:787 +msgid "The device already exists" +msgstr "" + +#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899 lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022 msgid "The device doesn't exist" msgstr "" -#: lxc/init.go:310 +#: lxc/init.go:342 #, c-format msgid "The local image '%s' couldn't be found, trying '%s:' instead." msgstr "" @@ -975,15 +1011,15 @@ msgid "The opposite of \"lxc pause\" is \"lxc start\"." msgstr "" -#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476 +#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508 msgid "The specified device doesn't exist" msgstr "" -#: lxc/network.go:266 lxc/network.go:315 +#: lxc/network.go:294 lxc/network.go:347 msgid "The specified device doesn't match the network" msgstr "" -#: lxc/publish.go:65 +#: lxc/publish.go:74 msgid "There is no \"image name\". Did you want an alias?" msgstr "" @@ -998,49 +1034,49 @@ msgid "Time to wait for the container before killing it" msgstr "" -#: lxc/image.go:353 +#: lxc/image.go:549 msgid "Timestamps:" msgstr "" -#: lxc/init.go:328 +#: lxc/init.go:360 msgid "To attach a network to a container, use: lxc network attach" msgstr "" -#: lxc/init.go:327 +#: lxc/init.go:359 msgid "To create a new network, use: lxc network create" msgstr "" -#: lxc/main.go:140 +#: lxc/main.go:154 msgid "To start your first container, try: lxc launch ubuntu:16.04" msgstr "" -#: lxc/image.go:441 +#: lxc/image.go:657 #, c-format msgid "Transferring image: %s" msgstr "" -#: lxc/action.go:98 lxc/launch.go:165 +#: lxc/action.go:106 lxc/launch.go:77 #, c-format msgid "Try `lxc info --show-log %s` for more info" msgstr "" -#: lxc/info.go:102 +#: lxc/info.go:111 msgid "Type: ephemeral" msgstr "" -#: lxc/info.go:104 +#: lxc/info.go:113 msgid "Type: persistent" msgstr "" -#: lxc/image.go:656 +#: lxc/image.go:233 msgid "UPLOAD DATE" msgstr "" -#: lxc/remote.go:396 +#: lxc/remote.go:407 msgid "URL" msgstr "" -#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698 +#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750 msgid "USED BY" msgstr "" @@ -1048,11 +1084,16 @@ msgid "Unable to find help2man." msgstr "" -#: lxc/remote.go:110 +#: lxc/remote.go:111 msgid "Unable to read remote TLS certificate" msgstr "" -#: lxc/image.go:358 +#: lxc/file.go:111 +#, c-format +msgid "Unknown file type '%s'" +msgstr "" + +#: lxc/image.go:554 #, c-format msgid "Uploaded: %s" msgstr "" @@ -1068,7 +1109,7 @@ msgid "Usage: lxc [options]" msgstr "" -#: lxc/config.go:58 +#: lxc/config.go:60 msgid "Usage: lxc config [options]\n" "\n" "Change container or server configuration options.\n" @@ -1148,13 +1189,13 @@ "Copy containers within or in between LXD instances." msgstr "" -#: lxc/delete.go:26 +#: lxc/delete.go:27 msgid "Usage: lxc delete [:][/] [[:][/]...]\n" "\n" "Delete containers and snapshots." msgstr "" -#: lxc/exec.go:52 +#: lxc/exec.go:53 msgid "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|interactive|non-interactive] [--env KEY=VALUE...] [--] \n" "\n" "Execute commands in containers.\n" @@ -1162,7 +1203,7 @@ "Mode defaults to non-interactive, interactive mode is selected if both stdin AND stdout are terminals (stderr is ignored)." msgstr "" -#: lxc/file.go:36 +#: lxc/file.go:38 msgid "Usage: lxc file [options]\n" "\n" "Manage files in containers.\n" @@ -1199,7 +1240,7 @@ "Help page for the LXD client." msgstr "" -#: lxc/image.go:62 +#: lxc/image.go:72 msgid "Usage: lxc image [options]\n" "\n" "Manipulate container images.\n" @@ -1249,11 +1290,35 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" - "lxc image list [:] [filter] [--format table|json]\n" + "lxc image list [:] [filter] [--format csv|json|table|yaml] [-c ]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" + " The -c option takes a (optionally comma-separated) list of arguments that\n" + " control which image attributes to output when displaying in table or csv\n" + " format.\n" + "\n" + " Default column layout is: lfpdasu\n" + "\n" + " Column shorthand chars:\n" + "\n" + " l - Shortest image alias (and optionally number of other aliases)\n" + "\n" + " L - Newline-separated list of all image aliases\n" + "\n" + " f - Fingerprint\n" + "\n" + " p - Whether image is public\n" + "\n" + " d - Description\n" + "\n" + " a - Architecture\n" + "\n" + " s - Size\n" + "\n" + " u - Upload date\n" + "\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1272,7 +1337,7 @@ " List the aliases. Filters may be part of the image hash or part of the image alias name." msgstr "" -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "Usage: lxc info [:][] [--show-log]\n" "\n" "Show container or server information.\n" @@ -1284,7 +1349,7 @@ " For LXD server information." msgstr "" -#: lxc/init.go:75 +#: lxc/init.go:76 msgid "Usage: lxc init [:] [:][] [--ephemeral|-e] [--profile|-p ...] [--config|-c ...] [--network|-n ] [--storage|-s ]\n" "\n" "Create containers from images.\n" @@ -1296,7 +1361,7 @@ " lxc init ubuntu:16.04 u1" msgstr "" -#: lxc/launch.go:23 +#: lxc/launch.go:20 msgid "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--profile|-p ...] [--config|-c ...] [--network|-n ] [--storage|-s ]\n" "\n" "Create and start containers from images.\n" @@ -1308,8 +1373,8 @@ " lxc launch ubuntu:16.04 u1" msgstr "" -#: lxc/list.go:49 -msgid "Usage: lxc list [:] [filters] [--format table|json|csv] [-c ] [--fast]\n" +#: lxc/list.go:44 +msgid "Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c ] [--fast]\n" "\n" "List the existing containers.\n" "\n" @@ -1411,7 +1476,7 @@ " Only show log message." msgstr "" -#: lxc/move.go:19 +#: lxc/move.go:22 msgid "Usage: lxc move [:][/] [:][[/]] [--container-only]\n" "\n" "Move containers within or in between LXD instances.\n" @@ -1426,7 +1491,7 @@ " Rename a snapshot." msgstr "" -#: lxc/network.go:49 +#: lxc/network.go:50 msgid "Usage: lxc network [options]\n" "\n" "Manage and attach containers to networks.\n" @@ -1472,7 +1537,7 @@ " Update a network using the content of network.yaml" msgstr "" -#: lxc/profile.go:49 +#: lxc/profile.go:51 msgid "Usage: lxc profile [options]\n" "\n" "Manage container configuration profiles.\n" @@ -1551,13 +1616,13 @@ " Remove all profile from \"foo\"" msgstr "" -#: lxc/publish.go:27 +#: lxc/publish.go:28 msgid "Usage: lxc publish [:][/] [:] [--alias=ALIAS...] [prop-key=prop-value...]\n" "\n" "Publish containers as images." msgstr "" -#: lxc/remote.go:38 +#: lxc/remote.go:39 msgid "Usage: lxc remote [options]\n" "\n" "Manage the list of remote LXD servers.\n" @@ -1584,7 +1649,7 @@ " Print the default remote." msgstr "" -#: lxc/restore.go:21 +#: lxc/restore.go:22 msgid "Usage: lxc restore [:] [--stateful]\n" "\n" "Restore containers from snapshots.\n" @@ -1599,7 +1664,7 @@ " Restore the snapshot." msgstr "" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 msgid "Usage: lxc snapshot [:] [--stateful]\n" "\n" "Create container snapshots.\n" @@ -1612,7 +1677,7 @@ " Create a snapshot of \"u1\" called \"snap0\"." msgstr "" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "Usage: lxc storage [options]\n" "\n" "Manage storage pools and volumes.\n" @@ -1701,155 +1766,127 @@ "Print the version number of this client tool." msgstr "" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "" -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "Whether or not to restore the container's running state from snapshot (if available)" msgstr "" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "" -#: lxc/exec.go:129 +#: lxc/exec.go:130 msgid "You can't pass -t or -T at the same time as --mode" msgstr "" -#: lxc/main.go:56 -msgid "`lxc config profile` is deprecated, please use `lxc profile`" +#: lxc/copy.go:57 +msgid "You must specify a source container name" msgstr "" -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "" - -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" -msgstr "" - -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" +#: lxc/main.go:58 +msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "" -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, c-format msgid "error: %v" msgstr "" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, c-format msgid "error: unknown command: %s" msgstr "" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" msgstr "" -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "" - -#: lxc/remote.go:233 +#: lxc/remote.go:229 msgid "ok (y/n)?" msgstr "" -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" msgstr "" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" msgstr "" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" msgstr "" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" msgstr "" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" msgstr "" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" msgstr "" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" msgstr "" -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "" - -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" msgstr "" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" msgstr "" -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "" - diff -Nru lxd-2.14/po/nl.po lxd-2.15/po/nl.po --- lxd-2.14/po/nl.po 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/nl.po 2017-06-28 03:00:23.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2017-05-30 14:59-0400\n" +"POT-Creation-Date: 2017-06-27 00:23-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -16,7 +16,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: lxc/storage.go:30 +#: lxc/storage.go:31 msgid "" "### This is a yaml representation of a storage pool.\n" "### Any line starting with a '# will be ignored.\n" @@ -33,7 +33,7 @@ "### zfs.pool_name: default" msgstr "" -#: lxc/storage.go:47 +#: lxc/storage.go:48 msgid "" "### This is a yaml representation of a storage volume.\n" "### Any line starting with a '# will be ignored.\n" @@ -47,7 +47,7 @@ "### size: \"61203283968\"" msgstr "" -#: lxc/config.go:37 +#: lxc/config.go:39 msgid "" "### This is a yaml representation of the configuration.\n" "### Any line starting with a '# will be ignored.\n" @@ -68,7 +68,7 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:52 +#: lxc/image.go:62 msgid "" "### This is a yaml representation of the image properties.\n" "### Any line starting with a '# will be ignored.\n" @@ -78,7 +78,7 @@ "### description: My custom image" msgstr "" -#: lxc/network.go:29 +#: lxc/network.go:30 msgid "" "### This is a yaml representation of the network.\n" "### Any line starting with a '# will be ignored.\n" @@ -98,7 +98,7 @@ "### Note that only the configuration can be changed." msgstr "" -#: lxc/profile.go:28 +#: lxc/profile.go:30 msgid "" "### This is a yaml representation of the profile.\n" "### Any line starting with a '# will be ignored.\n" @@ -119,102 +119,130 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:629 +#: lxc/image.go:182 #, c-format msgid "%s (%d more)" msgstr "" -#: lxc/snapshot.go:58 +#: lxc/file.go:186 +#, c-format +msgid "%s is not a directory" +msgstr "" + +#: lxc/file.go:128 +#, c-format +msgid "'%s' isn't a regular file or directory." +msgstr "" + +#: lxc/snapshot.go:53 msgid "'/' not allowed in snapshot name" msgstr "" -#: lxc/profile.go:293 +#: lxc/profile.go:319 msgid "(none)" msgstr "" -#: lxc/image.go:650 lxc/image.go:692 +#: lxc/image.go:226 lxc/image.go:1052 msgid "ALIAS" msgstr "" -#: lxc/image.go:654 +#: lxc/image.go:227 +msgid "ALIASES" +msgstr "" + +#: lxc/image.go:231 msgid "ARCH" msgstr "" -#: lxc/list.go:448 +#: lxc/list.go:461 msgid "ARCHITECTURE" msgstr "" -#: lxc/remote.go:66 +#: lxc/remote.go:67 msgid "Accept certificate" msgstr "" -#: lxc/remote.go:282 +#: lxc/remote.go:281 #, c-format msgid "Admin password for %s: " msgstr "" -#: lxc/image.go:373 +#: lxc/image.go:569 msgid "Aliases:" msgstr "" -#: lxc/image.go:351 lxc/info.go:95 +#: lxc/image.go:547 lxc/info.go:104 #, c-format msgid "Architecture: %s" msgstr "" -#: lxc/image.go:381 +#: lxc/image.go:577 #, c-format msgid "Auto update: %s" msgstr "" -#: lxc/info.go:188 +#: lxc/image.go:651 +#, c-format +msgid "Bad property: %s" +msgstr "" + +#: lxc/info.go:197 msgid "Bytes received" msgstr "" -#: lxc/info.go:189 +#: lxc/info.go:198 msgid "Bytes sent" msgstr "" -#: lxc/config.go:310 +#: lxc/config.go:349 msgid "COMMON NAME" msgstr "" -#: lxc/info.go:152 +#: lxc/info.go:161 msgid "CPU usage (in seconds)" msgstr "" -#: lxc/info.go:156 +#: lxc/info.go:165 msgid "CPU usage:" msgstr "" -#: lxc/list.go:449 +#: lxc/list.go:462 msgid "CREATED AT" msgstr "" -#: lxc/config.go:150 lxc/network.go:496 +#: lxc/file.go:479 +msgid "Can't pull a directory without --recursive" +msgstr "" + +#: lxc/config.go:156 lxc/network.go:542 #, c-format msgid "Can't read from stdin: %s" msgstr "" -#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218 +#: lxc/config.go:169 +#, c-format +msgid "Can't unset key '%s', it's not currently set" +msgstr "" + +#: lxc/config.go:211 lxc/config.go:237 #, c-format msgid "Can't unset key '%s', it's not currently set." msgstr "" -#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579 +#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625 msgid "Cannot provide container name to list" msgstr "" -#: lxc/remote.go:232 +#: lxc/remote.go:228 #, c-format msgid "Certificate fingerprint: %s" msgstr "" -#: lxc/remote.go:305 +#: lxc/remote.go:316 msgid "Client certificate stored at server: " msgstr "" -#: lxc/list.go:133 lxc/list.go:134 +#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129 msgid "Columns" msgstr "" @@ -222,35 +250,35 @@ msgid "Commands:" msgstr "" -#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136 +#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137 msgid "Config key/value to apply to the new container" msgstr "" -#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:746 lxc/network.go:378 -#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854 +#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418 +#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935 #, c-format msgid "Config parsing error: %s" msgstr "" -#: lxc/main.go:33 +#: lxc/main.go:35 msgid "Connection refused; is LXD running?" msgstr "" -#: lxc/publish.go:62 +#: lxc/publish.go:71 msgid "Container name is mandatory" msgstr "" -#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244 +#: lxc/copy.go:210 lxc/init.go:313 #, c-format msgid "Container name is: %s" msgstr "" -#: lxc/publish.go:160 lxc/publish.go:175 +#: lxc/publish.go:250 #, c-format msgid "Container published with fingerprint: %s" msgstr "" -#: lxc/image.go:137 +#: lxc/image.go:173 msgid "Copy aliases from source" msgstr "" @@ -258,85 +286,90 @@ msgid "Copy the container without its snapshots" msgstr "" -#: lxc/image.go:250 +#: lxc/image.go:422 #, c-format msgid "Copying the image: %s" msgstr "" -#: lxc/remote.go:247 +#: lxc/remote.go:243 msgid "Could not create server cert dir" msgstr "" -#: lxc/file.go:67 lxc/file.go:68 +#: lxc/file.go:69 lxc/file.go:70 msgid "Create any directories necessary" msgstr "" -#: lxc/image.go:356 lxc/info.go:97 +#: lxc/image.go:552 lxc/info.go:106 #, c-format msgid "Created: %s" msgstr "" -#: lxc/init.go:182 lxc/launch.go:142 +#: lxc/init.go:194 #, c-format msgid "Creating %s" msgstr "" -#: lxc/init.go:180 +#: lxc/init.go:192 msgid "Creating the container" msgstr "" -#: lxc/image.go:653 lxc/image.go:694 lxc/list.go:450 lxc/network.go:461 -#: lxc/storage.go:608 lxc/storage.go:697 +#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507 +#: lxc/storage.go:654 lxc/storage.go:749 msgid "DESCRIPTION" msgstr "" -#: lxc/storage.go:609 +#: lxc/storage.go:655 msgid "DRIVER" msgstr "" -#: lxc/publish.go:38 +#: lxc/publish.go:39 msgid "Define a compression algorithm: for image or none" msgstr "" -#: lxc/config.go:688 +#: lxc/config.go:803 #, c-format msgid "Device %s added to %s" msgstr "" -#: lxc/config.go:875 +#: lxc/config.go:1037 #, c-format msgid "Device %s removed from %s" msgstr "" -#: lxc/exec.go:64 -msgid "Disable pseudo-terminal allocation" +#: lxc/utils.go:248 lxc/utils.go:272 +#, c-format +msgid "Device already exists: %s" msgstr "" #: lxc/exec.go:65 +msgid "Disable pseudo-terminal allocation" +msgstr "" + +#: lxc/exec.go:66 msgid "Disable stdin (reads from /dev/null)" msgstr "" -#: lxc/info.go:145 +#: lxc/info.go:154 msgid "Disk usage:" msgstr "" -#: lxc/list.go:601 +#: lxc/list.go:614 msgid "EPHEMERAL" msgstr "" -#: lxc/config.go:312 +#: lxc/config.go:351 msgid "EXPIRY DATE" msgstr "" -#: lxc/main.go:45 +#: lxc/main.go:47 msgid "Enable debug mode" msgstr "" -#: lxc/main.go:44 +#: lxc/main.go:46 msgid "Enable verbose mode" msgstr "" -#: lxc/exec.go:61 +#: lxc/exec.go:62 msgid "Environment variable to set (e.g. HOME=/home/foo)" msgstr "" @@ -344,7 +377,7 @@ msgid "Environment:" msgstr "" -#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140 +#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141 msgid "Ephemeral container" msgstr "" @@ -352,16 +385,21 @@ msgid "Event type to listen for" msgstr "" -#: lxc/image.go:360 +#: lxc/image.go:556 #, c-format msgid "Expires: %s" msgstr "" -#: lxc/image.go:362 +#: lxc/image.go:558 msgid "Expires: never" msgstr "" -#: lxc/config.go:309 lxc/image.go:651 lxc/image.go:693 +#: lxc/image.go:848 +#, c-format +msgid "Exporting the image: %s" +msgstr "" + +#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053 msgid "FINGERPRINT" msgstr "" @@ -375,16 +413,25 @@ msgid "Failed to generate 'lxc.1': %v" msgstr "" -#: lxc/list.go:136 +#: lxc/copy.go:205 +msgid "Failed to get the new container name" +msgstr "" + +#: lxc/file.go:123 +#, c-format +msgid "Failed to walk path for %s: %s" +msgstr "" + +#: lxc/list.go:131 msgid "Fast mode (same as --columns=nsacPt)" msgstr "" -#: lxc/image.go:349 +#: lxc/image.go:545 #, c-format msgid "Fingerprint: %s" msgstr "" -#: lxc/exec.go:63 +#: lxc/exec.go:64 msgid "Force pseudo-terminal allocation" msgstr "" @@ -392,43 +439,39 @@ msgid "Force the container to shutdown" msgstr "" -#: lxc/delete.go:33 lxc/delete.go:34 +#: lxc/delete.go:34 lxc/delete.go:35 msgid "Force the removal of stopped containers" msgstr "" -#: lxc/main.go:46 +#: lxc/main.go:48 msgid "Force using the local unix socket" msgstr "" -#: lxc/image.go:140 -msgid "Format" +#: lxc/image.go:176 lxc/list.go:130 +msgid "Format (csv|json|table|yaml)" msgstr "" -#: lxc/list.go:135 -msgid "Format (table|json|csv)" -msgstr "" - -#: lxc/remote.go:80 +#: lxc/remote.go:81 msgid "Generating a client certificate. This may take a minute..." msgstr "" -#: lxc/list.go:446 +#: lxc/list.go:459 msgid "IPV4" msgstr "" -#: lxc/list.go:447 +#: lxc/list.go:460 msgid "IPV6" msgstr "" -#: lxc/config.go:311 +#: lxc/config.go:350 msgid "ISSUE DATE" msgstr "" -#: lxc/main.go:139 +#: lxc/main.go:153 msgid "If this is your first time using LXD, you should also run: lxd init" msgstr "" -#: lxc/main.go:47 +#: lxc/main.go:49 msgid "Ignore aliases when determining what command to run" msgstr "" @@ -436,245 +479,229 @@ msgid "Ignore the container state (only for start)" msgstr "" -#: lxc/image.go:312 +#: lxc/image.go:508 msgid "Image already up to date." msgstr "" -#: lxc/image.go:253 +#: lxc/image.go:436 msgid "Image copied successfully!" msgstr "" -#: lxc/image.go:436 lxc/image.go:448 +#: lxc/image.go:898 +msgid "Image exported successfully!" +msgstr "" + +#: lxc/image.go:709 #, c-format msgid "Image imported with fingerprint: %s" msgstr "" -#: lxc/image.go:310 +#: lxc/image.go:506 msgid "Image refreshed successfully!" msgstr "" -#: lxc/image.go:433 -#, c-format -msgid "Importing the image: %s" -msgstr "" - -#: lxc/remote.go:150 +#: lxc/remote.go:151 #, c-format msgid "Invalid URL scheme \"%s\" in \"%s\"" msgstr "" -#: lxc/config.go:290 +#: lxc/config.go:329 msgid "Invalid certificate" msgstr "" -#: lxc/init.go:30 lxc/init.go:35 +#: lxc/init.go:31 lxc/init.go:36 msgid "Invalid configuration key" msgstr "" -#: lxc/file.go:357 +#: lxc/file.go:522 #, c-format msgid "Invalid path %s" msgstr "" -#: lxc/file.go:291 +#: lxc/file.go:451 #, c-format msgid "Invalid source %s" msgstr "" -#: lxc/file.go:80 +#: lxc/file.go:224 #, c-format msgid "Invalid target %s" msgstr "" -#: lxc/info.go:126 +#: lxc/info.go:135 msgid "Ips:" msgstr "" -#: lxc/image.go:138 +#: lxc/image.go:174 msgid "Keep the image up to date after initial copy" msgstr "" -#: lxc/list.go:451 +#: lxc/list.go:464 msgid "LAST USED AT" msgstr "" -#: lxc/main.go:31 +#: lxc/main.go:33 msgid "LXD socket not found; is LXD installed and running?" msgstr "" -#: lxc/image.go:365 +#: lxc/image.go:561 #, c-format msgid "Last used: %s" msgstr "" -#: lxc/image.go:367 +#: lxc/image.go:563 msgid "Last used: never" msgstr "" -#: lxc/info.go:241 +#: lxc/info.go:250 msgid "Log:" msgstr "" -#: lxc/network.go:460 +#: lxc/network.go:506 msgid "MANAGED" msgstr "" -#: lxc/image.go:136 +#: lxc/image.go:172 msgid "Make image public" msgstr "" -#: lxc/publish.go:34 +#: lxc/publish.go:35 msgid "Make the image public" msgstr "" -#: lxc/info.go:163 +#: lxc/info.go:172 msgid "Memory (current)" msgstr "" -#: lxc/info.go:167 +#: lxc/info.go:176 msgid "Memory (peak)" msgstr "" -#: lxc/info.go:179 +#: lxc/info.go:188 msgid "Memory usage:" msgstr "" -#: lxc/copy.go:276 -#, c-format -msgid "Migration failed on source host: %s" -msgstr "" - -#: lxc/copy.go:280 -#, c-format -msgid "Migration failed on target host: %s" -msgstr "" - -#: lxc/utils.go:193 +#: lxc/utils.go:199 msgid "Missing summary." msgstr "" -#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462 +#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494 msgid "More than one device matches, specify the device name." msgstr "" -#: lxc/file.go:279 +#: lxc/file.go:438 msgid "More than one file to download, but target is not a directory" msgstr "" -#: lxc/move.go:35 +#: lxc/move.go:38 msgid "Move the container without its snapshots" msgstr "" -#: lxc/action.go:68 +#: lxc/action.go:72 msgid "Must supply container name for: " msgstr "" -#: lxc/list.go:452 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395 -#: lxc/storage.go:607 lxc/storage.go:696 +#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406 +#: lxc/storage.go:653 lxc/storage.go:748 msgid "NAME" msgstr "" -#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374 +#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385 msgid "NO" msgstr "" -#: lxc/info.go:91 +#: lxc/info.go:99 #, c-format msgid "Name: %s" msgstr "" -#: lxc/network.go:222 +#: lxc/network.go:250 #, c-format msgid "Network %s created" msgstr "" -#: lxc/network.go:325 +#: lxc/network.go:366 #, c-format msgid "Network %s deleted" msgstr "" -#: lxc/init.go:141 lxc/init.go:142 +#: lxc/init.go:142 lxc/init.go:143 msgid "Network name" msgstr "" -#: lxc/info.go:196 +#: lxc/info.go:205 msgid "Network usage:" msgstr "" -#: lxc/image.go:139 lxc/publish.go:35 +#: lxc/image.go:175 lxc/publish.go:36 msgid "New alias to define at target" msgstr "" -#: lxc/config.go:321 +#: lxc/config.go:360 msgid "No certificate provided to add" msgstr "" -#: lxc/network.go:257 lxc/network.go:306 +#: lxc/network.go:285 lxc/network.go:338 msgid "No device found for this network" msgstr "" -#: lxc/storage.go:371 lxc/storage.go:471 +#: lxc/storage.go:383 lxc/storage.go:503 msgid "No device found for this storage volume." msgstr "" -#: lxc/config.go:344 +#: lxc/config.go:392 msgid "No fingerprint specified." msgstr "" -#: lxc/storage.go:323 lxc/storage.go:407 +#: lxc/storage.go:327 lxc/storage.go:420 msgid "Only \"custom\" volumes can be attached to containers." msgstr "" -#: lxc/remote.go:135 +#: lxc/remote.go:136 msgid "Only https URLs are supported for simplestreams" msgstr "" -#: lxc/image.go:439 +#: lxc/image.go:632 msgid "Only https:// is supported for remote image import." msgstr "" -#: lxc/network.go:354 lxc/network.go:482 +#: lxc/network.go:394 lxc/network.go:528 msgid "Only managed networks can be modified." msgstr "" -#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163 +#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177 msgid "Options:" msgstr "" -#: lxc/image.go:550 -#, c-format -msgid "Output is in %s" -msgstr "" - -#: lxc/exec.go:62 +#: lxc/exec.go:63 msgid "Override the terminal mode (auto, interactive or non-interactive)" msgstr "" -#: lxc/list.go:603 +#: lxc/list.go:616 msgid "PERSISTENT" msgstr "" -#: lxc/list.go:453 +#: lxc/list.go:466 msgid "PID" msgstr "" -#: lxc/list.go:454 +#: lxc/list.go:467 msgid "PROFILES" msgstr "" -#: lxc/remote.go:397 +#: lxc/remote.go:408 msgid "PROTOCOL" msgstr "" -#: lxc/image.go:652 lxc/remote.go:398 +#: lxc/image.go:229 lxc/remote.go:409 msgid "PUBLIC" msgstr "" -#: lxc/info.go:190 +#: lxc/info.go:199 msgid "Packets received" msgstr "" -#: lxc/info.go:191 +#: lxc/info.go:200 msgid "Packets sent" msgstr "" @@ -686,24 +713,24 @@ msgid "Path to an alternate server directory" msgstr "" -#: lxc/main.go:202 +#: lxc/main.go:216 msgid "Pause containers." msgstr "" -#: lxc/main.go:35 +#: lxc/main.go:37 msgid "Permission denied, are you in the lxd group?" msgstr "" -#: lxc/info.go:108 +#: lxc/info.go:117 #, c-format msgid "Pid: %d" msgstr "" -#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855 +#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936 msgid "Press enter to open the editor again" msgstr "" -#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:747 +#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108 msgid "Press enter to start the editor again" msgstr "" @@ -719,143 +746,143 @@ msgid "Print verbose information" msgstr "" -#: lxc/info.go:132 +#: lxc/info.go:141 #, c-format msgid "Processes: %d" msgstr "" -#: lxc/profile.go:314 +#: lxc/profile.go:344 #, c-format msgid "Profile %s added to %s" msgstr "" -#: lxc/profile.go:209 +#: lxc/profile.go:218 #, c-format msgid "Profile %s created" msgstr "" -#: lxc/profile.go:279 +#: lxc/profile.go:292 #, c-format msgid "Profile %s deleted" msgstr "" -#: lxc/profile.go:345 +#: lxc/profile.go:379 #, c-format msgid "Profile %s removed from %s" msgstr "" -#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138 +#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139 msgid "Profile to apply to the new container" msgstr "" -#: lxc/profile.go:295 +#: lxc/profile.go:321 #, c-format msgid "Profiles %s applied to %s" msgstr "" -#: lxc/info.go:106 +#: lxc/info.go:115 #, c-format msgid "Profiles: %s" msgstr "" -#: lxc/image.go:369 +#: lxc/image.go:565 msgid "Properties:" msgstr "" -#: lxc/remote.go:69 +#: lxc/remote.go:70 msgid "Public image server" msgstr "" -#: lxc/image.go:352 +#: lxc/image.go:548 #, c-format msgid "Public: %s" msgstr "" -#: lxc/file.go:65 lxc/file.go:66 +#: lxc/file.go:67 lxc/file.go:68 msgid "Recursively push or pull files" msgstr "" -#: lxc/image.go:303 +#: lxc/image.go:489 #, c-format msgid "Refreshing the image: %s" msgstr "" -#: lxc/remote.go:67 +#: lxc/remote.go:68 msgid "Remote admin password" msgstr "" -#: lxc/info.go:93 +#: lxc/info.go:101 #, c-format msgid "Remote: %s" msgstr "" -#: lxc/delete.go:41 +#: lxc/delete.go:42 #, c-format msgid "Remove %s (yes/no): " msgstr "" -#: lxc/delete.go:35 lxc/delete.go:36 +#: lxc/delete.go:36 lxc/delete.go:37 msgid "Require user confirmation" msgstr "" -#: lxc/info.go:129 +#: lxc/info.go:138 msgid "Resources:" msgstr "" -#: lxc/main.go:210 +#: lxc/main.go:224 msgid "Restart containers." msgstr "" -#: lxc/init.go:253 +#: lxc/init.go:286 #, c-format msgid "Retrieving image: %s" msgstr "" -#: lxc/image.go:655 +#: lxc/image.go:232 msgid "SIZE" msgstr "" -#: lxc/list.go:455 +#: lxc/list.go:468 msgid "SNAPSHOTS" msgstr "" -#: lxc/storage.go:610 +#: lxc/storage.go:656 msgid "SOURCE" msgstr "" -#: lxc/list.go:456 +#: lxc/list.go:469 msgid "STATE" msgstr "" -#: lxc/remote.go:399 +#: lxc/remote.go:410 msgid "STATIC" msgstr "" -#: lxc/list.go:458 +#: lxc/list.go:471 msgid "STORAGE POOL" msgstr "" -#: lxc/remote.go:240 +#: lxc/remote.go:236 msgid "Server certificate NACKed by user" msgstr "" -#: lxc/remote.go:302 +#: lxc/remote.go:313 msgid "Server doesn't trust us after adding our cert" msgstr "" -#: lxc/remote.go:68 +#: lxc/remote.go:69 msgid "Server protocol (lxd or simplestreams)" msgstr "" -#: lxc/file.go:63 +#: lxc/file.go:65 msgid "Set the file's gid on push" msgstr "" -#: lxc/file.go:64 +#: lxc/file.go:66 msgid "Set the file's perms on push" msgstr "" -#: lxc/file.go:62 +#: lxc/file.go:64 msgid "Set the file's uid on push" msgstr "" @@ -867,78 +894,83 @@ msgid "Show client version" msgstr "" -#: lxc/info.go:38 +#: lxc/info.go:39 msgid "Show the container's last 100 log lines?" msgstr "" -#: lxc/config.go:33 +#: lxc/config.go:35 msgid "Show the expanded configuration" msgstr "" -#: lxc/image.go:350 +#: lxc/image.go:546 #, c-format msgid "Size: %.2fMB" msgstr "" -#: lxc/info.go:210 +#: lxc/info.go:219 msgid "Snapshots:" msgstr "" -#: lxc/action.go:134 +#: lxc/action.go:142 #, c-format msgid "Some containers failed to %s" msgstr "" -#: lxc/image.go:383 +#: lxc/image.go:579 msgid "Source:" msgstr "" -#: lxc/main.go:220 +#: lxc/main.go:234 msgid "Start containers." msgstr "" -#: lxc/launch.go:152 +#: lxc/launch.go:59 #, c-format msgid "Starting %s" msgstr "" -#: lxc/info.go:100 +#: lxc/info.go:109 #, c-format msgid "Status: %s" msgstr "" -#: lxc/main.go:226 +#: lxc/main.go:240 msgid "Stop containers." msgstr "" -#: lxc/publish.go:36 lxc/publish.go:37 +#: lxc/publish.go:37 lxc/publish.go:38 msgid "Stop the container if currently running" msgstr "" -#: lxc/delete.go:105 lxc/publish.go:114 +#: lxc/publish.go:136 msgid "Stopping container failed!" msgstr "" -#: lxc/storage.go:436 +#: lxc/delete.go:121 +#, c-format +msgid "Stopping the container failed: %s" +msgstr "" + +#: lxc/storage.go:468 #, c-format msgid "Storage pool %s created" msgstr "" -#: lxc/storage.go:486 +#: lxc/storage.go:527 #, c-format msgid "Storage pool %s deleted" msgstr "" -#: lxc/init.go:143 lxc/init.go:144 +#: lxc/init.go:144 lxc/init.go:145 msgid "Storage pool name" msgstr "" -#: lxc/storage.go:720 +#: lxc/storage.go:782 #, c-format msgid "Storage volume %s created" msgstr "" -#: lxc/storage.go:730 +#: lxc/storage.go:797 #, c-format msgid "Storage volume %s deleted" msgstr "" @@ -947,38 +979,42 @@ msgid "Store the container state (only for stop)" msgstr "" -#: lxc/info.go:171 +#: lxc/info.go:180 msgid "Swap (current)" msgstr "" -#: lxc/info.go:175 +#: lxc/info.go:184 msgid "Swap (peak)" msgstr "" -#: lxc/list.go:457 lxc/network.go:459 lxc/storage.go:695 +#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747 msgid "TYPE" msgstr "" -#: lxc/delete.go:91 +#: lxc/delete.go:105 msgid "The container is currently running, stop it first or pass --force." msgstr "" -#: lxc/publish.go:92 +#: lxc/publish.go:101 msgid "" "The container is currently running. Use --force to have it stopped and " "restarted." msgstr "" -#: lxc/init.go:326 +#: lxc/init.go:358 msgid "The container you are starting doesn't have any network attached to it." msgstr "" -#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779 -#: lxc/config.go:817 lxc/config.go:835 +#: lxc/config.go:770 lxc/config.go:787 +msgid "The device already exists" +msgstr "" + +#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899 +#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022 msgid "The device doesn't exist" msgstr "" -#: lxc/init.go:310 +#: lxc/init.go:342 #, c-format msgid "The local image '%s' couldn't be found, trying '%s:' instead." msgstr "" @@ -987,15 +1023,15 @@ msgid "The opposite of \"lxc pause\" is \"lxc start\"." msgstr "" -#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476 +#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508 msgid "The specified device doesn't exist" msgstr "" -#: lxc/network.go:266 lxc/network.go:315 +#: lxc/network.go:294 lxc/network.go:347 msgid "The specified device doesn't match the network" msgstr "" -#: lxc/publish.go:65 +#: lxc/publish.go:74 msgid "There is no \"image name\". Did you want an alias?" msgstr "" @@ -1011,49 +1047,49 @@ msgid "Time to wait for the container before killing it" msgstr "" -#: lxc/image.go:353 +#: lxc/image.go:549 msgid "Timestamps:" msgstr "" -#: lxc/init.go:328 +#: lxc/init.go:360 msgid "To attach a network to a container, use: lxc network attach" msgstr "" -#: lxc/init.go:327 +#: lxc/init.go:359 msgid "To create a new network, use: lxc network create" msgstr "" -#: lxc/main.go:140 +#: lxc/main.go:154 msgid "To start your first container, try: lxc launch ubuntu:16.04" msgstr "" -#: lxc/image.go:441 +#: lxc/image.go:657 #, c-format msgid "Transferring image: %s" msgstr "" -#: lxc/action.go:98 lxc/launch.go:165 +#: lxc/action.go:106 lxc/launch.go:77 #, c-format msgid "Try `lxc info --show-log %s` for more info" msgstr "" -#: lxc/info.go:102 +#: lxc/info.go:111 msgid "Type: ephemeral" msgstr "" -#: lxc/info.go:104 +#: lxc/info.go:113 msgid "Type: persistent" msgstr "" -#: lxc/image.go:656 +#: lxc/image.go:233 msgid "UPLOAD DATE" msgstr "" -#: lxc/remote.go:396 +#: lxc/remote.go:407 msgid "URL" msgstr "" -#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698 +#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750 msgid "USED BY" msgstr "" @@ -1061,11 +1097,16 @@ msgid "Unable to find help2man." msgstr "" -#: lxc/remote.go:110 +#: lxc/remote.go:111 msgid "Unable to read remote TLS certificate" msgstr "" -#: lxc/image.go:358 +#: lxc/file.go:111 +#, c-format +msgid "Unknown file type '%s'" +msgstr "" + +#: lxc/image.go:554 #, c-format msgid "Uploaded: %s" msgstr "" @@ -1082,7 +1123,7 @@ msgid "Usage: lxc [options]" msgstr "" -#: lxc/config.go:58 +#: lxc/config.go:60 msgid "" "Usage: lxc config [options]\n" "\n" @@ -1168,7 +1209,7 @@ "Copy containers within or in between LXD instances." msgstr "" -#: lxc/delete.go:26 +#: lxc/delete.go:27 msgid "" "Usage: lxc delete [:][/] " "[[:][/]...]\n" @@ -1176,7 +1217,7 @@ "Delete containers and snapshots." msgstr "" -#: lxc/exec.go:52 +#: lxc/exec.go:53 msgid "" "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|" "interactive|non-interactive] [--env KEY=VALUE...] [--] \n" @@ -1187,7 +1228,7 @@ "AND stdout are terminals (stderr is ignored)." msgstr "" -#: lxc/file.go:36 +#: lxc/file.go:38 msgid "" "Usage: lxc file [options]\n" "\n" @@ -1231,7 +1272,7 @@ "Help page for the LXD client." msgstr "" -#: lxc/image.go:62 +#: lxc/image.go:72 msgid "" "Usage: lxc image [options]\n" "\n" @@ -1285,11 +1326,38 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" -"lxc image list [:] [filter] [--format table|json]\n" +"lxc image list [:] [filter] [--format csv|json|table|yaml] [-c " +"]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" +" The -c option takes a (optionally comma-separated) list of arguments " +"that\n" +" control which image attributes to output when displaying in table or " +"csv\n" +" format.\n" +"\n" +" Default column layout is: lfpdasu\n" +"\n" +" Column shorthand chars:\n" +"\n" +" l - Shortest image alias (and optionally number of other aliases)\n" +"\n" +" L - Newline-separated list of all image aliases\n" +"\n" +" f - Fingerprint\n" +"\n" +" p - Whether image is public\n" +"\n" +" d - Description\n" +"\n" +" a - Architecture\n" +"\n" +" s - Size\n" +"\n" +" u - Upload date\n" +"\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1309,7 +1377,7 @@ "image alias name." msgstr "" -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "" "Usage: lxc info [:][] [--show-log]\n" "\n" @@ -1322,7 +1390,7 @@ " For LXD server information." msgstr "" -#: lxc/init.go:75 +#: lxc/init.go:76 msgid "" "Usage: lxc init [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1337,7 +1405,7 @@ " lxc init ubuntu:16.04 u1" msgstr "" -#: lxc/launch.go:23 +#: lxc/launch.go:20 msgid "" "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1352,9 +1420,9 @@ " lxc launch ubuntu:16.04 u1" msgstr "" -#: lxc/list.go:49 +#: lxc/list.go:44 msgid "" -"Usage: lxc list [:] [filters] [--format table|json|csv] [-c " +"Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c " "] [--fast]\n" "\n" "List the existing containers.\n" @@ -1466,7 +1534,7 @@ " Only show log message." msgstr "" -#: lxc/move.go:19 +#: lxc/move.go:22 msgid "" "Usage: lxc move [:][/] [:][[/" "]] [--container-only]\n" @@ -1485,7 +1553,7 @@ " Rename a snapshot." msgstr "" -#: lxc/network.go:49 +#: lxc/network.go:50 msgid "" "Usage: lxc network [options]\n" "\n" @@ -1538,7 +1606,7 @@ " Update a network using the content of network.yaml" msgstr "" -#: lxc/profile.go:49 +#: lxc/profile.go:51 msgid "" "Usage: lxc profile [options]\n" "\n" @@ -1620,7 +1688,7 @@ " Remove all profile from \"foo\"" msgstr "" -#: lxc/publish.go:27 +#: lxc/publish.go:28 msgid "" "Usage: lxc publish [:][/] [:] [--" "alias=ALIAS...] [prop-key=prop-value...]\n" @@ -1628,7 +1696,7 @@ "Publish containers as images." msgstr "" -#: lxc/remote.go:38 +#: lxc/remote.go:39 msgid "" "Usage: lxc remote [options]\n" "\n" @@ -1657,7 +1725,7 @@ " Print the default remote." msgstr "" -#: lxc/restore.go:21 +#: lxc/restore.go:22 msgid "" "Usage: lxc restore [:] [--stateful]\n" "\n" @@ -1673,7 +1741,7 @@ " Restore the snapshot." msgstr "" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 msgid "" "Usage: lxc snapshot [:] [--stateful]\n" "\n" @@ -1687,7 +1755,7 @@ " Create a snapshot of \"u1\" called \"snap0\"." msgstr "" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "" "Usage: lxc storage [options]\n" "\n" @@ -1787,157 +1855,128 @@ "Print the version number of this client tool." msgstr "" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "" -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "" "Whether or not to restore the container's running state from snapshot (if " "available)" msgstr "" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "" -#: lxc/exec.go:129 +#: lxc/exec.go:130 msgid "You can't pass -t or -T at the same time as --mode" msgstr "" -#: lxc/main.go:56 -msgid "`lxc config profile` is deprecated, please use `lxc profile`" +#: lxc/copy.go:57 +msgid "You must specify a source container name" msgstr "" -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "" - -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" -msgstr "" - -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" +#: lxc/main.go:58 +msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "" -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 -#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, c-format msgid "error: %v" msgstr "" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, c-format msgid "error: unknown command: %s" msgstr "" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" msgstr "" -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "" - -#: lxc/remote.go:233 +#: lxc/remote.go:229 msgid "ok (y/n)?" msgstr "" -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" msgstr "" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" msgstr "" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" msgstr "" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" msgstr "" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" msgstr "" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" msgstr "" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" msgstr "" -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "" - -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" msgstr "" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" msgstr "" - -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "" diff -Nru lxd-2.14/po/ru.po lxd-2.15/po/ru.po --- lxd-2.14/po/ru.po 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/ru.po 2017-06-28 03:00:23.000000000 +0000 @@ -7,9 +7,9 @@ msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2017-05-30 14:59-0400\n" -"PO-Revision-Date: 2017-02-14 09:54+0000\n" -"Last-Translator: Vyacheslav Razykov \n" +"POT-Creation-Date: 2017-06-27 00:23-0400\n" +"PO-Revision-Date: 2017-06-06 13:55+0000\n" +"Last-Translator: Александр Киль \n" "Language-Team: Russian \n" "Language: ru\n" @@ -18,9 +18,9 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 2.12-dev\n" +"X-Generator: Weblate 2.15-dev\n" -#: lxc/storage.go:30 +#: lxc/storage.go:31 #, fuzzy msgid "" "### This is a yaml representation of a storage pool.\n" @@ -54,7 +54,7 @@ "###\n" "### Обратите внимание, что только конфигурация может быть изменена." -#: lxc/storage.go:47 +#: lxc/storage.go:48 msgid "" "### This is a yaml representation of a storage volume.\n" "### Any line starting with a '# will be ignored.\n" @@ -68,7 +68,7 @@ "### size: \"61203283968\"" msgstr "" -#: lxc/config.go:37 +#: lxc/config.go:39 msgid "" "### This is a yaml representation of the configuration.\n" "### Any line starting with a '# will be ignored.\n" @@ -106,7 +106,7 @@ "###\n" "### Обратите внимание, что имя отображается, но не может быть изменено" -#: lxc/image.go:52 +#: lxc/image.go:62 msgid "" "### This is a yaml representation of the image properties.\n" "### Any line starting with a '# will be ignored.\n" @@ -116,7 +116,7 @@ "### description: My custom image" msgstr "" -#: lxc/network.go:29 +#: lxc/network.go:30 msgid "" "### This is a yaml representation of the network.\n" "### Any line starting with a '# will be ignored.\n" @@ -152,7 +152,7 @@ "###\n" "### Обратите внимание, что только конфигурация может быть изменена." -#: lxc/profile.go:28 +#: lxc/profile.go:30 msgid "" "### This is a yaml representation of the profile.\n" "### Any line starting with a '# will be ignored.\n" @@ -190,103 +190,132 @@ "###\n" "### Обратите внимание, что имя отображается, но не может быть изменено" -#: lxc/image.go:629 +#: lxc/image.go:182 #, c-format msgid "%s (%d more)" msgstr "" -#: lxc/snapshot.go:58 +#: lxc/file.go:186 +#, c-format +msgid "%s is not a directory" +msgstr "" + +#: lxc/file.go:128 +#, c-format +msgid "'%s' isn't a regular file or directory." +msgstr "" + +#: lxc/snapshot.go:53 msgid "'/' not allowed in snapshot name" msgstr "Нельзя использовать '/' в имени снимка" -#: lxc/profile.go:293 +#: lxc/profile.go:319 msgid "(none)" msgstr "(пусто)" -#: lxc/image.go:650 lxc/image.go:692 +#: lxc/image.go:226 lxc/image.go:1052 msgid "ALIAS" msgstr "ПСЕВДОНИМ" -#: lxc/image.go:654 +#: lxc/image.go:227 +#, fuzzy +msgid "ALIASES" +msgstr "ПСЕВДОНИМ" + +#: lxc/image.go:231 msgid "ARCH" msgstr "ARCH" -#: lxc/list.go:448 +#: lxc/list.go:461 msgid "ARCHITECTURE" msgstr "АРХИТЕКТУРА" -#: lxc/remote.go:66 +#: lxc/remote.go:67 msgid "Accept certificate" msgstr "Принять сертификат" -#: lxc/remote.go:282 +#: lxc/remote.go:281 #, c-format msgid "Admin password for %s: " msgstr "Пароль администратора для %s: " -#: lxc/image.go:373 +#: lxc/image.go:569 msgid "Aliases:" msgstr "Псевдонимы:" -#: lxc/image.go:351 lxc/info.go:95 +#: lxc/image.go:547 lxc/info.go:104 #, c-format msgid "Architecture: %s" msgstr "Архитектура: %s" -#: lxc/image.go:381 +#: lxc/image.go:577 #, c-format msgid "Auto update: %s" msgstr "Авто-обновление: %s" -#: lxc/info.go:188 -msgid "Bytes received" +#: lxc/image.go:651 +#, c-format +msgid "Bad property: %s" msgstr "" -#: lxc/info.go:189 +#: lxc/info.go:197 +msgid "Bytes received" +msgstr "Получено байтов" + +#: lxc/info.go:198 msgid "Bytes sent" -msgstr "" +msgstr "Отправлено байтов" -#: lxc/config.go:310 +#: lxc/config.go:349 msgid "COMMON NAME" msgstr "ОБЩЕЕ ИМЯ" -#: lxc/info.go:152 +#: lxc/info.go:161 msgid "CPU usage (in seconds)" msgstr "Использование ЦП (в секундах)" -#: lxc/info.go:156 +#: lxc/info.go:165 #, fuzzy msgid "CPU usage:" msgstr " Использование ЦП:" -#: lxc/list.go:449 +#: lxc/list.go:462 msgid "CREATED AT" msgstr "СОЗДАН" -#: lxc/config.go:150 lxc/network.go:496 +#: lxc/file.go:479 +msgid "Can't pull a directory without --recursive" +msgstr "" + +#: lxc/config.go:156 lxc/network.go:542 #, c-format msgid "Can't read from stdin: %s" msgstr "Невозможно прочитать из стандартного ввода: %s" -#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218 +#: lxc/config.go:169 +#, c-format +msgid "Can't unset key '%s', it's not currently set" +msgstr "" + +#: lxc/config.go:211 lxc/config.go:237 #, c-format msgid "Can't unset key '%s', it's not currently set." msgstr "" -#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579 +#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625 msgid "Cannot provide container name to list" msgstr "Невозможно добавить имя контейнера в список" -#: lxc/remote.go:232 +#: lxc/remote.go:228 #, c-format msgid "Certificate fingerprint: %s" msgstr "" -#: lxc/remote.go:305 +#: lxc/remote.go:316 msgid "Client certificate stored at server: " msgstr "Сертификат клиента хранится на сервере: " -#: lxc/list.go:133 lxc/list.go:134 +#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129 msgid "Columns" msgstr "Столбцы" @@ -294,35 +323,35 @@ msgid "Commands:" msgstr "" -#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136 +#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137 msgid "Config key/value to apply to the new container" msgstr "" -#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:746 lxc/network.go:378 -#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854 +#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418 +#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935 #, c-format msgid "Config parsing error: %s" msgstr "" -#: lxc/main.go:33 +#: lxc/main.go:35 msgid "Connection refused; is LXD running?" msgstr "В соединении отказано; LXD запущен?" -#: lxc/publish.go:62 +#: lxc/publish.go:71 msgid "Container name is mandatory" msgstr "Имя контейнера является обязательным" -#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244 +#: lxc/copy.go:210 lxc/init.go:313 #, c-format msgid "Container name is: %s" msgstr "Имя контейнера: %s" -#: lxc/publish.go:160 lxc/publish.go:175 +#: lxc/publish.go:250 #, c-format msgid "Container published with fingerprint: %s" msgstr "" -#: lxc/image.go:137 +#: lxc/image.go:173 msgid "Copy aliases from source" msgstr "Копировать псевдонимы из источника" @@ -330,86 +359,91 @@ msgid "Copy the container without its snapshots" msgstr "" -#: lxc/image.go:250 +#: lxc/image.go:422 #, c-format msgid "Copying the image: %s" msgstr "Копирование образа: %s" -#: lxc/remote.go:247 +#: lxc/remote.go:243 msgid "Could not create server cert dir" msgstr "Не удалось создать каталог сертификата сервера" -#: lxc/file.go:67 lxc/file.go:68 +#: lxc/file.go:69 lxc/file.go:70 msgid "Create any directories necessary" msgstr "" -#: lxc/image.go:356 lxc/info.go:97 +#: lxc/image.go:552 lxc/info.go:106 #, c-format msgid "Created: %s" msgstr "" -#: lxc/init.go:182 lxc/launch.go:142 +#: lxc/init.go:194 #, c-format msgid "Creating %s" msgstr "" -#: lxc/init.go:180 +#: lxc/init.go:192 msgid "Creating the container" msgstr "" -#: lxc/image.go:653 lxc/image.go:694 lxc/list.go:450 lxc/network.go:461 -#: lxc/storage.go:608 lxc/storage.go:697 +#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507 +#: lxc/storage.go:654 lxc/storage.go:749 msgid "DESCRIPTION" msgstr "" -#: lxc/storage.go:609 +#: lxc/storage.go:655 msgid "DRIVER" msgstr "" -#: lxc/publish.go:38 +#: lxc/publish.go:39 msgid "Define a compression algorithm: for image or none" msgstr "" -#: lxc/config.go:688 +#: lxc/config.go:803 #, c-format msgid "Device %s added to %s" msgstr "" -#: lxc/config.go:875 +#: lxc/config.go:1037 #, c-format msgid "Device %s removed from %s" msgstr "" -#: lxc/exec.go:64 -msgid "Disable pseudo-terminal allocation" +#: lxc/utils.go:248 lxc/utils.go:272 +#, c-format +msgid "Device already exists: %s" msgstr "" #: lxc/exec.go:65 +msgid "Disable pseudo-terminal allocation" +msgstr "" + +#: lxc/exec.go:66 msgid "Disable stdin (reads from /dev/null)" msgstr "" -#: lxc/info.go:145 +#: lxc/info.go:154 #, fuzzy msgid "Disk usage:" msgstr " Использование диска:" -#: lxc/list.go:601 +#: lxc/list.go:614 msgid "EPHEMERAL" msgstr "" -#: lxc/config.go:312 +#: lxc/config.go:351 msgid "EXPIRY DATE" msgstr "" -#: lxc/main.go:45 +#: lxc/main.go:47 msgid "Enable debug mode" msgstr "" -#: lxc/main.go:44 +#: lxc/main.go:46 msgid "Enable verbose mode" msgstr "" -#: lxc/exec.go:61 +#: lxc/exec.go:62 msgid "Environment variable to set (e.g. HOME=/home/foo)" msgstr "" @@ -417,7 +451,7 @@ msgid "Environment:" msgstr "" -#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140 +#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141 msgid "Ephemeral container" msgstr "" @@ -425,16 +459,21 @@ msgid "Event type to listen for" msgstr "" -#: lxc/image.go:360 +#: lxc/image.go:556 #, c-format msgid "Expires: %s" msgstr "" -#: lxc/image.go:362 +#: lxc/image.go:558 msgid "Expires: never" msgstr "" -#: lxc/config.go:309 lxc/image.go:651 lxc/image.go:693 +#: lxc/image.go:848 +#, fuzzy, c-format +msgid "Exporting the image: %s" +msgstr "Копирование образа: %s" + +#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053 msgid "FINGERPRINT" msgstr "" @@ -448,16 +487,25 @@ msgid "Failed to generate 'lxc.1': %v" msgstr "" -#: lxc/list.go:136 +#: lxc/copy.go:205 +msgid "Failed to get the new container name" +msgstr "" + +#: lxc/file.go:123 +#, c-format +msgid "Failed to walk path for %s: %s" +msgstr "" + +#: lxc/list.go:131 msgid "Fast mode (same as --columns=nsacPt)" msgstr "" -#: lxc/image.go:349 +#: lxc/image.go:545 #, c-format msgid "Fingerprint: %s" msgstr "" -#: lxc/exec.go:63 +#: lxc/exec.go:64 msgid "Force pseudo-terminal allocation" msgstr "" @@ -465,43 +513,39 @@ msgid "Force the container to shutdown" msgstr "" -#: lxc/delete.go:33 lxc/delete.go:34 +#: lxc/delete.go:34 lxc/delete.go:35 msgid "Force the removal of stopped containers" msgstr "" -#: lxc/main.go:46 +#: lxc/main.go:48 msgid "Force using the local unix socket" msgstr "" -#: lxc/image.go:140 -msgid "Format" -msgstr "" - -#: lxc/list.go:135 -msgid "Format (table|json|csv)" +#: lxc/image.go:176 lxc/list.go:130 +msgid "Format (csv|json|table|yaml)" msgstr "" -#: lxc/remote.go:80 +#: lxc/remote.go:81 msgid "Generating a client certificate. This may take a minute..." msgstr "" -#: lxc/list.go:446 +#: lxc/list.go:459 msgid "IPV4" msgstr "" -#: lxc/list.go:447 +#: lxc/list.go:460 msgid "IPV6" msgstr "" -#: lxc/config.go:311 +#: lxc/config.go:350 msgid "ISSUE DATE" msgstr "" -#: lxc/main.go:139 +#: lxc/main.go:153 msgid "If this is your first time using LXD, you should also run: lxd init" msgstr "" -#: lxc/main.go:47 +#: lxc/main.go:49 msgid "Ignore aliases when determining what command to run" msgstr "" @@ -509,247 +553,231 @@ msgid "Ignore the container state (only for start)" msgstr "" -#: lxc/image.go:312 +#: lxc/image.go:508 msgid "Image already up to date." msgstr "" -#: lxc/image.go:253 +#: lxc/image.go:436 msgid "Image copied successfully!" msgstr "" -#: lxc/image.go:436 lxc/image.go:448 +#: lxc/image.go:898 +msgid "Image exported successfully!" +msgstr "" + +#: lxc/image.go:709 #, c-format msgid "Image imported with fingerprint: %s" msgstr "" -#: lxc/image.go:310 +#: lxc/image.go:506 msgid "Image refreshed successfully!" msgstr "" -#: lxc/image.go:433 -#, c-format -msgid "Importing the image: %s" -msgstr "" - -#: lxc/remote.go:150 +#: lxc/remote.go:151 #, c-format msgid "Invalid URL scheme \"%s\" in \"%s\"" msgstr "" -#: lxc/config.go:290 +#: lxc/config.go:329 msgid "Invalid certificate" msgstr "" -#: lxc/init.go:30 lxc/init.go:35 +#: lxc/init.go:31 lxc/init.go:36 msgid "Invalid configuration key" msgstr "" -#: lxc/file.go:357 +#: lxc/file.go:522 #, c-format msgid "Invalid path %s" msgstr "" -#: lxc/file.go:291 +#: lxc/file.go:451 #, c-format msgid "Invalid source %s" msgstr "" -#: lxc/file.go:80 +#: lxc/file.go:224 #, c-format msgid "Invalid target %s" msgstr "" -#: lxc/info.go:126 +#: lxc/info.go:135 msgid "Ips:" msgstr "" -#: lxc/image.go:138 +#: lxc/image.go:174 msgid "Keep the image up to date after initial copy" msgstr "" -#: lxc/list.go:451 +#: lxc/list.go:464 msgid "LAST USED AT" msgstr "" -#: lxc/main.go:31 +#: lxc/main.go:33 msgid "LXD socket not found; is LXD installed and running?" msgstr "" -#: lxc/image.go:365 +#: lxc/image.go:561 #, c-format msgid "Last used: %s" msgstr "" -#: lxc/image.go:367 +#: lxc/image.go:563 msgid "Last used: never" msgstr "" -#: lxc/info.go:241 +#: lxc/info.go:250 msgid "Log:" msgstr "" -#: lxc/network.go:460 +#: lxc/network.go:506 msgid "MANAGED" msgstr "" -#: lxc/image.go:136 +#: lxc/image.go:172 msgid "Make image public" msgstr "" -#: lxc/publish.go:34 +#: lxc/publish.go:35 msgid "Make the image public" msgstr "" -#: lxc/info.go:163 +#: lxc/info.go:172 msgid "Memory (current)" msgstr "" -#: lxc/info.go:167 +#: lxc/info.go:176 msgid "Memory (peak)" msgstr "" -#: lxc/info.go:179 +#: lxc/info.go:188 #, fuzzy msgid "Memory usage:" msgstr " Использование памяти:" -#: lxc/copy.go:276 -#, c-format -msgid "Migration failed on source host: %s" -msgstr "" - -#: lxc/copy.go:280 -#, c-format -msgid "Migration failed on target host: %s" -msgstr "" - -#: lxc/utils.go:193 +#: lxc/utils.go:199 msgid "Missing summary." msgstr "" -#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462 +#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494 msgid "More than one device matches, specify the device name." msgstr "" -#: lxc/file.go:279 +#: lxc/file.go:438 msgid "More than one file to download, but target is not a directory" msgstr "" -#: lxc/move.go:35 +#: lxc/move.go:38 msgid "Move the container without its snapshots" msgstr "" -#: lxc/action.go:68 +#: lxc/action.go:72 msgid "Must supply container name for: " msgstr "" -#: lxc/list.go:452 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395 -#: lxc/storage.go:607 lxc/storage.go:696 +#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406 +#: lxc/storage.go:653 lxc/storage.go:748 msgid "NAME" msgstr "" -#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374 +#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385 msgid "NO" msgstr "" -#: lxc/info.go:91 +#: lxc/info.go:99 #, c-format msgid "Name: %s" msgstr "" -#: lxc/network.go:222 +#: lxc/network.go:250 #, c-format msgid "Network %s created" msgstr "" -#: lxc/network.go:325 +#: lxc/network.go:366 #, c-format msgid "Network %s deleted" msgstr "" -#: lxc/init.go:141 lxc/init.go:142 +#: lxc/init.go:142 lxc/init.go:143 msgid "Network name" msgstr "" -#: lxc/info.go:196 +#: lxc/info.go:205 #, fuzzy msgid "Network usage:" msgstr " Использование сети:" -#: lxc/image.go:139 lxc/publish.go:35 +#: lxc/image.go:175 lxc/publish.go:36 msgid "New alias to define at target" msgstr "" -#: lxc/config.go:321 +#: lxc/config.go:360 msgid "No certificate provided to add" msgstr "" -#: lxc/network.go:257 lxc/network.go:306 +#: lxc/network.go:285 lxc/network.go:338 msgid "No device found for this network" msgstr "" -#: lxc/storage.go:371 lxc/storage.go:471 +#: lxc/storage.go:383 lxc/storage.go:503 msgid "No device found for this storage volume." msgstr "" -#: lxc/config.go:344 +#: lxc/config.go:392 msgid "No fingerprint specified." msgstr "" -#: lxc/storage.go:323 lxc/storage.go:407 +#: lxc/storage.go:327 lxc/storage.go:420 msgid "Only \"custom\" volumes can be attached to containers." msgstr "" -#: lxc/remote.go:135 +#: lxc/remote.go:136 msgid "Only https URLs are supported for simplestreams" msgstr "" -#: lxc/image.go:439 +#: lxc/image.go:632 msgid "Only https:// is supported for remote image import." msgstr "" -#: lxc/network.go:354 lxc/network.go:482 +#: lxc/network.go:394 lxc/network.go:528 msgid "Only managed networks can be modified." msgstr "" -#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163 +#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177 msgid "Options:" msgstr "" -#: lxc/image.go:550 -#, c-format -msgid "Output is in %s" -msgstr "" - -#: lxc/exec.go:62 +#: lxc/exec.go:63 msgid "Override the terminal mode (auto, interactive or non-interactive)" msgstr "" -#: lxc/list.go:603 +#: lxc/list.go:616 msgid "PERSISTENT" msgstr "" -#: lxc/list.go:453 +#: lxc/list.go:466 msgid "PID" msgstr "" -#: lxc/list.go:454 +#: lxc/list.go:467 msgid "PROFILES" msgstr "" -#: lxc/remote.go:397 +#: lxc/remote.go:408 msgid "PROTOCOL" msgstr "" -#: lxc/image.go:652 lxc/remote.go:398 +#: lxc/image.go:229 lxc/remote.go:409 msgid "PUBLIC" msgstr "" -#: lxc/info.go:190 +#: lxc/info.go:199 msgid "Packets received" msgstr "" -#: lxc/info.go:191 +#: lxc/info.go:200 msgid "Packets sent" msgstr "" @@ -761,24 +789,24 @@ msgid "Path to an alternate server directory" msgstr "" -#: lxc/main.go:202 +#: lxc/main.go:216 msgid "Pause containers." msgstr "" -#: lxc/main.go:35 +#: lxc/main.go:37 msgid "Permission denied, are you in the lxd group?" msgstr "" -#: lxc/info.go:108 +#: lxc/info.go:117 #, c-format msgid "Pid: %d" msgstr "" -#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855 +#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936 msgid "Press enter to open the editor again" msgstr "" -#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:747 +#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108 msgid "Press enter to start the editor again" msgstr "" @@ -794,143 +822,143 @@ msgid "Print verbose information" msgstr "" -#: lxc/info.go:132 +#: lxc/info.go:141 #, c-format msgid "Processes: %d" msgstr "" -#: lxc/profile.go:314 +#: lxc/profile.go:344 #, c-format msgid "Profile %s added to %s" msgstr "" -#: lxc/profile.go:209 +#: lxc/profile.go:218 #, c-format msgid "Profile %s created" msgstr "" -#: lxc/profile.go:279 +#: lxc/profile.go:292 #, c-format msgid "Profile %s deleted" msgstr "" -#: lxc/profile.go:345 +#: lxc/profile.go:379 #, c-format msgid "Profile %s removed from %s" msgstr "" -#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138 +#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139 msgid "Profile to apply to the new container" msgstr "" -#: lxc/profile.go:295 +#: lxc/profile.go:321 #, c-format msgid "Profiles %s applied to %s" msgstr "" -#: lxc/info.go:106 +#: lxc/info.go:115 #, c-format msgid "Profiles: %s" msgstr "" -#: lxc/image.go:369 +#: lxc/image.go:565 msgid "Properties:" msgstr "" -#: lxc/remote.go:69 +#: lxc/remote.go:70 msgid "Public image server" msgstr "" -#: lxc/image.go:352 +#: lxc/image.go:548 #, c-format msgid "Public: %s" msgstr "" -#: lxc/file.go:65 lxc/file.go:66 +#: lxc/file.go:67 lxc/file.go:68 msgid "Recursively push or pull files" msgstr "" -#: lxc/image.go:303 +#: lxc/image.go:489 #, fuzzy, c-format msgid "Refreshing the image: %s" msgstr "Копирование образа: %s" -#: lxc/remote.go:67 +#: lxc/remote.go:68 msgid "Remote admin password" msgstr "" -#: lxc/info.go:93 +#: lxc/info.go:101 #, c-format msgid "Remote: %s" msgstr "" -#: lxc/delete.go:41 +#: lxc/delete.go:42 #, c-format msgid "Remove %s (yes/no): " msgstr "" -#: lxc/delete.go:35 lxc/delete.go:36 +#: lxc/delete.go:36 lxc/delete.go:37 msgid "Require user confirmation" msgstr "" -#: lxc/info.go:129 +#: lxc/info.go:138 msgid "Resources:" msgstr "" -#: lxc/main.go:210 +#: lxc/main.go:224 msgid "Restart containers." msgstr "" -#: lxc/init.go:253 +#: lxc/init.go:286 #, c-format msgid "Retrieving image: %s" msgstr "" -#: lxc/image.go:655 +#: lxc/image.go:232 msgid "SIZE" msgstr "" -#: lxc/list.go:455 +#: lxc/list.go:468 msgid "SNAPSHOTS" msgstr "" -#: lxc/storage.go:610 +#: lxc/storage.go:656 msgid "SOURCE" msgstr "" -#: lxc/list.go:456 +#: lxc/list.go:469 msgid "STATE" msgstr "" -#: lxc/remote.go:399 +#: lxc/remote.go:410 msgid "STATIC" msgstr "" -#: lxc/list.go:458 +#: lxc/list.go:471 msgid "STORAGE POOL" msgstr "" -#: lxc/remote.go:240 +#: lxc/remote.go:236 msgid "Server certificate NACKed by user" msgstr "" -#: lxc/remote.go:302 +#: lxc/remote.go:313 msgid "Server doesn't trust us after adding our cert" msgstr "" -#: lxc/remote.go:68 +#: lxc/remote.go:69 msgid "Server protocol (lxd or simplestreams)" msgstr "" -#: lxc/file.go:63 +#: lxc/file.go:65 msgid "Set the file's gid on push" msgstr "" -#: lxc/file.go:64 +#: lxc/file.go:66 msgid "Set the file's perms on push" msgstr "" -#: lxc/file.go:62 +#: lxc/file.go:64 msgid "Set the file's uid on push" msgstr "" @@ -942,78 +970,83 @@ msgid "Show client version" msgstr "" -#: lxc/info.go:38 +#: lxc/info.go:39 msgid "Show the container's last 100 log lines?" msgstr "" -#: lxc/config.go:33 +#: lxc/config.go:35 msgid "Show the expanded configuration" msgstr "" -#: lxc/image.go:350 +#: lxc/image.go:546 #, c-format msgid "Size: %.2fMB" msgstr "" -#: lxc/info.go:210 +#: lxc/info.go:219 msgid "Snapshots:" msgstr "" -#: lxc/action.go:134 +#: lxc/action.go:142 #, fuzzy, c-format msgid "Some containers failed to %s" msgstr "Невозможно добавить имя контейнера в список" -#: lxc/image.go:383 +#: lxc/image.go:579 msgid "Source:" msgstr "" -#: lxc/main.go:220 +#: lxc/main.go:234 msgid "Start containers." msgstr "" -#: lxc/launch.go:152 +#: lxc/launch.go:59 #, c-format msgid "Starting %s" msgstr "" -#: lxc/info.go:100 +#: lxc/info.go:109 #, c-format msgid "Status: %s" msgstr "" -#: lxc/main.go:226 +#: lxc/main.go:240 msgid "Stop containers." msgstr "" -#: lxc/publish.go:36 lxc/publish.go:37 +#: lxc/publish.go:37 lxc/publish.go:38 msgid "Stop the container if currently running" msgstr "" -#: lxc/delete.go:105 lxc/publish.go:114 +#: lxc/publish.go:136 msgid "Stopping container failed!" msgstr "" -#: lxc/storage.go:436 +#: lxc/delete.go:121 +#, fuzzy, c-format +msgid "Stopping the container failed: %s" +msgstr "Невозможно добавить имя контейнера в список" + +#: lxc/storage.go:468 #, c-format msgid "Storage pool %s created" msgstr "" -#: lxc/storage.go:486 +#: lxc/storage.go:527 #, c-format msgid "Storage pool %s deleted" msgstr "" -#: lxc/init.go:143 lxc/init.go:144 +#: lxc/init.go:144 lxc/init.go:145 msgid "Storage pool name" msgstr "" -#: lxc/storage.go:720 +#: lxc/storage.go:782 #, c-format msgid "Storage volume %s created" msgstr "" -#: lxc/storage.go:730 +#: lxc/storage.go:797 #, c-format msgid "Storage volume %s deleted" msgstr "" @@ -1022,38 +1055,42 @@ msgid "Store the container state (only for stop)" msgstr "" -#: lxc/info.go:171 +#: lxc/info.go:180 msgid "Swap (current)" msgstr "" -#: lxc/info.go:175 +#: lxc/info.go:184 msgid "Swap (peak)" msgstr "" -#: lxc/list.go:457 lxc/network.go:459 lxc/storage.go:695 +#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747 msgid "TYPE" msgstr "" -#: lxc/delete.go:91 +#: lxc/delete.go:105 msgid "The container is currently running, stop it first or pass --force." msgstr "" -#: lxc/publish.go:92 +#: lxc/publish.go:101 msgid "" "The container is currently running. Use --force to have it stopped and " "restarted." msgstr "" -#: lxc/init.go:326 +#: lxc/init.go:358 msgid "The container you are starting doesn't have any network attached to it." msgstr "" -#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779 -#: lxc/config.go:817 lxc/config.go:835 +#: lxc/config.go:770 lxc/config.go:787 +msgid "The device already exists" +msgstr "" + +#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899 +#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022 msgid "The device doesn't exist" msgstr "" -#: lxc/init.go:310 +#: lxc/init.go:342 #, c-format msgid "The local image '%s' couldn't be found, trying '%s:' instead." msgstr "" @@ -1062,15 +1099,15 @@ msgid "The opposite of \"lxc pause\" is \"lxc start\"." msgstr "" -#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476 +#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508 msgid "The specified device doesn't exist" msgstr "" -#: lxc/network.go:266 lxc/network.go:315 +#: lxc/network.go:294 lxc/network.go:347 msgid "The specified device doesn't match the network" msgstr "" -#: lxc/publish.go:65 +#: lxc/publish.go:74 msgid "There is no \"image name\". Did you want an alias?" msgstr "" @@ -1086,49 +1123,49 @@ msgid "Time to wait for the container before killing it" msgstr "" -#: lxc/image.go:353 +#: lxc/image.go:549 msgid "Timestamps:" msgstr "" -#: lxc/init.go:328 +#: lxc/init.go:360 msgid "To attach a network to a container, use: lxc network attach" msgstr "" -#: lxc/init.go:327 +#: lxc/init.go:359 msgid "To create a new network, use: lxc network create" msgstr "" -#: lxc/main.go:140 +#: lxc/main.go:154 msgid "To start your first container, try: lxc launch ubuntu:16.04" msgstr "" -#: lxc/image.go:441 +#: lxc/image.go:657 #, c-format msgid "Transferring image: %s" msgstr "" -#: lxc/action.go:98 lxc/launch.go:165 +#: lxc/action.go:106 lxc/launch.go:77 #, c-format msgid "Try `lxc info --show-log %s` for more info" msgstr "" -#: lxc/info.go:102 +#: lxc/info.go:111 msgid "Type: ephemeral" msgstr "" -#: lxc/info.go:104 +#: lxc/info.go:113 msgid "Type: persistent" msgstr "" -#: lxc/image.go:656 +#: lxc/image.go:233 msgid "UPLOAD DATE" msgstr "" -#: lxc/remote.go:396 +#: lxc/remote.go:407 msgid "URL" msgstr "" -#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698 +#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750 msgid "USED BY" msgstr "" @@ -1136,11 +1173,16 @@ msgid "Unable to find help2man." msgstr "" -#: lxc/remote.go:110 +#: lxc/remote.go:111 msgid "Unable to read remote TLS certificate" msgstr "" -#: lxc/image.go:358 +#: lxc/file.go:111 +#, c-format +msgid "Unknown file type '%s'" +msgstr "" + +#: lxc/image.go:554 #, c-format msgid "Uploaded: %s" msgstr "" @@ -1160,7 +1202,7 @@ msgid "Usage: lxc [options]" msgstr "" -#: lxc/config.go:58 +#: lxc/config.go:60 msgid "" "Usage: lxc config [options]\n" "\n" @@ -1251,7 +1293,7 @@ "lxc copy [:][/] [[:]] [--" "ephemeral|e] [--profile|-p ...] [--config|-c ...]" -#: lxc/delete.go:26 +#: lxc/delete.go:27 msgid "" "Usage: lxc delete [:][/] " "[[:][/]...]\n" @@ -1259,7 +1301,7 @@ "Delete containers and snapshots." msgstr "" -#: lxc/exec.go:52 +#: lxc/exec.go:53 msgid "" "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|" "interactive|non-interactive] [--env KEY=VALUE...] [--] \n" @@ -1270,7 +1312,7 @@ "AND stdout are terminals (stderr is ignored)." msgstr "" -#: lxc/file.go:36 +#: lxc/file.go:38 msgid "" "Usage: lxc file [options]\n" "\n" @@ -1314,7 +1356,7 @@ "Help page for the LXD client." msgstr "" -#: lxc/image.go:62 +#: lxc/image.go:72 msgid "" "Usage: lxc image [options]\n" "\n" @@ -1368,11 +1410,38 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" -"lxc image list [:] [filter] [--format table|json]\n" +"lxc image list [:] [filter] [--format csv|json|table|yaml] [-c " +"]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" +" The -c option takes a (optionally comma-separated) list of arguments " +"that\n" +" control which image attributes to output when displaying in table or " +"csv\n" +" format.\n" +"\n" +" Default column layout is: lfpdasu\n" +"\n" +" Column shorthand chars:\n" +"\n" +" l - Shortest image alias (and optionally number of other aliases)\n" +"\n" +" L - Newline-separated list of all image aliases\n" +"\n" +" f - Fingerprint\n" +"\n" +" p - Whether image is public\n" +"\n" +" d - Description\n" +"\n" +" a - Architecture\n" +"\n" +" s - Size\n" +"\n" +" u - Upload date\n" +"\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1392,7 +1461,7 @@ "image alias name." msgstr "" -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "" "Usage: lxc info [:][] [--show-log]\n" "\n" @@ -1405,7 +1474,7 @@ " For LXD server information." msgstr "" -#: lxc/init.go:75 +#: lxc/init.go:76 msgid "" "Usage: lxc init [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1420,7 +1489,7 @@ " lxc init ubuntu:16.04 u1" msgstr "" -#: lxc/launch.go:23 +#: lxc/launch.go:20 msgid "" "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1435,9 +1504,9 @@ " lxc launch ubuntu:16.04 u1" msgstr "" -#: lxc/list.go:49 +#: lxc/list.go:44 msgid "" -"Usage: lxc list [:] [filters] [--format table|json|csv] [-c " +"Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c " "] [--fast]\n" "\n" "List the existing containers.\n" @@ -1549,7 +1618,7 @@ " Only show log message." msgstr "" -#: lxc/move.go:19 +#: lxc/move.go:22 msgid "" "Usage: lxc move [:][/] [:][[/" "]] [--container-only]\n" @@ -1568,7 +1637,7 @@ " Rename a snapshot." msgstr "" -#: lxc/network.go:49 +#: lxc/network.go:50 msgid "" "Usage: lxc network [options]\n" "\n" @@ -1621,7 +1690,7 @@ " Update a network using the content of network.yaml" msgstr "" -#: lxc/profile.go:49 +#: lxc/profile.go:51 msgid "" "Usage: lxc profile [options]\n" "\n" @@ -1703,7 +1772,7 @@ " Remove all profile from \"foo\"" msgstr "" -#: lxc/publish.go:27 +#: lxc/publish.go:28 msgid "" "Usage: lxc publish [:][/] [:] [--" "alias=ALIAS...] [prop-key=prop-value...]\n" @@ -1711,7 +1780,7 @@ "Publish containers as images." msgstr "" -#: lxc/remote.go:38 +#: lxc/remote.go:39 msgid "" "Usage: lxc remote [options]\n" "\n" @@ -1740,7 +1809,7 @@ " Print the default remote." msgstr "" -#: lxc/restore.go:21 +#: lxc/restore.go:22 msgid "" "Usage: lxc restore [:] [--stateful]\n" "\n" @@ -1756,7 +1825,7 @@ " Restore the snapshot." msgstr "" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 msgid "" "Usage: lxc snapshot [:] [--stateful]\n" "\n" @@ -1770,7 +1839,7 @@ " Create a snapshot of \"u1\" called \"snap0\"." msgstr "" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "" "Usage: lxc storage [options]\n" "\n" @@ -1870,160 +1939,131 @@ "Print the version number of this client tool." msgstr "" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "" -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "" "Whether or not to restore the container's running state from snapshot (if " "available)" msgstr "" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "" -#: lxc/exec.go:129 +#: lxc/exec.go:130 msgid "You can't pass -t or -T at the same time as --mode" msgstr "" -#: lxc/main.go:56 -msgid "`lxc config profile` is deprecated, please use `lxc profile`" -msgstr "" - -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "" - -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" +#: lxc/copy.go:57 +msgid "You must specify a source container name" msgstr "" -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" +#: lxc/main.go:58 +msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "" -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 -#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, c-format msgid "error: %v" msgstr "" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, c-format msgid "error: unknown command: %s" msgstr "" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" msgstr "" -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "" - -#: lxc/remote.go:233 +#: lxc/remote.go:229 msgid "ok (y/n)?" msgstr "" -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" msgstr "" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" msgstr "" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" msgstr "" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" msgstr "" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" msgstr "" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" msgstr "" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" msgstr "" -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "" - -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" msgstr "" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" -msgstr "" - -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "" +msgstr "да" #~ msgid "Could not sanitize path %s" #~ msgstr "Не удалось очистить путь %s" diff -Nru lxd-2.14/po/sr.po lxd-2.15/po/sr.po --- lxd-2.14/po/sr.po 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/sr.po 2017-06-28 03:00:23.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2017-05-30 14:59-0400\n" +"POT-Creation-Date: 2017-06-27 00:23-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -16,7 +16,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: lxc/storage.go:30 +#: lxc/storage.go:31 msgid "" "### This is a yaml representation of a storage pool.\n" "### Any line starting with a '# will be ignored.\n" @@ -33,7 +33,7 @@ "### zfs.pool_name: default" msgstr "" -#: lxc/storage.go:47 +#: lxc/storage.go:48 msgid "" "### This is a yaml representation of a storage volume.\n" "### Any line starting with a '# will be ignored.\n" @@ -47,7 +47,7 @@ "### size: \"61203283968\"" msgstr "" -#: lxc/config.go:37 +#: lxc/config.go:39 msgid "" "### This is a yaml representation of the configuration.\n" "### Any line starting with a '# will be ignored.\n" @@ -68,7 +68,7 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:52 +#: lxc/image.go:62 msgid "" "### This is a yaml representation of the image properties.\n" "### Any line starting with a '# will be ignored.\n" @@ -78,7 +78,7 @@ "### description: My custom image" msgstr "" -#: lxc/network.go:29 +#: lxc/network.go:30 msgid "" "### This is a yaml representation of the network.\n" "### Any line starting with a '# will be ignored.\n" @@ -98,7 +98,7 @@ "### Note that only the configuration can be changed." msgstr "" -#: lxc/profile.go:28 +#: lxc/profile.go:30 msgid "" "### This is a yaml representation of the profile.\n" "### Any line starting with a '# will be ignored.\n" @@ -119,102 +119,130 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:629 +#: lxc/image.go:182 #, c-format msgid "%s (%d more)" msgstr "" -#: lxc/snapshot.go:58 +#: lxc/file.go:186 +#, c-format +msgid "%s is not a directory" +msgstr "" + +#: lxc/file.go:128 +#, c-format +msgid "'%s' isn't a regular file or directory." +msgstr "" + +#: lxc/snapshot.go:53 msgid "'/' not allowed in snapshot name" msgstr "" -#: lxc/profile.go:293 +#: lxc/profile.go:319 msgid "(none)" msgstr "" -#: lxc/image.go:650 lxc/image.go:692 +#: lxc/image.go:226 lxc/image.go:1052 msgid "ALIAS" msgstr "" -#: lxc/image.go:654 +#: lxc/image.go:227 +msgid "ALIASES" +msgstr "" + +#: lxc/image.go:231 msgid "ARCH" msgstr "" -#: lxc/list.go:448 +#: lxc/list.go:461 msgid "ARCHITECTURE" msgstr "" -#: lxc/remote.go:66 +#: lxc/remote.go:67 msgid "Accept certificate" msgstr "" -#: lxc/remote.go:282 +#: lxc/remote.go:281 #, c-format msgid "Admin password for %s: " msgstr "" -#: lxc/image.go:373 +#: lxc/image.go:569 msgid "Aliases:" msgstr "" -#: lxc/image.go:351 lxc/info.go:95 +#: lxc/image.go:547 lxc/info.go:104 #, c-format msgid "Architecture: %s" msgstr "" -#: lxc/image.go:381 +#: lxc/image.go:577 #, c-format msgid "Auto update: %s" msgstr "" -#: lxc/info.go:188 +#: lxc/image.go:651 +#, c-format +msgid "Bad property: %s" +msgstr "" + +#: lxc/info.go:197 msgid "Bytes received" msgstr "" -#: lxc/info.go:189 +#: lxc/info.go:198 msgid "Bytes sent" msgstr "" -#: lxc/config.go:310 +#: lxc/config.go:349 msgid "COMMON NAME" msgstr "" -#: lxc/info.go:152 +#: lxc/info.go:161 msgid "CPU usage (in seconds)" msgstr "" -#: lxc/info.go:156 +#: lxc/info.go:165 msgid "CPU usage:" msgstr "" -#: lxc/list.go:449 +#: lxc/list.go:462 msgid "CREATED AT" msgstr "" -#: lxc/config.go:150 lxc/network.go:496 +#: lxc/file.go:479 +msgid "Can't pull a directory without --recursive" +msgstr "" + +#: lxc/config.go:156 lxc/network.go:542 #, c-format msgid "Can't read from stdin: %s" msgstr "" -#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218 +#: lxc/config.go:169 +#, c-format +msgid "Can't unset key '%s', it's not currently set" +msgstr "" + +#: lxc/config.go:211 lxc/config.go:237 #, c-format msgid "Can't unset key '%s', it's not currently set." msgstr "" -#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579 +#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625 msgid "Cannot provide container name to list" msgstr "" -#: lxc/remote.go:232 +#: lxc/remote.go:228 #, c-format msgid "Certificate fingerprint: %s" msgstr "" -#: lxc/remote.go:305 +#: lxc/remote.go:316 msgid "Client certificate stored at server: " msgstr "" -#: lxc/list.go:133 lxc/list.go:134 +#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129 msgid "Columns" msgstr "" @@ -222,35 +250,35 @@ msgid "Commands:" msgstr "" -#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136 +#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137 msgid "Config key/value to apply to the new container" msgstr "" -#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:746 lxc/network.go:378 -#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854 +#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418 +#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935 #, c-format msgid "Config parsing error: %s" msgstr "" -#: lxc/main.go:33 +#: lxc/main.go:35 msgid "Connection refused; is LXD running?" msgstr "" -#: lxc/publish.go:62 +#: lxc/publish.go:71 msgid "Container name is mandatory" msgstr "" -#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244 +#: lxc/copy.go:210 lxc/init.go:313 #, c-format msgid "Container name is: %s" msgstr "" -#: lxc/publish.go:160 lxc/publish.go:175 +#: lxc/publish.go:250 #, c-format msgid "Container published with fingerprint: %s" msgstr "" -#: lxc/image.go:137 +#: lxc/image.go:173 msgid "Copy aliases from source" msgstr "" @@ -258,85 +286,90 @@ msgid "Copy the container without its snapshots" msgstr "" -#: lxc/image.go:250 +#: lxc/image.go:422 #, c-format msgid "Copying the image: %s" msgstr "" -#: lxc/remote.go:247 +#: lxc/remote.go:243 msgid "Could not create server cert dir" msgstr "" -#: lxc/file.go:67 lxc/file.go:68 +#: lxc/file.go:69 lxc/file.go:70 msgid "Create any directories necessary" msgstr "" -#: lxc/image.go:356 lxc/info.go:97 +#: lxc/image.go:552 lxc/info.go:106 #, c-format msgid "Created: %s" msgstr "" -#: lxc/init.go:182 lxc/launch.go:142 +#: lxc/init.go:194 #, c-format msgid "Creating %s" msgstr "" -#: lxc/init.go:180 +#: lxc/init.go:192 msgid "Creating the container" msgstr "" -#: lxc/image.go:653 lxc/image.go:694 lxc/list.go:450 lxc/network.go:461 -#: lxc/storage.go:608 lxc/storage.go:697 +#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507 +#: lxc/storage.go:654 lxc/storage.go:749 msgid "DESCRIPTION" msgstr "" -#: lxc/storage.go:609 +#: lxc/storage.go:655 msgid "DRIVER" msgstr "" -#: lxc/publish.go:38 +#: lxc/publish.go:39 msgid "Define a compression algorithm: for image or none" msgstr "" -#: lxc/config.go:688 +#: lxc/config.go:803 #, c-format msgid "Device %s added to %s" msgstr "" -#: lxc/config.go:875 +#: lxc/config.go:1037 #, c-format msgid "Device %s removed from %s" msgstr "" -#: lxc/exec.go:64 -msgid "Disable pseudo-terminal allocation" +#: lxc/utils.go:248 lxc/utils.go:272 +#, c-format +msgid "Device already exists: %s" msgstr "" #: lxc/exec.go:65 +msgid "Disable pseudo-terminal allocation" +msgstr "" + +#: lxc/exec.go:66 msgid "Disable stdin (reads from /dev/null)" msgstr "" -#: lxc/info.go:145 +#: lxc/info.go:154 msgid "Disk usage:" msgstr "" -#: lxc/list.go:601 +#: lxc/list.go:614 msgid "EPHEMERAL" msgstr "" -#: lxc/config.go:312 +#: lxc/config.go:351 msgid "EXPIRY DATE" msgstr "" -#: lxc/main.go:45 +#: lxc/main.go:47 msgid "Enable debug mode" msgstr "" -#: lxc/main.go:44 +#: lxc/main.go:46 msgid "Enable verbose mode" msgstr "" -#: lxc/exec.go:61 +#: lxc/exec.go:62 msgid "Environment variable to set (e.g. HOME=/home/foo)" msgstr "" @@ -344,7 +377,7 @@ msgid "Environment:" msgstr "" -#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140 +#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141 msgid "Ephemeral container" msgstr "" @@ -352,16 +385,21 @@ msgid "Event type to listen for" msgstr "" -#: lxc/image.go:360 +#: lxc/image.go:556 #, c-format msgid "Expires: %s" msgstr "" -#: lxc/image.go:362 +#: lxc/image.go:558 msgid "Expires: never" msgstr "" -#: lxc/config.go:309 lxc/image.go:651 lxc/image.go:693 +#: lxc/image.go:848 +#, c-format +msgid "Exporting the image: %s" +msgstr "" + +#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053 msgid "FINGERPRINT" msgstr "" @@ -375,16 +413,25 @@ msgid "Failed to generate 'lxc.1': %v" msgstr "" -#: lxc/list.go:136 +#: lxc/copy.go:205 +msgid "Failed to get the new container name" +msgstr "" + +#: lxc/file.go:123 +#, c-format +msgid "Failed to walk path for %s: %s" +msgstr "" + +#: lxc/list.go:131 msgid "Fast mode (same as --columns=nsacPt)" msgstr "" -#: lxc/image.go:349 +#: lxc/image.go:545 #, c-format msgid "Fingerprint: %s" msgstr "" -#: lxc/exec.go:63 +#: lxc/exec.go:64 msgid "Force pseudo-terminal allocation" msgstr "" @@ -392,43 +439,39 @@ msgid "Force the container to shutdown" msgstr "" -#: lxc/delete.go:33 lxc/delete.go:34 +#: lxc/delete.go:34 lxc/delete.go:35 msgid "Force the removal of stopped containers" msgstr "" -#: lxc/main.go:46 +#: lxc/main.go:48 msgid "Force using the local unix socket" msgstr "" -#: lxc/image.go:140 -msgid "Format" +#: lxc/image.go:176 lxc/list.go:130 +msgid "Format (csv|json|table|yaml)" msgstr "" -#: lxc/list.go:135 -msgid "Format (table|json|csv)" -msgstr "" - -#: lxc/remote.go:80 +#: lxc/remote.go:81 msgid "Generating a client certificate. This may take a minute..." msgstr "" -#: lxc/list.go:446 +#: lxc/list.go:459 msgid "IPV4" msgstr "" -#: lxc/list.go:447 +#: lxc/list.go:460 msgid "IPV6" msgstr "" -#: lxc/config.go:311 +#: lxc/config.go:350 msgid "ISSUE DATE" msgstr "" -#: lxc/main.go:139 +#: lxc/main.go:153 msgid "If this is your first time using LXD, you should also run: lxd init" msgstr "" -#: lxc/main.go:47 +#: lxc/main.go:49 msgid "Ignore aliases when determining what command to run" msgstr "" @@ -436,245 +479,229 @@ msgid "Ignore the container state (only for start)" msgstr "" -#: lxc/image.go:312 +#: lxc/image.go:508 msgid "Image already up to date." msgstr "" -#: lxc/image.go:253 +#: lxc/image.go:436 msgid "Image copied successfully!" msgstr "" -#: lxc/image.go:436 lxc/image.go:448 +#: lxc/image.go:898 +msgid "Image exported successfully!" +msgstr "" + +#: lxc/image.go:709 #, c-format msgid "Image imported with fingerprint: %s" msgstr "" -#: lxc/image.go:310 +#: lxc/image.go:506 msgid "Image refreshed successfully!" msgstr "" -#: lxc/image.go:433 -#, c-format -msgid "Importing the image: %s" -msgstr "" - -#: lxc/remote.go:150 +#: lxc/remote.go:151 #, c-format msgid "Invalid URL scheme \"%s\" in \"%s\"" msgstr "" -#: lxc/config.go:290 +#: lxc/config.go:329 msgid "Invalid certificate" msgstr "" -#: lxc/init.go:30 lxc/init.go:35 +#: lxc/init.go:31 lxc/init.go:36 msgid "Invalid configuration key" msgstr "" -#: lxc/file.go:357 +#: lxc/file.go:522 #, c-format msgid "Invalid path %s" msgstr "" -#: lxc/file.go:291 +#: lxc/file.go:451 #, c-format msgid "Invalid source %s" msgstr "" -#: lxc/file.go:80 +#: lxc/file.go:224 #, c-format msgid "Invalid target %s" msgstr "" -#: lxc/info.go:126 +#: lxc/info.go:135 msgid "Ips:" msgstr "" -#: lxc/image.go:138 +#: lxc/image.go:174 msgid "Keep the image up to date after initial copy" msgstr "" -#: lxc/list.go:451 +#: lxc/list.go:464 msgid "LAST USED AT" msgstr "" -#: lxc/main.go:31 +#: lxc/main.go:33 msgid "LXD socket not found; is LXD installed and running?" msgstr "" -#: lxc/image.go:365 +#: lxc/image.go:561 #, c-format msgid "Last used: %s" msgstr "" -#: lxc/image.go:367 +#: lxc/image.go:563 msgid "Last used: never" msgstr "" -#: lxc/info.go:241 +#: lxc/info.go:250 msgid "Log:" msgstr "" -#: lxc/network.go:460 +#: lxc/network.go:506 msgid "MANAGED" msgstr "" -#: lxc/image.go:136 +#: lxc/image.go:172 msgid "Make image public" msgstr "" -#: lxc/publish.go:34 +#: lxc/publish.go:35 msgid "Make the image public" msgstr "" -#: lxc/info.go:163 +#: lxc/info.go:172 msgid "Memory (current)" msgstr "" -#: lxc/info.go:167 +#: lxc/info.go:176 msgid "Memory (peak)" msgstr "" -#: lxc/info.go:179 +#: lxc/info.go:188 msgid "Memory usage:" msgstr "" -#: lxc/copy.go:276 -#, c-format -msgid "Migration failed on source host: %s" -msgstr "" - -#: lxc/copy.go:280 -#, c-format -msgid "Migration failed on target host: %s" -msgstr "" - -#: lxc/utils.go:193 +#: lxc/utils.go:199 msgid "Missing summary." msgstr "" -#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462 +#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494 msgid "More than one device matches, specify the device name." msgstr "" -#: lxc/file.go:279 +#: lxc/file.go:438 msgid "More than one file to download, but target is not a directory" msgstr "" -#: lxc/move.go:35 +#: lxc/move.go:38 msgid "Move the container without its snapshots" msgstr "" -#: lxc/action.go:68 +#: lxc/action.go:72 msgid "Must supply container name for: " msgstr "" -#: lxc/list.go:452 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395 -#: lxc/storage.go:607 lxc/storage.go:696 +#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406 +#: lxc/storage.go:653 lxc/storage.go:748 msgid "NAME" msgstr "" -#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374 +#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385 msgid "NO" msgstr "" -#: lxc/info.go:91 +#: lxc/info.go:99 #, c-format msgid "Name: %s" msgstr "" -#: lxc/network.go:222 +#: lxc/network.go:250 #, c-format msgid "Network %s created" msgstr "" -#: lxc/network.go:325 +#: lxc/network.go:366 #, c-format msgid "Network %s deleted" msgstr "" -#: lxc/init.go:141 lxc/init.go:142 +#: lxc/init.go:142 lxc/init.go:143 msgid "Network name" msgstr "" -#: lxc/info.go:196 +#: lxc/info.go:205 msgid "Network usage:" msgstr "" -#: lxc/image.go:139 lxc/publish.go:35 +#: lxc/image.go:175 lxc/publish.go:36 msgid "New alias to define at target" msgstr "" -#: lxc/config.go:321 +#: lxc/config.go:360 msgid "No certificate provided to add" msgstr "" -#: lxc/network.go:257 lxc/network.go:306 +#: lxc/network.go:285 lxc/network.go:338 msgid "No device found for this network" msgstr "" -#: lxc/storage.go:371 lxc/storage.go:471 +#: lxc/storage.go:383 lxc/storage.go:503 msgid "No device found for this storage volume." msgstr "" -#: lxc/config.go:344 +#: lxc/config.go:392 msgid "No fingerprint specified." msgstr "" -#: lxc/storage.go:323 lxc/storage.go:407 +#: lxc/storage.go:327 lxc/storage.go:420 msgid "Only \"custom\" volumes can be attached to containers." msgstr "" -#: lxc/remote.go:135 +#: lxc/remote.go:136 msgid "Only https URLs are supported for simplestreams" msgstr "" -#: lxc/image.go:439 +#: lxc/image.go:632 msgid "Only https:// is supported for remote image import." msgstr "" -#: lxc/network.go:354 lxc/network.go:482 +#: lxc/network.go:394 lxc/network.go:528 msgid "Only managed networks can be modified." msgstr "" -#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163 +#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177 msgid "Options:" msgstr "" -#: lxc/image.go:550 -#, c-format -msgid "Output is in %s" -msgstr "" - -#: lxc/exec.go:62 +#: lxc/exec.go:63 msgid "Override the terminal mode (auto, interactive or non-interactive)" msgstr "" -#: lxc/list.go:603 +#: lxc/list.go:616 msgid "PERSISTENT" msgstr "" -#: lxc/list.go:453 +#: lxc/list.go:466 msgid "PID" msgstr "" -#: lxc/list.go:454 +#: lxc/list.go:467 msgid "PROFILES" msgstr "" -#: lxc/remote.go:397 +#: lxc/remote.go:408 msgid "PROTOCOL" msgstr "" -#: lxc/image.go:652 lxc/remote.go:398 +#: lxc/image.go:229 lxc/remote.go:409 msgid "PUBLIC" msgstr "" -#: lxc/info.go:190 +#: lxc/info.go:199 msgid "Packets received" msgstr "" -#: lxc/info.go:191 +#: lxc/info.go:200 msgid "Packets sent" msgstr "" @@ -686,24 +713,24 @@ msgid "Path to an alternate server directory" msgstr "" -#: lxc/main.go:202 +#: lxc/main.go:216 msgid "Pause containers." msgstr "" -#: lxc/main.go:35 +#: lxc/main.go:37 msgid "Permission denied, are you in the lxd group?" msgstr "" -#: lxc/info.go:108 +#: lxc/info.go:117 #, c-format msgid "Pid: %d" msgstr "" -#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855 +#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936 msgid "Press enter to open the editor again" msgstr "" -#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:747 +#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108 msgid "Press enter to start the editor again" msgstr "" @@ -719,143 +746,143 @@ msgid "Print verbose information" msgstr "" -#: lxc/info.go:132 +#: lxc/info.go:141 #, c-format msgid "Processes: %d" msgstr "" -#: lxc/profile.go:314 +#: lxc/profile.go:344 #, c-format msgid "Profile %s added to %s" msgstr "" -#: lxc/profile.go:209 +#: lxc/profile.go:218 #, c-format msgid "Profile %s created" msgstr "" -#: lxc/profile.go:279 +#: lxc/profile.go:292 #, c-format msgid "Profile %s deleted" msgstr "" -#: lxc/profile.go:345 +#: lxc/profile.go:379 #, c-format msgid "Profile %s removed from %s" msgstr "" -#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138 +#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139 msgid "Profile to apply to the new container" msgstr "" -#: lxc/profile.go:295 +#: lxc/profile.go:321 #, c-format msgid "Profiles %s applied to %s" msgstr "" -#: lxc/info.go:106 +#: lxc/info.go:115 #, c-format msgid "Profiles: %s" msgstr "" -#: lxc/image.go:369 +#: lxc/image.go:565 msgid "Properties:" msgstr "" -#: lxc/remote.go:69 +#: lxc/remote.go:70 msgid "Public image server" msgstr "" -#: lxc/image.go:352 +#: lxc/image.go:548 #, c-format msgid "Public: %s" msgstr "" -#: lxc/file.go:65 lxc/file.go:66 +#: lxc/file.go:67 lxc/file.go:68 msgid "Recursively push or pull files" msgstr "" -#: lxc/image.go:303 +#: lxc/image.go:489 #, c-format msgid "Refreshing the image: %s" msgstr "" -#: lxc/remote.go:67 +#: lxc/remote.go:68 msgid "Remote admin password" msgstr "" -#: lxc/info.go:93 +#: lxc/info.go:101 #, c-format msgid "Remote: %s" msgstr "" -#: lxc/delete.go:41 +#: lxc/delete.go:42 #, c-format msgid "Remove %s (yes/no): " msgstr "" -#: lxc/delete.go:35 lxc/delete.go:36 +#: lxc/delete.go:36 lxc/delete.go:37 msgid "Require user confirmation" msgstr "" -#: lxc/info.go:129 +#: lxc/info.go:138 msgid "Resources:" msgstr "" -#: lxc/main.go:210 +#: lxc/main.go:224 msgid "Restart containers." msgstr "" -#: lxc/init.go:253 +#: lxc/init.go:286 #, c-format msgid "Retrieving image: %s" msgstr "" -#: lxc/image.go:655 +#: lxc/image.go:232 msgid "SIZE" msgstr "" -#: lxc/list.go:455 +#: lxc/list.go:468 msgid "SNAPSHOTS" msgstr "" -#: lxc/storage.go:610 +#: lxc/storage.go:656 msgid "SOURCE" msgstr "" -#: lxc/list.go:456 +#: lxc/list.go:469 msgid "STATE" msgstr "" -#: lxc/remote.go:399 +#: lxc/remote.go:410 msgid "STATIC" msgstr "" -#: lxc/list.go:458 +#: lxc/list.go:471 msgid "STORAGE POOL" msgstr "" -#: lxc/remote.go:240 +#: lxc/remote.go:236 msgid "Server certificate NACKed by user" msgstr "" -#: lxc/remote.go:302 +#: lxc/remote.go:313 msgid "Server doesn't trust us after adding our cert" msgstr "" -#: lxc/remote.go:68 +#: lxc/remote.go:69 msgid "Server protocol (lxd or simplestreams)" msgstr "" -#: lxc/file.go:63 +#: lxc/file.go:65 msgid "Set the file's gid on push" msgstr "" -#: lxc/file.go:64 +#: lxc/file.go:66 msgid "Set the file's perms on push" msgstr "" -#: lxc/file.go:62 +#: lxc/file.go:64 msgid "Set the file's uid on push" msgstr "" @@ -867,78 +894,83 @@ msgid "Show client version" msgstr "" -#: lxc/info.go:38 +#: lxc/info.go:39 msgid "Show the container's last 100 log lines?" msgstr "" -#: lxc/config.go:33 +#: lxc/config.go:35 msgid "Show the expanded configuration" msgstr "" -#: lxc/image.go:350 +#: lxc/image.go:546 #, c-format msgid "Size: %.2fMB" msgstr "" -#: lxc/info.go:210 +#: lxc/info.go:219 msgid "Snapshots:" msgstr "" -#: lxc/action.go:134 +#: lxc/action.go:142 #, c-format msgid "Some containers failed to %s" msgstr "" -#: lxc/image.go:383 +#: lxc/image.go:579 msgid "Source:" msgstr "" -#: lxc/main.go:220 +#: lxc/main.go:234 msgid "Start containers." msgstr "" -#: lxc/launch.go:152 +#: lxc/launch.go:59 #, c-format msgid "Starting %s" msgstr "" -#: lxc/info.go:100 +#: lxc/info.go:109 #, c-format msgid "Status: %s" msgstr "" -#: lxc/main.go:226 +#: lxc/main.go:240 msgid "Stop containers." msgstr "" -#: lxc/publish.go:36 lxc/publish.go:37 +#: lxc/publish.go:37 lxc/publish.go:38 msgid "Stop the container if currently running" msgstr "" -#: lxc/delete.go:105 lxc/publish.go:114 +#: lxc/publish.go:136 msgid "Stopping container failed!" msgstr "" -#: lxc/storage.go:436 +#: lxc/delete.go:121 +#, c-format +msgid "Stopping the container failed: %s" +msgstr "" + +#: lxc/storage.go:468 #, c-format msgid "Storage pool %s created" msgstr "" -#: lxc/storage.go:486 +#: lxc/storage.go:527 #, c-format msgid "Storage pool %s deleted" msgstr "" -#: lxc/init.go:143 lxc/init.go:144 +#: lxc/init.go:144 lxc/init.go:145 msgid "Storage pool name" msgstr "" -#: lxc/storage.go:720 +#: lxc/storage.go:782 #, c-format msgid "Storage volume %s created" msgstr "" -#: lxc/storage.go:730 +#: lxc/storage.go:797 #, c-format msgid "Storage volume %s deleted" msgstr "" @@ -947,38 +979,42 @@ msgid "Store the container state (only for stop)" msgstr "" -#: lxc/info.go:171 +#: lxc/info.go:180 msgid "Swap (current)" msgstr "" -#: lxc/info.go:175 +#: lxc/info.go:184 msgid "Swap (peak)" msgstr "" -#: lxc/list.go:457 lxc/network.go:459 lxc/storage.go:695 +#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747 msgid "TYPE" msgstr "" -#: lxc/delete.go:91 +#: lxc/delete.go:105 msgid "The container is currently running, stop it first or pass --force." msgstr "" -#: lxc/publish.go:92 +#: lxc/publish.go:101 msgid "" "The container is currently running. Use --force to have it stopped and " "restarted." msgstr "" -#: lxc/init.go:326 +#: lxc/init.go:358 msgid "The container you are starting doesn't have any network attached to it." msgstr "" -#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779 -#: lxc/config.go:817 lxc/config.go:835 +#: lxc/config.go:770 lxc/config.go:787 +msgid "The device already exists" +msgstr "" + +#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899 +#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022 msgid "The device doesn't exist" msgstr "" -#: lxc/init.go:310 +#: lxc/init.go:342 #, c-format msgid "The local image '%s' couldn't be found, trying '%s:' instead." msgstr "" @@ -987,15 +1023,15 @@ msgid "The opposite of \"lxc pause\" is \"lxc start\"." msgstr "" -#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476 +#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508 msgid "The specified device doesn't exist" msgstr "" -#: lxc/network.go:266 lxc/network.go:315 +#: lxc/network.go:294 lxc/network.go:347 msgid "The specified device doesn't match the network" msgstr "" -#: lxc/publish.go:65 +#: lxc/publish.go:74 msgid "There is no \"image name\". Did you want an alias?" msgstr "" @@ -1011,49 +1047,49 @@ msgid "Time to wait for the container before killing it" msgstr "" -#: lxc/image.go:353 +#: lxc/image.go:549 msgid "Timestamps:" msgstr "" -#: lxc/init.go:328 +#: lxc/init.go:360 msgid "To attach a network to a container, use: lxc network attach" msgstr "" -#: lxc/init.go:327 +#: lxc/init.go:359 msgid "To create a new network, use: lxc network create" msgstr "" -#: lxc/main.go:140 +#: lxc/main.go:154 msgid "To start your first container, try: lxc launch ubuntu:16.04" msgstr "" -#: lxc/image.go:441 +#: lxc/image.go:657 #, c-format msgid "Transferring image: %s" msgstr "" -#: lxc/action.go:98 lxc/launch.go:165 +#: lxc/action.go:106 lxc/launch.go:77 #, c-format msgid "Try `lxc info --show-log %s` for more info" msgstr "" -#: lxc/info.go:102 +#: lxc/info.go:111 msgid "Type: ephemeral" msgstr "" -#: lxc/info.go:104 +#: lxc/info.go:113 msgid "Type: persistent" msgstr "" -#: lxc/image.go:656 +#: lxc/image.go:233 msgid "UPLOAD DATE" msgstr "" -#: lxc/remote.go:396 +#: lxc/remote.go:407 msgid "URL" msgstr "" -#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698 +#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750 msgid "USED BY" msgstr "" @@ -1061,11 +1097,16 @@ msgid "Unable to find help2man." msgstr "" -#: lxc/remote.go:110 +#: lxc/remote.go:111 msgid "Unable to read remote TLS certificate" msgstr "" -#: lxc/image.go:358 +#: lxc/file.go:111 +#, c-format +msgid "Unknown file type '%s'" +msgstr "" + +#: lxc/image.go:554 #, c-format msgid "Uploaded: %s" msgstr "" @@ -1082,7 +1123,7 @@ msgid "Usage: lxc [options]" msgstr "" -#: lxc/config.go:58 +#: lxc/config.go:60 msgid "" "Usage: lxc config [options]\n" "\n" @@ -1168,7 +1209,7 @@ "Copy containers within or in between LXD instances." msgstr "" -#: lxc/delete.go:26 +#: lxc/delete.go:27 msgid "" "Usage: lxc delete [:][/] " "[[:][/]...]\n" @@ -1176,7 +1217,7 @@ "Delete containers and snapshots." msgstr "" -#: lxc/exec.go:52 +#: lxc/exec.go:53 msgid "" "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|" "interactive|non-interactive] [--env KEY=VALUE...] [--] \n" @@ -1187,7 +1228,7 @@ "AND stdout are terminals (stderr is ignored)." msgstr "" -#: lxc/file.go:36 +#: lxc/file.go:38 msgid "" "Usage: lxc file [options]\n" "\n" @@ -1231,7 +1272,7 @@ "Help page for the LXD client." msgstr "" -#: lxc/image.go:62 +#: lxc/image.go:72 msgid "" "Usage: lxc image [options]\n" "\n" @@ -1285,11 +1326,38 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" -"lxc image list [:] [filter] [--format table|json]\n" +"lxc image list [:] [filter] [--format csv|json|table|yaml] [-c " +"]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" +" The -c option takes a (optionally comma-separated) list of arguments " +"that\n" +" control which image attributes to output when displaying in table or " +"csv\n" +" format.\n" +"\n" +" Default column layout is: lfpdasu\n" +"\n" +" Column shorthand chars:\n" +"\n" +" l - Shortest image alias (and optionally number of other aliases)\n" +"\n" +" L - Newline-separated list of all image aliases\n" +"\n" +" f - Fingerprint\n" +"\n" +" p - Whether image is public\n" +"\n" +" d - Description\n" +"\n" +" a - Architecture\n" +"\n" +" s - Size\n" +"\n" +" u - Upload date\n" +"\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1309,7 +1377,7 @@ "image alias name." msgstr "" -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "" "Usage: lxc info [:][] [--show-log]\n" "\n" @@ -1322,7 +1390,7 @@ " For LXD server information." msgstr "" -#: lxc/init.go:75 +#: lxc/init.go:76 msgid "" "Usage: lxc init [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1337,7 +1405,7 @@ " lxc init ubuntu:16.04 u1" msgstr "" -#: lxc/launch.go:23 +#: lxc/launch.go:20 msgid "" "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1352,9 +1420,9 @@ " lxc launch ubuntu:16.04 u1" msgstr "" -#: lxc/list.go:49 +#: lxc/list.go:44 msgid "" -"Usage: lxc list [:] [filters] [--format table|json|csv] [-c " +"Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c " "] [--fast]\n" "\n" "List the existing containers.\n" @@ -1466,7 +1534,7 @@ " Only show log message." msgstr "" -#: lxc/move.go:19 +#: lxc/move.go:22 msgid "" "Usage: lxc move [:][/] [:][[/" "]] [--container-only]\n" @@ -1485,7 +1553,7 @@ " Rename a snapshot." msgstr "" -#: lxc/network.go:49 +#: lxc/network.go:50 msgid "" "Usage: lxc network [options]\n" "\n" @@ -1538,7 +1606,7 @@ " Update a network using the content of network.yaml" msgstr "" -#: lxc/profile.go:49 +#: lxc/profile.go:51 msgid "" "Usage: lxc profile [options]\n" "\n" @@ -1620,7 +1688,7 @@ " Remove all profile from \"foo\"" msgstr "" -#: lxc/publish.go:27 +#: lxc/publish.go:28 msgid "" "Usage: lxc publish [:][/] [:] [--" "alias=ALIAS...] [prop-key=prop-value...]\n" @@ -1628,7 +1696,7 @@ "Publish containers as images." msgstr "" -#: lxc/remote.go:38 +#: lxc/remote.go:39 msgid "" "Usage: lxc remote [options]\n" "\n" @@ -1657,7 +1725,7 @@ " Print the default remote." msgstr "" -#: lxc/restore.go:21 +#: lxc/restore.go:22 msgid "" "Usage: lxc restore [:] [--stateful]\n" "\n" @@ -1673,7 +1741,7 @@ " Restore the snapshot." msgstr "" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 msgid "" "Usage: lxc snapshot [:] [--stateful]\n" "\n" @@ -1687,7 +1755,7 @@ " Create a snapshot of \"u1\" called \"snap0\"." msgstr "" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "" "Usage: lxc storage [options]\n" "\n" @@ -1787,157 +1855,128 @@ "Print the version number of this client tool." msgstr "" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "" -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "" "Whether or not to restore the container's running state from snapshot (if " "available)" msgstr "" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "" -#: lxc/exec.go:129 +#: lxc/exec.go:130 msgid "You can't pass -t or -T at the same time as --mode" msgstr "" -#: lxc/main.go:56 -msgid "`lxc config profile` is deprecated, please use `lxc profile`" +#: lxc/copy.go:57 +msgid "You must specify a source container name" msgstr "" -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "" - -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" -msgstr "" - -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" +#: lxc/main.go:58 +msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "" -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 -#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, c-format msgid "error: %v" msgstr "" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, c-format msgid "error: unknown command: %s" msgstr "" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" msgstr "" -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "" - -#: lxc/remote.go:233 +#: lxc/remote.go:229 msgid "ok (y/n)?" msgstr "" -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" msgstr "" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" msgstr "" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" msgstr "" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" msgstr "" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" msgstr "" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" msgstr "" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" msgstr "" -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "" - -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" msgstr "" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" msgstr "" - -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "" diff -Nru lxd-2.14/po/sv.po lxd-2.15/po/sv.po --- lxd-2.14/po/sv.po 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/sv.po 2017-06-28 03:00:23.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2017-05-30 14:59-0400\n" +"POT-Creation-Date: 2017-06-27 00:23-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -16,7 +16,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: lxc/storage.go:30 +#: lxc/storage.go:31 msgid "" "### This is a yaml representation of a storage pool.\n" "### Any line starting with a '# will be ignored.\n" @@ -33,7 +33,7 @@ "### zfs.pool_name: default" msgstr "" -#: lxc/storage.go:47 +#: lxc/storage.go:48 msgid "" "### This is a yaml representation of a storage volume.\n" "### Any line starting with a '# will be ignored.\n" @@ -47,7 +47,7 @@ "### size: \"61203283968\"" msgstr "" -#: lxc/config.go:37 +#: lxc/config.go:39 msgid "" "### This is a yaml representation of the configuration.\n" "### Any line starting with a '# will be ignored.\n" @@ -68,7 +68,7 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:52 +#: lxc/image.go:62 msgid "" "### This is a yaml representation of the image properties.\n" "### Any line starting with a '# will be ignored.\n" @@ -78,7 +78,7 @@ "### description: My custom image" msgstr "" -#: lxc/network.go:29 +#: lxc/network.go:30 msgid "" "### This is a yaml representation of the network.\n" "### Any line starting with a '# will be ignored.\n" @@ -98,7 +98,7 @@ "### Note that only the configuration can be changed." msgstr "" -#: lxc/profile.go:28 +#: lxc/profile.go:30 msgid "" "### This is a yaml representation of the profile.\n" "### Any line starting with a '# will be ignored.\n" @@ -119,102 +119,130 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:629 +#: lxc/image.go:182 #, c-format msgid "%s (%d more)" msgstr "" -#: lxc/snapshot.go:58 +#: lxc/file.go:186 +#, c-format +msgid "%s is not a directory" +msgstr "" + +#: lxc/file.go:128 +#, c-format +msgid "'%s' isn't a regular file or directory." +msgstr "" + +#: lxc/snapshot.go:53 msgid "'/' not allowed in snapshot name" msgstr "" -#: lxc/profile.go:293 +#: lxc/profile.go:319 msgid "(none)" msgstr "" -#: lxc/image.go:650 lxc/image.go:692 +#: lxc/image.go:226 lxc/image.go:1052 msgid "ALIAS" msgstr "" -#: lxc/image.go:654 +#: lxc/image.go:227 +msgid "ALIASES" +msgstr "" + +#: lxc/image.go:231 msgid "ARCH" msgstr "" -#: lxc/list.go:448 +#: lxc/list.go:461 msgid "ARCHITECTURE" msgstr "" -#: lxc/remote.go:66 +#: lxc/remote.go:67 msgid "Accept certificate" msgstr "" -#: lxc/remote.go:282 +#: lxc/remote.go:281 #, c-format msgid "Admin password for %s: " msgstr "" -#: lxc/image.go:373 +#: lxc/image.go:569 msgid "Aliases:" msgstr "" -#: lxc/image.go:351 lxc/info.go:95 +#: lxc/image.go:547 lxc/info.go:104 #, c-format msgid "Architecture: %s" msgstr "" -#: lxc/image.go:381 +#: lxc/image.go:577 #, c-format msgid "Auto update: %s" msgstr "" -#: lxc/info.go:188 +#: lxc/image.go:651 +#, c-format +msgid "Bad property: %s" +msgstr "" + +#: lxc/info.go:197 msgid "Bytes received" msgstr "" -#: lxc/info.go:189 +#: lxc/info.go:198 msgid "Bytes sent" msgstr "" -#: lxc/config.go:310 +#: lxc/config.go:349 msgid "COMMON NAME" msgstr "" -#: lxc/info.go:152 +#: lxc/info.go:161 msgid "CPU usage (in seconds)" msgstr "" -#: lxc/info.go:156 +#: lxc/info.go:165 msgid "CPU usage:" msgstr "" -#: lxc/list.go:449 +#: lxc/list.go:462 msgid "CREATED AT" msgstr "" -#: lxc/config.go:150 lxc/network.go:496 +#: lxc/file.go:479 +msgid "Can't pull a directory without --recursive" +msgstr "" + +#: lxc/config.go:156 lxc/network.go:542 #, c-format msgid "Can't read from stdin: %s" msgstr "" -#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218 +#: lxc/config.go:169 +#, c-format +msgid "Can't unset key '%s', it's not currently set" +msgstr "" + +#: lxc/config.go:211 lxc/config.go:237 #, c-format msgid "Can't unset key '%s', it's not currently set." msgstr "" -#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579 +#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625 msgid "Cannot provide container name to list" msgstr "" -#: lxc/remote.go:232 +#: lxc/remote.go:228 #, c-format msgid "Certificate fingerprint: %s" msgstr "" -#: lxc/remote.go:305 +#: lxc/remote.go:316 msgid "Client certificate stored at server: " msgstr "" -#: lxc/list.go:133 lxc/list.go:134 +#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129 msgid "Columns" msgstr "" @@ -222,35 +250,35 @@ msgid "Commands:" msgstr "" -#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136 +#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137 msgid "Config key/value to apply to the new container" msgstr "" -#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:746 lxc/network.go:378 -#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854 +#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418 +#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935 #, c-format msgid "Config parsing error: %s" msgstr "" -#: lxc/main.go:33 +#: lxc/main.go:35 msgid "Connection refused; is LXD running?" msgstr "" -#: lxc/publish.go:62 +#: lxc/publish.go:71 msgid "Container name is mandatory" msgstr "" -#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244 +#: lxc/copy.go:210 lxc/init.go:313 #, c-format msgid "Container name is: %s" msgstr "" -#: lxc/publish.go:160 lxc/publish.go:175 +#: lxc/publish.go:250 #, c-format msgid "Container published with fingerprint: %s" msgstr "" -#: lxc/image.go:137 +#: lxc/image.go:173 msgid "Copy aliases from source" msgstr "" @@ -258,85 +286,90 @@ msgid "Copy the container without its snapshots" msgstr "" -#: lxc/image.go:250 +#: lxc/image.go:422 #, c-format msgid "Copying the image: %s" msgstr "" -#: lxc/remote.go:247 +#: lxc/remote.go:243 msgid "Could not create server cert dir" msgstr "" -#: lxc/file.go:67 lxc/file.go:68 +#: lxc/file.go:69 lxc/file.go:70 msgid "Create any directories necessary" msgstr "" -#: lxc/image.go:356 lxc/info.go:97 +#: lxc/image.go:552 lxc/info.go:106 #, c-format msgid "Created: %s" msgstr "" -#: lxc/init.go:182 lxc/launch.go:142 +#: lxc/init.go:194 #, c-format msgid "Creating %s" msgstr "" -#: lxc/init.go:180 +#: lxc/init.go:192 msgid "Creating the container" msgstr "" -#: lxc/image.go:653 lxc/image.go:694 lxc/list.go:450 lxc/network.go:461 -#: lxc/storage.go:608 lxc/storage.go:697 +#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507 +#: lxc/storage.go:654 lxc/storage.go:749 msgid "DESCRIPTION" msgstr "" -#: lxc/storage.go:609 +#: lxc/storage.go:655 msgid "DRIVER" msgstr "" -#: lxc/publish.go:38 +#: lxc/publish.go:39 msgid "Define a compression algorithm: for image or none" msgstr "" -#: lxc/config.go:688 +#: lxc/config.go:803 #, c-format msgid "Device %s added to %s" msgstr "" -#: lxc/config.go:875 +#: lxc/config.go:1037 #, c-format msgid "Device %s removed from %s" msgstr "" -#: lxc/exec.go:64 -msgid "Disable pseudo-terminal allocation" +#: lxc/utils.go:248 lxc/utils.go:272 +#, c-format +msgid "Device already exists: %s" msgstr "" #: lxc/exec.go:65 +msgid "Disable pseudo-terminal allocation" +msgstr "" + +#: lxc/exec.go:66 msgid "Disable stdin (reads from /dev/null)" msgstr "" -#: lxc/info.go:145 +#: lxc/info.go:154 msgid "Disk usage:" msgstr "" -#: lxc/list.go:601 +#: lxc/list.go:614 msgid "EPHEMERAL" msgstr "" -#: lxc/config.go:312 +#: lxc/config.go:351 msgid "EXPIRY DATE" msgstr "" -#: lxc/main.go:45 +#: lxc/main.go:47 msgid "Enable debug mode" msgstr "" -#: lxc/main.go:44 +#: lxc/main.go:46 msgid "Enable verbose mode" msgstr "" -#: lxc/exec.go:61 +#: lxc/exec.go:62 msgid "Environment variable to set (e.g. HOME=/home/foo)" msgstr "" @@ -344,7 +377,7 @@ msgid "Environment:" msgstr "" -#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140 +#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141 msgid "Ephemeral container" msgstr "" @@ -352,16 +385,21 @@ msgid "Event type to listen for" msgstr "" -#: lxc/image.go:360 +#: lxc/image.go:556 #, c-format msgid "Expires: %s" msgstr "" -#: lxc/image.go:362 +#: lxc/image.go:558 msgid "Expires: never" msgstr "" -#: lxc/config.go:309 lxc/image.go:651 lxc/image.go:693 +#: lxc/image.go:848 +#, c-format +msgid "Exporting the image: %s" +msgstr "" + +#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053 msgid "FINGERPRINT" msgstr "" @@ -375,16 +413,25 @@ msgid "Failed to generate 'lxc.1': %v" msgstr "" -#: lxc/list.go:136 +#: lxc/copy.go:205 +msgid "Failed to get the new container name" +msgstr "" + +#: lxc/file.go:123 +#, c-format +msgid "Failed to walk path for %s: %s" +msgstr "" + +#: lxc/list.go:131 msgid "Fast mode (same as --columns=nsacPt)" msgstr "" -#: lxc/image.go:349 +#: lxc/image.go:545 #, c-format msgid "Fingerprint: %s" msgstr "" -#: lxc/exec.go:63 +#: lxc/exec.go:64 msgid "Force pseudo-terminal allocation" msgstr "" @@ -392,43 +439,39 @@ msgid "Force the container to shutdown" msgstr "" -#: lxc/delete.go:33 lxc/delete.go:34 +#: lxc/delete.go:34 lxc/delete.go:35 msgid "Force the removal of stopped containers" msgstr "" -#: lxc/main.go:46 +#: lxc/main.go:48 msgid "Force using the local unix socket" msgstr "" -#: lxc/image.go:140 -msgid "Format" +#: lxc/image.go:176 lxc/list.go:130 +msgid "Format (csv|json|table|yaml)" msgstr "" -#: lxc/list.go:135 -msgid "Format (table|json|csv)" -msgstr "" - -#: lxc/remote.go:80 +#: lxc/remote.go:81 msgid "Generating a client certificate. This may take a minute..." msgstr "" -#: lxc/list.go:446 +#: lxc/list.go:459 msgid "IPV4" msgstr "" -#: lxc/list.go:447 +#: lxc/list.go:460 msgid "IPV6" msgstr "" -#: lxc/config.go:311 +#: lxc/config.go:350 msgid "ISSUE DATE" msgstr "" -#: lxc/main.go:139 +#: lxc/main.go:153 msgid "If this is your first time using LXD, you should also run: lxd init" msgstr "" -#: lxc/main.go:47 +#: lxc/main.go:49 msgid "Ignore aliases when determining what command to run" msgstr "" @@ -436,245 +479,229 @@ msgid "Ignore the container state (only for start)" msgstr "" -#: lxc/image.go:312 +#: lxc/image.go:508 msgid "Image already up to date." msgstr "" -#: lxc/image.go:253 +#: lxc/image.go:436 msgid "Image copied successfully!" msgstr "" -#: lxc/image.go:436 lxc/image.go:448 +#: lxc/image.go:898 +msgid "Image exported successfully!" +msgstr "" + +#: lxc/image.go:709 #, c-format msgid "Image imported with fingerprint: %s" msgstr "" -#: lxc/image.go:310 +#: lxc/image.go:506 msgid "Image refreshed successfully!" msgstr "" -#: lxc/image.go:433 -#, c-format -msgid "Importing the image: %s" -msgstr "" - -#: lxc/remote.go:150 +#: lxc/remote.go:151 #, c-format msgid "Invalid URL scheme \"%s\" in \"%s\"" msgstr "" -#: lxc/config.go:290 +#: lxc/config.go:329 msgid "Invalid certificate" msgstr "" -#: lxc/init.go:30 lxc/init.go:35 +#: lxc/init.go:31 lxc/init.go:36 msgid "Invalid configuration key" msgstr "" -#: lxc/file.go:357 +#: lxc/file.go:522 #, c-format msgid "Invalid path %s" msgstr "" -#: lxc/file.go:291 +#: lxc/file.go:451 #, c-format msgid "Invalid source %s" msgstr "" -#: lxc/file.go:80 +#: lxc/file.go:224 #, c-format msgid "Invalid target %s" msgstr "" -#: lxc/info.go:126 +#: lxc/info.go:135 msgid "Ips:" msgstr "" -#: lxc/image.go:138 +#: lxc/image.go:174 msgid "Keep the image up to date after initial copy" msgstr "" -#: lxc/list.go:451 +#: lxc/list.go:464 msgid "LAST USED AT" msgstr "" -#: lxc/main.go:31 +#: lxc/main.go:33 msgid "LXD socket not found; is LXD installed and running?" msgstr "" -#: lxc/image.go:365 +#: lxc/image.go:561 #, c-format msgid "Last used: %s" msgstr "" -#: lxc/image.go:367 +#: lxc/image.go:563 msgid "Last used: never" msgstr "" -#: lxc/info.go:241 +#: lxc/info.go:250 msgid "Log:" msgstr "" -#: lxc/network.go:460 +#: lxc/network.go:506 msgid "MANAGED" msgstr "" -#: lxc/image.go:136 +#: lxc/image.go:172 msgid "Make image public" msgstr "" -#: lxc/publish.go:34 +#: lxc/publish.go:35 msgid "Make the image public" msgstr "" -#: lxc/info.go:163 +#: lxc/info.go:172 msgid "Memory (current)" msgstr "" -#: lxc/info.go:167 +#: lxc/info.go:176 msgid "Memory (peak)" msgstr "" -#: lxc/info.go:179 +#: lxc/info.go:188 msgid "Memory usage:" msgstr "" -#: lxc/copy.go:276 -#, c-format -msgid "Migration failed on source host: %s" -msgstr "" - -#: lxc/copy.go:280 -#, c-format -msgid "Migration failed on target host: %s" -msgstr "" - -#: lxc/utils.go:193 +#: lxc/utils.go:199 msgid "Missing summary." msgstr "" -#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462 +#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494 msgid "More than one device matches, specify the device name." msgstr "" -#: lxc/file.go:279 +#: lxc/file.go:438 msgid "More than one file to download, but target is not a directory" msgstr "" -#: lxc/move.go:35 +#: lxc/move.go:38 msgid "Move the container without its snapshots" msgstr "" -#: lxc/action.go:68 +#: lxc/action.go:72 msgid "Must supply container name for: " msgstr "" -#: lxc/list.go:452 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395 -#: lxc/storage.go:607 lxc/storage.go:696 +#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406 +#: lxc/storage.go:653 lxc/storage.go:748 msgid "NAME" msgstr "" -#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374 +#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385 msgid "NO" msgstr "" -#: lxc/info.go:91 +#: lxc/info.go:99 #, c-format msgid "Name: %s" msgstr "" -#: lxc/network.go:222 +#: lxc/network.go:250 #, c-format msgid "Network %s created" msgstr "" -#: lxc/network.go:325 +#: lxc/network.go:366 #, c-format msgid "Network %s deleted" msgstr "" -#: lxc/init.go:141 lxc/init.go:142 +#: lxc/init.go:142 lxc/init.go:143 msgid "Network name" msgstr "" -#: lxc/info.go:196 +#: lxc/info.go:205 msgid "Network usage:" msgstr "" -#: lxc/image.go:139 lxc/publish.go:35 +#: lxc/image.go:175 lxc/publish.go:36 msgid "New alias to define at target" msgstr "" -#: lxc/config.go:321 +#: lxc/config.go:360 msgid "No certificate provided to add" msgstr "" -#: lxc/network.go:257 lxc/network.go:306 +#: lxc/network.go:285 lxc/network.go:338 msgid "No device found for this network" msgstr "" -#: lxc/storage.go:371 lxc/storage.go:471 +#: lxc/storage.go:383 lxc/storage.go:503 msgid "No device found for this storage volume." msgstr "" -#: lxc/config.go:344 +#: lxc/config.go:392 msgid "No fingerprint specified." msgstr "" -#: lxc/storage.go:323 lxc/storage.go:407 +#: lxc/storage.go:327 lxc/storage.go:420 msgid "Only \"custom\" volumes can be attached to containers." msgstr "" -#: lxc/remote.go:135 +#: lxc/remote.go:136 msgid "Only https URLs are supported for simplestreams" msgstr "" -#: lxc/image.go:439 +#: lxc/image.go:632 msgid "Only https:// is supported for remote image import." msgstr "" -#: lxc/network.go:354 lxc/network.go:482 +#: lxc/network.go:394 lxc/network.go:528 msgid "Only managed networks can be modified." msgstr "" -#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163 +#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177 msgid "Options:" msgstr "" -#: lxc/image.go:550 -#, c-format -msgid "Output is in %s" -msgstr "" - -#: lxc/exec.go:62 +#: lxc/exec.go:63 msgid "Override the terminal mode (auto, interactive or non-interactive)" msgstr "" -#: lxc/list.go:603 +#: lxc/list.go:616 msgid "PERSISTENT" msgstr "" -#: lxc/list.go:453 +#: lxc/list.go:466 msgid "PID" msgstr "" -#: lxc/list.go:454 +#: lxc/list.go:467 msgid "PROFILES" msgstr "" -#: lxc/remote.go:397 +#: lxc/remote.go:408 msgid "PROTOCOL" msgstr "" -#: lxc/image.go:652 lxc/remote.go:398 +#: lxc/image.go:229 lxc/remote.go:409 msgid "PUBLIC" msgstr "" -#: lxc/info.go:190 +#: lxc/info.go:199 msgid "Packets received" msgstr "" -#: lxc/info.go:191 +#: lxc/info.go:200 msgid "Packets sent" msgstr "" @@ -686,24 +713,24 @@ msgid "Path to an alternate server directory" msgstr "" -#: lxc/main.go:202 +#: lxc/main.go:216 msgid "Pause containers." msgstr "" -#: lxc/main.go:35 +#: lxc/main.go:37 msgid "Permission denied, are you in the lxd group?" msgstr "" -#: lxc/info.go:108 +#: lxc/info.go:117 #, c-format msgid "Pid: %d" msgstr "" -#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855 +#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936 msgid "Press enter to open the editor again" msgstr "" -#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:747 +#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108 msgid "Press enter to start the editor again" msgstr "" @@ -719,143 +746,143 @@ msgid "Print verbose information" msgstr "" -#: lxc/info.go:132 +#: lxc/info.go:141 #, c-format msgid "Processes: %d" msgstr "" -#: lxc/profile.go:314 +#: lxc/profile.go:344 #, c-format msgid "Profile %s added to %s" msgstr "" -#: lxc/profile.go:209 +#: lxc/profile.go:218 #, c-format msgid "Profile %s created" msgstr "" -#: lxc/profile.go:279 +#: lxc/profile.go:292 #, c-format msgid "Profile %s deleted" msgstr "" -#: lxc/profile.go:345 +#: lxc/profile.go:379 #, c-format msgid "Profile %s removed from %s" msgstr "" -#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138 +#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139 msgid "Profile to apply to the new container" msgstr "" -#: lxc/profile.go:295 +#: lxc/profile.go:321 #, c-format msgid "Profiles %s applied to %s" msgstr "" -#: lxc/info.go:106 +#: lxc/info.go:115 #, c-format msgid "Profiles: %s" msgstr "" -#: lxc/image.go:369 +#: lxc/image.go:565 msgid "Properties:" msgstr "" -#: lxc/remote.go:69 +#: lxc/remote.go:70 msgid "Public image server" msgstr "" -#: lxc/image.go:352 +#: lxc/image.go:548 #, c-format msgid "Public: %s" msgstr "" -#: lxc/file.go:65 lxc/file.go:66 +#: lxc/file.go:67 lxc/file.go:68 msgid "Recursively push or pull files" msgstr "" -#: lxc/image.go:303 +#: lxc/image.go:489 #, c-format msgid "Refreshing the image: %s" msgstr "" -#: lxc/remote.go:67 +#: lxc/remote.go:68 msgid "Remote admin password" msgstr "" -#: lxc/info.go:93 +#: lxc/info.go:101 #, c-format msgid "Remote: %s" msgstr "" -#: lxc/delete.go:41 +#: lxc/delete.go:42 #, c-format msgid "Remove %s (yes/no): " msgstr "" -#: lxc/delete.go:35 lxc/delete.go:36 +#: lxc/delete.go:36 lxc/delete.go:37 msgid "Require user confirmation" msgstr "" -#: lxc/info.go:129 +#: lxc/info.go:138 msgid "Resources:" msgstr "" -#: lxc/main.go:210 +#: lxc/main.go:224 msgid "Restart containers." msgstr "" -#: lxc/init.go:253 +#: lxc/init.go:286 #, c-format msgid "Retrieving image: %s" msgstr "" -#: lxc/image.go:655 +#: lxc/image.go:232 msgid "SIZE" msgstr "" -#: lxc/list.go:455 +#: lxc/list.go:468 msgid "SNAPSHOTS" msgstr "" -#: lxc/storage.go:610 +#: lxc/storage.go:656 msgid "SOURCE" msgstr "" -#: lxc/list.go:456 +#: lxc/list.go:469 msgid "STATE" msgstr "" -#: lxc/remote.go:399 +#: lxc/remote.go:410 msgid "STATIC" msgstr "" -#: lxc/list.go:458 +#: lxc/list.go:471 msgid "STORAGE POOL" msgstr "" -#: lxc/remote.go:240 +#: lxc/remote.go:236 msgid "Server certificate NACKed by user" msgstr "" -#: lxc/remote.go:302 +#: lxc/remote.go:313 msgid "Server doesn't trust us after adding our cert" msgstr "" -#: lxc/remote.go:68 +#: lxc/remote.go:69 msgid "Server protocol (lxd or simplestreams)" msgstr "" -#: lxc/file.go:63 +#: lxc/file.go:65 msgid "Set the file's gid on push" msgstr "" -#: lxc/file.go:64 +#: lxc/file.go:66 msgid "Set the file's perms on push" msgstr "" -#: lxc/file.go:62 +#: lxc/file.go:64 msgid "Set the file's uid on push" msgstr "" @@ -867,78 +894,83 @@ msgid "Show client version" msgstr "" -#: lxc/info.go:38 +#: lxc/info.go:39 msgid "Show the container's last 100 log lines?" msgstr "" -#: lxc/config.go:33 +#: lxc/config.go:35 msgid "Show the expanded configuration" msgstr "" -#: lxc/image.go:350 +#: lxc/image.go:546 #, c-format msgid "Size: %.2fMB" msgstr "" -#: lxc/info.go:210 +#: lxc/info.go:219 msgid "Snapshots:" msgstr "" -#: lxc/action.go:134 +#: lxc/action.go:142 #, c-format msgid "Some containers failed to %s" msgstr "" -#: lxc/image.go:383 +#: lxc/image.go:579 msgid "Source:" msgstr "" -#: lxc/main.go:220 +#: lxc/main.go:234 msgid "Start containers." msgstr "" -#: lxc/launch.go:152 +#: lxc/launch.go:59 #, c-format msgid "Starting %s" msgstr "" -#: lxc/info.go:100 +#: lxc/info.go:109 #, c-format msgid "Status: %s" msgstr "" -#: lxc/main.go:226 +#: lxc/main.go:240 msgid "Stop containers." msgstr "" -#: lxc/publish.go:36 lxc/publish.go:37 +#: lxc/publish.go:37 lxc/publish.go:38 msgid "Stop the container if currently running" msgstr "" -#: lxc/delete.go:105 lxc/publish.go:114 +#: lxc/publish.go:136 msgid "Stopping container failed!" msgstr "" -#: lxc/storage.go:436 +#: lxc/delete.go:121 +#, c-format +msgid "Stopping the container failed: %s" +msgstr "" + +#: lxc/storage.go:468 #, c-format msgid "Storage pool %s created" msgstr "" -#: lxc/storage.go:486 +#: lxc/storage.go:527 #, c-format msgid "Storage pool %s deleted" msgstr "" -#: lxc/init.go:143 lxc/init.go:144 +#: lxc/init.go:144 lxc/init.go:145 msgid "Storage pool name" msgstr "" -#: lxc/storage.go:720 +#: lxc/storage.go:782 #, c-format msgid "Storage volume %s created" msgstr "" -#: lxc/storage.go:730 +#: lxc/storage.go:797 #, c-format msgid "Storage volume %s deleted" msgstr "" @@ -947,38 +979,42 @@ msgid "Store the container state (only for stop)" msgstr "" -#: lxc/info.go:171 +#: lxc/info.go:180 msgid "Swap (current)" msgstr "" -#: lxc/info.go:175 +#: lxc/info.go:184 msgid "Swap (peak)" msgstr "" -#: lxc/list.go:457 lxc/network.go:459 lxc/storage.go:695 +#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747 msgid "TYPE" msgstr "" -#: lxc/delete.go:91 +#: lxc/delete.go:105 msgid "The container is currently running, stop it first or pass --force." msgstr "" -#: lxc/publish.go:92 +#: lxc/publish.go:101 msgid "" "The container is currently running. Use --force to have it stopped and " "restarted." msgstr "" -#: lxc/init.go:326 +#: lxc/init.go:358 msgid "The container you are starting doesn't have any network attached to it." msgstr "" -#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779 -#: lxc/config.go:817 lxc/config.go:835 +#: lxc/config.go:770 lxc/config.go:787 +msgid "The device already exists" +msgstr "" + +#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899 +#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022 msgid "The device doesn't exist" msgstr "" -#: lxc/init.go:310 +#: lxc/init.go:342 #, c-format msgid "The local image '%s' couldn't be found, trying '%s:' instead." msgstr "" @@ -987,15 +1023,15 @@ msgid "The opposite of \"lxc pause\" is \"lxc start\"." msgstr "" -#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476 +#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508 msgid "The specified device doesn't exist" msgstr "" -#: lxc/network.go:266 lxc/network.go:315 +#: lxc/network.go:294 lxc/network.go:347 msgid "The specified device doesn't match the network" msgstr "" -#: lxc/publish.go:65 +#: lxc/publish.go:74 msgid "There is no \"image name\". Did you want an alias?" msgstr "" @@ -1011,49 +1047,49 @@ msgid "Time to wait for the container before killing it" msgstr "" -#: lxc/image.go:353 +#: lxc/image.go:549 msgid "Timestamps:" msgstr "" -#: lxc/init.go:328 +#: lxc/init.go:360 msgid "To attach a network to a container, use: lxc network attach" msgstr "" -#: lxc/init.go:327 +#: lxc/init.go:359 msgid "To create a new network, use: lxc network create" msgstr "" -#: lxc/main.go:140 +#: lxc/main.go:154 msgid "To start your first container, try: lxc launch ubuntu:16.04" msgstr "" -#: lxc/image.go:441 +#: lxc/image.go:657 #, c-format msgid "Transferring image: %s" msgstr "" -#: lxc/action.go:98 lxc/launch.go:165 +#: lxc/action.go:106 lxc/launch.go:77 #, c-format msgid "Try `lxc info --show-log %s` for more info" msgstr "" -#: lxc/info.go:102 +#: lxc/info.go:111 msgid "Type: ephemeral" msgstr "" -#: lxc/info.go:104 +#: lxc/info.go:113 msgid "Type: persistent" msgstr "" -#: lxc/image.go:656 +#: lxc/image.go:233 msgid "UPLOAD DATE" msgstr "" -#: lxc/remote.go:396 +#: lxc/remote.go:407 msgid "URL" msgstr "" -#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698 +#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750 msgid "USED BY" msgstr "" @@ -1061,11 +1097,16 @@ msgid "Unable to find help2man." msgstr "" -#: lxc/remote.go:110 +#: lxc/remote.go:111 msgid "Unable to read remote TLS certificate" msgstr "" -#: lxc/image.go:358 +#: lxc/file.go:111 +#, c-format +msgid "Unknown file type '%s'" +msgstr "" + +#: lxc/image.go:554 #, c-format msgid "Uploaded: %s" msgstr "" @@ -1082,7 +1123,7 @@ msgid "Usage: lxc [options]" msgstr "" -#: lxc/config.go:58 +#: lxc/config.go:60 msgid "" "Usage: lxc config [options]\n" "\n" @@ -1168,7 +1209,7 @@ "Copy containers within or in between LXD instances." msgstr "" -#: lxc/delete.go:26 +#: lxc/delete.go:27 msgid "" "Usage: lxc delete [:][/] " "[[:][/]...]\n" @@ -1176,7 +1217,7 @@ "Delete containers and snapshots." msgstr "" -#: lxc/exec.go:52 +#: lxc/exec.go:53 msgid "" "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|" "interactive|non-interactive] [--env KEY=VALUE...] [--] \n" @@ -1187,7 +1228,7 @@ "AND stdout are terminals (stderr is ignored)." msgstr "" -#: lxc/file.go:36 +#: lxc/file.go:38 msgid "" "Usage: lxc file [options]\n" "\n" @@ -1231,7 +1272,7 @@ "Help page for the LXD client." msgstr "" -#: lxc/image.go:62 +#: lxc/image.go:72 msgid "" "Usage: lxc image [options]\n" "\n" @@ -1285,11 +1326,38 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" -"lxc image list [:] [filter] [--format table|json]\n" +"lxc image list [:] [filter] [--format csv|json|table|yaml] [-c " +"]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" +" The -c option takes a (optionally comma-separated) list of arguments " +"that\n" +" control which image attributes to output when displaying in table or " +"csv\n" +" format.\n" +"\n" +" Default column layout is: lfpdasu\n" +"\n" +" Column shorthand chars:\n" +"\n" +" l - Shortest image alias (and optionally number of other aliases)\n" +"\n" +" L - Newline-separated list of all image aliases\n" +"\n" +" f - Fingerprint\n" +"\n" +" p - Whether image is public\n" +"\n" +" d - Description\n" +"\n" +" a - Architecture\n" +"\n" +" s - Size\n" +"\n" +" u - Upload date\n" +"\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1309,7 +1377,7 @@ "image alias name." msgstr "" -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "" "Usage: lxc info [:][] [--show-log]\n" "\n" @@ -1322,7 +1390,7 @@ " For LXD server information." msgstr "" -#: lxc/init.go:75 +#: lxc/init.go:76 msgid "" "Usage: lxc init [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1337,7 +1405,7 @@ " lxc init ubuntu:16.04 u1" msgstr "" -#: lxc/launch.go:23 +#: lxc/launch.go:20 msgid "" "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1352,9 +1420,9 @@ " lxc launch ubuntu:16.04 u1" msgstr "" -#: lxc/list.go:49 +#: lxc/list.go:44 msgid "" -"Usage: lxc list [:] [filters] [--format table|json|csv] [-c " +"Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c " "] [--fast]\n" "\n" "List the existing containers.\n" @@ -1466,7 +1534,7 @@ " Only show log message." msgstr "" -#: lxc/move.go:19 +#: lxc/move.go:22 msgid "" "Usage: lxc move [:][/] [:][[/" "]] [--container-only]\n" @@ -1485,7 +1553,7 @@ " Rename a snapshot." msgstr "" -#: lxc/network.go:49 +#: lxc/network.go:50 msgid "" "Usage: lxc network [options]\n" "\n" @@ -1538,7 +1606,7 @@ " Update a network using the content of network.yaml" msgstr "" -#: lxc/profile.go:49 +#: lxc/profile.go:51 msgid "" "Usage: lxc profile [options]\n" "\n" @@ -1620,7 +1688,7 @@ " Remove all profile from \"foo\"" msgstr "" -#: lxc/publish.go:27 +#: lxc/publish.go:28 msgid "" "Usage: lxc publish [:][/] [:] [--" "alias=ALIAS...] [prop-key=prop-value...]\n" @@ -1628,7 +1696,7 @@ "Publish containers as images." msgstr "" -#: lxc/remote.go:38 +#: lxc/remote.go:39 msgid "" "Usage: lxc remote [options]\n" "\n" @@ -1657,7 +1725,7 @@ " Print the default remote." msgstr "" -#: lxc/restore.go:21 +#: lxc/restore.go:22 msgid "" "Usage: lxc restore [:] [--stateful]\n" "\n" @@ -1673,7 +1741,7 @@ " Restore the snapshot." msgstr "" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 msgid "" "Usage: lxc snapshot [:] [--stateful]\n" "\n" @@ -1687,7 +1755,7 @@ " Create a snapshot of \"u1\" called \"snap0\"." msgstr "" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "" "Usage: lxc storage [options]\n" "\n" @@ -1787,157 +1855,128 @@ "Print the version number of this client tool." msgstr "" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "" -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "" "Whether or not to restore the container's running state from snapshot (if " "available)" msgstr "" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "" -#: lxc/exec.go:129 +#: lxc/exec.go:130 msgid "You can't pass -t or -T at the same time as --mode" msgstr "" -#: lxc/main.go:56 -msgid "`lxc config profile` is deprecated, please use `lxc profile`" +#: lxc/copy.go:57 +msgid "You must specify a source container name" msgstr "" -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "" - -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" -msgstr "" - -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" +#: lxc/main.go:58 +msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "" -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 -#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, c-format msgid "error: %v" msgstr "" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, c-format msgid "error: unknown command: %s" msgstr "" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" msgstr "" -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "" - -#: lxc/remote.go:233 +#: lxc/remote.go:229 msgid "ok (y/n)?" msgstr "" -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" msgstr "" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" msgstr "" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" msgstr "" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" msgstr "" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" msgstr "" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" msgstr "" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" msgstr "" -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "" - -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" msgstr "" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" msgstr "" - -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "" diff -Nru lxd-2.14/po/tr.po lxd-2.15/po/tr.po --- lxd-2.14/po/tr.po 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/po/tr.po 2017-06-28 03:00:23.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2017-05-30 14:59-0400\n" +"POT-Creation-Date: 2017-06-27 00:23-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -16,7 +16,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: lxc/storage.go:30 +#: lxc/storage.go:31 msgid "" "### This is a yaml representation of a storage pool.\n" "### Any line starting with a '# will be ignored.\n" @@ -33,7 +33,7 @@ "### zfs.pool_name: default" msgstr "" -#: lxc/storage.go:47 +#: lxc/storage.go:48 msgid "" "### This is a yaml representation of a storage volume.\n" "### Any line starting with a '# will be ignored.\n" @@ -47,7 +47,7 @@ "### size: \"61203283968\"" msgstr "" -#: lxc/config.go:37 +#: lxc/config.go:39 msgid "" "### This is a yaml representation of the configuration.\n" "### Any line starting with a '# will be ignored.\n" @@ -68,7 +68,7 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:52 +#: lxc/image.go:62 msgid "" "### This is a yaml representation of the image properties.\n" "### Any line starting with a '# will be ignored.\n" @@ -78,7 +78,7 @@ "### description: My custom image" msgstr "" -#: lxc/network.go:29 +#: lxc/network.go:30 msgid "" "### This is a yaml representation of the network.\n" "### Any line starting with a '# will be ignored.\n" @@ -98,7 +98,7 @@ "### Note that only the configuration can be changed." msgstr "" -#: lxc/profile.go:28 +#: lxc/profile.go:30 msgid "" "### This is a yaml representation of the profile.\n" "### Any line starting with a '# will be ignored.\n" @@ -119,102 +119,130 @@ "### Note that the name is shown but cannot be changed" msgstr "" -#: lxc/image.go:629 +#: lxc/image.go:182 #, c-format msgid "%s (%d more)" msgstr "" -#: lxc/snapshot.go:58 +#: lxc/file.go:186 +#, c-format +msgid "%s is not a directory" +msgstr "" + +#: lxc/file.go:128 +#, c-format +msgid "'%s' isn't a regular file or directory." +msgstr "" + +#: lxc/snapshot.go:53 msgid "'/' not allowed in snapshot name" msgstr "" -#: lxc/profile.go:293 +#: lxc/profile.go:319 msgid "(none)" msgstr "" -#: lxc/image.go:650 lxc/image.go:692 +#: lxc/image.go:226 lxc/image.go:1052 msgid "ALIAS" msgstr "" -#: lxc/image.go:654 +#: lxc/image.go:227 +msgid "ALIASES" +msgstr "" + +#: lxc/image.go:231 msgid "ARCH" msgstr "" -#: lxc/list.go:448 +#: lxc/list.go:461 msgid "ARCHITECTURE" msgstr "" -#: lxc/remote.go:66 +#: lxc/remote.go:67 msgid "Accept certificate" msgstr "" -#: lxc/remote.go:282 +#: lxc/remote.go:281 #, c-format msgid "Admin password for %s: " msgstr "" -#: lxc/image.go:373 +#: lxc/image.go:569 msgid "Aliases:" msgstr "" -#: lxc/image.go:351 lxc/info.go:95 +#: lxc/image.go:547 lxc/info.go:104 #, c-format msgid "Architecture: %s" msgstr "" -#: lxc/image.go:381 +#: lxc/image.go:577 #, c-format msgid "Auto update: %s" msgstr "" -#: lxc/info.go:188 +#: lxc/image.go:651 +#, c-format +msgid "Bad property: %s" +msgstr "" + +#: lxc/info.go:197 msgid "Bytes received" msgstr "" -#: lxc/info.go:189 +#: lxc/info.go:198 msgid "Bytes sent" msgstr "" -#: lxc/config.go:310 +#: lxc/config.go:349 msgid "COMMON NAME" msgstr "" -#: lxc/info.go:152 +#: lxc/info.go:161 msgid "CPU usage (in seconds)" msgstr "" -#: lxc/info.go:156 +#: lxc/info.go:165 msgid "CPU usage:" msgstr "" -#: lxc/list.go:449 +#: lxc/list.go:462 msgid "CREATED AT" msgstr "" -#: lxc/config.go:150 lxc/network.go:496 +#: lxc/file.go:479 +msgid "Can't pull a directory without --recursive" +msgstr "" + +#: lxc/config.go:156 lxc/network.go:542 #, c-format msgid "Can't read from stdin: %s" msgstr "" -#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218 +#: lxc/config.go:169 +#, c-format +msgid "Can't unset key '%s', it's not currently set" +msgstr "" + +#: lxc/config.go:211 lxc/config.go:237 #, c-format msgid "Can't unset key '%s', it's not currently set." msgstr "" -#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579 +#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625 msgid "Cannot provide container name to list" msgstr "" -#: lxc/remote.go:232 +#: lxc/remote.go:228 #, c-format msgid "Certificate fingerprint: %s" msgstr "" -#: lxc/remote.go:305 +#: lxc/remote.go:316 msgid "Client certificate stored at server: " msgstr "" -#: lxc/list.go:133 lxc/list.go:134 +#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129 msgid "Columns" msgstr "" @@ -222,35 +250,35 @@ msgid "Commands:" msgstr "" -#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136 +#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137 msgid "Config key/value to apply to the new container" msgstr "" -#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:746 lxc/network.go:378 -#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854 +#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418 +#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935 #, c-format msgid "Config parsing error: %s" msgstr "" -#: lxc/main.go:33 +#: lxc/main.go:35 msgid "Connection refused; is LXD running?" msgstr "" -#: lxc/publish.go:62 +#: lxc/publish.go:71 msgid "Container name is mandatory" msgstr "" -#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244 +#: lxc/copy.go:210 lxc/init.go:313 #, c-format msgid "Container name is: %s" msgstr "" -#: lxc/publish.go:160 lxc/publish.go:175 +#: lxc/publish.go:250 #, c-format msgid "Container published with fingerprint: %s" msgstr "" -#: lxc/image.go:137 +#: lxc/image.go:173 msgid "Copy aliases from source" msgstr "" @@ -258,85 +286,90 @@ msgid "Copy the container without its snapshots" msgstr "" -#: lxc/image.go:250 +#: lxc/image.go:422 #, c-format msgid "Copying the image: %s" msgstr "" -#: lxc/remote.go:247 +#: lxc/remote.go:243 msgid "Could not create server cert dir" msgstr "" -#: lxc/file.go:67 lxc/file.go:68 +#: lxc/file.go:69 lxc/file.go:70 msgid "Create any directories necessary" msgstr "" -#: lxc/image.go:356 lxc/info.go:97 +#: lxc/image.go:552 lxc/info.go:106 #, c-format msgid "Created: %s" msgstr "" -#: lxc/init.go:182 lxc/launch.go:142 +#: lxc/init.go:194 #, c-format msgid "Creating %s" msgstr "" -#: lxc/init.go:180 +#: lxc/init.go:192 msgid "Creating the container" msgstr "" -#: lxc/image.go:653 lxc/image.go:694 lxc/list.go:450 lxc/network.go:461 -#: lxc/storage.go:608 lxc/storage.go:697 +#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507 +#: lxc/storage.go:654 lxc/storage.go:749 msgid "DESCRIPTION" msgstr "" -#: lxc/storage.go:609 +#: lxc/storage.go:655 msgid "DRIVER" msgstr "" -#: lxc/publish.go:38 +#: lxc/publish.go:39 msgid "Define a compression algorithm: for image or none" msgstr "" -#: lxc/config.go:688 +#: lxc/config.go:803 #, c-format msgid "Device %s added to %s" msgstr "" -#: lxc/config.go:875 +#: lxc/config.go:1037 #, c-format msgid "Device %s removed from %s" msgstr "" -#: lxc/exec.go:64 -msgid "Disable pseudo-terminal allocation" +#: lxc/utils.go:248 lxc/utils.go:272 +#, c-format +msgid "Device already exists: %s" msgstr "" #: lxc/exec.go:65 +msgid "Disable pseudo-terminal allocation" +msgstr "" + +#: lxc/exec.go:66 msgid "Disable stdin (reads from /dev/null)" msgstr "" -#: lxc/info.go:145 +#: lxc/info.go:154 msgid "Disk usage:" msgstr "" -#: lxc/list.go:601 +#: lxc/list.go:614 msgid "EPHEMERAL" msgstr "" -#: lxc/config.go:312 +#: lxc/config.go:351 msgid "EXPIRY DATE" msgstr "" -#: lxc/main.go:45 +#: lxc/main.go:47 msgid "Enable debug mode" msgstr "" -#: lxc/main.go:44 +#: lxc/main.go:46 msgid "Enable verbose mode" msgstr "" -#: lxc/exec.go:61 +#: lxc/exec.go:62 msgid "Environment variable to set (e.g. HOME=/home/foo)" msgstr "" @@ -344,7 +377,7 @@ msgid "Environment:" msgstr "" -#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140 +#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141 msgid "Ephemeral container" msgstr "" @@ -352,16 +385,21 @@ msgid "Event type to listen for" msgstr "" -#: lxc/image.go:360 +#: lxc/image.go:556 #, c-format msgid "Expires: %s" msgstr "" -#: lxc/image.go:362 +#: lxc/image.go:558 msgid "Expires: never" msgstr "" -#: lxc/config.go:309 lxc/image.go:651 lxc/image.go:693 +#: lxc/image.go:848 +#, c-format +msgid "Exporting the image: %s" +msgstr "" + +#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053 msgid "FINGERPRINT" msgstr "" @@ -375,16 +413,25 @@ msgid "Failed to generate 'lxc.1': %v" msgstr "" -#: lxc/list.go:136 +#: lxc/copy.go:205 +msgid "Failed to get the new container name" +msgstr "" + +#: lxc/file.go:123 +#, c-format +msgid "Failed to walk path for %s: %s" +msgstr "" + +#: lxc/list.go:131 msgid "Fast mode (same as --columns=nsacPt)" msgstr "" -#: lxc/image.go:349 +#: lxc/image.go:545 #, c-format msgid "Fingerprint: %s" msgstr "" -#: lxc/exec.go:63 +#: lxc/exec.go:64 msgid "Force pseudo-terminal allocation" msgstr "" @@ -392,43 +439,39 @@ msgid "Force the container to shutdown" msgstr "" -#: lxc/delete.go:33 lxc/delete.go:34 +#: lxc/delete.go:34 lxc/delete.go:35 msgid "Force the removal of stopped containers" msgstr "" -#: lxc/main.go:46 +#: lxc/main.go:48 msgid "Force using the local unix socket" msgstr "" -#: lxc/image.go:140 -msgid "Format" +#: lxc/image.go:176 lxc/list.go:130 +msgid "Format (csv|json|table|yaml)" msgstr "" -#: lxc/list.go:135 -msgid "Format (table|json|csv)" -msgstr "" - -#: lxc/remote.go:80 +#: lxc/remote.go:81 msgid "Generating a client certificate. This may take a minute..." msgstr "" -#: lxc/list.go:446 +#: lxc/list.go:459 msgid "IPV4" msgstr "" -#: lxc/list.go:447 +#: lxc/list.go:460 msgid "IPV6" msgstr "" -#: lxc/config.go:311 +#: lxc/config.go:350 msgid "ISSUE DATE" msgstr "" -#: lxc/main.go:139 +#: lxc/main.go:153 msgid "If this is your first time using LXD, you should also run: lxd init" msgstr "" -#: lxc/main.go:47 +#: lxc/main.go:49 msgid "Ignore aliases when determining what command to run" msgstr "" @@ -436,245 +479,229 @@ msgid "Ignore the container state (only for start)" msgstr "" -#: lxc/image.go:312 +#: lxc/image.go:508 msgid "Image already up to date." msgstr "" -#: lxc/image.go:253 +#: lxc/image.go:436 msgid "Image copied successfully!" msgstr "" -#: lxc/image.go:436 lxc/image.go:448 +#: lxc/image.go:898 +msgid "Image exported successfully!" +msgstr "" + +#: lxc/image.go:709 #, c-format msgid "Image imported with fingerprint: %s" msgstr "" -#: lxc/image.go:310 +#: lxc/image.go:506 msgid "Image refreshed successfully!" msgstr "" -#: lxc/image.go:433 -#, c-format -msgid "Importing the image: %s" -msgstr "" - -#: lxc/remote.go:150 +#: lxc/remote.go:151 #, c-format msgid "Invalid URL scheme \"%s\" in \"%s\"" msgstr "" -#: lxc/config.go:290 +#: lxc/config.go:329 msgid "Invalid certificate" msgstr "" -#: lxc/init.go:30 lxc/init.go:35 +#: lxc/init.go:31 lxc/init.go:36 msgid "Invalid configuration key" msgstr "" -#: lxc/file.go:357 +#: lxc/file.go:522 #, c-format msgid "Invalid path %s" msgstr "" -#: lxc/file.go:291 +#: lxc/file.go:451 #, c-format msgid "Invalid source %s" msgstr "" -#: lxc/file.go:80 +#: lxc/file.go:224 #, c-format msgid "Invalid target %s" msgstr "" -#: lxc/info.go:126 +#: lxc/info.go:135 msgid "Ips:" msgstr "" -#: lxc/image.go:138 +#: lxc/image.go:174 msgid "Keep the image up to date after initial copy" msgstr "" -#: lxc/list.go:451 +#: lxc/list.go:464 msgid "LAST USED AT" msgstr "" -#: lxc/main.go:31 +#: lxc/main.go:33 msgid "LXD socket not found; is LXD installed and running?" msgstr "" -#: lxc/image.go:365 +#: lxc/image.go:561 #, c-format msgid "Last used: %s" msgstr "" -#: lxc/image.go:367 +#: lxc/image.go:563 msgid "Last used: never" msgstr "" -#: lxc/info.go:241 +#: lxc/info.go:250 msgid "Log:" msgstr "" -#: lxc/network.go:460 +#: lxc/network.go:506 msgid "MANAGED" msgstr "" -#: lxc/image.go:136 +#: lxc/image.go:172 msgid "Make image public" msgstr "" -#: lxc/publish.go:34 +#: lxc/publish.go:35 msgid "Make the image public" msgstr "" -#: lxc/info.go:163 +#: lxc/info.go:172 msgid "Memory (current)" msgstr "" -#: lxc/info.go:167 +#: lxc/info.go:176 msgid "Memory (peak)" msgstr "" -#: lxc/info.go:179 +#: lxc/info.go:188 msgid "Memory usage:" msgstr "" -#: lxc/copy.go:276 -#, c-format -msgid "Migration failed on source host: %s" -msgstr "" - -#: lxc/copy.go:280 -#, c-format -msgid "Migration failed on target host: %s" -msgstr "" - -#: lxc/utils.go:193 +#: lxc/utils.go:199 msgid "Missing summary." msgstr "" -#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462 +#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494 msgid "More than one device matches, specify the device name." msgstr "" -#: lxc/file.go:279 +#: lxc/file.go:438 msgid "More than one file to download, but target is not a directory" msgstr "" -#: lxc/move.go:35 +#: lxc/move.go:38 msgid "Move the container without its snapshots" msgstr "" -#: lxc/action.go:68 +#: lxc/action.go:72 msgid "Must supply container name for: " msgstr "" -#: lxc/list.go:452 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395 -#: lxc/storage.go:607 lxc/storage.go:696 +#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406 +#: lxc/storage.go:653 lxc/storage.go:748 msgid "NAME" msgstr "" -#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374 +#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385 msgid "NO" msgstr "" -#: lxc/info.go:91 +#: lxc/info.go:99 #, c-format msgid "Name: %s" msgstr "" -#: lxc/network.go:222 +#: lxc/network.go:250 #, c-format msgid "Network %s created" msgstr "" -#: lxc/network.go:325 +#: lxc/network.go:366 #, c-format msgid "Network %s deleted" msgstr "" -#: lxc/init.go:141 lxc/init.go:142 +#: lxc/init.go:142 lxc/init.go:143 msgid "Network name" msgstr "" -#: lxc/info.go:196 +#: lxc/info.go:205 msgid "Network usage:" msgstr "" -#: lxc/image.go:139 lxc/publish.go:35 +#: lxc/image.go:175 lxc/publish.go:36 msgid "New alias to define at target" msgstr "" -#: lxc/config.go:321 +#: lxc/config.go:360 msgid "No certificate provided to add" msgstr "" -#: lxc/network.go:257 lxc/network.go:306 +#: lxc/network.go:285 lxc/network.go:338 msgid "No device found for this network" msgstr "" -#: lxc/storage.go:371 lxc/storage.go:471 +#: lxc/storage.go:383 lxc/storage.go:503 msgid "No device found for this storage volume." msgstr "" -#: lxc/config.go:344 +#: lxc/config.go:392 msgid "No fingerprint specified." msgstr "" -#: lxc/storage.go:323 lxc/storage.go:407 +#: lxc/storage.go:327 lxc/storage.go:420 msgid "Only \"custom\" volumes can be attached to containers." msgstr "" -#: lxc/remote.go:135 +#: lxc/remote.go:136 msgid "Only https URLs are supported for simplestreams" msgstr "" -#: lxc/image.go:439 +#: lxc/image.go:632 msgid "Only https:// is supported for remote image import." msgstr "" -#: lxc/network.go:354 lxc/network.go:482 +#: lxc/network.go:394 lxc/network.go:528 msgid "Only managed networks can be modified." msgstr "" -#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163 +#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177 msgid "Options:" msgstr "" -#: lxc/image.go:550 -#, c-format -msgid "Output is in %s" -msgstr "" - -#: lxc/exec.go:62 +#: lxc/exec.go:63 msgid "Override the terminal mode (auto, interactive or non-interactive)" msgstr "" -#: lxc/list.go:603 +#: lxc/list.go:616 msgid "PERSISTENT" msgstr "" -#: lxc/list.go:453 +#: lxc/list.go:466 msgid "PID" msgstr "" -#: lxc/list.go:454 +#: lxc/list.go:467 msgid "PROFILES" msgstr "" -#: lxc/remote.go:397 +#: lxc/remote.go:408 msgid "PROTOCOL" msgstr "" -#: lxc/image.go:652 lxc/remote.go:398 +#: lxc/image.go:229 lxc/remote.go:409 msgid "PUBLIC" msgstr "" -#: lxc/info.go:190 +#: lxc/info.go:199 msgid "Packets received" msgstr "" -#: lxc/info.go:191 +#: lxc/info.go:200 msgid "Packets sent" msgstr "" @@ -686,24 +713,24 @@ msgid "Path to an alternate server directory" msgstr "" -#: lxc/main.go:202 +#: lxc/main.go:216 msgid "Pause containers." msgstr "" -#: lxc/main.go:35 +#: lxc/main.go:37 msgid "Permission denied, are you in the lxd group?" msgstr "" -#: lxc/info.go:108 +#: lxc/info.go:117 #, c-format msgid "Pid: %d" msgstr "" -#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855 +#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936 msgid "Press enter to open the editor again" msgstr "" -#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:747 +#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108 msgid "Press enter to start the editor again" msgstr "" @@ -719,143 +746,143 @@ msgid "Print verbose information" msgstr "" -#: lxc/info.go:132 +#: lxc/info.go:141 #, c-format msgid "Processes: %d" msgstr "" -#: lxc/profile.go:314 +#: lxc/profile.go:344 #, c-format msgid "Profile %s added to %s" msgstr "" -#: lxc/profile.go:209 +#: lxc/profile.go:218 #, c-format msgid "Profile %s created" msgstr "" -#: lxc/profile.go:279 +#: lxc/profile.go:292 #, c-format msgid "Profile %s deleted" msgstr "" -#: lxc/profile.go:345 +#: lxc/profile.go:379 #, c-format msgid "Profile %s removed from %s" msgstr "" -#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138 +#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139 msgid "Profile to apply to the new container" msgstr "" -#: lxc/profile.go:295 +#: lxc/profile.go:321 #, c-format msgid "Profiles %s applied to %s" msgstr "" -#: lxc/info.go:106 +#: lxc/info.go:115 #, c-format msgid "Profiles: %s" msgstr "" -#: lxc/image.go:369 +#: lxc/image.go:565 msgid "Properties:" msgstr "" -#: lxc/remote.go:69 +#: lxc/remote.go:70 msgid "Public image server" msgstr "" -#: lxc/image.go:352 +#: lxc/image.go:548 #, c-format msgid "Public: %s" msgstr "" -#: lxc/file.go:65 lxc/file.go:66 +#: lxc/file.go:67 lxc/file.go:68 msgid "Recursively push or pull files" msgstr "" -#: lxc/image.go:303 +#: lxc/image.go:489 #, c-format msgid "Refreshing the image: %s" msgstr "" -#: lxc/remote.go:67 +#: lxc/remote.go:68 msgid "Remote admin password" msgstr "" -#: lxc/info.go:93 +#: lxc/info.go:101 #, c-format msgid "Remote: %s" msgstr "" -#: lxc/delete.go:41 +#: lxc/delete.go:42 #, c-format msgid "Remove %s (yes/no): " msgstr "" -#: lxc/delete.go:35 lxc/delete.go:36 +#: lxc/delete.go:36 lxc/delete.go:37 msgid "Require user confirmation" msgstr "" -#: lxc/info.go:129 +#: lxc/info.go:138 msgid "Resources:" msgstr "" -#: lxc/main.go:210 +#: lxc/main.go:224 msgid "Restart containers." msgstr "" -#: lxc/init.go:253 +#: lxc/init.go:286 #, c-format msgid "Retrieving image: %s" msgstr "" -#: lxc/image.go:655 +#: lxc/image.go:232 msgid "SIZE" msgstr "" -#: lxc/list.go:455 +#: lxc/list.go:468 msgid "SNAPSHOTS" msgstr "" -#: lxc/storage.go:610 +#: lxc/storage.go:656 msgid "SOURCE" msgstr "" -#: lxc/list.go:456 +#: lxc/list.go:469 msgid "STATE" msgstr "" -#: lxc/remote.go:399 +#: lxc/remote.go:410 msgid "STATIC" msgstr "" -#: lxc/list.go:458 +#: lxc/list.go:471 msgid "STORAGE POOL" msgstr "" -#: lxc/remote.go:240 +#: lxc/remote.go:236 msgid "Server certificate NACKed by user" msgstr "" -#: lxc/remote.go:302 +#: lxc/remote.go:313 msgid "Server doesn't trust us after adding our cert" msgstr "" -#: lxc/remote.go:68 +#: lxc/remote.go:69 msgid "Server protocol (lxd or simplestreams)" msgstr "" -#: lxc/file.go:63 +#: lxc/file.go:65 msgid "Set the file's gid on push" msgstr "" -#: lxc/file.go:64 +#: lxc/file.go:66 msgid "Set the file's perms on push" msgstr "" -#: lxc/file.go:62 +#: lxc/file.go:64 msgid "Set the file's uid on push" msgstr "" @@ -867,78 +894,83 @@ msgid "Show client version" msgstr "" -#: lxc/info.go:38 +#: lxc/info.go:39 msgid "Show the container's last 100 log lines?" msgstr "" -#: lxc/config.go:33 +#: lxc/config.go:35 msgid "Show the expanded configuration" msgstr "" -#: lxc/image.go:350 +#: lxc/image.go:546 #, c-format msgid "Size: %.2fMB" msgstr "" -#: lxc/info.go:210 +#: lxc/info.go:219 msgid "Snapshots:" msgstr "" -#: lxc/action.go:134 +#: lxc/action.go:142 #, c-format msgid "Some containers failed to %s" msgstr "" -#: lxc/image.go:383 +#: lxc/image.go:579 msgid "Source:" msgstr "" -#: lxc/main.go:220 +#: lxc/main.go:234 msgid "Start containers." msgstr "" -#: lxc/launch.go:152 +#: lxc/launch.go:59 #, c-format msgid "Starting %s" msgstr "" -#: lxc/info.go:100 +#: lxc/info.go:109 #, c-format msgid "Status: %s" msgstr "" -#: lxc/main.go:226 +#: lxc/main.go:240 msgid "Stop containers." msgstr "" -#: lxc/publish.go:36 lxc/publish.go:37 +#: lxc/publish.go:37 lxc/publish.go:38 msgid "Stop the container if currently running" msgstr "" -#: lxc/delete.go:105 lxc/publish.go:114 +#: lxc/publish.go:136 msgid "Stopping container failed!" msgstr "" -#: lxc/storage.go:436 +#: lxc/delete.go:121 +#, c-format +msgid "Stopping the container failed: %s" +msgstr "" + +#: lxc/storage.go:468 #, c-format msgid "Storage pool %s created" msgstr "" -#: lxc/storage.go:486 +#: lxc/storage.go:527 #, c-format msgid "Storage pool %s deleted" msgstr "" -#: lxc/init.go:143 lxc/init.go:144 +#: lxc/init.go:144 lxc/init.go:145 msgid "Storage pool name" msgstr "" -#: lxc/storage.go:720 +#: lxc/storage.go:782 #, c-format msgid "Storage volume %s created" msgstr "" -#: lxc/storage.go:730 +#: lxc/storage.go:797 #, c-format msgid "Storage volume %s deleted" msgstr "" @@ -947,38 +979,42 @@ msgid "Store the container state (only for stop)" msgstr "" -#: lxc/info.go:171 +#: lxc/info.go:180 msgid "Swap (current)" msgstr "" -#: lxc/info.go:175 +#: lxc/info.go:184 msgid "Swap (peak)" msgstr "" -#: lxc/list.go:457 lxc/network.go:459 lxc/storage.go:695 +#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747 msgid "TYPE" msgstr "" -#: lxc/delete.go:91 +#: lxc/delete.go:105 msgid "The container is currently running, stop it first or pass --force." msgstr "" -#: lxc/publish.go:92 +#: lxc/publish.go:101 msgid "" "The container is currently running. Use --force to have it stopped and " "restarted." msgstr "" -#: lxc/init.go:326 +#: lxc/init.go:358 msgid "The container you are starting doesn't have any network attached to it." msgstr "" -#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779 -#: lxc/config.go:817 lxc/config.go:835 +#: lxc/config.go:770 lxc/config.go:787 +msgid "The device already exists" +msgstr "" + +#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899 +#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022 msgid "The device doesn't exist" msgstr "" -#: lxc/init.go:310 +#: lxc/init.go:342 #, c-format msgid "The local image '%s' couldn't be found, trying '%s:' instead." msgstr "" @@ -987,15 +1023,15 @@ msgid "The opposite of \"lxc pause\" is \"lxc start\"." msgstr "" -#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476 +#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508 msgid "The specified device doesn't exist" msgstr "" -#: lxc/network.go:266 lxc/network.go:315 +#: lxc/network.go:294 lxc/network.go:347 msgid "The specified device doesn't match the network" msgstr "" -#: lxc/publish.go:65 +#: lxc/publish.go:74 msgid "There is no \"image name\". Did you want an alias?" msgstr "" @@ -1011,49 +1047,49 @@ msgid "Time to wait for the container before killing it" msgstr "" -#: lxc/image.go:353 +#: lxc/image.go:549 msgid "Timestamps:" msgstr "" -#: lxc/init.go:328 +#: lxc/init.go:360 msgid "To attach a network to a container, use: lxc network attach" msgstr "" -#: lxc/init.go:327 +#: lxc/init.go:359 msgid "To create a new network, use: lxc network create" msgstr "" -#: lxc/main.go:140 +#: lxc/main.go:154 msgid "To start your first container, try: lxc launch ubuntu:16.04" msgstr "" -#: lxc/image.go:441 +#: lxc/image.go:657 #, c-format msgid "Transferring image: %s" msgstr "" -#: lxc/action.go:98 lxc/launch.go:165 +#: lxc/action.go:106 lxc/launch.go:77 #, c-format msgid "Try `lxc info --show-log %s` for more info" msgstr "" -#: lxc/info.go:102 +#: lxc/info.go:111 msgid "Type: ephemeral" msgstr "" -#: lxc/info.go:104 +#: lxc/info.go:113 msgid "Type: persistent" msgstr "" -#: lxc/image.go:656 +#: lxc/image.go:233 msgid "UPLOAD DATE" msgstr "" -#: lxc/remote.go:396 +#: lxc/remote.go:407 msgid "URL" msgstr "" -#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698 +#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750 msgid "USED BY" msgstr "" @@ -1061,11 +1097,16 @@ msgid "Unable to find help2man." msgstr "" -#: lxc/remote.go:110 +#: lxc/remote.go:111 msgid "Unable to read remote TLS certificate" msgstr "" -#: lxc/image.go:358 +#: lxc/file.go:111 +#, c-format +msgid "Unknown file type '%s'" +msgstr "" + +#: lxc/image.go:554 #, c-format msgid "Uploaded: %s" msgstr "" @@ -1082,7 +1123,7 @@ msgid "Usage: lxc [options]" msgstr "" -#: lxc/config.go:58 +#: lxc/config.go:60 msgid "" "Usage: lxc config [options]\n" "\n" @@ -1168,7 +1209,7 @@ "Copy containers within or in between LXD instances." msgstr "" -#: lxc/delete.go:26 +#: lxc/delete.go:27 msgid "" "Usage: lxc delete [:][/] " "[[:][/]...]\n" @@ -1176,7 +1217,7 @@ "Delete containers and snapshots." msgstr "" -#: lxc/exec.go:52 +#: lxc/exec.go:53 msgid "" "Usage: lxc exec [:] [-t] [-T] [-n] [--mode=auto|" "interactive|non-interactive] [--env KEY=VALUE...] [--] \n" @@ -1187,7 +1228,7 @@ "AND stdout are terminals (stderr is ignored)." msgstr "" -#: lxc/file.go:36 +#: lxc/file.go:38 msgid "" "Usage: lxc file [options]\n" "\n" @@ -1231,7 +1272,7 @@ "Help page for the LXD client." msgstr "" -#: lxc/image.go:62 +#: lxc/image.go:72 msgid "" "Usage: lxc image [options]\n" "\n" @@ -1285,11 +1326,38 @@ "lxc image info [:]\n" " Print everything LXD knows about a given image.\n" "\n" -"lxc image list [:] [filter] [--format table|json]\n" +"lxc image list [:] [filter] [--format csv|json|table|yaml] [-c " +"]\n" " List images in the LXD image store. Filters may be of the\n" " = form for property based filtering, or part of the image\n" " hash or part of the image alias name.\n" "\n" +" The -c option takes a (optionally comma-separated) list of arguments " +"that\n" +" control which image attributes to output when displaying in table or " +"csv\n" +" format.\n" +"\n" +" Default column layout is: lfpdasu\n" +"\n" +" Column shorthand chars:\n" +"\n" +" l - Shortest image alias (and optionally number of other aliases)\n" +"\n" +" L - Newline-separated list of all image aliases\n" +"\n" +" f - Fingerprint\n" +"\n" +" p - Whether image is public\n" +"\n" +" d - Description\n" +"\n" +" a - Architecture\n" +"\n" +" s - Size\n" +"\n" +" u - Upload date\n" +"\n" "lxc image show [:]\n" " Yaml output of the user modifiable properties of an image.\n" "\n" @@ -1309,7 +1377,7 @@ "image alias name." msgstr "" -#: lxc/info.go:25 +#: lxc/info.go:26 msgid "" "Usage: lxc info [:][] [--show-log]\n" "\n" @@ -1322,7 +1390,7 @@ " For LXD server information." msgstr "" -#: lxc/init.go:75 +#: lxc/init.go:76 msgid "" "Usage: lxc init [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1337,7 +1405,7 @@ " lxc init ubuntu:16.04 u1" msgstr "" -#: lxc/launch.go:23 +#: lxc/launch.go:20 msgid "" "Usage: lxc launch [:] [:][] [--ephemeral|-e] [--" "profile|-p ...] [--config|-c ...] [--network|-n " @@ -1352,9 +1420,9 @@ " lxc launch ubuntu:16.04 u1" msgstr "" -#: lxc/list.go:49 +#: lxc/list.go:44 msgid "" -"Usage: lxc list [:] [filters] [--format table|json|csv] [-c " +"Usage: lxc list [:] [filters] [--format csv|json|table|yaml] [-c " "] [--fast]\n" "\n" "List the existing containers.\n" @@ -1466,7 +1534,7 @@ " Only show log message." msgstr "" -#: lxc/move.go:19 +#: lxc/move.go:22 msgid "" "Usage: lxc move [:][/] [:][[/" "]] [--container-only]\n" @@ -1485,7 +1553,7 @@ " Rename a snapshot." msgstr "" -#: lxc/network.go:49 +#: lxc/network.go:50 msgid "" "Usage: lxc network [options]\n" "\n" @@ -1538,7 +1606,7 @@ " Update a network using the content of network.yaml" msgstr "" -#: lxc/profile.go:49 +#: lxc/profile.go:51 msgid "" "Usage: lxc profile [options]\n" "\n" @@ -1620,7 +1688,7 @@ " Remove all profile from \"foo\"" msgstr "" -#: lxc/publish.go:27 +#: lxc/publish.go:28 msgid "" "Usage: lxc publish [:][/] [:] [--" "alias=ALIAS...] [prop-key=prop-value...]\n" @@ -1628,7 +1696,7 @@ "Publish containers as images." msgstr "" -#: lxc/remote.go:38 +#: lxc/remote.go:39 msgid "" "Usage: lxc remote [options]\n" "\n" @@ -1657,7 +1725,7 @@ " Print the default remote." msgstr "" -#: lxc/restore.go:21 +#: lxc/restore.go:22 msgid "" "Usage: lxc restore [:] [--stateful]\n" "\n" @@ -1673,7 +1741,7 @@ " Restore the snapshot." msgstr "" -#: lxc/snapshot.go:21 +#: lxc/snapshot.go:22 msgid "" "Usage: lxc snapshot [:] [--stateful]\n" "\n" @@ -1687,7 +1755,7 @@ " Create a snapshot of \"u1\" called \"snap0\"." msgstr "" -#: lxc/storage.go:61 +#: lxc/storage.go:62 msgid "" "Usage: lxc storage [options]\n" "\n" @@ -1787,157 +1855,128 @@ "Print the version number of this client tool." msgstr "" -#: lxc/delete.go:45 +#: lxc/delete.go:46 msgid "User aborted delete operation." msgstr "" -#: lxc/restore.go:37 +#: lxc/restore.go:38 msgid "" "Whether or not to restore the container's running state from snapshot (if " "available)" msgstr "" -#: lxc/snapshot.go:35 +#: lxc/snapshot.go:36 msgid "Whether or not to snapshot the container's running state" msgstr "" -#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376 +#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387 msgid "YES" msgstr "" -#: lxc/exec.go:125 +#: lxc/exec.go:126 msgid "You can't pass -t and -T at the same time" msgstr "" -#: lxc/exec.go:129 +#: lxc/exec.go:130 msgid "You can't pass -t or -T at the same time as --mode" msgstr "" -#: lxc/main.go:56 -msgid "`lxc config profile` is deprecated, please use `lxc profile`" +#: lxc/copy.go:57 +msgid "You must specify a source container name" msgstr "" -#: lxc/launch.go:134 -msgid "bad number of things scanned from image, container or snapshot" -msgstr "" - -#: lxc/action.go:94 -msgid "bad result type from action" -msgstr "" - -#: lxc/copy.go:118 -msgid "can't copy to the same container name" -msgstr "" - -#: lxc/file.go:314 -msgid "can't pull a directory without --recursive" +#: lxc/main.go:58 +msgid "`lxc config profile` is deprecated, please use `lxc profile`" msgstr "" -#: lxc/remote.go:359 +#: lxc/remote.go:370 msgid "can't remove the default remote" msgstr "" -#: lxc/file.go:125 +#: lxc/file.go:272 msgid "can't supply uid/gid/mode in recursive mode" msgstr "" -#: lxc/remote.go:385 +#: lxc/remote.go:396 msgid "default" msgstr "" -#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 -#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121 +#: lxc/init.go:308 msgid "didn't get any affected image, container or snapshot from server" msgstr "" -#: lxc/image.go:344 +#: lxc/image.go:540 msgid "disabled" msgstr "" -#: lxc/image.go:346 +#: lxc/image.go:542 msgid "enabled" msgstr "" -#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159 +#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173 #, c-format msgid "error: %v" msgstr "" -#: lxc/help.go:37 lxc/main.go:106 +#: lxc/help.go:37 lxc/main.go:114 #, c-format msgid "error: unknown command: %s" msgstr "" -#: lxc/launch.go:139 -msgid "got bad version" -msgstr "" - -#: lxc/image.go:339 lxc/image.go:632 +#: lxc/image.go:205 lxc/image.go:535 msgid "no" msgstr "" -#: lxc/copy.go:167 -msgid "not all the profiles from the source exist on the target" -msgstr "" - -#: lxc/remote.go:233 +#: lxc/remote.go:229 msgid "ok (y/n)?" msgstr "" -#: lxc/main.go:331 lxc/main.go:335 +#: lxc/main.go:345 lxc/main.go:349 #, c-format msgid "processing aliases failed %s\n" msgstr "" -#: lxc/file.go:381 +#: lxc/file.go:550 msgid "recursive edit doesn't make sense :(" msgstr "" -#: lxc/remote.go:421 +#: lxc/remote.go:432 #, c-format msgid "remote %s already exists" msgstr "" -#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464 +#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475 #, c-format msgid "remote %s doesn't exist" msgstr "" -#: lxc/remote.go:334 +#: lxc/remote.go:345 #, c-format msgid "remote %s exists as <%s>" msgstr "" -#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452 +#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463 #, c-format msgid "remote %s is static and cannot be modified" msgstr "" -#: lxc/info.go:221 +#: lxc/info.go:230 msgid "stateful" msgstr "" -#: lxc/info.go:223 +#: lxc/info.go:232 msgid "stateless" msgstr "" -#: lxc/info.go:217 +#: lxc/info.go:226 #, c-format msgid "taken at %s" msgstr "" -#: lxc/exec.go:214 -msgid "unreachable return reached" -msgstr "" - -#: lxc/main.go:262 +#: lxc/main.go:276 msgid "wrong number of subcommand arguments" msgstr "" -#: lxc/delete.go:44 lxc/image.go:341 lxc/image.go:636 +#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537 msgid "yes" msgstr "" - -#: lxc/copy.go:47 -msgid "you must specify a source container name" -msgstr "" diff -Nru lxd-2.14/shared/api/container.go lxd-2.15/shared/api/container.go --- lxd-2.14/shared/api/container.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/shared/api/container.go 2017-06-28 03:00:23.000000000 +0000 @@ -29,9 +29,6 @@ // ContainerPut represents the modifiable fields of a LXD container type ContainerPut struct { - // API extension: entity_description - Description string `json:"description" yaml:"description"` - Architecture string `json:"architecture" yaml:"architecture"` Config map[string]string `json:"config" yaml:"config"` Devices map[string]map[string]string `json:"devices" yaml:"devices"` @@ -41,6 +38,9 @@ // For snapshot restore Restore string `json:"restore,omitempty" yaml:"restore,omitempty"` Stateful bool `json:"stateful" yaml:"stateful"` + + // API extension: entity_description + Description string `json:"description" yaml:"description"` } // Container represents a LXD container @@ -96,12 +96,12 @@ Operation string `json:"operation,omitempty" yaml:"operation,omitempty"` Websockets map[string]string `json:"secrets,omitempty" yaml:"secrets,omitempty"` - // API extension: container_push - Live bool `json:"live,omitempty" yaml:"live,omitempty"` - // For "copy" type Source string `json:"source,omitempty" yaml:"source,omitempty"` + // API extension: container_push + Live bool `json:"live,omitempty" yaml:"live,omitempty"` + // API extension: container_only_migration ContainerOnly bool `json:"container_only,omitempty" yaml:"container_only,omitempty"` } diff -Nru lxd-2.14/shared/api/network.go lxd-2.15/shared/api/network.go --- lxd-2.14/shared/api/network.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/shared/api/network.go 2017-06-28 03:00:23.000000000 +0000 @@ -22,10 +22,10 @@ // // API extension: network type NetworkPut struct { + Config map[string]string `json:"config" yaml:"config"` + // API extension: entity_description Description string `json:"description" yaml:"description"` - - Config map[string]string `json:"config" yaml:"config"` } // Network represents a LXD network diff -Nru lxd-2.14/shared/api/storage.go lxd-2.15/shared/api/storage.go --- lxd-2.14/shared/api/storage.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/shared/api/storage.go 2017-06-28 03:00:23.000000000 +0000 @@ -25,10 +25,10 @@ // // API extension: storage type StoragePoolPut struct { + Config map[string]string `json:"config" yaml:"config"` + // API extension: entity_description Description string `json:"description" yaml:"description"` - - Config map[string]string `json:"config" yaml:"config"` } // StorageVolumesPost represents the fields of a new LXD storage pool volume @@ -55,10 +55,10 @@ // // API extension: storage type StorageVolumePut struct { + Config map[string]string `json:"config" yaml:"config"` + // API extension: entity_description Description string `json:"description" yaml:"description"` - - Config map[string]string `json:"config" yaml:"config"` } // Writable converts a full StoragePool struct into a StoragePoolPut struct diff -Nru lxd-2.14/shared/cancel/canceler.go lxd-2.15/shared/cancel/canceler.go --- lxd-2.14/shared/cancel/canceler.go 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/shared/cancel/canceler.go 2017-06-28 03:00:23.000000000 +0000 @@ -0,0 +1,51 @@ +package cancel + +import ( + "fmt" + "net/http" +) + +// A struct to track canceleation +type Canceler struct { + chCancel chan bool +} + +func (c *Canceler) Cancelable() bool { + return c.chCancel != nil +} + +func (c *Canceler) Cancel() error { + if c.chCancel == nil { + return fmt.Errorf("This operation cannot be canceled at this time") + } + + close(c.chCancel) + c.chCancel = nil + return nil +} + +func CancelableDownload(c *Canceler, client *http.Client, req *http.Request) (*http.Response, error, chan bool) { + chDone := make(chan bool) + + go func() { + chCancel := make(chan bool) + if c != nil { + c.chCancel = chCancel + } + + select { + case <-c.chCancel: + if transport, ok := client.Transport.(*http.Transport); ok { + transport.CancelRequest(req) + } + case <-chDone: + } + + if c != nil { + c.chCancel = nil + } + }() + + resp, err := client.Do(req) + return resp, err, chDone +} diff -Nru lxd-2.14/shared/util_linux.go lxd-2.15/shared/util_linux.go --- lxd-2.14/shared/util_linux.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/shared/util_linux.go 2017-06-28 03:00:23.000000000 +0000 @@ -570,12 +570,14 @@ atomic.StoreInt32(&attachedChildIsDead, 1) - ret, revents, err := GetPollRevents(fd, 0, (POLLIN | POLLPRI | POLLERR | POLLHUP | POLLRDHUP)) + ret, revents, err := GetPollRevents(fd, 0, (POLLIN | POLLPRI | POLLERR | POLLHUP | POLLRDHUP | POLLNVAL)) if ret < 0 { logger.Errorf("Failed to poll(POLLIN | POLLPRI | POLLHUP | POLLRDHUP) on file descriptor: %s.", err) } else if ret > 0 { if (revents & POLLERR) > 0 { logger.Warnf("Detected poll(POLLERR) event.") + } else if (revents & POLLNVAL) > 0 { + logger.Warnf("Detected poll(POLLNVAL) event.") } } else if ret == 0 { logger.Debugf("No data in stdout: exiting.") @@ -595,7 +597,7 @@ nr := 0 var err error - ret, revents, err := GetPollRevents(fd, -1, (POLLIN | POLLPRI | POLLERR | POLLHUP | POLLRDHUP)) + ret, revents, err := GetPollRevents(fd, -1, (POLLIN | POLLPRI | POLLERR | POLLHUP | POLLRDHUP | POLLNVAL)) if ret < 0 { // This condition is only reached in cases where we are massively f*cked since we even handle // EINTR in the underlying C wrapper around poll(). So let's exit here. @@ -616,6 +618,9 @@ if (revents & POLLERR) > 0 { logger.Warnf("Detected poll(POLLERR) event: exiting.") return + } else if (revents & POLLNVAL) > 0 { + logger.Warnf("Detected poll(POLLNVAL) event: exiting.") + return } if ((revents & (POLLIN | POLLPRI)) > 0) && !both { @@ -671,11 +676,11 @@ // or (POLLHUP | POLLRDHUP). Both will trigger another codepath (See [2].) // that takes care that all data of the child that is buffered in // stdout is written out. - ret, revents, err := GetPollRevents(fd, 0, (POLLIN | POLLPRI | POLLERR | POLLHUP | POLLRDHUP)) + ret, revents, err := GetPollRevents(fd, 0, (POLLIN | POLLPRI | POLLERR | POLLHUP | POLLRDHUP | POLLNVAL)) if ret < 0 { logger.Errorf("Failed to poll(POLLIN | POLLPRI | POLLERR | POLLHUP | POLLRDHUP) on file descriptor: %s. Exiting.", err) return - } else if (revents & (POLLHUP | POLLRDHUP)) == 0 { + } else if (revents & (POLLHUP | POLLRDHUP | POLLERR | POLLNVAL)) == 0 { logger.Debugf("Exiting but background processes are still running.") return } diff -Nru lxd-2.14/shared/util_windows.go lxd-2.15/shared/util_windows.go --- lxd-2.14/shared/util_windows.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/shared/util_windows.go 2017-06-28 03:00:23.000000000 +0000 @@ -7,5 +7,5 @@ ) func GetOwnerMode(fInfo os.FileInfo) (os.FileMode, int, int) { - return os.FileMode(0), -1, -1 + return fInfo.Mode(), -1, -1 } diff -Nru lxd-2.14/shared/version/flex.go lxd-2.15/shared/version/flex.go --- lxd-2.14/shared/version/flex.go 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/shared/version/flex.go 2017-06-28 03:00:23.000000000 +0000 @@ -1,7 +1,7 @@ package version // Version contains the LXD version number -var Version = "2.14" +var Version = "2.15" // UserAgent contains a string suitable as a user-agent var UserAgent = "LXD " + Version diff -Nru lxd-2.14/test/main.sh lxd-2.15/test/main.sh --- lxd-2.14/test/main.sh 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/test/main.sh 2017-06-28 03:00:23.000000000 +0000 @@ -599,6 +599,7 @@ run_test test_basic_usage "basic usage" run_test test_security "security features" run_test test_image_expiry "image expiry" +run_test test_image_list_all_aliases "image list all aliases" run_test test_image_auto_update "image auto-update" run_test test_image_prefer_cached "image prefer cached" run_test test_concurrent_exec "concurrent exec" @@ -626,5 +627,6 @@ run_test test_init_preseed "lxd init preseed" run_test test_storage_profiles "storage profiles" run_test test_container_import "container import" +run_test test_storage_volume_attach "attaching storage volumes" TEST_RESULT=success diff -Nru lxd-2.14/test/suites/basic.sh lxd-2.15/test/suites/basic.sh --- lxd-2.14/test/suites/basic.sh 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/test/suites/basic.sh 2017-06-28 03:00:23.000000000 +0000 @@ -52,8 +52,8 @@ # Test custom filename for image export lxc image export testimage "${LXD_DIR}/foo" - [ "${sum}" = "$(sha256sum "${LXD_DIR}/foo.tar.xz" | cut -d' ' -f1)" ] - rm "${LXD_DIR}/foo.tar.xz" + [ "${sum}" = "$(sha256sum "${LXD_DIR}/foo" | cut -d' ' -f1)" ] + rm "${LXD_DIR}/foo" # Test image export with a split image. diff -Nru lxd-2.14/test/suites/filemanip.sh lxd-2.15/test/suites/filemanip.sh --- lxd-2.14/test/suites/filemanip.sh 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/test/suites/filemanip.sh 2017-06-28 03:00:23.000000000 +0000 @@ -51,6 +51,13 @@ # created. cd source + lxc file push -r ./ filemanip/tmp/ptest + + [ "$(lxc exec filemanip -- stat -c "%u" /tmp/ptest/another_level)" = "1000" ] + [ "$(lxc exec filemanip -- stat -c "%g" /tmp/ptest/another_level)" = "1000" ] + + lxc exec filemanip -- rm -rf /tmp/ptest/* + lxc file push -r ../source filemanip/tmp/ptest [ "$(lxc exec filemanip -- stat -c "%u" /tmp/ptest/source)" = "$(id -u)" ] diff -Nru lxd-2.14/test/suites/image.sh lxd-2.15/test/suites/image.sh --- lxd-2.14/test/suites/image.sh 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/test/suites/image.sh 2017-06-28 03:00:23.000000000 +0000 @@ -38,3 +38,15 @@ lxc_remote remote remove l2 kill_lxd "$LXD2_DIR" } + +test_image_list_all_aliases() { + ensure_import_testimage + # shellcheck disable=2039,2034,2155 + local sum=$(lxc image info testimage | grep ^Fingerprint | cut -d' ' -f2) + lxc image alias create zzz "$sum" + lxc image list | grep -vq zzz + # both aliases are listed if the "aliases" column is included in output + lxc image list -c L | grep -q testimage + lxc image list -c L | grep -q zzz + +} diff -Nru lxd-2.14/test/suites/migration.sh lxd-2.15/test/suites/migration.sh --- lxd-2.14/test/suites/migration.sh 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/test/suites/migration.sh 2017-06-28 03:00:23.000000000 +0000 @@ -23,7 +23,11 @@ migration "$LXD2_DIR" - if [ "${lxd_backend}" = "lvm" ]; then + # This should only run on lvm and when the backend is not random. Otherwise + # we might perform existence checks for files or dirs that won't be available + # since the logical volume is not mounted when the container is not running. + # shellcheck disable=2153 + if [ "${LXD_BACKEND}" = "lvm" ]; then # Test that non-thinpool lvm backends work fine with migration. # shellcheck disable=2039 @@ -124,27 +128,33 @@ # Test container only copies lxc init testimage cccp + echo "before" | lxc file push - cccp/blah lxc snapshot cccp lxc snapshot cccp + echo "after" | lxc file push - cccp/blah # Local container only copy. lxc copy cccp udssr --container-only [ "$(lxc info udssr | grep -c snap)" -eq 0 ] + [ "$(lxc file pull udssr/blah -)" = "after" ] lxc delete udssr # Local container with snapshots copy. lxc copy cccp udssr [ "$(lxc info udssr | grep -c snap)" -eq 2 ] + [ "$(lxc file pull udssr/blah -)" = "after" ] lxc delete udssr # Remote container only copy. lxc_remote copy l1:cccp l2:udssr --container-only [ "$(lxc_remote info l2:udssr | grep -c snap)" -eq 0 ] + [ "$(lxc_remote file pull l2:udssr/blah -)" = "after" ] lxc_remote delete l2:udssr # Remote container with snapshots copy. lxc_remote copy l1:cccp l2:udssr [ "$(lxc_remote info l2:udssr | grep -c snap)" -eq 2 ] + [ "$(lxc_remote file pull l2:udssr/blah -)" = "after" ] lxc_remote delete l2:udssr # Remote container only move. diff -Nru lxd-2.14/test/suites/remote.sh lxd-2.15/test/suites/remote.sh --- lxd-2.14/test/suites/remote.sh 2017-05-30 19:01:54.000000000 +0000 +++ lxd-2.15/test/suites/remote.sh 2017-06-28 03:00:23.000000000 +0000 @@ -17,7 +17,6 @@ for url in ${urls}; do lxc_remote remote add test "${url}" - lxc_remote finger test: lxc_remote remote remove test done } @@ -82,10 +81,11 @@ lxc_remote remote add lxd2 "${LXD2_ADDR}" --accept-certificate --password foo # we need a public image on localhost - img=$(lxc_remote image export localhost:testimage "${LXD_DIR}/foo" | grep -o "foo.*") + + lxc_remote image export localhost:testimage "${LXD_DIR}/foo" lxc_remote image delete localhost:testimage - sum=$(sha256sum "${LXD_DIR}/${img}" | cut -d' ' -f1) - lxc_remote image import "${LXD_DIR}/${img}" localhost: --public + sum=$(sha256sum "${LXD_DIR}/foo" | cut -d' ' -f1) + lxc_remote image import "${LXD_DIR}/foo" localhost: --public lxc_remote image alias create localhost:testimage "${sum}" lxc_remote image delete "lxd2:${sum}" || true diff -Nru lxd-2.14/test/suites/storage_volume_attach.sh lxd-2.15/test/suites/storage_volume_attach.sh --- lxd-2.14/test/suites/storage_volume_attach.sh 1970-01-01 00:00:00.000000000 +0000 +++ lxd-2.15/test/suites/storage_volume_attach.sh 2017-06-28 03:00:23.000000000 +0000 @@ -0,0 +1,95 @@ +test_storage_volume_attach() { + # Check that we have a big enough range for this test + if [ ! -e /etc/subuid ] && [ ! -e /etc/subgid ]; then + UIDs=1000000000 + GIDs=1000000000 + UID_BASE=1000000 + GID_BASE=1000000 + else + UIDs=0 + GIDs=0 + UID_BASE=0 + GID_BASE=0 + LARGEST_UIDs=0 + LARGEST_GIDs=0 + + # shellcheck disable=SC2013 + for entry in $(grep ^root: /etc/subuid); do + COUNT=$(echo "${entry}" | cut -d: -f3) + UIDs=$((UIDs+COUNT)) + + if [ "${COUNT}" -gt "${LARGEST_UIDs}" ]; then + LARGEST_UIDs=${COUNT} + UID_BASE=$(echo "${entry}" | cut -d: -f2) + fi + done + + # shellcheck disable=SC2013 + for entry in $(grep ^root: /etc/subgid); do + COUNT=$(echo "${entry}" | cut -d: -f3) + GIDs=$((GIDs+COUNT)) + + if [ "${COUNT}" -gt "${LARGEST_GIDs}" ]; then + LARGEST_GIDs=${COUNT} + GID_BASE=$(echo "${entry}" | cut -d: -f2) + fi + done + fi + + ensure_import_testimage + + # create storage volume + lxc storage volume create "lxdtest-$(basename "${LXD_DIR}")" testvolume + + # create containers + lxc launch testimage c1 -c security.privileged=true + lxc launch testimage c2 + + # Attach to a single privileged container + lxc storage volume attach "lxdtest-$(basename "${LXD_DIR}")" testvolume c1 testvolume + PATH_TO_CHECK="${LXD_DIR}/storage-pools/lxdtest-$(basename "${LXD_DIR}")/custom/testvolume" + [ "$(stat -c %u:%g "${PATH_TO_CHECK}")" = "0:0" ] + + # make container unprivileged + lxc config set c1 security.privileged false + [ "$(stat -c %u:%g "${PATH_TO_CHECK}")" = "0:0" ] + + if [ "${UIDs}" -lt 500000 ] || [ "${GIDs}" -lt 500000 ]; then + echo "==> SKIP: The storage volume attach test requires at least 500000 uids and gids" + return + fi + + # restart + lxc restart --force c1 + [ "$(stat -c %u:%g "${PATH_TO_CHECK}")" = "${UID_BASE}:${GID_BASE}" ] + + # give container isolated id mapping + lxc config set c1 security.idmap.isolated true + [ "$(stat -c %u:%g "${PATH_TO_CHECK}")" = "${UID_BASE}:${GID_BASE}" ] + + # restart + lxc restart --force c1 + + # get new isolated base ids + ISOLATED_UID_BASE="$(lxc exec c1 -- cat /proc/self/uid_map | awk '{print $2}')" + ISOLATED_GID_BASE="$(lxc exec c1 -- cat /proc/self/gid_map | awk '{print $2}')" + [ "$(stat -c %u:%g "${PATH_TO_CHECK}")" = "${ISOLATED_UID_BASE}:${ISOLATED_GID_BASE}" ] + + ! lxc storage volume attach "lxdtest-$(basename "${LXD_DIR}")" testvolume c2 testvolume + + # give container standard mapping + lxc config set c1 security.idmap.isolated false + [ "$(stat -c %u:%g "${PATH_TO_CHECK}")" = "${ISOLATED_UID_BASE}:${ISOLATED_GID_BASE}" ] + + # restart + lxc restart --force c1 + [ "$(stat -c %u:%g "${PATH_TO_CHECK}")" = "${UID_BASE}:${GID_BASE}" ] + + # attach second container + lxc storage volume attach "lxdtest-$(basename "${LXD_DIR}")" testvolume c2 testvolume + + # delete containers + lxc delete -f c1 + lxc delete -f c2 + lxc storage volume delete "lxdtest-$(basename "${LXD_DIR}")" testvolume +}