Merge lp:~lmic/maas/maas19+fix-power-query-sm15k into lp:maas/trunk

Proposed by Larry Michel
Status: Superseded
Proposed branch: lp:~lmic/maas/maas19+fix-power-query-sm15k
Merge into: lp:maas/trunk
Diff against target: 3635 lines (+2087/-270) (has conflicts)
42 files modified
Makefile (+2/-2)
contrib/maas-http.conf (+1/-1)
docs/changelog.rst (+334/-58)
src/maasserver/api/interfaces.py (+74/-0)
src/maasserver/api/tests/test_devices.py (+135/-0)
src/maasserver/api/tests/test_interfaces.py (+191/-0)
src/maasserver/api/tests/test_vlans.py (+7/-0)
src/maasserver/api/tests/test_volume_groups.py (+7/-0)
src/maasserver/forms_subnet.py (+7/-0)
src/maasserver/models/__init__.py (+23/-0)
src/maasserver/models/interface.py (+54/-22)
src/maasserver/models/staticipaddress.py (+5/-0)
src/maasserver/models/tests/test_filesystemgroup.py (+34/-0)
src/maasserver/models/tests/test_interface.py (+384/-115)
src/maasserver/models/tests/test_node.py (+69/-33)
src/maasserver/models/tests/test_partition.py (+4/-0)
src/maasserver/models/tests/test_partitiontable.py (+21/-0)
src/maasserver/models/tests/test_staticipaddress.py (+23/-0)
src/maasserver/models/tests/test_virtualblockdevice.py (+34/-0)
src/maasserver/static/css/maas-styles.css (+4/-0)
src/maasserver/testing/factory.py (+8/-0)
src/maasserver/tests/test_auth.py (+31/-0)
src/maasserver/tests/test_node_constraint_filter_forms.py (+61/-0)
src/maasserver/tests/test_storage_layouts.py (+80/-0)
src/maasserver/utils/converters.py (+5/-0)
src/maasserver/utils/orm.py (+25/-0)
src/maasserver/utils/tests/test_converters.py (+43/-20)
src/maasserver/websockets/handlers/tests/test_node.py (+60/-17)
src/metadataserver/models/commissioningscript.py (+4/-0)
src/provisioningserver/config.py (+85/-0)
src/provisioningserver/drivers/power/amt.py (+11/-0)
src/provisioningserver/drivers/power/dli.py (+11/-0)
src/provisioningserver/drivers/power/ipmi.py (+32/-1)
src/provisioningserver/drivers/power/seamicro.py (+6/-1)
src/provisioningserver/drivers/power/tests/test_amt.py (+17/-0)
src/provisioningserver/drivers/power/tests/test_ipmi.py (+9/-0)
src/provisioningserver/rpc/dhcp.py (+4/-0)
src/provisioningserver/rpc/tests/test_dhcp.py (+7/-0)
src/provisioningserver/testing/config.py (+5/-0)
src/provisioningserver/tests/test_cluster_config_command.py (+10/-0)
src/provisioningserver/tests/test_config.py (+87/-0)
utilities/remote-reinstall (+73/-0)
Text conflict in docs/changelog.rst
Text conflict in src/maasserver/api/interfaces.py
Text conflict in src/maasserver/api/tests/test_devices.py
Text conflict in src/maasserver/api/tests/test_interfaces.py
Text conflict in src/maasserver/api/tests/test_vlans.py
Text conflict in src/maasserver/api/tests/test_volume_groups.py
Text conflict in src/maasserver/forms_subnet.py
Text conflict in src/maasserver/models/__init__.py
Text conflict in src/maasserver/models/interface.py
Text conflict in src/maasserver/models/staticipaddress.py
Text conflict in src/maasserver/models/tests/test_filesystemgroup.py
Text conflict in src/maasserver/models/tests/test_interface.py
Text conflict in src/maasserver/models/tests/test_node.py
Text conflict in src/maasserver/models/tests/test_partition.py
Text conflict in src/maasserver/models/tests/test_partitiontable.py
Text conflict in src/maasserver/models/tests/test_virtualblockdevice.py
Text conflict in src/maasserver/static/css/maas-styles.css
Text conflict in src/maasserver/testing/factory.py
Text conflict in src/maasserver/tests/test_auth.py
Text conflict in src/maasserver/tests/test_node_constraint_filter_forms.py
Text conflict in src/maasserver/tests/test_storage_layouts.py
Text conflict in src/maasserver/utils/converters.py
Text conflict in src/maasserver/utils/orm.py
Text conflict in src/maasserver/utils/tests/test_converters.py
Text conflict in src/maasserver/websockets/handlers/tests/test_node.py
Text conflict in src/provisioningserver/config.py
Text conflict in src/provisioningserver/drivers/power/amt.py
Text conflict in src/provisioningserver/drivers/power/dli.py
Text conflict in src/provisioningserver/drivers/power/ipmi.py
Text conflict in src/provisioningserver/drivers/power/seamicro.py
Text conflict in src/provisioningserver/drivers/power/tests/test_amt.py
Text conflict in src/provisioningserver/drivers/power/tests/test_ipmi.py
Text conflict in src/provisioningserver/rpc/dhcp.py
Text conflict in src/provisioningserver/rpc/tests/test_dhcp.py
Text conflict in src/provisioningserver/testing/config.py
Text conflict in src/provisioningserver/tests/test_cluster_config_command.py
Text conflict in src/provisioningserver/tests/test_config.py
Text conflict in utilities/remote-reinstall
To merge this branch: bzr merge lp:~lmic/maas/maas19+fix-power-query-sm15k
Reviewer Review Type Date Requested Status
MAAS Maintainers Pending
Review via email: mp+282110@code.launchpad.net

This proposal has been superseded by a proposal from 2016-01-10.

Description of the change

Pass id from context (which is system id from power parameters) into seamicroclient call when querying power.

To post a comment you must log in.

Unmerged revisions

4536. By Larry Michel <email address hidden>

fix power query for sm15k systems

4535. By Billy Olsen

[r=mpontillo][bug=1484696][author=billy-olsen] Fix bug in apache2 where it will reuse websocket connections.

4534. By Andres Rodriguez

[r=andreserl,blake-rouse,rbanffy][bug=][author=andreserl] 1.9.0 Release Notes

4533. By Andres Rodriguez

[r=andreserl][bug=][author=andreserl] 1.9.0 RC4 Changelog

4532. By Blake Rouse

[r=andreserl][bug=][author=blake-rouse] Set the default storage layout to flat. On upgrade create the flat storage layout instead of the lvm layout.

4531. By Gavin Panella

[r=allenap][bug=1524007][author=allenap] Backport of r4551 from lp:maas: By default, open configuration files read-only.

This eliminates the need for locking when using the YAML-based back-end.

4530. By Mike Pontillo

[r=andreserl][bug=1524924][author=mpontillo] Fix commissioning to correctly identify secondary subnets, VLANs, and Fabrics.

4529. By Mike Rushton

[r=blake-rouse][bug=1523674][author=leftyfb] Fix for bug 1523674, virsh is reporting ppc64le, not ppc64el.

4528. By Mike Pontillo

[r=allenap][bug=1524091][author=mpontillo] Don't require DHCP to be on if it should be off.

4527. By Newell Jensen

[r=blake-rouse][bug=][author=newell-jensen] Backport of r4542: HMC uses pure-python paramiko ssh client to login to HMC and then executes commands from there. No required packages needed on the cluster controller.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'Makefile'
2--- Makefile 2016-01-06 14:43:50 +0000
3+++ Makefile 2016-01-10 08:29:39 +0000
4@@ -496,8 +496,8 @@
5 # this.
6
7 # Old names.
8-PACKAGING := $(abspath ../packaging.trunk)
9-PACKAGING_BRANCH := lp:~maas-maintainers/maas/packaging
10+PACKAGING := $(abspath ../packaging-1.9)
11+PACKAGING_BRANCH := lp:~maas-maintainers/maas/packaging-1.9
12
13 packaging-tree = $(PACKAGING)
14 packaging-branch = $(PACKAGING_BRANCH)
15
16=== modified file 'contrib/maas-http.conf'
17--- contrib/maas-http.conf 2015-06-26 13:07:33 +0000
18+++ contrib/maas-http.conf 2016-01-10 08:29:39 +0000
19@@ -26,7 +26,7 @@
20
21 <IfModule proxy_module>
22 ProxyPreserveHost on
23- ProxyPass /MAAS/ws "ws://localhost:5240/MAAS/ws"
24+ ProxyPass /MAAS/ws "ws://localhost:5240/MAAS/ws" disablereuse=on
25 ProxyPass /MAAS/static/ !
26 ProxyPass /MAAS/ http://localhost:5240/MAAS/
27 ProxyPass /MAAS http://localhost:5240/MAAS/
28
29=== modified file 'docs/changelog.rst'
30--- docs/changelog.rst 2015-12-07 16:37:36 +0000
31+++ docs/changelog.rst 2016-01-10 08:29:39 +0000
32@@ -3,64 +3,340 @@
33 =========
34
35
36-1.9.0 (RC3)
37-=============
38-
39-Major bugs fixed in this release
40---------------------------------
41-
42-LP: #1522898 "node-interface" API should just be "interface" - to allow devices to use it
43-
44-LP: #1519527 Juju 1.25.1 proposed: lxc units all have the same IP address after upgrade from 1.7/1.8.
45-
46-LP: #1522294 MAAS fails to parse some DHCP leases.
47-
48-LP: #1519090 DHCP interface automatically obtains an IP even when the subnet is unmanaged.
49-
50-LP: #1519077 MAAS assigns IP addresses on unmanaged subnets without consideration for some addresses known to be in use.
51-
52-LP: #1519396 MTU field is not exposed over the API for VLAN.
53-
54-LP: #1521833 Updating subnet name removes dns_server.
55-
56-LP: #1519919 CC looks for NICs with kernel module loaded and fall back doesn't check persistent device names.
57-
58-LP: #1522225 Migration 0181 can fail on upgrade if disks across nodes have duplicate serial numbers.
59-
60-LP: #1519247 Migration 0146 can fail on upgrade when migrating unmanaged subnets.
61-
62-LP: #1519397 [UI] Once a cache_set is created the UI fails with ERROR.
63-
64-LP: #1519918 [UI] "failed to detect a valid IP address" when trying to view node details.
65-
66-
67-1.9.0 (RC2)
68-=============
69-
70-Major bugs fixed in this release
71---------------------------------
72-
73-LP: #1513085 Partitioning should align for performance.
74-
75-LP: #1516815 MAAS creates DNS record against Alias (eth0:1) if alias belongs to the PXE Interface.
76-
77-LP: #1515769 Failed to power on SM15k.
78-
79-LP: #1516722 Fix migration that might affect upgrade from 1.7.
80-
81-LP: #1516065 Failed to power control IPMI BMC that does not support setting the boot order.
82-
83-LP: #1517097 Constraints for acquiring interfaces argument should 'AND' key-value pairs for the same label.
84-
85-LP: #1517687 [UI] Cannot create a partition using the whole disk.
86-
87-LP: #1513258 [UI] CSS Broken for Bond Network Device.
88-
89-LP: #1516173 [UI] Prevent being able to unmount/remove filesystems while node is on.
90-
91-LP: #1510457 [UI] No error message if there is no boot and/or root disk configured for a node.
92-
93-
94+<<<<<<< TREE
95+1.9.0 (RC3)
96+=============
97+
98+Major bugs fixed in this release
99+--------------------------------
100+
101+LP: #1522898 "node-interface" API should just be "interface" - to allow devices to use it
102+
103+LP: #1519527 Juju 1.25.1 proposed: lxc units all have the same IP address after upgrade from 1.7/1.8.
104+
105+LP: #1522294 MAAS fails to parse some DHCP leases.
106+
107+LP: #1519090 DHCP interface automatically obtains an IP even when the subnet is unmanaged.
108+
109+LP: #1519077 MAAS assigns IP addresses on unmanaged subnets without consideration for some addresses known to be in use.
110+
111+LP: #1519396 MTU field is not exposed over the API for VLAN.
112+
113+LP: #1521833 Updating subnet name removes dns_server.
114+
115+LP: #1519919 CC looks for NICs with kernel module loaded and fall back doesn't check persistent device names.
116+
117+LP: #1522225 Migration 0181 can fail on upgrade if disks across nodes have duplicate serial numbers.
118+
119+LP: #1519247 Migration 0146 can fail on upgrade when migrating unmanaged subnets.
120+
121+LP: #1519397 [UI] Once a cache_set is created the UI fails with ERROR.
122+
123+LP: #1519918 [UI] "failed to detect a valid IP address" when trying to view node details.
124+
125+
126+1.9.0 (RC2)
127+=============
128+
129+Major bugs fixed in this release
130+--------------------------------
131+
132+LP: #1513085 Partitioning should align for performance.
133+
134+LP: #1516815 MAAS creates DNS record against Alias (eth0:1) if alias belongs to the PXE Interface.
135+
136+LP: #1515769 Failed to power on SM15k.
137+
138+LP: #1516722 Fix migration that might affect upgrade from 1.7.
139+
140+LP: #1516065 Failed to power control IPMI BMC that does not support setting the boot order.
141+
142+LP: #1517097 Constraints for acquiring interfaces argument should 'AND' key-value pairs for the same label.
143+
144+LP: #1517687 [UI] Cannot create a partition using the whole disk.
145+
146+LP: #1513258 [UI] CSS Broken for Bond Network Device.
147+
148+LP: #1516173 [UI] Prevent being able to unmount/remove filesystems while node is on.
149+
150+LP: #1510457 [UI] No error message if there is no boot and/or root disk configured for a node.
151+
152+
153+=======
154+1.9.0
155+=====
156+
157+Important announcements
158+-----------------------
159+
160+**New Networking Concepts and API's: Fabrics, Spaces and Subnets**
161+ With the introduction of new MAAS networking concepts, new API's are also
162+ been introduced. These are:
163+
164+ * fabrics
165+ * spaces
166+ * subnets
167+ * vlans
168+ * fan-networks
169+
170+ MAAS 1.9.0 will continue to provide backwards compatibility with the old
171+ network API for reading purposes, but moving forward, users are required to
172+ use the new API to manipulate fabrics, spaces and subnets.
173+
174+**Advanced Network and Storage Configuration only available for Ubuntu deployments**
175+ Users can now perform advanced network and storage configurations for nodes
176+ before deployment. The advanced configuration is only available for Ubuntu
177+ deployments. All other deployments using third party OS', including CentOS,
178+ RHEL, Windows and Custom Images, won't result in such configuration.
179+
180+**Re-commissioning required for upgraded MAAS**
181+ Now that storage partitioning and advanced configuration is supported natively,
182+ VM nodes in MAAS need to be re-commissioned.
183+
184+ * If upgrading from MAAS 1.8, only VM nodes with VirtIO storage devices need
185+ to be re-commissioned.
186+
187+ * If upgrading from MAAS 1.7, all nodes will need to be re-commissioned in
188+ order for MAAS to correctly capture the storage and networking devices.
189+
190+ This does not affect nodes that are currently deployed.
191+
192+**Default Storage Partitioning Layout - Flat**
193+ With the introduction of custom storage, MAAS has also introduced the concept
194+ of partitioning layouts. Partitioning layouts allow the user to quickly
195+ auto-configure the disk partitioning scheme after first commissioning or
196+ re-commissioning (if selected to do so). The partitioning layouts are set
197+ globally on the `Settings` page.
198+
199+ The current default Partitioning layout is 'Flat', maintaining backwards
200+ compatibility with previous MAAS releases. This means MAAS will take the
201+ first disk it finds in the system and use it as the root and boot disk.
202+
203+**Deployment with configured /etc/network/interfaces**
204+ Starting with MAAS 1.9, all node deployments will result in writing
205+ `/etc/network/interfaces` statically, by default. This increases MAAS'
206+ robustness and reliability as users no longer have to depend on DHCP for
207+ IP address allocation solely.
208+
209+ MAAS will continue to provide IP addresses via DHCP, even though interfaces
210+ in `/etc/network/interfaces` may have been configured statically.
211+
212+Major new features
213+------------------
214+
215+**Storage Partitioning and Advanced Configuration**
216+ MAAS now supports Storage Partitioning and Advanced Configuration natively.
217+ This allows MAAS to deploy machines with different Storage Layouts, as
218+ well as different complex partitioning configurations. Storage support
219+ includes:
220+
221+ * LVM
222+ * Bcache
223+ * Software RAID levels 0, 1, 5, 6, 10.
224+ * Advanced partitioning
225+
226+ Storace configuration is available both via the WebUI and API. For more
227+ information refer to :ref:`storage`.
228+
229+**Advanced Networking (Fabrics, Spaces, Subnetworks) and Node Network Configuration**
230+ MAAS now supports Advanced Network configuration, allowing users to not
231+ only perform advanced node network configuration, but also allowing users
232+ to declare and map their infrastructure in the form of Fabrics, VLANs,
233+ Spaces and Subnets.
234+
235+ **Fabrics, Spaces, Subnets and Fan networks**
236+ MAAS now supports the concept of Fabrics, Spaces, Subnets and FANS,
237+ which introduce a whole new way of declaring and mapping your network
238+ and infrastructure in MAAS.
239+
240+ The MAAS WebUI allows users to view all the declared Fabrics, Spaces,
241+ VLANs inside fabrics and Subnets inside Spaces. The WebUI does not yet
242+ support the ability to create new of these, but the API does.
243+
244+ These new concepts replace the old `Network` concepts from MAAS'
245+ earlier versions. For more information, see :ref:`networking`.
246+
247+ For more information about the API, see :ref:`api`.
248+
249+ **Advanced Node Networking Configuration**
250+ MAAS can now perform the Node's networking configuration. Doing so,
251+ results in `/etc/network/interfaces` being written. Advanced
252+ configuration includes:
253+
254+ * Assign subnets, fabrics, and IP to interfaces.
255+ * Create VLAN interfaces.
256+ * Create bond interfaces.
257+ * Change interface names.
258+
259+ MAAS also allows configuration of node interfaces in different modes:
260+
261+ * Auto Assign - Node interface will be configured statically
262+ and MAAS will auto assign an IP address.
263+ * DHCP - The node interface will be configured to DHCP.
264+ * Static - The user will be able to specify what IP address the
265+ interface will obtain, while MAAS will configure it statically.
266+ * Unconfigured - MAAS will leave the interface with LINK UP.
267+
268+**Curtin & cloud-init status updates**
269+ Starting from MAAS 1.9.0, curtin and cloud-init will now send messages
270+ to MAAS providing information regarding various of the actions being
271+ taken. This information will be displayed in MAAS in the `Node Event Log`.
272+
273+ Note that this information is only available when using MAAS 1.9.0 and
274+ the latest version fo curtin. For cloud-init messages this information
275+ is only available when deploying Wily+.
276+
277+**Fabric and subnet creation**
278+ MAAS now auto-creates multiple fabrics per physical interface connected
279+ to the Cluster Controller, and will correctly create subnetworks under
280+ each fabric, as well as VLAN's, if any of the Cluster Controller
281+ interface is a VLAN interface.
282+
283+**HWE Kernels**
284+ MAAS now has a different approach to deploying Hardware Enablement
285+ Kernels. Start from MAAS 1.9, the HWE kernels are no longer coupled
286+ to subarchitectures of a machine. For each Ubuntu release, users
287+ will be able to select any of the available HWE kernels for such
288+ release, as well as set the minimum kernel the machine will be
289+ deployed with by default.
290+
291+ For more information, see :ref:`hardware-enablement-kernels`.
292+
293+**CentOS images can be imported automatically**
294+ CentOS Image (CentOS 6 and 7) can now be imported automatically from the
295+ MAAS Images page. These images are currently part of the daily streams.
296+
297+ In order to test this images, you need to use the daily image stream.
298+ This can be changed in the `Settings` page under `Boot Images` to
299+ `http://maas.ubuntu.com/images/ephemeral-v2/daily/`. Once changed, images
300+ can be imported from the MAAS Images page. The CentOS image will be
301+ published in the Releases stream shortly.
302+
303+
304+Minor notable changes
305+---------------------
306+
307+**Minimal Config Files for Daemons**
308+ Starting from MAAS 1.9, minimal configuration files have been introduced
309+ for both, the MAAS Region Controller and the MAAS Cluster Controller daemons.
310+
311+ * The Region Controller (`maas-regiond`) has now dropped the usage of
312+ `/etc/maas/maas_local_settings.py` in favor of `/etc/maas/regiond.conf`.
313+ Available configuration options are now `database_host`, `database_name`,
314+ `database_user`, `database_pass`, `maas_url`. MAAS will attempt to migrate
315+ any configuration on upgrade, otherwise it will use sane defaults.
316+
317+ * The Cluster Controller (`maas-clusterd`) has now dropped the usage of
318+ `/etc/maas/pserv.yaml` and `/etc/maas/maas_cluster.conf` in favor of
319+ `/etc/maas/clusterd.conf`. Available configuration options are now `maas_url`
320+ and `cluster_uuid` only. MAAS will attempt to migrate any configuration
321+ on upgrade, otherwise it will use sane defaults.
322+
323+**Commissioning Actions**
324+ MAAS now supports commissioning actions. These allow the user to specify
325+ how commissioning should behave in certain escenarios. The commissioning
326+ actions available are:
327+
328+ * Enable SSH during commissioning & Keep machine ON after commissioning
329+ * Keep network configuration after commissioning
330+ * Keep storage configuration after commissioning
331+
332+**Warn users about missing power control tools**
333+ MAAS now warns users about the missing power control tools. Each MAAS
334+ power driver use a set of power tools that may or may not be installed
335+ by default. If these power tools are missing from the system, MAAS will
336+ warn users.
337+
338+**Python Power Drivers**
339+ Starting from MAAS 1.9, MAAS is moving away from using shell scripts
340+ templates for Power Drivers. These are being migrated to MAAS'
341+ internal control as power drivers. Currently supported are APC, MSCM,
342+ MSFT OCS, SM15k, UCSM, Virsh, VMWare and IPMI.
343+
344+ Remaining Power Drivers include AMT, Fence CDU's, Moonshot.
345+
346+Major bugs fixed in this release
347+--------------------------------
348+
349+See https://launchpad.net/maas/+milestone/1.9.0 for details.
350+
351+
352+1.9.0 (RC4)
353+============
354+
355+Major bugs fixed in this release
356+--------------------------------
357+
358+LP: #1523674 Virsh is reporting ppc64le, not ppc64el.
359+
360+LP: #1524091 Don't require DHCP to be on if it should be off.
361+
362+LP: #1523988 No required packages for HMC as it uses pure python paramiko ssh client.
363+
364+LP: #1524007 Don't hold the cluster configuration lock while reloading boot images.
365+
366+LP: #1524924 Fix commissioning to correctly identify secondary subnets, VLAN's and fabrics.
367+
368+
369+1.9.0 (RC3)
370+=============
371+
372+Major bugs fixed in this release
373+--------------------------------
374+
375+LP: #1522898 "node-interface" API should just be "interface" - to allow devices to use it
376+
377+LP: #1519527 Juju 1.25.1 proposed: lxc units all have the same IP address after upgrade from 1.7/1.8.
378+
379+LP: #1522294 MAAS fails to parse some DHCP leases.
380+
381+LP: #1519090 DHCP interface automatically obtains an IP even when the subnet is unmanaged.
382+
383+LP: #1519077 MAAS assigns IP addresses on unmanaged subnets without consideration for some addresses known to be in use.
384+
385+LP: #1519396 MTU field is not exposed over the API for VLAN.
386+
387+LP: #1521833 Updating subnet name removes dns_server.
388+
389+LP: #1519919 CC looks for NICs with kernel module loaded and fall back doesn't check persistent device names.
390+
391+LP: #1522225 Migration 0181 can fail on upgrade if disks across nodes have duplicate serial numbers.
392+
393+LP: #1519247 Migration 0146 can fail on upgrade when migrating unmanaged subnets.
394+
395+LP: #1519397 [UI] Once a cache_set is created the UI fails with ERROR.
396+
397+LP: #1519918 [UI] "failed to detect a valid IP address" when trying to view node details.
398+
399+
400+1.9.0 (RC2)
401+=============
402+
403+Major bugs fixed in this release
404+--------------------------------
405+
406+LP: #1513085 Partitioning should align for performance.
407+
408+LP: #1516815 MAAS creates DNS record against Alias (eth0:1) if alias belongs to the PXE Interface.
409+
410+LP: #1515769 Failed to power on SM15k.
411+
412+LP: #1516722 Fix migration that might affect upgrade from 1.7.
413+
414+LP: #1516065 Failed to power control IPMI BMC that does not support setting the boot order.
415+
416+LP: #1517097 Constraints for acquiring interfaces argument should 'AND' key-value pairs for the same label.
417+
418+LP: #1517687 [UI] Cannot create a partition using the whole disk.
419+
420+LP: #1513258 [UI] CSS Broken for Bond Network Device.
421+
422+LP: #1516173 [UI] Prevent being able to unmount/remove filesystems while node is on.
423+
424+LP: #1510457 [UI] No error message if there is no boot and/or root disk configured for a node.
425+
426+
427+>>>>>>> MERGE-SOURCE
428 1.9.0 (RC1)
429 =============
430
431
432=== modified file 'src/maasserver/api/devices.py'
433=== modified file 'src/maasserver/api/interfaces.py'
434--- src/maasserver/api/interfaces.py 2015-12-16 00:01:56 +0000
435+++ src/maasserver/api/interfaces.py 2016-01-10 08:29:39 +0000
436@@ -83,8 +83,12 @@
437 return ('interfaces_handler', ["system_id"])
438
439 def read(self, request, system_id):
440+<<<<<<< TREE
441 """List all interfaces belonging to a machine, device, or
442 rack controller.
443+=======
444+ """List all interfaces belonging to a node or device.
445+>>>>>>> MERGE-SOURCE
446
447 Returns 404 if the node is not found.
448 """
449@@ -94,8 +98,12 @@
450
451 @operation(idempotent=False)
452 def create_physical(self, request, system_id):
453+<<<<<<< TREE
454 """Create a physical interface on a machine, device, or
455 rack controller.
456+=======
457+ """Create a physical interface on a node or device.
458+>>>>>>> MERGE-SOURCE
459
460 :param name: Name of the interface.
461 :param mac_address: MAC address of the interface.
462@@ -110,12 +118,21 @@
463
464 Returns 404 if the node is not found.
465 """
466+<<<<<<< TREE
467 node = Node.objects.get_node_or_404(
468 system_id, request.user, NODE_PERMISSION.EDIT)
469 # Machine type nodes require the node needs to be in the correct state.
470 if node.node_type == NODE_TYPE.MACHINE:
471 raise_error_for_invalid_state_on_allocated_operations(
472 node, request.user, "create")
473+=======
474+ node = Node.objects.get_node_or_404(
475+ system_id, request.user, NODE_PERMISSION.EDIT)
476+ # Installable nodes require the node needs to be in the correct state.
477+ if node.installable:
478+ raise_error_for_invalid_state_on_allocated_operations(
479+ node, request.user, "create")
480+>>>>>>> MERGE-SOURCE
481 form = PhysicalInterfaceForm(node=node, data=request.data)
482 if form.is_valid():
483 return form.save()
484@@ -376,12 +393,21 @@
485 Returns 404 if the node or interface is not found.
486 """
487 interface = Interface.objects.get_interface_or_404(
488+<<<<<<< TREE
489 system_id, interface_id, request.user, NODE_PERMISSION.EDIT)
490 if interface.get_node().node_type == NODE_TYPE.MACHINE:
491 # This node needs to be in the correct state to modify
492 # the interface.
493 raise_error_for_invalid_state_on_allocated_operations(
494 interface.node, request.user, "update interface")
495+=======
496+ system_id, interface_id, request.user, NODE_PERMISSION.EDIT)
497+ if interface.get_node().installable:
498+ # This node needs to be in the correct state to modify
499+ # the interface.
500+ raise_error_for_invalid_state_on_allocated_operations(
501+ interface.node, request.user, "update interface")
502+>>>>>>> MERGE-SOURCE
503 interface_form = InterfaceForm.get_interface_form(interface.type)
504 # For VLAN interface we cast parents to parent. As a VLAN can only
505 # have one parent.
506@@ -406,12 +432,21 @@
507 Returns 404 if the node or interface is not found.
508 """
509 interface = Interface.objects.get_interface_or_404(
510+<<<<<<< TREE
511 system_id, interface_id, request.user, NODE_PERMISSION.EDIT)
512 if interface.get_node().node_type == NODE_TYPE.MACHINE:
513 # This node needs to be in the correct state to modify
514 # the interface.
515 raise_error_for_invalid_state_on_allocated_operations(
516 interface.node, request.user, "delete interface")
517+=======
518+ system_id, interface_id, request.user, NODE_PERMISSION.EDIT)
519+ if interface.get_node().installable:
520+ # This node needs to be in the correct state to modify
521+ # the interface.
522+ raise_error_for_invalid_state_on_allocated_operations(
523+ interface.node, request.user, "delete interface")
524+>>>>>>> MERGE-SOURCE
525 interface.delete()
526 return rc.DELETED
527
528@@ -447,6 +482,7 @@
529 Returns 404 if the node or interface is not found.
530 """
531 interface = Interface.objects.get_interface_or_404(
532+<<<<<<< TREE
533 system_id, interface_id, request.user, NODE_PERMISSION.EDIT)
534 node = interface.get_node()
535 if node.node_type == NODE_TYPE.MACHINE:
536@@ -465,6 +501,26 @@
537 allowed_modes = [INTERFACE_LINK_TYPE.STATIC]
538 form = InterfaceLinkForm(
539 instance=interface, data=request.data, allowed_modes=allowed_modes)
540+=======
541+ system_id, interface_id, request.user, NODE_PERMISSION.EDIT)
542+ node = interface.get_node()
543+ if node.installable:
544+ # This node needs to be in the correct state to modify
545+ # the interface.
546+ raise_error_for_invalid_state_on_allocated_operations(
547+ interface.node, request.user, "link subnet")
548+ allowed_modes = [
549+ INTERFACE_LINK_TYPE.AUTO,
550+ INTERFACE_LINK_TYPE.DHCP,
551+ INTERFACE_LINK_TYPE.STATIC,
552+ INTERFACE_LINK_TYPE.LINK_UP,
553+ ]
554+ else:
555+ # Devices can only be set in static IP mode.
556+ allowed_modes = [INTERFACE_LINK_TYPE.STATIC]
557+ form = InterfaceLinkForm(
558+ instance=interface, data=request.data, allowed_modes=allowed_modes)
559+>>>>>>> MERGE-SOURCE
560 if form.is_valid():
561 return form.save()
562 else:
563@@ -479,12 +535,21 @@
564 Returns 404 if the node or interface is not found.
565 """
566 interface = Interface.objects.get_interface_or_404(
567+<<<<<<< TREE
568 system_id, interface_id, request.user, NODE_PERMISSION.EDIT)
569 if interface.get_node().node_type == NODE_TYPE.MACHINE:
570 # This node needs to be in the correct state to modify
571 # the interface.
572 raise_error_for_invalid_state_on_allocated_operations(
573 interface.node, request.user, "unlink subnet")
574+=======
575+ system_id, interface_id, request.user, NODE_PERMISSION.EDIT)
576+ if interface.get_node().installable:
577+ # This node needs to be in the correct state to modify
578+ # the interface.
579+ raise_error_for_invalid_state_on_allocated_operations(
580+ interface.node, request.user, "unlink subnet")
581+>>>>>>> MERGE-SOURCE
582 form = InterfaceUnlinkForm(instance=interface, data=request.data)
583 if form.is_valid():
584 return form.save()
585@@ -506,12 +571,21 @@
586 Returns 404 if the node or interface is not found.
587 """
588 interface = Interface.objects.get_interface_or_404(
589+<<<<<<< TREE
590 system_id, interface_id, request.user, NODE_PERMISSION.EDIT)
591 if interface.get_node().node_type == NODE_TYPE.MACHINE:
592 # This node needs to be in the correct state to modify
593 # the interface.
594 raise_error_for_invalid_state_on_allocated_operations(
595 interface.node, request.user, "set default gateway")
596+=======
597+ system_id, interface_id, request.user, NODE_PERMISSION.EDIT)
598+ if interface.get_node().installable:
599+ # This node needs to be in the correct state to modify
600+ # the interface.
601+ raise_error_for_invalid_state_on_allocated_operations(
602+ interface.node, request.user, "set default gateway")
603+>>>>>>> MERGE-SOURCE
604 form = InterfaceSetDefaultGatwayForm(
605 instance=interface, data=request.data)
606 if form.is_valid():
607
608=== modified file 'src/maasserver/api/tests/test_devices.py'
609--- src/maasserver/api/tests/test_devices.py 2015-12-21 21:19:44 +0000
610+++ src/maasserver/api/tests/test_devices.py 2016-01-10 08:29:39 +0000
611@@ -14,9 +14,14 @@
612 INTERFACE_TYPE,
613 IPADDRESS_TYPE,
614 NODE_STATUS,
615+<<<<<<< TREE
616 NODE_TYPE,
617 NODEGROUP_STATUS,
618 NODEGROUPINTERFACE_MANAGEMENT,
619+=======
620+ NODEGROUP_STATUS,
621+ NODEGROUPINTERFACE_MANAGEMENT,
622+>>>>>>> MERGE-SOURCE
623 )
624 from maasserver.models import (
625 Device,
626@@ -31,7 +36,11 @@
627 )
628 from maasserver.testing.factory import factory
629 from maasserver.testing.orm import reload_object
630+<<<<<<< TREE
631 from maasserver.utils.converters import json_load_bytes
632+=======
633+from mock import patch
634+>>>>>>> MERGE-SOURCE
635 from testtools.matchers import (
636 HasLength,
637 Not,
638@@ -286,6 +295,7 @@
639 class TestClaimStickyIpAddressAPI(APITestCase):
640 """Tests for /api/1.0/devices/?op=claim_sticky_ip_address."""
641
642+<<<<<<< TREE
643 def test__claims_ip_address_from_cluster_interface_static_range(self):
644 ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
645 ngi = factory.make_NodeGroupInterface(
646@@ -393,6 +403,95 @@
647 self.assertEqual(
648 http.client.OK, response.status_code, response.content)
649 parsed_device = json_load_bytes(response.content)
650+=======
651+ def test__claims_ip_address_from_cluster_interface_static_range(self):
652+ ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
653+ ngi = factory.make_NodeGroupInterface(
654+ ng, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS)
655+ parent = factory.make_Node_with_Interface_on_Subnet(
656+ nodegroup=ng, subnet=ngi.subnet)
657+ device = factory.make_Node(
658+ installable=False, parent=parent, interface=True,
659+ disable_ipv4=False, owner=self.logged_in_user)
660+ # Silence 'update_host_maps'.
661+ self.patch_autospec(interface_module, "update_host_maps")
662+ response = self.client.post(
663+ get_device_uri(device), {'op': 'claim_sticky_ip_address'})
664+ self.assertEqual(httplib.OK, response.status_code, response.content)
665+ parsed_device = json.loads(response.content)
666+ [returned_ip] = parsed_device["ip_addresses"]
667+ static_ip = StaticIPAddress.objects.filter(ip=returned_ip).first()
668+ self.assertIsNotNone(static_ip)
669+ self.assertEquals(IPADDRESS_TYPE.STICKY, static_ip.alloc_type)
670+
671+ def test__claims_ip_address_from_unmanaged_cluster_interface(self):
672+ ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
673+ ngi = factory.make_NodeGroupInterface(
674+ ng, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED)
675+ parent = factory.make_Node_with_Interface_on_Subnet(
676+ nodegroup=ng, subnet=ngi.subnet)
677+ device = factory.make_Node(
678+ installable=False, parent=parent, interface=True,
679+ disable_ipv4=False, owner=self.logged_in_user)
680+ # Silence 'update_host_maps'.
681+ self.patch_autospec(interface_module, "update_host_maps")
682+ response = self.client.post(
683+ get_device_uri(device), {'op': 'claim_sticky_ip_address'})
684+ self.assertEqual(httplib.OK, response.status_code, response.content)
685+ parsed_device = json.loads(response.content)
686+ [returned_ip] = parsed_device["ip_addresses"]
687+ static_ip = StaticIPAddress.objects.filter(ip=returned_ip).first()
688+ self.assertIsNotNone(static_ip)
689+ self.assertEquals(IPADDRESS_TYPE.STICKY, static_ip.alloc_type)
690+
691+ def test__claims_ip_address_from_detached_cluster_interface(self):
692+ ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
693+ ngi = factory.make_NodeGroupInterface(
694+ ng, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED)
695+ subnet = ngi.subnet
696+ ngi.subnet = None
697+ ngi.save()
698+ parent = factory.make_Node_with_Interface_on_Subnet(
699+ nodegroup=ng, subnet=subnet, unmanaged=True)
700+ device = factory.make_Node(
701+ installable=False, parent=parent, interface=True,
702+ disable_ipv4=False, owner=self.logged_in_user)
703+ # Silence 'update_host_maps'.
704+ self.patch_autospec(interface_module, "update_host_maps")
705+ response = self.client.post(
706+ get_device_uri(device), {'op': 'claim_sticky_ip_address'})
707+ self.assertEqual(httplib.OK, response.status_code, response.content)
708+ parsed_device = json.loads(response.content)
709+ [returned_ip] = parsed_device["ip_addresses"]
710+ static_ip = StaticIPAddress.objects.filter(ip=returned_ip).first()
711+ self.assertIsNotNone(static_ip)
712+ self.assertEquals(IPADDRESS_TYPE.STICKY, static_ip.alloc_type)
713+
714+ def test__claims_ip_address_after_devices_new(self):
715+ ng = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
716+ ngi = factory.make_NodeGroupInterface(
717+ ng, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS)
718+ parent = factory.make_Node_with_Interface_on_Subnet(
719+ nodegroup=ng, subnet=ngi.subnet)
720+ # Run 'devices new', as a sanity check to ensure the object is created
721+ # the same way as it is when juju does it.
722+ self.client.post(
723+ reverse('devices_handler'),
724+ {
725+ 'op': 'new',
726+ 'hostname': "lxc-1",
727+ 'mac_addresses': "01:02:03:04:05:06",
728+ 'parent': parent.system_id,
729+ })
730+ # Silence 'update_host_maps'.
731+ device = Device.objects.first()
732+ self.patch_autospec(interface_module, "update_host_maps")
733+ response = self.client.post(
734+ get_device_uri(device), {'op': 'claim_sticky_ip_address'})
735+ self.assertEqual(httplib.OK, response.status_code, response.content)
736+ parsed_device = json.loads(response.content)
737+ # import pdb; pdb.set_trace()
738+>>>>>>> MERGE-SOURCE
739 [returned_ip] = parsed_device["ip_addresses"]
740 static_ip = StaticIPAddress.objects.filter(ip=returned_ip).first()
741 self.assertIsNotNone(static_ip)
742@@ -431,6 +530,7 @@
743 (returned_ip, returned_ip, given_ip.alloc_type)
744 )
745
746+<<<<<<< TREE
747 def test_503_if_no_subnet_found(self):
748 device = factory.make_Device(
749 interface=True, disable_ipv4=False, owner=self.logged_in_user)
750@@ -463,6 +563,41 @@
751 http.client.SERVICE_UNAVAILABLE, response.status_code,
752 response.content)
753
754+=======
755+ def test_503_if_no_subnet_found(self):
756+ device = factory.make_Node(
757+ installable=False, interface=True, disable_ipv4=False,
758+ owner=self.logged_in_user)
759+ # Silence 'update_host_maps'.
760+ self.patch_autospec(interface_module, "update_host_maps")
761+ response = self.client.post(
762+ get_device_uri(device),
763+ {
764+ 'op': 'claim_sticky_ip_address',
765+ })
766+ self.assertEqual(
767+ httplib.SERVICE_UNAVAILABLE, response.status_code,
768+ response.content)
769+
770+ @patch.object(Interface, 'claim_static_ips')
771+ def test_503_if_no_ip_found(self, claim_static_ips):
772+ claim_static_ips.side_effect = [list()]
773+
774+ device = factory.make_Node(
775+ installable=False, interface=True, disable_ipv4=False,
776+ owner=self.logged_in_user)
777+ # Silence 'update_host_maps'.
778+ self.patch_autospec(interface_module, "update_host_maps")
779+ response = self.client.post(
780+ get_device_uri(device),
781+ {
782+ 'op': 'claim_sticky_ip_address',
783+ })
784+ self.assertEqual(
785+ httplib.SERVICE_UNAVAILABLE, response.status_code,
786+ response.content)
787+
788+>>>>>>> MERGE-SOURCE
789 def test_creates_ip_for_specific_mac(self):
790 requested_address = factory.make_ip_address()
791 device = factory.make_Node(
792
793=== modified file 'src/maasserver/api/tests/test_interfaces.py'
794--- src/maasserver/api/tests/test_interfaces.py 2015-12-10 01:04:27 +0000
795+++ src/maasserver/api/tests/test_interfaces.py 2016-01-10 08:29:39 +0000
796@@ -92,6 +92,7 @@
797 ]
798 self.assertItemsEqual(expected_ids, result_ids)
799
800+<<<<<<< TREE
801 def test_read_on_device(self):
802 parent = factory.make_Node()
803 device = factory.make_Device(
804@@ -106,6 +107,20 @@
805 self.assertEqual(
806 interface.id, json_load_bytes(response.content)[0]['id'])
807
808+=======
809+ def test_read_on_device(self):
810+ parent = factory.make_Node()
811+ device = factory.make_Node(
812+ owner=self.logged_in_user, installable=False, parent=parent)
813+ interface = factory.make_Interface(
814+ INTERFACE_TYPE.PHYSICAL, node=device)
815+ uri = get_interfaces_uri(device)
816+ response = self.client.get(uri)
817+
818+ self.assertEqual(httplib.OK, response.status_code, response.content)
819+ self.assertEqual(interface.id, json.loads(response.content)[0]['id'])
820+
821+>>>>>>> MERGE-SOURCE
822 def test_create_physical(self):
823 self.become_admin()
824 for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN):
825@@ -139,6 +154,7 @@
826 "enabled": Equals(True),
827 }))
828
829+<<<<<<< TREE
830 def test_create_physical_on_device(self):
831 parent = factory.make_Node()
832 device = factory.make_Device(
833@@ -172,6 +188,41 @@
834 "enabled": Equals(True),
835 }))
836
837+=======
838+ def test_create_physical_on_device(self):
839+ parent = factory.make_Node()
840+ device = factory.make_Node(
841+ owner=self.logged_in_user, installable=False, parent=parent)
842+ mac = factory.make_mac_address()
843+ name = factory.make_name("eth")
844+ vlan = factory.make_VLAN()
845+ tags = [
846+ factory.make_name("tag")
847+ for _ in range(3)
848+ ]
849+ uri = get_interfaces_uri(device)
850+ response = self.client.post(uri, {
851+ "op": "create_physical",
852+ "mac_address": mac,
853+ "name": name,
854+ "vlan": vlan.id,
855+ "tags": ",".join(tags),
856+ })
857+
858+ self.assertEqual(
859+ httplib.OK, response.status_code, response.content)
860+ self.assertThat(json.loads(response.content), ContainsDict({
861+ "mac_address": Equals(mac),
862+ "name": Equals(name),
863+ "vlan": ContainsDict({
864+ "id": Equals(vlan.id),
865+ }),
866+ "type": Equals("physical"),
867+ "tags": Equals(tags),
868+ "enabled": Equals(True),
869+ }))
870+
871+>>>>>>> MERGE-SOURCE
872 def test_create_physical_disabled(self):
873 self.become_admin()
874 for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN):
875@@ -331,6 +382,7 @@
876 parent_2_iface.name,
877 ], parsed_interface['parents'])
878
879+<<<<<<< TREE
880 def test_create_bond_404_on_device(self):
881 parent = factory.make_Node()
882 device = factory.make_Node(
883@@ -343,6 +395,19 @@
884 self.assertEqual(
885 http.client.NOT_FOUND, response.status_code, response.content)
886
887+=======
888+ def test_create_bond_404_on_device(self):
889+ parent = factory.make_Node()
890+ device = factory.make_Node(
891+ owner=self.logged_in_user, installable=False, parent=parent)
892+ uri = get_interfaces_uri(device)
893+ response = self.client.post(uri, {
894+ "op": "create_bond",
895+ })
896+ self.assertEqual(
897+ httplib.NOT_FOUND, response.status_code, response.content)
898+
899+>>>>>>> MERGE-SOURCE
900 def test_create_bond_requires_admin(self):
901 node = factory.make_Node()
902 vlan = factory.make_VLAN()
903@@ -447,6 +512,7 @@
904 "tags": Equals(tags),
905 }))
906
907+<<<<<<< TREE
908 def test_create_vlan_404_on_device(self):
909 parent = factory.make_Node()
910 device = factory.make_Node(
911@@ -459,6 +525,19 @@
912 self.assertEqual(
913 http.client.NOT_FOUND, response.status_code, response.content)
914
915+=======
916+ def test_create_vlan_404_on_device(self):
917+ parent = factory.make_Node()
918+ device = factory.make_Node(
919+ owner=self.logged_in_user, installable=False, parent=parent)
920+ uri = get_interfaces_uri(device)
921+ response = self.client.post(uri, {
922+ "op": "create_vlan",
923+ })
924+ self.assertEqual(
925+ httplib.NOT_FOUND, response.status_code, response.content)
926+
927+>>>>>>> MERGE-SOURCE
928 def test_create_vlan_requires_admin(self):
929 node = factory.make_Node()
930 untagged_vlan = factory.make_VLAN()
931@@ -607,6 +686,7 @@
932 parsed_interface = json_load_bytes(response.content)
933 self.assertEqual(bond0.id, parsed_interface['id'])
934
935+<<<<<<< TREE
936 def test_read_device_interface(self):
937 parent = factory.make_Node()
938 device = factory.make_Device(parent=parent)
939@@ -619,6 +699,19 @@
940 parsed_interface = json_load_bytes(response.content)
941 self.assertEqual(interface.id, parsed_interface['id'])
942
943+=======
944+ def test_read_device_interface(self):
945+ parent = factory.make_Node()
946+ device = factory.make_Node(installable=False, parent=parent)
947+ interface = factory.make_Interface(
948+ INTERFACE_TYPE.PHYSICAL, node=device)
949+ uri = get_interface_uri(interface)
950+ response = self.client.get(uri)
951+ self.assertEqual(httplib.OK, response.status_code, response.content)
952+ parsed_interface = json.loads(response.content)
953+ self.assertEqual(interface.id, parsed_interface['id'])
954+
955+>>>>>>> MERGE-SOURCE
956 def test_read_404_when_invalid_id(self):
957 node = factory.make_Node()
958 uri = reverse(
959@@ -666,6 +759,25 @@
960 self.assertEquals(new_name, parsed_interface["name"])
961 self.assertEquals(new_vlan.vid, parsed_interface["vlan"]["vid"])
962
963+ def test_update_device_physical_interface(self):
964+ node = factory.make_Node()
965+ device = factory.make_Node(
966+ owner=self.logged_in_user, installable=False, parent=node)
967+ interface = factory.make_Interface(
968+ INTERFACE_TYPE.PHYSICAL, node=device)
969+ new_name = factory.make_name("name")
970+ new_vlan = factory.make_VLAN()
971+ uri = get_interface_uri(interface)
972+ response = self.client.put(uri, {
973+ "name": new_name,
974+ "vlan": new_vlan.id,
975+ })
976+ self.assertEqual(
977+ httplib.OK, response.status_code, response.content)
978+ parsed_interface = json.loads(response.content)
979+ self.assertEquals(new_name, parsed_interface["name"])
980+ self.assertEquals(new_vlan.vid, parsed_interface["vlan"]["vid"])
981+
982 def test_update_bond_interface(self):
983 self.become_admin()
984 for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN):
985@@ -750,6 +862,7 @@
986 http.client.NO_CONTENT, response.status_code, response.content)
987 self.assertIsNone(reload_object(interface))
988
989+<<<<<<< TREE
990 def test_delete_deletes_device_interface(self):
991 parent = factory.make_Node()
992 device = factory.make_Device(
993@@ -762,6 +875,20 @@
994 http.client.NO_CONTENT, response.status_code, response.content)
995 self.assertIsNone(reload_object(interface))
996
997+=======
998+ def test_delete_deletes_device_interface(self):
999+ parent = factory.make_Node()
1000+ device = factory.make_Node(
1001+ owner=self.logged_in_user, installable=False, parent=parent)
1002+ interface = factory.make_Interface(
1003+ INTERFACE_TYPE.PHYSICAL, node=device)
1004+ uri = get_interface_uri(interface)
1005+ response = self.client.delete(uri)
1006+ self.assertEqual(
1007+ httplib.NO_CONTENT, response.status_code, response.content)
1008+ self.assertIsNone(reload_object(interface))
1009+
1010+>>>>>>> MERGE-SOURCE
1011 def test_delete_403_when_not_admin(self):
1012 node = factory.make_Node(interface=True)
1013 interface = node.get_boot_interface()
1014@@ -827,6 +954,7 @@
1015 "mode": Equals(INTERFACE_LINK_TYPE.DHCP),
1016 }))
1017
1018+<<<<<<< TREE
1019 def test_link_subnet_creates_link_on_device(self):
1020 parent = factory.make_Node()
1021 device = factory.make_Device(
1022@@ -867,6 +995,47 @@
1023 http.client.BAD_REQUEST, response.status_code,
1024 response.content)
1025
1026+=======
1027+ def test_link_subnet_creates_link_on_device(self):
1028+ parent = factory.make_Node()
1029+ device = factory.make_Node(
1030+ owner=self.logged_in_user, installable=False, parent=parent)
1031+ interface = factory.make_Interface(
1032+ INTERFACE_TYPE.PHYSICAL, node=device)
1033+ subnet = factory.make_Subnet(vlan=interface.vlan)
1034+ uri = get_interface_uri(interface)
1035+ response = self.client.post(uri, {
1036+ "op": "link_subnet",
1037+ "mode": INTERFACE_LINK_TYPE.STATIC,
1038+ "subnet": subnet.id,
1039+ })
1040+ self.assertEqual(
1041+ httplib.OK, response.status_code, response.content)
1042+ parsed_response = json.loads(response.content)
1043+ self.assertThat(
1044+ parsed_response["links"][0], ContainsDict({
1045+ "mode": Equals(INTERFACE_LINK_TYPE.STATIC),
1046+ }))
1047+
1048+ def test_link_subnet_on_device_only_allows_static(self):
1049+ parent = factory.make_Node()
1050+ device = factory.make_Node(
1051+ owner=self.logged_in_user, installable=False, parent=parent)
1052+ interface = factory.make_Interface(
1053+ INTERFACE_TYPE.PHYSICAL, node=device)
1054+ for link_type in [
1055+ INTERFACE_LINK_TYPE.AUTO,
1056+ INTERFACE_LINK_TYPE.DHCP,
1057+ INTERFACE_LINK_TYPE.LINK_UP]:
1058+ uri = get_interface_uri(interface)
1059+ response = self.client.post(uri, {
1060+ "op": "link_subnet",
1061+ "mode": link_type,
1062+ })
1063+ self.assertEqual(
1064+ httplib.BAD_REQUEST, response.status_code, response.content)
1065+
1066+>>>>>>> MERGE-SOURCE
1067 def test_link_subnet_raises_error(self):
1068 self.become_admin()
1069 for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN):
1070@@ -942,6 +1111,7 @@
1071 http.client.OK, response.status_code, response.content)
1072 self.assertIsNone(reload_object(dhcp_ip))
1073
1074+<<<<<<< TREE
1075 def test_unlink_subnet_deletes_link_on_device(self):
1076 parent = factory.make_Node()
1077 device = factory.make_Device(
1078@@ -961,6 +1131,27 @@
1079 http.client.OK, response.status_code, response.content)
1080 self.assertIsNone(reload_object(static_ip))
1081
1082+=======
1083+ def test_unlink_subnet_deletes_link_on_device(self):
1084+ parent = factory.make_Node()
1085+ device = factory.make_Node(
1086+ owner=self.logged_in_user, installable=False, parent=parent)
1087+ interface = factory.make_Interface(
1088+ INTERFACE_TYPE.PHYSICAL, node=device)
1089+ subnet = factory.make_Subnet()
1090+ static_ip = factory.make_StaticIPAddress(
1091+ alloc_type=IPADDRESS_TYPE.STICKY,
1092+ subnet=subnet, interface=interface)
1093+ uri = get_interface_uri(interface)
1094+ response = self.client.post(uri, {
1095+ "op": "unlink_subnet",
1096+ "id": static_ip.id,
1097+ })
1098+ self.assertEqual(
1099+ httplib.OK, response.status_code, response.content)
1100+ self.assertIsNone(reload_object(static_ip))
1101+
1102+>>>>>>> MERGE-SOURCE
1103 def test_unlink_subnet_raises_error(self):
1104 self.become_admin()
1105 for status in (NODE_STATUS.READY, NODE_STATUS.BROKEN):
1106
1107=== modified file 'src/maasserver/api/tests/test_raid.py'
1108=== modified file 'src/maasserver/api/tests/test_vlans.py'
1109--- src/maasserver/api/tests/test_vlans.py 2015-12-03 16:37:58 +0000
1110+++ src/maasserver/api/tests/test_vlans.py 2016-01-10 08:29:39 +0000
1111@@ -76,6 +76,7 @@
1112 "vid": vid,
1113 "mtu": mtu,
1114 })
1115+<<<<<<< TREE
1116 self.assertEqual(
1117 http.client.OK, response.status_code, response.content)
1118 response_data = json.loads(
1119@@ -83,6 +84,12 @@
1120 self.assertEqual(vlan_name, response_data['name'])
1121 self.assertEqual(vid, response_data['vid'])
1122 self.assertEqual(mtu, response_data['mtu'])
1123+=======
1124+ self.assertEqual(httplib.OK, response.status_code, response.content)
1125+ self.assertEqual(vlan_name, json.loads(response.content)['name'])
1126+ self.assertEqual(vid, json.loads(response.content)['vid'])
1127+ self.assertEqual(mtu, json.loads(response.content)['mtu'])
1128+>>>>>>> MERGE-SOURCE
1129
1130 def test_create_admin_only(self):
1131 fabric = factory.make_Fabric()
1132
1133=== modified file 'src/maasserver/api/tests/test_volume_groups.py'
1134--- src/maasserver/api/tests/test_volume_groups.py 2015-12-03 16:37:58 +0000
1135+++ src/maasserver/api/tests/test_volume_groups.py 2016-01-10 08:29:39 +0000
1136@@ -416,12 +416,19 @@
1137 "uuid": vguuid,
1138 "size": size,
1139 })
1140+<<<<<<< TREE
1141 self.assertEqual(
1142 http.client.OK, response.status_code, response.content)
1143 logical_volume = json.loads(
1144 response.content.decode(settings.DEFAULT_CHARSET))
1145 expected_size = round_size_to_nearest_block(
1146 size, PARTITION_ALIGNMENT_SIZE, False)
1147+=======
1148+ self.assertEqual(httplib.OK, response.status_code, response.content)
1149+ logical_volume = json.loads(response.content)
1150+ expected_size = round_size_to_nearest_block(
1151+ size, PARTITION_ALIGNMENT_SIZE, False)
1152+>>>>>>> MERGE-SOURCE
1153 self.assertThat(logical_volume, ContainsDict({
1154 "name": Equals("%s-%s" % (volume_group.name, name)),
1155 "uuid": Equals(vguuid),
1156
1157=== modified file 'src/maasserver/api/vlans.py'
1158=== modified file 'src/maasserver/dns/tests/test_config.py'
1159=== modified file 'src/maasserver/forms.py'
1160=== modified file 'src/maasserver/forms_interface_link.py'
1161=== modified file 'src/maasserver/forms_subnet.py'
1162--- src/maasserver/forms_subnet.py 2015-12-23 17:21:20 +0000
1163+++ src/maasserver/forms_subnet.py 2016-01-10 08:29:39 +0000
1164@@ -50,9 +50,16 @@
1165
1166 def clean(self):
1167 cleaned_data = super(SubnetForm, self).clean()
1168+<<<<<<< TREE
1169 # The ArrayField form has a bug which leaves out the first entry.
1170 if 'dns_servers' in self.data and self.data['dns_servers'] != '':
1171 cleaned_data['dns_servers'] = self.data.getlist('dns_servers')
1172+=======
1173+ # The djorm_pgarray.fields.ArrayField form has a bug which leaves out
1174+ # the first entry.
1175+ if 'dns_servers' in self.data and self.data['dns_servers'] != '':
1176+ cleaned_data['dns_servers'] = self.data.getlist('dns_servers')
1177+>>>>>>> MERGE-SOURCE
1178 cleaned_data = self._clean_name(cleaned_data)
1179 cleaned_data = self._clean_dns_servers(cleaned_data)
1180 if self.instance.id is None:
1181
1182=== modified file 'src/maasserver/management/commands/_config.py'
1183=== modified file 'src/maasserver/management/commands/tests/test_config.py'
1184=== modified file 'src/maasserver/migrations/south/migrations/0181_initial_storage_layouts.py'
1185=== modified file 'src/maasserver/migrations/south/migrations/0182_initial_networking_layout.py'
1186=== modified file 'src/maasserver/models/__init__.py'
1187--- src/maasserver/models/__init__.py 2016-01-06 22:39:26 +0000
1188+++ src/maasserver/models/__init__.py 2016-01-10 08:29:39 +0000
1189@@ -275,6 +275,7 @@
1190 raise NotImplementedError(
1191 'Invalid permission check (invalid permission name: %s).' %
1192 perm)
1193+<<<<<<< TREE
1194 elif isinstance(obj, Interface):
1195 if perm == NODE_PERMISSION.VIEW:
1196 # Any registered user can view a interface regardless
1197@@ -306,6 +307,28 @@
1198 'Invalid permission check (invalid permission name: %s).' %
1199 perm)
1200 elif isinstance(obj, (Fabric, FanNetwork, Subnet, Space)):
1201+=======
1202+ elif isinstance(obj, Interface):
1203+ if perm == NODE_PERMISSION.VIEW:
1204+ # Any registered user can view a interface regardless
1205+ # of its state.
1206+ return True
1207+ elif perm in NODE_PERMISSION.EDIT:
1208+ # A device can be editted by its owner a node must be admin.
1209+ node = obj.get_node()
1210+ if node is None or node.installable:
1211+ return user.is_superuser
1212+ else:
1213+ return node.owner == user
1214+ elif perm in NODE_PERMISSION.ADMIN:
1215+ # Admin permission is solely granted to superusers.
1216+ return user.is_superuser
1217+ else:
1218+ raise NotImplementedError(
1219+ 'Invalid permission check (invalid permission name: %s).' %
1220+ perm)
1221+ elif isinstance(obj, (Fabric, FanNetwork, Subnet, Space)):
1222+>>>>>>> MERGE-SOURCE
1223 if perm == NODE_PERMISSION.VIEW:
1224 # Any registered user can view a fabric or interface regardless
1225 # of its state.
1226
1227=== modified file 'src/maasserver/models/blockdevice.py'
1228=== modified file 'src/maasserver/models/config.py'
1229=== modified file 'src/maasserver/models/filesystemgroup.py'
1230=== modified file 'src/maasserver/models/interface.py'
1231--- src/maasserver/models/interface.py 2016-01-04 20:14:42 +0000
1232+++ src/maasserver/models/interface.py 2016-01-10 08:29:39 +0000
1233@@ -1126,10 +1126,17 @@
1234 auto_ip, exclude_addresses)
1235 if ngi is not None:
1236 affected_nodegroups.add(ngi.nodegroup)
1237+<<<<<<< TREE
1238 if assigned_ip is not None:
1239 assigned_addresses.append(assigned_ip)
1240 exclude_addresses.add(str(assigned_ip.ip))
1241 self._update_dns_zones()
1242+=======
1243+ if assigned_ip is not None:
1244+ assigned_addresses.append(assigned_ip)
1245+ exclude_addresses.add(unicode(assigned_ip.ip))
1246+ self._update_dns_zones(affected_nodegroups)
1247+>>>>>>> MERGE-SOURCE
1248 return assigned_addresses
1249
1250 def _claim_auto_ip(self, auto_ip, exclude_addresses=[]):
1251@@ -1323,28 +1330,53 @@
1252 if ngi is not None and ngi.subnet is not None:
1253 discovered_subnets.append(ngi.subnet)
1254
1255- if len(discovered_subnets) == 0:
1256- node = self.node
1257- if parent is not None:
1258- node = parent
1259- if node is None:
1260- hostname = "<unknown>"
1261- else:
1262- hostname = "'%s'" % node.hostname
1263- log_string = (
1264- "%s: Attempted to claim a static IP address, but no "
1265- "associated subnet could be found. (Recommission node %s "
1266- "in order for MAAS to discover the subnet.)" %
1267- (self.get_log_string(), hostname)
1268- )
1269- maaslog.warning(log_string)
1270- raise StaticIPAddressExhaustion(log_string)
1271-
1272- # This must be a set because it is highly possible that the parent
1273- # has multiple subnets on the same interface or same subnet on multiple
1274- # interfaces. We only want to allocate one ip address per subnet.
1275- discovered_subnets = set(discovered_subnets)
1276-
1277+<<<<<<< TREE
1278+ if len(discovered_subnets) == 0:
1279+ node = self.node
1280+ if parent is not None:
1281+ node = parent
1282+ if node is None:
1283+ hostname = "<unknown>"
1284+ else:
1285+ hostname = "'%s'" % node.hostname
1286+ log_string = (
1287+ "%s: Attempted to claim a static IP address, but no "
1288+ "associated subnet could be found. (Recommission node %s "
1289+ "in order for MAAS to discover the subnet.)" %
1290+ (self.get_log_string(), hostname)
1291+ )
1292+ maaslog.warning(log_string)
1293+ raise StaticIPAddressExhaustion(log_string)
1294+
1295+ # This must be a set because it is highly possible that the parent
1296+ # has multiple subnets on the same interface or same subnet on multiple
1297+ # interfaces. We only want to allocate one ip address per subnet.
1298+ discovered_subnets = set(discovered_subnets)
1299+
1300+=======
1301+ # This must be a set because it is highly possible that the parent
1302+ # has multiple subnets on the same interface or same subnet on multiple
1303+ # interfaces. We only want to allocate one ip address per subnet.
1304+ discovered_subnets = set(discovered_subnets)
1305+
1306+ if len(discovered_subnets) == 0:
1307+ node = self.node
1308+ if parent is not None:
1309+ node = parent
1310+ if node is None:
1311+ hostname = "<unknown>"
1312+ else:
1313+ hostname = "'%s'" % node.hostname
1314+ log_string = (
1315+ "%s: Attempted to claim a static IP address, but no "
1316+ "associated subnet could be found. (Recommission node %s "
1317+ "in order for MAAS to discover the subnet.)" %
1318+ (self.get_log_string(), hostname)
1319+ )
1320+ maaslog.warning(log_string)
1321+ raise StaticIPAddressExhaustion(log_string)
1322+
1323+>>>>>>> MERGE-SOURCE
1324 if requested_address is None:
1325 # No requested address so claim a STATIC IP on all DISCOVERED
1326 # subnets for this interface.
1327
1328=== modified file 'src/maasserver/models/migrations/populate_subnets_helper.py'
1329=== modified file 'src/maasserver/models/node.py'
1330=== modified file 'src/maasserver/models/nodegroupinterface.py'
1331=== modified file 'src/maasserver/models/partition.py'
1332=== modified file 'src/maasserver/models/partitiontable.py'
1333=== modified file 'src/maasserver/models/staticipaddress.py'
1334--- src/maasserver/models/staticipaddress.py 2016-01-07 01:45:15 +0000
1335+++ src/maasserver/models/staticipaddress.py 2016-01-10 08:29:39 +0000
1336@@ -153,8 +153,13 @@
1337 self, network, static_range_low, static_range_high,
1338 dynamic_range_low, dynamic_range_high,
1339 alloc_type=IPADDRESS_TYPE.AUTO, user=None,
1340+<<<<<<< TREE
1341 requested_address=None, subnet=None,
1342 exclude_addresses=[], in_use_ipset=set()):
1343+=======
1344+ requested_address=None, hostname=None, subnet=None,
1345+ exclude_addresses=[], in_use_ipset=set()):
1346+>>>>>>> MERGE-SOURCE
1347 """Return a new StaticIPAddress.
1348
1349 :param network: The network the address should be allocated in.
1350
1351=== modified file 'src/maasserver/models/subnet.py'
1352=== modified file 'src/maasserver/models/tests/test_blockdevice.py'
1353=== modified file 'src/maasserver/models/tests/test_filesystem.py'
1354=== modified file 'src/maasserver/models/tests/test_filesystemgroup.py'
1355--- src/maasserver/models/tests/test_filesystemgroup.py 2015-12-04 20:46:31 +0000
1356+++ src/maasserver/models/tests/test_filesystemgroup.py 2016-01-10 08:29:39 +0000
1357@@ -330,9 +330,17 @@
1358 partition_table = factory.make_PartitionTable(
1359 block_device=block_device)
1360 partition_one = factory.make_Partition(
1361+<<<<<<< TREE
1362 partition_table=partition_table, size=device_size // 2)
1363+=======
1364+ partition_table=partition_table, size=device_size / 2)
1365+>>>>>>> MERGE-SOURCE
1366 partition_two = factory.make_Partition(
1367+<<<<<<< TREE
1368 partition_table=partition_table, size=device_size // 2)
1369+=======
1370+ partition_table=partition_table, size=device_size / 2)
1371+>>>>>>> MERGE-SOURCE
1372 cache_set = factory.make_CacheSet(partition=partition_one)
1373 filesystem_backing = factory.make_Filesystem(
1374 fstype=FILESYSTEM_TYPE.BCACHE_BACKING, partition=partition_two)
1375@@ -662,9 +670,15 @@
1376 fstype=FILESYSTEM_TYPE.LVM_PV, block_device=block_device))
1377 fsgroup = factory.make_FilesystemGroup(
1378 group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, filesystems=filesystems)
1379+<<<<<<< TREE
1380 # Reserve one extent per filesystem for LVM headers.
1381 extents = (total_size // LVM_PE_SIZE) - 3
1382 self.assertEqual(extents * LVM_PE_SIZE, fsgroup.get_size())
1383+=======
1384+ # Reserve one extent per filesystem for LVM headers.
1385+ extents = int(total_size / LVM_PE_SIZE) - 3
1386+ self.assertEquals(extents * LVM_PE_SIZE, fsgroup.get_size())
1387+>>>>>>> MERGE-SOURCE
1388
1389 def test_get_size_returns_0_if_raid_without_filesystems(self):
1390 fsgroup = FilesystemGroup(group_type=FILESYSTEM_GROUP_TYPE.RAID_0)
1391@@ -1315,7 +1329,11 @@
1392 block_device=block_device)
1393 # Size should be 50 GB minus one extent per filesystem for LVM headers.
1394 pv_total_size = 50 * 1000 ** 3
1395+<<<<<<< TREE
1396 extents = (pv_total_size // LVM_PE_SIZE) - 5
1397+=======
1398+ extents = int(pv_total_size / LVM_PE_SIZE) - 5
1399+>>>>>>> MERGE-SOURCE
1400 usable_size = extents * LVM_PE_SIZE
1401 self.assertEqual(usable_size, fsgroup.get_size())
1402
1403@@ -2050,7 +2068,11 @@
1404 node=node, size=device_size)).add_partition()
1405 for _ in range(4)
1406 ]
1407+<<<<<<< TREE
1408 uuid = str(uuid4())
1409+=======
1410+ uuid = unicode(uuid4())
1411+>>>>>>> MERGE-SOURCE
1412 raid = RAID.objects.create_raid(
1413 name='md0',
1414 level=FILESYSTEM_GROUP_TYPE.RAID_6,
1415@@ -2096,7 +2118,11 @@
1416 node=node, size=device_size)).add_partition()
1417 for _ in range(10)
1418 ]
1419+<<<<<<< TREE
1420 uuid = str(uuid4())
1421+=======
1422+ uuid = unicode(uuid4())
1423+>>>>>>> MERGE-SOURCE
1424 raid = RAID.objects.create_raid(
1425 name='md0',
1426 level=FILESYSTEM_GROUP_TYPE.RAID_5,
1427@@ -2117,7 +2143,11 @@
1428 node=node, size=device_size)).add_partition()
1429 for _ in range(10)
1430 ]
1431+<<<<<<< TREE
1432 uuid = str(uuid4())
1433+=======
1434+ uuid = unicode(uuid4())
1435+>>>>>>> MERGE-SOURCE
1436 raid = RAID.objects.create_raid(
1437 name='md0',
1438 level=FILESYSTEM_GROUP_TYPE.RAID_5,
1439@@ -2241,7 +2271,11 @@
1440 backing_partition = factory.make_PartitionTable(
1441 block_device=factory.make_PhysicalBlockDevice(
1442 node=node, size=backing_size)).add_partition()
1443+<<<<<<< TREE
1444 uuid = str(uuid4())
1445+=======
1446+ uuid = unicode(uuid4())
1447+>>>>>>> MERGE-SOURCE
1448 bcache = Bcache.objects.create_bcache(
1449 name='bcache0',
1450 uuid=uuid,
1451
1452=== modified file 'src/maasserver/models/tests/test_interface.py'
1453--- src/maasserver/models/tests/test_interface.py 2015-12-29 21:52:07 +0000
1454+++ src/maasserver/models/tests/test_interface.py 2016-01-10 08:29:39 +0000
1455@@ -1070,6 +1070,38 @@
1456 ngi3.subnet.cidr))),
1457 ))
1458
1459+ def test__links_interface_to_vlan_on_existing_subnet_with_logging(self):
1460+ ng = factory.make_NodeGroup()
1461+ fabric2 = factory.make_Fabric()
1462+ fabric3 = factory.make_Fabric()
1463+ ngi1 = factory.make_NodeGroupInterface(ng)
1464+ ngi2 = factory.make_NodeGroupInterface(ng, fabric=fabric2)
1465+ ngi3 = factory.make_NodeGroupInterface(ng, fabric=fabric3)
1466+ interface1 = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1467+ interface2 = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1468+ interface3 = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1469+ vlan1 = ngi1.subnet.vlan
1470+ vlan2 = ngi2.subnet.vlan
1471+ vlan3 = ngi3.subnet.vlan
1472+ maaslog = self.patch_autospec(interface_module, "maaslog")
1473+ interface1.update_ip_addresses([ngi1.subnet.cidr])
1474+ interface2.update_ip_addresses([ngi2.subnet.cidr])
1475+ interface3.update_ip_addresses([ngi3.subnet.cidr])
1476+ self.assertThat(interface1.vlan, Equals(vlan1))
1477+ self.assertThat(interface2.vlan, Equals(vlan2))
1478+ self.assertThat(interface3.vlan, Equals(vlan3))
1479+ self.assertThat(maaslog.info, MockCallsMatch(
1480+ call(("%s: Observed connected to %s via %s." % (
1481+ interface1.get_log_string(), interface1.vlan.fabric.get_name(),
1482+ ngi1.subnet.cidr))),
1483+ call(("%s: Observed connected to %s via %s." % (
1484+ interface2.get_log_string(), interface2.vlan.fabric.get_name(),
1485+ ngi2.subnet.cidr))),
1486+ call(("%s: Observed connected to %s via %s." % (
1487+ interface3.get_log_string(), interface3.vlan.fabric.get_name(),
1488+ ngi3.subnet.cidr))),
1489+ ))
1490+
1491 def test__deletes_old_discovered_ip_addresses_on_interface(self):
1492 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1493 # Create existing DISCOVERED IP address on the interface. These should
1494@@ -2288,60 +2320,150 @@
1495 self.assertEquals(subnet, observed[0].subnet)
1496 self.assertTrue(
1497 IPAddress(observed[0].ip) in (
1498- IPRange(ngi.static_ip_range_low, ngi.static_ip_range_high)),
1499- "Assigned IP address %s should be inside the static range "
1500- "on the cluster (%s - %s)." % (
1501- observed[0].ip, ngi.static_ip_range_low,
1502- ngi.static_ip_range_high))
1503- self.assertThat(
1504- IPAddress(observed[0].ip), Not(Equals(IPAddress(
1505- ngi.subnet.gateway_ip))))
1506-
1507- def test__claim_fails_if_subnet_missing(self):
1508- from maasserver.dns import config
1509- self.patch_autospec(interface_module, "update_host_maps")
1510- self.patch_autospec(config, "dns_update_by_node")
1511- interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1512- subnet = factory.make_Subnet(vlan=interface.vlan)
1513- nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1514- factory.make_NodeGroupInterface(
1515- nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS,
1516- subnet=subnet)
1517- ip = factory.make_StaticIPAddress(
1518- alloc_type=IPADDRESS_TYPE.AUTO, ip="",
1519- subnet=subnet, interface=interface)
1520- ip.subnet = None
1521- ip.save()
1522- maaslog = self.patch_autospec(interface_module, "maaslog")
1523- with ExpectedException(StaticIPAddressUnavailable):
1524- interface.claim_auto_ips()
1525- self.expectThat(maaslog.error, MockCalledOnceWith(
1526- "Could not find subnet for interface %s." %
1527- interface.get_log_string()))
1528-
1529- def test__claim_fails_if_no_static_range(self):
1530- from maasserver.dns import config
1531- self.patch_autospec(interface_module, "update_host_maps")
1532- self.patch_autospec(config, "dns_update_by_node")
1533- interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1534- subnet = factory.make_Subnet(vlan=interface.vlan)
1535- nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1536- ngi = factory.make_NodeGroupInterface(
1537- nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS,
1538- subnet=subnet)
1539- ngi.static_ip_range_low = ""
1540- ngi.static_ip_range_high = ""
1541- ngi.save()
1542- factory.make_StaticIPAddress(
1543- alloc_type=IPADDRESS_TYPE.AUTO, ip="",
1544- subnet=subnet, interface=interface)
1545- maaslog = self.patch_autospec(interface_module, "maaslog")
1546- with ExpectedException(StaticIPAddressUnavailable):
1547- interface.claim_auto_ips()
1548- self.expectThat(maaslog.error, MockCalledOnceWith(
1549- "Found matching NodeGroupInterface, but no static range has "
1550- "been defined for %s. (did you mean to configure DHCP?) " %
1551- interface.get_log_string()))
1552+<<<<<<< TREE
1553+ IPRange(ngi.static_ip_range_low, ngi.static_ip_range_high)),
1554+ "Assigned IP address %s should be inside the static range "
1555+ "on the cluster (%s - %s)." % (
1556+ observed[0].ip, ngi.static_ip_range_low,
1557+ ngi.static_ip_range_high))
1558+ self.assertThat(
1559+ IPAddress(observed[0].ip), Not(Equals(IPAddress(
1560+ ngi.subnet.gateway_ip))))
1561+
1562+ def test__claim_fails_if_subnet_missing(self):
1563+ from maasserver.dns import config
1564+ self.patch_autospec(interface_module, "update_host_maps")
1565+ self.patch_autospec(config, "dns_update_by_node")
1566+ interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1567+ subnet = factory.make_Subnet(vlan=interface.vlan)
1568+ nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1569+ factory.make_NodeGroupInterface(
1570+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS,
1571+ subnet=subnet)
1572+ ip = factory.make_StaticIPAddress(
1573+ alloc_type=IPADDRESS_TYPE.AUTO, ip="",
1574+ subnet=subnet, interface=interface)
1575+ ip.subnet = None
1576+ ip.save()
1577+ maaslog = self.patch_autospec(interface_module, "maaslog")
1578+ with ExpectedException(StaticIPAddressUnavailable):
1579+ interface.claim_auto_ips()
1580+ self.expectThat(maaslog.error, MockCalledOnceWith(
1581+ "Could not find subnet for interface %s." %
1582+ interface.get_log_string()))
1583+
1584+ def test__claim_fails_if_no_static_range(self):
1585+ from maasserver.dns import config
1586+ self.patch_autospec(interface_module, "update_host_maps")
1587+ self.patch_autospec(config, "dns_update_by_node")
1588+ interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1589+ subnet = factory.make_Subnet(vlan=interface.vlan)
1590+ nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1591+ ngi = factory.make_NodeGroupInterface(
1592+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS,
1593+ subnet=subnet)
1594+ ngi.static_ip_range_low = ""
1595+ ngi.static_ip_range_high = ""
1596+ ngi.save()
1597+ factory.make_StaticIPAddress(
1598+ alloc_type=IPADDRESS_TYPE.AUTO, ip="",
1599+ subnet=subnet, interface=interface)
1600+ maaslog = self.patch_autospec(interface_module, "maaslog")
1601+ with ExpectedException(StaticIPAddressUnavailable):
1602+ interface.claim_auto_ips()
1603+ self.expectThat(maaslog.error, MockCalledOnceWith(
1604+ "Found matching NodeGroupInterface, but no static range has "
1605+ "been defined for %s. (did you mean to configure DHCP?) " %
1606+ interface.get_log_string()))
1607+=======
1608+ IPRange(ngi.static_ip_range_low, ngi.static_ip_range_high)),
1609+ "Assigned IP address %s should be inside the static range "
1610+ "on the cluster (%s - %s)." % (
1611+ observed[0].ip, ngi.static_ip_range_low,
1612+ ngi.static_ip_range_high))
1613+
1614+ def test__claims_ip_address_in_static_ip_range_skips_gateway_ip(self):
1615+ from maasserver.dns import config
1616+ self.patch_autospec(interface_module, "update_host_maps")
1617+ self.patch_autospec(config, "dns_update_zones")
1618+ interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1619+ subnet = factory.make_Subnet(vlan=interface.vlan)
1620+ nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1621+ ngi = factory.make_NodeGroupInterface(
1622+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS,
1623+ subnet=subnet)
1624+ # Make it a really small range, just to be safe.
1625+ ngi.static_ip_range_high = unicode(
1626+ IPAddress(ngi.static_ip_range_low) + 1)
1627+ ngi.save()
1628+ ngi.subnet.gateway_ip = ngi.static_ip_range_low
1629+ ngi.subnet.dns_servers = []
1630+ ngi.subnet.save()
1631+ factory.make_StaticIPAddress(
1632+ alloc_type=IPADDRESS_TYPE.AUTO, ip="",
1633+ subnet=subnet, interface=interface)
1634+ observed = interface.claim_auto_ips()
1635+ self.assertEquals(
1636+ 1, len(observed),
1637+ "Should have 1 AUTO IP addresses with an IP address assigned.")
1638+ self.assertEquals(subnet, observed[0].subnet)
1639+ self.assertTrue(
1640+ IPAddress(observed[0].ip) in (
1641+ IPRange(ngi.static_ip_range_low, ngi.static_ip_range_high)),
1642+ "Assigned IP address %s should be inside the static range "
1643+ "on the cluster (%s - %s)." % (
1644+ observed[0].ip, ngi.static_ip_range_low,
1645+ ngi.static_ip_range_high))
1646+ self.assertThat(
1647+ IPAddress(observed[0].ip), Not(Equals(IPAddress(
1648+ ngi.subnet.gateway_ip))))
1649+
1650+ def test__claim_fails_if_subnet_missing(self):
1651+ from maasserver.dns import config
1652+ self.patch_autospec(interface_module, "update_host_maps")
1653+ self.patch_autospec(config, "dns_update_zones")
1654+ interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1655+ subnet = factory.make_Subnet(vlan=interface.vlan)
1656+ nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1657+ factory.make_NodeGroupInterface(
1658+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS,
1659+ subnet=subnet)
1660+ ip = factory.make_StaticIPAddress(
1661+ alloc_type=IPADDRESS_TYPE.AUTO, ip="",
1662+ subnet=subnet, interface=interface)
1663+ ip.subnet = None
1664+ ip.save()
1665+ maaslog = self.patch_autospec(interface_module, "maaslog")
1666+ with ExpectedException(StaticIPAddressUnavailable):
1667+ interface.claim_auto_ips()
1668+ self.expectThat(maaslog.error, MockCalledOnceWith(
1669+ "Could not find subnet for interface %s." %
1670+ interface.get_log_string()))
1671+
1672+ def test__claim_fails_if_no_static_range(self):
1673+ from maasserver.dns import config
1674+ self.patch_autospec(interface_module, "update_host_maps")
1675+ self.patch_autospec(config, "dns_update_zones")
1676+ interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1677+ subnet = factory.make_Subnet(vlan=interface.vlan)
1678+ nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1679+ ngi = factory.make_NodeGroupInterface(
1680+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS,
1681+ subnet=subnet)
1682+ ngi.static_ip_range_low = ""
1683+ ngi.static_ip_range_high = ""
1684+ ngi.save()
1685+ factory.make_StaticIPAddress(
1686+ alloc_type=IPADDRESS_TYPE.AUTO, ip="",
1687+ subnet=subnet, interface=interface)
1688+ maaslog = self.patch_autospec(interface_module, "maaslog")
1689+ with ExpectedException(StaticIPAddressUnavailable):
1690+ interface.claim_auto_ips()
1691+ self.expectThat(maaslog.error, MockCalledOnceWith(
1692+ "Found matching NodeGroupInterface, but no static range has "
1693+ "been defined for %s. (did you mean to configure DHCP?) " %
1694+ interface.get_log_string()))
1695+>>>>>>> MERGE-SOURCE
1696
1697 def test__calls_update_host_maps(self):
1698 from maasserver.dns import config
1699@@ -2589,67 +2711,131 @@
1700 nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1701 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1702 network_v4 = factory.make_ipv4_network()
1703- subnet_v4 = factory.make_Subnet(cidr=str(network_v4.cidr))
1704- factory.make_NodeGroupInterface(
1705- nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1706- subnet=subnet_v4)
1707- factory.make_StaticIPAddress(
1708- alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1709- subnet=subnet_v4, interface=interface)
1710- network_v6 = factory.make_ipv6_network()
1711- subnet_v6 = factory.make_Subnet(cidr=str(network_v6.cidr))
1712- factory.make_NodeGroupInterface(
1713- nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1714- subnet=subnet_v6)
1715- factory.make_StaticIPAddress(
1716- alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1717- subnet=subnet_v6, interface=interface)
1718-
1719- mock_link_subnet = self.patch_autospec(interface, "link_subnet")
1720- interface.claim_static_ips()
1721- self.assertThat(
1722- mock_link_subnet,
1723- MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4))
1724- self.assertThat(
1725- mock_link_subnet,
1726- MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6))
1727-
1728- def test__without_address_calls_link_subnet_once_per_subnet(self):
1729- nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1730- interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1731- network_v4 = factory.make_ipv4_network()
1732- subnet_v4 = factory.make_Subnet(cidr=str(network_v4.cidr))
1733- factory.make_NodeGroupInterface(
1734- nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1735- subnet=subnet_v4)
1736- factory.make_StaticIPAddress(
1737- alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1738- subnet=subnet_v4, interface=interface)
1739- # Make it have the same subnet twice.
1740- factory.make_StaticIPAddress(
1741- alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1742- subnet=subnet_v4, interface=interface)
1743- network_v6 = factory.make_ipv6_network()
1744- subnet_v6 = factory.make_Subnet(cidr=str(network_v6.cidr))
1745- factory.make_NodeGroupInterface(
1746- nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1747- subnet=subnet_v6)
1748- factory.make_StaticIPAddress(
1749- alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1750- subnet=subnet_v6, interface=interface)
1751- # Make it have the same subnet twice.
1752- factory.make_StaticIPAddress(
1753- alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1754- subnet=subnet_v6, interface=interface)
1755-
1756- mock_link_subnet = self.patch_autospec(interface, "link_subnet")
1757- interface.claim_static_ips()
1758- self.assertThat(
1759- mock_link_subnet,
1760- MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4))
1761- self.assertThat(
1762- mock_link_subnet,
1763- MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6))
1764+<<<<<<< TREE
1765+ subnet_v4 = factory.make_Subnet(cidr=str(network_v4.cidr))
1766+ factory.make_NodeGroupInterface(
1767+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1768+ subnet=subnet_v4)
1769+ factory.make_StaticIPAddress(
1770+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1771+ subnet=subnet_v4, interface=interface)
1772+ network_v6 = factory.make_ipv6_network()
1773+ subnet_v6 = factory.make_Subnet(cidr=str(network_v6.cidr))
1774+ factory.make_NodeGroupInterface(
1775+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1776+ subnet=subnet_v6)
1777+ factory.make_StaticIPAddress(
1778+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1779+ subnet=subnet_v6, interface=interface)
1780+
1781+ mock_link_subnet = self.patch_autospec(interface, "link_subnet")
1782+ interface.claim_static_ips()
1783+ self.assertThat(
1784+ mock_link_subnet,
1785+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4))
1786+ self.assertThat(
1787+ mock_link_subnet,
1788+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6))
1789+
1790+ def test__without_address_calls_link_subnet_once_per_subnet(self):
1791+ nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1792+ interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1793+ network_v4 = factory.make_ipv4_network()
1794+ subnet_v4 = factory.make_Subnet(cidr=str(network_v4.cidr))
1795+ factory.make_NodeGroupInterface(
1796+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1797+ subnet=subnet_v4)
1798+ factory.make_StaticIPAddress(
1799+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1800+ subnet=subnet_v4, interface=interface)
1801+ # Make it have the same subnet twice.
1802+ factory.make_StaticIPAddress(
1803+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1804+ subnet=subnet_v4, interface=interface)
1805+ network_v6 = factory.make_ipv6_network()
1806+ subnet_v6 = factory.make_Subnet(cidr=str(network_v6.cidr))
1807+ factory.make_NodeGroupInterface(
1808+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1809+ subnet=subnet_v6)
1810+ factory.make_StaticIPAddress(
1811+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1812+ subnet=subnet_v6, interface=interface)
1813+ # Make it have the same subnet twice.
1814+ factory.make_StaticIPAddress(
1815+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1816+ subnet=subnet_v6, interface=interface)
1817+
1818+ mock_link_subnet = self.patch_autospec(interface, "link_subnet")
1819+ interface.claim_static_ips()
1820+ self.assertThat(
1821+ mock_link_subnet,
1822+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4))
1823+ self.assertThat(
1824+ mock_link_subnet,
1825+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6))
1826+=======
1827+ subnet_v4 = factory.make_Subnet(cidr=unicode(network_v4.cidr))
1828+ factory.make_NodeGroupInterface(
1829+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1830+ subnet=subnet_v4)
1831+ factory.make_StaticIPAddress(
1832+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1833+ subnet=subnet_v4, interface=interface)
1834+ network_v6 = factory.make_ipv6_network()
1835+ subnet_v6 = factory.make_Subnet(cidr=unicode(network_v6.cidr))
1836+ factory.make_NodeGroupInterface(
1837+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1838+ subnet=subnet_v6)
1839+ factory.make_StaticIPAddress(
1840+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1841+ subnet=subnet_v6, interface=interface)
1842+
1843+ mock_link_subnet = self.patch_autospec(interface, "link_subnet")
1844+ interface.claim_static_ips()
1845+ self.assertThat(
1846+ mock_link_subnet,
1847+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4))
1848+ self.assertThat(
1849+ mock_link_subnet,
1850+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6))
1851+
1852+ def test__without_address_calls_link_subnet_once_per_subnet(self):
1853+ nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1854+ interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1855+ network_v4 = factory.make_ipv4_network()
1856+ subnet_v4 = factory.make_Subnet(cidr=unicode(network_v4.cidr))
1857+ factory.make_NodeGroupInterface(
1858+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1859+ subnet=subnet_v4)
1860+ factory.make_StaticIPAddress(
1861+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1862+ subnet=subnet_v4, interface=interface)
1863+ # Make it have the same subnet twice.
1864+ factory.make_StaticIPAddress(
1865+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1866+ subnet=subnet_v4, interface=interface)
1867+ network_v6 = factory.make_ipv6_network()
1868+ subnet_v6 = factory.make_Subnet(cidr=unicode(network_v6.cidr))
1869+ factory.make_NodeGroupInterface(
1870+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1871+ subnet=subnet_v6)
1872+ factory.make_StaticIPAddress(
1873+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1874+ subnet=subnet_v6, interface=interface)
1875+ # Make it have the same subnet twice.
1876+ factory.make_StaticIPAddress(
1877+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1878+ subnet=subnet_v6, interface=interface)
1879+
1880+ mock_link_subnet = self.patch_autospec(interface, "link_subnet")
1881+ interface.claim_static_ips()
1882+ self.assertThat(
1883+ mock_link_subnet,
1884+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4))
1885+ self.assertThat(
1886+ mock_link_subnet,
1887+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6))
1888+>>>>>>> MERGE-SOURCE
1889
1890 def test__without_address_does_nothing_if_none_managed(self):
1891 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1892@@ -2680,8 +2866,13 @@
1893 StaticIPAddressOutOfRange, interface.claim_static_ips, ip_v6)
1894 self.assertEqual(
1895 "requested_address '%s' is not in a managed subnet for "
1896+<<<<<<< TREE
1897 "interface '%s'." % (ip_v6, interface.name),
1898 str(error))
1899+=======
1900+ "interface '%s'." % (ip_v6, interface.name),
1901+ error.message)
1902+>>>>>>> MERGE-SOURCE
1903
1904 def test__with_address_calls_link_subnet_with_ip_address(self):
1905 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
1906@@ -2731,6 +2922,7 @@
1907 device_interface.claim_static_ips()
1908 self.assertThat(
1909 mock_link_subnet,
1910+<<<<<<< TREE
1911 MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4))
1912 self.assertThat(
1913 mock_link_subnet,
1914@@ -2779,6 +2971,56 @@
1915 self.assertThat(
1916 mock_link_subnet,
1917 MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6))
1918+=======
1919+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4))
1920+ self.assertThat(
1921+ mock_link_subnet,
1922+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6))
1923+
1924+ def test__device_no_address_calls_link_subnet_once_per_subnet(self):
1925+ nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1926+ parent = factory.make_Node()
1927+ parent_nic0 = factory.make_Interface(
1928+ INTERFACE_TYPE.PHYSICAL, node=parent)
1929+ parent_nic1 = factory.make_Interface(
1930+ INTERFACE_TYPE.PHYSICAL, node=parent)
1931+ network_v4 = factory.make_ipv4_network()
1932+ subnet_v4 = factory.make_Subnet(cidr=unicode(network_v4.cidr))
1933+ factory.make_NodeGroupInterface(
1934+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1935+ subnet=subnet_v4)
1936+ factory.make_StaticIPAddress(
1937+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1938+ subnet=subnet_v4, interface=parent_nic0)
1939+ # Make second interface on the parent have the same subnet.
1940+ factory.make_StaticIPAddress(
1941+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1942+ subnet=subnet_v4, interface=parent_nic1)
1943+ network_v6 = factory.make_ipv6_network()
1944+ subnet_v6 = factory.make_Subnet(cidr=unicode(network_v6.cidr))
1945+ factory.make_NodeGroupInterface(
1946+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.DHCP,
1947+ subnet=subnet_v6)
1948+ factory.make_StaticIPAddress(
1949+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1950+ subnet=subnet_v6, interface=parent_nic0)
1951+ # Make second interface on the parent have the same subnet.
1952+ factory.make_StaticIPAddress(
1953+ alloc_type=IPADDRESS_TYPE.DISCOVERED, ip="",
1954+ subnet=subnet_v6, interface=parent_nic1)
1955+ device = factory.make_Device(parent=parent)
1956+ device_interface = factory.make_Interface(
1957+ INTERFACE_TYPE.PHYSICAL, node=device)
1958+
1959+ mock_link_subnet = self.patch_autospec(device_interface, "link_subnet")
1960+ device_interface.claim_static_ips()
1961+ self.assertThat(
1962+ mock_link_subnet,
1963+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v4))
1964+ self.assertThat(
1965+ mock_link_subnet,
1966+ MockAnyCall(INTERFACE_LINK_TYPE.STATIC, subnet_v6))
1967+>>>>>>> MERGE-SOURCE
1968
1969 def test__device_with_address_calls_link_subnet_with_ip_address(self):
1970 parent = factory.make_Node()
1971@@ -2817,6 +3059,7 @@
1972 self.patch_autospec(iface, "link_subnet")
1973 claimed_ips = iface.claim_static_ips()
1974 self.assertThat(claimed_ips, HasLength(1))
1975+<<<<<<< TREE
1976
1977 def test__claim_static_fails_if_parent_subnet_cannot_be_found(self):
1978 from maasserver.dns import config
1979@@ -2842,3 +3085,29 @@
1980 "subnet could be found. (Recommission node '%s' in order for "
1981 "MAAS to discover the subnet.)" %
1982 (interface.get_log_string(), node.hostname)))
1983+=======
1984+
1985+ def test__claim_static_fails_if_parent_subnet_cannot_be_found(self):
1986+ from maasserver.dns import config
1987+ self.patch_autospec(interface_module, "update_host_maps")
1988+ self.patch_autospec(config, "dns_update_zones")
1989+ subnet = factory.make_Subnet()
1990+ nodegroup = factory.make_NodeGroup(status=NODEGROUP_STATUS.ENABLED)
1991+ factory.make_NodeGroupInterface(
1992+ nodegroup, management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED,
1993+ subnet=subnet)
1994+ node = factory.make_Node_with_Interface_on_Subnet(
1995+ subnet=subnet, unmanaged=True, status=NODE_STATUS.READY)
1996+ # Simulate an unmanaged network without association to a subnet.
1997+ # (this could happen after a migration)
1998+ StaticIPAddress.objects.all().delete()
1999+ interface = node.get_boot_interface()
2000+ maaslog = self.patch_autospec(interface_module, "maaslog")
2001+ with ExpectedException(StaticIPAddressExhaustion):
2002+ interface.claim_static_ips()
2003+ self.expectThat(maaslog.warning, MockCalledOnceWith(
2004+ "%s: Attempted to claim a static IP address, but no associated "
2005+ "subnet could be found. (Recommission node '%s' in order for "
2006+ "MAAS to discover the subnet.)" %
2007+ (interface.get_log_string(), node.hostname)))
2008+>>>>>>> MERGE-SOURCE
2009
2010=== modified file 'src/maasserver/models/tests/test_node.py'
2011--- src/maasserver/models/tests/test_node.py 2016-01-08 05:09:21 +0000
2012+++ src/maasserver/models/tests/test_node.py 2016-01-10 08:29:39 +0000
2013@@ -3879,39 +3879,75 @@
2014 node = factory.make_Node(status=NODE_STATUS.ALLOCATED)
2015 self.assertFalse(node.on_network())
2016
2017- def test_storage_layout_issues_is_valid_when_flat(self):
2018- node = factory.make_Node()
2019- self.assertEqual([], node.storage_layout_issues())
2020-
2021- def test_storage_layout_issues_returns_valid_with_boot_and_bcache(self):
2022- node = factory.make_Node(with_boot_disk=False)
2023- boot_partition = factory.make_Partition(node=node)
2024- factory.make_Filesystem(partition=boot_partition, mount_point='/boot')
2025- fs_group = factory.make_FilesystemGroup(
2026- node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE)
2027- bcache = fs_group.virtual_device
2028- factory.make_Filesystem(block_device=bcache, mount_point="/")
2029- self.assertEqual([], node.storage_layout_issues())
2030-
2031- def test_storage_layout_issues_returns_invalid_when_no_disk(self):
2032- node = factory.make_Node(with_boot_disk=False)
2033- self.assertEqual(
2034- ["Specify a storage device to be able to deploy this node.",
2035- "Mount the root '/' filesystem to be able to deploy this node."],
2036- node.storage_layout_issues())
2037-
2038- def test_storage_layout_issues_returns_invalid_when_root_on_bcache(self):
2039- node = factory.make_Node(with_boot_disk=False)
2040- factory.make_Partition(node=node)
2041- fs_group = factory.make_FilesystemGroup(
2042- node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE)
2043- bcache = fs_group.virtual_device
2044- factory.make_Filesystem(block_device=bcache, mount_point="/")
2045- self.assertEqual(
2046- ["This node cannot be deployed because it cannot boot from a "
2047- "bcache volume. Mount /boot on a non-bcache device to be able to "
2048- "deploy this node."], node.storage_layout_issues())
2049-
2050+<<<<<<< TREE
2051+ def test_storage_layout_issues_is_valid_when_flat(self):
2052+ node = factory.make_Node()
2053+ self.assertEqual([], node.storage_layout_issues())
2054+
2055+ def test_storage_layout_issues_returns_valid_with_boot_and_bcache(self):
2056+ node = factory.make_Node(with_boot_disk=False)
2057+ boot_partition = factory.make_Partition(node=node)
2058+ factory.make_Filesystem(partition=boot_partition, mount_point='/boot')
2059+ fs_group = factory.make_FilesystemGroup(
2060+ node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE)
2061+ bcache = fs_group.virtual_device
2062+ factory.make_Filesystem(block_device=bcache, mount_point="/")
2063+ self.assertEqual([], node.storage_layout_issues())
2064+
2065+ def test_storage_layout_issues_returns_invalid_when_no_disk(self):
2066+ node = factory.make_Node(with_boot_disk=False)
2067+ self.assertEqual(
2068+ ["Specify a storage device to be able to deploy this node.",
2069+ "Mount the root '/' filesystem to be able to deploy this node."],
2070+ node.storage_layout_issues())
2071+
2072+ def test_storage_layout_issues_returns_invalid_when_root_on_bcache(self):
2073+ node = factory.make_Node(with_boot_disk=False)
2074+ factory.make_Partition(node=node)
2075+ fs_group = factory.make_FilesystemGroup(
2076+ node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE)
2077+ bcache = fs_group.virtual_device
2078+ factory.make_Filesystem(block_device=bcache, mount_point="/")
2079+ self.assertEqual(
2080+ ["This node cannot be deployed because it cannot boot from a "
2081+ "bcache volume. Mount /boot on a non-bcache device to be able to "
2082+ "deploy this node."], node.storage_layout_issues())
2083+
2084+=======
2085+ def test_storage_layout_issues_is_valid_when_flat(self):
2086+ node = factory.make_Node()
2087+ self.assertEquals([], node.storage_layout_issues())
2088+
2089+ def test_storage_layout_issues_returns_valid_with_boot_and_bcache(self):
2090+ node = factory.make_Node(with_boot_disk=False)
2091+ boot_partition = factory.make_Partition(node=node)
2092+ factory.make_Filesystem(partition=boot_partition, mount_point='/boot')
2093+ fs_group = factory.make_FilesystemGroup(
2094+ node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE)
2095+ bcache = fs_group.virtual_device
2096+ factory.make_Filesystem(block_device=bcache, mount_point="/")
2097+ self.assertEquals([], node.storage_layout_issues())
2098+
2099+ def test_storage_layout_issues_returns_invalid_when_no_disk(self):
2100+ node = factory.make_Node(with_boot_disk=False)
2101+ self.assertEquals(
2102+ ["Specify a storage device to be able to deploy this node.",
2103+ "Mount the root '/' filesystem to be able to deploy this node."],
2104+ node.storage_layout_issues())
2105+
2106+ def test_storage_layout_issues_returns_invalid_when_root_on_bcache(self):
2107+ node = factory.make_Node(with_boot_disk=False)
2108+ factory.make_Partition(node=node)
2109+ fs_group = factory.make_FilesystemGroup(
2110+ node=node, group_type=FILESYSTEM_GROUP_TYPE.BCACHE)
2111+ bcache = fs_group.virtual_device
2112+ factory.make_Filesystem(block_device=bcache, mount_point="/")
2113+ self.assertEquals(
2114+ ["This node cannot be deployed because it cannot boot from a "
2115+ "bcache volume. Mount /boot on a non-bcache device to be able to "
2116+ "deploy this node."], node.storage_layout_issues())
2117+
2118+>>>>>>> MERGE-SOURCE
2119
2120 class TestNode_Stop(MAASServerTestCase):
2121 """Tests for Node.stop()."""
2122
2123=== modified file 'src/maasserver/models/tests/test_nodegroupinterface.py'
2124=== modified file 'src/maasserver/models/tests/test_partition.py'
2125--- src/maasserver/models/tests/test_partition.py 2015-12-01 18:12:59 +0000
2126+++ src/maasserver/models/tests/test_partition.py 2016-01-10 08:29:39 +0000
2127@@ -210,7 +210,11 @@
2128 partition.size = PARTITION_ALIGNMENT_SIZE * 4
2129 partition.size += 1
2130 partition.save()
2131+<<<<<<< TREE
2132 self.assertEqual(PARTITION_ALIGNMENT_SIZE * 4, partition.size)
2133+=======
2134+ self.assertEquals(PARTITION_ALIGNMENT_SIZE * 4, partition.size)
2135+>>>>>>> MERGE-SOURCE
2136
2137 def test_validate_enough_space_for_new_partition(self):
2138 partition_table = factory.make_PartitionTable()
2139
2140=== modified file 'src/maasserver/models/tests/test_partitiontable.py'
2141--- src/maasserver/models/tests/test_partitiontable.py 2015-12-01 18:12:59 +0000
2142+++ src/maasserver/models/tests/test_partitiontable.py 2016-01-10 08:29:39 +0000
2143@@ -35,12 +35,21 @@
2144
2145 def test_get_size_returns_block_device_size_minus_initial_offset(self):
2146 partition_table = factory.make_PartitionTable()
2147+<<<<<<< TREE
2148 self.assertEqual(
2149 round_size_to_nearest_block(
2150 partition_table.block_device.size -
2151 PARTITION_TABLE_EXTRA_SPACE,
2152 PARTITION_ALIGNMENT_SIZE,
2153 False),
2154+=======
2155+ self.assertEquals(
2156+ round_size_to_nearest_block(
2157+ partition_table.block_device.size -
2158+ PARTITION_TABLE_EXTRA_SPACE,
2159+ PARTITION_ALIGNMENT_SIZE,
2160+ False),
2161+>>>>>>> MERGE-SOURCE
2162 partition_table.get_size())
2163
2164 def test_get_block_size_returns_block_device_block_size(self):
2165@@ -120,9 +129,15 @@
2166 size=MIN_PARTITION_SIZE * 3 + PARTITION_TABLE_EXTRA_SPACE,
2167 block_size=block_size)
2168 partition_table = factory.make_PartitionTable(block_device=device)
2169+<<<<<<< TREE
2170 partition_table.add_partition(size=MIN_PARTITION_SIZE)
2171 self.assertEqual(
2172 MIN_PARTITION_SIZE * 2, partition_table.get_available_size())
2173+=======
2174+ partition_table.add_partition(size=MIN_PARTITION_SIZE)
2175+ self.assertEquals(
2176+ MIN_PARTITION_SIZE * 2, partition_table.get_available_size())
2177+>>>>>>> MERGE-SOURCE
2178
2179 def test_get_available_size_skips_partitions(self):
2180 block_size = 4096
2181@@ -134,9 +149,15 @@
2182 partition_table.add_partition(size=MIN_PARTITION_SIZE)
2183 for _ in range(2)
2184 ]
2185+<<<<<<< TREE
2186 partition_table.add_partition(size=MIN_PARTITION_SIZE)
2187 self.assertEqual(
2188 MIN_PARTITION_SIZE * 2,
2189+=======
2190+ partition_table.add_partition(size=MIN_PARTITION_SIZE)
2191+ self.assertEquals(
2192+ MIN_PARTITION_SIZE * 2,
2193+>>>>>>> MERGE-SOURCE
2194 partition_table.get_available_size(
2195 ignore_partitions=ignore_partitions))
2196
2197
2198=== modified file 'src/maasserver/models/tests/test_staticipaddress.py'
2199--- src/maasserver/models/tests/test_staticipaddress.py 2016-01-09 00:48:25 +0000
2200+++ src/maasserver/models/tests/test_staticipaddress.py 2016-01-10 08:29:39 +0000
2201@@ -949,6 +949,29 @@
2202 node.domain)
2203 self.assertEqual({node.fqdn: [boot_sip.ip]}, mapping)
2204
2205+ def test_get_hostname_ip_mapping_prefers_boot_interface_to_alias(self):
2206+ self.patch_autospec(interface_module, "update_host_maps")
2207+ subnet = factory.make_Subnet(
2208+ cidr=unicode(factory.make_ipv4_network().cidr))
2209+ node = factory.make_Node_with_Interface_on_Subnet(
2210+ hostname=factory.make_name('host'), subnet=subnet,
2211+ disable_ipv4=False)
2212+ iface = node.get_boot_interface()
2213+ factory.make_StaticIPAddress(
2214+ alloc_type=IPADDRESS_TYPE.STICKY, interface=iface,
2215+ subnet=subnet)
2216+ new_boot_interface = factory.make_Interface(
2217+ INTERFACE_TYPE.PHYSICAL, node=node)
2218+ node.boot_interface = new_boot_interface
2219+ node.save()
2220+ # IP address should be selected over the other STICKY IP address.
2221+ boot_sip = factory.make_StaticIPAddress(
2222+ alloc_type=IPADDRESS_TYPE.AUTO, interface=new_boot_interface,
2223+ subnet=subnet)
2224+ mapping = StaticIPAddress.objects.get_hostname_ip_mapping(
2225+ node.nodegroup)
2226+ self.assertEqual({node.hostname: [boot_sip.ip]}, mapping)
2227+
2228 def test_get_hostname_ip_mapping_prefers_physical_interfaces_to_vlan(self):
2229 self.patch_autospec(interface_module, "update_host_maps")
2230 subnet = factory.make_Subnet(
2231
2232=== modified file 'src/maasserver/models/tests/test_virtualblockdevice.py'
2233--- src/maasserver/models/tests/test_virtualblockdevice.py 2015-12-01 18:12:59 +0000
2234+++ src/maasserver/models/tests/test_virtualblockdevice.py 2016-01-10 08:29:39 +0000
2235@@ -150,6 +150,7 @@
2236 def test_save_doesnt_overwrite_uuid(self):
2237 uuid = uuid4()
2238 block_device = factory.make_VirtualBlockDevice(uuid=uuid)
2239+<<<<<<< TREE
2240 self.assertEqual('%s' % uuid, block_device.uuid)
2241
2242 def test_get_parents_finds_devices(self):
2243@@ -181,3 +182,36 @@
2244 self.assertItemsEqual(
2245 [fs.block_device_id for fs in volume_group.filesystems.all()],
2246 [parent.id for parent in logical_volume.get_parents()])
2247+=======
2248+ self.assertEquals('%s' % uuid, block_device.uuid)
2249+
2250+ def test_get_parents_finds_devices(self):
2251+ node = factory.make_Node()
2252+ factory.make_FilesystemGroup(
2253+ node=node,
2254+ group_type=factory.pick_enum(
2255+ FILESYSTEM_GROUP_TYPE, but_not=FILESYSTEM_GROUP_TYPE.LVM_VG))
2256+ fs_group_disks = [block_device.blockdevice_ptr
2257+ for block_device in
2258+ node.physicalblockdevice_set.all()
2259+ if not block_device.is_boot_disk()]
2260+ virtualblockdevice = node.virtualblockdevice_set.first()
2261+ self.assertEqual(
2262+ len(fs_group_disks), len(virtualblockdevice.get_parents()))
2263+
2264+ def test_get_parents_handles_cache_set(self):
2265+ # Regression test for lp1519397
2266+ node = factory.make_Node(with_boot_disk=False)
2267+ volume_group = factory.make_VolumeGroup(node=node)
2268+ name = factory.make_name()
2269+ vguuid = "%s" % uuid4()
2270+ size = random.randint(MIN_BLOCK_DEVICE_SIZE, volume_group.get_size())
2271+ logical_volume = volume_group.create_logical_volume(
2272+ name=name, uuid=vguuid, size=size)
2273+ logical_volume = reload_object(logical_volume)
2274+ sdb = factory.make_PhysicalBlockDevice(node=node)
2275+ factory.make_CacheSet(block_device=sdb, node=node)
2276+ self.assertItemsEqual(
2277+ [fs.block_device_id for fs in volume_group.filesystems.all()],
2278+ [parent.id for parent in logical_volume.get_parents()])
2279+>>>>>>> MERGE-SOURCE
2280
2281=== modified file 'src/maasserver/models/virtualblockdevice.py'
2282=== modified file 'src/maasserver/node_constraint_filter_forms.py'
2283=== modified file 'src/maasserver/static/css/maas-styles.css'
2284--- src/maasserver/static/css/maas-styles.css 2015-12-07 17:37:46 +0000
2285+++ src/maasserver/static/css/maas-styles.css 2016-01-10 08:29:39 +0000
2286@@ -1,1 +1,5 @@
2287+<<<<<<< TREE
2288 .fake{display:none}body{font-size:14px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;clear:none;display:inline-block;float:none;margin-right:2.12766%;margin-bottom:20px;position:relative;width:100%}.twelve-col .one-col,.twelve-col .two-col,.twelve-col .three-col,.twelve-col .four-col,.twelve-col .five-col,.twelve-col .six-col,.twelve-col .seven-col,.twelve-col .eight-col,.twelve-col .nine-col,.twelve-col .ten-col,.twelve-col .eleven-col{width:100%}.last-col,.last{margin-right:0}.clearfix:after,.container:after{clear:both;content:"\0020";display:block;height:0;overflow:hidden;visibility:hidden}.clear{clear:both}.clearfix{display:block}@media only screen and (min-width: 768px){body{font-size:15px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col{width:48.8938%;margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}@media only screen and (min-width: 984px){body{font-size:16px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.three-col:nth-child(1):nth-last-child(4),.three-col:nth-child(2):nth-last-child(3),.three-col:nth-child(3):nth-last-child(2),.three-col:nth-child(4):nth-last-child(1){width:23.36%}.three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col:nth-child(1):nth-last-child(4),.twelve-col .three-col:nth-child(2):nth-last-child(3),.twelve-col .three-col:nth-child(3):nth-last-child(2),.twelve-col .three-col:nth-child(4):nth-last-child(1){width:23.3407%}.twelve-col .three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,ol,ul,li,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot");src:url("../fonts/ubuntu-l-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#ubuntulight") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:400;src:local("Ubuntu");src:url("../fonts/ubuntu-r-webfont.eot");src:url("../fonts/ubuntu-r-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#ubunturegular") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot");src:local("Ubuntu Medium"),local("Ubuntu-Medium"),url("../fonts/ubuntu-m-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#ubuntumedium") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot");src:local("Ubuntu Bold"),local("Ubuntu-Bold"),url("../fonts/ubuntu-b-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#ubuntubold") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot");src:local("Ubuntu Light Italic"),local("Ubuntu-LightItalic"),url("../fonts/ubuntu-li-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#ubuntulight_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:local("Ubuntu Italic"),local("Ubuntu-Italic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot");src:local("Ubuntu Medium Italic"),local("Ubuntu-MediumItalic"),url("../fonts/ubuntu-mi-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#ubuntumedium_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:local("Ubuntu Bold Italic"),local("Ubuntu-BoldItalic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}html{font-size:100%}body{color:#333;font-family:Ubuntu, Arial, "libra sans", sans-serif;font-weight:300}blockquote,q{quotes:none}blockquote{margin:28px 20px}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}legend{border:0;*margin-left:-7px}figure{margin:0}abbr,acronym{cursor:help}a:focus{outline:thin dotted}a:hover,a:active{outline:0}a:link,a:visited{color:#dd4814;text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}a.link-arrow:after{content:"\0000a0›"}nav ul li h2 a:after{content:"\0000a0›"}nav ul li a:after,.carousel ul li a:after,ul li p a:after{content:""}ol,ul{margin-left:20px;margin-bottom:20px}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}nav ul,nav ol{list-style:none;list-style-image:none}svg:not(:root){overflow:hidden}img{border:0;height:auto;max-width:100%}img.left{margin-right:20px}img.right{margin-left:20px}.middle img{vertical-align:middle;margin-top:4em}h1,h2,h3,h4,h5,h6{font-weight:300;line-height:1.3}h1{font-size:1.625em;margin-bottom:.5em}h2{font-size:1.438em;margin-bottom:.5em}h3{font-size:1.219em;margin-bottom:.522em}h4{font-size:1.25em;font-weight:400;margin-bottom:.615em}h5{font-size:1em;font-weight:700;margin-bottom:1em}h6{font-size:.723em;font-weight:400;margin-bottom:1em;letter-spacing:.1em;text-transform:uppercase}p,li{font-size:1em;line-height:1.5;margin:0;margin-bottom:.75em;padding:0}h2 span,h1 span{display:block}p+h2,ul+h2,ol+h2,pre+h2{margin-top:0.5625em}header nav a:link{font-weight:normal}p+h3,ul+h3,ol+h3,pre+h3{margin-top:0.78261em}p+h4,ul+h4,ol+h4,pre+h4{margin-top:1.39286em}ol+h2,p+h2,pre+h2,ul+h2{margin-top:.563em}ol+h3,p+h3,pre+h3,ul+h3{margin-top:.783em}ol+h4,p+h4,pre+h4,ul+h4{margin-top:1.219em}li{margin-bottom:.4em}li:last-of-type{margin-bottom:0}ins{background:#fffbeb;text-decoration:none}small,.smaller{font-size:13px}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{vertical-align:text-top}sub{vertical-align:text-bottom}dfn{font-style:italic}mark{background:#ff0;color:#000}code,pre{font-family:"Ubuntu Mono", "Consolas", "Monaco", "Lucida Console", "Courier New", Courier, monospace}pre{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdf6f2;padding:.6em 1em;white-space:pre-wrap;word-wrap:break-word}blockquote{margin:0}blockquote>p{font-size:0.92857em;margin-bottom:0.92308em;font-weight:100;margin:0 0 .4em 0}blockquote small{font-size:.813em;line-height:1.4}button,input,select,textarea{font-family:Ubuntu,Arial,"libra sans",sans-serif;margin:0;vertical-align:baseline;*vertical-align:middle}select{font-size:1em;font-weight:300}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-box-sizing:content-box;-webkit-appearance:none;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-weight:300;outline:none;padding:0.6956522em 0.869565em}input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}form fieldset{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-repeat:no-repeat;background-color:#EFEEEC;background-position:-15px -15px;border:0;margin-bottom:8px;padding:15px 20px}form fieldset h3{border-bottom:1px dotted #dfdcd9;margin-bottom:9px;padding-bottom:10px}form fieldset li:first-child{margin-top:0}form input[type="text"],form input[type="email"],form input[type="tel"],form textarea{-webkit-appearance:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;border:1px solid #999;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0.6956522em 0.869565em}form input:focus,form textarea:focus{border:1px solid #dd4814}form textarea[readonly='readonly']{color:#999}form input[type="checkbox"],form input[type="radio"]{margin:0;width:auto}form input[type="checkbox"]+label,form input[type="radio"]+label{display:inline;margin-left:5px;vertical-align:middle;width:auto}form input[type="submit"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:#dd4814;background-image:-moz-linear-gradient(#f26120, #dd4814);background-image:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#f26120), to(#dd4814));background-image:-webkit-linear-gradient(#f26120, #dd4814);background-image:-o-linear-gradient(#f26120, #dd4814);-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border:0;color:#fff;display:block;padding:10px 14px;text-shadow:none;width:auto;margin-bottom:0}form input[type="submit"]:hover{background:#dd4814}form label{cursor:pointer;display:block;margin-bottom:4px}form label span{color:#df382c}form ul{margin-left:0}form li{list-style:none outside none;margin-top:14px}form button[type="submit"]{border:0;display:inline-block;font-family:Ubuntu, Arial, "libra sans", sans-serif;text-decoration:none;font-weight:300}form input[type="reset"]{display:none}table{border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.85714em 0;width:100%}table th,table td{padding:15px 10px;background:#f0edea;border:1px dotted #888}table td{text-align:center;vertical-align:middle}table thead th{border-collapse:separate;border-spacing:0 10px;background:#fee3d2;color:#333333;font-weight:normal}table tbody th{text-align:left;font-weight:normal;font-weight:300}table th[scope="col"]{text-align:center}table thead th:first-of-type{text-align:left}@media only screen and (max-width: 768px){table{display:block}}@media only screen and (min-width: 984px){form fieldset{padding:15px 20px}img{max-width:none}}.audience-consumer{color:#333}.audience-consumer .row-box,.audience-consumer .main-content{color:#333}.audience-consumer .inner-wrapper{background:#fff}.audience-consumer .quote-right-top{padding:60px 60px 0 40px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat;height:287px;position:absolute;right:-40px;text-align:left;top:-90px;width:31.91489%}.audience-consumer .quote-right-top p{font-size:1.14286em;margin-bottom:0.75em;margin:0.769em;padding-bottom:0;color:#fff}.audience-consumer .quote-right-top p cite{font-size:0.85714em;margin-bottom:1em;color:#fff;padding:0}.audience-consumer .quote-right-top p a,.audience-consumer .quote-right p a{color:#fff}.audience-consumer .quote-right{font-size:1.28571em;margin-bottom:0.66667em;color:#fff;padding:50px 100px 0 50px;text-indent:-6px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;min-height:287px;position:absolute;right:-20px;text-align:left;top:-90px;width:21.2006% em}.audience-consumer .quote-right cite{font-style:normal;margin-left:6px}.audience-consumer .quote-right-alt{background:url(/sites/ubuntu/latest/u/img/patterns/quote-white-br-360x360.png) 0 -100px no-repeat;color:#dd4814;padding:50px 50px 0 50px}.audience-consumer .quote-right-right{background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat}.audience-enterprise h1{margin:0 0 18px 0}.audience-enterprise td{background:#fff}.audience-enterprise th,.audience-enterprise td{padding:6px 10px;background:#fff}.audience-enterprise th[scope="col"]{background:#E2D4DC;color:#772953}.audience-enterprise tbody th[rowspan]{background:#F7F2F6}.audience-enterprise tfoot th[rowspan]{background:#dfdcd9}.audience-enterprise tfoot td,.audience-enterprise tfoot th{font-weight:normal;background:#dfdcd9}.audience-enterprise .inner-wrapper{background:#2c001e;color:#fff}.audience-enterprise .row-box{background:#fff;color:#333}.row-enterprise{background:#772953;color:#fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-enterprise .box,.row-enterprise div{background:#772953;color:#fff}.row-enterprise a{color:#fff}.enterprise-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/enterprise-dot-pattern.png")}.developer-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/developer-dot-pattern.png")}.wrapper,header.banner .nav-primary,nav div.footer-a div,.inline-lists ul,.legal{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:auto}.inner-wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;clear:both;display:block;float:left;width:100%;margin:0;padding-bottom:20px;position:relative;z-index:1}@media only screen and (min-width: 768px){.med-six-col .three-col{width:48%}.med-six-col .three-col:nth-of-type(2n){margin-right:0}}@media only screen and (min-width: 769px){.inner-wrapper{border-radius:4px;padding-bottom:20px}}@media only screen and (min-width: 984px){.wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin:0 auto;position:relative;text-align:left;width:984px}.inner-wrapper{-moz-box-shadow:0 0 3px #c9c9c9;-webkit-box-shadow:0 0 3px #c9c9c9;box-shadow:0 0 3px #c9c9c9;margin:10px 0 30px}.three-col,.med-six-col .three-col{width:23.30%}.three-col.last-col:nth-of-type(2n){margin-right:0}.med-six-col .three-col:nth-of-type(2n){margin-right:20px}.med-six-col .three-col.last-col{margin-right:0}}.left{float:left}.right{float:right}.caps{text-transform:uppercase}img{border:0 none;height:auto;max-width:100%}img.left{margin-right:0}img.touch-border{margin-bottom:-3px}.accessibility-aid,.off-left{position:absolute;left:-999em}a.external{-moz-background-size:0.7em 0.7em;-webkit-background-size:0.7em 0.7em;-o-background-size:0.7em 0.7em;background-size:0.7em 0.7em;padding-right:.9em;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.svg");background-position:right 1px;background-repeat:no-repeat}.opera-mini a.external,.no-svg a.external{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.png")}.text-center,.align-center{text-align:center}.no-margin{margin:0}.no-margin-bottom{margin-bottom:0}.no-padding-bottom{padding-bottom:0}.pull-left-20{margin-left:-20px}.pull-right-20{margin-right:-20px}.pull-left-40{margin-left:-40px}.pull-right-40{margin-right:-41px}.no-border{border:0}.link-top{font-size:1em;margin-bottom:0.85714em;clear:both;margin-bottom:40px;margin-top:-40px}.link-top a{background:#fff;margin-right:10px;margin-top:-17px;padding:5px;float:right}.pull-bottom-right{position:absolute;right:0;bottom:0;left:auto}.box .pull-bottom-right{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0}.pull-bottom-left{margin-left:-20px;margin-bottom:-21px}.pull-top-right{margin-left:-20px;margin-top:-21px}div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:absolute;left:-999em}.priority-0,.not-for-small{position:absolute;left:-999em}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-container+h3,.video-container+.video-title{margin-top:20px}@media only screen and (max-width: 768px){.pull-right-40{margin-right:-30px}.pull-bottom-right,.pull-bottom-left{position:static}img.pull-bottom-left{margin-bottom:0;margin-left:0}}@media only screen and (min-width: 768px){div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:relative;left:auto}.priority-0,.not-for-small{position:relative;left:auto}.for-mobile,.for-small{position:absolute;left:-999em}.pull-right{float:right;margin-right:-30px}img.pull-left{margin-left:-30px}img.touch-border{float:left;margin-bottom:-30px}}@media only screen and (min-width: 769px){img.left{margin-right:20px}}@media only screen and (min-width: 984px){img.touch-border{float:left;margin-bottom:-40px}img.pull-left{margin-left:-40px}.pull-right{float:right;margin-right:-40px}.for-tablet,.for-medium{display:none}.no-border{border:0}}.caps-centered,.muted-heading{font-size:.875em;margin-bottom:20px;text-align:center;text-transform:uppercase}p.intro{font-size:1.14286em;margin-bottom:0.75em;line-height:1.4}.row div p:last-child,.row div ul:last-child{margin-bottom:0}.four-col p:last-child{margin-bottom:0}.note{color:#888;font-size:.813em}@media only screen and (min-width: 768px){p.intro{font-size:1.13333em}}@media only screen and (min-width: 984px){h1{font-size:2.8125em}h2{font-size:2em;margin-bottom:.375em}h3{font-size:1.438em;margin-bottom:.522em}h4{font-size:1em;margin-bottom:.75em}h5{font-size:1em}p,li,code,pre{font-size:16px;line-height:1.5;margin-bottom:.75em}p.intro{font-size:1.25em}}header.banner{border-top:0;min-width:100%;width:auto;background:#dd4814;display:block;position:relative;z-index:2}header.banner .nav-primary{border:0;margin:0 auto;overflow:hidden}header.banner .nav-primary ul{border-right:1px solid #ed6637;float:left;margin:0;position:relative}header.banner .nav-primary ul li{border-left:1px solid #c64012;float:left;list-style-image:none;margin:0;text-indent:0;vertical-align:bottom}header.banner .nav-primary ul li:last-child{border-right:1px solid #c64012}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited{font-size:14px;border-left:1px solid #ec5b29;color:#fff;display:block;margin-bottom:0;padding:14px 14px 13px;position:relative;text-align:center;text-decoration:none;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased}header.banner .nav-primary ul a.active{background:#B83A10;border-left:1px solid #ec5b29}header.banner .nav-primary ul li a:hover{background:#e1662f;border-top:0;-moz-box-shadow:inset 0 2px 2px -2px #777;-webkit-box-shadow:inset 0 2px 2px -2px #777;box-shadow:inset 0 2px 2px -2px #777}#main-navigation-link{display:none}header.banner .nav-toggle{position:absolute;right:0;display:block;width:48px;height:48px;text-indent:-99999px;background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg);-moz-background-size:25px auto;-webkit-background-size:25px auto;-o-background-size:25px auto;background-size:25px auto;background-repeat:no-repeat;background-position:center center;cursor:pointer}header.banner .no-script{display:none}.opera-mini header.banner .nav-toggle,.no-svg header.banner .nav-toggle{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png)}header.banner nav ul{background-color:#f0f0f0;display:none;float:left}header.banner .nav-primary.active{-moz-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);padding:0;border-bottom:1px solid #d4d7d4}header nav ul.active{display:block}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{display:block;padding:0;margin:0;border:none}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:#d0d0d0}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner .nav-primary ul li{border-bottom:1px solid #F2F2F4;font-size:16px}header.banner .nav-primary ul li:last-child{border:0}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:14px 14px 13px;text-align:left}header.banner nav.nav-primary ul.active li ul{display:none}#menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.svg);background-repeat:no-repeat;background-position:50% 26px;content:"";display:block;height:23px;margin-left:0;padding-bottom:17px;position:relative;top:-3px;width:48px;z-index:999}html.no-svg #menu.active:after,.opera-mini #menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.png)}.nav-secondary{border-bottom:1px solid #dfdcd9;margin-bottom:0}.nav-secondary ul{float:left;margin-bottom:10px;margin-left:2px}.nav-secondary ul li{float:left;margin-top:16px;font-size:14px;margin-right:15px}.nav-secondary ul li a:link,.nav-secondary ul li a:visited{color:#333;font-size:14px;float:left}.nav-secondary ul li a:hover,.nav-secondary ul li a:active{color:#dd4814;text-decoration:none}.nav-secondary ul li,.nav-secondary ul li.active a:link,.nav-secondary ul li.active a:visited{color:#dd4814;text-decoration:none}.nav-secondary ul.breadcrumb{margin-left:20px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{color:#888;margin-right:8px}.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#dd4814}header.banner h2{font-size:1.78571em;margin-bottom:0.48em;display:block;left:4px;margin-bottom:0;position:relative;text-transform:lowercase;top:14px}header.banner h2 a:link,header.banner h2 a:visited,header.banner a{color:#fff;float:left;text-decoration:none}header.banner .logo{border-left:0;float:left;height:48px;overflow:hidden}header.banner .logo-ubuntu{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/ubuntu-logo.png") no-repeat scroll 0 10px transparent;font-size:18px;margin-bottom:0;position:relative;text-transform:lowercase;float:left;margin:0;display:inline-block;height:32px;min-width:128px;margin-right:-20px;margin-left:10px;padding:7px 14px 9px 0}header.banner .logo-ubuntu img{margin-right:8px;position:absolute;left:-999em}header.banner .logo-ubuntu span{float:left;font-size:23px;font-weight:300;padding-left:122px;padding-right:20px;position:relative;top:5px}header.banner .nav-primary.nav-left .logo-ubuntu{float:right}header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.svg");background-size:107px 25px;float:left}html.no-svg header.banner .nav-primary.nav-right .logo-ubuntu,.opera-mini header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.png")}@media only screen and (max-width: 295px){header.banner .nav-primary.nav-right .logo-ubuntu,header.banner .logo-ubuntu{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.svg") 0 50% no-repeat;min-width:0;width:38px}header.banner .logo-ubuntu span{padding-left:38px}}html.no-svg header.banner .logo-ubuntu,.opera-mini header.banner .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.png")}@media only screen and (max-width: 768px){header.banner .nav-primary{-moz-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);box-shadow:0 1px 2px 1px rgba(0,0,0,0.2)}header.banner .nav-primary.active{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;padding:0}header nav ul.active{float:left}header nav ul.active li:last-child a:link,header nav ul.active li:last-child a:visited{border-bottom:0}header.banner .nav-primary ul{position:relative;width:100%}header.banner .nav-primary ul li.active a:link,header.banner .nav-primary ul li.active a:visited{color:#333;font-weight:700}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border:none;display:block;font-weight:300;margin:0;padding:0;width:100%}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{background-color:#f0f0f0;border-bottom:1px solid #d4d7d4;color:#333333;font-size:1em}header.banner .nav-primary ul li:nth-last-child(-n+2) a:link,header.banner .nav-primary ul li:nth-last-child(-n+2) a:visited{border:0}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background:#f8f8f8}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:8px 10px;text-align:left}header.banner .nav-primary ul li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border-bottom:0;border-right:1px solid #d4d7d4;float:left;width:50%}.nav-secondary{background:#fff}.nav-secondary ul.second-level-nav{border-top:1px solid #d4d7d4;display:none;margin-bottom:0;margin-left:0;padding-bottom:10px;padding-top:10px;width:100%}.nav-secondary ul.second-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left}.nav-secondary ul.second-level-nav li a,.nav-secondary ul.second-level-nav li a:link,.nav-secondary ul.second-level-nav li a:visited{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;height:100%;padding:10px 10px 10px 20px;width:100%}.nav-secondary ul.second-level-nav li.active a,.nav-secondary ul.second-level-nav li.active a:link,.nav-secondary ul.second-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav{display:none;margin-bottom:0;width:100%;padding-bottom:20px}.nav-secondary ul.third-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left;padding-left:30px}.nav-secondary ul.third-level-nav li a,.nav-secondary ul.third-level-nav li a:link,.nav-secondary ul.third-level-nav li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:10px 10px 10px 0;display:block;width:100%;height:100%}.nav-secondary ul.third-level-nav li.active a,.nav-secondary ul.third-level-nav li.active a:link,.nav-secondary ul.third-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav li.single-link{width:100%}.nav-secondary ul.third-level-nav li:only-child{width:100%}.nav-secondary ul.breadcrumb{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-left:0;margin-bottom:0}.nav-secondary ul.breadcrumb li:first-of-type{border-bottom:1px solid #d4d7d4;margin-bottom:-1px}.nav-secondary ul.breadcrumb li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#fff;width:100%;display:block;height:40px;margin:0}.nav-secondary ul.breadcrumb li a,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:16px;width:100%;color:#333333;display:block;margin-right:0;text-decoration:none;padding:8px 10px 0 10px}.nav-secondary ul.breadcrumb li.active{margin-top:12px}.nav-secondary ul.breadcrumb li.active a,.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.breadcrumb li:nth-of-type(2n){margin-top:12px}.nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.svg);background-position:center center;background-repeat:no-repeat;background-size:18px;float:right;height:18px;margin-right:-5px;margin-top:-6px;padding:10px;position:relative;right:0;top:0;width:18px}.nav-secondary ul.breadcrumb li+li{display:none}.nav-secondary ul.breadcrumb li+li a:link,.nav-secondary ul.breadcrumb li+li a:active,.nav-secondary ul.breadcrumb li+li a:visited{padding-left:20px}.nav-secondary ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li a:after,.nav-secondary.open ul.breadcrumb li a:link:after,.nav-secondary.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg)}.nav-secondary.open ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg);margin-top:-7px}.nav-secondary.open ul.second-level-nav,.nav-secondary.open ul.third-level-nav,.nav-secondary.open ul.breadcrumb li+li{display:block}.no-js .nav-secondary ul.second-level-nav{display:block}.no-js #main-navigation-link{position:absolute;right:10px;top:12px;width:20px;height:28px;z-index:999;text-indent:-999em;display:block}.no-js #main-navigation-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;display:block;width:28px;height:28px;position:absolute}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;display:block;height:48px;position:absolute;right:0;text-indent:-99999px;width:48px}html.no-svg header.banner .nav-toggle,.opera-mini header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png")}}@media only screen and (min-width: 768px){header.banner .nav-primary ul li{border-bottom:0}}@media only screen and (min-width: 769px){header.banner{-moz-box-shadow:0 2px 2px -2px #777777 inset, 2px 1px #FFFFFF;-webkit-box-shadow:0 2px 2px -2px #777777 inset, 2px 1px #FFFFFF;box-shadow:0 2px 2px -2px #777777 inset, 2px 1px #FFFFFF}header.banner nav.nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border-bottom:0}header.banner .nav-toggle{display:none}header.banner nav ul{background-color:transparent;display:block}header.banner .nav-primary ul li{border-left:1px solid #C64012}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:1px solid #EC5B29}header.banner .nav-primary ul li:last-child{border-right:1px solid #C64012;border-left:1px solid #C64012}header.banner .nav-primary ul li a.active{background-color:#B83A10}header.banner .nav-primary ul li a:hover{background-color:#E1662F}.nav-secondary ul:last-child li:last-child{padding-bottom:10px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.second-level-nav li,.nav-secondary ul.third-level-nav li{margin-right:15px}.nav-secondary ul.breadcrumb{float:left}.nav-secondary ul.breadcrumb li{margin-bottom:10px}.nav-secondary ul{float:none;margin-bottom:0}.nav-secondary ul li{margin-bottom:5px}}@media only screen and (min-width: 984px){header.banner{margin-bottom:20px}header.banner nav.nav-primary ul{display:block}header.banner .nav-primary,#nav-global .nav-global-wrapper{width:984px}header.banner .nav-primary.nav-right .logo-ubuntu{margin-left:0}}header.banner .nav-primary ul{position:static}header.banner .nav-primary li ul{-moz-box-shadow:0 2px 2px -1px #777;-webkit-box-shadow:0 2px 2px -1px #777;box-shadow:0 2px 2px -1px #777;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;background:#f7f7f7;border:1px solid #d5d5d5;display:none;float:none;margin:0;padding:5px 0;position:absolute;top:51px;width:200px}header.banner .nav-primary li:hover ul:after{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up-smaller.png") no-repeat;content:'';display:block;height:8px;left:20px;position:relative;top:-13px;width:200px;z-index:999}.no-generatedcontent header.banner .nav-primary li ul{-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;top:48px}header.banner .nav-primary li ul .arrow-up{display:none}header.banner .nav-primary li ul li{border:0;float:none}header.banner .nav-primary li ul li a:link,header.banner .nav-primary li ul li a:visited{border:0;color:#333333;padding:0 0 11px 14px;text-align:left;width:170px}header.banner .nav-primary li ul li a:hover{background:none repeat scroll 0 0 transparent;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#DD4814}header.banner .nav-primary li ul li.first a:link,header.banner .nav-primary li ul li.first a:visited,header.banner .nav-primary li ul li:first-of-type a:link{padding:10px 14px}header.banner .nav-primary li ul li.active a:link,header.banner .nav-primary li ul li.active a:visited{background:none repeat scroll 0 0 transparent !important}header.banner .nav-primary li ul .promo{border-top:1px solid #D5D5D5;float:left;margin-top:5px;padding:15px 0 0}header.banner .nav-primary li ul .promo a:link,header.banner .nav-primary li ul .promo a:visited{background:none repeat scroll 0 0 transparent;border-left:0 none;color:#333333;height:auto;padding:0;text-align:left}header.banner .nav-primary li ul .promo p{margin:0 10px}header.banner .nav-primary li ul .promo a:hover{box-shadow:none;color:#DD4814}header.banner .nav-primary li ul .promo img{margin-top:14px;margin-bottom:-6px;-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;position:relative;top:1px}header.banner .nav-primary li ul .promo .category{color:#888;font-size:11px;margin:0 10px;text-transform:uppercase}header.banner .nav-primary li:hover ul{display:block}html.lt-ie8 header.banner .nav-primary li:hover ul{display:none}.header-search,#box-search{padding:7px 0 7px 14px;overflow:hidden}.header-search input[type="search"],.header-search input[type="text"],#box-search input[type="search"],#box-search input[type="text"]{-webkit-appearance:none;-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;background-color:#be3d00;border:none;color:#fff;display:block;float:left;font-size:16px;height:2.1em;margin-bottom:0;padding:0.5em 2.5em 0.5em 0.5em;width:100%}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-moz-placeholder,#box-search ::-moz-placeholder{color:white;opacity:0.4}.header-search :-ms-input-placeholder,#box-search :-ms-input-placeholder{color:white;opacity:0.4}.header-search input:-moz-placeholder,#box-search input:-moz-placeholder{color:white;opacity:0.4}.header-search ::placeholder,#box-search ::placeholder{color:white;opacity:0.4}.header-search input[type="search"]:focus,#box-search input[type="search"]:focus{background-color:#a63603}.header-search button[type=submit],#box-search button[type=submit]{padding:3px 2px;line-height:0;float:left;margin-left:-40px;display:block;background:none;overflow:visible}.header-search button[type=submit]:hover,#box-search button[type=submit]:hover{background:none}.header-search button[type=submit] img,#box-search button[type=submit] img{height:28px;width:28px}header.banner .search-toggle{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search_icon_white_64.png");background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search.svg");background-position:center center;background-repeat:no-repeat;display:block;height:48px;outline:none;overflow:hidden;position:absolute;right:58px;text-indent:-999em;top:0;width:24px}.search-toggle:link,.search-toggle:active{outline:none}#box-search,.header-search{background:#f0f0f0;border:0;display:none;float:left;margin-bottom:0;position:relative;margin:0 0 -1px 0;padding:0;width:100%;z-index:3}#box-search.active,.header-search.active,.header-search.open{display:block}#box-search div,.header-search div{-moz-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);-webkit-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);background:#f0f0f0;margin:10px;position:relative;z-index:1}#box-search form input[type="search"],.header-search form input[type="search"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;border:0;color:#333;font-size:16px;height:auto;margin:0;float:left;padding:9px 10px;width:100%}.yes-js .header-inner #box-search,.yes-js .header-inner .header-search{display:none}.yes-js .header-inner #box-search form,.yes-js .header-inner .header-search form{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0;margin-right:0;overflow:hidden;padding:10px;top:0;z-index:999;position:relative;width:100%}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}html.no-svg .search-toggle,.opera-mini .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.png")}}@media only screen and (min-width: 768px){header.banner .search-toggle{display:none}}@media only screen and (min-width: 960px){#box-search,.header-search{background:none;overflow:hidden;padding:7px 0 7px 14px;border-right:0 none;float:right;margin-bottom:0;padding-bottom:5px;padding-right:0;padding-top:7px;max-width:220px}#box-search form input[type="text"],#box-search form input[type="search"],.header-search form input[type="text"],.header-search form input[type="search"]{-moz-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-search.png") no-repeat scroll 5px center,none repeat scroll 0 0 #BE3D00;border:6px solid #DE6532;border-width:0 0 1px;color:#fff;font-size:0.813em;height:24px;margin-bottom:0;padding:4px 4px 4px 30px;transition:all 0.5s ease 0s;width:86px}}@media only screen and (max-width: 960px){header.banner nav.nav-primary .header-search{padding:0;position:relative;top:0;width:100%}header.banner nav.nav-primary .header-search input[type="search"]{border-radius:0;background:#f7f7f7;color:#333}header.banner nav.nav-primary .header-search button[type="submit"]{width:32px;height:38px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.svg") no-repeat scroll center center transparent;background-size:28px 28px}header.banner nav.nav-primary .header-search button[type="submit"] img{max-width:none;display:none}header.banner nav.nav-primary .header-search.open{display:block}header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;right:0;display:block;height:48px;position:absolute;text-indent:-99999px;width:48px}html.no-svg header.banner .search-toggle,.opera-mini header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/img/search-white.png")}.opera-mini x:-o-prefocus,.opera-mini header.banner .search-toggle{-o-background-size:25px auto;background-size:25px auto}}@media only screen and (min-width: 984px){#box-search,.header-search{display:block;margin-right:0}#box-search form input[type="text"]:focus,.header-search form input[type="text"]:focus{width:160px}}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}}body.ubuntu-search .nav-secondary,body.search-results .nav-secondary,body.search-no-results .nav-secondary{display:none}body.ubuntu-search section>h1,body.ubuntu-search section article h1,body.search-results section>h1,body.search-results section article h1,body.search-no-results section>h1,body.search-no-results section article h1{padding-bottom:10px;font-size:1.438em;margin-bottom:0}body.ubuntu-search section>h1,body.search-results section>h1,body.search-no-results section>h1{border-bottom:1px dotted #dfdcd9}body.ubuntu-search .main-search,body.search-results .main-search,body.search-no-results .main-search{padding:20px 0;margin:0 0 20px 0;background-color:transparent}body.ubuntu-search .main-search input[type="search"],body.search-results .main-search input[type="search"],body.search-no-results .main-search input[type="search"]{float:left;width:100%;font-size:2em;border:1px solid #999;-moz-box-sizing:border-box;box-sizing:border-box;padding:0.2em 65px 0.2em 0.2em}body.ubuntu-search .main-search button[type=submit],body.search-results .main-search button[type=submit],body.search-no-results .main-search button[type=submit]{padding:4px;line-height:0;float:left;margin-left:-53px;display:block;background:none;overflow:visible;width:auto;margin-top:-4px}body.ubuntu-search .main-search button[type=submit]:hover,body.search-results .main-search button[type=submit]:hover,body.search-no-results .main-search button[type=submit]:hover{background:none}body.ubuntu-search .main-search button[type=submit] img,body.search-results .main-search button[type=submit] img,body.search-no-results .main-search button[type=submit] img{height:45px;width:45px}body.ubuntu-search .search-result h1 .title-main,body.search-results .search-result h1 .title-main,body.search-no-results .search-result h1 .title-main{margin-right:20px}body.ubuntu-search .search-result h1 .result-url,body.search-results .search-result h1 .result-url,body.search-no-results .search-result h1 .result-url{color:#999;overflow:hidden;text-overflow:ellipsis;display:block;vertical-align:bottom;padding-bottom:2px}body.ubuntu-search .search-result h1 .result-url a,body.search-results .search-result h1 .result-url a,body.search-no-results .search-result h1 .result-url a{color:#999}body.ubuntu-search .search-result p,body.search-results .search-result p,body.search-no-results .search-result p{margin-bottom:0}body.ubuntu-search .num-results,body.search-results .num-results,body.search-no-results .num-results{display:inline-block;margin-left:20px}body.ubuntu-search .bottom-results-total,body.search-results .bottom-results-total,body.search-no-results .bottom-results-total{text-align:center;width:100%;overflow:visible;padding-top:20px;margin:0}body.ubuntu-search .bottom-nav,body.search-results .bottom-nav,body.search-no-results .bottom-nav{overflow:hidden;margin-top:-26px}body.ubuntu-search .bottom-nav ul,body.search-results .bottom-nav ul,body.search-no-results .bottom-nav ul{margin-bottom:0;margin-left:0;padding:0;overflow:hidden}body.ubuntu-search .bottom-nav li,body.search-results .bottom-nav li,body.search-no-results .bottom-nav li{float:left;margin-left:15px}body.ubuntu-search .bottom-nav li:first-child,body.search-results .bottom-nav li:first-child,body.search-no-results .bottom-nav li:first-child{margin-left:0}body.ubuntu-search .nav-back,body.search-results .nav-back,body.search-no-results .nav-back{float:left}body.ubuntu-search .nav-back li:before,body.search-results .nav-back li:before,body.search-no-results .nav-back li:before{content:"\2039";color:#dd4814;margin-right:5px}body.ubuntu-search .nav-back li.item-extreme:before,body.search-results .nav-back li.item-extreme:before,body.search-no-results .nav-back li.item-extreme:before{content:"\2039\2039"}body.ubuntu-search .nav-forward,body.search-results .nav-forward,body.search-no-results .nav-forward{float:right}body.ubuntu-search .nav-forward li:after,body.search-results .nav-forward li:after,body.search-no-results .nav-forward li:after{content:"\203A";color:#dd4814;margin-left:5px}body.ubuntu-search .nav-forward li.item-extreme:after,body.search-results .nav-forward li.item-extreme:after,body.search-no-results .nav-forward li.item-extreme:after{content:"\203A\203A"}body.ubuntu-search .error-notification,body.search-results .error-notification,body.search-no-results .error-notification{background-color:#fdffdc;color:#333;padding:20px;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-top:20px;display:block}body.ubuntu-search .result-line,body.search-results .result-line,body.search-no-results .result-line{color:#ada69e}body.ubuntu-search .results-top,body.search-results .results-top,body.search-no-results .results-top{border-bottom:1px dotted #dfdcd9;padding-bottom:0.5em}body.ubuntu-search .search-container,body.search-results .search-container,body.search-no-results .search-container{padding-bottom:0}@media only screen and (min-width: 768px){.ubuntu-search .main-search button[type=submit]{margin-left:-60px;margin-top:0}}body footer.global #nav-global li:first-of-type a{margin-left:0}footer.global{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 2px 2px -1px #d3d3d3;-webkit-box-shadow:inset 0 2px 2px -1px #d3d3d3;box-shadow:inset 0 2px 2px -1px #d3d3d3;background:none;border-top:0;clear:both;display:block;padding:30px 10px 20px;position:relative;width:100%}footer.global .legal{margin:0 auto;width:100%}footer.global .legal{background-image:none;position:relative;clear:both;min-height:40px}footer.global .legal p,footer.global .legal ul{padding-left:0}footer.global h2{font-size:0.75em;line-height:1.4;margin-bottom:0;padding-bottom:0.5em}footer.global h2,footer.global h2 a:link,footer.global h2 a:visited{color:#333;font-weight:normal}footer.global nav ul li h2 a:after{content:""}footer.global ul{margin:0}footer.global nav ul li.two-col{display:inline-block;min-height:10em;vertical-align:top}footer.global nav ul li li{font-size:0.85714em;margin-bottom:1em;font-size:0.75em;margin-bottom:0}footer.global ul li li a:link,footer.global ul li li a:visited{color:#333;margin-bottom:0}footer.global ul li li a:hover,footer.global ul li li a:active,footer.global h2 a:hover,footer.global h2 a:active{color:#dd4814}footer.global .inline li{display:inline}footer.global p,footer.global ul.inline li a{color:#333;font-size:12px;margin-bottom:0}footer.global ul.inline li a:hover{color:#dd4814}footer.global ul.inline li:after{color:#888;content:"\00b7";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:120px}footer.global ul.inline li:last-child:after{content:""}footer.global .inline li{float:none;margin-bottom:0}footer.global .top-link{-moz-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;-webkit-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;background:none repeat scroll 0 0 transparent;border:0 none;float:left;font-size:0.75em;letter-spacing:0.05em;margin:0 0 0 -10px;padding-right:20px;text-transform:uppercase;width:100%}footer.global .top-link a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.svg");background-position:10px center;background-repeat:no-repeat;background-size:14px 14px;border-bottom:0 none;color:#888888;display:block;float:none;font-weight:400;padding:12px 0 12px 28px}html.no-svg footer.global .top-link a,.opera-mini footer.global .top-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.png")}@media only screen and (max-width: 768px){footer.no-global .legal{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;box-shadow:0 2px 2px -1px #D3D3D3 inset;padding-top:10px;margin-left:-10px;padding-left:10px;padding-right:10px}#livechat-eye-catcher{display:block}}@media only screen and (min-width: 768px){footer.global .inline li{display:inline;float:left}}@media only screen and (min-width: 769px){footer.global .top-link{display:none}footer.global .footer-b h2 a i{font-style:normal;display:inline}}@media only screen and (min-width: 984px){footer.global .legal{width:984px}footer.global{padding:30px 0 20px}footer.global .legal{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-grey.png") 100% 0 no-repeat}footer.global .footer-a{display:block}}#context-footer{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1em;margin-bottom:0.85714em;border-bottom:0;clear:both;padding-bottom:1px;padding-top:0;position:relative;margin-bottom:0;margin-left:0;margin-right:0;width:100%}#context-footer hr{-moz-box-shadow:inset 0 2px 2px -2px #333;-webkit-box-shadow:inset 0 2px 2px -2px #333;box-shadow:inset 0 2px 2px -2px #333;background:#dd4814;height:14px;margin:0 0 10px;border:0;clear:both}#context-footer div.twelve-col{display:table;float:none;margin-bottom:7px}#context-footer div div{display:block;padding-left:0;margin-bottom:20px}#context-footer div div div{display:block;padding-left:0;margin-bottom:0}#context-footer div div.feature-one{padding-left:0}#context-footer div div.feature-four{margin-bottom:0;margin-right:0}#context-footer>div{padding-left:10px;padding-right:10px}#context-footer ul{margin-bottom:5px}#context-footer li.active{display:none}#context-footer h3{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}#context-footer .list a:after,#context-footer a.link-arrow:after,#context-footer nav ul li h2 a:after{content:' \203A'}@media only screen and (min-width: 768px){#context-footer{margin-bottom:12px;padding-left:30px;padding-right:30px}#context-footer div+div{width:31%}#context-footer div div.feature-four{padding-bottom:20px}#context-footer hr{margin:0 -30px 40px}#context-footer>div{padding-left:0;padding-right:0}}@media only screen and (min-width: 984px){#context-footer{padding:0 40px 10px}#context-footer div div{display:table-cell;float:none;padding-left:20px;margin-bottom:0}#context-footer hr{margin:0 -40px 40px}}a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#dd4814;color:#fff;text-decoration:none;display:inline-block;margin:0;font-family:Ubuntu, Arial, 'libra sans', sans-serif;font-weight:300;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased;padding:8px 14px;width:100%;text-align:center}a.cta-large,button.cta-large{font-size:1.28571em;margin-bottom:0.66667em;padding:10px 20px}a.link-cta-canonical,button.cta-canonical,form button.cta-canonical[type="submit"],form input.cta-canonical[type="submit"]{background:#772953;color:#fff}a.link-cta-inverted,button.cta-inverted{background:#fff;color:#333}.row-enterprise a.link-cta-canonical,.row-enterprise button.link-cta-canonical{background:#fff;color:#772953}a.link-cta-ubuntu:hover,a.link-cta-ubuntu:hover,button.cta-ubuntu:hover,form button[type="submit"]:hover,form input[type="submit"]:hover{background:#c03f11;text-decoration:none}a.link-cta-canonical:hover,button.cta-canonical:hover{background:#5f2143;text-decoration:none}a.link-cta-inverted:hover,.row-enterprise a.link-cta-canonical:hover,button.cta-inverted:hover,.row-enterprise button.cta-canonical:hover{background:#fff;text-decoration:underline}a.cta-deactivated,a.cta-deactivated:hover,button.cta-deactivated,button.cta-deactivated:hover{background:#efefef;color:#fff;cursor:not-allowed}@media only screen and (min-width: 768px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}@media only screen and (min-width: 984px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}form input,form select,form textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}form .fieldset-submit ul{margin-bottom:0}form fieldset .mktError,form fieldset .errMsg,form fieldset .reqMark{color:#df382c}form fieldset .mktFormMsg{clear:both;display:block}.row{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-bottom:1px dotted #888;clear:both;padding:20px 10px 0;position:relative}.row br{display:none}.row.no-padding-bottom{padding-bottom:0 !important}.row-grey{background:#f7f7f7}.no-border{border:0}#main-content .row-hero{margin-top:20px;padding-top:0}.row-background{color:#fff;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/image-background-wallpaper.jpg") no-repeat scroll 50% 50% #4b1827}.row-background a.alternate{color:#fff;text-decoration:underline}.row-background a.alternate:hover{color:rgba(255,255,255,0.6)}@media only screen and (min-width: 768px){.row-background{background-position:center 50%;background-size:100% auto}}.strip{width:100%;display:block}.strip-dark{background-color:#2c001e;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/background-grid.png");background-repeat:repeat;color:#fff}.strip-dark .list-ubuntu li{border:0}.strip-dark .resource{color:#333;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.strip-dark .resource:before{border-right-color:#2c001e}#main-content .strip-dark .resource:before{border-bottom-width:29px;right:-2px;top:-1px}#main-content .strip-dark .resource:hover:before{border-bottom-width:34px}#main-content .strip-dark .resource h2{padding-right:20px}.row-aux{background-color:rgba(255,255,255,0.6);text-align:center}.row-aux h2,.row-aux p{text-align:left}.row-aux a p{color:#333;margin-bottom:30px}.row-step h2{position:relative;top:5px}.row-step .step{position:relative;top:-5px;height:32px;width:32px;border-radius:50%;border:3px solid #dd4814;color:#dd4814;line-height:32px;text-align:center;background-color:#fff;font-size:23px;font-weight:400}@media only screen and (min-width: 768px){.row{padding:30px}#main-content .row-hero{margin-top:40px}}@media only screen and (min-width: 769px){.row-step .step{height:42px;width:42px;line-height:42px}.row br{display:block}}@media only screen and (min-width: 984px){.row br{display:block}.row{padding:60px 40px 40px}.no-border{border:0}}.box,.box-grey{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:1.333em 20px}.box{background:#fff;border:1px solid #dfdcd9}.box-grey{background:#f7f7f7;color:#333}.box-orange{background:#dd4814;color:#fff}.box-highlight{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;border:1px solid #f7f7f7}.box-textured{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg");border:0}.box-padded{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#efefef;border:0;margin-bottom:20px;padding:6px 5px}.box-padded h3{font-size:1.39286em;margin-bottom:0.61538em;margin-left:5px;margin-top:5px}.box-padded li h3{font-size:1.39286em;margin-bottom:0.61538em;margin:0}.box-padded div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:8px 8px 2px}.box-padded-feature{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/soft-centre-bkg.gif") repeat scroll 0 0 #a09f9f;border:0;margin-bottom:20px;padding:11px 5px 6px}.box-padded-feature h3{color:#fff;margin-left:5px;font-size:1.39286em;margin-bottom:0.61538em}.box-padded-feature h4{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}.box-padded-feature>div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:20px 8px}.box-padded-feature div div{margin-bottom:0}.box-padded-feature .inline-icons{display:table;width:100%;margin:0;text-align:center}.box-padded-feature .inline-icons li{display:table-cell;text-align:left;float:none}.box-padded-feature .one-col{width:48px;float:left}.resource{cursor:pointer;padding-bottom:40px;position:relative;-moz-transition:background .2s ease-out;-webkit-transition:background .2s ease-out;transition:background .2s ease-out}.resource h2{padding-right:20px}.resource.five-col h2 a:link,.resource.five-col h2 a:visited,.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:inherit !important}.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:1.125em}.resource.twelve-col h2 a:link,.resource.twelve-col h2 a:visited{font-size:1.40625em}.resource:hover{background-color:#fafafa}.resource:after{-moz-box-shadow:0 -1px 2px 0 #ddd;-webkit-box-shadow:0 -1px 2px 0 #ddd;box-shadow:0 -1px 2px 0 #ddd;content:'';height:1px;position:absolute;right:-6px;top:14px;-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg);-moz-transition:all .2s ease-out;-webkit-transition:all .2s ease-out;transition:all .2s ease-out;width:41px;z-index:2}.resource:hover:after{right:-9px;top:18px;width:48px}.resource:before{content:'';position:absolute;-moz-transition:border-width .2s ease-out;-webkit-transition:border-width .2s ease-out;transition:border-width .2s ease-out;top:-2px;right:-3px;width:0;height:0;border-bottom:30px solid #fdfdfd;border-right:30px solid #fff;-webkit-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);-moz-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);box-shadow:-2px 2px 2px rgba(176,176,176,0.4);z-index:2;-webkit-border-radius:0 0 0 0;-moz-border-radius:0 0 0 0;border-radius:0 0 0 0}.resource:hover:before{border-bottom-width:35px;border-right-width:35px}.resource:last-of-type{margin-bottom:30px}.resource .content-cat{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-icon-document.png") left center no-repeat;color:#aea79f;font-size:14px;letter-spacing:1px;margin:0;padding-left:20px;padding:0;position:absolute;text-transform:uppercase}.resource .content-cat-webinar{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-webinar.png") left center no-repeat}.resource.box-image-centered div+span img{margin-top:40px}html.yui3-js-enabled .resource:hover a{text-decoration:underline}.row-grey .resource:before{border-right-color:#f7f7f7}@media only screen and (max-width: 768px){.box-padded-feature .inline-icons li{float:left;display:block}.box-padded-feature .one-col{width:48px;float:left}}.arrow-up,.arrow-down,.arrow-right,.arrow-left{height:11px;position:absolute;width:18px}.arrow-up{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up.png") 0 0 no-repeat;left:20px;top:-11px}.arrow-down{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-down.png") 0 0 no-repeat;bottom:-11px;right:20px}.arrow-right{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-right.png") 0 0 no-repeat;height:18px;right:-11px;top:20px;width:11px}.arrow-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-left.png") 0 0 no-repeat;bottom:20px;height:18px;left:-11px;width:11px}div>.arrow-left{left:-10px}@media only screen and (min-width: 769px){html.yui3-js-enabled .arrow{visibility:visible}}.list,.list-ubuntu,.list-canonical{list-style:none;margin-left:0}.list li,.list-ubuntu li,.list-canonical li{border-bottom:1px dotted #888;margin-bottom:0;padding:10px 0}.list li:last-of-type,.list li.last-item,.list-ubuntu li:last-of-type,.list-ubuntu li.last-item,.list-canonical li:last-of-type,.list-canonical li.last-item{border:0;padding-bottom:0}.list article{border-bottom:1px dotted #888;margin-bottom:0;padding:10px 0}.list-spaced article,.list-spaced li{padding:30px 0}nav .list a{display:block}.list-ubuntu li,.list-canonical li{background-repeat:no-repeat;background-position:0 1em;padding-left:25px}.list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.svg")}.list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.svg")}.list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.svg")}.list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.svg")}.vertical-divider .list-canonical li,.vertical-divider .list-ubuntu li{padding-left:25px}html.no-svg .list-ubuntu li,.opera-mini .list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.png")}html.no-svg .list-canonical li,.opera-mini .list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.png")}html.no-svg .list-warm li,.opera-mini .list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.png")}html.no-svg .list-dark li,.opera-mini .list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.png")}.no-bullets{list-style:none;margin-left:0}.row .combined-list ul,.row .combined-list div{margin-bottom:0}.row .combined-list li.last-item{border-bottom:1px dotted #888;padding-bottom:10px}.row .combined-list div.last-col,.row .combined-list ul.last-col{margin-bottom:20px}.row .combined-list div.last-col li.last-item,.row .combined-list ul.last-col li.last-item{border-bottom:0;padding-bottom:0}.inline{margin-left:0}.inline li{display:inline;list-style:none;margin-left:0;float:left}@media only screen and (min-width: 768px){.row .combined-list ul,.row .combined-list div{margin-bottom:20px}.row .combined-list li.last-item{border-bottom:0;padding-bottom:0}}ul.inline-logos{float:left;margin-left:0;padding:0;text-align:center;width:100%}ul.inline-logos li{clear:none;display:inline-block;float:none;margin:10px 20px;padding:0}ul.inline-logos li.clear-row{clear:left}ul.inline-logos li.last-item{border:0}ul.inline-logos img{-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;vertical-align:middle;max-width:115px;max-height:32px}.inline-icons{margin:0 0 20px}.inline-icons li{margin-right:20px;margin-bottom:20px;text-align:left;display:inline-block}.inline-icons li.last-item{margin-right:0}.inline-icons.no-margin-bottom li{margin-bottom:0}.inline-icons img{vertical-align:middle;max-width:115px;max-height:32px}@media only screen and (max-width: 768px){ul.inline-logos img{max-width:172px;max-height:48px}}@media only screen and (min-width: 769px){ul.inline-logos li{clear:none;display:inline-block;height:auto;margin:20px 0;line-height:60px;padding:0 40px}ul.inline-logos li img{float:none;vertical-align:middle;max-width:200px;max-height:45px}}@media only screen and (min-width: 984px){.inline-icons{text-align:left;margin-bottom:20px}}blockquote.pull-quote{text-indent:0}blockquote.pull-quote p{color:#333;padding-left:10px;padding-right:10px;font-size:1.77379em;margin-bottom:0.48323em;text-indent:-.4em;margin-left:.4em;line-height:1.3}blockquote.pull-quote p span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}blockquote.pull-quote p span+span{left:5px}blockquote.pull-quote p cite{margin:10px 0 0;font-weight:300;display:block;font-size:.75em;text-indent:0}blockquote.pull-quote.js{padding-left:60px;display:table-cell}blockquote.quote-canonical,blockquote.quote-canonical-white{font-size:1.14286em;margin-bottom:0.75em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-white-360x360.png") no-repeat 20px -130px;color:#772953;float:right;font-size:1em;height:215px;margin-top:0;padding:20px 60px 0;position:relative;width:236px}blockquote.quote-canonical-white{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-aubergine-345x345.png") no-repeat 0 0;color:#fff;padding:80px 60px 0;height:265px}blockquote.quote p:first-child{font-size:1.28571em;margin-bottom:0.66667em;line-height:1.3;text-indent:-7px}blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.svg");background-repeat:no-repeat;background-size:287px 286px;color:#fff;height:167px;padding:60px 40px;position:static;right:-40px;top:-90px;width:207px}blockquote.quote-right-bottom p{color:#fff}blockquote.quote-grey{font-size:2.57143em;margin-bottom:0.33333em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-grey-br-211x211.png") no-repeat scroll 0 0 transparent;color:#fff;height:152px;line-height:40px;margin-left:20px;padding:60px 0 0;text-align:center;width:211px}blockquote.quote-bottom-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;color:#fff;height:167px;padding:55px 40px 70px 45px;width:225px}html.no-svg blockquote.quote-right-bottom,.opera-mini blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.png")}.row-quote{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-quote blockquote{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;margin:0;padding:0}.row-quote blockquote p{margin-bottom:.75em;line-height:1.3;color:#333;padding-left:10px;padding-right:10px;text-indent:0}.row-quote blockquote span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}.row-quote blockquote span+span{left:5px}.row-quote blockquote cite{color:#333;font-style:normal;margin-bottom:0;font-size:.75em;text-indent:-14px;text-indent:0}.row-quote .quote-twitter{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-115x139.png") 20px bottom no-repeat;padding:20px 20px 20px 23.40425%}.row-quote .quote-twitter-small{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-54x63.png") 99% bottom no-repeat;padding:20px 20px 20px 80px}.row-quote .quote-twitter-small p{margin:0;padding:0}blockquote.quote-canonical,blockquote.quote-canonical-white{background:none;color:#333;width:auto;height:auto;padding:0 30px;margin-top:20px}@media only screen and (min-width: 768px){.row-quote blockquote{text-indent:-7px}.pull-quote{text-indent:-.4em}.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em}blockquote.pull-quote p,.row-quote blockquote p{padding-left:0;padding-right:0;text-indent:-.7em}blockquote.pull-quote p span,.row-quote blockquote p span{font-size:1.391304348em}blockquote.pull-quote p cite,.row-quote blockquote p cite{margin-left:0;text-indent:0}blockquote.pull-quote p span,.row-quote blockquote p span{top:5px}}@media only screen and (min-width: 769px){.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em;text-indent:-.4em}}@media only screen and (min-width: 984px){.row-quote blockquote{padding:0 80px 20px;text-indent:-10px}blockquote.pull-quote p span,.row-quote blockquote p span{top:10px}}html.js .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:auto;padding-bottom:.6em;padding-right:20px}html.yui3-js-enabled .tabbed-menu{display:none;padding-bottom:20px;padding-top:20px}html.yui3-js-enabled .arrow{display:none;position:absolute;visibility:hidden}html.yui3-js-enabled .tabbed-content{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:8px 8px 0;background:#f7f7f7;margin-bottom:8px}html.yui3-js-enabled .tabbed-content.hide{display:block;opacity:1 !important}html.yui3-js-enabled .tabbed-content .title{display:none}html.yui3-js-enabled .tabbed-content div{display:none}html.yui3-js-enabled .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-down.svg") no-repeat scroll right 3px #f7f7f7;color:#333;display:block;font-size:16px;padding-bottom:.6em;padding-right:20px;width:100%}html.yui3-js-enabled .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.svg");margin-bottom:10px}html.yui3-js-enabled .tabbed-content.open div{display:block}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-right.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content.open .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content .accordion-button{background-image:none;margin-bottom:10px}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content div{display:block}@media only screen and (min-width: 768px){html.yui3-js-enabled .tabbed-menu{display:block}html.yui3-js-enabled .tabbed-content{margin-bottom:20px;padding:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0 !important}html.yui3-js-enabled .tabbed-content .title{display:block}html.yui3-js-enabled .tabbed-content div{display:block}html.yui3-js-enabled .tabbed-content .vertical-divider div{display:table-cell}html.yui3-js-enabled .tabbed-content .accordion-button{display:none}}html.yui3-js-enabled .accordion-button.active{background-color:transparent}@media only screen and (min-width: 768px){.tabbed-menu{-moz-box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-shadow:0 -1px 10px #cfcfcf inset;box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;background:none repeat scroll 0 0 #f7f7f7;padding-bottom:20px;padding-top:20px;position:relative}.tabbed-menu ul{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;margin-bottom:0;padding:0;position:relative;table-layout:fixed;width:100%}.tabbed-menu li{text-align:center;display:table-cell}.tabbed-menu a{color:#666;display:block;outline:none}.tabbed-menu a .active{color:#772953;text-decoration:none}.tabbed-menu a:hover{text-decoration:none}.tabbed-menu .arrow{bottom:0;position:absolute}.tabbed-content{*zoom:1;padding:20px 40px 0}.tabbed-content:before,.tabbed-content:after{content:"";display:table}.tabbed-content:after{clear:both}.tabbed-content .row{padding-left:0;padding-right:0}.tabbed-content .main-content{padding-bottom:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0}.tabbed-content-bg{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin-left:20px;margin-right:20px}.tabbed-content-bg .row-box{padding-left:0;padding-right:0}html.yui3-js-enabled .arrow{visibility:visible}}.row.vertical-divider{padding-bottom:40px}.vertical-divider div,.vertical-divider li{border-right:0;display:block;padding-left:0;padding-right:0}.vertical-divider-full{padding-bottom:0}.vertical-divider-full>div{padding-bottom:40px}.row.vertical-divider-full{padding-bottom:0}@media only screen and (max-width: 767px){.vertical-divider>div,.vertical-divider>li{border-bottom:1px dotted #888;padding-bottom:20px}.vertical-divider div:last-of-type,.vertical-divider li:last-of-type,.inline-icons li:last-of-type{border-bottom:0;padding-bottom:5px}.row.vertical-divider{padding-bottom:0}.equal-height div,.equal-height li{height:auto !important}}@media only screen and (min-width: 984px){.row.vertical-divider{padding-bottom:60px}.vertical-divider>div,.vertical-divider>li{border-right:1px dotted #888;display:table-cell;float:none;margin-right:0;padding-left:20px;padding-right:20px;vertical-align:top}.vertical-divider>div:last-child,.vertical-divider>li:last-child,.vertical-divider>div.last-col,.vertical-divider>li.last-col,.vertical-divider>div:last-of-type,.vertical-divider>li:last-of-type{border-right:0;padding-right:0}.vertical-divider>div:first-child,.vertical-divider>li:first-child,.vertical-divider>div.first-col,.vertical-divider>li.first-col,.vertical-divider>div:first-of-type,.vertical-divider>li:first-of-type{padding-left:0}}.slider{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#f7f7f7;padding-top:40px}.slider .slide-window{overflow:hidden;position:relative;height:450px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s}.slider .slide-container{position:absolute;width:2800 px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s;left:0}.slider .slider-dots ul{position:absolute;top:550px;left:220px;z-index:5}.slider .slider-dots li{background-position:0 -8px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/sprite-pager.png") no-repeat;float:left;height:7px;list-style-type:none;margin-right:.75em;text-indent:-9999em;width:7px}.slider .slider-dots li.active{background-position:0 0}.slider .slider-dots a{display:block;outline:0}.slider .slide{float:right;width:700px}.slider .slide h3{margin-top:65px;display:inline-block}.slider .slide p{width:350px}.slider .arrow-prev,.slider .arrow-next{font-size:5em;margin-top:150px;display:block;color:#888;outline:0}.slider .arrow-prev:hover,.slider .arrow-next:hover{text-decoration:none;color:#333}.slider .arrow-prev:active,.slider .arrow-next:active{padding-top:1px;text-decoration:none}.slider .arrow-prev:focus,.slider .arrow-next:focus{text-decoration:none}.yui3-tooltip-hidden{display:none}.yui3-tooltip-content{-moz-box-shadow:0 2px 8px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 8px rgba(0,0,0,0.2);box-shadow:0 2px 8px rgba(0,0,0,0.2);background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg") repeat scroll 0 0 transparent;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #e3e3e3;color:#333;margin-top:-30px;max-width:520px;position:relative}.yui3-tooltip .yui3-widget-bd{padding:20px;width:320px}.yui3-tooltip .yui3-widget-bd *{max-width:100%}.yui3-tooltip .yui3-widget-bd h5{margin-bottom:10px;font-size:22px;font-weight:300}.yui3-tooltip .yui3-widget-bd img{float:left;margin-right:10px}.yui3-tooltip .yui3-widget-bd q{border-bottom:1px dotted #888;border-top:1px dotted #888;display:block;font-size:16px;font-style:italic;margin-bottom:0;margin-top:20px;padding:10px 0}.yui3-tooltip .yui3-widget-bd p:last-child{margin-bottom:0}.yui3-tooltip .yui3-widget-ft,.yui3-tooltip .yui3-widget-ft div{position:absolute;width:0;height:0;border-style:solid;line-height:0;font-size:0}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft,.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:-10px;left:50%;margin:0 0 0 -10px;border-width:0 10px 10px;border-color:#efefef transparent}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:0;border-color:#efefef transparent}.tooltip-label{-moz-box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-box-shadow:3px 3px 6px rgba(0,0,0,0.3);box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;border:1px solid #dfdcd9;display:none;font-size:13px;line-height:1;margin:0;padding:6px 5px;position:absolute;top:-20px;white-space:nowrap;z-index:1000}body,a:link,a:visited{-webkit-font-smoothing:antialiased}code,pre,p{line-height:1.5}body{font-size:16px}@media only screen and (min-width: 768px){code,pre,p{line-height:1.6}body{font-size:16px}}@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi){body{font-size:18px}}.not-for-medium{display:none}@media only screen and (min-width: 985px){.not-for-medium{display:block}}header.banner{background:#000;-moz-box-shadow:inset 0 2px 2px -2px #000;-webkit-box-shadow:inset 0 2px 2px -2px #000;box-shadow:inset 0 2px 2px -2px #000;margin-bottom:0}header.banner .nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;*zoom:1}header.banner .nav-primary:before,header.banner .nav-primary:after{content:"";display:table}header.banner .nav-primary:after{clear:both}header.banner nav.nav-primary{border-bottom:1px solid #262626;overflow:visible}header.banner nav.nav-primary .user-nav{float:right;margin-right:20px}header.banner nav.nav-primary .user-dropdown:hover ul:after{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img{margin-right:10px}header.banner nav.nav-primary .user-dropdown .menu-link img.hover{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img.normal{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.hover,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.hover{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.normal,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.normal{display:none}header.banner nav.nav-primary .user-dropdown ul{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;margin-top:-2px;background-color:#fff;border-width:0}header.banner nav.nav-primary .user-dropdown ul a:hover{background-color:transparent}header.banner nav.nav-primary #user-dropdown .dropdown ul{width:auto}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:73px 30px;-webkit-background-size:73px 30px;-o-background-size:73px 30px;background-size:73px 30px;background-image:url(../img/logos/logo.svg);background-position:20px;background-repeat:no-repeat;min-width:120px;padding-top:6px;margin-left:0}body.no-svg header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url(../img/logos/logo.png)}input[type=text]::-ms-reveal,input[type=text]::-ms-clear{display:none;width:0;height:0}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-results-button,input[type="search"]::-webkit-search-results-decoration{display:none}.contextual-bar{overflow:hidden;background-color:#fff;border-bottom:1px solid #d4d4d4}form.search-form{overflow:hidden;float:right;width:100%;position:relative}form.search-form input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:0;border-left:0;margin:0;width:100%;height:50px;float:left;font-size:1em;padding-top:0;padding-bottom:0;padding-right:30px;background-color:transparent;-webkit-appearance:none}form.search-form input:focus{border-color:#dd4814}form.search-form button[type=submit],form.search-form button[type=submit]:hover{position:absolute;top:10px;right:10px;display:block;height:30px;width:30px;padding:0;line-height:0;-webkit-appearance:none;background:transparent}form.search-form button img{height:16px}.contextual-nav{border:0;display:block;margin:0;padding-left:10px;background-color:transparent;overflow:hidden;float:left}.contextual-nav li,.contextual-nav li:last-child{font-size:0.875em;float:left;list-style-type:none;margin:0;margin-left:5px}.contextual-nav li a:link,.contextual-nav li a:visited,.contextual-nav .contextual-nav__label{display:block;color:#333;font-weight:300;text-align:center;padding:16px 10px 10px 10px;border-bottom:3px solid transparent}.contextual-nav .contextual-nav__label{color:#cdcdcd}.contextual-nav li a:hover{border-bottom-color:#dd4814;text-decoration:none;color:#dd4814}.contextual-nav li a.active{border-bottom:3px solid #dd4814}.opera-mini header.banner .logo-ubuntu,.no-svg header.banner .logo-ubuntu{background-image:url(../img/logos/logo.png)}@media only screen and (min-width: 769px){header.banner .nav-primary ul li,header.banner .nav-primary ul li:last-child{border-bottom:0;width:auto}header.banner nav.nav-primary li a:link,header.banner nav.nav-primary li a:visited{border-left:1px solid #262626;font-weight:400}header.banner nav.nav-primary ul li a.active{padding-bottom:10px;background-color:#0e0c0b;border-bottom:3px solid #dd4814;border-left:1px solid #262626}header.banner nav.nav-primary ul li{border-left:1px solid #262626}header.banner nav.nav-primary ul li a:hover{background-color:#dd4814}header.banner nav.nav-primary ul{background-color:transparent;border-right:1px solid #262626;display:block}header.banner nav.nav-primary ul li:last-child{border-left:1px solid #262626;border-right:0}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:0}header.banner .nav-primary ul li a.external:hover{background-image:url("../img/icons/external-link-grey.png")}form.search-form{width:325px}form.search-form input{border-left:1px solid #d4d4d4;margin:0 20px;width:250px;font-size:0.875em}}@media only screen and (min-width: 1030px){header.banner{height:48px;overflow:hidden}header.banner .nav-primary{width:100%}}body{background-repeat:repeat}.row{border:0;background-color:rgba(255,255,255,0.6)}@media only screen and (min-width: 769px){.append-one{margin-right:10.6%}.row{padding:50px 40px 30px}}.inner-wrapper{*zoom:1;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:transparent;background-image:none;margin:0 auto;padding-bottom:0;float:none}.inner-wrapper:before,.inner-wrapper:after{content:"";display:table}.inner-wrapper:after{clear:both}.wrapper{position:static;background:transparent;width:100%;overflow:hidden}img.touch-border{margin-bottom:-50px}.inner-wrapper,footer.global .legal{max-width:1030px;width:auto;padding-left:0;padding-right:0}.touch-top{margin-top:-50px}@media only screen and (max-width: 1030px){.inner-wrapper,footer.global .legal{padding-left:8px;padding-right:8px;width:auto}}.footer-cta{background:#fff;padding-bottom:20px}.footer-wrapper.strip-light{background-color:#fff}.solutions-cta{height:60px;background-color:#dd4814;line-height:60px;text-align:center}.solutions-cta a{color:#fff;font-size:1.25em}footer.global{background-color:white;box-shadow:none;padding-top:0}footer.global .row{padding:10px 0 0}footer.global .two-col{width:46%;float:left;display:inline-block;min-height:200px}footer.global h2{padding-bottom:0;color:#888;font-size:16px}footer.global nav .canonlist ul li,footer.global nav .additional-info ul li{min-height:0;width:48%;float:left}footer.global ul.bullets li:after{line-height:1;color:#888;content:"•";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:auto}footer.global a.external{background-image:url("../img/icons/external-link-dark.png")}footer.global .top-link{margin-bottom:10px}footer.global a{color:#333}footer.global a:hover{color:#dd4814}footer.global .legal{background-image:none}footer.global .legal.has-cookie{padding-bottom:70px}footer.global .inner-wrapper{overflow:visible}footer.global a.link-cta-positive,footer.global a.link-cta-negative{width:auto;margin-top:10px;padding-left:20px;padding-right:20px;color:#fff;font-size:14px}footer.global .section__title{background:none;cursor:default}.legal-inner{clear:both;overflow:hidden;float:left;width:100%;padding:20px 10px 0;margin:-3px -10px 0}.social,.social--right{margin-left:0}.social .social__item,.social--right .social__item{display:inline;float:left;padding-right:1em}.social .social__google,.social .social__facebook,.social .social__twitter,.social--right .social__google,.social--right .social__facebook,.social--right .social__twitter{background-image:url("../img/icons/icon-social.png");display:block;width:45px;height:44px}.social .social__google.social__twitter:hover,.social .social__facebook.social__twitter:hover,.social .social__twitter.social__twitter:hover,.social--right .social__google.social__twitter:hover,.social--right .social__facebook.social__twitter:hover,.social--right .social__twitter.social__twitter:hover{background-position:0 -45px}.social .social__google.social__facebook,.social .social__facebook.social__facebook,.social .social__twitter.social__facebook,.social--right .social__google.social__facebook,.social--right .social__facebook.social__facebook,.social--right .social__twitter.social__facebook{background-position:90px 0}.social .social__google.social__facebook:hover,.social .social__facebook.social__facebook:hover,.social .social__twitter.social__facebook:hover,.social--right .social__google.social__facebook:hover,.social--right .social__facebook.social__facebook:hover,.social--right .social__twitter.social__facebook:hover{background-position:90px -45px}.social .social__google.social__google,.social .social__facebook.social__google,.social .social__twitter.social__google,.social--right .social__google.social__google,.social--right .social__facebook.social__google,.social--right .social__twitter.social__google{background-position:135px 0}.social .social__google.social__google:hover,.social .social__facebook.social__google:hover,.social .social__twitter.social__google:hover,.social--right .social__google.social__google:hover,.social--right .social__facebook.social__google:hover,.social--right .social__twitter.social__google:hover{background-position:135px -45px}@media only screen and (min-width: 768px){.social--right{float:right}}#additional-info{border-bottom:0}#additional-info h2:before{background-image:url("../img/icons/external-link-grey.svg"),none;background-repeat:no-repeat;background-size:14px 14px;content:"";display:inline-block;height:15px;margin-right:3px;position:relative;top:3px;width:15px}#additional-info div li{border-left:1px solid #d4d7d4;box-sizing:border-box;display:block;float:left;margin:0;padding:0;width:50%}#additional-info div li a{border-bottom:1px solid #d4d7d4;box-sizing:border-box;color:#333333;display:block;float:left;margin:0;overflow:hidden;padding:8px 10px;text-align:left;white-space:normal;width:100%}#additional-info .section__title{border-bottom:1px solid #d4d7d4;background-position:100% .1em}html.opera-mini footer #nav-global h2:before,html.opera-mini footer #additional-info h2:before,html.no-svg footer #nav-global h2:before,html.no-svg footer #additional-info h2:before{background-image:url("../img/icons/external-link-grey.png")}@media only screen and (min-width: 769px){.footer-wrapper.strip-light{white-space:nowrap}footer.global{padding-top:40px;padding-bottom:40px}footer.global .two-col{width:14.89361%;display:inline-block;min-height:0}footer.global .section{min-height:160px;margin-right:40px;padding-bottom:0;border-right:1px dotted #aaa;border-bottom:0}footer.global .section:last-child{margin-right:0;border-right:0}footer.global li{display:inline;float:left}footer.global ul.no-bullets li{border-right:1px dotted #aaa;padding-right:15px;padding-left:15px}footer.global ul.no-bullets li a{font-size:16px}footer.global ul.no-bullets li a:hover{color:#dd4814}footer.global ul.no-bullets li:last-child{border-right:none}footer.global ul.no-bullets li:first-child{padding-left:0px}#additional-info .section__title{border-bottom:0}#additional-info div li,#additional-info div a:link{width:100%;border:0}}.actions .actions__social-item--twitter,.actions .actions__social-item--google-plus{text-indent:-99999px;background-image:url("../img/icons/icon-social.svg");background-repeat:no-repeat;height:44px;width:44px;overflow:hidden;display:block}.actions .actions__social-item--twitter{background-position:0 0}.actions .actions__social-item--twitter:hover{background-position:0 -45px}.actions .actions__social-item--google-plus{background-position:-45px 0}.actions .actions__social-item--google-plus:hover{background-position:-45px -45px}.anchor{display:inline-block;margin-left:3px;opacity:.0;position:relative;top:1px;width:1em;height:1em;background:url("../img/icons/anchor_16.svg") 0 80% no-repeat;background-size:16px;-moz-transition:opacity .1s;-webkit-transition:opacity .1s;transition:opacity .1s}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,dt:hover .anchor,li:hover .anchor{opacity:1}.box{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;display:block;margin-bottom:0;border-top:0;border-left:0;border-right:0;padding-left:0;padding-right:0}.box-dim{background-color:#fafafa}@media only screen and (min-width: 768px){.box{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);-webkit-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);display:inline-block;margin-bottom:20px;padding-left:20px;padding-right:20px;border:0}}a.indent{-moz-box-shadow:inset 0 1px 2px 0 #333;-webkit-box-shadow:inset 0 1px 2px 0 #333;box-shadow:inset 0 1px 2px 0 #333;background:rgba(0,0,0,0.1);padding:10px 30px;text-weight:normal}a.indent:hover{background:rgba(0,0,0,0.2)}a.link-cta-positive,a.link-cta-negative{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#dd4814;color:#fff;display:inline-block;font-size:1.14286em;font-weight:300;text-decoration:none;margin:0;padding:8px 14px;text-align:center;-moz-transition:background .2s;-webkit-transition:background .2s;transition:background .2s;width:100%}a.link-cta-positive:hover,a.link-cta-negative:hover{background-color:#ae3910}a.link-cta-positive .external,a.link-cta-negative .external{padding-right:1em;background-image:url("../img/icons/external-link-white.svg");background-repeat:no-repeat;background-size:11px;background-position:right top}@media only screen and (min-width: 769px){a.link-cta-positive .external,a.link-cta-negative .external{padding-right:.7em}}a.link-cta-negative{background-color:#b2b2b2}a.link-cta-negative:hover{background-color:#888}.charms__list{list-style:none;margin-bottom:1em;margin-left:0;border-bottom:1px dotted #d4d4d4}.charms__list .charms__list--config{display:none}.charms__list .charms__list--toggle{display:block}.charms__list .charms__list--toggle.is-open+.charms__list--config{display:block}.charms__list .charms__list--config-name{border-top:0}.charms__list--item{font-size:1em;border-top:1px dotted #d4d4d4;padding:10px 0 0 10px;margin-bottom:10px}.charms__list--item:last-of-type{margin-bottom:10px}.charms__list--icon{margin-right:.4em;width:25px;height:25px}.charms__list--toggle{background:url("../img/shared/icon-arrow-down.svg") no-repeat center center;width:16px;height:100%;float:right;text-indent:-99999px;margin-right:20px}.charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.svg");background-size:14px}.charms__list--config{padding-left:35px;padding-bottom:20px}.charms__list--config-name{font-size:1em;margin-top:15px;padding-top:15px;font-weight:400;border-top:1px dotted #d4d4d4}.charms__list--config-name:first-of-type{border-top:0}.charms__list--config-type{font-weight:400}.charms__list--config-description,.charms__list--config-setting{margin-left:30px;margin-top:8px}.charms__list--config-setting{font-size:0.875em;color:#888;font-family:"Ubuntu Mono","Consolas","Monaco","Lucida Console","Courier New",Courier,monospace}body.no-svg .charms__list .charms__list--toggle{background-image:url("../img/shared/icon-arrow-down.png")}body.no-svg .charms__list .charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.png")}pre{background:transparent;border:1px solid #888;margin:0 0 1.5em 0}pre:not(:first-child){margin-top:1.5em}code.language-bash .comment{color:#888}.cookie-policy{-moz-box-shadow:0 -1px 2px rgba(0,0,0,0.2);-webkit-box-shadow:0 -1px 2px rgba(0,0,0,0.2);box-shadow:0 -1px 2px rgba(0,0,0,0.2);background-color:#fae4dc;bottom:0;position:fixed;width:100%;z-index:100}.cookie-policy p{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:13px;margin-bottom:0;margin-left:0;padding:8px 0;width:100%}.cookie-policy .link-cta{background-image:url(../img/icons/close-orange.svg);background-repeat:no-repeat;color:#fff;float:right;font-size:1em;height:15px;margin:12px 0;margin-top:12px;padding:0;text-decoration:none;text-indent:-9999px;width:16px}html.no-svg .cookie-policy .link-cta,html.opera-mini .cookie-policy .link-cta{background-image:url(../img/icons/close-orange.png)}html.opera-mini .cookie-policy{position:relative;top:0}.deploy-command{margin-bottom:10px;position:relative}.deploy-command .deploy-command__field{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);-webkit-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);background-image:url("../img/icons/code-snippet_16.svg");background-repeat:no-repeat;background-position:5px center;background-color:#fff;background-size:1.142857143em;width:100%;height:37px;border:1px solid #c1c1c1;padding:.6em;color:#888;padding-left:2em;font-size:0.875em;white-space:nowrap;overflow:hidden;cursor:text}.deploy-command .command2clipboard__clip{cursor:pointer;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;line-height:1;position:absolute;right:1px;top:1px;background-color:#fff;padding:9px 8px 7px;border-left:1px solid #b2b2b2;display:none}.deploy-command .command2clipboard__clip.zeroclipboard-is-hover{background-color:#eee}@media only screen and (min-width: 1030px){.deploy-command .command2clipboard__clip{display:inline-block}}.dropdown-menu{position:relative;display:block}.dropdown-menu.open .menu-link{background-color:#000}.dropdown-menu.open .dropdown{display:block}.dropdown-menu .menu-link .border-box{display:block;color:#f2f2f4}.dropdown-menu .dropdown{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;display:none;position:absolute;z-index:1000;top:0;left:0;right:0;width:auto;background-color:#fff;box-shadow:0 1px 5px rgba(0,0,0,0.2)}.dropdown-menu .dropdown.right{left:auto;right:0;text-align:right}.dropdown-menu .dropdown.narrow{min-width:140px;width:auto}.dropdown-menu .dropdown a,.dropdown-menu .dropdown p,.dropdown-menu .dropdown li{color:#333}.dropdown-menu .dropdown p{padding:11px 20px}.dropdown-menu .dropdown header,.dropdown-menu .dropdown footer{background-color:#fff}.dropdown-menu .dropdown header{padding:11px 20px;color:#f2f2f4;font-size:16px;font-weight:300}.dropdown-menu .dropdown footer{padding:20px}.dropdown-menu .dropdown ul{width:auto;left:0;right:0}.dropdown-menu .dropdown ul li a{width:auto;display:block;padding:15px 20px}.files .files__list{list-style:none;margin-bottom:1em;border-left:1px solid #cbcbcb;margin-left:1em}@media only screen and (min-width: 768px){.files .files__list{margin-left:0}}.files .files__list li{position:relative}.files .files__list li a:link,.files .files__list li a:visited{color:#333;text-decoration:none}.files .files__list li:before{content:'';width:12px;height:1px;background:#d4d4d4;display:inline-block;position:relative;top:-4px;margin-right:5px}.files .files__list li:last-child:after{content:'';width:4px;height:1em;position:absolute;display:block;left:-2px;top:.85em;background:#fff}.files .files__list ul:last-child>li a:after{content:'';width:4px;height:3em;position:absolute;display:block;left:-1.8em;top:-1.45em;background:white;cursor:default}.files .files__list .files__list{margin-left:1.3em}.files .files__list .files__list--item,.files .files__list .files__list--item-folder{font-size:0.875em;margin-bottom:0.75em}.files .files__list .files__list--item-folder{background-position:center right;background-size:12px;cursor:pointer}.files .files__list .files__list--item-folder:after{font-size:14px;display:block;content:"-";position:absolute;left:-7px;top:4px;padding:0 4px;line-height:0.9em;background:#fff;border:1px solid #888}.files .files__list .files__list--item-folder.is-closed+ul{display:none}.files .files__list .files__list--item-folder.is-closed:after{content:"+";padding:0 2px}.files .files__actions--launchpad{background:url("../img/icons/icon-launchpad.svg") no-repeat;padding-left:1.4em}#main-content .row-hero{padding-top:20px;margin-top:0}#main-content .row-hero .intro{font-size:16px}@media only screen and (min-width: 769px){#main-content .row-hero{padding-top:60px}#main-content .row-hero .intro{font-size:1.4375em;margin-bottom:40px}}.how-to div div img{float:left;margin:0 20px 20px 0}header.banner a.external,header.banner a.external:hover{background-image:url("../img/icons/external-link-grey.png")}a.external,a.external:hover,header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-repeat:no-repeat}a.external,a.external:hover header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-position:right 14px top 14px;padding-right:35px;background-size:auto}@media only screen and (max-width: 769px){header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background:none}header.banner nav.nav-primary ul li a.external:after{display:inline-block;width:11px;height:11px;margin-left:0.25em;background-image:url("../img/icons/external-link-dark.png");vertical-align:text-top}}.list__icons{margin-left:0;margin-bottom:5px}.list__icons li{list-style:none;float:left;padding:8px 8px 0 0;margin-bottom:0}.list__icons li img{width:24px;height:24px;vertical-align:top}.list__tick{list-style-image:url("../img/icons/tick.png")}.list__middot{margin-left:0;list-style:none}.list__middot li{display:inline}.list__middot li:after{content:"•";color:#888;margin:0 5px 0 8px;vertical-align:middle}.list__middot li.files__actions--last:after{content:""}.combined-list .list li{border-bottom:1px dotted #888;padding:10px 0}@media only screen and (max-width: 767px){.combined-list .last-col .list li:last-of-type{border-bottom:0;padding-bottom:0}}@media only screen and (min-width: 768px){.combined-list .list li:last-of-type{border-bottom:0;padding-bottom:0}}.events-list li{position:relative;padding-bottom:20px}.events-list dd{margin-left:0;background-position:0 center;background-repeat:no-repeat;background-size:20px 20px;padding:6px 20px 6px 24px}.events-list .event-map{display:none}.events-list .event-date{background-image:url("../img/icons/calendar.svg")}.events-list .location{background-image:url("../img/icons/location.svg")}@media only screen and (min-width: 769px){.events-list .event-details-wrapper{padding-left:120px}.events-list .event-map{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;position:absolute;left:0;top:0;height:100px;width:100px;float:left;margin-right:10px;margin-top:5px;overflow:hidden;display:block}}body.no-svg .events-list .event-date{background-image:url("../img/icons/calendar.png")}body.no-svg .events-list .location{background-image:url("../img/icons/location.png")}.maintainers .maintainer__email{display:block}.ratings ul{margin-left:2px;margin-bottom:0}.ratings ul li{margin-bottom:0}.ratings ul li img{vertical-align:text-top}.ratings ul li:first-of-type{margin-left:0}.revisions__list{list-style:none;margin-left:0}.revisions__list .revisions__list-item{margin-bottom:1em}.revisions__list .revisions__list_meta{color:#888;margin-bottom:.2em}.revisions__list .revisions__list_meta_date{float:right}.section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:hidden;padding-bottom:20px;padding-top:20px}.section .section__title{background:url(../img/shared/icon-arrow-up.svg) no-repeat center right;cursor:pointer;margin-bottom:1em}.section.is-closed{height:60px}.section.is-closed .section__title{background-image:url(../img/shared/icon-arrow-down.svg)}.no-svg .row.section .section__title{background:url(../img/shared/icon-arrow-up.png)}.no-svg .row.section.is-closed .section__title{background:url(../img/shared/icon-arrow-down.png)}footer .section{margin-bottom:1em;padding-bottom:1em}footer .section.is-closed{height:auto;padding-bottom:0}footer .section.is-closed ul{display:none}@media only screen and (min-width: 769px){.row .section .section__title{background-image:none;cursor:auto}.row .section.is-closed{height:auto}}.list--concealed .list-item{display:none}.list--concealed .list-item:first-of-type{display:list-item}.list--concealed.list--visible-6 .list-item:nth-child(-n+6){display:list-item}.list--concealed.list--visible-4 .list-item:nth-child(-n+4){display:list-item}.list--concealed.list--visible-2 .list-item:nth-child(-n+2){display:list-item}.list--concealed a.btn__see--less{display:none}.list--concealed a.btn__see--more{display:inline}.list--revealed .list__controls,.list--concealed .list__controls{display:block;margin-top:2em}.list--revealed .list--item{display:list-item}.list--revealed a.btn__see--less{display:inline}.list--revealed a.btn__see--more{display:none}a.btn__see--more,a.btn__see--less{-moz-transition:background .2s;-webkit-transition:background .2s;transition:background .2s;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:#333;border-radius:2px;border:1px solid #b2b2b2;background:#fff;padding:0.384615385em 1.153846154em}a.btn__see--more:hover,a.btn__see--less:hover{background:#eee;text-decoration:none}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}.tag-list{list-style:none;margin:0}.tag-list--item{display:inline-block;text-transform:lowercase}.tag-list--item a:link,.tag-list--item a:visited{color:#333}.tag-list--item a:after{content:','}.tag-list--item:last-child a:after{content:''}#twitter-feed,#blog-feed{margin:35px 0}#twitter-feed>ul,#blog-feed>ul{list-style:none;margin-left:0}#twitter-feed>ul li,#blog-feed>ul li{position:relative;margin-bottom:30px}#twitter-feed .user,#blog-feed .user{font-size:0.875em;margin-bottom:0.5em}#twitter-feed .user img,#blog-feed .user img{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;width:24px;height:24px;vertical-align:middle;margin-right:5px}#twitter-feed .user a:link,#twitter-feed .user a:visited,#twitter-feed .user a:hover,#blog-feed .user a:link,#blog-feed .user a:visited,#blog-feed .user a:hover{text-decoration:none}#twitter-feed .user span[data-scribe="element:name"],#blog-feed .user span[data-scribe="element:name"]{color:#333}#twitter-feed .tweet,#blog-feed .tweet{padding-left:33px;margin-bottom:.3em}#twitter-feed .timePosted,#blog-feed .timePosted{padding-left:33px;font-size:0.875em}#twitter-feed .interact,#blog-feed .interact{padding-left:33px}#twitter-feed .interact a:link,#twitter-feed .interact a:visited,#blog-feed .interact a:link,#blog-feed .interact a:visited{margin-right:20px}@media only screen and (min-width: 769px){#twitter-feed .timePosted{position:absolute;top:0;right:0;padding-left:0}}.spaced-segment{margin-bottom:50px}.spaced-segment h3{margin-bottom:1.3em}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}@media only screen and (min-width: 769px){.tip,.command2clipboard__clip{position:relative;display:inline-block}.tip .tip-content,.command2clipboard__clip .tip-content{position:absolute;z-index:98;left:-1000px;right:-1000px;top:-30px;font-weight:300;margin:auto;display:block;text-align:center;white-space:nowrap}.tip:hover .tip-content:after,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:after{display:table;z-index:98;margin:auto;color:#fff;border-radius:3px;background:#000;box-shadow:none;font-size:12px;content:attr(data-tooltip);padding:4px 6px;white-space:nowrap;text-align:center}.tip:hover .tip-content:before,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:before{position:absolute;top:100%;left:50%;margin-left:-5px;content:'';border:solid transparent;border-width:5px;border-top-color:#000}}.fake{display:block}*{-webkit-backface-visibility:hidden;margin:0}html{height:100%}body{height:100%;font-size:1.0em;font-family:'Ubuntu', Arial, 'libra sans', sans-serif;font-weight:300}hr{border:none;background:#B2B2B2;width:100%;height:1px;display:block;width:100%;float:left;margin-bottom:20px}ul,ol{margin-left:0}a.alt{color:#333}a.alt:hover{color:#dd4814}a:active,a:focus{outline:none}::selection{color:#FFF;background:#dd4814}::-moz-selection{color:#FFF;background:#dd4814}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot?") format("eot"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot?") format("eot"),url("../fonts/ubuntu-li-webfont.woff2") format("woff2"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:400;src:url("../fonts/ubuntu-r-webfont.eot?") format("eot"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot?") format("eot"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot?") format("eot"),url("../fonts/ubuntu-mi-webfont.woff2") format("woff2"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot?") format("eot"),url("../fonts/ubuntu-b-webfont.woff2") format("woff2"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}.accordion{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px}.disabled .accordion{opacity:.5;pointer-events:none}.accordion .accordion__title{border-bottom:1px dotted #B2B2B2;padding:13px 20px 12px;margin:0;font-size:1.3em}.accordion .accordion__tab{border-bottom:1px dotted #B2B2B2}.accordion .accordion__tab:last-of-type{border:none}.accordion .accordion__tab .accordion__tab-title{padding:12px 20px;margin:0;color:#888;cursor:pointer;background:transparent url("../img/icons/accordion-open.svg") top 20px right 20px no-repeat}.accordion .accordion__tab .accordion__tab-title.active{background-image:url("../img/icons/accordion-close.svg")}.accordion .accordion__tab .accordion__tab-title.active+.accordion__tab-content{max-height:3000px;transition:max-height .5s ease-in}.accordion .accordion__tab .accordion__tab-content{max-height:0;transition:max-height .5s ease-out;overflow:hidden}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list{list-style-type:none;padding:0 20px 14px;margin:0}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item{margin-bottom:0.15em}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;width:100%;display:inline-block;padding-right:20px}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link:hover{color:#dd4814;text-decoration:none}.disabled .accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{color:#333}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active{font-weight:400}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active .accordion__tab-link{background:transparent url("../img/icons/cross.svg") top 7px right 0px no-repeat}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover{color:#dd4814}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover .accordion__tab-link{color:#dd4814;background-image:url("../img/icons/cross-orange.svg")}.cta-group .cta-group__link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px 0px 0px 3px;-moz-border-radius:3px 0px 0px 3px;border-radius:3px 0px 0px 3px;display:inline-block;padding:10px 14px;text-align:center;color:#fff;background-color:#dd4814}.cta-group .cta-group__link:hover{cursor:pointer;text-decoration:none;background-color:#c03f11}.cta-group.secondary .cta-group__link{color:#dd4814;border:1px solid #b2b2b2;background-color:#FFF;line-height:1}.cta-group.secondary .cta-group__link:hover{cursor:pointer;background-color:#F2F2F2}a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{font-size:1em;border:none;max-height:37px}a.link-cta-ubuntu[disabled],a.link-cta-ubuntu.disabled,button.cta-ubuntu[disabled],button.cta-ubuntu.disabled,input[type='submit'][disabled],input[type='submit'].disabled,form button[type='submit'][disabled],form button[type='submit'].disabled,form input[type='submit'][disabled],form input[type='submit'].disabled{cursor:default;opacity:.5}a.link-cta-ubuntu.clear,button.cta-ubuntu.clear,input[type='submit'].clear,form button[type='submit'].clear,form input[type='submit'].clear{background:none;color:#333}a.link-cta-ubuntu.secondary,button.cta-ubuntu.secondary,input[type='submit'].secondary,form button[type='submit'].secondary,form input[type='submit'].secondary{color:#dd4814;border:1px solid #b2b2b2;background:#FFF}a.link-cta-ubuntu.secondary.external,button.cta-ubuntu.secondary.external,input[type='submit'].secondary.external,form button[type='submit'].secondary.external,form input[type='submit'].secondary.external{background-image:url("../img/external-link-black.svg");background-size:16px 16px;background-repeat:no-repeat;background-position:top 8px right 8px}a.link-cta-ubuntu.secondary:hover,button.cta-ubuntu.secondary:hover,input[type='submit'].secondary:hover,form button[type='submit'].secondary:hover,form input[type='submit'].secondary:hover{background-color:#F2F2F2;cursor:pointer}a.link-cta-ubuntu.secondary[disabled],a.link-cta-ubuntu.secondary.disabled,button.cta-ubuntu.secondary[disabled],button.cta-ubuntu.secondary.disabled,input[type='submit'].secondary[disabled],input[type='submit'].secondary.disabled,form button[type='submit'].secondary[disabled],form button[type='submit'].secondary.disabled,form input[type='submit'].secondary[disabled],form input[type='submit'].secondary.disabled{cursor:default;color:#f5ae95;border:1px solid #ddd;background:#FFF;opacity:1}a.link-cta-ubuntu.secondary[disabled]:hover,a.link-cta-ubuntu.secondary.disabled:hover,button.cta-ubuntu.secondary[disabled]:hover,button.cta-ubuntu.secondary.disabled:hover,input[type='submit'].secondary[disabled]:hover,input[type='submit'].secondary.disabled:hover,form button[type='submit'].secondary[disabled]:hover,form button[type='submit'].secondary.disabled:hover,form input[type='submit'].secondary[disabled]:hover,form input[type='submit'].secondary.disabled:hover{background:#FFF}a.link-cta-ubuntu.text-button,button.cta-ubuntu.text-button,input[type='submit'].text-button,form button[type='submit'].text-button,form input[type='submit'].text-button{background-color:transparent;color:#333}a.link-cta-ubuntu.text-button:hover,button.cta-ubuntu.text-button:hover,input[type='submit'].text-button:hover,form button[type='submit'].text-button:hover,form input[type='submit'].text-button:hover{text-decoration:underline}a.link-cta-ubuntu.full,button.cta-ubuntu.full,input[type='submit'].full,form button[type='submit'].full,form input[type='submit'].full{display:block;width:100%}@media screen and (max-width: 768px){a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{margin-bottom:20px}}a.link-cta-ubuntu{line-height:20px}.cta-group{float:left;width:auto;clear:both;position:relative;overflow:hidden}.cta-group .cta-group__link{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;max-height:36px;padding-right:49px;width:100%;line-height:1.2;position:relative;margin:0;text-align:left}.cta-group .cta-group__link:after{-webkit-border-radius:0px 3px 3px 0px;-moz-border-radius:0px 3px 3px 0px;border-radius:0px 3px 3px 0px;content:'';display:block;height:36px;width:34px;background:red;position:absolute;top:0;right:0;background-image:url("../img/chevron-white.svg");background-color:#dd4814;background-repeat:no-repeat;background-position:center}.cta-group .cta-group__link:hover{background-color:#dd4814}.cta-group .cta-group__link:hover:after{background-color:#c03f11}.cta-group .cta-group__dropdown{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;right:0;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);z-index:20;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;position:relative;clear:both}.cta-group .cta-group__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out}.cta-group .cta-group__dropdown .cta-group__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;clear:both;padding:5px 10px;margin:0}.cta-group .cta-group__dropdown .cta-group__item a{color:#333;cursor:pointer;width:100%;float:left;margin:0}.cta-group .cta-group__dropdown .cta-group__item a:hover{color:#dd4814;text-decoration:none}.cta-group.secondary .cta-group__link{float:left;max-height:36px;width:100%}.cta-group.secondary .cta-group__link:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-color:#fff;border:1px solid #b2b2b2;border-left:none;top:-1px;right:-1px}.cta-group.secondary .cta-group__link:hover{background-color:#FFF}.cta-group.secondary .cta-group__link:hover:after{background-color:#F2F2F2}.flash-messages{margin:0px auto;padding:0;max-width:1440px}@media screen and (max-width: 1030px){.flash-messages{margin:0px 10px 20px}}.flash-messages .flash-messages__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.flash-messages .flash-messages__item.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.flash-messages .flash-messages__item.success{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.flash-messages .flash-messages__item.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.flash-messages .flash-messages__item.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url'],form textarea,form select,tags-input .tags .input,.accounts .api li input[type='text']{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;background:#FFF;color:#333;border:1px solid #D2D2D2;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0px 13px}form input[type='text']:active,form input[type='number']:active,form input[type='search']:active,form input[type='password']:active,form input[type='email']:active,form input[type='url']:active,form textarea:active,form select:active,tags-input .tags .input:active,.accounts .api li input[type='text']:active{border-color:#B2B2B2;outline:none}form input[type='text']:focus,form input[type='number']:focus,form input[type='search']:focus,form input[type='password']:focus,form input[type='email']:focus,form input[type='url']:focus,form textarea:focus,form select:focus,tags-input .tags .input:focus,.accounts .api li input[type='text']:focus{border-color:#B2B2B2;outline:none}form input.invalid[type='text'],form input.invalid[type='number'],form input.invalid[type='search'],form input.invalid[type='password'],form input.invalid[type='email'],form input.invalid[type='url'],form textarea.invalid,form select.invalid,tags-input .tags .invalid.input,.accounts .api li input.invalid[type='text'],form input.ng-invalid[type='text'],form input.ng-invalid[type='number'],form input.ng-invalid[type='search'],form input.ng-invalid[type='password'],form input.ng-invalid[type='email'],form input.ng-invalid[type='url'],form textarea.ng-invalid,form select.ng-invalid,tags-input .tags .ng-invalid.input,.accounts .api li input.ng-invalid[type='text']{border-color:#d90000}form input[disabled="disabled"][type='text'],form input[disabled="disabled"][type='number'],form input[disabled="disabled"][type='search'],form input[disabled="disabled"][type='password'],form input[disabled="disabled"][type='email'],form input[disabled="disabled"][type='url'],form textarea[disabled="disabled"],form select[disabled="disabled"],tags-input .tags [disabled="disabled"].input,.accounts .api li input[disabled="disabled"][type='text']{-webkit-text-fill-color:#333;border-color:#D2D2D2;background-color:transparent}label{position:relative}.disabled label{cursor:default}form li.help-msg{margin-bottom:1em}form li.help-msg .help{color:#888;font-size:0.875em}form label span{color:#333}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url']{padding:7px 10px}form input[type='text']::-webkit-input-placeholder,form input[type='number']::-webkit-input-placeholder,form input[type='search']::-webkit-input-placeholder,form input[type='password']::-webkit-input-placeholder,form input[type='email']::-webkit-input-placeholder,form input[type='url']::-webkit-input-placeholder{color:#888}form input[type='text']:-moz-placeholder,form input[type='number']:-moz-placeholder,form input[type='search']:-moz-placeholder,form input[type='password']:-moz-placeholder,form input[type='email']:-moz-placeholder,form input[type='url']:-moz-placeholder{color:#888}form input[type='text']::-moz-placeholder,form input[type='number']::-moz-placeholder,form input[type='search']::-moz-placeholder,form input[type='password']::-moz-placeholder,form input[type='email']::-moz-placeholder,form input[type='url']::-moz-placeholder{color:#888}form input[type='text']:-ms-input-placeholder,form input[type='number']:-ms-input-placeholder,form input[type='search']:-ms-input-placeholder,form input[type='password']:-ms-input-placeholder,form input[type='email']:-ms-input-placeholder,form input[type='url']:-ms-input-placeholder{color:#888}form input[type='number']{padding-right:15px}form input[type='search']{-webkit-appearance:textfield}form input[type='search']::-webkit-search-decoration,form input[type='search']::-webkit-search-cancel-button{-webkit-appearance:none}form input[type='radio'],form input[type='image']{display:inline-block;margin-right:10px}form textarea{overflow:auto;height:auto;min-height:175px;padding:7px 10px;vertical-align:top}form select{display:block;clear:both;cursor:pointer;margin:0;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-position:top 16px right 10px;padding:6px 30px 6px 10px;-moz-appearance:none;text-indent:0.01px;text-overflow:''}form select[multiple],form select[size]{height:auto;background-image:none;padding-top:10px}form select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}form select[disabled]{color:#888;background-image:none}form select::-ms-expand{display:none}form fieldset{background:none;margin-left:0;padding:0}.checkbox{visibility:hidden;width:0;height:0;margin-right:0;position:absolute}.checkbox+.checkbox-label{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-left:20px;position:relative}.checkbox+.checkbox-label:before{content:"";display:inline-block;width:20px;height:20px;position:absolute;top:0;left:0;background:url("../img/checkbox.svg") no-repeat;background-size:13px 13px;background-position:0px 3px}.checkbox:checked+.checkbox-label:before{background:url("../img/checkbox-checked.svg") no-repeat;background-position:0px 3px}.checkbox[disabled="disabled"]+.checkbox-label:before{cursor:default;opacity:0.5}.field-error,.errors{color:#DF382C}.field-error .errorlist,.errors .errorlist{margin:0}.field-error .errorlist li,.errors .errorlist li{margin:0 0 14px 0}.inline{display:inline-block;width:100%;font-size:0;margin-bottom:10px}.inline.error{background-color:#fdf5f5;box-shadow:0px 0px 0px 5px #fdf5f5}.inline.error .ng-invalid{border-color:#D2D2D2}.inline:last-of-type{margin-bottom:0}.inline label{display:inline-block;float:none;font-size:16px;margin:0}.inline input[type='submit'],.inline input[type='text'],.inline input[type='number'],.inline input[type='search'],.inline input[type='password'],.inline input[type='email'],.inline input[type='checkbox'],.inline select{display:inline-block;clear:none;margin:0;float:none;font-size:16px}.inline input[type='submit']:invalid,.inline input[type='text']:invalid,.inline input[type='number']:invalid,.inline input[type='search']:invalid,.inline input[type='password']:invalid,.inline input[type='email']:invalid,.inline input[type='checkbox']:invalid,.inline select:invalid{-moz-box-shadow:none}.inline input[type='submit']:-moz-submit-invalid,.inline input[type='text']:-moz-submit-invalid,.inline input[type='number']:-moz-submit-invalid,.inline input[type='search']:-moz-submit-invalid,.inline input[type='password']:-moz-submit-invalid,.inline input[type='email']:-moz-submit-invalid,.inline input[type='checkbox']:-moz-submit-invalid,.inline select:-moz-submit-invalid{box-shadow:none}.inline input[type='submit']:-moz-ui-invalid,.inline input[type='text']:-moz-ui-invalid,.inline input[type='number']:-moz-ui-invalid,.inline input[type='search']:-moz-ui-invalid,.inline input[type='password']:-moz-ui-invalid,.inline input[type='email']:-moz-ui-invalid,.inline input[type='checkbox']:-moz-ui-invalid,.inline select:-moz-ui-invalid{box-shadow:none}.inline div{float:none;margin:0}.inline input.cta-ubuntu,.inline a.link-cta-ubuntu,.inline button.cta-ubuntu{font-size:16px}.inline .icon{position:absolute;top:11px;right:10px;cursor:pointer}.inline .error-message{font-size:12px;color:#e85232;margin-top:10px;margin-bottom:10px;font-weight:normal}.form-inline label,.form-inline button,.form-inline input[type='submit'],.form-inline input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{display:inline-block;width:auto;vertical-align:middle;margin-bottom:0}.form-inline input,.form-inline input[type='submit'] input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{margin-left:20px}.form-inline fieldset{width:auto;display:inline-block;margin:0 40px 0 0}.controls{position:absolute;top:0;right:20px}.controls a,.controls button{margin-left:20px}.icon{background-size:16px 16px;width:16px;height:16px;padding:0;display:inline-block}.icon.icon__loading{background:url("../img/in_progress.png") no-repeat;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear}a.icon{cursor:pointer}dl dt{clear:left}dl dd{color:#888;margin-left:0}dl dt,dl dd{display:inline-block;float:left;line-height:37px;margin-bottom:10px !important}tags-input{outline:none}tags-input .host:focus{outline:none}tags-input .tags:focus,tags-input .tags.focused{outline:none}tags-input .tags .tag-list{margin:4px 0 0;padding:0;list-style-type:none;width:100%;float:left}tags-input .tags .tag-item{display:inline-block;float:left;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;height:30px;line-height:30px;cursor:default;color:#000;padding-right:15px;position:relative;margin:0 11px 0 0}tags-input .tags .tag-item .remove-button{display:inline-block;width:12px;height:12px;text-indent:-999em;background:url("../img/icons/cross.svg") no-repeat;background-size:12px 12px;position:absolute;right:0;top:9px;cursor:pointer}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags .input{padding:7px 10px;width:100% !important;float:left;position:relative !important;left:0}tags-input .tags .input::-ms-clear{display:none}tags-input .autocomplete{float:left;width:100%}tags-input .autocomplete .suggestion-list{background:#FFF;padding:10px 8px;border:1px solid #D2D2D2;border-top:0;border-radius:0 0 2px 2px}tags-input .autocomplete .suggestion-list li:hover{background:#EEE;cursor:pointer}tags-input[disabled] .host:focus{outline:none}tags-input[disabled] .tags{cursor:default}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .input{cursor:default}.tag-link{margin-right:10px}.tag-link:last-of-type:after{content:''}.table__data tags-input .tags{margin-top:-10px}.table__data tags-input .tags input{margin-left:0;width:50% !important;float:left}.pagination{margin:10px 0;text-align:center}.pagination .inactive{color:#AEA79F}.pagination a,.pagination span{margin:0 5px}.search{position:relative;padding-bottom:20px}.search input[type='search']{-webkit-appearance:textfield}.search .search__input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;border:none;padding:13px 20px;font-size:1.25em}.search .search__input::-webkit-input-placeholder{color:#000 !important}.search .search__input:-moz-placeholder{color:#000 !important}.search .search__input::-moz-placeholder{color:#000 !important}.search .search__input:-ms-input-placeholder{color:#000 !important}.search .search__input[disabled="disabled"]{background-color:#fff;opacity:.5;pointer-events:none}.search .search__input[disabled="disabled"]+.search__submit.close{pointer-events:none;opacity:.5}.search .search__submit{position:absolute;top:15px;right:25px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0;border:none}.search .search__submit:hover{background-color:transparent;background-image:url("../img/search-icon.svg")}.search .search__submit.close{background-image:url("../img/icons/cross.svg");background-size:21px;margin-top:2px}.search .search__submit.close:hover{background-image:url("../img/icons/cross.svg")}.spinner-col{width:10px}.spinner{float:left;margin:0 auto;text-indent:-9999em}.spinner.spin{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}table{text-align:left;width:100%;margin-bottom:40px;border-collapse:separate;border-spacing:0;font-size:16px}table th,table td{background:transparent;text-align:left;padding:13px 10px}table th .checkbox+.checkbox-label::before,table td .checkbox+.checkbox-label::before{top:-2px}table thead th{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}table tbody tr:hover .icon-controls a{opacity:1}table tbody td{border:none;border-bottom:1px dotted #B2B2B2;position:relative}table tbody td.icon-controls{text-align:right}table tbody td.icon-controls a{opacity:0}table tbody td input[type="text"]{position:absolute;left:10px;top:6px;width:80%}.table-listing{text-align:left;width:100%;margin:0 0 40px 0;border-collapse:separate;border-spacing:0}.table-listing .table-listing__row:hover .table-listing__cell{background-color:#FFF}.table-listing .table-listing__row.error{background-color:#F3E3E2}.table-listing .table-listing__row.error .status{color:#DD3832}.table-listing .table-listing__row.progress{background-color:rgba(25,182,238,0.1)}.table-listing .table-listing__row.selected{background-color:#FFF}.table-listing .table-listing__header{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}.table-listing .table-listing__header .table-listing__header-link{background-repeat:no-repeat;background-position:top 8px right 0;color:#888}.table-listing .table-listing__header .table-listing__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table-listing .table-listing__header .table-listing__header-link:focus,.table-listing .table-listing__header .table-listing__header-link:active,.table-listing .table-listing__header .table-listing__header-link:visited{text-decoration:none}.table-listing .table-listing__header .table-listing__header-link.active{color:#333}.table-listing .table-listing__header .table-listing__header-link.sort{border-bottom:1px solid #333}.table-listing .table-listing__header .divide{width:1px;display:inline-block;background:#D2D2D2 none repeat scroll 0% 0%;height:10px;padding:0px;margin:0px 5px}.table-listing .table-listing__cell{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:none;border-bottom:1px dotted #B2B2B2;position:relative}.table-listing .table-listing__cell.icon-controls{text-align:right;opacity:0}.table-listing .table-listing__cell input,.table-listing .table-listing__cell select{position:absolute;left:10px;top:5px;width:80%}.table-listing .fixed{max-width:200px;min-width:200px;width:200px;padding-left:0}.table-listing__header .table-listing .fixed{padding-left:0}.table-listing.no-hover .table-listing__row:hover .table-listing__cell,.table-listing.no-hover .table-listing__row:hover td{background-color:transparent}.t1{width:1%}.t2{width:2%}.t3{width:3%}.t4{width:4%}.t5{width:5%}.t6{width:6%}.t7{width:7%}.t8{width:8%}.t9{width:9%}.t10{width:10%}.t11{width:11%}.t12{width:12%}.t13{width:13%}.t14{width:14%}.t15{width:15%}.t16{width:16%}.t17{width:17%}.t18{width:18%}.t19{width:19%}.t20{width:20%}.t21{width:21%}.t22{width:22%}.t23{width:23%}.t24{width:24%}.t25{width:25%}.t26{width:26%}.t27{width:27%}.t28{width:28%}.t29{width:29%}.t30{width:30%}.t31{width:31%}.t32{width:32%}.t33{width:33%}.t34{width:34%}.t35{width:35%}.t36{width:36%}.t37{width:37%}.t38{width:38%}.t39{width:39%}.t40{width:40%}.t41{width:41%}.t42{width:42%}.t43{width:43%}.t44{width:44%}.t45{width:45%}.t46{width:46%}.t47{width:47%}.t48{width:48%}.t49{width:49%}.t50{width:50%}.t51{width:51%}.t52{width:52%}.t53{width:53%}.t54{width:54%}.t55{width:55%}.t56{width:56%}.t57{width:57%}.t58{width:58%}.t59{width:59%}.t60{width:60%}.t61{width:61%}.t62{width:62%}.t63{width:63%}.t64{width:64%}.t65{width:65%}.t66{width:66%}.t67{width:67%}.t68{width:68%}.t69{width:69%}.t70{width:70%}.t71{width:71%}.t72{width:72%}.t73{width:73%}.t74{width:74%}.t75{width:75%}.t76{width:76%}.t77{width:77%}.t78{width:78%}.t79{width:79%}.t80{width:80%}.t81{width:81%}.t82{width:82%}.t83{width:83%}.t84{width:84%}.t85{width:85%}.t86{width:86%}.t87{width:87%}.t88{width:88%}.t89{width:89%}.t90{width:90%}.t91{width:91%}.t92{width:92%}.t93{width:93%}.t94{width:94%}.t95{width:95%}.t96{width:96%}.t97{width:97%}.t98{width:98%}.t99{width:99%}.t100{width:100%}.table__column--1{width:1%}.table__column--2{width:2%}.table__column--3{width:3%}.table__column--4{width:4%}.table__column--5{width:5%}.table__column--6{width:6%}.table__column--7{width:7%}.table__column--8{width:8%}.table__column--9{width:9%}.table__column--10{width:10%}.table__column--11{width:11%}.table__column--12{width:12%}.table__column--13{width:13%}.table__column--14{width:14%}.table__column--15{width:15%}.table__column--16{width:16%}.table__column--17{width:17%}.table__column--18{width:18%}.table__column--19{width:19%}.table__column--20{width:20%}.table__column--21{width:21%}.table__column--22{width:22%}.table__column--23{width:23%}.table__column--24{width:24%}.table__column--25{width:25%}.table__column--26{width:26%}.table__column--27{width:27%}.table__column--28{width:28%}.table__column--29{width:29%}.table__column--30{width:30%}.table__column--31{width:31%}.table__column--32{width:32%}.table__column--33{width:33%}.table__column--34{width:34%}.table__column--35{width:35%}.table__column--36{width:36%}.table__column--37{width:37%}.table__column--38{width:38%}.table__column--39{width:39%}.table__column--40{width:40%}.table__column--41{width:41%}.table__column--42{width:42%}.table__column--43{width:43%}.table__column--44{width:44%}.table__column--45{width:45%}.table__column--46{width:46%}.table__column--47{width:47%}.table__column--48{width:48%}.table__column--49{width:49%}.table__column--50{width:50%}.table__column--51{width:51%}.table__column--52{width:52%}.table__column--53{width:53%}.table__column--54{width:54%}.table__column--55{width:55%}.table__column--56{width:56%}.table__column--57{width:57%}.table__column--58{width:58%}.table__column--59{width:59%}.table__column--60{width:60%}.table__column--61{width:61%}.table__column--62{width:62%}.table__column--63{width:63%}.table__column--64{width:64%}.table__column--65{width:65%}.table__column--66{width:66%}.table__column--67{width:67%}.table__column--68{width:68%}.table__column--69{width:69%}.table__column--70{width:70%}.table__column--71{width:71%}.table__column--72{width:72%}.table__column--73{width:73%}.table__column--74{width:74%}.table__column--75{width:75%}.table__column--76{width:76%}.table__column--77{width:77%}.table__column--78{width:78%}.table__column--79{width:79%}.table__column--80{width:80%}.table__column--81{width:81%}.table__column--82{width:82%}.table__column--83{width:83%}.table__column--84{width:84%}.table__column--85{width:85%}.table__column--86{width:86%}.table__column--87{width:87%}.table__column--88{width:88%}.table__column--89{width:89%}.table__column--90{width:90%}.table__column--91{width:91%}.table__column--92{width:92%}.table__column--93{width:93%}.table__column--94{width:94%}.table__column--95{width:95%}.table__column--96{width:96%}.table__column--97{width:97%}.table__column--98{width:98%}.table__column--99{width:99%}.table__column--100{width:100%}#commissioning_scripts .script-content.slider{overflow:hidden}#commissioning_scripts .script-content.slider pre{margin-top:20px}.table{display:table;border-color:#B2B2B2;border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.5em;width:100%}.table .table__row{float:left;width:100%;display:table-row;border-bottom:1px dotted #B2B2B2}.table .table__row:hover{background-color:#FFF}.table .table__row:hover .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row:hover .table__input.invalid{border-color:#D90000}.table .table__row:hover .table__input[disabled]{border-color:transparent;color:#333}.table .table__row:hover .table__controls{z-index:1;opacity:1}.table .table__row:hover .table__controls--secondary{z-index:1;opacity:1}.table .table__row.table__row--no-hover:hover{background-color:transparent}.table .table__row.active{background-color:#FFF}.table .table__row.active .table__dropdown .table__data,.table .table__row.active .table__dropdown .table__input{color:#333}.table .table__row.active:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.active:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.active:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input.editible{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input[disabled]{border-color:transparent;color:#333}.table .table__row.active .table__dropdown{max-height:3000px}.table .table__row.selected .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.selected:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.selected:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.selected:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.disabled>.table__data{color:#888;pointer-events:none}.table .table__row.disabled>.table__data>.table__input{color:#888;pointer-events:none}.table .table__row.disabled .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.disabled:hover .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.disabled:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.disabled:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.noEdit .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.noEdit:hover .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.noEdit:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.noEdit:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__header,.table .table__data{font-size:16px;display:table-cell;padding:13px 10px;box-sizing:border-box;height:100%;background:none;border:0;text-align:left;float:left}.table .table__header a,.table .table__data a{color:#dd4814}.table .table__header a:hover,.table .table__data a:hover{cursor:pointer}.table .table__head{display:table-head;width:100%;box-sizing:border-box}.table .table__head .table__row{border-bottom:1px solid #B2B2B2}.table .table__head .table__row:hover{background-color:transparent}.table .table__head .table__header{font-size:13px;background:none;color:#888}.table .table__head a,.table .table__head .table__header-link{color:#888}.table .table__head a:hover,.table .table__head .table__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table .table__head a.active,.table .table__head .table__header-link.active{color:#333;text-decoration:none}.table .table__head a.sort,.table .table__head .table__header-link.sort{border-bottom:1px solid inherit}.table .table__head .divide{width:1px;display:inline-block;background:#888;height:10px;margin:0 5px}.table .table__body{display:table-row-group}.table .table__footer{display:table-footer-group}.table .table__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.table .table__label a{color:#BCBCBC}.table .table__label a:hover{color:#dd4814}.table .table__label.active a{color:#dd4814}.table .table__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.table .table__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.table .table__tags .table__tag{display:inline-block;margin-right:5px}.table .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.table .table__input.invalid{border-color:transparent}.table .table__input.invalid:focus{border-color:#D90000}.table .table__input[disabled]{border-color:transparent;color:#333}.table .table__input:focus{background-color:#FFF;border-color:#D2D2D2}.table label{font-size:13px;color:#BCBCBC}.table input,.table select{margin:0 0 0 -14px}.table input[type="radio"]{margin-left:0}.table ul li{margin:0;margin-top:14px}.table ul li:first-of-type{margin-top:0}.table .table__dropdown{width:100%;max-height:0;overflow-y:hidden}.table .table__dropdown .table__dropdown-row{border-bottom:0;position:relative;max-height:0;transition:max-height 0.10s ease-out;overflow:hidden}.table .table__dropdown .table__dropdown-row.active{max-height:500px;transition:max-height 0.25s ease-in}.table .table__dropdown .table__dropdown-row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:absolute;height:1px;content:'';top:0;left:10px}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head{border-bottom:0}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head .table__header{color:#BCBCBC;font-size:13px}.table .table__dropdown .table__dropdown-row.no-border{border:0}.table .table__dropdown .table__dropdown-row.no-border:before{border:0}.table .table__dropdown .table__dropdown-row .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__dropdown--info{width:100%;max-height:0;background-color:transparent}.table .table__dropdown--info .table__dropdown-row--info{border-bottom:0;position:relative;max-height:0;transition:max-height 0.10s ease-out;overflow:hidden}.table .table__dropdown--info .table__dropdown-row--info.active{max-height:500px;transition:max-height 0.25s ease-in}.table .table__dropdown--info .table__dropdown-row--info .table__data{color:#BCBCBC}h1 span,h2 span,h3 span,h4 span,h5 span{color:#888;font-size:75%;padding-left:20px}h4{font-size:20px;font-weight:300}pre{border:0;background-color:#FFF;border-radius:2px}pre code{counter-reset:line-numbering}pre code .line{float:left}pre code .line::before{content:counter(line-numbering);counter-increment:line-numbering;padding-right:1em;width:1.5em;text-align:right;opacity:0.5;pointer-events:none;user-select:none}.yui3-node-add-widget{width:65.9292%;margin-right:2.21238%}@media screen and (max-width: 768px){.yui3-node-add-widget{width:100%;margin:0}}.yui3-node-add-widget .buttons{margin-top:30px}.yui3-node-add-widget .add-link img.icon{margin-right:6px}.yui3-overlay{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#fff;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.5);box-shadow:0 0 10px 0 rgba(0,0,0,0.5)}.yui3-overlay ul{padding:5px 0}.yui3-overlay li{float:none}.yui3-overlay li:last-child a{border-bottom:none}.yui3-overlay a{display:block;padding:6px 20px;color:#dd4814 !important;border-bottom:1px solid #e5e2e0}.yui3-overlay a:focus,.yui3-overlay a:hover{background-color:#f2f2f2}.yui3-overlay-hidden{display:none}.yui3-widget-mask{background-color:#000;opacity:0.3}.yui3-panel{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#FFF;padding:50px 80px 50px 80px;-webkit-box-shadow:0 0 15px 0 #000;box-shadow:0 0 15px 0 #000}.yui3-panel .yui3-button{float:right}.yui3-panel .yui3-button.link-button{float:left;padding-left:0;padding-right:0;color:#dd4814;border:none;background:none;-webkit-box-shadow:none;box-shadow:none;font-size:13px}.yui3-widget-hd{margin-bottom:30px;font-size:24px}.yui3-widget-ft{margin-top:50px}.yui3-widget-button-wrapper{width:100%}.icon{margin-left:5px;width:16px;height:16px;display:inline-block;text-indent:999em;background-repeat:no-repeat;background-size:16px 16px;vertical-align:middle}.icon.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.icon.edit{background-image:url("../img/icons/edit.png");background-image:url("../img/icons/edit.svg"),none}.icon.delete{background-image:url("../img/icons/delete.png");background-image:url("../img/icons/delete.svg"),none}.icon.remove{background-image:url("../img/icons/filter-remove.svg"),none}.icon.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.icon.debug{background-image:url("../img/icons/debug.png");background-image:url("../img/icons/debug.svg"),none}.icon.success,.icon.tick{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.icon.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}.icon.partition{background-image:url("../img/icons/partition.svg")}.icon.add{background-image:url("../img/icons/add.svg")}.icon.tags{background-image:url("../img/icons/tags.svg")}.icon.mount{background-image:url("../img/icons/mount.svg")}.icon.unmount{background-image:url("../img/icons/unmount.svg")}.clear{clear:both}.hidden{display:none}.align-right{text-align:right}.align-center{text-align:center}.align-left{text-align:left}.right{float:right !important}.left{float:left !important}.border{border-top:1px dotted #B2B2B2}.border.bottom{border-bottom:1px dotted #B2B2B2}.border.solid{border-style:solid}.vertical-align{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.margin-top{margin-top:20px}.margin-top--five{margin-top:5px}.margin-top--ten{margin-top:10px}.margin-right{margin-right:20px !important}.margin-right--ten{margin-right:10px !important}.margin-bottom{margin-bottom:20px}.margin-left{margin-left:20px !important}.margin-left--ten{margin-left:10px !important}.margin-left--thirty{margin-left:30px !important}.padding-top{padding-top:20px}.padding-top--ten{padding-top:10px !important}.padding-right{padding-right:20px}.padding-bottom{padding-bottom:20px !important}.padding-bottom--ten{padding-bottom:10px !important}.padding-left{padding-left:20px !important}.padding-left--30,.padding-left--thirty{padding-left:30px !important}.padding-left--35{padding-left:35px !important}.padding-left--45{padding-left:45px !important}.padding-left--50{padding-left:50px !important}.border-top{border-top:1px dotted #888}.add-machine__list .add-machine__details,.border-bottom{border-bottom:1px dotted #888}.no-margin{margin:0}.no-margin-top{margin-top:0 !important}.no-padding{padding:0}.no-padding-top{padding-top:0 !important}.no-padding-left{padding-left:0}.no-padding-bottom{padding-bottom:0 !important}.no-margin-bottom{margin-bottom:0}.width--auto{width:auto}.width--half{width:50%}.width--full{width:100%}.tooltip{position:relative}.tooltip::before{content:attr(data-tooltip);font-size:13px;font-weight:400;position:absolute;z-index:999;white-space:nowrap;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);background:#333;color:#FFF;padding:10px;text-indent:0;opacity:0;transition:opacity 0.4s ease-out;border-radius:5px;box-shadow:0px 1px 3px 0 rgba(51,51,51,0.2);top:-9999em}.tooltip::after{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);content:'';width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;z-index:1000;transition:opacity 0.4s ease-out;border-top:5px solid #333;opacity:0;top:-9999em}.tooltip:hover::before{opacity:1 !important;top:-47px}.tooltip:hover::after{opacity:1 !important;top:-10px}.link-cta-ubuntu.tooltip:hover::before,.cta-ubuntu.tooltip:hover::before{top:-50px}.footer-wrapper{border-top:1px dotted #b2b2b2}.footer-wrapper footer.global{background-color:transparent;padding-top:0px;padding-right:20px;padding-left:20px;background-image:url("../img/logos/logo-ubuntu-orange.png");background-image:url("../img/logos/logo-ubuntu-orange.svg"),none;background-size:107px 25px;background-position:top 20px right 20px;background-repeat:no-repeat;max-width:1480px}.footer-wrapper footer.global p{font-size:0.875em}.footer-wrapper footer.global a{margin:0 5px;color:#dd4814}.footer-wrapper footer.global .version{font-weight:500;margin-right:5px}.footer-wrapper footer.global .copy{margin-top:10px}.footer-wrapper footer.global .legal{max-width:1440px}.wrapper{min-height:100%;height:auto !important;height:100%;margin:0 auto -112px;position:relative;background:rgba(255,255,255,0.6);padding-top:172px}.wrapper:after{content:'';position:absolute;display:block;top:0;right:0;bottom:0;left:0;background:url("../img/backgrounds/image-background-paper.png");height:100%;width:100%;z-index:-1}.inner-wrapper{max-width:1480px;padding:0px 20px;margin:0 auto;position:relative}.push,.footer-wrapper{height:112px}.row{background-color:transparent;border-bottom:1px dotted #CCC}.row:last-child{border-bottom:none}header.banner{overflow:visible;z-index:20;position:fixed;top:0}header.banner .logo{padding-left:15px}header.banner nav.nav-primary{border-bottom:none}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:100px 30px;-webkit-background-size:100px 30px;-o-background-size:100px 30px;background-size:100px 30px;background-position:5px 9px;background-image:url("../img/logos/logo.png");background-image:url("../img/logos/logo.svg"),none}header.banner .nav-primary li:hover ul:after{display:none}@media screen and (max-width: 768px){header.banner .nav-primary ul{border-right:none}}header.banner #right-nav{float:right;margin-right:20px}@media screen and (max-width: 768px){header.banner #right-nav{margin-right:0}}header.banner #user-link{position:relative}@media screen and (max-width: 768px){header.banner #user-link{border-top:1px solid #d4d7d4;width:100%}}header.banner #user-link>a{padding-bottom:12px}@media screen and (max-width: 768px){header.banner #user-link>a{display:none}}header.banner #user-link .normal,header.banner #user-link .hover{margin-right:7px}@media screen and (max-width: 768px){header.banner #user-link .normal,header.banner #user-link .hover{display:none}}header.banner #user-link .hover{display:none}header.banner #user-link .nav{-webkit-border-radius:0px 0px 4px 4px;-moz-border-radius:0px 0px 4px 4px;border-radius:0px 0px 4px 4px;background-color:#FFF;border:none;display:none;position:absolute;right:0;top:48px;box-shadow:0px 2px 4px rgba(0,0,0,0.15)}@media screen and (min-width: 769px){header.banner #user-link .nav a.active{background:none;border:none}}header.banner #user-link .nav a:hover{background-color:transparent}@media screen and (max-width: 768px){header.banner #user-link .nav a:hover{background-color:#F8F8F8;color:#333}}@media screen and (max-width: 768px){header.banner #user-link .nav{background:none;position:relative;top:inherit;width:100%;box-shadow:none;float:left;padding:0}header.banner #user-link .nav li{border-bottom:1px solid #d4d7d4;width:100%;float:left}header.banner #user-link .nav li a{padding:10px 14px;width:100%}}@media screen and (max-width: 768px){header.banner #user-link:hover>a{background-color:transparent}}header.banner #user-link:hover .normal{display:none}header.banner #user-link:hover .hover{display:inline-block}@media screen and (max-width: 768px){header.banner #user-link:hover .hover{display:none}}header.banner #user-link:hover .nav{display:block}header.banner .nav-toggle{background-image:url("../img/icons/navigation-menu-plain.png");background-image:url("../img/icons/navigation-menu-plain.svg"),none;top:0}@media screen and (max-width: 768px){header.banner .nav-toggles .open{display:block}header.banner .nav-toggles .close{display:none}header.banner #canonlist:target ul{display:block}header.banner #canonlist:target+.nav-toggles .open{display:none}header.banner #canonlist:target+.nav-toggles .close{display:block}}.page-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;float:left;position:fixed;z-index:10;top:48px}.page-header .page-header__nav{position:absolute;top:10px;z-index:1000}.page-header .page-header__nav a{font-weight:300}.page-header .page-header__title{font-size:2em;width:auto;padding:31px 0;margin:0;float:left;font-size:32px}.page-header .page-header__title [contenteditable="true"]{display:inline-block;padding:8px 10px;width:auto;box-sizing:border-box;border:1px solid transparent;margin:-10px 0 -10px -10px;border-radius:2px;color:#333;cursor:default;font-size:32px}.page-header .page-header__title [contenteditable="true"].editable:hover{border:1px solid #D2D2D2;cursor:text}.page-header .page-header__title [contenteditable="true"]:active,.page-header .page-header__title [contenteditable="true"]:focus{outline:none;background-color:#FFF;border:1px solid #B2B2B2}.page-header .page-header__title [contenteditable="true"].invalid,.page-header .page-header__title [contenteditable="true"].invalid:hover,.page-header .page-header__title [contenteditable="true"].invalid:active,.page-header .page-header__title [contenteditable="true"].invalid:focus{border-color:#d90000}.page-header .page-header__title [contenteditable="true"] br{display:none}.page-header .page-header__title .icon{vertical-align:3px;margin-right:10px}.page-header .page-header__title .page-header__title--identicator{font-size:0.6em;width:auto;display:inline-block;position:relative;top:0px;padding-left:20px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator a{color:#888}.page-header .page-header__title .page-header__title--identicator a:hover{text-decoration:none;border-bottom:3px solid #888}.page-header .page-header__title .page-header__title--identicator a:focus,.page-header .page-header__title .page-header__title--identicator a:active{text-decoration:none}.page-header .page-header__title .page-header__title--identicator a.active{color:#333;border-bottom:3px solid #dd4814}.page-header .page-header__title .page-header__title--identicator a.active:hover{text-decoration:none;cursor:default}.page-header .page-header__title .page-header__title--identicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore{font-size:14px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore:hover{border:0;text-decoration:underline}.page-header .page-header__title .link-cta-ubuntu,.page-header .page-header__title .alt{font-size:16px;margin-left:20px;position:relative;vertical-align:middle;margin-top:-5px}.page-header .page-header__actions{float:right;padding:34px 0;margin-bottom:0}.page-header .page-header__actions .page-header__cta{float:right;position:relative;height:auto;max-height:36px}.page-header .page-header__actions .page-header__cta .cta-group{float:right}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback{display:inline-block;position:relative;line-height:36px;text-align:right;color:#dd4814;margin-right:20px;cursor:pointer}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback:hover{text-decoration:underline}.page-header .page-header__dropdown{float:left;width:100%;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;border-color:#888 !important}.page-header .page-header__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out;border-top:none}.page-header .page-header__dropdown .page-header__feedback{border-top:1px dotted #888;display:inline-block;width:100%;padding:20px 0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;background-position:top 3px left 0px;background-repeat:no-repeat;padding:6px 0 5px 25px;width:auto;display:inline-block;position:relative}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none;background-position:0px 9px}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info.progress,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error.progress{width:100%}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress{padding-left:0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress .loader{position:relative;top:1px}.title .title__indicator .title__link{color:#888;font-size:20px}.title .title__indicator .title__link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.title .title__indicator .title__link:focus,.title .title__indicator .title__link:active{text-decoration:none}.title .title__indicator .title__link.active{color:#333;border-bottom:1px #dd4814 solid}.title .title__indicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.accounts .logout .divide{padding:0 20px 0 30px;display:inline-block}.accounts .api li{position:relative}.accounts .api li input[type='text']{line-height:30px;padding-right:30px;width:100%}.accounts .api li input[type='text']::-webkit-input-placeholder{color:#333}.accounts .api li input[type='text']:-moz-placeholder{color:#333}.accounts .api li input[type='text']::-moz-placeholder{color:#333}.accounts .api li input[type='text']:-ms-input-placeholder{color:#333}.accounts .api li .delete-link{position:absolute;top:7px;right:7px}form.page-title-form{margin-bottom:30px}form.page-title-form input{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid transparent;background-color:transparent;font-size:36px;line-height:26px;color:#333;margin:6px 10px;padding:4px;height:auto;box-shadow:none}form.page-title-form input:hover{outline:none;background:#FFF;border-color:#D2D2D2;box-shadow:inset 0 1px 1px rgba(0,0,0,0.1)}form.page-title-form input:focus{border:1px solid #dd4814;background-color:#fff;outline:none}.small-icon{width:12px}.images-info{text-align:center;padding:10px}.images-warning{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}#loader{width:10px;margin:16px auto 0 auto}#importing{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;position:relative}#importing .spinner{position:absolute;left:15px}.importing-dot{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite}.selector{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;padding:20px;background:#FFF;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;width:100%;float:left}.selector h2{font-size:1em;font-weight:300}.selector h2 img{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;background:url("../img/icons/help.svg") no-repeat;width:16px;height:16px;padding-left:16px;margin-left:5px}.selector .selector-available,.selector .selector-chosen{width:46%;float:left;margin:0;text-align:left}@media screen and (max-width: 768px){.selector .selector-available,.selector .selector-chosen{width:100%}}.selector .selector-available h2,.selector .selector-chosen h2{background:none;border:none}.selector .selector-available select,.selector .selector-chosen select{margin-bottom:10px}.selector ul.selector-chooser{width:8%;float:left;margin:20% 0 0}@media screen and (max-width: 768px){.selector ul.selector-chooser{width:100%;margin:0 0 10px;text-align:center}}.selector ul.selector-chooser li{width:100%;text-align:center}@media screen and (max-width: 768px){.selector ul.selector-chooser li{width:auto;display:inline-block;height:16px;width:16px;margin:0 20px}}.selector ul.selector-chooser li a{display:block;text-indent:999em;width:16px;height:16px;overflow:hidden;margin:0 auto}.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_right.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_down.svg")}}.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_left.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_up.svg")}}.selector .selector-filter img{display:none}.selector .selector-filter input{background-image:url("../img/search-orange.png");background-repeat:no-repeat;background-position:top 7px right 8px}.selector select#id_mac_addresses_to.filtered{height:269px !important}.nodes{position:relative}.nodes .search{position:absolute;right:0}.nodes .search input[type='submit']{position:absolute;top:8px;right:12px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0}.nodes .search input[type='submit']:hover{color:transparent;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat}@media screen and (max-width: 768px){.nodes .search{position:relative}}@media screen and (max-width: 768px){.nodes .actions select{width:100%;margin-bottom:20px}.nodes .actions input{position:absolute;right:0;top:0}}.powerstates{width:14px;height:15px;display:inline-block}.powerstates.power-on{background:transparent url("../img/icons/power-on.svg") left top no-repeat}.powerstates.power-off{background:transparent url("../img/icons/power-off.svg") left top no-repeat}.powerstates.power-unknown{background:none}.powerstates.power-error{background:transparent url("../img/icons/power-error.svg") left top no-repeat}.powerstates.power-check-ok{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#33CC00}.powerstates.power-check-error{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#FF0000}.node-actions .link-cta-ubuntu,.node-actions .cta-ubuntu{margin-bottom:10px;float:left;font-size:16px}.buttons{margin-top:30px}#network-interfaces li{list-style-type:none}#content-discovery-data{padding-top:20px;margin-top:20px;border-top:1px dotted #B2B2B2}#content-discovery-data .slider{height:0;overflow:hidden}.slider{padding-top:0 !important}.slider .content{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);background:#FFF;border:1px solid #EEE;border-top:none;padding:20px}.slider .content pre{margin:0}.slider .tabs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;padding:8px 20px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;border:1px solid #EEE}.add-machine__list{padding:13px 0 20px;border-top:1px dotted #888;margin-bottom:0}.add-machine__list .add-machine__details{background:transparent url("../img/icons/accordion-open.svg") top 12px right 10px no-repeat}.add-machine__list .add-machine__details>div{margin-bottom:0}.add-machine__list .add-machine__details .add-machine__details-form{display:none}.add-machine__list .add-machine__details.active{background-image:url("../img/icons/accordion-close.svg")}.add-machine__list .add-machine__details.active .add-machine__details-form{display:block}.power-status{display:inline-block;font-size:100%;padding-left:0}.power-status--power{display:inline-block;margin-left:20px;position:relative;font-size:100%}.power-status--power.checking{color:#2AB7EC;background:url("../img/status_in_progress.svg");padding-left:20px}.power-status--power.on{padding-left:20px;color:#38B44A;background:transparent url("../img/icons/power-on.svg") left top 4px no-repeat}.power-status--power.off{padding-left:20px;color:#D2D2D2;background:transparent url("../img/icons/power-off.svg") left top 4px no-repeat}.power-status--power.error{padding-left:20px;color:#DB3832;background:transparent url("../img/icons/power-error.svg") left top 4px no-repeat}.power-status--power .power-check{font-size:0.75em;color:#D2D2D2;display:inline-block;padding:0}.power-status--power .power-check .power-check__link{color:#888;text-decoration:none;margin-left:5px}.power-status--power .power-check .power-check__link:hover{border-bottom:0 !important;text-decoration:underline !important}.loading,.loader{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0;display:inline-block}.details__used{color:#BCBCBC}.details .details__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.details .details__label a{color:#BCBCBC}.details .details__label a:hover{color:#dd4814}.details .details__label.active a{color:#dd4814}.details .details__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.details .details__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.details .table-row .details__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.details .table-row .details__text{line-height:37px}.details .table-row:hover .details__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.details .table-row:hover .details__controls{z-index:1;opacity:1}.details .table-row:hover .details__controls--secondary{z-index:1;opacity:1}.details .table-row.active:hover .details__input{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px}.details .table-row.active:hover .details__controls{opacity:0;z-index:-1000;pointer-events:none}.details .table-row.active:hover .details__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.details .table-row label{font-size:13px;color:#BCBCBC}.details .table-row input,.details .table-row select{margin:0 0 0 -14px}.details .table-row input[type="radio"]{margin-left:0}.details .details__dropdown .details__row{border-bottom:0;position:relative}.details .details__dropdown .details__row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:relative;height:1px;content:''}.details .details__dropdown .details__row.details__row--head{border-bottom:0}.details .details__dropdown .details__row.details__row--head .table-cell{color:#BCBCBC;font-size:13px}.details .details__dropdown .details__row.no-border{border:0}.details .details__dropdown .details__row.no-border:before{border:0}.details .details__dropdown--info .table-row{border-bottom:0}.details .details__dropdown--info .table-cell{color:#BCBCBC}
2289+=======
2290+.fake{display:none}body{font-size:14px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;clear:none;display:inline-block;float:none;margin-right:2.12766%;margin-bottom:20px;position:relative;width:100%}.twelve-col .one-col,.twelve-col .two-col,.twelve-col .three-col,.twelve-col .four-col,.twelve-col .five-col,.twelve-col .six-col,.twelve-col .seven-col,.twelve-col .eight-col,.twelve-col .nine-col,.twelve-col .ten-col,.twelve-col .eleven-col{width:100%}.last-col,.last{margin-right:0}.clearfix:after,.container:after{clear:both;content:"\0020";display:block;height:0;overflow:hidden;visibility:hidden}.clear{clear:both}.clearfix{display:block}@media only screen and (min-width: 768px){body{font-size:15px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col{width:48.8938%;margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}@media only screen and (min-width: 984px){body{font-size:16px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.three-col:nth-child(1):nth-last-child(4),.three-col:nth-child(2):nth-last-child(3),.three-col:nth-child(3):nth-last-child(2),.three-col:nth-child(4):nth-last-child(1){width:23.36%}.three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col:nth-child(1):nth-last-child(4),.twelve-col .three-col:nth-child(2):nth-last-child(3),.twelve-col .three-col:nth-child(3):nth-last-child(2),.twelve-col .three-col:nth-child(4):nth-last-child(1){width:23.3407%}.twelve-col .three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,ol,ul,li,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot");src:url("../fonts/ubuntu-l-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#ubuntulight") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:400;src:local("Ubuntu");src:url("../fonts/ubuntu-r-webfont.eot");src:url("../fonts/ubuntu-r-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#ubunturegular") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot");src:local("Ubuntu Medium"),local("Ubuntu-Medium"),url("../fonts/ubuntu-m-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#ubuntumedium") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot");src:local("Ubuntu Bold"),local("Ubuntu-Bold"),url("../fonts/ubuntu-b-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#ubuntubold") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot");src:local("Ubuntu Light Italic"),local("Ubuntu-LightItalic"),url("../fonts/ubuntu-li-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#ubuntulight_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:local("Ubuntu Italic"),local("Ubuntu-Italic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot");src:local("Ubuntu Medium Italic"),local("Ubuntu-MediumItalic"),url("../fonts/ubuntu-mi-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#ubuntumedium_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:local("Ubuntu Bold Italic"),local("Ubuntu-BoldItalic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}html{font-size:100%}body{color:#333;font-family:Ubuntu, Arial, "libra sans", sans-serif;font-weight:300}blockquote,q{quotes:none}blockquote{margin:28px 20px}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}legend{border:0;*margin-left:-7px}figure{margin:0}abbr,acronym{cursor:help}a:focus{outline:thin dotted}a:hover,a:active{outline:0}a:link,a:visited{color:#dd4814;text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}a.link-arrow:after{content:"\0000a0›"}nav ul li h2 a:after{content:"\0000a0›"}nav ul li a:after,.carousel ul li a:after,ul li p a:after{content:""}ol,ul{margin-left:20px;margin-bottom:20px}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}nav ul,nav ol{list-style:none;list-style-image:none}svg:not(:root){overflow:hidden}img{border:0;height:auto;max-width:100%}img.left{margin-right:20px}img.right{margin-left:20px}.middle img{vertical-align:middle;margin-top:4em}h1,h2,h3,h4,h5,h6{font-weight:300;line-height:1.3}h1{font-size:1.625em;margin-bottom:.5em}h2{font-size:1.438em;margin-bottom:.5em}h3{font-size:1.219em;margin-bottom:.522em}h4{font-size:1.25em;font-weight:400;margin-bottom:.615em}h5{font-size:1em;font-weight:700;margin-bottom:1em}h6{font-size:.723em;font-weight:400;margin-bottom:1em;letter-spacing:.1em;text-transform:uppercase}p,li{font-size:1em;line-height:1.5;margin:0;margin-bottom:.75em;padding:0}h2 span,h1 span{display:block}p+h2,ul+h2,ol+h2,pre+h2{margin-top:0.5625em}header nav a:link{font-weight:normal}p+h3,ul+h3,ol+h3,pre+h3{margin-top:0.78261em}p+h4,ul+h4,ol+h4,pre+h4{margin-top:1.39286em}ol+h2,p+h2,pre+h2,ul+h2{margin-top:.563em}ol+h3,p+h3,pre+h3,ul+h3{margin-top:.783em}ol+h4,p+h4,pre+h4,ul+h4{margin-top:1.219em}li{margin-bottom:.4em}li:last-of-type{margin-bottom:0}ins{background:#fffbeb;text-decoration:none}small,.smaller{font-size:13px}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{vertical-align:text-top}sub{vertical-align:text-bottom}dfn{font-style:italic}mark{background:#ff0;color:#000}code,pre{font-family:"Ubuntu Mono", "Consolas", "Monaco", "Lucida Console", "Courier New", Courier, monospace}pre{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdf6f2;padding:0.6em 1em;white-space:pre-wrap;word-wrap:break-word}blockquote{margin:0}blockquote>p{font-size:0.92857em;margin-bottom:0.92308em;font-weight:100;margin:0 0 0.4em 0}blockquote small{font-size:.813em;line-height:1.4}button,input,select,textarea{font-family:Ubuntu,Arial,"libra sans",sans-serif;margin:0;vertical-align:baseline;*vertical-align:middle}select{font-size:1em;font-weight:300}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-box-sizing:content-box;-webkit-appearance:none;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-weight:300;outline:none;padding:0.69565em 0.86957em}input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}form fieldset{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-repeat:no-repeat;background-color:#EFEEEC;background-position:-15px -15px;border:0;margin-bottom:8px;padding:15px 20px}form fieldset h3{border-bottom:1px dotted #dfdcd9;margin-bottom:9px;padding-bottom:10px}form fieldset li:first-child{margin-top:0}form input[type="text"],form input[type="email"],form input[type="tel"],form textarea{-webkit-appearance:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;border:1px solid #999;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0.69565em 0.86957em}form input:focus,form textarea:focus{border:1px solid #dd4814}form textarea[readonly='readonly']{color:#999}form input[type="checkbox"],form input[type="radio"]{margin:0;width:auto}form input[type="checkbox"]+label,form input[type="radio"]+label{display:inline;margin-left:5px;vertical-align:middle;width:auto}form input[type="submit"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:#dd4814;background-image:-moz-linear-gradient(#f26120, #dd4814);background-image:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#f26120), to(#dd4814));background-image:-webkit-linear-gradient(#f26120, #dd4814);background-image:-o-linear-gradient(#f26120, #dd4814);-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border:0;color:#fff;display:block;padding:10px 14px;text-shadow:none;width:auto;margin-bottom:0}form input[type="submit"]:hover{background:#dd4814}form label{cursor:pointer;display:block;margin-bottom:4px}form label span{color:#df382c}form ul{margin-left:0}form li{list-style:none outside none;margin-top:14px}form button[type="submit"]{border:0;display:inline-block;font-family:Ubuntu, Arial, "libra sans", sans-serif;text-decoration:none;font-weight:300}form input[type="reset"]{display:none}table{border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.85714em 0;width:100%}table th,table td{padding:15px 10px;background:#f0edea;border:1px dotted #888888}table td{text-align:center;vertical-align:middle}table thead th{border-collapse:separate;border-spacing:0 10px;background:#fee3d2;color:#333333;font-weight:normal}table tbody th{text-align:left;font-weight:normal;font-weight:300}table th[scope="col"]{text-align:center}table thead th:first-of-type{text-align:left}@media only screen and (max-width: 768px){table{display:block}}@media only screen and (min-width: 984px){form fieldset{padding:15px 20px}img{max-width:none}}.audience-consumer{color:#333333}.audience-consumer .row-box,.audience-consumer .main-content{color:#333333}.audience-consumer .inner-wrapper{background:#fff}.audience-consumer .quote-right-top{padding:60px 60px 0 40px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat;height:287px;position:absolute;right:-40px;text-align:left;top:-90px;width:31.91489%}.audience-consumer .quote-right-top p{font-size:1.14286em;margin-bottom:0.75em;margin:0.769em;padding-bottom:0;color:#fff}.audience-consumer .quote-right-top p cite{font-size:0.85714em;margin-bottom:1em;color:#fff;padding:0}.audience-consumer .quote-right-top p a,.audience-consumer .quote-right p a{color:#fff}.audience-consumer .quote-right{font-size:1.28571em;margin-bottom:0.66667em;color:#fff;padding:50px 100px 0 50px;text-indent:-6px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;min-height:287px;position:absolute;right:-20px;text-align:left;top:-90px;width:21.2006% em}.audience-consumer .quote-right cite{font-style:normal;margin-left:6px}.audience-consumer .quote-right-alt{background:url(/sites/ubuntu/latest/u/img/patterns/quote-white-br-360x360.png) 0 -100px no-repeat;color:#dd4814;padding:50px 50px 0 50px}.audience-consumer .quote-right-right{background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat}.audience-enterprise h1{margin:0 0 18px 0}.audience-enterprise td{background:#fff}.audience-enterprise th,.audience-enterprise td{padding:6px 10px;background:#fff}.audience-enterprise th[scope="col"]{background:#E2D4DC;color:#772953}.audience-enterprise tbody th[rowspan]{background:#F7F2F6}.audience-enterprise tfoot th[rowspan]{background:#dfdcd9}.audience-enterprise tfoot td,.audience-enterprise tfoot th{font-weight:normal;background:#dfdcd9}.audience-enterprise .inner-wrapper{background:#2c001e;color:#fff}.audience-enterprise .row-box{background:#fff;color:#333333}.row-enterprise{background:#772953;color:#fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-enterprise .box,.row-enterprise div{background:#772953;color:#fff}.row-enterprise a{color:#fff}.enterprise-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/enterprise-dot-pattern.png")}.developer-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/developer-dot-pattern.png")}.wrapper,header.banner .nav-primary,nav div.footer-a div,.inline-lists ul,.legal{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:auto}.inner-wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;clear:both;display:block;float:left;width:100%;margin:0;padding-bottom:20px;position:relative;z-index:1}@media only screen and (min-width: 768px){.med-six-col .three-col{width:48%}.med-six-col .three-col:nth-of-type(2n){margin-right:0}}@media only screen and (min-width: 769px){.inner-wrapper{border-radius:4px;padding-bottom:20px}}@media only screen and (min-width: 984px){.wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin:0 auto;position:relative;text-align:left;width:984px}.inner-wrapper{-moz-box-shadow:0 0 3px #c9c9c9;-webkit-box-shadow:0 0 3px #c9c9c9;box-shadow:0 0 3px #c9c9c9;margin:10px 0 30px}.three-col,.med-six-col .three-col{width:23.30%}.three-col.last-col:nth-of-type(2n){margin-right:0}.med-six-col .three-col:nth-of-type(2n){margin-right:20px}.med-six-col .three-col.last-col{margin-right:0}}.left{float:left}.right{float:right}.caps{text-transform:uppercase}img{border:0 none;height:auto;max-width:100%}img.left{margin-right:0}img.touch-border{margin-bottom:-3px}.accessibility-aid,.off-left{position:absolute;left:-999em}a.external{-moz-background-size:0.7em 0.7em;-webkit-background-size:0.7em 0.7em;-o-background-size:0.7em 0.7em;background-size:0.7em 0.7em;padding-right:.9em;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.svg");background-position:right 1px;background-repeat:no-repeat}.opera-mini a.external,.no-svg a.external{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.png")}.text-center,.align-center{text-align:center}.no-margin{margin:0}.no-margin-bottom{margin-bottom:0}.no-padding-bottom{padding-bottom:0}.pull-left-20{margin-left:-20px}.pull-right-20{margin-right:-20px}.pull-left-40{margin-left:-40px}.pull-right-40{margin-right:-41px}.no-border{border:0}.link-top{font-size:1em;margin-bottom:0.85714em;clear:both;margin-bottom:40px;margin-top:-40px}.link-top a{background:#fff;margin-right:10px;margin-top:-17px;padding:5px;float:right}.pull-bottom-right{position:absolute;right:0;bottom:0;left:auto}.box .pull-bottom-right{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0}.pull-bottom-left{margin-left:-20px;margin-bottom:-21px}.pull-top-right{margin-left:-20px;margin-top:-21px}div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:absolute;left:-999em}.priority-0,.not-for-small{position:absolute;left:-999em}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-container+h3,.video-container+.video-title{margin-top:20px}@media only screen and (max-width: 768px){.pull-right-40{margin-right:-30px}.pull-bottom-right,.pull-bottom-left{position:static}img.pull-bottom-left{margin-bottom:0;margin-left:0}}@media only screen and (min-width: 768px){div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:relative;left:auto}.priority-0,.not-for-small{position:relative;left:auto}.for-mobile,.for-small{position:absolute;left:-999em}.pull-right{float:right;margin-right:-30px}img.pull-left{margin-left:-30px}img.touch-border{float:left;margin-bottom:-30px}}@media only screen and (min-width: 769px){img.left{margin-right:20px}}@media only screen and (min-width: 984px){img.touch-border{float:left;margin-bottom:-40px}img.pull-left{margin-left:-40px}.pull-right{float:right;margin-right:-40px}.for-tablet,.for-medium{display:none}.no-border{border:0}}.caps-centered,.muted-heading{font-size:.875em;margin-bottom:20px;text-align:center;text-transform:uppercase}p.intro{font-size:1.14286em;margin-bottom:0.75em;line-height:1.4}.row div p:last-child,.row div ul:last-child{margin-bottom:0}.four-col p:last-child{margin-bottom:0}.note{color:#888888;font-size:.813em}@media only screen and (min-width: 768px){p.intro{font-size:1.13333em}}@media only screen and (min-width: 984px){h1{font-size:2.8125em}h2{font-size:2em;margin-bottom:.375em}h3{font-size:1.438em;margin-bottom:.522em}h4{font-size:1em;margin-bottom:.75em}h5{font-size:1em}p,li,code,pre{font-size:16px;line-height:1.5;margin-bottom:.75em}p.intro{font-size:1.25em}}header.banner{border-top:0;min-width:100%;width:auto;background:#dd4814;display:block;position:relative;z-index:2}header.banner .nav-primary{border:0;margin:0 auto;overflow:hidden}header.banner .nav-primary ul{border-right:1px solid #ed6637;float:left;margin:0;position:relative}header.banner .nav-primary ul li{border-left:1px solid #c64012;float:left;list-style-image:none;margin:0;text-indent:0;vertical-align:bottom}header.banner .nav-primary ul li:last-child{border-right:1px solid #c64012}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited{font-size:14px;border-left:1px solid #ec5b29;color:#fff;display:block;margin-bottom:0;padding:14px 14px 13px;position:relative;text-align:center;text-decoration:none;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased}header.banner .nav-primary ul a.active{background:#B83A10;border-left:1px solid #ec5b29}header.banner .nav-primary ul li a:hover{background:#e1662f;border-top:0;-moz-box-shadow:inset 0 2px 2px -2px #777;-webkit-box-shadow:inset 0 2px 2px -2px #777;box-shadow:inset 0 2px 2px -2px #777}#main-navigation-link{display:none}header.banner .nav-toggle{position:absolute;right:0;display:block;width:48px;height:48px;text-indent:-99999px;background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg);-moz-background-size:25px auto;-webkit-background-size:25px auto;-o-background-size:25px auto;background-size:25px auto;background-repeat:no-repeat;background-position:center center;cursor:pointer}header.banner .no-script{display:none}.opera-mini header.banner .nav-toggle,.no-svg header.banner .nav-toggle{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png)}header.banner nav ul{background-color:#f0f0f0;display:none;float:left}header.banner .nav-primary.active{-moz-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);padding:0;border-bottom:1px solid #d4d7d4}header nav ul.active{display:block}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{display:block;padding:0;margin:0;border:none}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:#d0d0d0}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner .nav-primary ul li{border-bottom:1px solid #F2F2F4;font-size:16px}header.banner .nav-primary ul li:last-child{border:0}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:14px 14px 13px;text-align:left}header.banner nav.nav-primary ul.active li ul{display:none}#menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.svg);background-repeat:no-repeat;background-position:50% 26px;content:"";display:block;height:23px;margin-left:0;padding-bottom:17px;position:relative;top:-3px;width:48px;z-index:999}html.no-svg #menu.active:after,.opera-mini #menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.png)}.nav-secondary{border-bottom:1px solid #dfdcd9;margin-bottom:0}.nav-secondary ul{float:left;margin-bottom:10px;margin-left:2px}.nav-secondary ul li{float:left;margin-top:16px;font-size:14px;margin-right:15px}.nav-secondary ul li a:link,.nav-secondary ul li a:visited{color:#333;font-size:14px;float:left}.nav-secondary ul li a:hover,.nav-secondary ul li a:active{color:#dd4814;text-decoration:none}.nav-secondary ul li,.nav-secondary ul li.active a:link,.nav-secondary ul li.active a:visited{color:#dd4814;text-decoration:none}.nav-secondary ul.breadcrumb{margin-left:20px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{color:#888888;margin-right:8px}.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#dd4814}header.banner h2{font-size:1.78571em;margin-bottom:0.48em;display:block;left:4px;margin-bottom:0;position:relative;text-transform:lowercase;top:14px}header.banner h2 a:link,header.banner h2 a:visited,header.banner a{color:#fff;float:left;text-decoration:none}header.banner .logo{border-left:0;float:left;height:48px;overflow:hidden}header.banner .logo-ubuntu{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/ubuntu-logo.png") no-repeat scroll 0 10px transparent;font-size:18px;margin-bottom:0;position:relative;text-transform:lowercase;float:left;margin:0;display:inline-block;height:32px;min-width:128px;margin-right:-20px;margin-left:10px;padding:7px 14px 9px 0}header.banner .logo-ubuntu img{margin-right:8px;position:absolute;left:-999em}header.banner .logo-ubuntu span{float:left;font-size:23px;font-weight:300;padding-left:122px;padding-right:20px;position:relative;top:5px}header.banner .nav-primary.nav-left .logo-ubuntu{float:right}header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.svg");background-size:107px 25px;float:left}html.no-svg header.banner .nav-primary.nav-right .logo-ubuntu,.opera-mini header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.png")}@media only screen and (max-width: 295px){header.banner .nav-primary.nav-right .logo-ubuntu,header.banner .logo-ubuntu{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.svg") 0 50% no-repeat;min-width:0;width:38px}header.banner .logo-ubuntu span{padding-left:38px}}html.no-svg header.banner .logo-ubuntu,.opera-mini header.banner .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.png")}@media only screen and (max-width: 768px){header.banner .nav-primary{-moz-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);box-shadow:0 1px 2px 1px rgba(0,0,0,0.2)}header.banner .nav-primary.active{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;padding:0}header nav ul.active{float:left}header nav ul.active li:last-child a:link,header nav ul.active li:last-child a:visited{border-bottom:0}header.banner .nav-primary ul{position:relative;width:100%}header.banner .nav-primary ul li.active a:link,header.banner .nav-primary ul li.active a:visited{color:#333;font-weight:700}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border:none;display:block;font-weight:300;margin:0;padding:0;width:100%}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{background-color:#f0f0f0;border-bottom:1px solid #d4d7d4;color:#333333;font-size:1em}header.banner .nav-primary ul li:nth-last-child(-n+2) a:link,header.banner .nav-primary ul li:nth-last-child(-n+2) a:visited{border:0}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background:#f8f8f8}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:8px 10px;text-align:left}header.banner .nav-primary ul li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border-bottom:0;border-right:1px solid #d4d7d4;float:left;width:50%}.nav-secondary{background:#fff}.nav-secondary ul.second-level-nav{border-top:1px solid #d4d7d4;display:none;margin-bottom:0;margin-left:0;padding-bottom:10px;padding-top:10px;width:100%}.nav-secondary ul.second-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left}.nav-secondary ul.second-level-nav li a,.nav-secondary ul.second-level-nav li a:link,.nav-secondary ul.second-level-nav li a:visited{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;height:100%;padding:10px 10px 10px 20px;width:100%}.nav-secondary ul.second-level-nav li.active a,.nav-secondary ul.second-level-nav li.active a:link,.nav-secondary ul.second-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav{display:none;margin-bottom:0;width:100%;padding-bottom:20px}.nav-secondary ul.third-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left;padding-left:30px}.nav-secondary ul.third-level-nav li a,.nav-secondary ul.third-level-nav li a:link,.nav-secondary ul.third-level-nav li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:10px 10px 10px 0;display:block;width:100%;height:100%}.nav-secondary ul.third-level-nav li.active a,.nav-secondary ul.third-level-nav li.active a:link,.nav-secondary ul.third-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav li.single-link{width:100%}.nav-secondary ul.third-level-nav li:only-child{width:100%}.nav-secondary ul.breadcrumb{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-left:0;margin-bottom:0}.nav-secondary ul.breadcrumb li:first-of-type{border-bottom:1px solid #d4d7d4;margin-bottom:-1px}.nav-secondary ul.breadcrumb li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#fff;width:100%;display:block;height:40px;margin:0}.nav-secondary ul.breadcrumb li a,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:16px;width:100%;color:#333333;display:block;margin-right:0;text-decoration:none;padding:8px 10px 0 10px}.nav-secondary ul.breadcrumb li.active{margin-top:12px}.nav-secondary ul.breadcrumb li.active a,.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.breadcrumb li:nth-of-type(2n){margin-top:12px}.nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.svg);background-position:center center;background-repeat:no-repeat;background-size:18px;float:right;height:18px;margin-right:-5px;margin-top:-6px;padding:10px;position:relative;right:0;top:0;width:18px}.nav-secondary ul.breadcrumb li+li{display:none}.nav-secondary ul.breadcrumb li+li a:link,.nav-secondary ul.breadcrumb li+li a:active,.nav-secondary ul.breadcrumb li+li a:visited{padding-left:20px}.nav-secondary ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li a:after,.nav-secondary.open ul.breadcrumb li a:link:after,.nav-secondary.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg)}.nav-secondary.open ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg);margin-top:-7px}.nav-secondary.open ul.second-level-nav,.nav-secondary.open ul.third-level-nav,.nav-secondary.open ul.breadcrumb li+li{display:block}.no-js .nav-secondary ul.second-level-nav{display:block}.no-js #main-navigation-link{position:absolute;right:10px;top:12px;width:20px;height:28px;z-index:999;text-indent:-999em;display:block}.no-js #main-navigation-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;display:block;width:28px;height:28px;position:absolute}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;display:block;height:48px;position:absolute;right:0;text-indent:-99999px;width:48px}html.no-svg header.banner .nav-toggle,.opera-mini header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png")}}@media only screen and (min-width: 768px){header.banner .nav-primary ul li{border-bottom:0}}@media only screen and (min-width: 769px){header.banner{-moz-box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF;-webkit-box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF;box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF}header.banner nav.nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border-bottom:0}header.banner .nav-toggle{display:none}header.banner nav ul{background-color:transparent;display:block}header.banner .nav-primary ul li{border-left:1px solid #C64012}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:1px solid #EC5B29}header.banner .nav-primary ul li:last-child{border-right:1px solid #C64012;border-left:1px solid #C64012}header.banner .nav-primary ul li a.active{background-color:#B83A10}header.banner .nav-primary ul li a:hover{background-color:#E1662F}.nav-secondary ul:last-child li:last-child{padding-bottom:10px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.second-level-nav li,.nav-secondary ul.third-level-nav li{margin-right:15px}.nav-secondary ul.breadcrumb{float:left}.nav-secondary ul.breadcrumb li{margin-bottom:10px}.nav-secondary ul{float:none;margin-bottom:0}.nav-secondary ul li{margin-bottom:5px}}@media only screen and (min-width: 984px){header.banner{margin-bottom:20px}header.banner nav.nav-primary ul{display:block}header.banner .nav-primary,#nav-global .nav-global-wrapper{width:984px}header.banner .nav-primary.nav-right .logo-ubuntu{margin-left:0}}header.banner .nav-primary ul{position:static}header.banner .nav-primary li ul{-moz-box-shadow:0 2px 2px -1px #777777;-webkit-box-shadow:0 2px 2px -1px #777777;box-shadow:0 2px 2px -1px #777777;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;background:#f7f7f7;border:1px solid #d5d5d5;display:none;float:none;margin:0;padding:5px 0;position:absolute;top:51px;width:200px}header.banner .nav-primary li:hover ul:after{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up-smaller.png") no-repeat;content:'';display:block;height:8px;left:20px;position:relative;top:-13px;width:200px;z-index:999}.no-generatedcontent header.banner .nav-primary li ul{-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;top:48px}header.banner .nav-primary li ul .arrow-up{display:none}header.banner .nav-primary li ul li{border:0;float:none}header.banner .nav-primary li ul li a:link,header.banner .nav-primary li ul li a:visited{border:0;color:#333333;padding:0 0 11px 14px;text-align:left;width:170px}header.banner .nav-primary li ul li a:hover{background:none repeat scroll 0 0 transparent;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#DD4814}header.banner .nav-primary li ul li.first a:link,header.banner .nav-primary li ul li.first a:visited,header.banner .nav-primary li ul li:first-of-type a:link{padding:10px 14px}header.banner .nav-primary li ul li.active a:link,header.banner .nav-primary li ul li.active a:visited{background:none repeat scroll 0 0 transparent !important}header.banner .nav-primary li ul .promo{border-top:1px solid #D5D5D5;float:left;margin-top:5px;padding:15px 0 0}header.banner .nav-primary li ul .promo a:link,header.banner .nav-primary li ul .promo a:visited{background:none repeat scroll 0 0 transparent;border-left:0 none;color:#333333;height:auto;padding:0;text-align:left}header.banner .nav-primary li ul .promo p{margin:0 10px}header.banner .nav-primary li ul .promo a:hover{box-shadow:none;color:#DD4814}header.banner .nav-primary li ul .promo img{margin-top:14px;margin-bottom:-6px;-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;position:relative;top:1px}header.banner .nav-primary li ul .promo .category{color:#888888;font-size:11px;margin:0 10px;text-transform:uppercase}header.banner .nav-primary li:hover ul{display:block}html.lt-ie8 header.banner .nav-primary li:hover ul{display:none}.header-search,#box-search{padding:7px 0 7px 14px;overflow:hidden}.header-search input[type="search"],.header-search input[type="text"],#box-search input[type="search"],#box-search input[type="text"]{-webkit-appearance:none;-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;background-color:#be3d00;border:none;color:#fff;display:block;float:left;font-size:16px;height:2.1em;margin-bottom:0;padding:0.5em 2.5em 0.5em 0.5em;width:100%}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-moz-placeholder,#box-search ::-moz-placeholder{color:white;opacity:0.4}.header-search :-ms-input-placeholder,#box-search :-ms-input-placeholder{color:white;opacity:0.4}.header-search input:-moz-placeholder,#box-search input:-moz-placeholder{color:white;opacity:0.4}.header-search ::placeholder,#box-search ::placeholder{color:white;opacity:0.4}.header-search input[type="search"]:focus,#box-search input[type="search"]:focus{background-color:#a63603}.header-search button[type=submit],#box-search button[type=submit]{padding:3px 2px;line-height:0;float:left;margin-left:-40px;display:block;background:none;overflow:visible}.header-search button[type=submit]:hover,#box-search button[type=submit]:hover{background:none}.header-search button[type=submit] img,#box-search button[type=submit] img{height:28px;width:28px}header.banner .search-toggle{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search_icon_white_64.png");background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search.svg");background-position:center center;background-repeat:no-repeat;display:block;height:48px;outline:none;overflow:hidden;position:absolute;right:58px;text-indent:-999em;top:0;width:24px}.search-toggle:link,.search-toggle:active{outline:none}#box-search,.header-search{background:#f0f0f0;border:0;display:none;float:left;margin-bottom:0;position:relative;margin:0 0 -1px 0;padding:0;width:100%;z-index:3}#box-search.active,.header-search.active,.header-search.open{display:block}#box-search div,.header-search div{-moz-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);-webkit-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);background:#f0f0f0;margin:10px;position:relative;z-index:1}#box-search form input[type="search"],.header-search form input[type="search"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;border:0;color:#333;font-size:16px;height:auto;margin:0;float:left;padding:9px 10px;width:100%}.yes-js .header-inner #box-search,.yes-js .header-inner .header-search{display:none}.yes-js .header-inner #box-search form,.yes-js .header-inner .header-search form{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0;margin-right:0;overflow:hidden;padding:10px;top:0;z-index:999;position:relative;width:100%}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}html.no-svg .search-toggle,.opera-mini .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.png")}}@media only screen and (min-width: 768px){header.banner .search-toggle{display:none}}@media only screen and (min-width: 960px){#box-search,.header-search{background:none;overflow:hidden;padding:7px 0 7px 14px;border-right:0 none;float:right;margin-bottom:0;padding-bottom:5px;padding-right:0;padding-top:7px;max-width:220px}#box-search form input[type="text"],#box-search form input[type="search"],.header-search form input[type="text"],.header-search form input[type="search"]{-moz-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-search.png") no-repeat scroll 5px center,none repeat scroll 0 0 #BE3D00;border:6px solid #DE6532;border-width:0 0 1px;color:#fff;font-size:0.813em;height:24px;margin-bottom:0;padding:4px 4px 4px 30px;transition:all 0.5s ease 0s;width:86px}}@media only screen and (max-width: 960px){header.banner nav.nav-primary .header-search{padding:0;position:relative;top:0;width:100%}header.banner nav.nav-primary .header-search input[type="search"]{border-radius:0;background:#f7f7f7;color:#333}header.banner nav.nav-primary .header-search button[type="submit"]{width:32px;height:38px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.svg") no-repeat scroll center center transparent;background-size:28px 28px}header.banner nav.nav-primary .header-search button[type="submit"] img{max-width:none;display:none}header.banner nav.nav-primary .header-search.open{display:block}header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;right:0;display:block;height:48px;position:absolute;text-indent:-99999px;width:48px}html.no-svg header.banner .search-toggle,.opera-mini header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/img/search-white.png")}.opera-mini x:-o-prefocus,.opera-mini header.banner .search-toggle{-o-background-size:25px auto;background-size:25px auto}}@media only screen and (min-width: 984px){#box-search,.header-search{display:block;margin-right:0}#box-search form input[type="text"]:focus,.header-search form input[type="text"]:focus{width:160px}}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}}body.ubuntu-search .nav-secondary,body.search-results .nav-secondary,body.search-no-results .nav-secondary{display:none}body.ubuntu-search section>h1,body.ubuntu-search section article h1,body.search-results section>h1,body.search-results section article h1,body.search-no-results section>h1,body.search-no-results section article h1{padding-bottom:10px;font-size:1.438em;margin-bottom:0}body.ubuntu-search section>h1,body.search-results section>h1,body.search-no-results section>h1{border-bottom:1px dotted #dfdcd9}body.ubuntu-search .main-search,body.search-results .main-search,body.search-no-results .main-search{padding:20px 0;margin:0 0 20px 0;background-color:transparent}body.ubuntu-search .main-search input[type="search"],body.search-results .main-search input[type="search"],body.search-no-results .main-search input[type="search"]{float:left;width:100%;font-size:2em;border:1px solid #999;-moz-box-sizing:border-box;box-sizing:border-box;padding:0.2em 65px 0.2em 0.2em}body.ubuntu-search .main-search button[type=submit],body.search-results .main-search button[type=submit],body.search-no-results .main-search button[type=submit]{padding:4px;line-height:0;float:left;margin-left:-53px;display:block;background:none;overflow:visible;width:auto;margin-top:-4px}body.ubuntu-search .main-search button[type=submit]:hover,body.search-results .main-search button[type=submit]:hover,body.search-no-results .main-search button[type=submit]:hover{background:none}body.ubuntu-search .main-search button[type=submit] img,body.search-results .main-search button[type=submit] img,body.search-no-results .main-search button[type=submit] img{height:45px;width:45px}body.ubuntu-search .search-result h1 .title-main,body.search-results .search-result h1 .title-main,body.search-no-results .search-result h1 .title-main{margin-right:20px}body.ubuntu-search .search-result h1 .result-url,body.search-results .search-result h1 .result-url,body.search-no-results .search-result h1 .result-url{color:#999;overflow:hidden;text-overflow:ellipsis;display:block;vertical-align:bottom;padding-bottom:2px}body.ubuntu-search .search-result h1 .result-url a,body.search-results .search-result h1 .result-url a,body.search-no-results .search-result h1 .result-url a{color:#999}body.ubuntu-search .search-result p,body.search-results .search-result p,body.search-no-results .search-result p{margin-bottom:0}body.ubuntu-search .num-results,body.search-results .num-results,body.search-no-results .num-results{display:inline-block;margin-left:20px}body.ubuntu-search .bottom-results-total,body.search-results .bottom-results-total,body.search-no-results .bottom-results-total{text-align:center;width:100%;overflow:visible;padding-top:20px;margin:0}body.ubuntu-search .bottom-nav,body.search-results .bottom-nav,body.search-no-results .bottom-nav{overflow:hidden;margin-top:-26px}body.ubuntu-search .bottom-nav ul,body.search-results .bottom-nav ul,body.search-no-results .bottom-nav ul{margin-bottom:0;margin-left:0;padding:0;overflow:hidden}body.ubuntu-search .bottom-nav li,body.search-results .bottom-nav li,body.search-no-results .bottom-nav li{float:left;margin-left:15px}body.ubuntu-search .bottom-nav li:first-child,body.search-results .bottom-nav li:first-child,body.search-no-results .bottom-nav li:first-child{margin-left:0}body.ubuntu-search .nav-back,body.search-results .nav-back,body.search-no-results .nav-back{float:left}body.ubuntu-search .nav-back li:before,body.search-results .nav-back li:before,body.search-no-results .nav-back li:before{content:"\2039";color:#dd4814;margin-right:5px}body.ubuntu-search .nav-back li.item-extreme:before,body.search-results .nav-back li.item-extreme:before,body.search-no-results .nav-back li.item-extreme:before{content:"\2039\2039"}body.ubuntu-search .nav-forward,body.search-results .nav-forward,body.search-no-results .nav-forward{float:right}body.ubuntu-search .nav-forward li:after,body.search-results .nav-forward li:after,body.search-no-results .nav-forward li:after{content:"\203A";color:#dd4814;margin-left:5px}body.ubuntu-search .nav-forward li.item-extreme:after,body.search-results .nav-forward li.item-extreme:after,body.search-no-results .nav-forward li.item-extreme:after{content:"\203A\203A"}body.ubuntu-search .error-notification,body.search-results .error-notification,body.search-no-results .error-notification{background-color:#fdffdc;color:#333;padding:20px;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-top:20px;display:block}body.ubuntu-search .result-line,body.search-results .result-line,body.search-no-results .result-line{color:#ada69e}body.ubuntu-search .results-top,body.search-results .results-top,body.search-no-results .results-top{border-bottom:1px dotted #dfdcd9;padding-bottom:0.5em}body.ubuntu-search .search-container,body.search-results .search-container,body.search-no-results .search-container{padding-bottom:0}@media only screen and (min-width: 768px){.ubuntu-search .main-search button[type=submit]{margin-left:-60px;margin-top:0}}body footer.global #nav-global li:first-of-type a{margin-left:0}footer.global{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 2px 2px -1px #d3d3d3;-webkit-box-shadow:inset 0 2px 2px -1px #d3d3d3;box-shadow:inset 0 2px 2px -1px #d3d3d3;background:none;border-top:0;clear:both;display:block;padding:30px 10px 20px;position:relative;width:100%}footer.global .legal{margin:0 auto;width:100%}footer.global .legal{background-image:none;position:relative;clear:both;min-height:40px}footer.global .legal p,footer.global .legal ul{padding-left:0}footer.global h2{font-size:0.75em;line-height:1.4;margin-bottom:0;padding-bottom:0.5em}footer.global h2,footer.global h2 a:link,footer.global h2 a:visited{color:#333333;font-weight:normal}footer.global nav ul li h2 a:after{content:""}footer.global ul{margin:0}footer.global nav ul li.two-col{display:inline-block;min-height:10em;vertical-align:top}footer.global nav ul li li{font-size:0.85714em;margin-bottom:1em;font-size:0.75em;margin-bottom:0}footer.global ul li li a:link,footer.global ul li li a:visited{color:#333333;margin-bottom:0}footer.global ul li li a:hover,footer.global ul li li a:active,footer.global h2 a:hover,footer.global h2 a:active{color:#dd4814}footer.global .inline li{display:inline}footer.global p,footer.global ul.inline li a{color:#333333;font-size:12px;margin-bottom:0}footer.global ul.inline li a:hover{color:#dd4814}footer.global ul.inline li:after{color:#888888;content:"\00b7";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:120px}footer.global ul.inline li:last-child:after{content:""}footer.global .inline li{float:none;margin-bottom:0}footer.global .top-link{-moz-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;-webkit-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;background:none repeat scroll 0 0 transparent;border:0 none;float:left;font-size:0.75em;letter-spacing:0.05em;margin:0 0 0 -10px;padding-right:20px;text-transform:uppercase;width:100%}footer.global .top-link a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.svg");background-position:10px center;background-repeat:no-repeat;background-size:14px 14px;border-bottom:0 none;color:#888888;display:block;float:none;font-weight:400;padding:12px 0 12px 28px}html.no-svg footer.global .top-link a,.opera-mini footer.global .top-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.png")}@media only screen and (max-width: 768px){footer.no-global .legal{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;box-shadow:0 2px 2px -1px #D3D3D3 inset;padding-top:10px;margin-left:-10px;padding-left:10px;padding-right:10px}#livechat-eye-catcher{display:block}}@media only screen and (min-width: 768px){footer.global .inline li{display:inline;float:left}}@media only screen and (min-width: 769px){footer.global .top-link{display:none}footer.global .footer-b h2 a i{font-style:normal;display:inline}}@media only screen and (min-width: 984px){footer.global .legal{width:984px}footer.global{padding:30px 0 20px}footer.global .legal{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-grey.png") 100% 0 no-repeat}footer.global .footer-a{display:block}}#context-footer{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1em;margin-bottom:0.85714em;border-bottom:0;clear:both;padding-bottom:1px;padding-top:0;position:relative;margin-bottom:0;margin-left:0;margin-right:0;width:100%}#context-footer hr{-moz-box-shadow:inset 0 2px 2px -2px #333;-webkit-box-shadow:inset 0 2px 2px -2px #333;box-shadow:inset 0 2px 2px -2px #333;background:#dd4814;height:14px;margin:0 0 10px;border:0;clear:both}#context-footer div.twelve-col{display:table;float:none;margin-bottom:7px}#context-footer div div{display:block;padding-left:0;margin-bottom:20px}#context-footer div div div{display:block;padding-left:0;margin-bottom:0}#context-footer div div.feature-one{padding-left:0}#context-footer div div.feature-four{margin-bottom:0;margin-right:0}#context-footer>div{padding-left:10px;padding-right:10px}#context-footer ul{margin-bottom:5px}#context-footer li.active{display:none}#context-footer h3{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}#context-footer .list a:after,#context-footer a.link-arrow:after,#context-footer nav ul li h2 a:after{content:' \203A'}@media only screen and (min-width: 768px){#context-footer{margin-bottom:12px;padding-left:30px;padding-right:30px}#context-footer div+div{width:31%}#context-footer div div.feature-four{padding-bottom:20px}#context-footer hr{margin:0 -30px 40px}#context-footer>div{padding-left:0;padding-right:0}}@media only screen and (min-width: 984px){#context-footer{padding:0 40px 10px}#context-footer div div{display:table-cell;float:none;padding-left:20px;margin-bottom:0}#context-footer hr{margin:0 -40px 40px}}a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#dd4814;color:#fff;text-decoration:none;display:inline-block;margin:0;font-family:Ubuntu, Arial, 'libra sans', sans-serif;font-weight:300;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased;padding:8px 14px;width:100%;text-align:center}a.cta-large,button.cta-large{font-size:1.28571em;margin-bottom:0.66667em;padding:10px 20px}a.link-cta-canonical,button.cta-canonical,form button.cta-canonical[type="submit"],form input.cta-canonical[type="submit"]{background:#772953;color:#fff}a.link-cta-inverted,button.cta-inverted{background:#fff;color:#333333}.row-enterprise a.link-cta-canonical,.row-enterprise button.link-cta-canonical{background:#fff;color:#772953}a.link-cta-ubuntu:hover,a.link-cta-ubuntu:hover,button.cta-ubuntu:hover,form button[type="submit"]:hover,form input[type="submit"]:hover{background:#c03f11;text-decoration:none}a.link-cta-canonical:hover,button.cta-canonical:hover{background:#5f2143;text-decoration:none}a.link-cta-inverted:hover,.row-enterprise a.link-cta-canonical:hover,button.cta-inverted:hover,.row-enterprise button.cta-canonical:hover{background:#fff;text-decoration:underline}a.cta-deactivated,a.cta-deactivated:hover,button.cta-deactivated,button.cta-deactivated:hover{background:#efefef;color:#fff;cursor:not-allowed}@media only screen and (min-width: 768px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}@media only screen and (min-width: 984px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}form input,form select,form textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}form .fieldset-submit ul{margin-bottom:0}form fieldset .mktError,form fieldset .errMsg,form fieldset .reqMark{color:#df382c}form fieldset .mktFormMsg{clear:both;display:block}.row{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-bottom:1px dotted #888888;clear:both;padding:20px 10px 0;position:relative}.row br{display:none}.row.no-padding-bottom{padding-bottom:0 !important}.row-grey{background:#f7f7f7}.no-border{border:0}#main-content .row-hero{margin-top:20px;padding-top:0}.row-background{color:#fff;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/image-background-wallpaper.jpg") no-repeat scroll 50% 50% #4b1827}.row-background a.alternate{color:#fff;text-decoration:underline}.row-background a.alternate:hover{color:rgba(255,255,255,0.6)}@media only screen and (min-width: 768px){.row-background{background-position:center 50%;background-size:100% auto}}.strip{width:100%;display:block}.strip-dark{background-color:#2c001e;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/background-grid.png");background-repeat:repeat;color:#fff}.strip-dark .list-ubuntu li{border:0}.strip-dark .resource{color:#333;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.strip-dark .resource:before{border-right-color:#2c001e}#main-content .strip-dark .resource:before{border-bottom-width:29px;right:-2px;top:-1px}#main-content .strip-dark .resource:hover:before{border-bottom-width:34px}#main-content .strip-dark .resource h2{padding-right:20px}.row-aux{background-color:rgba(255,255,255,0.6);text-align:center}.row-aux h2,.row-aux p{text-align:left}.row-aux a p{color:#333;margin-bottom:30px}.row-step h2{position:relative;top:5px}.row-step .step{position:relative;top:-5px;height:32px;width:32px;border-radius:50%;border:3px solid #dd4814;color:#dd4814;line-height:32px;text-align:center;background-color:#fff;font-size:23px;font-weight:400}@media only screen and (min-width: 768px){.row{padding:30px}#main-content .row-hero{margin-top:40px}}@media only screen and (min-width: 769px){.row-step .step{height:42px;width:42px;line-height:42px}.row br{display:block}}@media only screen and (min-width: 984px){.row br{display:block}.row{padding:60px 40px 40px}.no-border{border:0}}.box,.box-grey{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:1.333em 20px}.box{background:#fff;border:1px solid #dfdcd9}.box-grey{background:#f7f7f7;color:#333333}.box-orange{background:#dd4814;color:#fff}.box-highlight{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;border:1px solid #f7f7f7}.box-textured{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg");border:0}.box-padded{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#efefef;border:0;margin-bottom:20px;padding:6px 5px}.box-padded h3{font-size:1.39286em;margin-bottom:0.61538em;margin-left:5px;margin-top:5px}.box-padded li h3{font-size:1.39286em;margin-bottom:0.61538em;margin:0}.box-padded div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:8px 8px 2px}.box-padded-feature{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/soft-centre-bkg.gif") repeat scroll 0 0 #a09f9f;border:0;margin-bottom:20px;padding:11px 5px 6px}.box-padded-feature h3{color:#fff;margin-left:5px;font-size:1.39286em;margin-bottom:0.61538em}.box-padded-feature h4{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}.box-padded-feature>div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:20px 8px}.box-padded-feature div div{margin-bottom:0}.box-padded-feature .inline-icons{display:table;width:100%;margin:0;text-align:center}.box-padded-feature .inline-icons li{display:table-cell;text-align:left;float:none}.box-padded-feature .one-col{width:48px;float:left}.resource{cursor:pointer;padding-bottom:40px;position:relative;-moz-transition:background 0.2s ease-out;-webkit-transition:background 0.2s ease-out;transition:background 0.2s ease-out}.resource h2{padding-right:20px}.resource.five-col h2 a:link,.resource.five-col h2 a:visited,.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:inherit !important}.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:1.125em}.resource.twelve-col h2 a:link,.resource.twelve-col h2 a:visited{font-size:1.40625em}.resource:hover{background-color:#fafafa}.resource:after{-moz-box-shadow:0 -1px 2px 0 #ddd;-webkit-box-shadow:0 -1px 2px 0 #ddd;box-shadow:0 -1px 2px 0 #ddd;content:'';height:1px;position:absolute;right:-6px;top:14px;-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg);-moz-transition:all 0.2s ease-out;-webkit-transition:all 0.2s ease-out;transition:all 0.2s ease-out;width:41px;z-index:2}.resource:hover:after{right:-9px;top:18px;width:48px}.resource:before{content:'';position:absolute;-moz-transition:border-width 0.2s ease-out;-webkit-transition:border-width 0.2s ease-out;transition:border-width 0.2s ease-out;top:-2px;right:-3px;width:0;height:0;border-bottom:30px solid #fdfdfd;border-right:30px solid #fff;-webkit-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);-moz-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);box-shadow:-2px 2px 2px rgba(176,176,176,0.4);z-index:2;-webkit-border-radius:0 0 0 0;-moz-border-radius:0 0 0 0;border-radius:0 0 0 0}.resource:hover:before{border-bottom-width:35px;border-right-width:35px}.resource:last-of-type{margin-bottom:30px}.resource .content-cat{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-icon-document.png") left center no-repeat;color:#aea79f;font-size:14px;letter-spacing:1px;margin:0;padding-left:20px;padding:0;position:absolute;text-transform:uppercase}.resource .content-cat-webinar{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-webinar.png") left center no-repeat}.resource.box-image-centered div+span img{margin-top:40px}html.yui3-js-enabled .resource:hover a{text-decoration:underline}.row-grey .resource:before{border-right-color:#f7f7f7}@media only screen and (max-width: 768px){.box-padded-feature .inline-icons li{float:left;display:block}.box-padded-feature .one-col{width:48px;float:left}}.arrow-up,.arrow-down,.arrow-right,.arrow-left{height:11px;position:absolute;width:18px}.arrow-up{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up.png") 0 0 no-repeat;left:20px;top:-11px}.arrow-down{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-down.png") 0 0 no-repeat;bottom:-11px;right:20px}.arrow-right{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-right.png") 0 0 no-repeat;height:18px;right:-11px;top:20px;width:11px}.arrow-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-left.png") 0 0 no-repeat;bottom:20px;height:18px;left:-11px;width:11px}div>.arrow-left{left:-10px}@media only screen and (min-width: 769px){html.yui3-js-enabled .arrow{visibility:visible}}.list,.list-ubuntu,.list-canonical{list-style:none;margin-left:0}.list li,.list-ubuntu li,.list-canonical li{border-bottom:1px dotted #888888;margin-bottom:0;padding:10px 0}.list li:last-of-type,.list li.last-item,.list-ubuntu li:last-of-type,.list-ubuntu li.last-item,.list-canonical li:last-of-type,.list-canonical li.last-item{border:0;padding-bottom:0}.list article{border-bottom:1px dotted #888888;margin-bottom:0;padding:10px 0}.list-spaced article,.list-spaced li{padding:30px 0}nav .list a{display:block}.list-ubuntu li,.list-canonical li{background-repeat:no-repeat;background-position:0 1em;padding-left:25px}.list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.svg")}.list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.svg")}.list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.svg")}.list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.svg")}.vertical-divider .list-canonical li,.vertical-divider .list-ubuntu li{padding-left:25px}html.no-svg .list-ubuntu li,.opera-mini .list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.png")}html.no-svg .list-canonical li,.opera-mini .list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.png")}html.no-svg .list-warm li,.opera-mini .list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.png")}html.no-svg .list-dark li,.opera-mini .list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.png")}.no-bullets{list-style:none;margin-left:0}.row .combined-list ul,.row .combined-list div{margin-bottom:0}.row .combined-list li.last-item{border-bottom:1px dotted #888888;padding-bottom:10px}.row .combined-list div.last-col,.row .combined-list ul.last-col{margin-bottom:20px}.row .combined-list div.last-col li.last-item,.row .combined-list ul.last-col li.last-item{border-bottom:0;padding-bottom:0}.inline{margin-left:0}.inline li{display:inline;list-style:none;margin-left:0;float:left}@media only screen and (min-width: 768px){.row .combined-list ul,.row .combined-list div{margin-bottom:20px}.row .combined-list li.last-item{border-bottom:0;padding-bottom:0}}ul.inline-logos{float:left;margin-left:0;padding:0;text-align:center;width:100%}ul.inline-logos li{clear:none;display:inline-block;float:none;margin:10px 20px;padding:0}ul.inline-logos li.clear-row{clear:left}ul.inline-logos li.last-item{border:0}ul.inline-logos img{-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;vertical-align:middle;max-width:115px;max-height:32px}.inline-icons{margin:0 0 20px}.inline-icons li{margin-right:20px;margin-bottom:20px;text-align:left;display:inline-block}.inline-icons li.last-item{margin-right:0}.inline-icons.no-margin-bottom li{margin-bottom:0}.inline-icons img{vertical-align:middle;max-width:115px;max-height:32px}@media only screen and (max-width: 768px){ul.inline-logos img{max-width:172px;max-height:48px}}@media only screen and (min-width: 769px){ul.inline-logos li{clear:none;display:inline-block;height:auto;margin:20px 0;line-height:60px;padding:0 40px}ul.inline-logos li img{float:none;vertical-align:middle;max-width:200px;max-height:45px}}@media only screen and (min-width: 984px){.inline-icons{text-align:left;margin-bottom:20px}}blockquote.pull-quote{text-indent:0}blockquote.pull-quote p{color:#333333;padding-left:10px;padding-right:10px;font-size:1.77379em;margin-bottom:0.48323em;text-indent:-.4em;margin-left:.4em;line-height:1.3}blockquote.pull-quote p span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}blockquote.pull-quote p span+span{left:5px}blockquote.pull-quote p cite{margin:10px 0 0;font-weight:300;display:block;font-size:.75em;text-indent:0}blockquote.pull-quote.js{padding-left:60px;display:table-cell}blockquote.quote-canonical,blockquote.quote-canonical-white{font-size:1.14286em;margin-bottom:0.75em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-white-360x360.png") no-repeat 20px -130px;color:#772953;float:right;font-size:1em;height:215px;margin-top:0;padding:20px 60px 0;position:relative;width:236px}blockquote.quote-canonical-white{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-aubergine-345x345.png") no-repeat 0 0;color:#fff;padding:80px 60px 0;height:265px}blockquote.quote p:first-child{font-size:1.28571em;margin-bottom:0.66667em;line-height:1.3;text-indent:-7px}blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.svg");background-repeat:no-repeat;background-size:287px 286px;color:#fff;height:167px;padding:60px 40px;position:static;right:-40px;top:-90px;width:207px}blockquote.quote-right-bottom p{color:#fff}blockquote.quote-grey{font-size:2.57143em;margin-bottom:0.33333em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-grey-br-211x211.png") no-repeat scroll 0 0 transparent;color:#fff;height:152px;line-height:40px;margin-left:20px;padding:60px 0 0;text-align:center;width:211px}blockquote.quote-bottom-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;color:#fff;height:167px;padding:55px 40px 70px 45px;width:225px}html.no-svg blockquote.quote-right-bottom,.opera-mini blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.png")}.row-quote{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-quote blockquote{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;margin:0;padding:0}.row-quote blockquote p{margin-bottom:.75em;line-height:1.3;color:#333333;padding-left:10px;padding-right:10px;text-indent:0}.row-quote blockquote span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}.row-quote blockquote span+span{left:5px}.row-quote blockquote cite{color:#333333;font-style:normal;margin-bottom:0;font-size:.75em;text-indent:-14px;text-indent:0}.row-quote .quote-twitter{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-115x139.png") 20px bottom no-repeat;padding:20px 20px 20px 23.40425%}.row-quote .quote-twitter-small{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-54x63.png") 99% bottom no-repeat;padding:20px 20px 20px 80px}.row-quote .quote-twitter-small p{margin:0;padding:0}blockquote.quote-canonical,blockquote.quote-canonical-white{background:none;color:#333333;width:auto;height:auto;padding:0 30px;margin-top:20px}@media only screen and (min-width: 768px){.row-quote blockquote{text-indent:-7px}.pull-quote{text-indent:-.4em}.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em}blockquote.pull-quote p,.row-quote blockquote p{padding-left:0;padding-right:0;text-indent:-.7em}blockquote.pull-quote p span,.row-quote blockquote p span{font-size:1.391304348em}blockquote.pull-quote p cite,.row-quote blockquote p cite{margin-left:0;text-indent:0}blockquote.pull-quote p span,.row-quote blockquote p span{top:5px}}@media only screen and (min-width: 769px){.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em;text-indent:-.4em}}@media only screen and (min-width: 984px){.row-quote blockquote{padding:0 80px 20px;text-indent:-10px}blockquote.pull-quote p span,.row-quote blockquote p span{top:10px}}html.js .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:auto;padding-bottom:.6em;padding-right:20px}html.yui3-js-enabled .tabbed-menu{display:none;padding-bottom:20px;padding-top:20px}html.yui3-js-enabled .arrow{display:none;position:absolute;visibility:hidden}html.yui3-js-enabled .tabbed-content{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:8px 8px 0;background:#f7f7f7;margin-bottom:8px}html.yui3-js-enabled .tabbed-content.hide{display:block;opacity:1 !important}html.yui3-js-enabled .tabbed-content .title{display:none}html.yui3-js-enabled .tabbed-content div{display:none}html.yui3-js-enabled .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-down.svg") no-repeat scroll right 3px #f7f7f7;color:#333333;display:block;font-size:16px;padding-bottom:.6em;padding-right:20px;width:100%}html.yui3-js-enabled .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.svg");margin-bottom:10px}html.yui3-js-enabled .tabbed-content.open div{display:block}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-right.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content.open .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content .accordion-button{background-image:none;margin-bottom:10px}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content div{display:block}@media only screen and (min-width: 768px){html.yui3-js-enabled .tabbed-menu{display:block}html.yui3-js-enabled .tabbed-content{margin-bottom:20px;padding:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0 !important}html.yui3-js-enabled .tabbed-content .title{display:block}html.yui3-js-enabled .tabbed-content div{display:block}html.yui3-js-enabled .tabbed-content .vertical-divider div{display:table-cell}html.yui3-js-enabled .tabbed-content .accordion-button{display:none}}html.yui3-js-enabled .accordion-button.active{background-color:transparent}@media only screen and (min-width: 768px){.tabbed-menu{-moz-box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-shadow:0 -1px 10px #cfcfcf inset;box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;background:none repeat scroll 0 0 #f7f7f7;padding-bottom:20px;padding-top:20px;position:relative}.tabbed-menu ul{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;margin-bottom:0;padding:0;position:relative;table-layout:fixed;width:100%}.tabbed-menu li{text-align:center;display:table-cell}.tabbed-menu a{color:#666;display:block;outline:none}.tabbed-menu a .active{color:#772953;text-decoration:none}.tabbed-menu a:hover{text-decoration:none}.tabbed-menu .arrow{bottom:0;position:absolute}.tabbed-content{*zoom:1;padding:20px 40px 0}.tabbed-content:before,.tabbed-content:after{content:"";display:table}.tabbed-content:after{clear:both}.tabbed-content .row{padding-left:0;padding-right:0}.tabbed-content .main-content{padding-bottom:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0}.tabbed-content-bg{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin-left:20px;margin-right:20px}.tabbed-content-bg .row-box{padding-left:0;padding-right:0}html.yui3-js-enabled .arrow{visibility:visible}}.row.vertical-divider{padding-bottom:40px}.vertical-divider div,.vertical-divider li{border-right:0;display:block;padding-left:0;padding-right:0}.vertical-divider-full{padding-bottom:0}.vertical-divider-full>div{padding-bottom:40px}.row.vertical-divider-full{padding-bottom:0}@media only screen and (max-width: 767px){.vertical-divider>div,.vertical-divider>li{border-bottom:1px dotted #888888;padding-bottom:20px}.vertical-divider div:last-of-type,.vertical-divider li:last-of-type,.inline-icons li:last-of-type{border-bottom:0;padding-bottom:5px}.row.vertical-divider{padding-bottom:0}.equal-height div,.equal-height li{height:auto !important}}@media only screen and (min-width: 984px){.row.vertical-divider{padding-bottom:60px}.vertical-divider>div,.vertical-divider>li{border-right:1px dotted #888888;display:table-cell;float:none;margin-right:0;padding-left:20px;padding-right:20px;vertical-align:top}.vertical-divider>div:last-child,.vertical-divider>li:last-child,.vertical-divider>div.last-col,.vertical-divider>li.last-col,.vertical-divider>div:last-of-type,.vertical-divider>li:last-of-type{border-right:0;padding-right:0}.vertical-divider>div:first-child,.vertical-divider>li:first-child,.vertical-divider>div.first-col,.vertical-divider>li.first-col,.vertical-divider>div:first-of-type,.vertical-divider>li:first-of-type{padding-left:0}}.slider{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#f7f7f7;padding-top:40px}.slider .slide-window{overflow:hidden;position:relative;height:450px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s}.slider .slide-container{position:absolute;width:2800 px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s;left:0}.slider .slider-dots ul{position:absolute;top:550px;left:220px;z-index:5}.slider .slider-dots li{background-position:0 -8px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/sprite-pager.png") no-repeat;float:left;height:7px;list-style-type:none;margin-right:.75em;text-indent:-9999em;width:7px}.slider .slider-dots li.active{background-position:0 0}.slider .slider-dots a{display:block;outline:0}.slider .slide{float:right;width:700px}.slider .slide h3{margin-top:65px;display:inline-block}.slider .slide p{width:350px}.slider .arrow-prev,.slider .arrow-next{font-size:5em;margin-top:150px;display:block;color:#888888;outline:0}.slider .arrow-prev:hover,.slider .arrow-next:hover{text-decoration:none;color:#333333}.slider .arrow-prev:active,.slider .arrow-next:active{padding-top:1px;text-decoration:none}.slider .arrow-prev:focus,.slider .arrow-next:focus{text-decoration:none}.yui3-tooltip-hidden{display:none}.yui3-tooltip-content{-moz-box-shadow:0 2px 8px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 8px rgba(0,0,0,0.2);box-shadow:0 2px 8px rgba(0,0,0,0.2);background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg") repeat scroll 0 0 transparent;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #e3e3e3;color:#333333;margin-top:-30px;max-width:520px;position:relative}.yui3-tooltip .yui3-widget-bd{padding:20px;width:320px}.yui3-tooltip .yui3-widget-bd *{max-width:100%}.yui3-tooltip .yui3-widget-bd h5{margin-bottom:10px;font-size:22px;font-weight:300}.yui3-tooltip .yui3-widget-bd img{float:left;margin-right:10px}.yui3-tooltip .yui3-widget-bd q{border-bottom:1px dotted #888888;border-top:1px dotted #888888;display:block;font-size:16px;font-style:italic;margin-bottom:0;margin-top:20px;padding:10px 0}.yui3-tooltip .yui3-widget-bd p:last-child{margin-bottom:0}.yui3-tooltip .yui3-widget-ft,.yui3-tooltip .yui3-widget-ft div{position:absolute;width:0;height:0;border-style:solid;line-height:0;font-size:0}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft,.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:-10px;left:50%;margin:0 0 0 -10px;border-width:0 10px 10px;border-color:#efefef transparent}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:0;border-color:#efefef transparent}.tooltip-label{-moz-box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-box-shadow:3px 3px 6px rgba(0,0,0,0.3);box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;border:1px solid #dfdcd9;display:none;font-size:13px;line-height:1;margin:0;padding:6px 5px;position:absolute;top:-20px;white-space:nowrap;z-index:1000}body,a:link,a:visited{-webkit-font-smoothing:antialiased}code,pre,p{line-height:1.5}body{font-size:16px}@media only screen and (min-width: 768px){code,pre,p{line-height:1.6}body{font-size:16px}}@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi){body{font-size:18px}}.not-for-medium{display:none}@media only screen and (min-width: 985px){.not-for-medium{display:block}}header.banner{background:#000000;-moz-box-shadow:inset 0 2px 2px -2px #000;-webkit-box-shadow:inset 0 2px 2px -2px #000;box-shadow:inset 0 2px 2px -2px #000;margin-bottom:0}header.banner .nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;*zoom:1}header.banner .nav-primary:before,header.banner .nav-primary:after{content:"";display:table}header.banner .nav-primary:after{clear:both}header.banner nav.nav-primary{border-bottom:1px solid #262626;overflow:visible}header.banner nav.nav-primary .user-nav{float:right;margin-right:20px}header.banner nav.nav-primary .user-dropdown:hover ul:after{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img{margin-right:10px}header.banner nav.nav-primary .user-dropdown .menu-link img.hover{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img.normal{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.hover,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.hover{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.normal,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.normal{display:none}header.banner nav.nav-primary .user-dropdown ul{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;margin-top:-2px;background-color:#fff;border-width:0}header.banner nav.nav-primary .user-dropdown ul a:hover{background-color:transparent}header.banner nav.nav-primary #user-dropdown .dropdown ul{width:auto}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:73px 30px;-webkit-background-size:73px 30px;-o-background-size:73px 30px;background-size:73px 30px;background-image:url(../img/logos/logo.svg);background-position:20px;background-repeat:no-repeat;min-width:120px;padding-top:6px;margin-left:0}body.no-svg header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url(../img/logos/logo.png)}input[type=text]::-ms-reveal,input[type=text]::-ms-clear{display:none;width:0;height:0}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-results-button,input[type="search"]::-webkit-search-results-decoration{display:none}.contextual-bar{overflow:hidden;background-color:#ffffff;border-bottom:1px solid #d4d4d4}form.search-form{overflow:hidden;float:right;width:100%;position:relative}form.search-form input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:0;border-left:0;margin:0;width:100%;height:50px;float:left;font-size:1em;padding-top:0;padding-bottom:0;padding-right:30px;background-color:transparent;-webkit-appearance:none}form.search-form input:focus{border-color:#dd4814}form.search-form button[type=submit],form.search-form button[type=submit]:hover{position:absolute;top:10px;right:10px;display:block;height:30px;width:30px;padding:0;line-height:0;-webkit-appearance:none;background:transparent}form.search-form button img{height:16px}.contextual-nav{border:0;display:block;margin:0;padding-left:10px;background-color:transparent;overflow:hidden;float:left}.contextual-nav li,.contextual-nav li:last-child{font-size:0.875em;float:left;list-style-type:none;margin:0;margin-left:5px}.contextual-nav li a:link,.contextual-nav li a:visited,.contextual-nav .contextual-nav__label{display:block;color:#333333;font-weight:300;text-align:center;padding:16px 10px 10px 10px;border-bottom:3px solid transparent}.contextual-nav .contextual-nav__label{color:#cdcdcd}.contextual-nav li a:hover{border-bottom-color:#dd4814;text-decoration:none;color:#dd4814}.contextual-nav li a.active{border-bottom:3px solid #dd4814}.opera-mini header.banner .logo-ubuntu,.no-svg header.banner .logo-ubuntu{background-image:url(../img/logos/logo.png)}@media only screen and (min-width: 769px){header.banner .nav-primary ul li,header.banner .nav-primary ul li:last-child{border-bottom:0;width:auto}header.banner nav.nav-primary li a:link,header.banner nav.nav-primary li a:visited{border-left:1px solid #262626;font-weight:400}header.banner nav.nav-primary ul li a.active{padding-bottom:10px;background-color:#0e0c0b;border-bottom:3px solid #dd4814;border-left:1px solid #262626}header.banner nav.nav-primary ul li{border-left:1px solid #262626}header.banner nav.nav-primary ul li a:hover{background-color:#dd4814}header.banner nav.nav-primary ul{background-color:transparent;border-right:1px solid #262626;display:block}header.banner nav.nav-primary ul li:last-child{border-left:1px solid #262626;border-right:0}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:0}header.banner .nav-primary ul li a.external:hover{background-image:url("../img/icons/external-link-grey.png")}form.search-form{width:325px}form.search-form input{border-left:1px solid #d4d4d4;margin:0 20px;width:250px;font-size:0.875em}}@media only screen and (min-width: 1030px){header.banner{height:48px;overflow:hidden}header.banner .nav-primary{width:100%}}body{background-repeat:repeat}.row{border:0;background-color:rgba(255,255,255,0.6)}@media only screen and (min-width: 769px){.append-one{margin-right:10.6%}.row{padding:50px 40px 30px}}.inner-wrapper{*zoom:1;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:transparent;background-image:none;margin:0 auto;padding-bottom:0;float:none}.inner-wrapper:before,.inner-wrapper:after{content:"";display:table}.inner-wrapper:after{clear:both}.wrapper{position:static;background:transparent;width:100%;overflow:hidden}img.touch-border{margin-bottom:-50px}.inner-wrapper,footer.global .legal{max-width:1030px;width:auto;padding-left:0;padding-right:0}.touch-top{margin-top:-50px}@media only screen and (max-width: 1030px){.inner-wrapper,footer.global .legal{padding-left:8px;padding-right:8px;width:auto}}.footer-cta{background:#fff;padding-bottom:20px}.footer-wrapper.strip-light{background-color:#fff}.solutions-cta{height:60px;background-color:#dd4814;line-height:60px;text-align:center}.solutions-cta a{color:#fff;font-size:1.25em}footer.global{background-color:white;box-shadow:none;padding-top:0}footer.global .row{padding:10px 0 0}footer.global .two-col{width:46%;float:left;display:inline-block;min-height:200px}footer.global h2{padding-bottom:0;color:#888888;font-size:16px}footer.global nav .canonlist ul li,footer.global nav .additional-info ul li{min-height:0;width:48%;float:left}footer.global ul.bullets li:after{line-height:1;color:#888888;content:"•";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:auto}footer.global a.external{background-image:url("../img/icons/external-link-dark.png")}footer.global .top-link{margin-bottom:10px}footer.global a{color:#333333}footer.global a:hover{color:#dd4814}footer.global .legal{background-image:none}footer.global .legal.has-cookie{padding-bottom:70px}footer.global .inner-wrapper{overflow:visible}footer.global a.link-cta-positive,footer.global a.link-cta-negative{width:auto;margin-top:10px;padding-left:20px;padding-right:20px;color:#fff;font-size:14px}footer.global .section__title{background:none;cursor:default}.legal-inner{clear:both;overflow:hidden;float:left;width:100%;padding:20px 10px 0;margin:-3px -10px 0}.social,.social--right{margin-left:0}.social .social__item,.social--right .social__item{display:inline;float:left;padding-right:1em}.social .social__google,.social .social__facebook,.social .social__twitter,.social--right .social__google,.social--right .social__facebook,.social--right .social__twitter{background-image:url("../img/icons/icon-social.png");display:block;width:45px;height:44px}.social .social__google.social__twitter:hover,.social .social__facebook.social__twitter:hover,.social .social__twitter.social__twitter:hover,.social--right .social__google.social__twitter:hover,.social--right .social__facebook.social__twitter:hover,.social--right .social__twitter.social__twitter:hover{background-position:0 -45px}.social .social__google.social__facebook,.social .social__facebook.social__facebook,.social .social__twitter.social__facebook,.social--right .social__google.social__facebook,.social--right .social__facebook.social__facebook,.social--right .social__twitter.social__facebook{background-position:90px 0}.social .social__google.social__facebook:hover,.social .social__facebook.social__facebook:hover,.social .social__twitter.social__facebook:hover,.social--right .social__google.social__facebook:hover,.social--right .social__facebook.social__facebook:hover,.social--right .social__twitter.social__facebook:hover{background-position:90px -45px}.social .social__google.social__google,.social .social__facebook.social__google,.social .social__twitter.social__google,.social--right .social__google.social__google,.social--right .social__facebook.social__google,.social--right .social__twitter.social__google{background-position:135px 0}.social .social__google.social__google:hover,.social .social__facebook.social__google:hover,.social .social__twitter.social__google:hover,.social--right .social__google.social__google:hover,.social--right .social__facebook.social__google:hover,.social--right .social__twitter.social__google:hover{background-position:135px -45px}@media only screen and (min-width: 768px){.social--right{float:right}}#additional-info{border-bottom:0}#additional-info h2:before{background-image:url("../img/icons/external-link-grey.svg"),none;background-repeat:no-repeat;background-size:14px 14px;content:"";display:inline-block;height:15px;margin-right:3px;position:relative;top:3px;width:15px}#additional-info div li{border-left:1px solid #d4d7d4;box-sizing:border-box;display:block;float:left;margin:0;padding:0;width:50%}#additional-info div li a{border-bottom:1px solid #d4d7d4;box-sizing:border-box;color:#333333;display:block;float:left;margin:0;overflow:hidden;padding:8px 10px;text-align:left;white-space:normal;width:100%}#additional-info .section__title{border-bottom:1px solid #d4d7d4;background-position:100% 0.1em}html.opera-mini footer #nav-global h2:before,html.opera-mini footer #additional-info h2:before,html.no-svg footer #nav-global h2:before,html.no-svg footer #additional-info h2:before{background-image:url("../img/icons/external-link-grey.png")}@media only screen and (min-width: 769px){.footer-wrapper.strip-light{white-space:nowrap}footer.global{padding-top:40px;padding-bottom:40px}footer.global .two-col{width:14.89361%;display:inline-block;min-height:0}footer.global .section{min-height:160px;margin-right:40px;padding-bottom:0;border-right:1px dotted #aaa;border-bottom:0}footer.global .section:last-child{margin-right:0;border-right:0}footer.global li{display:inline;float:left}footer.global ul.no-bullets li{border-right:1px dotted #aaa;padding-right:15px;padding-left:15px}footer.global ul.no-bullets li a{font-size:16px}footer.global ul.no-bullets li a:hover{color:#dd4814}footer.global ul.no-bullets li:last-child{border-right:none}footer.global ul.no-bullets li:first-child{padding-left:0px}#additional-info .section__title{border-bottom:0}#additional-info div li,#additional-info div a:link{width:100%;border:0}}.actions .actions__social-item--twitter,.actions .actions__social-item--google-plus{text-indent:-99999px;background-image:url("../img/icons/icon-social.svg");background-repeat:no-repeat;height:44px;width:44px;overflow:hidden;display:block}.actions .actions__social-item--twitter{background-position:0 0}.actions .actions__social-item--twitter:hover{background-position:0 -45px}.actions .actions__social-item--google-plus{background-position:-45px 0}.actions .actions__social-item--google-plus:hover{background-position:-45px -45px}.anchor{display:inline-block;margin-left:3px;opacity:.0;position:relative;top:1px;width:1em;height:1em;background:url("../img/icons/anchor_16.svg") 0 80% no-repeat;background-size:16px;-moz-transition:opacity 0.1s;-webkit-transition:opacity 0.1s;transition:opacity 0.1s}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,dt:hover .anchor,li:hover .anchor{opacity:1}.box{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;display:block;margin-bottom:0;border-top:0;border-left:0;border-right:0;padding-left:0;padding-right:0}.box-dim{background-color:#fafafa}@media only screen and (min-width: 768px){.box{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);-webkit-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);display:inline-block;margin-bottom:20px;padding-left:20px;padding-right:20px;border:0}}a.indent{-moz-box-shadow:inset 0 1px 2px 0 #333;-webkit-box-shadow:inset 0 1px 2px 0 #333;box-shadow:inset 0 1px 2px 0 #333;background:rgba(0,0,0,0.1);padding:10px 30px;text-weight:normal}a.indent:hover{background:rgba(0,0,0,0.2)}a.link-cta-positive,a.link-cta-negative{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#dd4814;color:#fff;display:inline-block;font-size:1.14286em;font-weight:300;text-decoration:none;margin:0;padding:8px 14px;text-align:center;-moz-transition:background 0.2s;-webkit-transition:background 0.2s;transition:background 0.2s;width:100%}a.link-cta-positive:hover,a.link-cta-negative:hover{background-color:#ae3910}a.link-cta-positive .external,a.link-cta-negative .external{padding-right:1em;background-image:url("../img/icons/external-link-white.svg");background-repeat:no-repeat;background-size:11px;background-position:right top}@media only screen and (min-width: 769px){a.link-cta-positive .external,a.link-cta-negative .external{padding-right:.7em}}a.link-cta-negative{background-color:#b2b2b2}a.link-cta-negative:hover{background-color:#888888}.charms__list{list-style:none;margin-bottom:1em;margin-left:0;border-bottom:1px dotted #d4d4d4}.charms__list .charms__list--config{display:none}.charms__list .charms__list--toggle{display:block}.charms__list .charms__list--toggle.is-open+.charms__list--config{display:block}.charms__list .charms__list--config-name{border-top:0}.charms__list--item{font-size:1em;border-top:1px dotted #d4d4d4;padding:10px 0 0 10px;margin-bottom:10px}.charms__list--item:last-of-type{margin-bottom:10px}.charms__list--icon{margin-right:.4em;width:25px;height:25px}.charms__list--toggle{background:url("../img/shared/icon-arrow-down.svg") no-repeat center center;width:16px;height:100%;float:right;text-indent:-99999px;margin-right:20px}.charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.svg");background-size:14px}.charms__list--config{padding-left:35px;padding-bottom:20px}.charms__list--config-name{font-size:1em;margin-top:15px;padding-top:15px;font-weight:400;border-top:1px dotted #d4d4d4}.charms__list--config-name:first-of-type{border-top:0}.charms__list--config-type{font-weight:400}.charms__list--config-description,.charms__list--config-setting{margin-left:30px;margin-top:8px}.charms__list--config-setting{font-size:0.875em;color:#888888;font-family:"Ubuntu Mono","Consolas","Monaco","Lucida Console","Courier New",Courier,monospace}body.no-svg .charms__list .charms__list--toggle{background-image:url("../img/shared/icon-arrow-down.png")}body.no-svg .charms__list .charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.png")}pre{background:transparent;border:1px solid #888888;margin:0 0 1.5em 0}pre:not(:first-child){margin-top:1.5em}code.language-bash .comment{color:#888888}.cookie-policy{-moz-box-shadow:0 -1px 2px rgba(0,0,0,0.2);-webkit-box-shadow:0 -1px 2px rgba(0,0,0,0.2);box-shadow:0 -1px 2px rgba(0,0,0,0.2);background-color:#fae4dc;bottom:0;position:fixed;width:100%;z-index:100}.cookie-policy p{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:13px;margin-bottom:0;margin-left:0;padding:8px 0;width:100%}.cookie-policy .link-cta{background-image:url(../img/icons/close-orange.svg);background-repeat:no-repeat;color:#fff;float:right;font-size:1em;height:15px;margin:12px 0;margin-top:12px;padding:0;text-decoration:none;text-indent:-9999px;width:16px}html.no-svg .cookie-policy .link-cta,html.opera-mini .cookie-policy .link-cta{background-image:url(../img/icons/close-orange.png)}html.opera-mini .cookie-policy{position:relative;top:0}.deploy-command{margin-bottom:10px;position:relative}.deploy-command .deploy-command__field{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);-webkit-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);background-image:url("../img/icons/code-snippet_16.svg");background-repeat:no-repeat;background-position:5px center;background-color:#fff;background-size:1.142857143em;width:100%;height:37px;border:1px solid #c1c1c1;padding:.6em;color:#888888;padding-left:2em;font-size:0.875em;white-space:nowrap;overflow:hidden;cursor:text}.deploy-command .command2clipboard__clip{cursor:pointer;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;line-height:1;position:absolute;right:1px;top:1px;background-color:#ffffff;padding:9px 8px 7px;border-left:1px solid #b2b2b2;display:none}.deploy-command .command2clipboard__clip.zeroclipboard-is-hover{background-color:#eeeeee}@media only screen and (min-width: 1030px){.deploy-command .command2clipboard__clip{display:inline-block}}.dropdown-menu{position:relative;display:block}.dropdown-menu.open .menu-link{background-color:#000000}.dropdown-menu.open .dropdown{display:block}.dropdown-menu .menu-link .border-box{display:block;color:#f2f2f4}.dropdown-menu .dropdown{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;display:none;position:absolute;z-index:1000;top:0;left:0;right:0;width:auto;background-color:#ffffff;box-shadow:0 1px 5px rgba(0,0,0,0.2)}.dropdown-menu .dropdown.right{left:auto;right:0;text-align:right}.dropdown-menu .dropdown.narrow{min-width:140px;width:auto}.dropdown-menu .dropdown a,.dropdown-menu .dropdown p,.dropdown-menu .dropdown li{color:#333333}.dropdown-menu .dropdown p{padding:11px 20px}.dropdown-menu .dropdown header,.dropdown-menu .dropdown footer{background-color:#ffffff}.dropdown-menu .dropdown header{padding:11px 20px;color:#f2f2f4;font-size:16px;font-weight:300}.dropdown-menu .dropdown footer{padding:20px}.dropdown-menu .dropdown ul{width:auto;left:0;right:0}.dropdown-menu .dropdown ul li a{width:auto;display:block;padding:15px 20px}.files .files__list{list-style:none;margin-bottom:1em;border-left:1px solid #cbcbcb;margin-left:1em}@media only screen and (min-width: 768px){.files .files__list{margin-left:0}}.files .files__list li{position:relative}.files .files__list li a:link,.files .files__list li a:visited{color:#333;text-decoration:none}.files .files__list li:before{content:'';width:12px;height:1px;background:#d4d4d4;display:inline-block;position:relative;top:-4px;margin-right:5px}.files .files__list li:last-child:after{content:'';width:4px;height:1em;position:absolute;display:block;left:-2px;top:.85em;background:#fff}.files .files__list ul:last-child>li a:after{content:'';width:4px;height:3em;position:absolute;display:block;left:-1.8em;top:-1.45em;background:white;cursor:default}.files .files__list .files__list{margin-left:1.3em}.files .files__list .files__list--item,.files .files__list .files__list--item-folder{font-size:0.875em;margin-bottom:0.75em}.files .files__list .files__list--item-folder{background-position:center right;background-size:12px;cursor:pointer}.files .files__list .files__list--item-folder:after{font-size:14px;display:block;content:"-";position:absolute;left:-7px;top:4px;padding:0 4px;line-height:0.9em;background:#ffffff;border:1px solid #888888}.files .files__list .files__list--item-folder.is-closed+ul{display:none}.files .files__list .files__list--item-folder.is-closed:after{content:"+";padding:0 2px}.files .files__actions--launchpad{background:url("../img/icons/icon-launchpad.svg") no-repeat;padding-left:1.4em}#main-content .row-hero{padding-top:20px;margin-top:0}#main-content .row-hero .intro{font-size:16px}@media only screen and (min-width: 769px){#main-content .row-hero{padding-top:60px}#main-content .row-hero .intro{font-size:1.4375em;margin-bottom:40px}}.how-to div div img{float:left;margin:0 20px 20px 0}header.banner a.external,header.banner a.external:hover{background-image:url("../img/icons/external-link-grey.png")}a.external,a.external:hover,header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-repeat:no-repeat}a.external,a.external:hover header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-position:right 14px top 14px;padding-right:35px;background-size:auto}@media only screen and (max-width: 769px){header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background:none}header.banner nav.nav-primary ul li a.external:after{display:inline-block;width:11px;height:11px;margin-left:0.25em;background-image:url("../img/icons/external-link-dark.png");vertical-align:text-top}}.list__icons{margin-left:0;margin-bottom:5px}.list__icons li{list-style:none;float:left;padding:8px 8px 0 0;margin-bottom:0}.list__icons li img{width:24px;height:24px;vertical-align:top}.list__tick{list-style-image:url("../img/icons/tick.png")}.list__middot{margin-left:0;list-style:none}.list__middot li{display:inline}.list__middot li:after{content:"•";color:#888;margin:0 5px 0 8px;vertical-align:middle}.list__middot li.files__actions--last:after{content:""}.combined-list .list li{border-bottom:1px dotted #888;padding:10px 0}@media only screen and (max-width: 767px){.combined-list .last-col .list li:last-of-type{border-bottom:0;padding-bottom:0}}@media only screen and (min-width: 768px){.combined-list .list li:last-of-type{border-bottom:0;padding-bottom:0}}.events-list li{position:relative;padding-bottom:20px}.events-list dd{margin-left:0;background-position:0 center;background-repeat:no-repeat;background-size:20px 20px;padding:6px 20px 6px 24px}.events-list .event-map{display:none}.events-list .event-date{background-image:url("../img/icons/calendar.svg")}.events-list .location{background-image:url("../img/icons/location.svg")}@media only screen and (min-width: 769px){.events-list .event-details-wrapper{padding-left:120px}.events-list .event-map{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;position:absolute;left:0;top:0;height:100px;width:100px;float:left;margin-right:10px;margin-top:5px;overflow:hidden;display:block}}body.no-svg .events-list .event-date{background-image:url("../img/icons/calendar.png")}body.no-svg .events-list .location{background-image:url("../img/icons/location.png")}.maintainers .maintainer__email{display:block}.ratings ul{margin-left:2px;margin-bottom:0}.ratings ul li{margin-bottom:0}.ratings ul li img{vertical-align:text-top}.ratings ul li:first-of-type{margin-left:0}.revisions__list{list-style:none;margin-left:0}.revisions__list .revisions__list-item{margin-bottom:1em}.revisions__list .revisions__list_meta{color:#888;margin-bottom:.2em}.revisions__list .revisions__list_meta_date{float:right}.section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:hidden;padding-bottom:20px;padding-top:20px}.section .section__title{background:url(../img/shared/icon-arrow-up.svg) no-repeat center right;cursor:pointer;margin-bottom:1em}.section.is-closed{height:60px}.section.is-closed .section__title{background-image:url(../img/shared/icon-arrow-down.svg)}.no-svg .row.section .section__title{background:url(../img/shared/icon-arrow-up.png)}.no-svg .row.section.is-closed .section__title{background:url(../img/shared/icon-arrow-down.png)}footer .section{margin-bottom:1em;padding-bottom:1em}footer .section.is-closed{height:auto;padding-bottom:0}footer .section.is-closed ul{display:none}@media only screen and (min-width: 769px){.row .section .section__title{background-image:none;cursor:auto}.row .section.is-closed{height:auto}}.list--concealed .list-item{display:none}.list--concealed .list-item:first-of-type{display:list-item}.list--concealed.list--visible-6 .list-item:nth-child(-n+6){display:list-item}.list--concealed.list--visible-4 .list-item:nth-child(-n+4){display:list-item}.list--concealed.list--visible-2 .list-item:nth-child(-n+2){display:list-item}.list--concealed a.btn__see--less{display:none}.list--concealed a.btn__see--more{display:inline}.list--revealed .list__controls,.list--concealed .list__controls{display:block;margin-top:2em}.list--revealed .list--item{display:list-item}.list--revealed a.btn__see--less{display:inline}.list--revealed a.btn__see--more{display:none}a.btn__see--more,a.btn__see--less{-moz-transition:background 0.2s;-webkit-transition:background 0.2s;transition:background 0.2s;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:#333;border-radius:2px;border:1px solid #b2b2b2;background:#fff;padding:0.38462em 1.15385em}a.btn__see--more:hover,a.btn__see--less:hover{background:#eee;text-decoration:none}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}.tag-list{list-style:none;margin:0}.tag-list--item{display:inline-block;text-transform:lowercase}.tag-list--item a:link,.tag-list--item a:visited{color:#333}.tag-list--item a:after{content:','}.tag-list--item:last-child a:after{content:''}#twitter-feed,#blog-feed{margin:35px 0}#twitter-feed>ul,#blog-feed>ul{list-style:none;margin-left:0}#twitter-feed>ul li,#blog-feed>ul li{position:relative;margin-bottom:30px}#twitter-feed .user,#blog-feed .user{font-size:0.875em;margin-bottom:0.5em}#twitter-feed .user img,#blog-feed .user img{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;width:24px;height:24px;vertical-align:middle;margin-right:5px}#twitter-feed .user a:link,#twitter-feed .user a:visited,#twitter-feed .user a:hover,#blog-feed .user a:link,#blog-feed .user a:visited,#blog-feed .user a:hover{text-decoration:none}#twitter-feed .user span[data-scribe="element:name"],#blog-feed .user span[data-scribe="element:name"]{color:#333}#twitter-feed .tweet,#blog-feed .tweet{padding-left:33px;margin-bottom:.3em}#twitter-feed .timePosted,#blog-feed .timePosted{padding-left:33px;font-size:0.875em}#twitter-feed .interact,#blog-feed .interact{padding-left:33px}#twitter-feed .interact a:link,#twitter-feed .interact a:visited,#blog-feed .interact a:link,#blog-feed .interact a:visited{margin-right:20px}@media only screen and (min-width: 769px){#twitter-feed .timePosted{position:absolute;top:0;right:0;padding-left:0}}.spaced-segment{margin-bottom:50px}.spaced-segment h3{margin-bottom:1.3em}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}@media only screen and (min-width: 769px){.tip,.command2clipboard__clip{position:relative;display:inline-block}.tip .tip-content,.command2clipboard__clip .tip-content{position:absolute;z-index:98;left:-1000px;right:-1000px;top:-30px;font-weight:300;margin:auto;display:block;text-align:center;white-space:nowrap}.tip:hover .tip-content:after,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:after{display:table;z-index:98;margin:auto;color:#fff;border-radius:3px;background:#000;box-shadow:none;font-size:12px;content:attr(data-tooltip);padding:4px 6px;white-space:nowrap;text-align:center}.tip:hover .tip-content:before,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:before{position:absolute;top:100%;left:50%;margin-left:-5px;content:'';border:solid transparent;border-width:5px;border-top-color:#000}}.fake{display:block}*{-webkit-backface-visibility:hidden;margin:0}html{height:100%}body{height:100%;font-size:1.0em;font-family:'Ubuntu', Arial, 'libra sans', sans-serif;font-weight:300}hr{border:none;background:#B2B2B2;width:100%;height:1px;display:block;width:100%;float:left;margin-bottom:20px}ul,ol{margin-left:0}a.alt{color:#333}a.alt:hover{color:#dd4814}a:active,a:focus{outline:none}::selection{color:#FFF;background:#dd4814}::-moz-selection{color:#FFF;background:#dd4814}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot?") format("eot"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot?") format("eot"),url("../fonts/ubuntu-li-webfont.woff2") format("woff2"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:400;src:url("../fonts/ubuntu-r-webfont.eot?") format("eot"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot?") format("eot"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot?") format("eot"),url("../fonts/ubuntu-mi-webfont.woff2") format("woff2"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot?") format("eot"),url("../fonts/ubuntu-b-webfont.woff2") format("woff2"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}.accordion{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px}.disabled .accordion{opacity:.5;pointer-events:none}.accordion .accordion__title{border-bottom:1px dotted #B2B2B2;padding:13px 20px 12px;margin:0;font-size:1.3em}.accordion .accordion__tab{border-bottom:1px dotted #B2B2B2}.accordion .accordion__tab:last-of-type{border:none}.accordion .accordion__tab .accordion__tab-title{padding:12px 20px;margin:0;color:#888;cursor:pointer;background:transparent url("../img/icons/accordion-open.svg") top 20px right 20px no-repeat}.accordion .accordion__tab .accordion__tab-title.active{background-image:url("../img/icons/accordion-close.svg")}.accordion .accordion__tab .accordion__tab-title.active+.accordion__tab-content{max-height:3000px;transition:max-height 0.5s ease-in}.accordion .accordion__tab .accordion__tab-content{max-height:0;transition:max-height 0.5s ease-out;overflow:hidden}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list{list-style-type:none;padding:0 20px 14px;margin:0}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item{margin-bottom:0.15em}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;width:100%;display:inline-block;padding-right:20px}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link:hover{color:#dd4814;text-decoration:none}.disabled .accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{color:#333}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active{font-weight:400}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active .accordion__tab-link{background:transparent url("../img/icons/cross.svg") top 7px right 0px no-repeat}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover{color:#dd4814}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover .accordion__tab-link{color:#dd4814;background-image:url("../img/icons/cross-orange.svg")}.cta-group .cta-group__link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px 0px 0px 3px;-moz-border-radius:3px 0px 0px 3px;border-radius:3px 0px 0px 3px;display:inline-block;padding:10px 14px;text-align:center;color:#ffffff;background-color:#dd4814}.cta-group .cta-group__link:hover{cursor:pointer;text-decoration:none;background-color:#c03f11}.cta-group.secondary .cta-group__link{color:#dd4814;border:1px solid #b2b2b2;background-color:#FFF;line-height:1}.cta-group.secondary .cta-group__link:hover{cursor:pointer;background-color:#F2F2F2}a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{font-size:1em;border:none;max-height:37px}a.link-cta-ubuntu[disabled],a.link-cta-ubuntu.disabled,button.cta-ubuntu[disabled],button.cta-ubuntu.disabled,input[type='submit'][disabled],input[type='submit'].disabled,form button[type='submit'][disabled],form button[type='submit'].disabled,form input[type='submit'][disabled],form input[type='submit'].disabled{cursor:default;opacity:.5}a.link-cta-ubuntu.clear,button.cta-ubuntu.clear,input[type='submit'].clear,form button[type='submit'].clear,form input[type='submit'].clear{background:none;color:#333}a.link-cta-ubuntu.secondary,button.cta-ubuntu.secondary,input[type='submit'].secondary,form button[type='submit'].secondary,form input[type='submit'].secondary{color:#dd4814;border:1px solid #b2b2b2;background:#FFF}a.link-cta-ubuntu.secondary.external,button.cta-ubuntu.secondary.external,input[type='submit'].secondary.external,form button[type='submit'].secondary.external,form input[type='submit'].secondary.external{background-image:url("../img/external-link-black.svg");background-size:16px 16px;background-repeat:no-repeat;background-position:top 8px right 8px}a.link-cta-ubuntu.secondary:hover,button.cta-ubuntu.secondary:hover,input[type='submit'].secondary:hover,form button[type='submit'].secondary:hover,form input[type='submit'].secondary:hover{background-color:#F2F2F2;cursor:pointer}a.link-cta-ubuntu.secondary[disabled],a.link-cta-ubuntu.secondary.disabled,button.cta-ubuntu.secondary[disabled],button.cta-ubuntu.secondary.disabled,input[type='submit'].secondary[disabled],input[type='submit'].secondary.disabled,form button[type='submit'].secondary[disabled],form button[type='submit'].secondary.disabled,form input[type='submit'].secondary[disabled],form input[type='submit'].secondary.disabled{cursor:default;color:#f5ae95;border:1px solid #ddd;background:#FFF;opacity:1}a.link-cta-ubuntu.secondary[disabled]:hover,a.link-cta-ubuntu.secondary.disabled:hover,button.cta-ubuntu.secondary[disabled]:hover,button.cta-ubuntu.secondary.disabled:hover,input[type='submit'].secondary[disabled]:hover,input[type='submit'].secondary.disabled:hover,form button[type='submit'].secondary[disabled]:hover,form button[type='submit'].secondary.disabled:hover,form input[type='submit'].secondary[disabled]:hover,form input[type='submit'].secondary.disabled:hover{background:#FFF}a.link-cta-ubuntu.text-button,button.cta-ubuntu.text-button,input[type='submit'].text-button,form button[type='submit'].text-button,form input[type='submit'].text-button{background-color:transparent;color:#333}a.link-cta-ubuntu.text-button:hover,button.cta-ubuntu.text-button:hover,input[type='submit'].text-button:hover,form button[type='submit'].text-button:hover,form input[type='submit'].text-button:hover{text-decoration:underline}a.link-cta-ubuntu.full,button.cta-ubuntu.full,input[type='submit'].full,form button[type='submit'].full,form input[type='submit'].full{display:block;width:100%}@media screen and (max-width: 768px){a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{margin-bottom:20px}}a.link-cta-ubuntu{line-height:20px}.cta-group{float:left;width:auto;clear:both;position:relative;overflow:hidden}.cta-group .cta-group__link{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;max-height:36px;padding-right:49px;width:100%;line-height:1.2;position:relative;margin:0;text-align:left}.cta-group .cta-group__link:after{-webkit-border-radius:0px 3px 3px 0px;-moz-border-radius:0px 3px 3px 0px;border-radius:0px 3px 3px 0px;content:'';display:block;height:36px;width:34px;background:red;position:absolute;top:0;right:0;background-image:url("../img/chevron-white.svg");background-color:#dd4814;background-repeat:no-repeat;background-position:center}.cta-group .cta-group__link:hover{background-color:#dd4814}.cta-group .cta-group__link:hover:after{background-color:#c03f11}.cta-group .cta-group__dropdown{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;right:0;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);z-index:20;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;position:relative;clear:both}.cta-group .cta-group__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out}.cta-group .cta-group__dropdown .cta-group__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;clear:both;padding:5px 10px;margin:0}.cta-group .cta-group__dropdown .cta-group__item a{color:#333;cursor:pointer;width:100%;float:left;margin:0}.cta-group .cta-group__dropdown .cta-group__item a:hover{color:#dd4814;text-decoration:none}.cta-group.secondary .cta-group__link{float:left;max-height:36px;width:100%}.cta-group.secondary .cta-group__link:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-color:#fff;border:1px solid #b2b2b2;border-left:none;top:-1px;right:-1px}.cta-group.secondary .cta-group__link:hover{background-color:#FFF}.cta-group.secondary .cta-group__link:hover:after{background-color:#F2F2F2}.flash-messages{margin:0px auto;padding:0;max-width:1440px}@media screen and (max-width: 1030px){.flash-messages{margin:0px 10px 20px}}.flash-messages .flash-messages__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.flash-messages .flash-messages__item.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.flash-messages .flash-messages__item.success{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.flash-messages .flash-messages__item.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.flash-messages .flash-messages__item.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url'],form textarea,form select,tags-input .tags .input,.accounts .api li input[type='text']{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;background:#FFF;color:#333;border:1px solid #D2D2D2;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0px 13px}form input[type='text']:active,form input[type='number']:active,form input[type='search']:active,form input[type='password']:active,form input[type='email']:active,form input[type='url']:active,form textarea:active,form select:active,tags-input .tags .input:active,.accounts .api li input[type='text']:active{border-color:#B2B2B2;outline:none}form input[type='text']:focus,form input[type='number']:focus,form input[type='search']:focus,form input[type='password']:focus,form input[type='email']:focus,form input[type='url']:focus,form textarea:focus,form select:focus,tags-input .tags .input:focus,.accounts .api li input[type='text']:focus{border-color:#B2B2B2;outline:none}form input.invalid[type='text'],form input.invalid[type='number'],form input.invalid[type='search'],form input.invalid[type='password'],form input.invalid[type='email'],form input.invalid[type='url'],form textarea.invalid,form select.invalid,tags-input .tags .invalid.input,.accounts .api li input.invalid[type='text'],form input.ng-invalid[type='text'],form input.ng-invalid[type='number'],form input.ng-invalid[type='search'],form input.ng-invalid[type='password'],form input.ng-invalid[type='email'],form input.ng-invalid[type='url'],form textarea.ng-invalid,form select.ng-invalid,tags-input .tags .ng-invalid.input,.accounts .api li input.ng-invalid[type='text']{border-color:#d90000}form input[disabled="disabled"][type='text'],form input[disabled="disabled"][type='number'],form input[disabled="disabled"][type='search'],form input[disabled="disabled"][type='password'],form input[disabled="disabled"][type='email'],form input[disabled="disabled"][type='url'],form textarea[disabled="disabled"],form select[disabled="disabled"],tags-input .tags [disabled="disabled"].input,.accounts .api li input[disabled="disabled"][type='text']{-webkit-text-fill-color:#333;border-color:#D2D2D2;background-color:transparent}label{position:relative}.disabled label{cursor:default}form li.help-msg{margin-bottom:1em}form li.help-msg .help{color:#888;font-size:0.875em}form label span{color:#333}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url']{padding:7px 10px}form input[type='text']::-webkit-input-placeholder,form input[type='number']::-webkit-input-placeholder,form input[type='search']::-webkit-input-placeholder,form input[type='password']::-webkit-input-placeholder,form input[type='email']::-webkit-input-placeholder,form input[type='url']::-webkit-input-placeholder{color:#888}form input[type='text']:-moz-placeholder,form input[type='number']:-moz-placeholder,form input[type='search']:-moz-placeholder,form input[type='password']:-moz-placeholder,form input[type='email']:-moz-placeholder,form input[type='url']:-moz-placeholder{color:#888}form input[type='text']::-moz-placeholder,form input[type='number']::-moz-placeholder,form input[type='search']::-moz-placeholder,form input[type='password']::-moz-placeholder,form input[type='email']::-moz-placeholder,form input[type='url']::-moz-placeholder{color:#888}form input[type='text']:-ms-input-placeholder,form input[type='number']:-ms-input-placeholder,form input[type='search']:-ms-input-placeholder,form input[type='password']:-ms-input-placeholder,form input[type='email']:-ms-input-placeholder,form input[type='url']:-ms-input-placeholder{color:#888}form input[type='number']{padding-right:15px}form input[type='search']{-webkit-appearance:textfield}form input[type='search']::-webkit-search-decoration,form input[type='search']::-webkit-search-cancel-button{-webkit-appearance:none}form input[type='radio'],form input[type='image']{display:inline-block;margin-right:10px}form textarea{overflow:auto;height:auto;min-height:175px;padding:7px 10px;vertical-align:top}form select{display:block;clear:both;cursor:pointer;margin:0;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-position:top 16px right 10px;padding:6px 30px 6px 10px;-moz-appearance:none;text-indent:0.01px;text-overflow:''}form select[multiple],form select[size]{height:auto;background-image:none;padding-top:10px}form select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}form select[disabled]{color:#888;background-image:none}form select::-ms-expand{display:none}form fieldset{background:none;margin-left:0;padding:0}.checkbox{visibility:hidden;width:0;height:0;margin-right:0;position:absolute}.checkbox+.checkbox-label{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-left:20px;position:relative}.checkbox+.checkbox-label:before{content:"";display:inline-block;width:20px;height:20px;position:absolute;top:0;left:0;background:url("../img/checkbox.svg") no-repeat;background-size:13px 13px;background-position:0px 3px}.checkbox:checked+.checkbox-label:before{background:url("../img/checkbox-checked.svg") no-repeat;background-position:0px 3px}.checkbox[disabled="disabled"]+.checkbox-label:before{cursor:default;opacity:0.5}.field-error,.errors{color:#DF382C}.field-error .errorlist,.errors .errorlist{margin:0}.field-error .errorlist li,.errors .errorlist li{margin:0 0 14px 0}.inline{display:inline-block;width:100%;font-size:0;margin-bottom:10px}.inline.error{background-color:#fdf5f5;box-shadow:0px 0px 0px 5px #fdf5f5}.inline.error .ng-invalid{border-color:#D2D2D2}.inline:last-of-type{margin-bottom:0}.inline label{display:inline-block;float:none;font-size:16px;margin:0}.inline input[type='submit'],.inline input[type='text'],.inline input[type='number'],.inline input[type='search'],.inline input[type='password'],.inline input[type='email'],.inline input[type='checkbox'],.inline select{display:inline-block;clear:none;margin:0;float:none;font-size:16px}.inline input[type='submit']:invalid,.inline input[type='text']:invalid,.inline input[type='number']:invalid,.inline input[type='search']:invalid,.inline input[type='password']:invalid,.inline input[type='email']:invalid,.inline input[type='checkbox']:invalid,.inline select:invalid{-moz-box-shadow:none}.inline input[type='submit']:-moz-submit-invalid,.inline input[type='text']:-moz-submit-invalid,.inline input[type='number']:-moz-submit-invalid,.inline input[type='search']:-moz-submit-invalid,.inline input[type='password']:-moz-submit-invalid,.inline input[type='email']:-moz-submit-invalid,.inline input[type='checkbox']:-moz-submit-invalid,.inline select:-moz-submit-invalid{box-shadow:none}.inline input[type='submit']:-moz-ui-invalid,.inline input[type='text']:-moz-ui-invalid,.inline input[type='number']:-moz-ui-invalid,.inline input[type='search']:-moz-ui-invalid,.inline input[type='password']:-moz-ui-invalid,.inline input[type='email']:-moz-ui-invalid,.inline input[type='checkbox']:-moz-ui-invalid,.inline select:-moz-ui-invalid{box-shadow:none}.inline div{float:none;margin:0}.inline input.cta-ubuntu,.inline a.link-cta-ubuntu,.inline button.cta-ubuntu{font-size:16px}.inline .icon{position:absolute;top:11px;right:10px;cursor:pointer}.inline .error-message{font-size:12px;color:#e85232;margin-top:10px;margin-bottom:10px;font-weight:normal}.form-inline label,.form-inline button,.form-inline input[type='submit'],.form-inline input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{display:inline-block;width:auto;vertical-align:middle;margin-bottom:0}.form-inline input,.form-inline input[type='submit'] input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{margin-left:20px}.form-inline fieldset{width:auto;display:inline-block;margin:0 40px 0 0}.controls{position:absolute;top:0;right:20px}.controls a,.controls button{margin-left:20px}.icon{background-size:16px 16px;width:16px;height:16px;padding:0;display:inline-block}.icon.icon__loading{background:url("../img/in_progress.png") no-repeat;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear}a.icon{cursor:pointer}dl dt{clear:left}dl dd{color:#888;margin-left:0}dl dt,dl dd{display:inline-block;float:left;line-height:37px;margin-bottom:10px !important}tags-input{outline:none}tags-input .host:focus{outline:none}tags-input .tags:focus,tags-input .tags.focused{outline:none}tags-input .tags .tag-list{margin:4px 0 0;padding:0;list-style-type:none;width:100%;float:left}tags-input .tags .tag-item{display:inline-block;float:left;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;height:30px;line-height:30px;cursor:default;color:#000;padding-right:15px;position:relative;margin:0 11px 0 0}tags-input .tags .tag-item .remove-button{display:inline-block;width:12px;height:12px;text-indent:-999em;background:url("../img/icons/cross.svg") no-repeat;background-size:12px 12px;position:absolute;right:0;top:9px;cursor:pointer}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags .input{padding:7px 10px;width:100% !important;float:left;position:relative !important;left:0}tags-input .tags .input::-ms-clear{display:none}tags-input .autocomplete{float:left;width:100%}tags-input .autocomplete .suggestion-list{background:#FFF;padding:10px 8px;border:1px solid #D2D2D2;border-top:0;border-radius:0 0 2px 2px}tags-input .autocomplete .suggestion-list li:hover{background:#EEE;cursor:pointer}tags-input[disabled] .host:focus{outline:none}tags-input[disabled] .tags{cursor:default}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .input{cursor:default}.tag-link{margin-right:10px}.tag-link:last-of-type:after{content:''}.table__data tags-input .tags{margin-top:-10px}.table__data tags-input .tags input{margin-left:0;width:50% !important;float:left}.pagination{margin:10px 0;text-align:center}.pagination .inactive{color:#AEA79F}.pagination a,.pagination span{margin:0 5px}.search{position:relative;padding-bottom:20px}.search input[type='search']{-webkit-appearance:textfield}.search .search__input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;border:none;padding:13px 20px;font-size:1.25em}.search .search__input::-webkit-input-placeholder{color:#000 !important}.search .search__input:-moz-placeholder{color:#000 !important}.search .search__input::-moz-placeholder{color:#000 !important}.search .search__input:-ms-input-placeholder{color:#000 !important}.search .search__input[disabled="disabled"]{background-color:#fff;opacity:.5;pointer-events:none}.search .search__input[disabled="disabled"]+.search__submit.close{pointer-events:none;opacity:.5}.search .search__submit{position:absolute;top:15px;right:25px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0;border:none}.search .search__submit:hover{background-color:transparent;background-image:url("../img/search-icon.svg")}.search .search__submit.close{background-image:url("../img/icons/cross.svg");background-size:21px;margin-top:2px}.search .search__submit.close:hover{background-image:url("../img/icons/cross.svg")}.spinner-col{width:10px}.spinner{float:left;margin:0 auto;text-indent:-9999em}.spinner.spin{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}table{text-align:left;width:100%;margin-bottom:40px;border-collapse:separate;border-spacing:0;font-size:16px}table th,table td{background:transparent;text-align:left;padding:13px 10px}table th .checkbox+.checkbox-label::before,table td .checkbox+.checkbox-label::before{top:-2px}table thead th{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}table tbody tr:hover .icon-controls a{opacity:1}table tbody td{border:none;border-bottom:1px dotted #B2B2B2;position:relative}table tbody td.icon-controls{text-align:right}table tbody td.icon-controls a{opacity:0}table tbody td input[type="text"]{position:absolute;left:10px;top:6px;width:80%}.table-listing{text-align:left;width:100%;margin:0 0 40px 0;border-collapse:separate;border-spacing:0}.table-listing .table-listing__row:hover .table-listing__cell{background-color:#FFF}.table-listing .table-listing__row.error{background-color:#F3E3E2}.table-listing .table-listing__row.error .status{color:#DD3832}.table-listing .table-listing__row.progress{background-color:rgba(25,182,238,0.1)}.table-listing .table-listing__row.selected{background-color:#FFF}.table-listing .table-listing__header{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}.table-listing .table-listing__header .table-listing__header-link{background-repeat:no-repeat;background-position:top 8px right 0;color:#888}.table-listing .table-listing__header .table-listing__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table-listing .table-listing__header .table-listing__header-link:focus,.table-listing .table-listing__header .table-listing__header-link:active,.table-listing .table-listing__header .table-listing__header-link:visited{text-decoration:none}.table-listing .table-listing__header .table-listing__header-link.active{color:#333}.table-listing .table-listing__header .table-listing__header-link.sort{border-bottom:1px solid #333}.table-listing .table-listing__header .divide{width:1px;display:inline-block;background:#D2D2D2 none repeat scroll 0% 0%;height:10px;padding:0px;margin:0px 5px}.table-listing .table-listing__cell{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:none;border-bottom:1px dotted #B2B2B2;position:relative}.table-listing .table-listing__cell.icon-controls{text-align:right;opacity:0}.table-listing .table-listing__cell input,.table-listing .table-listing__cell select{position:absolute;left:10px;top:5px;width:80%}.table-listing .fixed{max-width:200px;min-width:200px;width:200px;padding-left:0}.table-listing__header .table-listing .fixed{padding-left:0}.table-listing.no-hover .table-listing__row:hover .table-listing__cell,.table-listing.no-hover .table-listing__row:hover td{background-color:transparent}.t1{width:1%}.t2{width:2%}.t3{width:3%}.t4{width:4%}.t5{width:5%}.t6{width:6%}.t7{width:7%}.t8{width:8%}.t9{width:9%}.t10{width:10%}.t11{width:11%}.t12{width:12%}.t13{width:13%}.t14{width:14%}.t15{width:15%}.t16{width:16%}.t17{width:17%}.t18{width:18%}.t19{width:19%}.t20{width:20%}.t21{width:21%}.t22{width:22%}.t23{width:23%}.t24{width:24%}.t25{width:25%}.t26{width:26%}.t27{width:27%}.t28{width:28%}.t29{width:29%}.t30{width:30%}.t31{width:31%}.t32{width:32%}.t33{width:33%}.t34{width:34%}.t35{width:35%}.t36{width:36%}.t37{width:37%}.t38{width:38%}.t39{width:39%}.t40{width:40%}.t41{width:41%}.t42{width:42%}.t43{width:43%}.t44{width:44%}.t45{width:45%}.t46{width:46%}.t47{width:47%}.t48{width:48%}.t49{width:49%}.t50{width:50%}.t51{width:51%}.t52{width:52%}.t53{width:53%}.t54{width:54%}.t55{width:55%}.t56{width:56%}.t57{width:57%}.t58{width:58%}.t59{width:59%}.t60{width:60%}.t61{width:61%}.t62{width:62%}.t63{width:63%}.t64{width:64%}.t65{width:65%}.t66{width:66%}.t67{width:67%}.t68{width:68%}.t69{width:69%}.t70{width:70%}.t71{width:71%}.t72{width:72%}.t73{width:73%}.t74{width:74%}.t75{width:75%}.t76{width:76%}.t77{width:77%}.t78{width:78%}.t79{width:79%}.t80{width:80%}.t81{width:81%}.t82{width:82%}.t83{width:83%}.t84{width:84%}.t85{width:85%}.t86{width:86%}.t87{width:87%}.t88{width:88%}.t89{width:89%}.t90{width:90%}.t91{width:91%}.t92{width:92%}.t93{width:93%}.t94{width:94%}.t95{width:95%}.t96{width:96%}.t97{width:97%}.t98{width:98%}.t99{width:99%}.t100{width:100%}.table__column--1{width:1%}.table__column--2{width:2%}.table__column--3{width:3%}.table__column--4{width:4%}.table__column--5{width:5%}.table__column--6{width:6%}.table__column--7{width:7%}.table__column--8{width:8%}.table__column--9{width:9%}.table__column--10{width:10%}.table__column--11{width:11%}.table__column--12{width:12%}.table__column--13{width:13%}.table__column--14{width:14%}.table__column--15{width:15%}.table__column--16{width:16%}.table__column--17{width:17%}.table__column--18{width:18%}.table__column--19{width:19%}.table__column--20{width:20%}.table__column--21{width:21%}.table__column--22{width:22%}.table__column--23{width:23%}.table__column--24{width:24%}.table__column--25{width:25%}.table__column--26{width:26%}.table__column--27{width:27%}.table__column--28{width:28%}.table__column--29{width:29%}.table__column--30{width:30%}.table__column--31{width:31%}.table__column--32{width:32%}.table__column--33{width:33%}.table__column--34{width:34%}.table__column--35{width:35%}.table__column--36{width:36%}.table__column--37{width:37%}.table__column--38{width:38%}.table__column--39{width:39%}.table__column--40{width:40%}.table__column--41{width:41%}.table__column--42{width:42%}.table__column--43{width:43%}.table__column--44{width:44%}.table__column--45{width:45%}.table__column--46{width:46%}.table__column--47{width:47%}.table__column--48{width:48%}.table__column--49{width:49%}.table__column--50{width:50%}.table__column--51{width:51%}.table__column--52{width:52%}.table__column--53{width:53%}.table__column--54{width:54%}.table__column--55{width:55%}.table__column--56{width:56%}.table__column--57{width:57%}.table__column--58{width:58%}.table__column--59{width:59%}.table__column--60{width:60%}.table__column--61{width:61%}.table__column--62{width:62%}.table__column--63{width:63%}.table__column--64{width:64%}.table__column--65{width:65%}.table__column--66{width:66%}.table__column--67{width:67%}.table__column--68{width:68%}.table__column--69{width:69%}.table__column--70{width:70%}.table__column--71{width:71%}.table__column--72{width:72%}.table__column--73{width:73%}.table__column--74{width:74%}.table__column--75{width:75%}.table__column--76{width:76%}.table__column--77{width:77%}.table__column--78{width:78%}.table__column--79{width:79%}.table__column--80{width:80%}.table__column--81{width:81%}.table__column--82{width:82%}.table__column--83{width:83%}.table__column--84{width:84%}.table__column--85{width:85%}.table__column--86{width:86%}.table__column--87{width:87%}.table__column--88{width:88%}.table__column--89{width:89%}.table__column--90{width:90%}.table__column--91{width:91%}.table__column--92{width:92%}.table__column--93{width:93%}.table__column--94{width:94%}.table__column--95{width:95%}.table__column--96{width:96%}.table__column--97{width:97%}.table__column--98{width:98%}.table__column--99{width:99%}.table__column--100{width:100%}#commissioning_scripts .script-content.slider{overflow:hidden}#commissioning_scripts .script-content.slider pre{margin-top:20px}.table{display:table;border-color:#B2B2B2;border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.5em;width:100%}.table .table__row{float:left;width:100%;display:table-row;border-bottom:1px dotted #B2B2B2}.table .table__row:hover{background-color:#FFF}.table .table__row:hover .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row:hover .table__input.invalid{border-color:#D90000}.table .table__row:hover .table__input[disabled]{border-color:transparent;color:#333}.table .table__row:hover .table__controls{z-index:1;opacity:1}.table .table__row:hover .table__controls--secondary{z-index:1;opacity:1}.table .table__row.table__row--no-hover:hover{background-color:transparent}.table .table__row.active{background-color:#FFF}.table .table__row.active .table__dropdown .table__data,.table .table__row.active .table__dropdown .table__input{color:#333}.table .table__row.active:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.active:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.active:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input.editible{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active .table__input[disabled]{border-color:transparent;color:#333}.table .table__row.active .table__dropdown{max-height:3000px}.table .table__row.selected .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.selected:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.selected:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.selected:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.disabled>.table__data{color:#888;pointer-events:none}.table .table__row.disabled>.table__data>.table__input{color:#888;pointer-events:none}.table .table__row.disabled .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.disabled:hover .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.disabled:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.disabled:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.noEdit .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.noEdit:hover .table__input{background-color:transparent;border-color:transparent;background-position:right -9999em top -9999em;pointer-events:none}.table .table__row.noEdit:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.noEdit:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__header,.table .table__data{font-size:16px;display:table-cell;padding:13px 10px;box-sizing:border-box;height:100%;background:none;border:0;text-align:left;float:left}.table .table__header a,.table .table__data a{color:#dd4814}.table .table__header a:hover,.table .table__data a:hover{cursor:pointer}.table .table__head{display:table-head;width:100%;box-sizing:border-box}.table .table__head .table__row{border-bottom:1px solid #B2B2B2}.table .table__head .table__row:hover{background-color:transparent}.table .table__head .table__header{font-size:13px;background:none;color:#888}.table .table__head a,.table .table__head .table__header-link{color:#888}.table .table__head a:hover,.table .table__head .table__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table .table__head a.active,.table .table__head .table__header-link.active{color:#333;text-decoration:none}.table .table__head a.sort,.table .table__head .table__header-link.sort{border-bottom:1px solid inherit}.table .table__head .divide{width:1px;display:inline-block;background:#888;height:10px;margin:0 5px}.table .table__body{display:table-row-group}.table .table__footer{display:table-footer-group}.table .table__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.table .table__label a{color:#BCBCBC}.table .table__label a:hover{color:#dd4814}.table .table__label.active a{color:#dd4814}.table .table__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.table .table__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.table .table__tags .table__tag{display:inline-block;margin-right:5px}.table .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.table .table__input.invalid{border-color:transparent}.table .table__input.invalid:focus{border-color:#D90000}.table .table__input[disabled]{border-color:transparent;color:#333}.table .table__input:focus{background-color:#FFF;border-color:#D2D2D2}.table label{font-size:13px;color:#BCBCBC}.table input,.table select{margin:0 0 0 -14px}.table input[type="radio"]{margin-left:0}.table ul li{margin:0;margin-top:14px}.table ul li:first-of-type{margin-top:0}.table .table__dropdown{width:100%;max-height:0;overflow-y:hidden}.table .table__dropdown .table__dropdown-row{border-bottom:0;position:relative;max-height:0;transition:max-height 0.1s ease-out;overflow:hidden}.table .table__dropdown .table__dropdown-row.active{max-height:500px;transition:max-height 0.25s ease-in}.table .table__dropdown .table__dropdown-row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:absolute;height:1px;content:'';top:0;left:10px}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head{border-bottom:0}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head .table__header{color:#BCBCBC;font-size:13px}.table .table__dropdown .table__dropdown-row.no-border{border:0}.table .table__dropdown .table__dropdown-row.no-border:before{border:0}.table .table__dropdown .table__dropdown-row .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__dropdown--info{width:100%;max-height:0;background-color:transparent}.table .table__dropdown--info .table__dropdown-row--info{border-bottom:0;position:relative;max-height:0;transition:max-height 0.1s ease-out;overflow:hidden}.table .table__dropdown--info .table__dropdown-row--info.active{max-height:500px;transition:max-height 0.25s ease-in}.table .table__dropdown--info .table__dropdown-row--info .table__data{color:#BCBCBC}h1 span,h2 span,h3 span,h4 span,h5 span{color:#888;font-size:75%;padding-left:20px}h4{font-size:20px;font-weight:300}pre{border:0;background-color:#FFF;border-radius:2px}pre code{counter-reset:line-numbering}pre code .line{float:left}pre code .line::before{content:counter(line-numbering);counter-increment:line-numbering;padding-right:1em;width:1.5em;text-align:right;opacity:0.5;pointer-events:none;user-select:none}.yui3-node-add-widget{width:65.9292%;margin-right:2.21238%}@media screen and (max-width: 768px){.yui3-node-add-widget{width:100%;margin:0}}.yui3-node-add-widget .buttons{margin-top:30px}.yui3-node-add-widget .add-link img.icon{margin-right:6px}.yui3-overlay{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#fff;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.5);box-shadow:0 0 10px 0 rgba(0,0,0,0.5)}.yui3-overlay ul{padding:5px 0}.yui3-overlay li{float:none}.yui3-overlay li:last-child a{border-bottom:none}.yui3-overlay a{display:block;padding:6px 20px;color:#dd4814 !important;border-bottom:1px solid #e5e2e0}.yui3-overlay a:focus,.yui3-overlay a:hover{background-color:#f2f2f2}.yui3-overlay-hidden{display:none}.yui3-widget-mask{background-color:#000;opacity:0.3}.yui3-panel{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#FFF;padding:50px 80px 50px 80px;-webkit-box-shadow:0 0 15px 0 #000;box-shadow:0 0 15px 0 #000}.yui3-panel .yui3-button{float:right}.yui3-panel .yui3-button.link-button{float:left;padding-left:0;padding-right:0;color:#dd4814;border:none;background:none;-webkit-box-shadow:none;box-shadow:none;font-size:13px}.yui3-widget-hd{margin-bottom:30px;font-size:24px}.yui3-widget-ft{margin-top:50px}.yui3-widget-button-wrapper{width:100%}.icon{margin-left:5px;width:16px;height:16px;display:inline-block;text-indent:999em;background-repeat:no-repeat;background-size:16px 16px;vertical-align:middle}.icon.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.icon.edit{background-image:url("../img/icons/edit.png");background-image:url("../img/icons/edit.svg"),none}.icon.delete{background-image:url("../img/icons/delete.png");background-image:url("../img/icons/delete.svg"),none}.icon.remove{background-image:url("../img/icons/filter-remove.svg"),none}.icon.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.icon.debug{background-image:url("../img/icons/debug.png");background-image:url("../img/icons/debug.svg"),none}.icon.success,.icon.tick{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.icon.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}.icon.partition{background-image:url("../img/icons/partition.svg")}.icon.add{background-image:url("../img/icons/add.svg")}.icon.tags{background-image:url("../img/icons/tags.svg")}.icon.mount{background-image:url("../img/icons/mount.svg")}.icon.unmount{background-image:url("../img/icons/unmount.svg")}.clear{clear:both}.hidden{display:none}.align-right{text-align:right}.align-center{text-align:center}.align-left{text-align:left}.right{float:right !important}.left{float:left !important}.border{border-top:1px dotted #B2B2B2}.border.bottom{border-bottom:1px dotted #B2B2B2}.border.solid{border-style:solid}.vertical-align{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.margin-top{margin-top:20px}.margin-top--five{margin-top:5px}.margin-top--ten{margin-top:10px}.margin-right{margin-right:20px !important}.margin-right--ten{margin-right:10px !important}.margin-bottom{margin-bottom:20px}.margin-left{margin-left:20px !important}.margin-left--ten{margin-left:10px !important}.margin-left--thirty{margin-left:30px !important}.padding-top{padding-top:20px}.padding-top--ten{padding-top:10px !important}.padding-right{padding-right:20px}.padding-bottom{padding-bottom:20px !important}.padding-bottom--ten{padding-bottom:10px !important}.padding-left{padding-left:20px !important}.padding-left--30,.padding-left--thirty{padding-left:30px !important}.padding-left--35{padding-left:35px !important}.padding-left--45{padding-left:45px !important}.padding-left--50{padding-left:50px !important}.border-top{border-top:1px dotted #888}.add-machine__list .add-machine__details,.border-bottom{border-bottom:1px dotted #888}.no-margin{margin:0}.no-margin-top{margin-top:0 !important}.no-padding{padding:0}.no-padding-top{padding-top:0 !important}.no-padding-left{padding-left:0}.no-padding-bottom{padding-bottom:0 !important}.no-margin-bottom{margin-bottom:0}.width--auto{width:auto}.width--half{width:50%}.width--full{width:100%}.tooltip{position:relative}.tooltip::before{content:attr(data-tooltip);font-size:13px;font-weight:400;position:absolute;z-index:999;white-space:nowrap;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);background:#333;color:#FFF;padding:10px;text-indent:0;opacity:0;transition:opacity 0.4s ease-out;border-radius:5px;box-shadow:0px 1px 3px 0 rgba(51,51,51,0.2);top:-9999em}.tooltip::after{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);content:'';width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;z-index:1000;transition:opacity 0.4s ease-out;border-top:5px solid #333;opacity:0;top:-9999em}.tooltip:hover::before{opacity:1 !important;top:-47px}.tooltip:hover::after{opacity:1 !important;top:-10px}.link-cta-ubuntu.tooltip:hover::before,.cta-ubuntu.tooltip:hover::before{top:-50px}.footer-wrapper{border-top:1px dotted #b2b2b2}.footer-wrapper footer.global{background-color:transparent;padding-top:0px;padding-right:20px;padding-left:20px;background-image:url("../img/logos/logo-ubuntu-orange.png");background-image:url("../img/logos/logo-ubuntu-orange.svg"),none;background-size:107px 25px;background-position:top 20px right 20px;background-repeat:no-repeat;max-width:1480px}.footer-wrapper footer.global p{font-size:0.875em}.footer-wrapper footer.global a{margin:0 5px;color:#dd4814}.footer-wrapper footer.global .version{font-weight:500;margin-right:5px}.footer-wrapper footer.global .copy{margin-top:10px}.footer-wrapper footer.global .legal{max-width:1440px}.wrapper{min-height:100%;height:auto !important;height:100%;margin:0 auto -112px;position:relative;background:rgba(255,255,255,0.6);padding-top:172px}.wrapper:after{content:'';position:absolute;display:block;top:0;right:0;bottom:0;left:0;background:url("../img/backgrounds/image-background-paper.png");height:100%;width:100%;z-index:-1}.inner-wrapper{max-width:1480px;padding:0px 20px;margin:0 auto;position:relative}.push,.footer-wrapper{height:112px}.row{background-color:transparent;border-bottom:1px dotted #CCC}.row:last-child{border-bottom:none}header.banner{overflow:visible;z-index:20;position:fixed;top:0}header.banner .logo{padding-left:15px}header.banner nav.nav-primary{border-bottom:none}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:100px 30px;-webkit-background-size:100px 30px;-o-background-size:100px 30px;background-size:100px 30px;background-position:5px 9px;background-image:url("../img/logos/logo.png");background-image:url("../img/logos/logo.svg"),none}header.banner .nav-primary li:hover ul:after{display:none}@media screen and (max-width: 768px){header.banner .nav-primary ul{border-right:none}}header.banner #right-nav{float:right;margin-right:20px}@media screen and (max-width: 768px){header.banner #right-nav{margin-right:0}}header.banner #user-link{position:relative}@media screen and (max-width: 768px){header.banner #user-link{border-top:1px solid #d4d7d4;width:100%}}header.banner #user-link>a{padding-bottom:12px}@media screen and (max-width: 768px){header.banner #user-link>a{display:none}}header.banner #user-link .normal,header.banner #user-link .hover{margin-right:7px}@media screen and (max-width: 768px){header.banner #user-link .normal,header.banner #user-link .hover{display:none}}header.banner #user-link .hover{display:none}header.banner #user-link .nav{-webkit-border-radius:0px 0px 4px 4px;-moz-border-radius:0px 0px 4px 4px;border-radius:0px 0px 4px 4px;background-color:#FFF;border:none;display:none;position:absolute;right:0;top:48px;box-shadow:0px 2px 4px rgba(0,0,0,0.15)}@media screen and (min-width: 769px){header.banner #user-link .nav a.active{background:none;border:none}}header.banner #user-link .nav a:hover{background-color:transparent}@media screen and (max-width: 768px){header.banner #user-link .nav a:hover{background-color:#F8F8F8;color:#333}}@media screen and (max-width: 768px){header.banner #user-link .nav{background:none;position:relative;top:inherit;width:100%;box-shadow:none;float:left;padding:0}header.banner #user-link .nav li{border-bottom:1px solid #d4d7d4;width:100%;float:left}header.banner #user-link .nav li a{padding:10px 14px;width:100%}}@media screen and (max-width: 768px){header.banner #user-link:hover>a{background-color:transparent}}header.banner #user-link:hover .normal{display:none}header.banner #user-link:hover .hover{display:inline-block}@media screen and (max-width: 768px){header.banner #user-link:hover .hover{display:none}}header.banner #user-link:hover .nav{display:block}header.banner .nav-toggle{background-image:url("../img/icons/navigation-menu-plain.png");background-image:url("../img/icons/navigation-menu-plain.svg"),none;top:0}@media screen and (max-width: 768px){header.banner .nav-toggles .open{display:block}header.banner .nav-toggles .close{display:none}header.banner #canonlist:target ul{display:block}header.banner #canonlist:target+.nav-toggles .open{display:none}header.banner #canonlist:target+.nav-toggles .close{display:block}}.page-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;float:left;position:fixed;z-index:10;top:48px}.page-header .page-header__nav{position:absolute;top:10px;z-index:1000}.page-header .page-header__nav a{font-weight:300}.page-header .page-header__title{font-size:2em;width:auto;padding:31px 0;margin:0;float:left;font-size:32px}.page-header .page-header__title [contenteditable="true"]{display:inline-block;padding:8px 10px;width:auto;box-sizing:border-box;border:1px solid transparent;margin:-10px 0 -10px -10px;border-radius:2px;color:#333;cursor:default;font-size:32px}.page-header .page-header__title [contenteditable="true"].editable:hover{border:1px solid #D2D2D2;cursor:text}.page-header .page-header__title [contenteditable="true"]:active,.page-header .page-header__title [contenteditable="true"]:focus{outline:none;background-color:#FFF;border:1px solid #B2B2B2}.page-header .page-header__title [contenteditable="true"].invalid,.page-header .page-header__title [contenteditable="true"].invalid:hover,.page-header .page-header__title [contenteditable="true"].invalid:active,.page-header .page-header__title [contenteditable="true"].invalid:focus{border-color:#d90000}.page-header .page-header__title [contenteditable="true"] br{display:none}.page-header .page-header__title .icon{vertical-align:3px;margin-right:10px}.page-header .page-header__title .page-header__title--identicator{font-size:0.6em;width:auto;display:inline-block;position:relative;top:0px;padding-left:20px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator a{color:#888}.page-header .page-header__title .page-header__title--identicator a:hover{text-decoration:none;border-bottom:3px solid #888}.page-header .page-header__title .page-header__title--identicator a:focus,.page-header .page-header__title .page-header__title--identicator a:active{text-decoration:none}.page-header .page-header__title .page-header__title--identicator a.active{color:#333;border-bottom:3px solid #dd4814}.page-header .page-header__title .page-header__title--identicator a.active:hover{text-decoration:none;cursor:default}.page-header .page-header__title .page-header__title--identicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore{font-size:14px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore:hover{border:0;text-decoration:underline}.page-header .page-header__title .link-cta-ubuntu,.page-header .page-header__title .alt{font-size:16px;margin-left:20px;position:relative;vertical-align:middle;margin-top:-5px}.page-header .page-header__actions{float:right;padding:34px 0;margin-bottom:0}.page-header .page-header__actions .page-header__cta{float:right;position:relative;height:auto;max-height:36px}.page-header .page-header__actions .page-header__cta .cta-group{float:right}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback{display:inline-block;position:relative;line-height:36px;text-align:right;color:#dd4814;margin-right:20px;cursor:pointer}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback:hover{text-decoration:underline}.page-header .page-header__dropdown{float:left;width:100%;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;border-color:#888 !important}.page-header .page-header__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out;border-top:none}.page-header .page-header__dropdown .page-header__feedback{border-top:1px dotted #888;display:inline-block;width:100%;padding:20px 0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;background-position:top 3px left 0px;background-repeat:no-repeat;padding:6px 0 5px 25px;width:auto;display:inline-block;position:relative}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none;background-position:0px 9px}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info.progress,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error.progress{width:100%}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress{padding-left:0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress .loader{position:relative;top:1px}.title .title__indicator .title__link{color:#888;font-size:20px}.title .title__indicator .title__link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.title .title__indicator .title__link:focus,.title .title__indicator .title__link:active{text-decoration:none}.title .title__indicator .title__link.active{color:#333;border-bottom:1px #dd4814 solid}.title .title__indicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.accounts .logout .divide{padding:0 20px 0 30px;display:inline-block}.accounts .api li{position:relative}.accounts .api li input[type='text']{line-height:30px;padding-right:30px;width:100%}.accounts .api li input[type='text']::-webkit-input-placeholder{color:#333}.accounts .api li input[type='text']:-moz-placeholder{color:#333}.accounts .api li input[type='text']::-moz-placeholder{color:#333}.accounts .api li input[type='text']:-ms-input-placeholder{color:#333}.accounts .api li .delete-link{position:absolute;top:7px;right:7px}form.page-title-form{margin-bottom:30px}form.page-title-form input{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid transparent;background-color:transparent;font-size:36px;line-height:26px;color:#333;margin:6px 10px;padding:4px;height:auto;box-shadow:none}form.page-title-form input:hover{outline:none;background:#FFF;border-color:#D2D2D2;box-shadow:inset 0 1px 1px rgba(0,0,0,0.1)}form.page-title-form input:focus{border:1px solid #dd4814;background-color:#fff;outline:none}.small-icon{width:12px}.images-info{text-align:center;padding:10px}.images-warning{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}#loader{width:10px;margin:16px auto 0 auto}#importing{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;position:relative}#importing .spinner{position:absolute;left:15px}.importing-dot{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite}.selector{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;padding:20px;background:#FFF;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;width:100%;float:left}.selector h2{font-size:1em;font-weight:300}.selector h2 img{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;background:url("../img/icons/help.svg") no-repeat;width:16px;height:16px;padding-left:16px;margin-left:5px}.selector .selector-available,.selector .selector-chosen{width:46%;float:left;margin:0;text-align:left}@media screen and (max-width: 768px){.selector .selector-available,.selector .selector-chosen{width:100%}}.selector .selector-available h2,.selector .selector-chosen h2{background:none;border:none}.selector .selector-available select,.selector .selector-chosen select{margin-bottom:10px}.selector ul.selector-chooser{width:8%;float:left;margin:20% 0 0}@media screen and (max-width: 768px){.selector ul.selector-chooser{width:100%;margin:0 0 10px;text-align:center}}.selector ul.selector-chooser li{width:100%;text-align:center}@media screen and (max-width: 768px){.selector ul.selector-chooser li{width:auto;display:inline-block;height:16px;width:16px;margin:0 20px}}.selector ul.selector-chooser li a{display:block;text-indent:999em;width:16px;height:16px;overflow:hidden;margin:0 auto}.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_right.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_down.svg")}}.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_left.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_up.svg")}}.selector .selector-filter img{display:none}.selector .selector-filter input{background-image:url("../img/search-orange.png");background-repeat:no-repeat;background-position:top 7px right 8px}.selector select#id_mac_addresses_to.filtered{height:269px !important}.nodes{position:relative}.nodes .search{position:absolute;right:0}.nodes .search input[type='submit']{position:absolute;top:8px;right:12px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0}.nodes .search input[type='submit']:hover{color:transparent;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat}@media screen and (max-width: 768px){.nodes .search{position:relative}}@media screen and (max-width: 768px){.nodes .actions select{width:100%;margin-bottom:20px}.nodes .actions input{position:absolute;right:0;top:0}}.powerstates{width:14px;height:15px;display:inline-block}.powerstates.power-on{background:transparent url("../img/icons/power-on.svg") left top no-repeat}.powerstates.power-off{background:transparent url("../img/icons/power-off.svg") left top no-repeat}.powerstates.power-unknown{background:none}.powerstates.power-error{background:transparent url("../img/icons/power-error.svg") left top no-repeat}.powerstates.power-check-ok{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#33CC00}.powerstates.power-check-error{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#FF0000}.node-actions .link-cta-ubuntu,.node-actions .cta-ubuntu{margin-bottom:10px;float:left;font-size:16px}.buttons{margin-top:30px}#network-interfaces li{list-style-type:none}#content-discovery-data{padding-top:20px;margin-top:20px;border-top:1px dotted #B2B2B2}#content-discovery-data .slider{height:0;overflow:hidden}.slider{padding-top:0 !important}.slider .content{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);background:#FFF;border:1px solid #EEE;border-top:none;padding:20px}.slider .content pre{margin:0}.slider .tabs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;padding:8px 20px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;border:1px solid #EEE}.add-machine__list{padding:13px 0 20px;border-top:1px dotted #888;margin-bottom:0}.add-machine__list .add-machine__details{background:transparent url("../img/icons/accordion-open.svg") top 12px right 10px no-repeat}.add-machine__list .add-machine__details>div{margin-bottom:0}.add-machine__list .add-machine__details .add-machine__details-form{display:none}.add-machine__list .add-machine__details.active{background-image:url("../img/icons/accordion-close.svg")}.add-machine__list .add-machine__details.active .add-machine__details-form{display:block}.power-status{display:inline-block;font-size:100%;padding-left:0}.power-status--power{display:inline-block;margin-left:20px;position:relative;font-size:100%}.power-status--power.checking{color:#2AB7EC;background:url("../img/status_in_progress.svg");padding-left:20px}.power-status--power.on{padding-left:20px;color:#38B44A;background:transparent url("../img/icons/power-on.svg") left top 4px no-repeat}.power-status--power.off{padding-left:20px;color:#D2D2D2;background:transparent url("../img/icons/power-off.svg") left top 4px no-repeat}.power-status--power.error{padding-left:20px;color:#DB3832;background:transparent url("../img/icons/power-error.svg") left top 4px no-repeat}.power-status--power .power-check{font-size:0.75em;color:#D2D2D2;display:inline-block;padding:0}.power-status--power .power-check .power-check__link{color:#888;text-decoration:none;margin-left:5px}.power-status--power .power-check .power-check__link:hover{border-bottom:0 !important;text-decoration:underline !important}.loading,.loader{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0;display:inline-block}.details__used{color:#BCBCBC}.details .details__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.details .details__label a{color:#BCBCBC}.details .details__label a:hover{color:#dd4814}.details .details__label.active a{color:#dd4814}.details .details__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.details .details__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.details .table-row .details__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.details .table-row .details__text{line-height:37px}.details .table-row:hover .details__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.details .table-row:hover .details__controls{z-index:1;opacity:1}.details .table-row:hover .details__controls--secondary{z-index:1;opacity:1}.details .table-row.active:hover .details__input{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px}.details .table-row.active:hover .details__controls{opacity:0;z-index:-1000;pointer-events:none}.details .table-row.active:hover .details__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.details .table-row label{font-size:13px;color:#BCBCBC}.details .table-row input,.details .table-row select{margin:0 0 0 -14px}.details .table-row input[type="radio"]{margin-left:0}.details .details__dropdown .details__row{border-bottom:0;position:relative}.details .details__dropdown .details__row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:relative;height:1px;content:''}.details .details__dropdown .details__row.details__row--head{border-bottom:0}.details .details__dropdown .details__row.details__row--head .table-cell{color:#BCBCBC;font-size:13px}.details .details__dropdown .details__row.no-border{border:0}.details .details__dropdown .details__row.no-border:before{border:0}.details .details__dropdown--info .table-row{border-bottom:0}.details .details__dropdown--info .table-cell{color:#BCBCBC}
2291+>>>>>>> MERGE-SOURCE
2292
2293=== modified file 'src/maasserver/testing/factory.py'
2294--- src/maasserver/testing/factory.py 2016-01-08 05:09:21 +0000
2295+++ src/maasserver/testing/factory.py 2016-01-10 08:29:39 +0000
2296@@ -343,11 +343,19 @@
2297 if interface:
2298 self.make_Interface(
2299 INTERFACE_TYPE.PHYSICAL, node=node, vlan=vlan, fabric=fabric)
2300+<<<<<<< TREE
2301 if node_type == NODE_TYPE.MACHINE and with_boot_disk:
2302 root_partition = self.make_Partition(node=node)
2303 acquired = node.status in ALLOCATED_NODE_STATUSES
2304 self.make_Filesystem(
2305 partition=root_partition, mount_point='/', acquired=acquired)
2306+=======
2307+ if installable and with_boot_disk:
2308+ root_partition = self.make_Partition(node=node)
2309+ acquired = node.status in ALLOCATED_NODE_STATUSES
2310+ self.make_Filesystem(
2311+ partition=root_partition, mount_point='/', acquired=acquired)
2312+>>>>>>> MERGE-SOURCE
2313
2314 # Update the 'updated'/'created' fields with a call to 'update'
2315 # preventing a call to save() from overriding the values.
2316
2317=== modified file 'src/maasserver/tests/test_auth.py'
2318--- src/maasserver/tests/test_auth.py 2015-12-10 01:04:27 +0000
2319+++ src/maasserver/tests/test_auth.py 2016-01-10 08:29:39 +0000
2320@@ -223,6 +223,7 @@
2321 user, NODE_PERMISSION.ADMIN, factory.make_FilesystemGroup()))
2322
2323
2324+<<<<<<< TREE
2325 class TestMAASAuthorizationBackendForDeviceInterface(MAASServerTestCase):
2326
2327 def test_owner_can_edit_device_interface(self):
2328@@ -251,6 +252,36 @@
2329 user, NODE_PERMISSION.EDIT, interface))
2330
2331
2332+=======
2333+class TestMAASAuthorizationBackendForDeviceInterface(MAASServerTestCase):
2334+
2335+ def test_owner_can_edit_device_interface(self):
2336+ backend = MAASAuthorizationBackend()
2337+ user = factory.make_User()
2338+ parent = factory.make_Node()
2339+ device = factory.make_Node(
2340+ owner=user, installable=False, parent=parent)
2341+ interface = factory.make_Interface(
2342+ INTERFACE_TYPE.PHYSICAL, node=device)
2343+ self.assertTrue(
2344+ backend.has_perm(
2345+ user, NODE_PERMISSION.EDIT, interface))
2346+
2347+ def test_non_owner_cannot_edit_device_interface(self):
2348+ backend = MAASAuthorizationBackend()
2349+ user = factory.make_User()
2350+ owner = factory.make_User()
2351+ parent = factory.make_Node()
2352+ device = factory.make_Node(
2353+ owner=owner, installable=False, parent=parent)
2354+ interface = factory.make_Interface(
2355+ INTERFACE_TYPE.PHYSICAL, node=device)
2356+ self.assertFalse(
2357+ backend.has_perm(
2358+ user, NODE_PERMISSION.EDIT, interface))
2359+
2360+
2361+>>>>>>> MERGE-SOURCE
2362 class TestMAASAuthorizationBackendForNetworking(MAASServerTestCase):
2363
2364 scenarios = (
2365
2366=== modified file 'src/maasserver/tests/test_forms_blockdevice.py'
2367=== modified file 'src/maasserver/tests/test_forms_partition.py'
2368=== modified file 'src/maasserver/tests/test_forms_raid.py'
2369=== modified file 'src/maasserver/tests/test_forms_subnet.py'
2370=== modified file 'src/maasserver/tests/test_forms_volume_group.py'
2371=== modified file 'src/maasserver/tests/test_node_constraint_filter_forms.py'
2372--- src/maasserver/tests/test_node_constraint_filter_forms.py 2016-01-05 21:07:22 +0000
2373+++ src/maasserver/tests/test_node_constraint_filter_forms.py 2016-01-10 08:29:39 +0000
2374@@ -974,6 +974,7 @@
2375 fabric=fabric2, vlan=vlan2)
2376
2377 form = AcquireNodeForm({
2378+<<<<<<< TREE
2379 'interfaces': 'fabric:fabric_class=1g;vlan:vid=1'})
2380 self.assertTrue(form.is_valid(), dict(form.errors))
2381 filtered_nodes, _, _ = form.filter_nodes(Machine.objects)
2382@@ -1032,6 +1033,66 @@
2383 self.assertTrue(form.is_valid(), dict(form.errors))
2384 filtered_nodes, _, _ = form.filter_nodes(Machine.objects)
2385 self.assertItemsEqual([node1, node2], filtered_nodes)
2386+=======
2387+ u'interfaces': u'fabric:fabric_class=1g;vlan:vid=1'})
2388+ self.assertTrue(form.is_valid(), dict(form.errors))
2389+ filtered_nodes, _, _ = form.filter_nodes(Node.nodes)
2390+ self.assertItemsEqual([node1], filtered_nodes)
2391+
2392+ form = AcquireNodeForm({
2393+ u'interfaces': u'label:fabric_class=10g;vlan:vid=2'})
2394+ self.assertTrue(form.is_valid(), dict(form.errors))
2395+ filtered_nodes, _, _ = form.filter_nodes(Node.nodes)
2396+ self.assertItemsEqual([node2], filtered_nodes)
2397+
2398+ def test_interfaces_filters_same_key_treated_as_OR_operation(self):
2399+ fabric1 = factory.make_Fabric(class_type="1g")
2400+ fabric2 = factory.make_Fabric(class_type="10g")
2401+ vlan1 = factory.make_VLAN(vid=1, fabric=fabric1)
2402+ vlan2 = factory.make_VLAN(vid=2, fabric=fabric2)
2403+ node1 = factory.make_Node_with_Interface_on_Subnet(
2404+ fabric=fabric1, vlan=vlan1)
2405+ node2 = factory.make_Node_with_Interface_on_Subnet(
2406+ fabric=fabric2, vlan=vlan2)
2407+
2408+ form = AcquireNodeForm({
2409+ u'interfaces':
2410+ u'fabric:fabric_class=1g,fabric_class=10g;vlan:vid=1'})
2411+ self.assertTrue(form.is_valid(), dict(form.errors))
2412+ filtered_nodes, _, _ = form.filter_nodes(Node.nodes)
2413+ self.assertItemsEqual([node1], filtered_nodes)
2414+
2415+ form = AcquireNodeForm({
2416+ u'interfaces':
2417+ u'label:fabric_class=10g,fabric_class=1g;vlan:vid=2'})
2418+ self.assertTrue(form.is_valid(), dict(form.errors))
2419+ filtered_nodes, _, _ = form.filter_nodes(Node.nodes)
2420+ self.assertItemsEqual([node2], filtered_nodes)
2421+>>>>>>> MERGE-SOURCE
2422+
2423+ def test_interfaces_filters_different_key_treated_as_AND_operation(self):
2424+ fabric1 = factory.make_Fabric(class_type="1g")
2425+ fabric2 = factory.make_Fabric(class_type="10g")
2426+ vlan1 = factory.make_VLAN(vid=1, fabric=fabric1)
2427+ vlan2 = factory.make_VLAN(vid=2, fabric=fabric2)
2428+ node1 = factory.make_Node_with_Interface_on_Subnet(
2429+ fabric=fabric1, vlan=vlan1)
2430+ node2 = factory.make_Node_with_Interface_on_Subnet(
2431+ fabric=fabric2, vlan=vlan2)
2432+
2433+ form = AcquireNodeForm({
2434+ u'interfaces':
2435+ u'none:fabric_class=1g,vid=2'})
2436+ self.assertTrue(form.is_valid(), dict(form.errors))
2437+ filtered_nodes, _, _ = form.filter_nodes(Node.nodes)
2438+ self.assertItemsEqual([], filtered_nodes)
2439+
2440+ form = AcquireNodeForm({
2441+ u'interfaces':
2442+ u'any:fabric_class=10g,fabric_class=1g,vid=1,vid=2'})
2443+ self.assertTrue(form.is_valid(), dict(form.errors))
2444+ filtered_nodes, _, _ = form.filter_nodes(Node.nodes)
2445+ self.assertItemsEqual([node1, node2], filtered_nodes)
2446
2447 def test_combined_constraints(self):
2448 tag_big = factory.make_Tag(name='big')
2449
2450=== modified file 'src/maasserver/tests/test_preseed_storage.py'
2451=== modified file 'src/maasserver/tests/test_storage_layouts.py'
2452--- src/maasserver/tests/test_storage_layouts.py 2015-12-01 18:12:59 +0000
2453+++ src/maasserver/tests/test_storage_layouts.py 2016-01-10 08:29:39 +0000
2454@@ -422,9 +422,15 @@
2455
2456 def assertEFIPartition(self, partition, boot_disk):
2457 self.assertIsNotNone(partition)
2458+<<<<<<< TREE
2459 self.assertEqual(
2460 round_size_to_nearest_block(
2461 EFI_PARTITION_SIZE, boot_disk.block_size),
2462+=======
2463+ self.assertEquals(
2464+ round_size_to_nearest_block(
2465+ EFI_PARTITION_SIZE, boot_disk.block_size),
2466+>>>>>>> MERGE-SOURCE
2467 partition.size)
2468 self.assertThat(
2469 partition.get_effective_filesystem(), MatchesStructure.byEquality(
2470@@ -462,8 +468,13 @@
2471 partitions = partition_table.partitions.order_by('id').all()
2472 root_partition = partitions[0]
2473 self.assertIsNotNone(root_partition)
2474+<<<<<<< TREE
2475 self.assertEqual(
2476 round_size_to_nearest_block(
2477+=======
2478+ self.assertEquals(
2479+ round_size_to_nearest_block(
2480+>>>>>>> MERGE-SOURCE
2481 boot_disk.size - PARTITION_TABLE_EXTRA_SPACE,
2482 PARTITION_ALIGNMENT_SIZE,
2483 False),
2484@@ -491,11 +502,19 @@
2485 partitions = partition_table.partitions.order_by('id').all()
2486 root_partition = partitions[0]
2487 self.assertIsNotNone(root_partition)
2488+<<<<<<< TREE
2489 self.assertEqual(
2490 round_size_to_nearest_block(
2491 MAX_PARTITION_SIZE_FOR_MBR,
2492 PARTITION_ALIGNMENT_SIZE,
2493 False),
2494+=======
2495+ self.assertEquals(
2496+ round_size_to_nearest_block(
2497+ MAX_PARTITION_SIZE_FOR_MBR,
2498+ PARTITION_ALIGNMENT_SIZE,
2499+ False),
2500+>>>>>>> MERGE-SOURCE
2501 root_partition.size)
2502 self.assertThat(
2503 root_partition.get_effective_filesystem(),
2504@@ -524,8 +543,13 @@
2505 # Validate root partition.
2506 root_partition = partitions[1]
2507 self.assertIsNotNone(root_partition)
2508+<<<<<<< TREE
2509 self.assertEqual(
2510 round_size_to_nearest_block(
2511+=======
2512+ self.assertEquals(
2513+ round_size_to_nearest_block(
2514+>>>>>>> MERGE-SOURCE
2515 boot_disk.size - EFI_PARTITION_SIZE -
2516 PARTITION_TABLE_EXTRA_SPACE,
2517 PARTITION_ALIGNMENT_SIZE,
2518@@ -562,9 +586,15 @@
2519 # Validate boot partition.
2520 boot_partition = partitions[1]
2521 self.assertIsNotNone(boot_partition)
2522+<<<<<<< TREE
2523 self.assertEqual(
2524 round_size_to_nearest_block(
2525 boot_size, PARTITION_ALIGNMENT_SIZE, False),
2526+=======
2527+ self.assertEquals(
2528+ round_size_to_nearest_block(
2529+ boot_size, PARTITION_ALIGNMENT_SIZE, False),
2530+>>>>>>> MERGE-SOURCE
2531 boot_partition.size)
2532 self.assertThat(
2533 boot_partition.get_effective_filesystem(),
2534@@ -577,8 +607,13 @@
2535 # Validate root partition.
2536 root_partition = partitions[2]
2537 self.assertIsNotNone(root_partition)
2538+<<<<<<< TREE
2539 self.assertEqual(
2540 round_size_to_nearest_block(
2541+=======
2542+ self.assertEquals(
2543+ round_size_to_nearest_block(
2544+>>>>>>> MERGE-SOURCE
2545 boot_disk.size - boot_partition.size -
2546 EFI_PARTITION_SIZE - PARTITION_TABLE_EXTRA_SPACE,
2547 PARTITION_ALIGNMENT_SIZE,
2548@@ -615,9 +650,15 @@
2549 # Validate root partition.
2550 root_partition = partitions[1]
2551 self.assertIsNotNone(root_partition)
2552+<<<<<<< TREE
2553 self.assertEqual(
2554 round_size_to_nearest_block(
2555 root_size, PARTITION_ALIGNMENT_SIZE, False),
2556+=======
2557+ self.assertEquals(
2558+ round_size_to_nearest_block(
2559+ root_size, PARTITION_ALIGNMENT_SIZE, False),
2560+>>>>>>> MERGE-SOURCE
2561 root_partition.size)
2562 self.assertThat(
2563 root_partition.get_effective_filesystem(),
2564@@ -653,9 +694,15 @@
2565 # Validate boot partition.
2566 boot_partition = partitions[1]
2567 self.assertIsNotNone(boot_partition)
2568+<<<<<<< TREE
2569 self.assertEqual(
2570 round_size_to_nearest_block(
2571 boot_size, PARTITION_ALIGNMENT_SIZE, False),
2572+=======
2573+ self.assertEquals(
2574+ round_size_to_nearest_block(
2575+ boot_size, PARTITION_ALIGNMENT_SIZE, False),
2576+>>>>>>> MERGE-SOURCE
2577 boot_partition.size)
2578 self.assertThat(
2579 boot_partition.get_effective_filesystem(),
2580@@ -668,9 +715,15 @@
2581 # Validate root partition.
2582 root_partition = partitions[2]
2583 self.assertIsNotNone(root_partition)
2584+<<<<<<< TREE
2585 self.assertEqual(
2586 round_size_to_nearest_block(
2587 root_size, PARTITION_ALIGNMENT_SIZE, False),
2588+=======
2589+ self.assertEquals(
2590+ round_size_to_nearest_block(
2591+ root_size, PARTITION_ALIGNMENT_SIZE, False),
2592+>>>>>>> MERGE-SOURCE
2593 root_partition.size)
2594 self.assertThat(
2595 root_partition.get_effective_filesystem(),
2596@@ -711,9 +764,15 @@
2597 root_partition = root_partition_table.partitions.order_by(
2598 'id').all()[0]
2599 self.assertIsNotNone(root_partition)
2600+<<<<<<< TREE
2601 self.assertEqual(
2602 round_size_to_nearest_block(
2603 root_size, PARTITION_ALIGNMENT_SIZE, False),
2604+=======
2605+ self.assertEquals(
2606+ round_size_to_nearest_block(
2607+ root_size, PARTITION_ALIGNMENT_SIZE, False),
2608+>>>>>>> MERGE-SOURCE
2609 root_partition.size)
2610 self.assertThat(
2611 root_partition.get_effective_filesystem(),
2612@@ -977,10 +1036,17 @@
2613 1, volume_group.virtual_devices.count(),
2614 "Should have only 1 logical volume.")
2615 logical_volume = volume_group.virtual_devices.first()
2616+<<<<<<< TREE
2617 expected_size = round_size_to_nearest_block(
2618 lv_size, PARTITION_ALIGNMENT_SIZE, False)
2619 self.assertEqual(expected_size, logical_volume.size)
2620 self.assertEqual(layout.DEFAULT_LV_NAME, logical_volume.name)
2621+=======
2622+ expected_size = round_size_to_nearest_block(
2623+ lv_size, PARTITION_ALIGNMENT_SIZE, False)
2624+ self.assertEquals(expected_size, logical_volume.size)
2625+ self.assertEquals(layout.DEFAULT_LV_NAME, logical_volume.name)
2626+>>>>>>> MERGE-SOURCE
2627 self.assertThat(
2628 logical_volume.get_effective_filesystem(),
2629 MatchesStructure.byEquality(
2630@@ -1006,9 +1072,15 @@
2631 self.assertEqual(
2632 4, partition_table.partitions.count(),
2633 "Should have 4 partitions.")
2634+<<<<<<< TREE
2635 expected_size = round_size_to_nearest_block(
2636 MAX_PARTITION_SIZE_FOR_MBR, PARTITION_ALIGNMENT_SIZE, False)
2637 self.assertEqual(expected_size, root_partition.size)
2638+=======
2639+ expected_size = round_size_to_nearest_block(
2640+ MAX_PARTITION_SIZE_FOR_MBR, PARTITION_ALIGNMENT_SIZE, False)
2641+ self.assertEquals(expected_size, root_partition.size)
2642+>>>>>>> MERGE-SOURCE
2643
2644
2645 class TestBcacheStorageLayoutBase(MAASServerTestCase):
2646@@ -1197,11 +1269,19 @@
2647 partition_table = ssd.get_partitiontable()
2648 self.assertIsNotNone(partition_table)
2649 partition = partition_table.partitions.order_by('id').all()[0]
2650+<<<<<<< TREE
2651 self.assertEqual(partition, cache_device)
2652 self.assertEqual(
2653 round_size_to_nearest_block(
2654 cache_size, PARTITION_ALIGNMENT_SIZE, False),
2655 partition.size)
2656+=======
2657+ self.assertEquals(partition, cache_device)
2658+ self.assertEquals(
2659+ round_size_to_nearest_block(
2660+ cache_size, PARTITION_ALIGNMENT_SIZE, False),
2661+ partition.size)
2662+>>>>>>> MERGE-SOURCE
2663
2664 def test_raises_error_when_invalid_cache_device(self):
2665 node = make_Node_with_uefi_boot_method()
2666
2667=== modified file 'src/maasserver/urls_api.py'
2668=== modified file 'src/maasserver/utils/converters.py'
2669--- src/maasserver/utils/converters.py 2015-12-04 08:25:27 +0000
2670+++ src/maasserver/utils/converters.py 2016-01-10 08:29:39 +0000
2671@@ -102,8 +102,13 @@
2672 :param block_size: The block size to round to.
2673 :param round_up: If True, will round up to fill current block, else down.
2674 """
2675+<<<<<<< TREE
2676 number_of_blocks = size // block_size
2677 if round_up and size % block_size > 0:
2678+=======
2679+ number_of_blocks = size / block_size
2680+ if round_up and size % block_size > 0:
2681+>>>>>>> MERGE-SOURCE
2682 number_of_blocks += 1
2683 return block_size * number_of_blocks
2684
2685
2686=== modified file 'src/maasserver/utils/orm.py'
2687--- src/maasserver/utils/orm.py 2016-01-05 19:56:43 +0000
2688+++ src/maasserver/utils/orm.py 2016-01-10 08:29:39 +0000
2689@@ -841,6 +841,7 @@
2690 if specifier_types is None:
2691 raise NotImplementedError("Subclass must specify specifier_types.")
2692 current_q = Q()
2693+<<<<<<< TREE
2694 if isinstance(specifiers, dict):
2695 # If we got a dictionary, treat it as one of the entries in a
2696 # LabeledConstraintMap. That is, each key is a specifier, and
2697@@ -863,6 +864,30 @@
2698 query = self.get_filter_function(
2699 specifier_type, specifier_types, item, separator=separator)
2700 current_q = query(current_q, op, item)
2701+=======
2702+ if isinstance(specifiers, dict):
2703+ # If we got a dictionary, treat it as one of the entries in a
2704+ # LabeledConstraintMap. That is, each key is a specifier, and
2705+ # each value is a list of values (which must be OR'd together).
2706+ for key in specifiers.iterkeys():
2707+ assert isinstance(specifiers[key], list)
2708+ constraints = [
2709+ key + separator + value
2710+ for value in specifiers[key]
2711+ ]
2712+ # Leave off specifier_types here because this recursion
2713+ # will go back to the subclass to get the types filled in.
2714+ current_q &= self.get_specifiers_q(
2715+ constraints, separator=separator)
2716+ else:
2717+ for item in specifiers:
2718+ item, op = parse_item_operation(item)
2719+ item, specifier_type = parse_item_specifier_type(
2720+ item, spec_types=specifier_types, separator=separator)
2721+ query = self.get_filter_function(
2722+ specifier_type, specifier_types, item, separator=separator)
2723+ current_q = query(current_q, op, item)
2724+>>>>>>> MERGE-SOURCE
2725 if len(kwargs) > 0:
2726 current_q &= Q(**kwargs)
2727 return current_q
2728
2729=== modified file 'src/maasserver/utils/tests/test_converters.py'
2730--- src/maasserver/utils/tests/test_converters.py 2015-12-01 18:12:59 +0000
2731+++ src/maasserver/utils/tests/test_converters.py 2016-01-10 08:29:39 +0000
2732@@ -116,23 +116,46 @@
2733 def test__round_up_doesnt_add_extra_block(self):
2734 block_size = 4096
2735 size = block_size
2736- self.assertEqual(
2737- size,
2738- round_size_to_nearest_block(size, block_size, True),
2739- "Shouldn't add an extra block to the size.")
2740-
2741- def test__round_down_removes_block(self):
2742- block_size = 4096
2743- size = block_size + 1
2744- self.assertEqual(
2745- 1 * block_size,
2746- round_size_to_nearest_block(size, block_size, False),
2747- "Should remove block from the size.")
2748-
2749- def test__round_down_doesnt_remove_block(self):
2750- block_size = 4096
2751- size = block_size * 2
2752- self.assertEqual(
2753- size,
2754- round_size_to_nearest_block(size, block_size, False),
2755- "Shouldn't remove a block from the size.")
2756+<<<<<<< TREE
2757+ self.assertEqual(
2758+ size,
2759+ round_size_to_nearest_block(size, block_size, True),
2760+ "Shouldn't add an extra block to the size.")
2761+
2762+ def test__round_down_removes_block(self):
2763+ block_size = 4096
2764+ size = block_size + 1
2765+ self.assertEqual(
2766+ 1 * block_size,
2767+ round_size_to_nearest_block(size, block_size, False),
2768+ "Should remove block from the size.")
2769+
2770+ def test__round_down_doesnt_remove_block(self):
2771+ block_size = 4096
2772+ size = block_size * 2
2773+ self.assertEqual(
2774+ size,
2775+ round_size_to_nearest_block(size, block_size, False),
2776+ "Shouldn't remove a block from the size.")
2777+=======
2778+ self.assertEquals(
2779+ size,
2780+ round_size_to_nearest_block(size, block_size, True),
2781+ "Shouldn't add an extra block to the size.")
2782+
2783+ def test__round_down_removes_block(self):
2784+ block_size = 4096
2785+ size = block_size + 1
2786+ self.assertEquals(
2787+ 1 * block_size,
2788+ round_size_to_nearest_block(size, block_size, False),
2789+ "Should remove block from the size.")
2790+
2791+ def test__round_down_doesnt_remove_block(self):
2792+ block_size = 4096
2793+ size = block_size * 2
2794+ self.assertEquals(
2795+ size,
2796+ round_size_to_nearest_block(size, block_size, False),
2797+ "Shouldn't remove a block from the size.")
2798+>>>>>>> MERGE-SOURCE
2799
2800=== modified file 'src/maasserver/websockets/handlers/node.py'
2801=== modified file 'src/maasserver/websockets/handlers/tests/test_node.py'
2802--- src/maasserver/websockets/handlers/tests/test_node.py 2016-01-07 03:41:57 +0000
2803+++ src/maasserver/websockets/handlers/tests/test_node.py 2016-01-10 08:29:39 +0000
2804@@ -1446,23 +1446,41 @@
2805 interface=True,
2806 architecture=architecture,
2807 status=NODE_STATUS.ALLOCATED)
2808+<<<<<<< TREE
2809 block_device = factory.make_BlockDevice(node=node)
2810 partition_table = factory.make_PartitionTable(
2811 block_device=block_device, node=node)
2812 size = partition_table.block_device.size // 2
2813+=======
2814+ block_device = factory.make_BlockDevice(node=node)
2815+ partition_table = factory.make_PartitionTable(
2816+ block_device=block_device, node=node)
2817+ size = partition_table.block_device.size / 2
2818+>>>>>>> MERGE-SOURCE
2819 handler.create_partition({
2820 'system_id': node.system_id,
2821 'block_id': partition_table.block_device_id,
2822 'partition_size': size
2823 })
2824- partition = partition_table.partitions.first()
2825- self.assertEqual(
2826- 2, Partition.objects.count())
2827- self.assertEqual(
2828- human_readable_bytes(
2829- round_size_to_nearest_block(
2830- size, PARTITION_ALIGNMENT_SIZE, False)),
2831- human_readable_bytes(partition.size))
2832+<<<<<<< TREE
2833+ partition = partition_table.partitions.first()
2834+ self.assertEqual(
2835+ 2, Partition.objects.count())
2836+ self.assertEqual(
2837+ human_readable_bytes(
2838+ round_size_to_nearest_block(
2839+ size, PARTITION_ALIGNMENT_SIZE, False)),
2840+ human_readable_bytes(partition.size))
2841+=======
2842+ partition = partition_table.partitions.first()
2843+ self.assertEquals(
2844+ 2, Partition.objects.count())
2845+ self.assertEquals(
2846+ human_readable_bytes(
2847+ round_size_to_nearest_block(
2848+ size, PARTITION_ALIGNMENT_SIZE, False)),
2849+ human_readable_bytes(partition.size))
2850+>>>>>>> MERGE-SOURCE
2851
2852 def test_create_partition_with_filesystem(self):
2853 user = factory.make_admin()
2854@@ -1472,11 +1490,19 @@
2855 interface=True,
2856 architecture=architecture,
2857 status=NODE_STATUS.ALLOCATED)
2858+<<<<<<< TREE
2859 block_device = factory.make_BlockDevice(node=node)
2860 partition_table = factory.make_PartitionTable(
2861 block_device=block_device, node=node)
2862 partition = partition_table.partitions.first()
2863 size = partition_table.block_device.size // 2
2864+=======
2865+ block_device = factory.make_BlockDevice(node=node)
2866+ partition_table = factory.make_PartitionTable(
2867+ block_device=block_device, node=node)
2868+ partition = partition_table.partitions.first()
2869+ size = partition_table.block_device.size / 2
2870+>>>>>>> MERGE-SOURCE
2871 fstype = factory.pick_choice(FILESYSTEM_FORMAT_TYPE_CHOICES)
2872 mount_point = factory.make_absolute_path()
2873 handler.create_partition({
2874@@ -1486,18 +1512,35 @@
2875 'fstype': fstype,
2876 'mount_point': mount_point,
2877 })
2878- partition = partition_table.partitions.first()
2879- self.assertEqual(
2880- 2, Partition.objects.count())
2881- self.assertEqual(
2882- human_readable_bytes(
2883- round_size_to_nearest_block(
2884- size, PARTITION_ALIGNMENT_SIZE, False)),
2885- human_readable_bytes(partition.size))
2886- self.assertEqual(
2887+<<<<<<< TREE
2888+ partition = partition_table.partitions.first()
2889+ self.assertEqual(
2890+ 2, Partition.objects.count())
2891+ self.assertEqual(
2892+ human_readable_bytes(
2893+ round_size_to_nearest_block(
2894+ size, PARTITION_ALIGNMENT_SIZE, False)),
2895+ human_readable_bytes(partition.size))
2896+ self.assertEqual(
2897+=======
2898+ partition = partition_table.partitions.first()
2899+ self.assertEquals(
2900+ 2, Partition.objects.count())
2901+ self.assertEquals(
2902+ human_readable_bytes(
2903+ round_size_to_nearest_block(
2904+ size, PARTITION_ALIGNMENT_SIZE, False)),
2905+ human_readable_bytes(partition.size))
2906+ self.assertEquals(
2907+>>>>>>> MERGE-SOURCE
2908 fstype,
2909+<<<<<<< TREE
2910 partition.get_effective_filesystem().fstype)
2911 self.assertEqual(
2912+=======
2913+ partition.get_effective_filesystem().fstype)
2914+ self.assertEquals(
2915+>>>>>>> MERGE-SOURCE
2916 mount_point,
2917 partition.get_effective_filesystem().mount_point)
2918
2919
2920=== modified file 'src/metadataserver/models/commissioningscript.py'
2921--- src/metadataserver/models/commissioningscript.py 2016-01-05 19:56:43 +0000
2922+++ src/metadataserver/models/commissioningscript.py 2016-01-10 08:29:39 +0000
2923@@ -682,6 +682,10 @@
2924 'content': IPADDR_SCRIPT.encode('ascii'),
2925 'hook': update_node_network_information,
2926 },
2927+ '99-maas-03-network-interfaces.out': {
2928+ 'content': IPADDR_SCRIPT.encode('ascii'),
2929+ 'hook': update_node_network_information,
2930+ },
2931 }
2932
2933
2934
2935=== modified file 'src/provisioningserver/cluster_config_command.py'
2936=== modified file 'src/provisioningserver/config.py'
2937--- src/provisioningserver/config.py 2015-12-10 09:42:55 +0000
2938+++ src/provisioningserver/config.py 2016-01-10 08:29:39 +0000
2939@@ -138,6 +138,10 @@
2940 )
2941 from formencode.declarative import DeclarativeMeta
2942 from formencode.validators import (
2943+<<<<<<< TREE
2944+=======
2945+ Invalid,
2946+>>>>>>> MERGE-SOURCE
2947 Number,
2948 Set,
2949 )
2950@@ -343,7 +347,11 @@
2951 class ConfigurationDatabase:
2952 """Store configuration in an sqlite3 database."""
2953
2954+<<<<<<< TREE
2955 def __init__(self, database, *, mutable=False):
2956+=======
2957+ def __init__(self, database, mutable=False):
2958+>>>>>>> MERGE-SOURCE
2959 self.database = database
2960 self.mutable = mutable
2961 with self.cursor() as cursor:
2962@@ -383,6 +391,7 @@
2963 "%s: Cannot set `%s'." % (self, name))
2964
2965 def __delitem__(self, name):
2966+<<<<<<< TREE
2967 if self.mutable:
2968 with self.cursor() as cursor:
2969 cursor.execute(
2970@@ -393,7 +402,20 @@
2971 "%s: Cannot set `%s'." % (self, name))
2972
2973 def __str__(self):
2974+=======
2975+ if self.mutable:
2976+ with self.cursor() as cursor:
2977+ cursor.execute(
2978+ "DELETE FROM configuration"
2979+ " WHERE name = ?", (name,))
2980+ else:
2981+ raise ConfigurationImmutable(
2982+ "%s: Cannot set `%s'." % (self, name))
2983+
2984+ def __unicode__(self):
2985+>>>>>>> MERGE-SOURCE
2986 with self.cursor() as cursor:
2987+<<<<<<< TREE
2988 # https://www.sqlite.org/pragma.html#pragma_database_list
2989 databases = "; ".join(
2990 "%s=%s" % (name, ":memory:" if path == "" else path)
2991@@ -426,6 +448,38 @@
2992 @contextmanager
2993 @typed
2994 def open_for_update(cls, dbpath: str):
2995+=======
2996+ # https://www.sqlite.org/pragma.html#pragma_database_list
2997+ databases = "; ".join(
2998+ "%s=%s" % (name, ":memory:" if path == "" else path)
2999+ for (_, name, path) in cursor.execute("PRAGMA database_list"))
3000+ return "%s(%s)" % (self.__class__.__name__, databases)
3001+
3002+ @classmethod
3003+ @contextmanager
3004+ def open(cls, dbpath):
3005+>>>>>>> MERGE-SOURCE
3006+ """Open a configuration database.
3007+
3008+ **Note** that this returns a context manager which will open the
3009+ database READ-ONLY.
3010+ """
3011+ # Ensure `dbpath` exists...
3012+ touch(dbpath)
3013+ # before opening it with sqlite.
3014+ database = sqlite3.connect(dbpath)
3015+ try:
3016+ yield cls(database, mutable=False)
3017+ except:
3018+ raise
3019+ else:
3020+ database.rollback()
3021+ finally:
3022+ database.close()
3023+
3024+ @classmethod
3025+ @contextmanager
3026+ def open_for_update(cls, dbpath):
3027 """Open a configuration database.
3028
3029 **Note** that this returns a context manager which will close the
3030@@ -460,7 +514,11 @@
3031 got to use this.
3032 """
3033
3034+<<<<<<< TREE
3035 def __init__(self, path, *, mutable=False):
3036+=======
3037+ def __init__(self, path, mutable=False):
3038+>>>>>>> MERGE-SOURCE
3039 super(ConfigurationFile, self).__init__()
3040 self.config = {}
3041 self.dirty = False
3042@@ -521,6 +579,7 @@
3043 self.path, mode=mode)
3044 self.dirty = False
3045
3046+<<<<<<< TREE
3047 def __str__(self):
3048 return "%s(%r)" % (self.__class__.__qualname__, self.path)
3049
3050@@ -547,6 +606,32 @@
3051 @contextmanager
3052 @typed
3053 def open_for_update(cls, path: str):
3054+=======
3055+ def __unicode__(self):
3056+ return "%s(%r)" % (self.__class__.__name__, self.path)
3057+
3058+ @classmethod
3059+ @contextmanager
3060+ def open(cls, path):
3061+ """Open a configuration file read-only.
3062+
3063+ This avoids all the locking that happens in `open_for_update`. However,
3064+ it will create the configuration file if it does not yet exist.
3065+
3066+ **Note** that this returns a context manager which will DISCARD
3067+ changes to the configuration on exit.
3068+ """
3069+ # Ensure `path` exists...
3070+ touch(path)
3071+ # before loading it in.
3072+ configfile = cls(path, mutable=False)
3073+ configfile.load()
3074+ yield configfile
3075+
3076+ @classmethod
3077+ @contextmanager
3078+ def open_for_update(cls, path):
3079+>>>>>>> MERGE-SOURCE
3080 """Open a configuration file.
3081
3082 Locks are taken so that there can only be *one* reader or writer for a
3083
3084=== modified file 'src/provisioningserver/dhcp/omshell.py'
3085=== modified file 'src/provisioningserver/dhcp/tests/test_omshell.py'
3086=== modified file 'src/provisioningserver/drivers/hardware/hmc.py'
3087=== modified file 'src/provisioningserver/drivers/hardware/virsh.py'
3088=== modified file 'src/provisioningserver/drivers/osystem/tests/test_custom.py'
3089=== modified file 'src/provisioningserver/drivers/power/__init__.py'
3090=== modified file 'src/provisioningserver/drivers/power/amt.py'
3091--- src/provisioningserver/drivers/power/amt.py 2015-12-17 08:14:09 +0000
3092+++ src/provisioningserver/drivers/power/amt.py 2016-01-10 08:29:39 +0000
3093@@ -43,6 +43,7 @@
3094 missing_packages.append(package)
3095 return missing_packages
3096
3097+<<<<<<< TREE
3098 def _render_wsman_state_xml(self, power_change):
3099 """Render wsman state XML."""
3100 wsman_state_filename = join(dirname(__file__), "amt.wsman-state.xml")
3101@@ -366,3 +367,13 @@
3102 return self.amttool_query_state(ip_address, power_pass)
3103 elif amt_command == 'wsman':
3104 return self.wsman_query_state(ip_address, power_pass)
3105+=======
3106+ def power_on(self, system_id, context):
3107+ raise NotImplementedError
3108+
3109+ def power_off(self, system_id, context):
3110+ raise NotImplementedError
3111+
3112+ def power_query(self, system_id, context):
3113+ raise NotImplementedError
3114+>>>>>>> MERGE-SOURCE
3115
3116=== modified file 'src/provisioningserver/drivers/power/apc.py'
3117=== modified file 'src/provisioningserver/drivers/power/dli.py'
3118--- src/provisioningserver/drivers/power/dli.py 2015-12-04 22:06:07 +0000
3119+++ src/provisioningserver/drivers/power/dli.py 2016-01-10 08:29:39 +0000
3120@@ -87,6 +87,7 @@
3121
3122 def power_on(self, system_id, context):
3123 """Power on DLI outlet."""
3124+<<<<<<< TREE
3125 # Power off the outlet if it is currently on
3126 if self._query_outlet_state(**context) == 'on':
3127 self._set_outlet_state('OFF', **context)
3128@@ -96,6 +97,16 @@
3129 "Unable to power off outlet %s that is already on."
3130 % context['outlet_id'])
3131 self._set_outlet_state('ON', **context)
3132+=======
3133+ if self._query_outlet_state(**context) == 'on':
3134+ self._set_outlet_state('OFF', **context)
3135+ sleep(1)
3136+ if self._query_outlet_state(**context) != 'off':
3137+ raise PowerError(
3138+ "Unable to power off outlet %s that is already on."
3139+ % context['outlet_id'])
3140+ self._set_outlet_state('ON', **context)
3141+>>>>>>> MERGE-SOURCE
3142
3143 def power_off(self, system_id, context):
3144 """Power off DLI outlet."""
3145
3146=== modified file 'src/provisioningserver/drivers/power/ether_wake.py'
3147=== modified file 'src/provisioningserver/drivers/power/fence_cdu.py'
3148=== modified file 'src/provisioningserver/drivers/power/hmc.py'
3149=== modified file 'src/provisioningserver/drivers/power/ipmi.py'
3150--- src/provisioningserver/drivers/power/ipmi.py 2015-12-01 18:12:59 +0000
3151+++ src/provisioningserver/drivers/power/ipmi.py 2016-01-10 08:29:39 +0000
3152@@ -34,7 +34,15 @@
3153 """
3154
3155
3156-maaslog = get_maas_logger("drivers.power.ipmi")
3157+<<<<<<< TREE
3158+maaslog = get_maas_logger("drivers.power.ipmi")
3159+=======
3160+maaslog = get_maas_logger("drivers.power.ipmi")
3161+
3162+
3163+def is_set(setting):
3164+ return not (setting is None or setting == "" or setting.isspace())
3165+>>>>>>> MERGE-SOURCE
3166
3167
3168 class IPMIPowerDriver(PowerDriver):
3169@@ -49,10 +57,16 @@
3170 return []
3171
3172 @staticmethod
3173+<<<<<<< TREE
3174 def _issue_ipmi_chassis_config_command(
3175 command, power_change, power_address):
3176 env = shell.select_c_utf8_locale()
3177 with NamedTemporaryFile("w+", encoding="utf-8") as tmp_config:
3178+=======
3179+ def _issue_ipmi_chassis_config_command(
3180+ command, power_change, power_address, env):
3181+ with NamedTemporaryFile() as tmp_config:
3182+>>>>>>> MERGE-SOURCE
3183 # Write out the chassis configuration.
3184 tmp_config.write(IPMI_CONFIG)
3185 tmp_config.flush()
3186@@ -72,8 +86,12 @@
3187 power_address, stderr))
3188
3189 @staticmethod
3190+<<<<<<< TREE
3191 def _issue_ipmi_power_command(command, power_change, power_address):
3192 env = shell.select_c_utf8_locale()
3193+=======
3194+ def _issue_ipmi_power_command(command, power_change, power_address, env):
3195+>>>>>>> MERGE-SOURCE
3196 command = tuple(command) # For consistency when testing.
3197 try:
3198 output = call_and_check(command, env=env)
3199@@ -146,6 +164,7 @@
3200
3201 # Update or query the power state.
3202 return self._issue_ipmi_power_command(
3203+<<<<<<< TREE
3204 ipmipower_command, power_change, power_address)
3205
3206 def power_on(self, system_id, context):
3207@@ -156,3 +175,15 @@
3208
3209 def power_query(self, system_id, context):
3210 return self._issue_ipmi_command('query', **context)
3211+=======
3212+ ipmipower_command, power_change, power_address, env)
3213+
3214+ def power_on(self, system_id, context):
3215+ self._issue_ipmi_command('on', **context)
3216+
3217+ def power_off(self, system_id, context):
3218+ self._issue_ipmi_command('off', **context)
3219+
3220+ def power_query(self, system_id, context):
3221+ return self._issue_ipmi_command('query', **context)
3222+>>>>>>> MERGE-SOURCE
3223
3224=== modified file 'src/provisioningserver/drivers/power/moonshot.py'
3225=== modified file 'src/provisioningserver/drivers/power/mscm.py'
3226=== modified file 'src/provisioningserver/drivers/power/msftocs.py'
3227=== modified file 'src/provisioningserver/drivers/power/seamicro.py'
3228--- src/provisioningserver/drivers/power/seamicro.py 2015-12-01 18:12:59 +0000
3229+++ src/provisioningserver/drivers/power/seamicro.py 2016-01-10 08:29:39 +0000
3230@@ -82,10 +82,15 @@
3231 """Power query SeaMicro node."""
3232 # Query the state.
3233 # Only supported by REST v2.
3234+<<<<<<< TREE
3235 ip, username, password, _, power_control = (
3236 extract_seamicro_parameters(context))
3237+=======
3238+ ip, username, password, server_id, power_control = (
3239+ extract_seamicro_parameters(context))
3240+>>>>>>> MERGE-SOURCE
3241 if power_control == 'restapi2':
3242 return power_query_seamicro15k_v2(
3243- ip, username, password, system_id)
3244+ ip, username, password, server_id)
3245 else:
3246 return 'unknown'
3247
3248=== modified file 'src/provisioningserver/drivers/power/tests/test_amt.py'
3249--- src/provisioningserver/drivers/power/tests/test_amt.py 2015-12-17 08:14:09 +0000
3250+++ src/provisioningserver/drivers/power/tests/test_amt.py 2016-01-10 08:29:39 +0000
3251@@ -94,6 +94,7 @@
3252 missing = driver.detect_missing_packages()
3253 self.assertItemsEqual([], missing)
3254
3255+<<<<<<< TREE
3256 def test__render_wsman_state_xml_renders_xml(self):
3257 amt_power_driver = AMTPowerDriver()
3258 power_change = choice(['on', 'off', 'restart'])
3259@@ -778,3 +779,19 @@
3260 wsman_query_state_mock, MockCalledOnceWith(
3261 context['ip_address'], context['power_pass']))
3262 self.expectThat(state, Equals('on'))
3263+=======
3264+ def test_power_on(self):
3265+ driver = amt_module.AMTPowerDriver()
3266+ self.assertRaises(
3267+ NotImplementedError, driver.power_on, "fake_id", {})
3268+
3269+ def test_power_off(self):
3270+ driver = amt_module.AMTPowerDriver()
3271+ self.assertRaises(
3272+ NotImplementedError, driver.power_off, "fake_id", {})
3273+
3274+ def test_power_query(self):
3275+ driver = amt_module.AMTPowerDriver()
3276+ self.assertRaises(
3277+ NotImplementedError, driver.power_query, "fake_id", {})
3278+>>>>>>> MERGE-SOURCE
3279
3280=== modified file 'src/provisioningserver/drivers/power/tests/test_apc.py'
3281=== modified file 'src/provisioningserver/drivers/power/tests/test_base.py'
3282=== modified file 'src/provisioningserver/drivers/power/tests/test_dli.py'
3283=== modified file 'src/provisioningserver/drivers/power/tests/test_ether_wake.py'
3284=== modified file 'src/provisioningserver/drivers/power/tests/test_fence_cdu.py'
3285=== modified file 'src/provisioningserver/drivers/power/tests/test_hmc.py'
3286=== modified file 'src/provisioningserver/drivers/power/tests/test_ipmi.py'
3287--- src/provisioningserver/drivers/power/tests/test_ipmi.py 2015-12-01 18:12:59 +0000
3288+++ src/provisioningserver/drivers/power/tests/test_ipmi.py 2016-01-10 08:29:39 +0000
3289@@ -260,8 +260,13 @@
3290 ipmipower_command, env=env))
3291 self.expectThat(result, Equals('other'))
3292
3293+<<<<<<< TREE
3294 def test__issue_ipmi_command_issues_raises_power_auth_error(self):
3295 _, _, _, _, _, _, _, context = make_parameters()
3296+=======
3297+ def test__issue_ipmi_command_raises_power_fatal_error(self):
3298+ _, _, _, _, _, _, _, context = make_parameters()
3299+>>>>>>> MERGE-SOURCE
3300 ipmi_power_driver = IPMIPowerDriver()
3301 popen_mock = self.patch(ipmi_module, 'Popen')
3302 process = popen_mock.return_value
3303@@ -277,7 +282,11 @@
3304 ipmi_power_driver = IPMIP