Merge ~morphis/snappy-hwe-snaps/+git/network-manager:release-1.2.2-10 into ~snappy-hwe-team/snappy-hwe-snaps/+git/tpm2:master

Proposed by Simon Fels
Status: Superseded
Proposed branch: ~morphis/snappy-hwe-snaps/+git/network-manager:release-1.2.2-10
Merge into: ~snappy-hwe-team/snappy-hwe-snaps/+git/tpm2:master
Diff against target: 4027 lines (+3736/-0) (has conflicts)
31 files modified
ChangeLog (+112/-0)
MAINTAINERS (+6/-0)
README.md (+102/-0)
bin/dhcp-lease-mover (+26/-0)
bin/networkmanager (+83/-0)
conf/NetworkManager.conf (+17/-0)
data/copyright (+74/-0)
run-tests.sh (+4/-0)
setup/gui/icon.svg (+2466/-0)
snapcraft.yaml (+223/-0)
spread.yaml (+48/-0)
startup-hooks/99-wol-by-default.sh (+13/-0)
tests/full/correct-dns-setup/task.yaml (+47/-0)
tests/full/dhcp-leases-are-moved/task.yaml (+35/-0)
tests/full/immutable-netplan-config/task.yaml (+9/-0)
tests/full/ipv6-address-assignment/task.yaml (+27/-0)
tests/full/ipv6-router-advertisements/task.yaml (+70/-0)
tests/full/no-netplan-default-config/task.yaml (+41/-0)
tests/full/system-network-is-active/task.yaml (+9/-0)
tests/full/wol-enabled-by-default/task.yaml (+59/-0)
tests/image/create-image.sh (+4/-0)
tests/lib/prepare-all.sh (+18/-0)
tests/lib/prepare.sh (+16/-0)
tests/lib/restore-each.sh (+23/-0)
tests/lib/utilities.sh (+46/-0)
tests/main/ethernet-managed-by-networkd/task.yaml (+7/-0)
tests/main/installation/task.yaml (+18/-0)
tests/main/set-hostname/task.yaml (+13/-0)
tests/main/static-ip-configuration/task.yaml (+49/-0)
tests/main/switch-netplan-renderer/task.yaml (+40/-0)
tests/main/wifi-connect-secured-ap/task.yaml (+31/-0)
Conflict in MAINTAINERS
Conflict in README.md
Conflict in run-tests.sh
Conflict in snapcraft.yaml
Conflict in spread.yaml
Conflict in tests/image/create-image.sh
Conflict in tests/lib/prepare-all.sh
Conflict in tests/lib/prepare.sh
Conflict in tests/lib/restore-each.sh
Conflict in tests/main/installation/task.yaml
Reviewer Review Type Date Requested Status
Alfonso Sanchez-Beato Pending
Tony Espy Pending
Snappy HWE Team Pending
Review via email: mp+311957@code.launchpad.net

This proposal has been superseded by a proposal from 2016-11-28.

Description of the change

Update changelog and release 1.2.2-10

To post a comment you must log in.

Unmerged commits

89b221c... by Simon Fels

Update changelog and bump version

0d73fad... by System Enablement CI Bot <email address hidden>

Merge remote tracking branch global-wol-config

Merge-Proposal: https://code.launchpad.net/~morphis/snappy-hwe-snaps/+git/network-manager/+merge/311843

b549a36... by Simon Fels

Rename hooks to startup-hooks to make clear they are different from snap hooks

d8e87e8... by Simon Fels

Make wake-on-lan hook executable

08443d1... by Simon Fels

Respect review comments

06754ba... by Simon Fels

Delete unwanted temporary file

c1e6c40... by Simon Fels

Add spread test for WoL enablement

73ffb83... by Simon Fels

Move WoL enablement into a startup hook

f591b07... by Simon Fels

Add conf file to enable WoL by default for all ethernet connections

46bce75... by System Enablement CI Bot <email address hidden>

Merge remote tracking branch bump-nm-version

Merge-Proposal: https://code.launchpad.net/~morphis/snappy-hwe-snaps/+git/network-manager/+merge/311754

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/ChangeLog b/ChangeLog
2new file mode 100644
3index 0000000..32258de
4--- /dev/null
5+++ b/ChangeLog
6@@ -0,0 +1,112 @@
7+2016-11-28 Simon Fels <simon.fels@canonical.com> - 1.2.2-10
8+
9+ * Merge remote tracking branch global-wol-config
10+ * Rename hooks to startup-hooks to make clear they are different from snap hooks
11+ * Make wake-on-lan hook executable
12+ * Respect review comments
13+ * Delete unwanted temporary file
14+ * Add spread test for WoL enablement
15+ * Move WoL enablement into a startup hook
16+ * Add conf file to enable WoL by default for all ethernet connections
17+ * Merge remote tracking branch bump-nm-version
18+ * Use absolute path for wifi-ap executables
19+ * Wait for NetworkManager to be fully up and running
20+ * Make DHCP lease mover test a bit more robust
21+ * Let the assertion do the slot/plug connections
22+ * tests: use prebuilt snap if available
23+ * Bump network-manager version
24+ * Merge remote tracking branch further-networking-tests
25+ * Respect review comments
26+ * Add hostname test case
27+ * Respect review comments
28+ * Use absolute path for all snap binaries as spread removes /snap/bin from PATH
29+ * Explain the difference between our different test suites
30+ * Add IPv6 router advertisement test case
31+ * Ensure NetworkManager has started when we start testing the DNS setup
32+ * Add test case to verify static IP configuration
33+ * Add test case to verify immutable netplan configuration files
34+ * Add DNS setup verification test
35+ * Add first test case to verify basic IPv6 address assignment
36+ * Merge remote tracking branch split-netplan-backend-switch-tests
37+ * Extend README to explain how to run an entire suite via spread
38+ * Create static netplan configuration file as part of our image
39+ * Fix testing for a channel
40+ * Extend README and correct formatting
41+ * Fix failing test cases
42+ * Stop prepare/restore steps after first reboot
43+ * Drop useless comments
44+ * Use correct path for snap we install
45+ * Bring back netplan renderer switch test
46+ * Rework test setup so we have two different suites
47+ * Merge remote tracking branch move-dhcp-leases
48+ * Move dhcp lease files back into SNAP_DATA but keep a copy of them in /run
49+
50+2016-10-27 Simon Fels <simon.fels@canonical.com> - 1.2.2-9
51+
52+ * One more review change
53+ * Changes according to review comments
54+ * Correctly check if a file is empty or not
55+ * Use correct indentation via spaces
56+ * Work when /usr/lib/snapd/generate-network-conf exists or not
57+ * Remove guard to prevent automatic ethernet configuration for no-netplan scenario
58+ * Explain how to test a snap from a specific channel of the store
59+ * Extend run-tests command documentation
60+ * Move wait-for-nm code into a common utility function
61+ * Add missing utilities.sh file
62+ * Extend no-netplan-default-config test and name file correctly
63+ * Build snap on suite preparation
64+ * Switch per test to network-manager as default netplan renderer
65+ * Check continously for network-manager service until it comes up
66+ * Correctly test for no default netplan configuration
67+ * Extend test infrastructure to run local snap
68+ * Test system without default netplan config
69+ * Manage ethernet connections automatically when netplan does not
70+ * (morphis/spread-tests, spread-tests) Fix spread qemu path
71+ * Split out actual snap name as variable
72+ * Add small timeout before checking NetworkManager status
73+ * Drop executable bits from sourced shell scripts
74+ * Detect which spread version we're running
75+ * Add test case to verify netplan renderer switch works
76+ * Preserve netplan configuration as well accross test runs
77+ * Add chapter to README explaining how to use the tests
78+ * Address more review comments
79+ * Respect review comments
80+ * Add tests to verifiy WiFi connection to WPA2 secured AP
81+ * Don't remove network-manager snap from the image on restore
82+ * Add initial spread testing infrastructure
83+
84+2016-10-27 Simon Fels <simon.fels@canonical.com> - 1.2.2-8
85+
86+ * Allow people to get ethernet managed back by NetworkManager
87+
88+2016-10-20 Simon Fels <simon.fels@canonical.com> - 1.2.2-7
89+
90+ * Create state directory on startup if not present
91+ * [SNAPPY] Print out correct path for the secret key
92+
93+2016-10-04 Simon Fels <simon.fels@canonical.com> - 1.2.2-6
94+
95+ * Refine comment about not auto configuring ethernet ports
96+ * Set grade property to stable
97+ * Prevent ethernet ports from being auto configured when netplan is used
98+ * Use new network-setup-observe interface
99+ * Fix netplan nm renderer detection
100+ * Ignore ethernet devices conditionally
101+ * Do not copy default configuration in place but use one conditionally
102+ * Don't ignore ethernet devices
103+ * Look into directory netplan puts configuration files in too
104+ * bin/networkmanager: create DHCP lease directory at startup
105+ * Strip MAINTAINERS .snap suffix
106+ * Add MAINTAINERS.snap
107+ * Drop superflous character
108+ * Cleanup after review comments
109+ * conf: add rc-manager=resolvconf
110+ * Add libnm* back
111+ * Also drop libsoup from stage/build packages
112+ * Explain why we don't want libsoup included
113+ * Drop support for libsoupd which brings in libicudata
114+ * We can't strip libicudata out
115+ * Drop unneeded alias for modem-manager/ppp plugs
116+ * Disable certain features we don't need and remove unwanted things from the snap
117+ * Update config parameters
118+ * Change --log-level to INFO (LP: #1602439)
119diff --git a/MAINTAINERS b/MAINTAINERS
120index e5dde26..4a36249 100644
121--- a/MAINTAINERS
122+++ b/MAINTAINERS
123@@ -1,3 +1,9 @@
124 Simon Fels <simon.fels@canonical.com>
125+<<<<<<< MAINTAINERS
126 Scott Sweeny <scott.sweeny@canonical.com>
127 Tony Espy <espy@canonical.com>
128+=======
129+Tony Espy <espy@canonical.com>
130+Alfonso Sanchez-Beato <alfonso.sanchez-beato@canonical.com>
131+
132+>>>>>>> MAINTAINERS
133diff --git a/README.md b/README.md
134index 353165a..10807f2 100644
135--- a/README.md
136+++ b/README.md
137@@ -1,4 +1,106 @@
138+<<<<<<< README.md
139 # tpm2
140
141 Set of utilities and a daemon to deal with TPM 2.0 chips built
142 into a wide range of todays devices.
143+=======
144+# NetworkManager
145+
146+This is the snap to package the NetworkManager management service.
147+
148+## Running tests
149+
150+We have a set of spread (https://github.com/snapcore/spread) tests which
151+can be executed on a virtual machine or real hardware.
152+
153+In order to run those tests you need the follow things
154+
155+ * ubuntu-image
156+ * spread
157+
158+ You can install both as a snap
159+
160+```
161+ $ snap install --edge --devmode ubuntu-image
162+ $ snap install --devmode spread
163+```
164+
165+NOTE: As of today (27/10/2016) the version of spread in the store misses
166+some important bug fixes so you have to build your own one for now:
167+
168+```
169+ $ WORKDIR=`mktemp -d`
170+ $ export GOPATH=$WORKDIR
171+ $ go get -d -v github.com/snapcore/spread/...
172+ $ go build github.com/snapcore/spread/cmd/spread
173+ $ sudo cp spread /usr/local/bin
174+```
175+
176+Make sure /usr/local/bin is in your path and is used as default:
177+
178+```
179+ $ which spread
180+ /usr/local/bin/spread
181+```
182+
183+Now you have everything to run the test suite.
184+
185+```
186+ $ ./run-tests
187+```
188+
189+The script will create an image via ubuntu-image and make it available
190+to spread by copying it to ~/.spread/qemu or ~/snap/spread/<version>/.spread/qemu
191+depending on if you're using a local spread version or the one from the
192+snap.
193+
194+If you want to see more verbose debugging output of spread run
195+
196+```
197+ $ ./run-tests --debug
198+```
199+
200+If you do not want to build the network-manager snap from source but test one
201+from a specific channel start testing with
202+
203+```
204+ $ ./run-tests --channel=beta --test-from-channel
205+```
206+
207+You can also run spread directly which allows you run just specific tests
208+
209+```
210+ $ spread tests/main/installation
211+```
212+
213+This will by default build the network-manager snap from source. If you
214+want it to test it from a specific channel run
215+
216+```
217+ $ SNAP_CHANNEL=candidate spread tests/main/installation
218+```
219+
220+And if you want to run an entire suite
221+
222+```
223+ $ spread tests/main/
224+```
225+
226+## Available test suites
227+
228+Currently we have two test suites
229+
230+ * main
231+ * full
232+
233+The 'main' suite covers testing of network-manager when its installed on
234+any Ubuntu Core device from the store without configuring the system
235+further to allow NetworkManager to control also all ethernet connections.
236+
237+The 'full' suite configures netplan in the prepare part to use NetworkManager
238+as default backend so that it becomes the only network connection
239+management service in the system.
240+
241+Depending on the nature of a test case the right test suite should be
242+picked.
243+>>>>>>> README.md
244diff --git a/bin/dhcp-lease-mover b/bin/dhcp-lease-mover
245new file mode 100755
246index 0000000..c54aeb0
247--- /dev/null
248+++ b/bin/dhcp-lease-mover
249@@ -0,0 +1,26 @@
250+#!/bin/sh
251+set -x
252+
253+lease_path=$SNAP_DATA/state/dhcp
254+public_lease_path=/run/NetworkManager/dhcp/
255+
256+if [ ! -e $public_lease_path ] ; then
257+ mkdir -p $public_lease_path
258+fi
259+
260+if [ ! -e $lease_path ] ; then
261+ mkdir -p $lease_path
262+fi
263+
264+# Copy all leases when we start to make sure we're in sync
265+rm -f $public_lease_path/*
266+cp $lease_path/* $public_lease_path
267+
268+# Now we wait until a lease changes, gets added or removed and when
269+# that happened we simply just move all leases files into the public
270+# location.
271+while $SNAP/usr/bin/inotifywait -e create,modify,delete,move $lease_path ; do
272+ sleep 1
273+ rm -f $public_lease_path/*
274+ cp $lease_path/* $public_lease_path
275+done
276diff --git a/bin/networkmanager b/bin/networkmanager
277new file mode 100755
278index 0000000..eab3b7e
279--- /dev/null
280+++ b/bin/networkmanager
281@@ -0,0 +1,83 @@
282+#!/bin/sh
283+set -ex
284+
285+# Create all necessary directories we need at runtime
286+mkdir -p $SNAP_DATA/conf/system-connections
287+mkdir -p $SNAP_DATA/run
288+
289+# Create DHCP lease directory
290+mkdir -p /run/NetworkManager/dhcp
291+
292+# Select which config we're going to use. We offer our users
293+# to provide their own configuration file in $SNAP_DATA but
294+# will fallback if no one exists to the default one we ship
295+# in $SNAP
296+NM_CONF="$SNAP/etc/NetworkManager/NetworkManager.conf"
297+if [ -e $SNAP_DATA/NetworkManager.conf ]; then
298+ NM_CONF="$SNAP_DATA/NetworkManager.conf"
299+fi
300+
301+# A directory where users can place any additional configuration
302+# files for NetworkManager
303+mkdir -p $SNAP_DATA/conf.d
304+
305+# State dir where network-manager stores several things like the
306+# secret key used for IPv6
307+mkdir -p $SNAP_DATA/state
308+mkdir -p $SNAP_DATA/state/dhcp
309+
310+# If netplan is not configured to render by default to NetworkManager
311+# configuration files we disable management of any ethernet device
312+# as this will clash with any configuration netplan puts in place
313+# for networkd.
314+if [ ! -e "/etc/netplan/00-default-nm-renderer.yaml" ] ; then
315+ if [ ! -e "$SNAP_DATA/conf.d/disable-ethernet.conf" ] ; then
316+ echo "[keyfile]" > $SNAP_DATA/conf.d/disable-ethernet.conf
317+ echo "unmanaged-devices+=interface-name:eth*,interface-name:enx*" >> $SNAP_DATA/conf.d/disable-ethernet.conf
318+ fi
319+else
320+ # Enable ethernet management again if the user switched the netplan
321+ # backend and wants us to manage ethernet
322+ if [ -e $SNAP_DATA/conf.d/disable-ethernet.conf ] ; then
323+ rm -f $SNAP_DATA/conf.d/disable-ethernet.conf
324+ fi
325+
326+ # If the snapd configuration for netplan is not present or empty
327+ # we will start managing all ethernet ports automatically. Because
328+ # of that we need to remove any previously created configuration files
329+ # which prevented us from doing that.
330+ if [ ! -e /etc/netplan/00-snapd-config.yaml ] || [ -s /etc/netplan/00-snapd-config.yaml ] ; then
331+ rm -f $SNAP_DATA/conf.d/no-auto-default-ethernet.conf
332+ else
333+ if [ ! -e "$SNAP_DATA/conf.d/no-auto-default-ethernet.conf" ] ; then
334+ # If we're running as the only network management service
335+ # and are configured via netplan on first boot then we should
336+ # not try to auto configure ethernet ports as this is up to
337+ # netplan and will be the same for networkd.
338+ echo "[main]" > $SNAP_DATA/conf.d/no-auto-default-ethernet.conf
339+ echo "no-auto-default=interface-name:eth*,interface-name:enx*" >> $SNAP_DATA/conf.d/no-auto-default-ethernet.conf
340+ fi
341+ fi
342+fi
343+
344+# HACK: Until we've fixed probert to look in $SNAP_DATA/state/dhcp or
345+# somewhere else for our lease files we use inotifywatch to monitor
346+# our lease files and copy all over when something has changed. This
347+# background process gets stopped when our systemd service unit gets
348+# stopped.
349+$SNAP/bin/dhcp-lease-mover &
350+
351+# Run available startup hooks to have a point to store custom
352+# logic outside of this script. More of the things from above
353+# should be moved into these.
354+for hook in $SNAP/startup-hooks/* ; do
355+ [ -x "$hook" ] && /bin/sh -x "$hook"
356+done
357+
358+export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/usr/lib/NetworkManager"
359+
360+$SNAP/usr/sbin/NetworkManager \
361+ --config-dir=$SNAP_DATA/conf.d/ \
362+ --config=$NM_CONF \
363+ --log-level=INFO \
364+ --no-daemon
365diff --git a/conf/NetworkManager.conf b/conf/NetworkManager.conf
366new file mode 100644
367index 0000000..1950212
368--- /dev/null
369+++ b/conf/NetworkManager.conf
370@@ -0,0 +1,17 @@
371+[main]
372+plugins=ifupdown,keyfile
373+# Not using dnsmasq yet. Need to get it properly integrated
374+# into the snap or reuse the one shiped with the OS snap.
375+# rc-manager=resolvconf directs NM to use the resolvconf
376+# binary to update resolv.conf, which is necessary as there's
377+# more than one network management stack on core devices.
378+dns=default
379+rc-manager=resolvconf
380+
381+# Use internal DHCP stack which is based on the systemd
382+# implementation and is enough for our purpose until we
383+# need something more complex.
384+dhcp=internal
385+
386+[ifupdown]
387+managed=false
388diff --git a/data/copyright b/data/copyright
389new file mode 100644
390index 0000000..71d773a
391--- /dev/null
392+++ b/data/copyright
393@@ -0,0 +1,74 @@
394+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
395+Upstream-Name: NetworkManager
396+Source: http://ftp.gnome.org/pub/GNOME/sources/NetworkManager/
397+
398+Files: *
399+Copyright: 2004 - 2014 Red Hat, Inc.
400+ 2005 - 2009 Novell, Inc.
401+License: GPL-2+
402+
403+Files: libnm-util/*
404+ libnm-glib/*
405+ libnm-core/*
406+ libnm/*
407+Copyright: 2005 - 2014 Red Hat, Inc.
408+ 2005 - 2009 Novell, Inc.
409+License: LGPL-2+
410+
411+Files: src/systemd/*
412+Copyright: 2013 - 2015 Tom Gundersen
413+ 2014 Susant Sahani
414+ 2014 - 2015 Intel Corporation. All rights reserved.
415+License: LGPL-2.1+
416+
417+License: GPL-2+
418+ This package is free software; you can redistribute it and/or modify
419+ it under the terms of the GNU General Public License as published by
420+ the Free Software Foundation; either version 2 of the License, or
421+ (at your option) any later version.
422+ .
423+ This package is distributed in the hope that it will be useful,
424+ but WITHOUT ANY WARRANTY; without even the implied warranty of
425+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
426+ GNU General Public License for more details.
427+ .
428+ You should have received a copy of the GNU General Public License
429+ along with this program. If not, see <http://www.gnu.org/licenses/>
430+ .
431+ On Debian systems, the complete text of the GNU General Public
432+ License version 2 can be found in "/usr/share/common-licenses/GPL-2".
433+
434+License: LGPL-2+
435+ This package is free software; you can redistribute it and/or
436+ modify it under the terms of the GNU Lesser General Public
437+ License as published by the Free Software Foundation; either
438+ version 2 of the License, or (at your option) any later version.
439+ .
440+ This package is distributed in the hope that it will be useful,
441+ but WITHOUT ANY WARRANTY; without even the implied warranty of
442+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
443+ Lesser General Public License for more details.
444+ .
445+ You should have received a copy of the GNU General Public License
446+ along with this program. If not, see <http://www.gnu.org/licenses/>.
447+ .
448+ On Debian systems, the complete text of the GNU Lesser General
449+ Public License can be found in "/usr/share/common-licenses/LGPL-2".
450+
451+License: LGPL-2.1+
452+ This package is free software; you can redistribute it and/or
453+ modify it under the terms of the GNU Lesser General Public
454+ License as published by the Free Software Foundation; either
455+ version 2.1 of the License, or (at your option) any later version.
456+ .
457+ This package is distributed in the hope that it will be useful,
458+ but WITHOUT ANY WARRANTY; without even the implied warranty of
459+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
460+ Lesser General Public License for more details.
461+ .
462+ You should have received a copy of the GNU General Public License
463+ along with this program. If not, see <http://www.gnu.org/licenses/>.
464+ .
465+ On Debian systems, the complete text of the GNU Lesser General
466+ Public License can be found in "/usr/share/common-licenses/LGPL-2.1".
467+
468diff --git a/run-tests.sh b/run-tests.sh
469index 1d58d86..6926e4e 100755
470--- a/run-tests.sh
471+++ b/run-tests.sh
472@@ -29,7 +29,11 @@ show_help() {
473 echo " --help Show this help message and exit"
474 echo " --channel Select another channel to build the base image from (default: $channel)"
475 echo " --debug Enable verbose debugging output"
476+<<<<<<< run-tests.sh
477 echo " --test-from-channel Pull tpm2 snap from the specified channel instead of building it from source"
478+=======
479+ echo " --test-from-channel Pull network-manager snap from the specified channel instead of building it from source"
480+>>>>>>> run-tests.sh
481 echo " --force-new-image Force generating a new image used for testing"
482 }
483
484diff --git a/setup/gui/icon.svg b/setup/gui/icon.svg
485new file mode 100644
486index 0000000..019ffb2
487--- /dev/null
488+++ b/setup/gui/icon.svg
489@@ -0,0 +1,2466 @@
490+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
491+<!-- Created with Inkscape (http://www.inkscape.org/) -->
492+<svg
493+ xmlns:dc="http://purl.org/dc/elements/1.1/"
494+ xmlns:cc="http://web.resource.org/cc/"
495+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
496+ xmlns:svg="http://www.w3.org/2000/svg"
497+ xmlns="http://www.w3.org/2000/svg"
498+ xmlns:xlink="http://www.w3.org/1999/xlink"
499+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
500+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
501+ width="48.000000px"
502+ height="48.000000px"
503+ id="svg2327"
504+ sodipodi:version="0.32"
505+ inkscape:version="0.45"
506+ sodipodi:docbase="/home/dobey/Projects/gnome-icon-theme/scalable/status"
507+ sodipodi:docname="network-idle.svg"
508+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
509+ <defs
510+ id="defs3">
511+ <linearGradient
512+ id="linearGradient7670">
513+ <stop
514+ style="stop-color:#3465a4;stop-opacity:1"
515+ offset="0"
516+ id="stop7672" />
517+ <stop
518+ style="stop-color:#204a87;stop-opacity:1"
519+ offset="1"
520+ id="stop7674" />
521+ </linearGradient>
522+ <linearGradient
523+ inkscape:collect="always"
524+ id="linearGradient2307">
525+ <stop
526+ style="stop-color:#5a7aa4;stop-opacity:1;"
527+ offset="0"
528+ id="stop2309" />
529+ <stop
530+ style="stop-color:#5a7aa4;stop-opacity:0;"
531+ offset="1"
532+ id="stop2311" />
533+ </linearGradient>
534+ <linearGradient
535+ id="linearGradient11400">
536+ <stop
537+ id="stop11402"
538+ offset="0"
539+ style="stop-color:#000000;stop-opacity:1;" />
540+ <stop
541+ id="stop11404"
542+ offset="1"
543+ style="stop-color:#000000;stop-opacity:0;" />
544+ </linearGradient>
545+ <linearGradient
546+ id="linearGradient6240"
547+ inkscape:collect="always">
548+ <stop
549+ id="stop6242"
550+ offset="0"
551+ style="stop-color:#ffffff;stop-opacity:1;" />
552+ <stop
553+ id="stop6244"
554+ offset="1"
555+ style="stop-color:#ffffff;stop-opacity:0;" />
556+ </linearGradient>
557+ <linearGradient
558+ id="linearGradient5137">
559+ <stop
560+ id="stop5139"
561+ offset="0"
562+ style="stop-color:#eeeeec;stop-opacity:1;" />
563+ <stop
564+ id="stop5141"
565+ offset="1"
566+ style="stop-color:#e6e6e3;stop-opacity:1;" />
567+ </linearGradient>
568+ <linearGradient
569+ id="linearGradient5225"
570+ inkscape:collect="always">
571+ <stop
572+ id="stop5227"
573+ offset="0"
574+ style="stop-color:black;stop-opacity:1;" />
575+ <stop
576+ id="stop5229"
577+ offset="1"
578+ style="stop-color:black;stop-opacity:0;" />
579+ </linearGradient>
580+ <linearGradient
581+ id="linearGradient3899"
582+ inkscape:collect="always">
583+ <stop
584+ id="stop3901"
585+ offset="0"
586+ style="stop-color:#eeeeec" />
587+ <stop
588+ id="stop3903"
589+ offset="1"
590+ style="stop-color:#d3d7cf" />
591+ </linearGradient>
592+ <linearGradient
593+ id="linearGradient3907">
594+ <stop
595+ id="stop3909"
596+ offset="0"
597+ style="stop-color:#ffffff;stop-opacity:1;" />
598+ <stop
599+ id="stop3911"
600+ offset="1"
601+ style="stop-color:#ffffff;stop-opacity:0;" />
602+ </linearGradient>
603+ <linearGradient
604+ id="linearGradient4196">
605+ <stop
606+ id="stop4198"
607+ offset="0"
608+ style="stop-color:black;stop-opacity:1;" />
609+ <stop
610+ id="stop4200"
611+ offset="1"
612+ style="stop-color:black;stop-opacity:0;" />
613+ </linearGradient>
614+ <linearGradient
615+ inkscape:collect="always"
616+ id="linearGradient5060">
617+ <stop
618+ style="stop-color:black;stop-opacity:1;"
619+ offset="0"
620+ id="stop5062" />
621+ <stop
622+ style="stop-color:black;stop-opacity:0;"
623+ offset="1"
624+ id="stop5064" />
625+ </linearGradient>
626+ <radialGradient
627+ r="19.5"
628+ fy="47.045319"
629+ fx="20.913568"
630+ cy="47.045319"
631+ cx="20.913568"
632+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
633+ gradientUnits="userSpaceOnUse"
634+ id="radialGradient3304"
635+ xlink:href="#linearGradient3907"
636+ inkscape:collect="always" />
637+ <radialGradient
638+ r="19.5"
639+ fy="47.045319"
640+ fx="20.913568"
641+ cy="47.045319"
642+ cx="20.913568"
643+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
644+ gradientUnits="userSpaceOnUse"
645+ id="radialGradient3302"
646+ xlink:href="#linearGradient3907"
647+ inkscape:collect="always" />
648+ <radialGradient
649+ r="19.5"
650+ fy="47.045319"
651+ fx="20.913568"
652+ cy="47.045319"
653+ cx="20.913568"
654+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
655+ gradientUnits="userSpaceOnUse"
656+ id="radialGradient3300"
657+ xlink:href="#linearGradient3907"
658+ inkscape:collect="always" />
659+ <radialGradient
660+ r="19.5"
661+ fy="47.045319"
662+ fx="20.913568"
663+ cy="47.045319"
664+ cx="20.913568"
665+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
666+ gradientUnits="userSpaceOnUse"
667+ id="radialGradient3298"
668+ xlink:href="#linearGradient3907"
669+ inkscape:collect="always" />
670+ <radialGradient
671+ r="19.5"
672+ fy="47.045319"
673+ fx="20.913568"
674+ cy="47.045319"
675+ cx="20.913568"
676+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
677+ gradientUnits="userSpaceOnUse"
678+ id="radialGradient3296"
679+ xlink:href="#linearGradient3907"
680+ inkscape:collect="always" />
681+ <radialGradient
682+ r="19.5"
683+ fy="47.045319"
684+ fx="20.913568"
685+ cy="47.045319"
686+ cx="20.913568"
687+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
688+ gradientUnits="userSpaceOnUse"
689+ id="radialGradient3294"
690+ xlink:href="#linearGradient3907"
691+ inkscape:collect="always" />
692+ <radialGradient
693+ r="19.5"
694+ fy="47.045319"
695+ fx="20.913568"
696+ cy="47.045319"
697+ cx="20.913568"
698+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
699+ gradientUnits="userSpaceOnUse"
700+ id="radialGradient3292"
701+ xlink:href="#linearGradient3907"
702+ inkscape:collect="always" />
703+ <radialGradient
704+ r="19.5"
705+ fy="47.045319"
706+ fx="20.913568"
707+ cy="47.045319"
708+ cx="20.913568"
709+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
710+ gradientUnits="userSpaceOnUse"
711+ id="radialGradient3276"
712+ xlink:href="#linearGradient3907"
713+ inkscape:collect="always" />
714+ <radialGradient
715+ r="19.5"
716+ fy="47.045319"
717+ fx="20.913568"
718+ cy="47.045319"
719+ cx="20.913568"
720+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
721+ gradientUnits="userSpaceOnUse"
722+ id="radialGradient3274"
723+ xlink:href="#linearGradient3907"
724+ inkscape:collect="always" />
725+ <radialGradient
726+ r="19.5"
727+ fy="47.045319"
728+ fx="20.913568"
729+ cy="47.045319"
730+ cx="20.913568"
731+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
732+ gradientUnits="userSpaceOnUse"
733+ id="radialGradient3272"
734+ xlink:href="#linearGradient3907"
735+ inkscape:collect="always" />
736+ <radialGradient
737+ r="19.5"
738+ fy="47.045319"
739+ fx="20.913568"
740+ cy="47.045319"
741+ cx="20.913568"
742+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
743+ gradientUnits="userSpaceOnUse"
744+ id="radialGradient3270"
745+ xlink:href="#linearGradient3907"
746+ inkscape:collect="always" />
747+ <radialGradient
748+ r="19.5"
749+ fy="47.045319"
750+ fx="20.913568"
751+ cy="47.045319"
752+ cx="20.913568"
753+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
754+ gradientUnits="userSpaceOnUse"
755+ id="radialGradient3268"
756+ xlink:href="#linearGradient3907"
757+ inkscape:collect="always" />
758+ <radialGradient
759+ r="19.5"
760+ fy="47.045319"
761+ fx="20.913568"
762+ cy="47.045319"
763+ cx="20.913568"
764+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
765+ gradientUnits="userSpaceOnUse"
766+ id="radialGradient3266"
767+ xlink:href="#linearGradient3907"
768+ inkscape:collect="always" />
769+ <radialGradient
770+ r="19.5"
771+ fy="47.045319"
772+ fx="20.913568"
773+ cy="47.045319"
774+ cx="20.913568"
775+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
776+ gradientUnits="userSpaceOnUse"
777+ id="radialGradient3264"
778+ xlink:href="#linearGradient3907"
779+ inkscape:collect="always" />
780+ <radialGradient
781+ r="19.5"
782+ fy="47.045319"
783+ fx="20.913568"
784+ cy="47.045319"
785+ cx="20.913568"
786+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
787+ gradientUnits="userSpaceOnUse"
788+ id="radialGradient3155"
789+ xlink:href="#linearGradient3907"
790+ inkscape:collect="always" />
791+ <radialGradient
792+ r="19.5"
793+ fy="47.045319"
794+ fx="20.913568"
795+ cy="47.045319"
796+ cx="20.913568"
797+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
798+ gradientUnits="userSpaceOnUse"
799+ id="radialGradient3158"
800+ xlink:href="#linearGradient3907"
801+ inkscape:collect="always" />
802+ <radialGradient
803+ r="19.5"
804+ fy="47.045319"
805+ fx="20.913568"
806+ cy="47.045319"
807+ cx="20.913568"
808+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
809+ gradientUnits="userSpaceOnUse"
810+ id="radialGradient3161"
811+ xlink:href="#linearGradient3907"
812+ inkscape:collect="always" />
813+ <radialGradient
814+ r="19.5"
815+ fy="47.045319"
816+ fx="20.913568"
817+ cy="47.045319"
818+ cx="20.913568"
819+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
820+ gradientUnits="userSpaceOnUse"
821+ id="radialGradient3164"
822+ xlink:href="#linearGradient3907"
823+ inkscape:collect="always" />
824+ <radialGradient
825+ r="19.5"
826+ fy="47.045319"
827+ fx="20.913568"
828+ cy="47.045319"
829+ cx="20.913568"
830+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
831+ gradientUnits="userSpaceOnUse"
832+ id="radialGradient3167"
833+ xlink:href="#linearGradient3907"
834+ inkscape:collect="always" />
835+ <radialGradient
836+ r="19.5"
837+ fy="47.045319"
838+ fx="20.913568"
839+ cy="47.045319"
840+ cx="20.913568"
841+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
842+ gradientUnits="userSpaceOnUse"
843+ id="radialGradient3170"
844+ xlink:href="#linearGradient3907"
845+ inkscape:collect="always" />
846+ <radialGradient
847+ r="19.5"
848+ fy="47.045319"
849+ fx="20.913568"
850+ cy="47.045319"
851+ cx="20.913568"
852+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
853+ gradientUnits="userSpaceOnUse"
854+ id="radialGradient3173"
855+ xlink:href="#linearGradient3907"
856+ inkscape:collect="always" />
857+ <radialGradient
858+ r="19.5"
859+ fy="47.045319"
860+ fx="20.913568"
861+ cy="47.045319"
862+ cx="20.913568"
863+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
864+ gradientUnits="userSpaceOnUse"
865+ id="radialGradient3176"
866+ xlink:href="#linearGradient3907"
867+ inkscape:collect="always" />
868+ <radialGradient
869+ r="19.5"
870+ fy="47.045319"
871+ fx="20.913568"
872+ cy="47.045319"
873+ cx="20.913568"
874+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
875+ gradientUnits="userSpaceOnUse"
876+ id="radialGradient3182"
877+ xlink:href="#linearGradient3907"
878+ inkscape:collect="always" />
879+ <radialGradient
880+ r="19.5"
881+ fy="47.045319"
882+ fx="20.913568"
883+ cy="47.045319"
884+ cx="20.913568"
885+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
886+ gradientUnits="userSpaceOnUse"
887+ id="radialGradient3185"
888+ xlink:href="#linearGradient3907"
889+ inkscape:collect="always" />
890+ <radialGradient
891+ r="19.5"
892+ fy="47.045319"
893+ fx="20.913568"
894+ cy="47.045319"
895+ cx="20.913568"
896+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
897+ gradientUnits="userSpaceOnUse"
898+ id="radialGradient3188"
899+ xlink:href="#linearGradient3907"
900+ inkscape:collect="always" />
901+ <radialGradient
902+ r="19.5"
903+ fy="47.045319"
904+ fx="20.913568"
905+ cy="47.045319"
906+ cx="20.913568"
907+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
908+ gradientUnits="userSpaceOnUse"
909+ id="radialGradient3191"
910+ xlink:href="#linearGradient3907"
911+ inkscape:collect="always" />
912+ <radialGradient
913+ r="19.5"
914+ fy="47.045319"
915+ fx="20.913568"
916+ cy="47.045319"
917+ cx="20.913568"
918+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
919+ gradientUnits="userSpaceOnUse"
920+ id="radialGradient3194"
921+ xlink:href="#linearGradient3907"
922+ inkscape:collect="always" />
923+ <radialGradient
924+ r="19.5"
925+ fy="47.045319"
926+ fx="20.913568"
927+ cy="47.045319"
928+ cx="20.913568"
929+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
930+ gradientUnits="userSpaceOnUse"
931+ id="radialGradient3197"
932+ xlink:href="#linearGradient3907"
933+ inkscape:collect="always" />
934+ <radialGradient
935+ r="19.5"
936+ fy="47.045319"
937+ fx="20.913568"
938+ cy="47.045319"
939+ cx="20.913568"
940+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
941+ gradientUnits="userSpaceOnUse"
942+ id="radialGradient3200"
943+ xlink:href="#linearGradient3907"
944+ inkscape:collect="always" />
945+ <radialGradient
946+ r="19.5"
947+ fy="47.045319"
948+ fx="20.913568"
949+ cy="47.045319"
950+ cx="20.913568"
951+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
952+ gradientUnits="userSpaceOnUse"
953+ id="radialGradient3203"
954+ xlink:href="#linearGradient3907"
955+ inkscape:collect="always" />
956+ <radialGradient
957+ r="19.5"
958+ fy="47.045319"
959+ fx="20.913568"
960+ cy="47.045319"
961+ cx="20.913568"
962+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
963+ gradientUnits="userSpaceOnUse"
964+ id="radialGradient3206"
965+ xlink:href="#linearGradient3907"
966+ inkscape:collect="always" />
967+ <radialGradient
968+ r="19.5"
969+ fy="47.045319"
970+ fx="20.913568"
971+ cy="47.045319"
972+ cx="20.913568"
973+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
974+ gradientUnits="userSpaceOnUse"
975+ id="radialGradient3209"
976+ xlink:href="#linearGradient3907"
977+ inkscape:collect="always" />
978+ <radialGradient
979+ r="19.5"
980+ fy="47.045319"
981+ fx="20.913568"
982+ cy="47.045319"
983+ cx="20.913568"
984+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
985+ gradientUnits="userSpaceOnUse"
986+ id="radialGradient3212"
987+ xlink:href="#linearGradient3907"
988+ inkscape:collect="always" />
989+ <radialGradient
990+ r="19.5"
991+ fy="47.045319"
992+ fx="20.913568"
993+ cy="47.045319"
994+ cx="20.913568"
995+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
996+ gradientUnits="userSpaceOnUse"
997+ id="radialGradient3215"
998+ xlink:href="#linearGradient3907"
999+ inkscape:collect="always" />
1000+ <radialGradient
1001+ r="19.5"
1002+ fy="47.045319"
1003+ fx="20.913568"
1004+ cy="47.045319"
1005+ cx="20.913568"
1006+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1007+ gradientUnits="userSpaceOnUse"
1008+ id="radialGradient3218"
1009+ xlink:href="#linearGradient3907"
1010+ inkscape:collect="always" />
1011+ <radialGradient
1012+ r="19.5"
1013+ fy="47.045319"
1014+ fx="20.913568"
1015+ cy="47.045319"
1016+ cx="20.913568"
1017+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1018+ gradientUnits="userSpaceOnUse"
1019+ id="radialGradient3221"
1020+ xlink:href="#linearGradient3907"
1021+ inkscape:collect="always" />
1022+ <radialGradient
1023+ r="19.5"
1024+ fy="47.045319"
1025+ fx="20.913568"
1026+ cy="47.045319"
1027+ cx="20.913568"
1028+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1029+ gradientUnits="userSpaceOnUse"
1030+ id="radialGradient3224"
1031+ xlink:href="#linearGradient3907"
1032+ inkscape:collect="always" />
1033+ <radialGradient
1034+ r="19.5"
1035+ fy="47.045319"
1036+ fx="20.913568"
1037+ cy="47.045319"
1038+ cx="20.913568"
1039+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1040+ gradientUnits="userSpaceOnUse"
1041+ id="radialGradient3230"
1042+ xlink:href="#linearGradient3907"
1043+ inkscape:collect="always" />
1044+ <radialGradient
1045+ r="19.5"
1046+ fy="47.045319"
1047+ fx="20.913568"
1048+ cy="47.045319"
1049+ cx="20.913568"
1050+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1051+ gradientUnits="userSpaceOnUse"
1052+ id="radialGradient3233"
1053+ xlink:href="#linearGradient3907"
1054+ inkscape:collect="always" />
1055+ <radialGradient
1056+ r="19.5"
1057+ fy="47.045319"
1058+ fx="20.913568"
1059+ cy="47.045319"
1060+ cx="20.913568"
1061+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1062+ gradientUnits="userSpaceOnUse"
1063+ id="radialGradient3236"
1064+ xlink:href="#linearGradient3907"
1065+ inkscape:collect="always" />
1066+ <radialGradient
1067+ r="19.5"
1068+ fy="47.045319"
1069+ fx="20.913568"
1070+ cy="47.045319"
1071+ cx="20.913568"
1072+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1073+ gradientUnits="userSpaceOnUse"
1074+ id="radialGradient3239"
1075+ xlink:href="#linearGradient3907"
1076+ inkscape:collect="always" />
1077+ <radialGradient
1078+ r="19.5"
1079+ fy="47.045319"
1080+ fx="20.913568"
1081+ cy="47.045319"
1082+ cx="20.913568"
1083+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1084+ gradientUnits="userSpaceOnUse"
1085+ id="radialGradient3242"
1086+ xlink:href="#linearGradient3907"
1087+ inkscape:collect="always" />
1088+ <radialGradient
1089+ r="19.5"
1090+ fy="47.045319"
1091+ fx="20.913568"
1092+ cy="47.045319"
1093+ cx="20.913568"
1094+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1095+ gradientUnits="userSpaceOnUse"
1096+ id="radialGradient3245"
1097+ xlink:href="#linearGradient3907"
1098+ inkscape:collect="always" />
1099+ <radialGradient
1100+ r="19.5"
1101+ fy="47.045319"
1102+ fx="20.913568"
1103+ cy="47.045319"
1104+ cx="20.913568"
1105+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1106+ gradientUnits="userSpaceOnUse"
1107+ id="radialGradient3248"
1108+ xlink:href="#linearGradient3907"
1109+ inkscape:collect="always" />
1110+ <linearGradient
1111+ gradientTransform="matrix(0.647995,0,0,0.707655,0.734249,-1.447571)"
1112+ gradientUnits="userSpaceOnUse"
1113+ y2="37.9375"
1114+ x2="29.125"
1115+ y1="46.029419"
1116+ x1="29.5"
1117+ id="linearGradient3905"
1118+ xlink:href="#linearGradient3899"
1119+ inkscape:collect="always" />
1120+ <radialGradient
1121+ r="117.14286"
1122+ fy="486.64789"
1123+ fx="605.71429"
1124+ cy="486.64789"
1125+ cx="605.71429"
1126+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
1127+ gradientUnits="userSpaceOnUse"
1128+ id="radialGradient2309"
1129+ xlink:href="#linearGradient5060"
1130+ inkscape:collect="always" />
1131+ <radialGradient
1132+ r="117.14286"
1133+ fy="486.64789"
1134+ fx="605.71429"
1135+ cy="486.64789"
1136+ cx="605.71429"
1137+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
1138+ gradientUnits="userSpaceOnUse"
1139+ id="radialGradient2311"
1140+ xlink:href="#linearGradient5060"
1141+ inkscape:collect="always" />
1142+ <linearGradient
1143+ gradientTransform="matrix(0.664512,0,0,0.651253,9.569506e-2,-1.210023)"
1144+ gradientUnits="userSpaceOnUse"
1145+ y2="26.039215"
1146+ x2="20.156862"
1147+ y1="5.0996137"
1148+ x1="20.156862"
1149+ id="linearGradient6246"
1150+ xlink:href="#linearGradient6240"
1151+ inkscape:collect="always" />
1152+ <radialGradient
1153+ gradientUnits="userSpaceOnUse"
1154+ gradientTransform="matrix(0.836315,0,0,0.514216,-4.024721,-3.259613e-2)"
1155+ r="19.00016"
1156+ fy="32.997028"
1157+ fx="24.006104"
1158+ cy="32.997028"
1159+ cx="24.006104"
1160+ id="radialGradient5239"
1161+ xlink:href="#linearGradient7670"
1162+ inkscape:collect="always" />
1163+ <linearGradient
1164+ gradientTransform="matrix(0.648248,0,0,0.644253,0.433189,-0.740991)"
1165+ y2="38.876041"
1166+ x2="39.904388"
1167+ y1="6.3760414"
1168+ x1="17.247635"
1169+ gradientUnits="userSpaceOnUse"
1170+ id="linearGradient5147"
1171+ xlink:href="#linearGradient5137"
1172+ inkscape:collect="always" />
1173+ <linearGradient
1174+ y2="43.82579"
1175+ x2="31.86105"
1176+ y1="37.842293"
1177+ x1="31.743324"
1178+ gradientTransform="matrix(1,0,0,0.992781,0,-2.718035)"
1179+ gradientUnits="userSpaceOnUse"
1180+ id="linearGradient2308"
1181+ xlink:href="#linearGradient5137"
1182+ inkscape:collect="always" />
1183+ <linearGradient
1184+ y2="40.219608"
1185+ x2="23.529411"
1186+ y1="34.572548"
1187+ x1="23.154902"
1188+ gradientTransform="matrix(1.004187,0,0,1,-0.12454,-3.011765)"
1189+ gradientUnits="userSpaceOnUse"
1190+ id="linearGradient2310"
1191+ xlink:href="#linearGradient11400"
1192+ inkscape:collect="always" />
1193+ <linearGradient
1194+ gradientTransform="matrix(0.654255,0,0,0.654672,-0.481383,0.690637)"
1195+ gradientUnits="userSpaceOnUse"
1196+ y2="33.637787"
1197+ x2="37.295498"
1198+ y1="38.267769"
1199+ x1="37.484837"
1200+ id="linearGradient4202"
1201+ xlink:href="#linearGradient4196"
1202+ inkscape:collect="always" />
1203+ <radialGradient
1204+ r="23.75956"
1205+ fy="42.6875"
1206+ fx="23.9375"
1207+ cy="42.6875"
1208+ cx="23.9375"
1209+ gradientTransform="matrix(1,0,0,0.24763,0,32.1168)"
1210+ gradientUnits="userSpaceOnUse"
1211+ id="radialGradient2313"
1212+ xlink:href="#linearGradient5225"
1213+ inkscape:collect="always" />
1214+ <linearGradient
1215+ inkscape:collect="always"
1216+ xlink:href="#linearGradient2307"
1217+ id="linearGradient5478"
1218+ gradientTransform="scale(1.673466,0.597562)"
1219+ x1="-931.7503"
1220+ y1="148.07116"
1221+ x2="-131.23588"
1222+ y2="148.07116"
1223+ gradientUnits="userSpaceOnUse" />
1224+ <radialGradient
1225+ inkscape:collect="always"
1226+ xlink:href="#linearGradient5225"
1227+ id="radialGradient5620"
1228+ gradientUnits="userSpaceOnUse"
1229+ gradientTransform="matrix(1,0,0,0.24763,0,32.1168)"
1230+ cx="23.9375"
1231+ cy="42.6875"
1232+ fx="23.9375"
1233+ fy="42.6875"
1234+ r="23.75956" />
1235+ <linearGradient
1236+ inkscape:collect="always"
1237+ xlink:href="#linearGradient4196"
1238+ id="linearGradient5622"
1239+ gradientUnits="userSpaceOnUse"
1240+ gradientTransform="matrix(0.654255,0,0,0.654672,-0.481383,0.690637)"
1241+ x1="37.484837"
1242+ y1="38.267769"
1243+ x2="37.295498"
1244+ y2="33.637787" />
1245+ <linearGradient
1246+ inkscape:collect="always"
1247+ xlink:href="#linearGradient5137"
1248+ id="linearGradient5624"
1249+ gradientUnits="userSpaceOnUse"
1250+ gradientTransform="matrix(1,0,0,0.992781,0,-2.718035)"
1251+ x1="31.743324"
1252+ y1="37.842293"
1253+ x2="31.86105"
1254+ y2="43.82579" />
1255+ <linearGradient
1256+ inkscape:collect="always"
1257+ xlink:href="#linearGradient11400"
1258+ id="linearGradient5626"
1259+ gradientUnits="userSpaceOnUse"
1260+ gradientTransform="matrix(1.004187,0,0,1,-0.12454,-3.011765)"
1261+ x1="23.154902"
1262+ y1="34.572548"
1263+ x2="23.529411"
1264+ y2="40.219608" />
1265+ <linearGradient
1266+ inkscape:collect="always"
1267+ xlink:href="#linearGradient5137"
1268+ id="linearGradient5628"
1269+ gradientUnits="userSpaceOnUse"
1270+ gradientTransform="matrix(0.648248,0,0,0.644253,0.433189,-0.740991)"
1271+ x1="17.247635"
1272+ y1="6.3760414"
1273+ x2="39.904388"
1274+ y2="38.876041" />
1275+ <radialGradient
1276+ inkscape:collect="always"
1277+ xlink:href="#linearGradient7670"
1278+ id="radialGradient5630"
1279+ gradientUnits="userSpaceOnUse"
1280+ gradientTransform="matrix(0.836315,0,0,0.514216,-4.024721,-3.259613e-2)"
1281+ cx="24.006104"
1282+ cy="32.997028"
1283+ fx="24.006104"
1284+ fy="32.997028"
1285+ r="19.00016" />
1286+ <linearGradient
1287+ inkscape:collect="always"
1288+ xlink:href="#linearGradient6240"
1289+ id="linearGradient5632"
1290+ gradientUnits="userSpaceOnUse"
1291+ gradientTransform="matrix(0.664512,0,0,0.651253,9.569506e-2,-1.210023)"
1292+ x1="20.156862"
1293+ y1="5.0996137"
1294+ x2="20.156862"
1295+ y2="26.039215" />
1296+ <linearGradient
1297+ inkscape:collect="always"
1298+ xlink:href="#linearGradient2307"
1299+ id="linearGradient5634"
1300+ gradientUnits="userSpaceOnUse"
1301+ gradientTransform="scale(1.673466,0.597562)"
1302+ x1="-931.7503"
1303+ y1="148.07116"
1304+ x2="-131.23588"
1305+ y2="148.07116" />
1306+ <radialGradient
1307+ inkscape:collect="always"
1308+ xlink:href="#linearGradient5060"
1309+ id="radialGradient5636"
1310+ gradientUnits="userSpaceOnUse"
1311+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
1312+ cx="605.71429"
1313+ cy="486.64789"
1314+ fx="605.71429"
1315+ fy="486.64789"
1316+ r="117.14286" />
1317+ <radialGradient
1318+ inkscape:collect="always"
1319+ xlink:href="#linearGradient5060"
1320+ id="radialGradient5638"
1321+ gradientUnits="userSpaceOnUse"
1322+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
1323+ cx="605.71429"
1324+ cy="486.64789"
1325+ fx="605.71429"
1326+ fy="486.64789"
1327+ r="117.14286" />
1328+ <linearGradient
1329+ inkscape:collect="always"
1330+ xlink:href="#linearGradient3899"
1331+ id="linearGradient5640"
1332+ gradientUnits="userSpaceOnUse"
1333+ gradientTransform="matrix(0.647995,0,0,0.707655,0.734249,-1.447571)"
1334+ x1="29.5"
1335+ y1="46.029419"
1336+ x2="29.125"
1337+ y2="37.9375" />
1338+ <radialGradient
1339+ inkscape:collect="always"
1340+ xlink:href="#linearGradient3907"
1341+ id="radialGradient5642"
1342+ gradientUnits="userSpaceOnUse"
1343+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1344+ cx="20.913568"
1345+ cy="47.045319"
1346+ fx="20.913568"
1347+ fy="47.045319"
1348+ r="19.5" />
1349+ <radialGradient
1350+ inkscape:collect="always"
1351+ xlink:href="#linearGradient3907"
1352+ id="radialGradient5644"
1353+ gradientUnits="userSpaceOnUse"
1354+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1355+ cx="20.913568"
1356+ cy="47.045319"
1357+ fx="20.913568"
1358+ fy="47.045319"
1359+ r="19.5" />
1360+ <radialGradient
1361+ inkscape:collect="always"
1362+ xlink:href="#linearGradient3907"
1363+ id="radialGradient5646"
1364+ gradientUnits="userSpaceOnUse"
1365+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1366+ cx="20.913568"
1367+ cy="47.045319"
1368+ fx="20.913568"
1369+ fy="47.045319"
1370+ r="19.5" />
1371+ <radialGradient
1372+ inkscape:collect="always"
1373+ xlink:href="#linearGradient3907"
1374+ id="radialGradient5648"
1375+ gradientUnits="userSpaceOnUse"
1376+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1377+ cx="20.913568"
1378+ cy="47.045319"
1379+ fx="20.913568"
1380+ fy="47.045319"
1381+ r="19.5" />
1382+ <radialGradient
1383+ inkscape:collect="always"
1384+ xlink:href="#linearGradient3907"
1385+ id="radialGradient5650"
1386+ gradientUnits="userSpaceOnUse"
1387+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1388+ cx="20.913568"
1389+ cy="47.045319"
1390+ fx="20.913568"
1391+ fy="47.045319"
1392+ r="19.5" />
1393+ <radialGradient
1394+ inkscape:collect="always"
1395+ xlink:href="#linearGradient3907"
1396+ id="radialGradient5652"
1397+ gradientUnits="userSpaceOnUse"
1398+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1399+ cx="20.913568"
1400+ cy="47.045319"
1401+ fx="20.913568"
1402+ fy="47.045319"
1403+ r="19.5" />
1404+ <radialGradient
1405+ inkscape:collect="always"
1406+ xlink:href="#linearGradient3907"
1407+ id="radialGradient5654"
1408+ gradientUnits="userSpaceOnUse"
1409+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1410+ cx="20.913568"
1411+ cy="47.045319"
1412+ fx="20.913568"
1413+ fy="47.045319"
1414+ r="19.5" />
1415+ <radialGradient
1416+ inkscape:collect="always"
1417+ xlink:href="#linearGradient3907"
1418+ id="radialGradient5656"
1419+ gradientUnits="userSpaceOnUse"
1420+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1421+ cx="20.913568"
1422+ cy="47.045319"
1423+ fx="20.913568"
1424+ fy="47.045319"
1425+ r="19.5" />
1426+ <radialGradient
1427+ inkscape:collect="always"
1428+ xlink:href="#linearGradient3907"
1429+ id="radialGradient5658"
1430+ gradientUnits="userSpaceOnUse"
1431+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1432+ cx="20.913568"
1433+ cy="47.045319"
1434+ fx="20.913568"
1435+ fy="47.045319"
1436+ r="19.5" />
1437+ <radialGradient
1438+ inkscape:collect="always"
1439+ xlink:href="#linearGradient3907"
1440+ id="radialGradient5660"
1441+ gradientUnits="userSpaceOnUse"
1442+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1443+ cx="20.913568"
1444+ cy="47.045319"
1445+ fx="20.913568"
1446+ fy="47.045319"
1447+ r="19.5" />
1448+ <radialGradient
1449+ inkscape:collect="always"
1450+ xlink:href="#linearGradient3907"
1451+ id="radialGradient5662"
1452+ gradientUnits="userSpaceOnUse"
1453+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1454+ cx="20.913568"
1455+ cy="47.045319"
1456+ fx="20.913568"
1457+ fy="47.045319"
1458+ r="19.5" />
1459+ <radialGradient
1460+ inkscape:collect="always"
1461+ xlink:href="#linearGradient3907"
1462+ id="radialGradient5664"
1463+ gradientUnits="userSpaceOnUse"
1464+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1465+ cx="20.913568"
1466+ cy="47.045319"
1467+ fx="20.913568"
1468+ fy="47.045319"
1469+ r="19.5" />
1470+ <radialGradient
1471+ inkscape:collect="always"
1472+ xlink:href="#linearGradient3907"
1473+ id="radialGradient5666"
1474+ gradientUnits="userSpaceOnUse"
1475+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1476+ cx="20.913568"
1477+ cy="47.045319"
1478+ fx="20.913568"
1479+ fy="47.045319"
1480+ r="19.5" />
1481+ <radialGradient
1482+ inkscape:collect="always"
1483+ xlink:href="#linearGradient3907"
1484+ id="radialGradient5668"
1485+ gradientUnits="userSpaceOnUse"
1486+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1487+ cx="20.913568"
1488+ cy="47.045319"
1489+ fx="20.913568"
1490+ fy="47.045319"
1491+ r="19.5" />
1492+ <radialGradient
1493+ inkscape:collect="always"
1494+ xlink:href="#linearGradient3907"
1495+ id="radialGradient5670"
1496+ gradientUnits="userSpaceOnUse"
1497+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1498+ cx="20.913568"
1499+ cy="47.045319"
1500+ fx="20.913568"
1501+ fy="47.045319"
1502+ r="19.5" />
1503+ <radialGradient
1504+ inkscape:collect="always"
1505+ xlink:href="#linearGradient3907"
1506+ id="radialGradient5672"
1507+ gradientUnits="userSpaceOnUse"
1508+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1509+ cx="20.913568"
1510+ cy="47.045319"
1511+ fx="20.913568"
1512+ fy="47.045319"
1513+ r="19.5" />
1514+ <radialGradient
1515+ inkscape:collect="always"
1516+ xlink:href="#linearGradient3907"
1517+ id="radialGradient5674"
1518+ gradientUnits="userSpaceOnUse"
1519+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1520+ cx="20.913568"
1521+ cy="47.045319"
1522+ fx="20.913568"
1523+ fy="47.045319"
1524+ r="19.5" />
1525+ <radialGradient
1526+ inkscape:collect="always"
1527+ xlink:href="#linearGradient3907"
1528+ id="radialGradient5676"
1529+ gradientUnits="userSpaceOnUse"
1530+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1531+ cx="20.913568"
1532+ cy="47.045319"
1533+ fx="20.913568"
1534+ fy="47.045319"
1535+ r="19.5" />
1536+ <radialGradient
1537+ inkscape:collect="always"
1538+ xlink:href="#linearGradient3907"
1539+ id="radialGradient5678"
1540+ gradientUnits="userSpaceOnUse"
1541+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1542+ cx="20.913568"
1543+ cy="47.045319"
1544+ fx="20.913568"
1545+ fy="47.045319"
1546+ r="19.5" />
1547+ <radialGradient
1548+ inkscape:collect="always"
1549+ xlink:href="#linearGradient3907"
1550+ id="radialGradient5680"
1551+ gradientUnits="userSpaceOnUse"
1552+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1553+ cx="20.913568"
1554+ cy="47.045319"
1555+ fx="20.913568"
1556+ fy="47.045319"
1557+ r="19.5" />
1558+ <radialGradient
1559+ inkscape:collect="always"
1560+ xlink:href="#linearGradient3907"
1561+ id="radialGradient5682"
1562+ gradientUnits="userSpaceOnUse"
1563+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1564+ cx="20.913568"
1565+ cy="47.045319"
1566+ fx="20.913568"
1567+ fy="47.045319"
1568+ r="19.5" />
1569+ <radialGradient
1570+ inkscape:collect="always"
1571+ xlink:href="#linearGradient3907"
1572+ id="radialGradient5684"
1573+ gradientUnits="userSpaceOnUse"
1574+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1575+ cx="20.913568"
1576+ cy="47.045319"
1577+ fx="20.913568"
1578+ fy="47.045319"
1579+ r="19.5" />
1580+ <radialGradient
1581+ inkscape:collect="always"
1582+ xlink:href="#linearGradient3907"
1583+ id="radialGradient5686"
1584+ gradientUnits="userSpaceOnUse"
1585+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1586+ cx="20.913568"
1587+ cy="47.045319"
1588+ fx="20.913568"
1589+ fy="47.045319"
1590+ r="19.5" />
1591+ <radialGradient
1592+ inkscape:collect="always"
1593+ xlink:href="#linearGradient3907"
1594+ id="radialGradient5688"
1595+ gradientUnits="userSpaceOnUse"
1596+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1597+ cx="20.913568"
1598+ cy="47.045319"
1599+ fx="20.913568"
1600+ fy="47.045319"
1601+ r="19.5" />
1602+ <radialGradient
1603+ inkscape:collect="always"
1604+ xlink:href="#linearGradient3907"
1605+ id="radialGradient5690"
1606+ gradientUnits="userSpaceOnUse"
1607+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1608+ cx="20.913568"
1609+ cy="47.045319"
1610+ fx="20.913568"
1611+ fy="47.045319"
1612+ r="19.5" />
1613+ <radialGradient
1614+ inkscape:collect="always"
1615+ xlink:href="#linearGradient3907"
1616+ id="radialGradient5692"
1617+ gradientUnits="userSpaceOnUse"
1618+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1619+ cx="20.913568"
1620+ cy="47.045319"
1621+ fx="20.913568"
1622+ fy="47.045319"
1623+ r="19.5" />
1624+ <radialGradient
1625+ inkscape:collect="always"
1626+ xlink:href="#linearGradient3907"
1627+ id="radialGradient5694"
1628+ gradientUnits="userSpaceOnUse"
1629+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1630+ cx="20.913568"
1631+ cy="47.045319"
1632+ fx="20.913568"
1633+ fy="47.045319"
1634+ r="19.5" />
1635+ <radialGradient
1636+ inkscape:collect="always"
1637+ xlink:href="#linearGradient3907"
1638+ id="radialGradient5696"
1639+ gradientUnits="userSpaceOnUse"
1640+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1641+ cx="20.913568"
1642+ cy="47.045319"
1643+ fx="20.913568"
1644+ fy="47.045319"
1645+ r="19.5" />
1646+ <radialGradient
1647+ inkscape:collect="always"
1648+ xlink:href="#linearGradient3907"
1649+ id="radialGradient5698"
1650+ gradientUnits="userSpaceOnUse"
1651+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1652+ cx="20.913568"
1653+ cy="47.045319"
1654+ fx="20.913568"
1655+ fy="47.045319"
1656+ r="19.5" />
1657+ <radialGradient
1658+ inkscape:collect="always"
1659+ xlink:href="#linearGradient3907"
1660+ id="radialGradient5700"
1661+ gradientUnits="userSpaceOnUse"
1662+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1663+ cx="20.913568"
1664+ cy="47.045319"
1665+ fx="20.913568"
1666+ fy="47.045319"
1667+ r="19.5" />
1668+ <radialGradient
1669+ inkscape:collect="always"
1670+ xlink:href="#linearGradient3907"
1671+ id="radialGradient5702"
1672+ gradientUnits="userSpaceOnUse"
1673+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1674+ cx="20.913568"
1675+ cy="47.045319"
1676+ fx="20.913568"
1677+ fy="47.045319"
1678+ r="19.5" />
1679+ <radialGradient
1680+ inkscape:collect="always"
1681+ xlink:href="#linearGradient3907"
1682+ id="radialGradient5704"
1683+ gradientUnits="userSpaceOnUse"
1684+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1685+ cx="20.913568"
1686+ cy="47.045319"
1687+ fx="20.913568"
1688+ fy="47.045319"
1689+ r="19.5" />
1690+ <radialGradient
1691+ inkscape:collect="always"
1692+ xlink:href="#linearGradient3907"
1693+ id="radialGradient5706"
1694+ gradientUnits="userSpaceOnUse"
1695+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1696+ cx="20.913568"
1697+ cy="47.045319"
1698+ fx="20.913568"
1699+ fy="47.045319"
1700+ r="19.5" />
1701+ <radialGradient
1702+ inkscape:collect="always"
1703+ xlink:href="#linearGradient3907"
1704+ id="radialGradient5708"
1705+ gradientUnits="userSpaceOnUse"
1706+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1707+ cx="20.913568"
1708+ cy="47.045319"
1709+ fx="20.913568"
1710+ fy="47.045319"
1711+ r="19.5" />
1712+ <radialGradient
1713+ inkscape:collect="always"
1714+ xlink:href="#linearGradient3907"
1715+ id="radialGradient5710"
1716+ gradientUnits="userSpaceOnUse"
1717+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1718+ cx="20.913568"
1719+ cy="47.045319"
1720+ fx="20.913568"
1721+ fy="47.045319"
1722+ r="19.5" />
1723+ <radialGradient
1724+ inkscape:collect="always"
1725+ xlink:href="#linearGradient3907"
1726+ id="radialGradient5712"
1727+ gradientUnits="userSpaceOnUse"
1728+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1729+ cx="20.913568"
1730+ cy="47.045319"
1731+ fx="20.913568"
1732+ fy="47.045319"
1733+ r="19.5" />
1734+ <radialGradient
1735+ inkscape:collect="always"
1736+ xlink:href="#linearGradient3907"
1737+ id="radialGradient5714"
1738+ gradientUnits="userSpaceOnUse"
1739+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1740+ cx="20.913568"
1741+ cy="47.045319"
1742+ fx="20.913568"
1743+ fy="47.045319"
1744+ r="19.5" />
1745+ <radialGradient
1746+ inkscape:collect="always"
1747+ xlink:href="#linearGradient3907"
1748+ id="radialGradient5716"
1749+ gradientUnits="userSpaceOnUse"
1750+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1751+ cx="20.913568"
1752+ cy="47.045319"
1753+ fx="20.913568"
1754+ fy="47.045319"
1755+ r="19.5" />
1756+ <radialGradient
1757+ inkscape:collect="always"
1758+ xlink:href="#linearGradient3907"
1759+ id="radialGradient5718"
1760+ gradientUnits="userSpaceOnUse"
1761+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1762+ cx="20.913568"
1763+ cy="47.045319"
1764+ fx="20.913568"
1765+ fy="47.045319"
1766+ r="19.5" />
1767+ <radialGradient
1768+ inkscape:collect="always"
1769+ xlink:href="#linearGradient3907"
1770+ id="radialGradient5720"
1771+ gradientUnits="userSpaceOnUse"
1772+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1773+ cx="20.913568"
1774+ cy="47.045319"
1775+ fx="20.913568"
1776+ fy="47.045319"
1777+ r="19.5" />
1778+ <radialGradient
1779+ inkscape:collect="always"
1780+ xlink:href="#linearGradient3907"
1781+ id="radialGradient5722"
1782+ gradientUnits="userSpaceOnUse"
1783+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1784+ cx="20.913568"
1785+ cy="47.045319"
1786+ fx="20.913568"
1787+ fy="47.045319"
1788+ r="19.5" />
1789+ <radialGradient
1790+ inkscape:collect="always"
1791+ xlink:href="#linearGradient3907"
1792+ id="radialGradient5724"
1793+ gradientUnits="userSpaceOnUse"
1794+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1795+ cx="20.913568"
1796+ cy="47.045319"
1797+ fx="20.913568"
1798+ fy="47.045319"
1799+ r="19.5" />
1800+ <radialGradient
1801+ inkscape:collect="always"
1802+ xlink:href="#linearGradient3907"
1803+ id="radialGradient5726"
1804+ gradientUnits="userSpaceOnUse"
1805+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1806+ cx="20.913568"
1807+ cy="47.045319"
1808+ fx="20.913568"
1809+ fy="47.045319"
1810+ r="19.5" />
1811+ <radialGradient
1812+ inkscape:collect="always"
1813+ xlink:href="#linearGradient3907"
1814+ id="radialGradient5728"
1815+ gradientUnits="userSpaceOnUse"
1816+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1817+ cx="20.913568"
1818+ cy="47.045319"
1819+ fx="20.913568"
1820+ fy="47.045319"
1821+ r="19.5" />
1822+ </defs>
1823+ <sodipodi:namedview
1824+ id="base"
1825+ pagecolor="#ffffff"
1826+ bordercolor="#666"
1827+ borderopacity="1"
1828+ inkscape:pageopacity="0.0"
1829+ inkscape:pageshadow="2"
1830+ inkscape:zoom="1"
1831+ inkscape:cx="47.587693"
1832+ inkscape:cy="-3.0466105"
1833+ inkscape:current-layer="layer1"
1834+ showgrid="false"
1835+ inkscape:grid-bbox="true"
1836+ inkscape:document-units="px"
1837+ inkscape:window-width="1051"
1838+ inkscape:window-height="885"
1839+ inkscape:window-x="0"
1840+ inkscape:window-y="89"
1841+ inkscape:showpageshadow="false"
1842+ inkscape:grid-points="false"
1843+ showborder="false" />
1844+ <metadata
1845+ id="metadata4">
1846+ <rdf:RDF>
1847+ <cc:Work
1848+ rdf:about="">
1849+ <dc:format>image/svg+xml</dc:format>
1850+ <dc:type
1851+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
1852+ <dc:title>Network</dc:title>
1853+ <dc:date>2005-03-08</dc:date>
1854+ <dc:creator>
1855+ <cc:Agent>
1856+ <dc:title>Lapo Calamandrei</dc:title>
1857+ </cc:Agent>
1858+ </dc:creator>
1859+ <dc:subject>
1860+ <rdf:Bag />
1861+ </dc:subject>
1862+ <cc:license
1863+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
1864+ <dc:source />
1865+ <dc:contributor>
1866+ <cc:Agent>
1867+ <dc:title>Jakub Steiner, Luca Ferretti</dc:title>
1868+ </cc:Agent>
1869+ </dc:contributor>
1870+ </cc:Work>
1871+ <cc:License
1872+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
1873+ <cc:permits
1874+ rdf:resource="http://web.resource.org/cc/Reproduction" />
1875+ <cc:permits
1876+ rdf:resource="http://web.resource.org/cc/Distribution" />
1877+ <cc:requires
1878+ rdf:resource="http://web.resource.org/cc/Notice" />
1879+ <cc:requires
1880+ rdf:resource="http://web.resource.org/cc/Attribution" />
1881+ <cc:permits
1882+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
1883+ <cc:requires
1884+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
1885+ </cc:License>
1886+ </rdf:RDF>
1887+ </metadata>
1888+ <g
1889+ id="layer1"
1890+ inkscape:label="Layer 1"
1891+ inkscape:groupmode="layer">
1892+ <g
1893+ id="g5480"
1894+ transform="translate(14.98536,1)">
1895+ <g
1896+ style="display:inline"
1897+ inkscape:label="Layer 1"
1898+ id="g5482" />
1899+ <g
1900+ style="display:inline"
1901+ inkscape:label="tastiera"
1902+ id="g5484">
1903+ <g
1904+ transform="translate(-54,0.18088)"
1905+ inkscape:label="Shadow"
1906+ id="g5486" />
1907+ <g
1908+ id="g5488"
1909+ inkscape:label="Shadow"
1910+ transform="translate(-54,15.24691)" />
1911+ <g
1912+ id="g5490"
1913+ inkscape:label="Lavoro"
1914+ style="display:inline"
1915+ transform="translate(-54,15.24691)" />
1916+ </g>
1917+ <g
1918+ style="display:inline"
1919+ inkscape:label="tasti"
1920+ id="g5492">
1921+ <path
1922+ transform="matrix(0.633479,0,0,0.565504,1.119993,0.201324)"
1923+ d="M 47.69706 42.6875 A 23.75956 5.8835783 0 1 1 0.17794037,42.6875 A 23.75956 5.8835783 0 1 1 47.69706 42.6875 z"
1924+ sodipodi:ry="5.8835783"
1925+ sodipodi:rx="23.75956"
1926+ sodipodi:cy="42.6875"
1927+ sodipodi:cx="23.9375"
1928+ id="path5494"
1929+ style="opacity:0.3;fill:url(#radialGradient5620);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
1930+ sodipodi:type="arc" />
1931+ <path
1932+ style="opacity:0.20786516;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5622);stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
1933+ d="M 27.082936,28.048013 C 21.663366,21.135948 31.947853,26.54939 30.855772,24.153878 C 29.785572,21.806364 17.408039,24.595241 18.709552,20.667209"
1934+ id="path5496"
1935+ sodipodi:nodetypes="czz" />
1936+ <path
1937+ sodipodi:nodetypes="czz"
1938+ id="path5498"
1939+ d="M 26.784723,27.671888 C 21.538638,20.412631 31.520563,26.487432 30.374151,23.604157 C 29.072638,20.330797 18.198646,24.276982 18.806217,20.406815"
1940+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#729fcf;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
1941+ <g
1942+ transform="matrix(0.530612,0,0,0.53095,3.140616,3.404111)"
1943+ id="g5500"
1944+ style="display:inline">
1945+ <path
1946+ sodipodi:nodetypes="csccscc"
1947+ id="path5502"
1948+ d="M 14.375479,32.558794 C 14.375479,32.558794 15.592355,37.45777 10.51915,37.50376 C 8.0888743,37.525507 8.5866723,41.509781 8.5866723,41.509781 L 39.433139,41.478634 C 39.433139,41.478634 39.851577,37.611393 37.410922,37.566053 C 32.423455,37.474579 33.600393,32.496503 33.600393,32.496503 L 14.375479,32.558794 z "
1949+ style="opacity:1;color:black;fill:url(#linearGradient5624);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.88401449;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
1950+ <path
1951+ sodipodi:nodetypes="ccccc"
1952+ id="path5504"
1953+ d="M 13.926195,33.027451 C 14.010206,35.2 13.641655,35.938894 12.285731,36.702682 L 36,38 C 35.047008,36.831372 33.660837,35.066666 34.038883,33.011765 L 13.926195,33.027451 z "
1954+ style="opacity:0.5;fill:url(#linearGradient5626);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
1955+ <path
1956+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8d8d8f;stroke-width:1.88401508px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.43902438"
1957+ d="M 10.436202,38.661601 C 17.000465,38.66357 37.562637,38.661601 37.562637,38.661601"
1958+ id="path5506"
1959+ sodipodi:nodetypes="cc" />
1960+ <path
1961+ sodipodi:nodetypes="cc"
1962+ id="path5508"
1963+ d="M 11.134219,39.660187 C 17.146756,39.662156 36.881517,39.660187 36.881517,39.660187"
1964+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.88401532px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
1965+ </g>
1966+ <path
1967+ sodipodi:nodetypes="ccccccccc"
1968+ id="path5510"
1969+ d="M 3.602229,1.4999996 L 28.319154,1.4999996 C 29.631932,1.4999996 30.588653,2.4197694 30.588653,3.8361498 L 30.595753,20.072828 C 30.595753,21.162945 30.253253,21.499994 29.276792,21.499994 L 2.7228402,21.487795 C 1.9583807,21.469246 1.414291,21.169109 1.404027,20.186855 L 1.4138652,3.7151949 C 1.4138652,2.572403 2.4117826,1.4999996 3.602229,1.4999996 z "
1970+ style="fill:url(#linearGradient5628);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00000036;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
1971+ <rect
1972+ y="3.5000005"
1973+ x="3.4999971"
1974+ height="15.194118"
1975+ width="25.103695"
1976+ id="rect5512"
1977+ style="fill:url(#radialGradient5630);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:0.99999958px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
1978+ <path
1979+ sodipodi:nodetypes="ccccc"
1980+ id="path5514"
1981+ d="M 4.0984042,4.0204313 L 4.0984042,15.748091 C 15.025941,14.866132 19.115514,9.1623492 28,8.5664313 L 28,4 L 4.0984042,4.0204313 z "
1982+ style="opacity:0.5;fill:url(#linearGradient5632);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
1983+ <path
1984+ sodipodi:nodetypes="cccsccscccc"
1985+ id="path5516"
1986+ d="M 4.056094,2.4999991 C 3.2398944,2.4999991 2.4960113,3.2952856 2.4960113,4.0741096 L 2.4960108,19.789734 C 2.4999206,20.160319 2.5869303,20.275382 2.6715202,20.346431 C 2.7561101,20.417479 2.9348114,20.473541 3.2370502,20.480806 L 28.783404,20.500002 C 29.189758,20.500002 29.318189,20.437946 29.368434,20.384824 C 29.418681,20.3317 29.504941,20.138678 29.504941,19.674554 L 29.504942,4.1892884 C 29.504942,3.0791795 28.874178,2.4999991 27.866855,2.4999991 L 4.056094,2.4999991 z "
1987+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
1988+ <g
1989+ id="g5518"
1990+ transform="matrix(1.543206e-2,0,0,1.215502e-2,29.57023,28.01728)"
1991+ style="display:inline">
1992+ <rect
1993+ y="-150.69685"
1994+ x="-1559.2523"
1995+ height="478.35718"
1996+ width="1339.6335"
1997+ id="rect5520"
1998+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5634);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
1999+ <path
2000+ sodipodi:nodetypes="cccc"
2001+ id="path5522"
2002+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
2003+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5636);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2004+ <path
2005+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5638);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2006+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
2007+ id="path5524"
2008+ sodipodi:nodetypes="cccc" />
2009+ </g>
2010+ <path
2011+ sodipodi:nodetypes="ccccccccc"
2012+ id="path5526"
2013+ d="M 3.643761,26.504783 L 28.921938,26.504783 C 29.226374,26.504783 29.788645,26.492665 30,27 L 31.5,30 C 31.5625,30.406064 31.487026,31.562501 30,31.562501 L 2.5,31.500001 C 1,31.562501 1.0652178,30.281064 1.0652178,30 L 3,27 C 3.2113561,26.492665 3.3393239,26.504783 3.643761,26.504783 z "
2014+ style="color:black;fill:url(#linearGradient5640);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2015+ <path
2016+ sodipodi:nodetypes="ccccccccc"
2017+ id="path5528"
2018+ d="M 4.0955909,27.111942 L 28.49679,27.10614 C 28.788541,27.10614 28.820868,27.10614 29.023418,27.449588 L 30.420658,30.150759 C 30.420658,30.341029 30.185782,30.494207 29.894029,30.494207 L 2.6782341,30.500011 C 2.3864818,30.500011 2.1516056,30.346832 2.1516056,30.156562 L 3.5689622,27.45539 C 3.7715117,27.111942 3.8038386,27.111942 4.0955909,27.111942 z "
2019+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:white;stroke-width:0.99999964;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2020+ <path
2021+ sodipodi:nodetypes="csssssssccssssssssssssccccssscccccccccssssssssssssccsssssssssccccccc"
2022+ id="path5530"
2023+ d="M 4.9039459,26.500588 C 4.9019723,26.502459 4.9057445,26.514939 4.9039459,26.516406 C 4.89444,26.51889 4.8714034,26.528697 4.8616746,26.532224 C 4.8584281,26.533516 4.8437789,26.530815 4.840539,26.532224 C 4.8373165,26.533749 4.8225981,26.546397 4.8194034,26.548041 C 4.8130911,26.551565 4.8043634,26.559861 4.7982678,26.563859 C 4.7952901,26.565977 4.7800294,26.57744 4.7771322,26.579677 C 4.7743261,26.582033 4.7587013,26.593017 4.7559967,26.595495 C 4.7139608,26.641114 4.6696929,26.720423 4.6080475,26.816941 L 3.1646057,29.221226 C 3.1646057,29.224233 3.1644578,29.234029 3.1646057,29.237043 C 3.1648991,29.240062 3.1641691,29.249843 3.1646057,29.25286 C 3.1651831,29.255877 3.1638899,29.265668 3.1646057,29.268679 C 3.1663094,29.274683 3.1835077,29.294359 3.1857413,29.300313 C 3.1869871,29.303274 3.184369,29.31319 3.1857413,29.316132 C 3.1902312,29.324886 3.2013114,29.339269 3.2068769,29.347766 C 3.2127868,29.356161 3.2211123,29.37137 3.2280125,29.379402 C 3.230418,29.382033 3.2466397,29.392637 3.2491481,29.395219 C 3.2517571,29.39775 3.2675765,29.408562 3.2702837,29.411038 C 3.287102,29.425545 3.313719,29.446427 3.3336905,29.45849 C 3.3370984,29.460423 3.3513413,29.472456 3.3548262,29.474308 C 3.3655167,29.479116 3.3855128,29.485766 3.3970973,29.490126 C 3.4750042,29.516899 3.5780713,29.537579 3.6718601,29.537579 L 18.650036,29.537579 L 18.586629,26.500592 L 5.1153018,26.500588 C 5.0709049,26.500588 5.0221446,26.49941 4.9884883,26.500588 C 4.9806133,26.500623 4.9547729,26.500899 4.9462171,26.500588 C 4.9436075,26.500603 4.9274517,26.500458 4.9250814,26.500588 C 4.9232514,26.502034 4.9059195,26.498718 4.9039459,26.500588 z M 19.83363,26.500592 L 19.897036,27.512921 L 23.553495,27.512921 L 23.38441,26.500592 L 19.83363,26.500592 z M 24.652546,26.500592 L 25.413428,29.537579 L 28.795124,29.537579 C 28.888912,29.537579 28.991979,29.516899 29.069886,29.490126 C 29.081471,29.485766 29.101467,29.479116 29.112157,29.474308 C 29.115641,29.472456 29.129884,29.460423 29.133293,29.45849 C 29.153265,29.446427 29.179882,29.425545 29.1967,29.411038 C 29.199407,29.408562 29.215227,29.39775 29.217835,29.395219 C 29.220344,29.392637 29.236565,29.382033 29.238971,29.379402 C 29.245871,29.37137 29.254196,29.356161 29.260107,29.347766 C 29.265672,29.339269 29.276752,29.324886 29.281242,29.316132 C 29.282614,29.31319 29.279996,29.303274 29.281242,29.300313 C 29.283476,29.294359 29.300674,29.274683 29.302378,29.268679 C 29.303093,29.265668 29.3018,29.255877 29.302378,29.25286 C 29.302814,29.249843 29.302083,29.240062 29.302378,29.237043 C 29.302527,29.234029 29.302378,29.224233 29.302378,29.221226 L 28.119129,26.816941 C 28.057483,26.720424 28.013215,26.641114 27.97118,26.595495 C 27.968475,26.593017 27.95285,26.582033 27.950044,26.579677 C 27.947147,26.57744 27.931886,26.565977 27.928908,26.563859 C 27.922812,26.559861 27.914085,26.551565 27.907773,26.548041 C 27.904579,26.546397 27.88986,26.533749 27.886638,26.532224 C 27.883397,26.530815 27.868747,26.533516 27.865502,26.532224 C 27.855773,26.528697 27.832737,26.51889 27.823231,26.516406 C 27.812787,26.51452 27.796296,26.503902 27.780959,26.500588 C 27.773263,26.49907 27.745738,26.501448 27.738688,26.500588 C 27.705031,26.49941 27.656271,26.500588 27.611875,26.500588 L 24.652546,26.500592 z M 20.679054,28.525249 L 20.002715,29.537579 L 23.891664,29.537579 L 23.04624,28.525249 L 20.679054,28.525249 z "
2024+ style="color:black;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#babdb6;stroke-width:0.99999923;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2025+ <rect
2026+ style="color:black;fill:url(#radialGradient5642);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2027+ id="rect5532"
2028+ width="1"
2029+ height="1"
2030+ x="5"
2031+ y="26"
2032+ rx="0.26516503"
2033+ ry="0.26516503" />
2034+ <rect
2035+ style="color:black;fill:url(#radialGradient5644);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2036+ id="rect5534"
2037+ width="1"
2038+ height="1"
2039+ x="7"
2040+ y="26"
2041+ rx="0.26516503"
2042+ ry="0.26516503" />
2043+ <rect
2044+ style="color:black;fill:url(#radialGradient5646);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2045+ id="rect5536"
2046+ width="1"
2047+ height="1"
2048+ x="9"
2049+ y="26"
2050+ rx="0.26516503"
2051+ ry="0.26516503" />
2052+ <rect
2053+ style="color:black;fill:url(#radialGradient5648);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2054+ id="rect5538"
2055+ width="1"
2056+ height="1"
2057+ x="11"
2058+ y="26"
2059+ rx="0.26516503"
2060+ ry="0.26516503" />
2061+ <rect
2062+ style="color:black;fill:url(#radialGradient5650);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2063+ id="rect5540"
2064+ width="1"
2065+ height="1"
2066+ x="13"
2067+ y="26"
2068+ rx="0.26516503"
2069+ ry="0.26516503" />
2070+ <rect
2071+ style="color:black;fill:url(#radialGradient5652);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2072+ id="rect5542"
2073+ width="1"
2074+ height="1"
2075+ x="15"
2076+ y="26"
2077+ rx="0.26516503"
2078+ ry="0.26516503" />
2079+ <rect
2080+ style="color:black;fill:url(#radialGradient5654);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2081+ id="rect5544"
2082+ width="1"
2083+ height="1"
2084+ x="17"
2085+ y="26"
2086+ rx="0.26516503"
2087+ ry="0.26516503" />
2088+ <rect
2089+ style="color:black;fill:url(#radialGradient5656);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2090+ id="rect5546"
2091+ width="1"
2092+ height="1"
2093+ x="4"
2094+ y="27"
2095+ rx="0.26516503"
2096+ ry="0.26516503" />
2097+ <rect
2098+ style="color:black;fill:url(#radialGradient5658);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2099+ id="rect5548"
2100+ width="1"
2101+ height="1"
2102+ x="6"
2103+ y="27"
2104+ rx="0.26516503"
2105+ ry="0.26516503" />
2106+ <rect
2107+ style="color:black;fill:url(#radialGradient5660);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2108+ id="rect5550"
2109+ width="1"
2110+ height="1"
2111+ x="8"
2112+ y="27"
2113+ rx="0.26516503"
2114+ ry="0.26516503" />
2115+ <rect
2116+ style="color:black;fill:url(#radialGradient5662);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2117+ id="rect5552"
2118+ width="1"
2119+ height="1"
2120+ x="10"
2121+ y="27"
2122+ rx="0.26516503"
2123+ ry="0.26516503" />
2124+ <rect
2125+ style="color:black;fill:url(#radialGradient5664);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2126+ id="rect5554"
2127+ width="1"
2128+ height="1"
2129+ x="12"
2130+ y="27"
2131+ rx="0.26516503"
2132+ ry="0.26516503" />
2133+ <rect
2134+ style="color:black;fill:url(#radialGradient5666);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2135+ id="rect5556"
2136+ width="1"
2137+ height="1"
2138+ x="14"
2139+ y="27"
2140+ rx="0.26516503"
2141+ ry="0.26516503" />
2142+ <rect
2143+ style="color:black;fill:url(#radialGradient5668);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2144+ id="rect5558"
2145+ width="1"
2146+ height="1"
2147+ x="16"
2148+ y="27"
2149+ rx="0.26516503"
2150+ ry="0.26516503" />
2151+ <rect
2152+ style="color:black;fill:url(#radialGradient5670);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2153+ id="rect5560"
2154+ width="1"
2155+ height="1"
2156+ x="18"
2157+ y="27"
2158+ rx="0.26516503"
2159+ ry="0.26516503" />
2160+ <rect
2161+ style="color:black;fill:url(#radialGradient5672);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2162+ id="rect5562"
2163+ width="1"
2164+ height="1"
2165+ x="5"
2166+ y="28"
2167+ rx="0.26516503"
2168+ ry="0.26516503" />
2169+ <rect
2170+ style="color:black;fill:url(#radialGradient5674);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2171+ id="rect5564"
2172+ width="1"
2173+ height="1"
2174+ x="7"
2175+ y="28"
2176+ rx="0.26516503"
2177+ ry="0.26516503" />
2178+ <rect
2179+ style="color:black;fill:url(#radialGradient5676);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2180+ id="rect5566"
2181+ width="1"
2182+ height="1"
2183+ x="9"
2184+ y="28"
2185+ rx="0.26516503"
2186+ ry="0.26516503" />
2187+ <rect
2188+ style="color:black;fill:url(#radialGradient5678);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2189+ id="rect5568"
2190+ width="1"
2191+ height="1"
2192+ x="11"
2193+ y="28"
2194+ rx="0.26516503"
2195+ ry="0.26516503" />
2196+ <rect
2197+ style="color:black;fill:url(#radialGradient5680);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2198+ id="rect5570"
2199+ width="1"
2200+ height="1"
2201+ x="13"
2202+ y="28"
2203+ rx="0.26516503"
2204+ ry="0.26516503" />
2205+ <rect
2206+ style="color:black;fill:url(#radialGradient5682);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2207+ id="rect5572"
2208+ width="1"
2209+ height="1"
2210+ x="15"
2211+ y="28"
2212+ rx="0.26516503"
2213+ ry="0.26516503" />
2214+ <rect
2215+ style="color:black;fill:url(#radialGradient5684);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2216+ id="rect5574"
2217+ width="1"
2218+ height="1"
2219+ x="17"
2220+ y="28"
2221+ rx="0.26516503"
2222+ ry="0.26516503" />
2223+ <rect
2224+ style="color:black;fill:url(#radialGradient5686);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2225+ id="rect5576"
2226+ width="1"
2227+ height="1"
2228+ x="4"
2229+ y="29"
2230+ rx="0.26516503"
2231+ ry="0.26516503" />
2232+ <rect
2233+ style="color:black;fill:url(#radialGradient5688);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2234+ id="rect5578"
2235+ width="1"
2236+ height="1"
2237+ x="6"
2238+ y="29"
2239+ rx="0.26516503"
2240+ ry="0.26516503" />
2241+ <rect
2242+ style="color:black;fill:url(#radialGradient5690);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2243+ id="rect5580"
2244+ width="1"
2245+ height="1"
2246+ x="8"
2247+ y="29"
2248+ rx="0.26516503"
2249+ ry="0.26516503" />
2250+ <rect
2251+ style="color:black;fill:url(#radialGradient5692);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2252+ id="rect5582"
2253+ width="1"
2254+ height="1"
2255+ x="10"
2256+ y="29"
2257+ rx="0.26516503"
2258+ ry="0.26516503" />
2259+ <rect
2260+ style="color:black;fill:url(#radialGradient5694);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2261+ id="rect5584"
2262+ width="1"
2263+ height="1"
2264+ x="12"
2265+ y="29"
2266+ rx="0.26516503"
2267+ ry="0.26516503" />
2268+ <rect
2269+ style="color:black;fill:url(#radialGradient5696);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2270+ id="rect5586"
2271+ width="1"
2272+ height="1"
2273+ x="14"
2274+ y="29"
2275+ rx="0.26516503"
2276+ ry="0.26516503" />
2277+ <rect
2278+ style="color:black;fill:url(#radialGradient5698);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2279+ id="rect5588"
2280+ width="1"
2281+ height="1"
2282+ x="16"
2283+ y="29"
2284+ rx="0.26516503"
2285+ ry="0.26516503" />
2286+ <rect
2287+ style="color:black;fill:url(#radialGradient5700);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2288+ id="rect5590"
2289+ width="1"
2290+ height="1"
2291+ x="18"
2292+ y="29"
2293+ rx="0.26516503"
2294+ ry="0.26516503" />
2295+ <rect
2296+ style="color:black;fill:url(#radialGradient5702);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2297+ id="rect5592"
2298+ width="1"
2299+ height="1"
2300+ x="21"
2301+ y="26"
2302+ rx="0.26516503"
2303+ ry="0.26516503" />
2304+ <rect
2305+ style="color:black;fill:url(#radialGradient5704);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2306+ id="rect5594"
2307+ width="1"
2308+ height="1"
2309+ x="20"
2310+ y="27"
2311+ rx="0.26516503"
2312+ ry="0.26516503" />
2313+ <rect
2314+ style="color:black;fill:url(#radialGradient5706);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2315+ id="rect5596"
2316+ width="1"
2317+ height="1"
2318+ x="22"
2319+ y="27"
2320+ rx="0.26516503"
2321+ ry="0.26516503" />
2322+ <rect
2323+ style="color:black;fill:url(#radialGradient5708);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2324+ id="rect5598"
2325+ width="1"
2326+ height="1"
2327+ x="21"
2328+ y="28"
2329+ rx="0.26516503"
2330+ ry="0.26516503" />
2331+ <rect
2332+ style="color:black;fill:url(#radialGradient5710);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2333+ id="rect5600"
2334+ width="1"
2335+ height="1"
2336+ x="23"
2337+ y="28"
2338+ rx="0.26516503"
2339+ ry="0.26516503" />
2340+ <rect
2341+ style="color:black;fill:url(#radialGradient5712);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2342+ id="rect5602"
2343+ width="1"
2344+ height="1"
2345+ x="20"
2346+ y="29"
2347+ rx="0.26516503"
2348+ ry="0.26516503" />
2349+ <rect
2350+ style="color:black;fill:url(#radialGradient5714);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2351+ id="rect5604"
2352+ width="1"
2353+ height="1"
2354+ x="22"
2355+ y="29"
2356+ rx="0.26516503"
2357+ ry="0.26516503" />
2358+ <rect
2359+ style="color:black;fill:url(#radialGradient5716);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2360+ id="rect5606"
2361+ width="1"
2362+ height="1"
2363+ x="26"
2364+ y="26"
2365+ rx="0.26516503"
2366+ ry="0.26516503" />
2367+ <rect
2368+ style="color:black;fill:url(#radialGradient5718);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2369+ id="rect5608"
2370+ width="1"
2371+ height="1"
2372+ x="25"
2373+ y="27"
2374+ rx="0.26516503"
2375+ ry="0.26516503" />
2376+ <rect
2377+ style="color:black;fill:url(#radialGradient5720);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2378+ id="rect5610"
2379+ width="1"
2380+ height="1"
2381+ x="27"
2382+ y="27"
2383+ rx="0.26516503"
2384+ ry="0.26516503" />
2385+ <rect
2386+ style="color:black;fill:url(#radialGradient5722);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2387+ id="rect5612"
2388+ width="1"
2389+ height="1"
2390+ x="26"
2391+ y="28"
2392+ rx="0.26516503"
2393+ ry="0.26516503" />
2394+ <rect
2395+ style="color:black;fill:url(#radialGradient5724);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2396+ id="rect5614"
2397+ width="1"
2398+ height="1"
2399+ x="28"
2400+ y="28"
2401+ rx="0.26516503"
2402+ ry="0.26516503" />
2403+ <rect
2404+ style="color:black;fill:url(#radialGradient5726);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2405+ id="rect5616"
2406+ width="1"
2407+ height="1"
2408+ x="25"
2409+ y="29"
2410+ rx="0.26516503"
2411+ ry="0.26516503" />
2412+ <rect
2413+ style="color:black;fill:url(#radialGradient5728);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2414+ id="rect5618"
2415+ width="1"
2416+ height="1"
2417+ x="27"
2418+ y="29"
2419+ rx="0.26516503"
2420+ ry="0.26516503" />
2421+ </g>
2422+ </g>
2423+ <g
2424+ id="g5340"
2425+ transform="translate(0.985355,12)">
2426+ <g
2427+ style="display:inline"
2428+ inkscape:label="Layer 1"
2429+ id="g5342" />
2430+ <g
2431+ style="display:inline"
2432+ inkscape:label="tastiera"
2433+ id="g5344">
2434+ <g
2435+ transform="translate(-54,0.18088)"
2436+ inkscape:label="Shadow"
2437+ id="g5346" />
2438+ <g
2439+ id="g5348"
2440+ inkscape:label="Shadow"
2441+ transform="translate(-54,15.24691)" />
2442+ <g
2443+ id="g5350"
2444+ inkscape:label="Lavoro"
2445+ style="display:inline"
2446+ transform="translate(-54,15.24691)" />
2447+ </g>
2448+ <g
2449+ style="display:inline"
2450+ inkscape:label="tasti"
2451+ id="layer2">
2452+ <path
2453+ transform="matrix(0.633479,0,0,0.565504,1.119993,0.201324)"
2454+ d="M 47.69706 42.6875 A 23.75956 5.8835783 0 1 1 0.17794037,42.6875 A 23.75956 5.8835783 0 1 1 47.69706 42.6875 z"
2455+ sodipodi:ry="5.8835783"
2456+ sodipodi:rx="23.75956"
2457+ sodipodi:cy="42.6875"
2458+ sodipodi:cx="23.9375"
2459+ id="path5353"
2460+ style="opacity:0.3;fill:url(#radialGradient2313);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
2461+ sodipodi:type="arc" />
2462+ <path
2463+ style="opacity:0.20786516;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4202);stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
2464+ d="M 27.082936,28.048013 C 21.663366,21.135948 31.947853,26.54939 30.855772,24.153878 C 29.785572,21.806364 17.408039,24.595241 18.709552,20.667209"
2465+ id="path5355"
2466+ sodipodi:nodetypes="czz" />
2467+ <path
2468+ sodipodi:nodetypes="czz"
2469+ id="path5357"
2470+ d="M 26.784723,27.671888 C 21.538638,20.412631 31.520563,26.487432 30.374151,23.604157 C 29.072638,20.330797 18.198646,24.276982 18.806217,20.406815"
2471+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#729fcf;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
2472+ <g
2473+ transform="matrix(0.530612,0,0,0.53095,3.140616,3.404111)"
2474+ id="g5359"
2475+ style="display:inline">
2476+ <path
2477+ sodipodi:nodetypes="csccscc"
2478+ id="path5361"
2479+ d="M 14.375479,32.558794 C 14.375479,32.558794 15.592355,37.45777 10.51915,37.50376 C 8.0888743,37.525507 8.5866723,41.509781 8.5866723,41.509781 L 39.433139,41.478634 C 39.433139,41.478634 39.851577,37.611393 37.410922,37.566053 C 32.423455,37.474579 33.600393,32.496503 33.600393,32.496503 L 14.375479,32.558794 z "
2480+ style="opacity:1;color:black;fill:url(#linearGradient2308);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.88401449;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2481+ <path
2482+ sodipodi:nodetypes="ccccc"
2483+ id="path5363"
2484+ d="M 13.926195,33.027451 C 14.010206,35.2 13.641655,35.938894 12.285731,36.702682 L 36,38 C 35.047008,36.831372 33.660837,35.066666 34.038883,33.011765 L 13.926195,33.027451 z "
2485+ style="opacity:0.5;fill:url(#linearGradient2310);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
2486+ <path
2487+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8d8d8f;stroke-width:1.88401508px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.43902438"
2488+ d="M 10.436202,38.661601 C 17.000465,38.66357 37.562637,38.661601 37.562637,38.661601"
2489+ id="path5365"
2490+ sodipodi:nodetypes="cc" />
2491+ <path
2492+ sodipodi:nodetypes="cc"
2493+ id="path5367"
2494+ d="M 11.134219,39.660187 C 17.146756,39.662156 36.881517,39.660187 36.881517,39.660187"
2495+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.88401532px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
2496+ </g>
2497+ <path
2498+ sodipodi:nodetypes="ccccccccc"
2499+ id="path5369"
2500+ d="M 3.602229,1.4999996 L 28.319154,1.4999996 C 29.631932,1.4999996 30.588653,2.4197694 30.588653,3.8361498 L 30.595753,20.072828 C 30.595753,21.162945 30.253253,21.499994 29.276792,21.499994 L 2.7228402,21.487795 C 1.9583807,21.469246 1.414291,21.169109 1.404027,20.186855 L 1.4138652,3.7151949 C 1.4138652,2.572403 2.4117826,1.4999996 3.602229,1.4999996 z "
2501+ style="fill:url(#linearGradient5147);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00000036;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
2502+ <rect
2503+ y="3.5000005"
2504+ x="3.4999971"
2505+ height="15.194118"
2506+ width="25.103695"
2507+ id="rect5371"
2508+ style="fill:url(#radialGradient5239);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:0.99999958px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
2509+ <path
2510+ sodipodi:nodetypes="ccccc"
2511+ id="path5373"
2512+ d="M 4.0984042,4.0204313 L 4.0984042,15.748091 C 15.025941,14.866132 19.115514,9.1623492 28,8.5664313 L 28,4 L 4.0984042,4.0204313 z "
2513+ style="opacity:0.5;fill:url(#linearGradient6246);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
2514+ <path
2515+ sodipodi:nodetypes="cccsccscccc"
2516+ id="path5375"
2517+ d="M 4.056094,2.4999991 C 3.2398944,2.4999991 2.4960113,3.2952856 2.4960113,4.0741096 L 2.4960108,19.789734 C 2.4999206,20.160319 2.5869303,20.275382 2.6715202,20.346431 C 2.7561101,20.417479 2.9348114,20.473541 3.2370502,20.480806 L 28.783404,20.500002 C 29.189758,20.500002 29.318189,20.437946 29.368434,20.384824 C 29.418681,20.3317 29.504941,20.138678 29.504941,19.674554 L 29.504942,4.1892884 C 29.504942,3.0791795 28.874178,2.4999991 27.866855,2.4999991 L 4.056094,2.4999991 z "
2518+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
2519+ <g
2520+ id="g5377"
2521+ transform="matrix(1.543206e-2,0,0,1.215502e-2,29.57023,28.01728)"
2522+ style="display:inline">
2523+ <rect
2524+ y="-150.69685"
2525+ x="-1559.2523"
2526+ height="478.35718"
2527+ width="1339.6335"
2528+ id="rect6709"
2529+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5478);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2530+ <path
2531+ sodipodi:nodetypes="cccc"
2532+ id="path5380"
2533+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
2534+ style="opacity:0.40206185;color:black;fill:url(#radialGradient2309);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2535+ <path
2536+ style="opacity:0.40206185;color:black;fill:url(#radialGradient2311);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2537+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
2538+ id="path5382"
2539+ sodipodi:nodetypes="cccc" />
2540+ </g>
2541+ <path
2542+ sodipodi:nodetypes="ccccccccc"
2543+ id="path5384"
2544+ d="M 3.643761,26.504783 L 28.921938,26.504783 C 29.226374,26.504783 29.788645,26.492665 30,27 L 31.5,30 C 31.5625,30.406064 31.487026,31.562501 30,31.562501 L 2.5,31.500001 C 1,31.562501 1.0652178,30.281064 1.0652178,30 L 3,27 C 3.2113561,26.492665 3.3393239,26.504783 3.643761,26.504783 z "
2545+ style="color:black;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2546+ <path
2547+ sodipodi:nodetypes="ccccccccc"
2548+ id="path5386"
2549+ d="M 4.0955909,27.111942 L 28.49679,27.10614 C 28.788541,27.10614 28.820868,27.10614 29.023418,27.449588 L 30.420658,30.150759 C 30.420658,30.341029 30.185782,30.494207 29.894029,30.494207 L 2.6782341,30.500011 C 2.3864818,30.500011 2.1516056,30.346832 2.1516056,30.156562 L 3.5689622,27.45539 C 3.7715117,27.111942 3.8038386,27.111942 4.0955909,27.111942 z "
2550+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:white;stroke-width:0.99999964;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2551+ <path
2552+ sodipodi:nodetypes="csssssssccssssssssssssccccssscccccccccssssssssssssccsssssssssccccccc"
2553+ id="path5388"
2554+ d="M 4.9039459,26.500588 C 4.9019723,26.502459 4.9057445,26.514939 4.9039459,26.516406 C 4.89444,26.51889 4.8714034,26.528697 4.8616746,26.532224 C 4.8584281,26.533516 4.8437789,26.530815 4.840539,26.532224 C 4.8373165,26.533749 4.8225981,26.546397 4.8194034,26.548041 C 4.8130911,26.551565 4.8043634,26.559861 4.7982678,26.563859 C 4.7952901,26.565977 4.7800294,26.57744 4.7771322,26.579677 C 4.7743261,26.582033 4.7587013,26.593017 4.7559967,26.595495 C 4.7139608,26.641114 4.6696929,26.720423 4.6080475,26.816941 L 3.1646057,29.221226 C 3.1646057,29.224233 3.1644578,29.234029 3.1646057,29.237043 C 3.1648991,29.240062 3.1641691,29.249843 3.1646057,29.25286 C 3.1651831,29.255877 3.1638899,29.265668 3.1646057,29.268679 C 3.1663094,29.274683 3.1835077,29.294359 3.1857413,29.300313 C 3.1869871,29.303274 3.184369,29.31319 3.1857413,29.316132 C 3.1902312,29.324886 3.2013114,29.339269 3.2068769,29.347766 C 3.2127868,29.356161 3.2211123,29.37137 3.2280125,29.379402 C 3.230418,29.382033 3.2466397,29.392637 3.2491481,29.395219 C 3.2517571,29.39775 3.2675765,29.408562 3.2702837,29.411038 C 3.287102,29.425545 3.313719,29.446427 3.3336905,29.45849 C 3.3370984,29.460423 3.3513413,29.472456 3.3548262,29.474308 C 3.3655167,29.479116 3.3855128,29.485766 3.3970973,29.490126 C 3.4750042,29.516899 3.5780713,29.537579 3.6718601,29.537579 L 18.650036,29.537579 L 18.586629,26.500592 L 5.1153018,26.500588 C 5.0709049,26.500588 5.0221446,26.49941 4.9884883,26.500588 C 4.9806133,26.500623 4.9547729,26.500899 4.9462171,26.500588 C 4.9436075,26.500603 4.9274517,26.500458 4.9250814,26.500588 C 4.9232514,26.502034 4.9059195,26.498718 4.9039459,26.500588 z M 19.83363,26.500592 L 19.897036,27.512921 L 23.553495,27.512921 L 23.38441,26.500592 L 19.83363,26.500592 z M 24.652546,26.500592 L 25.413428,29.537579 L 28.795124,29.537579 C 28.888912,29.537579 28.991979,29.516899 29.069886,29.490126 C 29.081471,29.485766 29.101467,29.479116 29.112157,29.474308 C 29.115641,29.472456 29.129884,29.460423 29.133293,29.45849 C 29.153265,29.446427 29.179882,29.425545 29.1967,29.411038 C 29.199407,29.408562 29.215227,29.39775 29.217835,29.395219 C 29.220344,29.392637 29.236565,29.382033 29.238971,29.379402 C 29.245871,29.37137 29.254196,29.356161 29.260107,29.347766 C 29.265672,29.339269 29.276752,29.324886 29.281242,29.316132 C 29.282614,29.31319 29.279996,29.303274 29.281242,29.300313 C 29.283476,29.294359 29.300674,29.274683 29.302378,29.268679 C 29.303093,29.265668 29.3018,29.255877 29.302378,29.25286 C 29.302814,29.249843 29.302083,29.240062 29.302378,29.237043 C 29.302527,29.234029 29.302378,29.224233 29.302378,29.221226 L 28.119129,26.816941 C 28.057483,26.720424 28.013215,26.641114 27.97118,26.595495 C 27.968475,26.593017 27.95285,26.582033 27.950044,26.579677 C 27.947147,26.57744 27.931886,26.565977 27.928908,26.563859 C 27.922812,26.559861 27.914085,26.551565 27.907773,26.548041 C 27.904579,26.546397 27.88986,26.533749 27.886638,26.532224 C 27.883397,26.530815 27.868747,26.533516 27.865502,26.532224 C 27.855773,26.528697 27.832737,26.51889 27.823231,26.516406 C 27.812787,26.51452 27.796296,26.503902 27.780959,26.500588 C 27.773263,26.49907 27.745738,26.501448 27.738688,26.500588 C 27.705031,26.49941 27.656271,26.500588 27.611875,26.500588 L 24.652546,26.500592 z M 20.679054,28.525249 L 20.002715,29.537579 L 23.891664,29.537579 L 23.04624,28.525249 L 20.679054,28.525249 z "
2555+ style="color:black;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#babdb6;stroke-width:0.99999923;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2556+ <rect
2557+ style="color:black;fill:url(#radialGradient3248);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2558+ id="rect5390"
2559+ width="1"
2560+ height="1"
2561+ x="5"
2562+ y="26"
2563+ rx="0.26516503"
2564+ ry="0.26516503" />
2565+ <rect
2566+ style="color:black;fill:url(#radialGradient3245);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2567+ id="rect5392"
2568+ width="1"
2569+ height="1"
2570+ x="7"
2571+ y="26"
2572+ rx="0.26516503"
2573+ ry="0.26516503" />
2574+ <rect
2575+ style="color:black;fill:url(#radialGradient3242);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2576+ id="rect5394"
2577+ width="1"
2578+ height="1"
2579+ x="9"
2580+ y="26"
2581+ rx="0.26516503"
2582+ ry="0.26516503" />
2583+ <rect
2584+ style="color:black;fill:url(#radialGradient3239);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2585+ id="rect5396"
2586+ width="1"
2587+ height="1"
2588+ x="11"
2589+ y="26"
2590+ rx="0.26516503"
2591+ ry="0.26516503" />
2592+ <rect
2593+ style="color:black;fill:url(#radialGradient3236);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2594+ id="rect5398"
2595+ width="1"
2596+ height="1"
2597+ x="13"
2598+ y="26"
2599+ rx="0.26516503"
2600+ ry="0.26516503" />
2601+ <rect
2602+ style="color:black;fill:url(#radialGradient3233);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2603+ id="rect5400"
2604+ width="1"
2605+ height="1"
2606+ x="15"
2607+ y="26"
2608+ rx="0.26516503"
2609+ ry="0.26516503" />
2610+ <rect
2611+ style="color:black;fill:url(#radialGradient3230);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2612+ id="rect5402"
2613+ width="1"
2614+ height="1"
2615+ x="17"
2616+ y="26"
2617+ rx="0.26516503"
2618+ ry="0.26516503" />
2619+ <rect
2620+ style="color:black;fill:url(#radialGradient3224);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2621+ id="rect5404"
2622+ width="1"
2623+ height="1"
2624+ x="4"
2625+ y="27"
2626+ rx="0.26516503"
2627+ ry="0.26516503" />
2628+ <rect
2629+ style="color:black;fill:url(#radialGradient3221);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2630+ id="rect5406"
2631+ width="1"
2632+ height="1"
2633+ x="6"
2634+ y="27"
2635+ rx="0.26516503"
2636+ ry="0.26516503" />
2637+ <rect
2638+ style="color:black;fill:url(#radialGradient3218);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2639+ id="rect5408"
2640+ width="1"
2641+ height="1"
2642+ x="8"
2643+ y="27"
2644+ rx="0.26516503"
2645+ ry="0.26516503" />
2646+ <rect
2647+ style="color:black;fill:url(#radialGradient3215);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2648+ id="rect5410"
2649+ width="1"
2650+ height="1"
2651+ x="10"
2652+ y="27"
2653+ rx="0.26516503"
2654+ ry="0.26516503" />
2655+ <rect
2656+ style="color:black;fill:url(#radialGradient3212);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2657+ id="rect5412"
2658+ width="1"
2659+ height="1"
2660+ x="12"
2661+ y="27"
2662+ rx="0.26516503"
2663+ ry="0.26516503" />
2664+ <rect
2665+ style="color:black;fill:url(#radialGradient3209);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2666+ id="rect5414"
2667+ width="1"
2668+ height="1"
2669+ x="14"
2670+ y="27"
2671+ rx="0.26516503"
2672+ ry="0.26516503" />
2673+ <rect
2674+ style="color:black;fill:url(#radialGradient3206);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2675+ id="rect5416"
2676+ width="1"
2677+ height="1"
2678+ x="16"
2679+ y="27"
2680+ rx="0.26516503"
2681+ ry="0.26516503" />
2682+ <rect
2683+ style="color:black;fill:url(#radialGradient3203);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2684+ id="rect5418"
2685+ width="1"
2686+ height="1"
2687+ x="18"
2688+ y="27"
2689+ rx="0.26516503"
2690+ ry="0.26516503" />
2691+ <rect
2692+ style="color:black;fill:url(#radialGradient3200);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2693+ id="rect5420"
2694+ width="1"
2695+ height="1"
2696+ x="5"
2697+ y="28"
2698+ rx="0.26516503"
2699+ ry="0.26516503" />
2700+ <rect
2701+ style="color:black;fill:url(#radialGradient3197);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2702+ id="rect5422"
2703+ width="1"
2704+ height="1"
2705+ x="7"
2706+ y="28"
2707+ rx="0.26516503"
2708+ ry="0.26516503" />
2709+ <rect
2710+ style="color:black;fill:url(#radialGradient3194);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2711+ id="rect5424"
2712+ width="1"
2713+ height="1"
2714+ x="9"
2715+ y="28"
2716+ rx="0.26516503"
2717+ ry="0.26516503" />
2718+ <rect
2719+ style="color:black;fill:url(#radialGradient3191);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2720+ id="rect5426"
2721+ width="1"
2722+ height="1"
2723+ x="11"
2724+ y="28"
2725+ rx="0.26516503"
2726+ ry="0.26516503" />
2727+ <rect
2728+ style="color:black;fill:url(#radialGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2729+ id="rect5428"
2730+ width="1"
2731+ height="1"
2732+ x="13"
2733+ y="28"
2734+ rx="0.26516503"
2735+ ry="0.26516503" />
2736+ <rect
2737+ style="color:black;fill:url(#radialGradient3185);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2738+ id="rect5430"
2739+ width="1"
2740+ height="1"
2741+ x="15"
2742+ y="28"
2743+ rx="0.26516503"
2744+ ry="0.26516503" />
2745+ <rect
2746+ style="color:black;fill:url(#radialGradient3182);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2747+ id="rect5432"
2748+ width="1"
2749+ height="1"
2750+ x="17"
2751+ y="28"
2752+ rx="0.26516503"
2753+ ry="0.26516503" />
2754+ <rect
2755+ style="color:black;fill:url(#radialGradient3176);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2756+ id="rect5434"
2757+ width="1"
2758+ height="1"
2759+ x="4"
2760+ y="29"
2761+ rx="0.26516503"
2762+ ry="0.26516503" />
2763+ <rect
2764+ style="color:black;fill:url(#radialGradient3173);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2765+ id="rect5436"
2766+ width="1"
2767+ height="1"
2768+ x="6"
2769+ y="29"
2770+ rx="0.26516503"
2771+ ry="0.26516503" />
2772+ <rect
2773+ style="color:black;fill:url(#radialGradient3170);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2774+ id="rect5438"
2775+ width="1"
2776+ height="1"
2777+ x="8"
2778+ y="29"
2779+ rx="0.26516503"
2780+ ry="0.26516503" />
2781+ <rect
2782+ style="color:black;fill:url(#radialGradient3167);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2783+ id="rect5440"
2784+ width="1"
2785+ height="1"
2786+ x="10"
2787+ y="29"
2788+ rx="0.26516503"
2789+ ry="0.26516503" />
2790+ <rect
2791+ style="color:black;fill:url(#radialGradient3164);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2792+ id="rect5442"
2793+ width="1"
2794+ height="1"
2795+ x="12"
2796+ y="29"
2797+ rx="0.26516503"
2798+ ry="0.26516503" />
2799+ <rect
2800+ style="color:black;fill:url(#radialGradient3161);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2801+ id="rect5444"
2802+ width="1"
2803+ height="1"
2804+ x="14"
2805+ y="29"
2806+ rx="0.26516503"
2807+ ry="0.26516503" />
2808+ <rect
2809+ style="color:black;fill:url(#radialGradient3158);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2810+ id="rect5446"
2811+ width="1"
2812+ height="1"
2813+ x="16"
2814+ y="29"
2815+ rx="0.26516503"
2816+ ry="0.26516503" />
2817+ <rect
2818+ style="color:black;fill:url(#radialGradient3155);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2819+ id="rect5448"
2820+ width="1"
2821+ height="1"
2822+ x="18"
2823+ y="29"
2824+ rx="0.26516503"
2825+ ry="0.26516503" />
2826+ <rect
2827+ style="color:black;fill:url(#radialGradient3264);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2828+ id="rect5450"
2829+ width="1"
2830+ height="1"
2831+ x="21"
2832+ y="26"
2833+ rx="0.26516503"
2834+ ry="0.26516503" />
2835+ <rect
2836+ style="color:black;fill:url(#radialGradient3266);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2837+ id="rect5452"
2838+ width="1"
2839+ height="1"
2840+ x="20"
2841+ y="27"
2842+ rx="0.26516503"
2843+ ry="0.26516503" />
2844+ <rect
2845+ style="color:black;fill:url(#radialGradient3268);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2846+ id="rect5454"
2847+ width="1"
2848+ height="1"
2849+ x="22"
2850+ y="27"
2851+ rx="0.26516503"
2852+ ry="0.26516503" />
2853+ <rect
2854+ style="color:black;fill:url(#radialGradient3270);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2855+ id="rect5456"
2856+ width="1"
2857+ height="1"
2858+ x="21"
2859+ y="28"
2860+ rx="0.26516503"
2861+ ry="0.26516503" />
2862+ <rect
2863+ style="color:black;fill:url(#radialGradient3272);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2864+ id="rect5458"
2865+ width="1"
2866+ height="1"
2867+ x="23"
2868+ y="28"
2869+ rx="0.26516503"
2870+ ry="0.26516503" />
2871+ <rect
2872+ style="color:black;fill:url(#radialGradient3274);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2873+ id="rect5460"
2874+ width="1"
2875+ height="1"
2876+ x="20"
2877+ y="29"
2878+ rx="0.26516503"
2879+ ry="0.26516503" />
2880+ <rect
2881+ style="color:black;fill:url(#radialGradient3276);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2882+ id="rect5462"
2883+ width="1"
2884+ height="1"
2885+ x="22"
2886+ y="29"
2887+ rx="0.26516503"
2888+ ry="0.26516503" />
2889+ <rect
2890+ style="color:black;fill:url(#radialGradient3292);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2891+ id="rect5464"
2892+ width="1"
2893+ height="1"
2894+ x="26"
2895+ y="26"
2896+ rx="0.26516503"
2897+ ry="0.26516503" />
2898+ <rect
2899+ style="color:black;fill:url(#radialGradient3294);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2900+ id="rect5466"
2901+ width="1"
2902+ height="1"
2903+ x="25"
2904+ y="27"
2905+ rx="0.26516503"
2906+ ry="0.26516503" />
2907+ <rect
2908+ style="color:black;fill:url(#radialGradient3296);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2909+ id="rect5468"
2910+ width="1"
2911+ height="1"
2912+ x="27"
2913+ y="27"
2914+ rx="0.26516503"
2915+ ry="0.26516503" />
2916+ <rect
2917+ style="color:black;fill:url(#radialGradient3298);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2918+ id="rect5470"
2919+ width="1"
2920+ height="1"
2921+ x="26"
2922+ y="28"
2923+ rx="0.26516503"
2924+ ry="0.26516503" />
2925+ <rect
2926+ style="color:black;fill:url(#radialGradient3300);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2927+ id="rect5472"
2928+ width="1"
2929+ height="1"
2930+ x="28"
2931+ y="28"
2932+ rx="0.26516503"
2933+ ry="0.26516503" />
2934+ <rect
2935+ style="color:black;fill:url(#radialGradient3302);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2936+ id="rect5474"
2937+ width="1"
2938+ height="1"
2939+ x="25"
2940+ y="29"
2941+ rx="0.26516503"
2942+ ry="0.26516503" />
2943+ <rect
2944+ style="color:black;fill:url(#radialGradient3304);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2945+ id="rect5476"
2946+ width="1"
2947+ height="1"
2948+ x="27"
2949+ y="29"
2950+ rx="0.26516503"
2951+ ry="0.26516503" />
2952+ </g>
2953+ </g>
2954+ </g>
2955+</svg>
2956diff --git a/snapcraft.yaml b/snapcraft.yaml
2957index 6c30e14..98a1df8 100644
2958--- a/snapcraft.yaml
2959+++ b/snapcraft.yaml
2960@@ -1,3 +1,4 @@
2961+<<<<<<< snapcraft.yaml
2962 name: tpm2
2963 version: 1.0-3
2964 summary: TPM 2.0 utilities
2965@@ -148,3 +149,225 @@ parts:
2966 - -include
2967 after:
2968 - tpm2-tss
2969+=======
2970+name: network-manager
2971+version: 1.2.2-10
2972+summary: Network management framework
2973+description: |
2974+ NetworkManager is a system network service that manages your network
2975+ devices and connections, attempting to keep active network connectivity
2976+ when available. It manages ethernet, WiFi, mobile broadband (WWAN) and
2977+ PPPoE devices, provides VPN integration with a variety of different
2978+ VPN serivces.
2979+ Please find the source code at https://code.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/network-manager
2980+confinement: strict
2981+grade: stable
2982+
2983+slots:
2984+ service: network-manager
2985+
2986+plugs:
2987+ nmcli: network-manager
2988+
2989+apps:
2990+ nmcli:
2991+ command: usr/bin/nmcli
2992+ plugs: [nmcli]
2993+ networkmanager:
2994+ command: bin/networkmanager
2995+ daemon: simple
2996+ slots: [service]
2997+ plugs: [modem-manager, ppp, network-setup-observe]
2998+
2999+parts:
3000+ networkmanager-common:
3001+ plugin: copy
3002+ files:
3003+ bin/networkmanager: bin/networkmanager
3004+ bin/dhcp-lease-mover: bin/dhcp-lease-mover
3005+ conf/NetworkManager.conf: etc/NetworkManager/NetworkManager.conf
3006+ data/copyright: usr/share/doc/network-manager/copyright
3007+ startup-hooks/99-wol-by-default.sh: startup-hooks/99-wol-by-default.sh
3008+
3009+ inotify-tools:
3010+ plugin: nil
3011+ stage-packages:
3012+ - libinotifytools0
3013+ - inotify-tools
3014+ filesets:
3015+ wanted:
3016+ - usr/share/doc/inotify-tools/copyright
3017+ - usr/bin/inotifywait
3018+ - usr/share/doc/libinotifytools0/copyright
3019+ - usr/lib/libinotifytools.so.0.4.1
3020+ - usr/lib/libinotifytools.so.0
3021+ snap:
3022+ - $wanted
3023+
3024+ networkmanager:
3025+ plugin: autotools
3026+
3027+ source: https://git.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/network-manager
3028+ source-type: git
3029+ # For development you can directly build from the xenial branch if
3030+ # needed. Otherwise use the tag to the latest version which will be
3031+ # used by the published snap.
3032+ # source-branch: network-manager/xenial/1.2.2
3033+ source-tag: network-manager-xenial-1.2.2-2
3034+
3035+ build-packages:
3036+ - intltool
3037+ - gtk-doc-tools
3038+ - libdbus-glib-1-dev
3039+ - libdbus-1-dev
3040+ - libiw-dev
3041+ - libglib2.0-dev
3042+ - libnl-3-dev
3043+ - libnl-route-3-dev
3044+ - libnl-genl-3-dev
3045+ - libnss3-dev
3046+ - libgnutls28-dev
3047+ - libgcrypt11-dev
3048+ - uuid-dev
3049+ - systemd
3050+ - libsystemd-dev
3051+ - libudev-dev
3052+ - libgudev-1.0-dev
3053+ - libgirepository1.0-dev
3054+ - gobject-introspection
3055+ - libglib2.0-doc
3056+ - libmm-glib-dev
3057+ - libndp-dev
3058+ - libreadline-dev
3059+ - libnewt-dev
3060+ - dbus-test-runner
3061+ - isc-dhcp-client
3062+ - python-dbus
3063+ - python-gi
3064+ - iptables
3065+ - ppp-dev
3066+
3067+ # We stage everything here we need for build and runtime
3068+ stage-packages:
3069+ - iputils-arping
3070+ - iw
3071+ - libc6
3072+ - libdbus-1-3
3073+ - libdbus-glib-1-2
3074+ - libgcrypt20
3075+ - libglib2.0-0
3076+ - libgudev-1.0-0
3077+ - libiw-dev
3078+ - libmbim-glib4
3079+ - libndp0
3080+ - libnl-3-200
3081+ - libnl-3-dev
3082+ - libnl-genl-3-200
3083+ - libnl-route-3-200
3084+ - libpam-systemd
3085+ - libreadline6
3086+ - libsystemd0
3087+ - libuuid1
3088+ - lsb-base
3089+ - uuid-dev
3090+ - wireless-tools
3091+
3092+ configflags:
3093+ # Disable all features we don't want enabled as we're not
3094+ # supporting them (yet).
3095+ - --prefix=/usr
3096+ - --libdir=/usr/lib
3097+ - --libexecdir=/usr/lib/NetworkManager
3098+ - --disable-qt
3099+ - --disable-teamdctl
3100+ - --disable-polkit
3101+ - --disable-vala
3102+ - --disable-config-plugin-ibft
3103+ - --with-dhcpcd=no
3104+ - --with-dhclient=no
3105+ - --with-dnsmasq=no
3106+ - --with-systemd-journal=no
3107+ # Removes dependency on libicudata which weights 25M. Also libsoup
3108+ # is only used to verify a domain in the DNS resolve process has a
3109+ # valid format and to check if a valid internet connection is available.
3110+ - --with-libsoup=no
3111+ # We want to support ModemManager
3112+ - --with-modem-manager-1=yes
3113+
3114+ # Filter files pulled in by stage-packages so they aren't
3115+ # included in the final snap. We only need them to build
3116+ # NetworkManager. All runtime dependencies are pulled in with
3117+ # the rdepends part below. The only left items specified
3118+ # here are the results of the network manager build.
3119+ filesets:
3120+ binaries:
3121+ - usr/bin/nmcli
3122+ - usr/lib/*/NetworkManager
3123+ - usr/lib/pppd/2.4.5/nm-pppd-plugin.so
3124+ - usr/lib/NetworkManager
3125+ - usr/sbin/NetworkManager
3126+ - usr/lib/*/libnm-*
3127+ configs:
3128+ - etc/NetworkManager/*
3129+ docs:
3130+ - usr/share/doc
3131+ rdepends:
3132+ - lib64/*
3133+ - lib/*/
3134+ - usr/lib/*
3135+ unwanted:
3136+ # We don't want anything in usr/share but the doc folder
3137+ # to carry all copyright information
3138+ - -usr/share/bash-completion
3139+ - -usr/share/bug
3140+ - -usr/share/dbus-1
3141+ - -usr/share/gir-1.0
3142+ - -usr/share/glib-2.0
3143+ - -usr/share/gtk-doc
3144+ - -usr/share/lintian
3145+ - -usr/share/locale
3146+ - -usr/share/man
3147+ - -usr/share/pam-configs
3148+ - -usr/share/polkit-1
3149+ - -usr/share/upstart
3150+
3151+ # We don't use dhclient so we don't need this helper
3152+ - -usr/lib/NetworkManager/nm-dhcp-helper
3153+ # Things we don't support yet and don't have to ship
3154+ - -usr/lib/NetworkManager/libnm-device-plugin-adsl.so
3155+ - -usr/lib/NetworkManager/libnm-device-plugin-bluetooth.so
3156+ - -usr/lib/NetworkManager/libnm-settings-plugin-ibft.so
3157+
3158+ # Unwanted content coming from the stage debian packages
3159+ - -etc/
3160+ # Contains many libraries which are already present in usr/lib/
3161+ - -lib/
3162+ - -usr/include/
3163+ - -usr/etc
3164+ - -usr/sbin/invoke-rc.d
3165+ - -usr/sbin/service
3166+ - -usr/sbin/update-rc.d
3167+ - -usr/lib/dbus-1.0/
3168+ - -usr/lib/tmpfiles.d/
3169+ - -usr/lib/*/pkgconfig
3170+ - -usr/lib/pkgconfig
3171+ - -usr/lib/gcc/
3172+ - -usr/lib/*/gconv/
3173+ - -usr/lib/girepository-1.0/
3174+ - -usr/lib/systemd/
3175+ - -usr/lib/udev/
3176+ - -usr/lib/*.a
3177+ - -usr/lib/*/*.a
3178+ - -usr/lib/*.la
3179+ - -usr/lib/*/*.la
3180+ - -usr/lib/*/*.o
3181+ - -usr/lib/*/systemd-shim
3182+ - -usr/lib/*/systemd-shim-cgroup-release-agent
3183+ snap:
3184+ - $binaries
3185+ - $configs
3186+ - $docs
3187+ - $rdepends
3188+ - $unwanted
3189+
3190+>>>>>>> snapcraft.yaml
3191diff --git a/spread.yaml b/spread.yaml
3192index 77659ce..49f432f 100644
3193--- a/spread.yaml
3194+++ b/spread.yaml
3195@@ -1,5 +1,9 @@
3196 #
3197+<<<<<<< spread.yaml
3198 # Copyright (C) 2016 Canonical Ltd
3199+=======
3200+# Copyright (C) 2015, 2016 Canonical Ltd
3201+>>>>>>> spread.yaml
3202 #
3203 # This program is free software: you can redistribute it and/or modify
3204 # it under the terms of the GNU General Public License version 3 as
3205@@ -14,12 +18,21 @@
3206 # along with this program. If not, see <http://www.gnu.org/licenses/>.
3207
3208
3209+<<<<<<< spread.yaml
3210 project: tpm2
3211
3212 environment:
3213 PROJECT_PATH: /home/tpm2
3214 TESTSLIB: $PROJECT_PATH/tests/lib
3215 SNAP_NAME: tpm2
3216+=======
3217+project: network-manager
3218+
3219+environment:
3220+ PROJECT_PATH: /home/network-manager
3221+ TESTSLIB: $PROJECT_PATH/tests/lib
3222+ SNAP_NAME: network-manager
3223+>>>>>>> spread.yaml
3224 # Allow the host to pass the channel to use for the test run
3225 SNAP_CHANNEL: $(HOST:echo $SNAP_CHANNEL)
3226
3227@@ -31,7 +44,11 @@ backends:
3228 password: test
3229
3230 # Put this somewhere where we have read-write access
3231+<<<<<<< spread.yaml
3232 path: /home/tpm2
3233+=======
3234+path: /home/network-manager
3235+>>>>>>> spread.yaml
3236
3237 exclude:
3238 - .git
3239@@ -41,10 +58,41 @@ prepare: |
3240
3241 suites:
3242 tests/main/:
3243+<<<<<<< spread.yaml
3244 summary: Install tests for tpm2
3245+=======
3246+ summary: Full-system tests for NetworkManager without ethernet support
3247+>>>>>>> spread.yaml
3248+ systems:
3249+ - ubuntu-core-16
3250+ prepare: |
3251+ . $TESTSLIB/prepare.sh
3252+ restore-each: |
3253+ . $TESTSLIB/restore-each.sh
3254+<<<<<<< spread.yaml
3255+=======
3256+ tests/full/:
3257+ summary: Full-system tests for NetworkManager being the only network management service
3258 systems:
3259 - ubuntu-core-16
3260 prepare: |
3261+ . $TESTSLIB/utilities.sh
3262+ stop_after_first_reboot
3263+ # Force snapd state to be regenerated so that it also preserves
3264+ # the netplan renderer switch configuration file.
3265+ rm -f /home/network-manager/snapd-state.tar.gz
3266+ switch_netplan_to_network_manager
3267 . $TESTSLIB/prepare.sh
3268+ REBOOT
3269 restore-each: |
3270 . $TESTSLIB/restore-each.sh
3271+ restore: |
3272+ . $TESTSLIB/utilities.sh
3273+ stop_after_first_reboot
3274+ switch_netplan_to_networkd
3275+ # Need to drop the state here as it includes the netplan config
3276+ # which configures us to use NetworkManager as renderer. The
3277+ # prepare script run for the next suite will regenerate it.
3278+ rm -f /home/network-manager/snapd-state.tar.gz
3279+ REBOOT
3280+>>>>>>> spread.yaml
3281diff --git a/startup-hooks/99-wol-by-default.sh b/startup-hooks/99-wol-by-default.sh
3282new file mode 100755
3283index 0000000..c2d4480
3284--- /dev/null
3285+++ b/startup-hooks/99-wol-by-default.sh
3286@@ -0,0 +1,13 @@
3287+#!/bin/sh
3288+
3289+# Enable wake-on-lan by default until we have a configuration
3290+# hook to do that.
3291+if [ ! -e $SNAP_DATA/conf.d/enable-wol.conf ] ; then
3292+ mkdir -p $SNAP_DATA/conf.d
3293+ cat <<-EOF > $SNAP_DATA/conf.d/enable-wol.conf
3294+ [connection]
3295+ # Value 64 maps to the 'magic' setting; see man nm-settings
3296+ # for more information.
3297+ 802-3-ethernet.wake-on-lan=64
3298+ EOF
3299+fi
3300diff --git a/tests/full/correct-dns-setup/task.yaml b/tests/full/correct-dns-setup/task.yaml
3301new file mode 100644
3302index 0000000..9b6dfe0
3303--- /dev/null
3304+++ b/tests/full/correct-dns-setup/task.yaml
3305@@ -0,0 +1,47 @@
3306+summary: Verify correct DNS setup
3307+
3308+execute: |
3309+ . $TESTSLIB/utilities.sh
3310+ case $SPREAD_REBOOT in
3311+ 0)
3312+ # For correct timing if the device has just booted
3313+ wait_for_network_manager
3314+
3315+ # Precondition is a existing network connection
3316+ /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
3317+
3318+ # We get a default nameserver from the gateway
3319+ if [ "$SPREAD_BACKEND" = "qemu" ] ; then
3320+ cat /etc/resolv.conf | grep 'nameserver 10.0.2.3'
3321+ fi
3322+
3323+ # Ensure we can resolve a hostname correctly; must give a
3324+ # valid IP address
3325+ address=`python3 -c 'import socket; print(socket.gethostbyname("ubuntu.com"))' 2> /dev/null || echo "invalid"`
3326+ [ "$address" != "invalid" ] && [[ $address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]
3327+
3328+ # Now lets switch to a system where we have a configuration
3329+ # for ethernet we can change
3330+ rm /etc/netplan/00-snapd-config.yaml
3331+ REBOOT
3332+ ;;
3333+ 1)
3334+ /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
3335+ /snap/bin/network-manager.nmcli d | grep -v netplan
3336+
3337+ connection=$(/snap/bin/network-manager.nmcli -m multiline -f UUID c show --active | awk '{print$2;exit}')
3338+ /snap/bin/network-manager.nmcli c modify $connection ipv4.dns 8.8.8.8
3339+ # We need to bring up the connection again here to get the DNS
3340+ # server really applied to the system.
3341+ /snap/bin/network-manager.nmcli c up $connection
3342+
3343+ # Give system a moment to settle
3344+ sleep 1
3345+
3346+ grep 'nameserver 8.8.8.8' /etc/resolv.conf
3347+ address=`python3 -c 'import socket; print(socket.gethostbyname("ubuntu.com"))' 2> /dev/null || echo "invalid"`
3348+ [ "$address" != "invalid" ] && [[ $address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]
3349+ ;;
3350+ *)
3351+ ;;
3352+ esac
3353diff --git a/tests/full/dhcp-leases-are-moved/task.yaml b/tests/full/dhcp-leases-are-moved/task.yaml
3354new file mode 100644
3355index 0000000..80cf0e9
3356--- /dev/null
3357+++ b/tests/full/dhcp-leases-are-moved/task.yaml
3358@@ -0,0 +1,35 @@
3359+summary: Verify that the DHCP leases are moved to the correct location
3360+
3361+execute: |
3362+ . $TESTSLIB/utilities.sh
3363+
3364+ wait_for_network_manager
3365+
3366+ # We should have a single lease for eth0 at this point but give
3367+ # NetworkManager some time to do its job
3368+ test -e /run/NetworkManager/dhcp
3369+ test -e /var/snap/network-manager/current/state/dhcp
3370+ n=0
3371+ state_ok=0
3372+ while [ $n -lt 10 ] ; do
3373+ num_leases=`ls -1 /var/snap/network-manager/current/state/dhcp | wc -l`
3374+ num_public_leases=`ls -1 /run/NetworkManager/dhcp | wc -l`
3375+ if [ $num_leases -eq $num_public_leases ]; then
3376+ state_ok=1
3377+ break
3378+ fi
3379+ sleep 0.5
3380+ let n=n+1
3381+ done
3382+ test $state_ok -eq 1
3383+
3384+ # Create a new lease file and ensure it gets copied over
3385+ test ! -e /run/NetworkManager/dhcp/temp.lease
3386+ touch /var/snap/network-manager/current/state/dhcp/temp.lease
3387+ sleep 2
3388+ test -e /run/NetworkManager/dhcp/temp.lease
3389+ # Ensure that the lease is also removed from /run again when it
3390+ # gets removed from SNAP_DATA
3391+ rm /var/snap/network-manager/current/state/dhcp/temp.lease
3392+ sleep 2
3393+ test ! -e /var/snap/network-manager/current/state/dhcp/temp.lease
3394diff --git a/tests/full/immutable-netplan-config/task.yaml b/tests/full/immutable-netplan-config/task.yaml
3395new file mode 100644
3396index 0000000..52c2d61
3397--- /dev/null
3398+++ b/tests/full/immutable-netplan-config/task.yaml
3399@@ -0,0 +1,9 @@
3400+summary: Verify that netplan configuration files are immutable
3401+
3402+execute: |
3403+ # Ensure we're using a configuration generated from netplan
3404+ test -e /etc/netplan/00-snapd-config.yaml
3405+ test -e /run/NetworkManager/system-connections/netplan-eth0
3406+ /snap/bin/network-manager.nmcli c | grep 'netplan.eth0.*eth0'
3407+ # Try to change the DNS server used on this connection
3408+ test ! `/snap/bin/network-manager.nmcli c modify netplan-eth0 ipv4.dns 8.8.8.8`
3409\ No newline at end of file
3410diff --git a/tests/full/ipv6-address-assignment/task.yaml b/tests/full/ipv6-address-assignment/task.yaml
3411new file mode 100644
3412index 0000000..e36ef00
3413--- /dev/null
3414+++ b/tests/full/ipv6-address-assignment/task.yaml
3415@@ -0,0 +1,27 @@
3416+summary: Verify NetworkManager can assign a static IPv6 address to an interface
3417+
3418+restore: |
3419+ # Ensure that the created virtual network interfaces are removed
3420+ # in any case when we're done
3421+ if [ -e /sys/class/net/veth0 ] ; then
3422+ ip link delete veth0
3423+ fi
3424+
3425+execute: |
3426+ . $TESTSLIB/utilities.sh
3427+
3428+ # Ensure that we have IPv6 support enabled in the kernel
3429+ test -e /proc/net/if_inet6
3430+
3431+ ip link add dev veth0 type veth peer name veth1
3432+
3433+ wait_for_network_manager
3434+
3435+ connection=veth-ipv6
3436+ /snap/bin/network-manager.nmcli c add con-name $connection ifname veth0 type ethernet \
3437+ ip6 abbe::cafe
3438+ /snap/bin/network-manager.nmcli c up $connection
3439+
3440+ # Verify that NetworkManager assigned the correct IPv6 address
3441+ # to the interface
3442+ ifconfig veth0 | grep 'abbe::cafe/128'
3443diff --git a/tests/full/ipv6-router-advertisements/task.yaml b/tests/full/ipv6-router-advertisements/task.yaml
3444new file mode 100644
3445index 0000000..4af402b
3446--- /dev/null
3447+++ b/tests/full/ipv6-router-advertisements/task.yaml
3448@@ -0,0 +1,70 @@
3449+summary: Test IPv6 address assignment via router advertisements
3450+
3451+restore: |
3452+ # Ensure that the created virtual network interfaces are removed
3453+ # in any case when we're done
3454+ if [ -e /sys/class/net/veth0 ] ; then
3455+ ip link delete veth0
3456+ fi
3457+
3458+execute: |
3459+ . $TESTSLIB/utilities.sh
3460+
3461+ # Ensure that we have IPv6 support enabled in the kernel
3462+ test -e /proc/net/if_inet6
3463+
3464+ snap install --devmode se-test-tools
3465+ snap connect se-test-tools:home core
3466+ snap connect se-test-tools:network-control core
3467+
3468+ # Create virtual ethernet interface pair
3469+ sudo ip link add dev veth0 type veth peer name veth1
3470+
3471+ # As the virtual ethernet devices don't get IPv6 setup
3472+ # correctly by default we have to do this
3473+ sudo sysctl -w net.ipv6.conf.veth0.disable_ipv6=0
3474+ sudo sysctl -w net.ipv6.conf.veth1.disable_ipv6=0
3475+ veth0_lla=$(mac_to_ipv6 `cat /sys/class/net/veth0/address`)
3476+ veth1_lla=$(mac_to_ipv6 `cat /sys/class/net/veth1/address`)
3477+
3478+ # The radvd daemon will send out router advertisements on veth1
3479+ # so that we can receive them on veth0 end
3480+ cat <<-EOF > /home/test/radvd.conf
3481+ interface veth1 {
3482+ AdvSendAdvert on;
3483+ prefix 2001:db8:1:2::/64 {};
3484+ };
3485+ EOF
3486+
3487+ # To ensure that nobody touches veth1 we tell NetworkManager
3488+ # explicitly to do that.
3489+ /snap/bin/network-manager.nmcli d set veth1 managed no
3490+
3491+ # Assign our link-local addresses
3492+ if ! ip addr show dev veth0 | grep 'inet6.*scope link.*' ; then
3493+ sudo ip addr add dev veth0 scope link $veth0_lla
3494+ fi
3495+ if ! ip addr show dev veth1 | grep 'inet6.*scope link.*' ; then
3496+ sudo ip addr add dev veth1 scope link $veth1_lla
3497+ fi
3498+
3499+ # This will get our router advertisement daemon started and we
3500+ # now configure NetworkManager
3501+ sudo se-test-tools.radvd -C /home/test/radvd.conf -n -d 5 -m stderr -p /home/test/radvd.pid &
3502+
3503+ # Give things a bit more time to settle
3504+ sleep 10
3505+ ip addr show dev veth0
3506+
3507+ # At this point veth0 should have now a global IPv6 address
3508+ # assigned via router advertisements
3509+ ip addr show dev veth0 | grep 'inet6 2001:db8:1:2:.*/64 scope global'
3510+ # but veth1 should not have any
3511+ ip addr show dev veth1 | grep -v 'inet6.*scope global'
3512+
3513+ # NetworkManager should report the same addresses for IPv6
3514+ /snap/bin/network-manager.nmcli d show veth0 | grep 'GENERAL.STATE.*connected'
3515+ /snap/bin/network-manager.nmcli d show veth0 | grep 'IP6.ADDRESS.*2001:db8:1:2.*/64'
3516+
3517+ # Stop the radvd daemon
3518+ kill -TERM `cat /home/test/radvd.pid`
3519diff --git a/tests/full/no-netplan-default-config/task.yaml b/tests/full/no-netplan-default-config/task.yaml
3520new file mode 100644
3521index 0000000..c0d6934
3522--- /dev/null
3523+++ b/tests/full/no-netplan-default-config/task.yaml
3524@@ -0,0 +1,41 @@
3525+summary: Verify ethernet is auto-connected when no default netplan configuration exists
3526+
3527+prepare: |
3528+ cp /etc/netplan/00-snapd-config.yaml /etc/netplan/00-snapd-config.yaml.orig
3529+
3530+restore: |
3531+ mv /etc/netplan/00-snapd-config.yaml.orig /etc/netplan/00-snapd-config.yaml
3532+
3533+execute: |
3534+ . $TESTSLIB/utilities.sh
3535+ case "$SPREAD_REBOOT" in
3536+ 0)
3537+ # Remove all configuration files from netplan to get a system
3538+ # without generated configuration files from netplan
3539+ if [ -e /usr/lib/snapd/generate-network-conf ] ; then
3540+ echo "" > /etc/netplan/00-snapd-config.yaml
3541+ else
3542+ rm /etc/netplan/00-snapd-config.yaml
3543+ fi
3544+ REBOOT
3545+ ;;
3546+ 1)
3547+ # We should be automatically connected now and not via a configuration
3548+ # generated from netplan
3549+ wait_for_network_manager
3550+ /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
3551+ networkctl status eth0 | grep 'State: n/a'
3552+ /snap/bin/network-manager.nmcli c show --active | grep eth0 | grep -v netplan
3553+
3554+ # We should only have a single active configuration
3555+ test `/snap/bin/network-manager.nmcli -m multiline -f UUID c show --active | wc -l` -eq 1
3556+
3557+ # Verify that we can modify the automatically created connection
3558+ connection=$(/snap/bin/network-manager.nmcli -m multiline -f UUID c show --active | awk '{print$2;exit}')
3559+ /snap/bin/network-manager.nmcli c modify $connection 802-3-ethernet.wake-on-lan magic
3560+ wol_value=$(/snap/bin/network-manager.nmcli -f 802-3-ethernet.wake-on-lan c show $connection | xargs | cut -d':' -f 2)
3561+ test "$wol_value" = " 64 (magic)"
3562+ ;;
3563+ *)
3564+ ;;
3565+ esac
3566diff --git a/tests/full/system-network-is-active/task.yaml b/tests/full/system-network-is-active/task.yaml
3567new file mode 100644
3568index 0000000..ee29ef0
3569--- /dev/null
3570+++ b/tests/full/system-network-is-active/task.yaml
3571@@ -0,0 +1,9 @@
3572+summary: Ethernet network should be managed by NetworkManager
3573+
3574+execute: |
3575+ . $TESTSLIB/utilities.sh
3576+ # Verify NetworManager handles ethernet and marks it as connected
3577+ test -e /etc/netplan/00-default-nm-renderer.yaml
3578+ wait_for_network_manager
3579+ /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
3580+ networkctl status eth0 | grep 'State: n/a'
3581diff --git a/tests/full/wol-enabled-by-default/task.yaml b/tests/full/wol-enabled-by-default/task.yaml
3582new file mode 100644
3583index 0000000..434ef01
3584--- /dev/null
3585+++ b/tests/full/wol-enabled-by-default/task.yaml
3586@@ -0,0 +1,59 @@
3587+summary: Verify that wake-on-lan is enabled by default for all ethernet connections
3588+
3589+execute: |
3590+ . $TESTSLIB/utilities.sh
3591+ nmcli=/snap/bin/network-manager.nmcli
3592+ case "$SPREAD_REBOOT" in
3593+ 0)
3594+ # For correct timing if the device has just booted
3595+ wait_for_network_manager
3596+
3597+ # The config file needs to be present and have the correct default set
3598+ test -e /var/snap/network-manager/current/conf.d/enable-wol.conf
3599+ cat /var/snap/network-manager/current/conf.d/enable-wol.conf | grep '802-3-ethernet.wake-on-lan=64'
3600+
3601+ # Precondition is a existing network connection
3602+ $nmcli d | grep 'eth0.*connected'
3603+
3604+ # The netplan configuration file has WoL disabled by default as
3605+ # the default one the core snap provides does not explicitly
3606+ # enable WoL.
3607+ connection=$($nmcli -m multiline -f UUID c show --active | awk '{print$2;exit}')
3608+ $nmcli -m multiline -f connection.id c show $connection | grep 'netplan-eth0'
3609+ $nmcli -m multiline -f connection.type c show $connection | grep '802-3-ethernet'
3610+ $nmcli -m multiline -f 802-3-ethernet.wake-on-lan c show $connection | grep '0 (none)'
3611+
3612+ # Now prepare for the next boot where we will run without a netplan
3613+ # config to get eth0 correctly configured.
3614+ rm /etc/netplan/00-snapd-config.yaml
3615+ REBOOT
3616+ ;;
3617+ 1)
3618+ # For correct timing if the device has just booted
3619+ wait_for_network_manager
3620+
3621+ # Precondition is a existing network connection
3622+ $nmcli d | grep 'eth0.*connected'
3623+
3624+ # Connection should have the default wake-on-lan setting
3625+ connection=$($nmcli -m multiline -f UUID c show | awk '{print$2;exit}')
3626+ $nmcli -m multiline -f connection.type c show $connection | grep '802-3-ethernet'
3627+ # wake-on-lan should be set to respect the global defaults here
3628+ $nmcli -m multiline -f 802-3-ethernet.wake-on-lan c show $connection | grep '1 (default)'
3629+
3630+ # We can sadly only verify that the value was correctly applied when
3631+ # we're running the tests on a real device. QEMU doesn't support setting
3632+ # the WoL value of the ethernet network device.
3633+ if [ ! cat /proc/cpuinfo | grep QEMU ] ; then
3634+ # Get the tools snap to have the ethtool tool available
3635+ snap install --devmode --edge se-test-tools
3636+ snap connect se-test-tools:network core
3637+ snap connect se-test-tools:network-bind core
3638+ snap connect se-test-tools:network-control core
3639+
3640+ # See `man ethtool` for details; 'g' means 'wakeup when magic packet comes in'
3641+ # and is the default behavior we want.
3642+ /snap/bin/se-test-tools.ethtool eth0 | grep 'Wake-up: g'
3643+ fi
3644+ ;;
3645+ esac
3646diff --git a/tests/image/create-image.sh b/tests/image/create-image.sh
3647index 0875b55..351715a 100755
3648--- a/tests/image/create-image.sh
3649+++ b/tests/image/create-image.sh
3650@@ -43,6 +43,10 @@ fi
3651 ubuntu-image \
3652 --channel $channel \
3653 -o $image_name \
3654+<<<<<<< tests/image/create-image.sh
3655+=======
3656+ --image-size 4G \
3657+>>>>>>> tests/image/create-image.sh
3658 $ubuntu_image_extra_args \
3659 $model.model
3660
3661diff --git a/tests/lib/prepare-all.sh b/tests/lib/prepare-all.sh
3662index 80be76f..6c184e1 100644
3663--- a/tests/lib/prepare-all.sh
3664+++ b/tests/lib/prepare-all.sh
3665@@ -6,14 +6,28 @@ if [ -n "$SNAP_CHANNEL" ] ; then
3666 exit 0
3667 fi
3668
3669+<<<<<<< tests/lib/prepare-all.sh
3670 # Setup classic snap and build the tpm2 snap in there
3671+=======
3672+# If there is a network-manager snap prebuilt for us, lets take
3673+# that one to speed things up.
3674+if [ -e /home/network-manager/network-manager_*_amd64.snap ] ; then
3675+ exit 0
3676+fi
3677+
3678+# Setup classic snap and build the network-manager snap in there
3679+>>>>>>> tests/lib/prepare-all.sh
3680 snap install --devmode --beta classic
3681 cat <<-EOF > /home/test/build-snap.sh
3682 #!/bin/sh
3683 set -ex
3684 apt update
3685 apt install -y --force-yes snapcraft
3686+<<<<<<< tests/lib/prepare-all.sh
3687 cd /home/tpm2
3688+=======
3689+cd /home/network-manager
3690+>>>>>>> tests/lib/prepare-all.sh
3691 snapcraft clean
3692 snapcraft
3693 EOF
3694@@ -22,4 +36,8 @@ sudo classic /home/test/build-snap.sh
3695 snap remove classic
3696
3697 # Make sure we have a snap build
3698+<<<<<<< tests/lib/prepare-all.sh
3699 test -e /home/tpm2/tpm2_*_amd64.snap
3700+=======
3701+test -e /home/network-manager/network-manager_*_amd64.snap
3702+>>>>>>> tests/lib/prepare-all.sh
3703diff --git a/tests/lib/prepare.sh b/tests/lib/prepare.sh
3704index 2fd3d79..8f62f06 100644
3705--- a/tests/lib/prepare.sh
3706+++ b/tests/lib/prepare.sh
3707@@ -21,6 +21,7 @@ done
3708 echo "Kernel has a store revision"
3709 snap list | grep ^${kernel_name} | grep -E " [0-9]+\s+canonical"
3710
3711+<<<<<<< tests/lib/prepare.sh
3712 # If we don't install tpm2 here we get a system
3713 # without any network connectivity after reboot.
3714 if [ -n "$SNAP_CHANNEL" ] ; then
3715@@ -37,6 +38,21 @@ else
3716 snap connect tpm2:tpm core:tpm
3717 snap connect tpm2:network core:network
3718 snap connect tpm2:network-bind core:network-bind
3719+=======
3720+# If we don't install network-manager here we get a system
3721+# without any network connectivity after reboot.
3722+if [ -n "$SNAP_CHANNEL" ] ; then
3723+ # Don't reinstall if we have it installed already
3724+ if ! snap list | grep network-manager ; then
3725+ snap install --$SNAP_CHANNEL network-manager
3726+ fi
3727+else
3728+ # Need first install from store to get all necessary assertions into
3729+ # place. Second local install will then bring in our locally built
3730+ # snap.
3731+ snap install network-manager
3732+ snap install --dangerous /home/network-manager/network-manager_*_amd64.snap
3733+>>>>>>> tests/lib/prepare.sh
3734 fi
3735
3736 # Snapshot of the current snapd state for a later restore
3737diff --git a/tests/lib/restore-each.sh b/tests/lib/restore-each.sh
3738index f15af2f..6db061d 100644
3739--- a/tests/lib/restore-each.sh
3740+++ b/tests/lib/restore-each.sh
3741@@ -14,9 +14,32 @@ for snap in /snap/*; do
3742 esac
3743 done
3744
3745+<<<<<<< tests/lib/restore-each.sh
3746+=======
3747+# Cleanup all configuration files from NetworkManager so that we have
3748+# a fresh start for the next test
3749+rm -rf /var/snap/network-manager/common/*
3750+rm -rf /var/snap/network-manager/current/*
3751+systemctl stop snap.network-manager.networkmanager
3752+
3753+# Drop any generated or modified netplan configuration files. The original
3754+# ones will be restored below.
3755+rm -f /etc/netplan/*
3756+
3757+>>>>>>> tests/lib/restore-each.sh
3758 # Ensure we have the same state for snapd as we had before
3759 systemctl stop snapd.service snapd.socket
3760 rm -rf /var/lib/snapd/*
3761 $(cd / && tar xzf $SPREAD_PATH/snapd-state.tar.gz)
3762 rm -rf /root/.snap
3763 systemctl start snapd.service snapd.socket
3764+<<<<<<< tests/lib/restore-each.sh
3765+=======
3766+
3767+# Make sure the original netplan configuration is applied and active
3768+netplan generate
3769+netplan apply
3770+
3771+# Bringup NetworkManager again now that the system is restored
3772+systemctl start snap.network-manager.networkmanager
3773+>>>>>>> tests/lib/restore-each.sh
3774diff --git a/tests/lib/utilities.sh b/tests/lib/utilities.sh
3775new file mode 100644
3776index 0000000..000ef74
3777--- /dev/null
3778+++ b/tests/lib/utilities.sh
3779@@ -0,0 +1,46 @@
3780+#!/bin/sh
3781+switch_netplan_to_network_manager() {
3782+ if [ -e /etc/netplan/00-default-nm-renderer.yaml ] ; then
3783+ return 0
3784+ fi
3785+
3786+ cat <<-EOF > /etc/netplan/00-default-nm-renderer.yaml
3787+network:
3788+ renderer: NetworkManager
3789+ EOF
3790+}
3791+
3792+switch_netplan_to_networkd() {
3793+ if [ ! -e /etc/netplan/00-default-nm-renderer.yaml ] ; then
3794+ return 0
3795+ fi
3796+
3797+ rm /etc/netplan/00-default-nm-renderer.yaml
3798+}
3799+
3800+wait_for_systemd_service() {
3801+ while ! systemctl status $1 ; do
3802+ sleep 1
3803+ done
3804+ sleep 1
3805+}
3806+
3807+wait_for_network_manager() {
3808+ wait_for_systemd_service snap.network-manager.networkmanager
3809+}
3810+
3811+stop_after_first_reboot() {
3812+ if [ $SPREAD_REBOOT -eq 1 ] ; then
3813+ exit 0
3814+ fi
3815+}
3816+
3817+mac_to_ipv6() {
3818+ mac=$1
3819+ ipv6_address=fe80::$(printf %02x $((0x${mac%%:*} ^ 2)))
3820+ mac=${mac#*:}
3821+ ipv6_address=$ipv6_address${mac%:*:*:*}ff:fe
3822+ mac=${mac#*:*:}
3823+ ipv6_address=$ipv6_address${mac%:*}${mac##*:}
3824+ echo $ipv6_address
3825+}
3826\ No newline at end of file
3827diff --git a/tests/main/ethernet-managed-by-networkd/task.yaml b/tests/main/ethernet-managed-by-networkd/task.yaml
3828new file mode 100644
3829index 0000000..80e75cb
3830--- /dev/null
3831+++ b/tests/main/ethernet-managed-by-networkd/task.yaml
3832@@ -0,0 +1,7 @@
3833+summary: When not specific configuration is in place networkd manages ethernet
3834+
3835+execute: |
3836+ . $TESTSLIB/utilities.sh
3837+ networkctl | grep 'eth0.*routable'
3838+ wait_for_network_manager
3839+ /snap/bin/network-manager.nmcli d | grep 'eth0.*unmanaged'
3840diff --git a/tests/main/installation/task.yaml b/tests/main/installation/task.yaml
3841index aaddf25..246369a 100644
3842--- a/tests/main/installation/task.yaml
3843+++ b/tests/main/installation/task.yaml
3844@@ -1,3 +1,4 @@
3845+<<<<<<< tests/main/installation/task.yaml
3846 summary: Test tpm2 snap installation was successful
3847
3848 execute: |
3849@@ -5,3 +6,20 @@ execute: |
3850 snap interfaces | grep -Pzq ":tpm +tpm2"
3851 snap interfaces | grep -Pzq ":network +tpm2"
3852 snap interfaces | grep -Pzq ":network-bind +tpm2"
3853+=======
3854+summary: Test network-manager snap installation was successful
3855+
3856+execute: |
3857+ . $TESTSLIB/utilities.sh
3858+
3859+ # Service should be up an running
3860+ wait_for_network_manager
3861+
3862+ # .. and nmcli should be able to reach NetworkManager
3863+ /snap/bin/network-manager.nmcli g
3864+
3865+ # Ensure all necessary plugs/slots are connected
3866+ snap interfaces | grep -Pzq ":network-setup-observe +network-manager"
3867+ snap interfaces | grep -Pzq ":ppp +network-manager"
3868+ snap interfaces | grep -Pzq "network-manager:service +network-manager:nmcli"
3869+>>>>>>> tests/main/installation/task.yaml
3870diff --git a/tests/main/set-hostname/task.yaml b/tests/main/set-hostname/task.yaml
3871new file mode 100644
3872index 0000000..ddcabd9
3873--- /dev/null
3874+++ b/tests/main/set-hostname/task.yaml
3875@@ -0,0 +1,13 @@
3876+summary: Verify we can modify the hostname of the system
3877+
3878+execute: |
3879+ # Print out current hostname for nm and hostnamed to have a reference
3880+ # for debugging later.
3881+ /snap/bin/network-manager.nmcli general hostname
3882+ hostnamectl
3883+
3884+ expected_hostname=foobar
3885+ /snap/bin/network-manager.nmcli general hostname $expected_hostname
3886+ test "`/snap/bin/network-manager.nmcli general hostname`" = "$expected_hostname"
3887+ test "`hostnamectl status | grep Static`" = " Static hostname: $expected_hostname"
3888+ test "`hostname`" = "$expected_hostname"
3889diff --git a/tests/main/static-ip-configuration/task.yaml b/tests/main/static-ip-configuration/task.yaml
3890new file mode 100644
3891index 0000000..00031fc
3892--- /dev/null
3893+++ b/tests/main/static-ip-configuration/task.yaml
3894@@ -0,0 +1,49 @@
3895+summary: Test static IP configuration
3896+
3897+restore: |
3898+ # Ensure that the created virtual network interfaces are removed
3899+ # in any case when we're done
3900+ if [ -e /sys/class/net/veth0 ] ; then
3901+ ip link delete veth0
3902+ fi
3903+
3904+execute: |
3905+ . $TESTSLIB/utilities.sh
3906+
3907+ ip link add dev veth0 type veth peer name veth1
3908+
3909+ wait_for_network_manager
3910+ # NetworkManager should ignore the other side of our pipe so
3911+ # that we can configure it statically.
3912+ /snap/bin/network-manager.nmcli d set veth1 managed no
3913+ ip addr add 10.0.1.1/24 dev veth1
3914+
3915+ connection=veth0-static
3916+ /snap/bin/network-manager.nmcli c add con-name $connection type ethernet ifname veth0 \
3917+ ip4 10.0.1.2/24
3918+ /snap/bin/network-manager.nmcli c up $connection
3919+ /snap/bin/network-manager.nmcli d | grep 'veth0.*connected'
3920+
3921+ # Address should be correctly applied now
3922+ expected_veth0_address="10.0.1.2/24"
3923+ /snap/bin/network-manager.nmcli -m multiline -f IP4.ADDRESS c show veth0-static | grep $expected_veth0_address
3924+ ip addr show dev veth0 | grep 'UP'
3925+ ip addr show dev veth0 | grep $expected_veth0_address
3926+
3927+ # Routing needs to be in place as well
3928+ expected_veth0_route="10.0.1.0/24 dev veth0 proto kernel scope link src 10.0.1.2 metric 100"
3929+ ip route | grep "$expected_veth0_route"
3930+
3931+ # Disable connection and ensure IP configuration is removed
3932+ /snap/bin/network-manager.nmcli c down $connection
3933+ ip addr show dev veth0 | grep -v $expected_veth0_address
3934+ ip route | grep -v "$expected_veth0_route"
3935+
3936+ # Enabling network connection again and removing it should remove
3937+ # the IP configuration too
3938+ /snap/bin/network-manager.nmcli c up $connection
3939+ ip addr show dev veth0 | grep $expected_veth0_address
3940+ ip route | grep "$expected_veth0_route"
3941+ /snap/bin/network-manager.nmcli c delete $connection
3942+ ip addr show dev veth0 | grep -v $expected_veth0_address
3943+ ip route | grep -v "$expected_veth0_route"
3944\ No newline at end of file
3945diff --git a/tests/main/switch-netplan-renderer/task.yaml b/tests/main/switch-netplan-renderer/task.yaml
3946new file mode 100644
3947index 0000000..4453b6a
3948--- /dev/null
3949+++ b/tests/main/switch-netplan-renderer/task.yaml
3950@@ -0,0 +1,40 @@
3951+summary: Dynamically switch the netplan renderer
3952+
3953+execute: |
3954+ . $TESTSLIB/utilities.sh
3955+ case "$SPREAD_REBOOT" in
3956+ 0)
3957+ wait_for_network_manager
3958+
3959+ # networkd manages eth0 and NetworkManager does not
3960+ networkctl | grep 'eth0.*routable'
3961+ /snap/bin/network-manager.nmcli d | grep 'eth0.*unmanaged'
3962+
3963+ # Now we switch back to the NetworkManager backend for netplan
3964+ switch_netplan_to_network_manager
3965+ REBOOT
3966+ ;;
3967+ 1)
3968+ test -e /etc/netplan/00-default-nm-renderer.yaml
3969+
3970+ # Give NetworkManager a bit to come up after the reboot
3971+ wait_for_network_manager
3972+
3973+ # NetworkManager now controls eth0 and networkd does not
3974+ /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
3975+ networkctl status eth0 | grep 'State: n/a'
3976+
3977+ # And switch back to networkd
3978+ switch_netplan_to_networkd
3979+ REBOOT
3980+ ;;
3981+ 2)
3982+ wait_for_network_manager
3983+
3984+ # networkd manages eth0 and NetworkManager does not
3985+ networkctl | grep 'eth0.*routable'
3986+ /snap/bin/network-manager.nmcli d | grep 'eth0.*unmanaged'
3987+ ;;
3988+ *)
3989+ ;;
3990+ esac
3991diff --git a/tests/main/wifi-connect-secured-ap/task.yaml b/tests/main/wifi-connect-secured-ap/task.yaml
3992new file mode 100644
3993index 0000000..ed56a9b
3994--- /dev/null
3995+++ b/tests/main/wifi-connect-secured-ap/task.yaml
3996@@ -0,0 +1,31 @@
3997+summary: Test connection to a secured WiFi AP
3998+
3999+environment:
4000+ WIFI_SSID: Ubuntu
4001+ WIFI_PASSPHRASE: Test1234
4002+
4003+execute: |
4004+ snap install wifi-ap
4005+
4006+ # Get two connected wifi network interfaces wlan0 and wlan1
4007+ modprobe mac80211_hwsim radios=2
4008+
4009+ # Setup the AP on wlan1
4010+ /snap/bin/wifi-ap.config set wifi.interface wlan1
4011+ /snap/bin/wifi-ap.config set wifi.ssid $WIFI_SSID
4012+ /snap/bin/wifi-ap.config set wifi.security wpa2
4013+ /snap/bin/wifi-ap.config set wifi.security-passphrase $WIFI_PASSPHRASE
4014+ /snap/bin/wifi-ap.config set disabled 0
4015+ systemctl restart snap.wifi-ap.backend
4016+ # AP needs a bit to appear and be visible for NetworkManager
4017+ /snap/bin/network-manager.nmcli d wifi rescan
4018+ while ! /snap/bin/network-manager.nmcli d wifi | grep Ubuntu ; do
4019+ /snap/bin/network-manager.nmcli d wifi rescan
4020+ sleep 1
4021+ done
4022+
4023+ /snap/bin/network-manager.nmcli d wifi | grep $WIFI_SSID
4024+
4025+ # Connect to the AP and ensure the connection was established
4026+ /snap/bin/network-manager.nmcli d wifi connect $WIFI_SSID password $WIFI_PASSPHRASE
4027+ /snap/bin/network-manager.nmcli d | grep 'wlan0.*connected'

Subscribers

People subscribed via source and target branches

to all changes: