Merge lp:~blake-rouse/maas/fix-1484696-2-1.8 into lp:~maas-committers/maas/trunk
- fix-1484696-2-1.8
- Merge into trunk
Proposed by
Blake Rouse
Status: | Superseded | ||||
---|---|---|---|---|---|
Proposed branch: | lp:~blake-rouse/maas/fix-1484696-2-1.8 | ||||
Merge into: | lp:~maas-committers/maas/trunk | ||||
Diff against target: |
4031 lines (+3119/-47) (has conflicts) 40 files modified
Makefile (+7/-0) docs/changelog.rst (+72/-0) docs/conf.py (+1/-1) docs/index.rst (+1/-0) docs/os-support.rst (+124/-0) src/maasserver/api/tests/test_maas.py (+78/-0) src/maasserver/clusterrpc/boot_images.py (+59/-0) src/maasserver/clusterrpc/tests/test_boot_images.py (+62/-0) src/maasserver/dns/tests/test_config.py (+4/-3) src/maasserver/fields.py (+30/-0) src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py (+453/-0) src/maasserver/models/tests/test_node.py (+5/-0) src/maasserver/node_action.py (+13/-0) src/maasserver/plugin.py (+14/-0) src/maasserver/rpc/nodes.py (+31/-0) src/maasserver/rpc/tests/test_nodes.py (+12/-1) src/maasserver/rpc/tests/test_regionservice.py (+15/-0) src/maasserver/static/css/maas-styles.css (+4/-0) src/maasserver/static/img/icons/tag-close.svg (+18/-0) src/maasserver/static/partials/node-details.html (+67/-0) src/maasserver/static/partials/node-events.html (+4/-0) src/maasserver/static/partials/nodes-list.html (+10/-0) src/maasserver/static/scss/maas/components/_placeholders.scss (+4/-0) src/maasserver/testing/factory.py (+17/-0) src/maasserver/tests/test_fields.py (+38/-0) src/maasserver/tests/test_node_action.py (+88/-32) src/maasserver/tests/test_plugin.py (+22/-0) src/maasserver/utils/osystems.py (+27/-0) src/maasserver/utils/tests/test_osystems.py (+47/-0) src/maasserver/views/tests/test_rpc.py (+13/-2) src/maasserver/websockets/handlers/node.py (+32/-0) src/provisioningserver/drivers/power/__init__.py (+4/-0) src/provisioningserver/plugin.py (+7/-0) src/provisioningserver/power/__init__.py (+170/-0) src/provisioningserver/power/tests/test_power.py (+1001/-0) src/provisioningserver/tests/test_plugin.py (+20/-8) src/provisioningserver/utils/fs.py (+4/-0) src/provisioningserver/utils/tests/test_fs.py (+14/-0) src/provisioningserver/utils/tests/test_isc.py (+279/-0) utilities/maas-region-support-dump (+248/-0) Text conflict in Makefile Text conflict in docs/changelog.rst Text conflict in docs/os-support.rst Text conflict in src/maasserver/api/tests/test_maas.py Text conflict in src/maasserver/clusterrpc/boot_images.py Text conflict in src/maasserver/clusterrpc/tests/test_boot_images.py Text conflict in src/maasserver/fields.py Conflict adding file src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py. Moved existing file to src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py.moved. Text conflict in src/maasserver/models/tests/test_node.py Text conflict in src/maasserver/node_action.py Text conflict in src/maasserver/rpc/nodes.py Text conflict in src/maasserver/rpc/tests/test_nodes.py Text conflict in src/maasserver/rpc/tests/test_regionservice.py Text conflict in src/maasserver/static/css/maas-styles.css Text conflict in src/maasserver/static/partials/node-details.html Text conflict in src/maasserver/static/partials/node-events.html Text conflict in src/maasserver/static/partials/nodes-list.html Text conflict in src/maasserver/static/scss/maas/components/_placeholders.scss Text conflict in src/maasserver/testing/factory.py Text conflict in src/maasserver/tests/test_fields.py Text conflict in src/maasserver/tests/test_node_action.py Text conflict in src/maasserver/tests/test_plugin.py Text conflict in src/maasserver/utils/osystems.py Text conflict in src/maasserver/utils/tests/test_osystems.py Text conflict in src/maasserver/views/tests/test_rpc.py Text conflict in src/maasserver/websockets/handlers/node.py Text conflict in src/provisioningserver/drivers/power/__init__.py Text conflict in src/provisioningserver/plugin.py Text conflict in src/provisioningserver/power/__init__.py Text conflict in src/provisioningserver/power/tests/test_power.py Text conflict in src/provisioningserver/tests/test_plugin.py Text conflict in src/provisioningserver/utils/fs.py Text conflict in src/provisioningserver/utils/tests/test_fs.py Text conflict in src/provisioningserver/utils/tests/test_isc.py Conflict adding file utilities/maas-region-support-dump. Moved existing file to utilities/maas-region-support-dump.moved. |
||||
To merge this branch: | bzr merge lp:~blake-rouse/maas/fix-1484696-2-1.8 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
MAAS Maintainers | Pending | ||
Review via email: mp+272406@code.launchpad.net |
This proposal has been superseded by a proposal from 2015-09-25.
Commit message
Only include the ':' in _buildUrl if a port is defined.
This fixes an issue where if the ':' is included apache will not proxy the connection.
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'HACKING.txt' | |||
2 | === modified file 'Makefile' | |||
3 | --- Makefile 2015-09-17 21:15:12 +0000 | |||
4 | +++ Makefile 2015-09-25 14:32:35 +0000 | |||
5 | @@ -500,6 +500,7 @@ | |||
6 | 500 | 500 | ||
7 | 501 | # This ought to be as simple as using bzr builddeb --export-upstream but it | 501 | # This ought to be as simple as using bzr builddeb --export-upstream but it |
8 | 502 | # has a bug and always considers apt-source tarballs before the specified | 502 | # has a bug and always considers apt-source tarballs before the specified |
9 | 503 | <<<<<<< TREE | ||
10 | 503 | # branch. Instead, export to a local tarball which is always found. Make sure | 504 | # branch. Instead, export to a local tarball which is always found. Make sure |
11 | 504 | # the packages listed in `required-packages/build` are installed before using | 505 | # the packages listed in `required-packages/build` are installed before using |
12 | 505 | # this. | 506 | # this. |
13 | @@ -507,6 +508,12 @@ | |||
14 | 507 | # Old names. | 508 | # Old names. |
15 | 508 | PACKAGING := $(abspath ../packaging.trunk) | 509 | PACKAGING := $(abspath ../packaging.trunk) |
16 | 509 | PACKAGING_BRANCH := lp:~maas-maintainers/maas/packaging | 510 | PACKAGING_BRANCH := lp:~maas-maintainers/maas/packaging |
17 | 511 | ======= | ||
18 | 512 | # branch. So instead, export to a local tarball which is always found. | ||
19 | 513 | # Make sure debhelper and dh-apport packages are installed before using this. | ||
20 | 514 | PACKAGING := $(CURDIR)/../packaging-1.8 | ||
21 | 515 | PACKAGING_BRANCH := lp:~maas-maintainers/maas/packaging-1.8 | ||
22 | 516 | >>>>>>> MERGE-SOURCE | ||
23 | 510 | 517 | ||
24 | 511 | packaging-tree = $(PACKAGING) | 518 | packaging-tree = $(PACKAGING) |
25 | 512 | packaging-branch = $(PACKAGING_BRANCH) | 519 | packaging-branch = $(PACKAGING_BRANCH) |
26 | 513 | 520 | ||
27 | === modified file 'buildout.cfg' | |||
28 | === modified file 'docs/changelog.rst' | |||
29 | --- docs/changelog.rst 2015-09-24 17:19:06 +0000 | |||
30 | +++ docs/changelog.rst 2015-09-25 14:32:35 +0000 | |||
31 | @@ -2,6 +2,7 @@ | |||
32 | 2 | Changelog | 2 | Changelog |
33 | 3 | ========= | 3 | ========= |
34 | 4 | 4 | ||
35 | 5 | <<<<<<< TREE | ||
36 | 5 | 6 | ||
37 | 6 | 1.9.0 (alpha2) | 7 | 1.9.0 (alpha2) |
38 | 7 | ============== | 8 | ============== |
39 | @@ -220,6 +221,77 @@ | |||
40 | 220 | #1459710 [UI] "Set zone" label oddly placed on node listing page | 221 | #1459710 [UI] "Set zone" label oddly placed on node listing page |
41 | 221 | 222 | ||
42 | 222 | 223 | ||
43 | 224 | ======= | ||
44 | 225 | |||
45 | 226 | 1.8.2 | ||
46 | 227 | ===== | ||
47 | 228 | |||
48 | 229 | See https://launchpad.net/maas/+milestone/1.8.2 for full details. | ||
49 | 230 | |||
50 | 231 | Bug Fix Update | ||
51 | 232 | -------------- | ||
52 | 233 | |||
53 | 234 | #1484696 Regenerate the connection URL on websocket client reconnect, to fix | ||
54 | 235 | CSRF after upgrade to 1.8.1. | ||
55 | 236 | |||
56 | 237 | #1445942 Validate the osystem and distro_series when using the deploy action, | ||
57 | 238 | which fixes win2012r2 deployment issues. | ||
58 | 239 | |||
59 | 240 | #1481940 Fix failure in MAAS startup messages by not generating dhcpd config | ||
60 | 241 | files when they are not in use. | ||
61 | 242 | |||
62 | 243 | #1459865 Fix enlistment to always use the correct kernel parameters. | ||
63 | 244 | |||
64 | 245 | |||
65 | 246 | 1.8.1 | ||
66 | 247 | ===== | ||
67 | 248 | |||
68 | 249 | See https://launchpad.net/maas/+milestone/1.8.1 for full details. | ||
69 | 250 | |||
70 | 251 | Bug Fix Update | ||
71 | 252 | -------------- | ||
72 | 253 | |||
73 | 254 | #1481118 Add --username to maas-region-admin apikey command docs. | ||
74 | 255 | |||
75 | 256 | #1472707 Add ListBootImagesV2 RPC command. Fallback to using ListBootImages RPC | ||
76 | 257 | when the ListBootImagesV2 is not handled on the cluster. | ||
77 | 258 | |||
78 | 259 | #1470591 Fix setting the default_distro_series over the API. | ||
79 | 260 | |||
80 | 261 | #1413388 Fix upgrade issue where it would remove custom DNS config, potentially breaking DNS | ||
81 | 262 | |||
82 | 263 | #1317705 Commissioning x86_64 node never completes, sitting at grub prompt, pserv py tbs | ||
83 | 264 | |||
84 | 265 | #1389007 Power monitor service hits amp.TooLong errors with > ~600 nodes to a cluster | ||
85 | 266 | |||
86 | 267 | #1436279 Websocket server accessed over port 5240 | ||
87 | 268 | |||
88 | 269 | #1469305 If hostname not set, sudo warning make maas throw 500 | ||
89 | 270 | |||
90 | 271 | #1470585 Can't set a list of forwarders (BIND config) | ||
91 | 272 | |||
92 | 273 | #1469846 UCS chassis enlist Failed to probe and enlist UCS nodes: list index out of range | ||
93 | 274 | |||
94 | 275 | #1470276 Add cisco snic to 3rd party driver | ||
95 | 276 | |||
96 | 277 | #1402042 console= parameters need to be added before -- on kernel cmdline | ||
97 | 278 | |||
98 | 279 | #1465722 [UI] Machine details styling | ||
99 | 280 | |||
100 | 281 | #1465737 [UI] Actions design styles | ||
101 | 282 | |||
102 | 283 | #1465740 [UI] Replace close "X" with correct versions | ||
103 | 284 | |||
104 | 285 | #1465742 [UI] Table design styles | ||
105 | 286 | |||
106 | 287 | #1470389 [UI] Make table heading hover consistant with nodes/devices tabs | ||
107 | 288 | |||
108 | 289 | #1470395 [UI] adding between node name and save button inconsistent | ||
109 | 290 | |||
110 | 291 | #1459710 [UI] "Set zone" label oddly placed on node listing page | ||
111 | 292 | |||
112 | 293 | |||
113 | 294 | >>>>>>> MERGE-SOURCE | ||
114 | 223 | 1.8.0 | 295 | 1.8.0 |
115 | 224 | ===== | 296 | ===== |
116 | 225 | 297 | ||
117 | 226 | 298 | ||
118 | === modified file 'docs/conf.py' | |||
119 | --- docs/conf.py 2015-05-28 14:48:15 +0000 | |||
120 | +++ docs/conf.py 2015-09-25 14:32:35 +0000 | |||
121 | @@ -100,7 +100,7 @@ | |||
122 | 100 | # built documents. | 100 | # built documents. |
123 | 101 | # | 101 | # |
124 | 102 | # The short X.Y version. | 102 | # The short X.Y version. |
126 | 103 | version = doc_versions.items()[0][0] | 103 | version = '1.8' |
127 | 104 | # The full version, including alpha/beta/rc tags. | 104 | # The full version, including alpha/beta/rc tags. |
128 | 105 | release = version | 105 | release = version |
129 | 106 | 106 | ||
130 | 107 | 107 | ||
131 | === modified file 'docs/index.rst' | |||
132 | --- docs/index.rst 2015-09-15 18:14:16 +0000 | |||
133 | +++ docs/index.rst 2015-09-25 14:32:35 +0000 | |||
134 | @@ -67,6 +67,7 @@ | |||
135 | 67 | storage | 67 | storage |
136 | 68 | networking | 68 | networking |
137 | 69 | devices | 69 | devices |
138 | 70 | os-support | ||
139 | 70 | 71 | ||
140 | 71 | 72 | ||
141 | 72 | ****************** | 73 | ****************** |
142 | 73 | 74 | ||
143 | === modified file 'docs/os-support.rst' | |||
144 | --- docs/os-support.rst 2015-09-08 18:41:57 +0000 | |||
145 | +++ docs/os-support.rst 2015-09-25 14:32:35 +0000 | |||
146 | @@ -1,3 +1,4 @@ | |||
147 | 1 | <<<<<<< TREE | ||
148 | 1 | .. -*- mode: rst -*- | 2 | .. -*- mode: rst -*- |
149 | 2 | 3 | ||
150 | 3 | .. _os-support: | 4 | .. _os-support: |
151 | @@ -119,3 +120,126 @@ | |||
152 | 119 | 120 | ||
153 | 120 | $ maas admin boot-resources create name=centos/centos7 | 121 | $ maas admin boot-resources create name=centos/centos7 |
154 | 121 | architecture=amd64/generic content@=./build-output/centos7-amd64-root-tgz | 122 | architecture=amd64/generic content@=./build-output/centos7-amd64-root-tgz |
155 | 123 | ======= | ||
156 | 124 | .. -*- mode: rst -*- | ||
157 | 125 | |||
158 | 126 | .. _os-support: | ||
159 | 127 | |||
160 | 128 | ========================= | ||
161 | 129 | Operating Systems Support | ||
162 | 130 | ========================= | ||
163 | 131 | |||
164 | 132 | .. note:: | ||
165 | 133 | |||
166 | 134 | This feature is available in MAAS versions 1.7 and above. | ||
167 | 135 | |||
168 | 136 | Besides Ubuntu, MAAS allows users to deploy different operating | ||
169 | 137 | systems, such as CentOS. Ubuntu Advantage customers can | ||
170 | 138 | additionally deploy Redhat Enterprise Linux (RHEL), OpenSUSE, SLES, | ||
171 | 139 | Window Server and Windows HyperV. | ||
172 | 140 | |||
173 | 141 | |||
174 | 142 | Generated Images vs. Custom Images | ||
175 | 143 | ---------------------------------- | ||
176 | 144 | |||
177 | 145 | MAAS supports two different classes of OS images, `Generated images` | ||
178 | 146 | and `Custom images`. | ||
179 | 147 | |||
180 | 148 | `Generated images` are images of the OS' that MAAS team fully | ||
181 | 149 | supports. Currently supported OS' are CentOS and Windows. | ||
182 | 150 | |||
183 | 151 | `Custom images` are images that MAAS can deploy, but may have been | ||
184 | 152 | customized and differ from those that the MAAS team supports. Custom | ||
185 | 153 | images can include any Ubuntu, CentOS or Windows image. Additionally, | ||
186 | 154 | Redhat Enterprise Linux (RHEL), OpenSUSE and SLES images also fall | ||
187 | 155 | under this category. | ||
188 | 156 | |||
189 | 157 | |||
190 | 158 | Installing MAAS Images | ||
191 | 159 | ---------------------- | ||
192 | 160 | |||
193 | 161 | Installing Generated Images | ||
194 | 162 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
195 | 163 | |||
196 | 164 | Installing MAAS Generated Images (CentOS or Windows) can be done with | ||
197 | 165 | the command:: | ||
198 | 166 | |||
199 | 167 | $ maas admin boot-resources create name=<os/series> | ||
200 | 168 | architecture=<architecture> [filetype=ddtgz] | ||
201 | 169 | content@=<image-name> | ||
202 | 170 | |||
203 | 171 | The list of supported Operating Systems under `Generated Images` is: | ||
204 | 172 | |||
205 | 173 | * CentOS 6.5 (centos/centos65) | ||
206 | 174 | * CentOS 7 (centos/centos7) | ||
207 | 175 | * Windows Server 2012 (windows/win2012) | ||
208 | 176 | * Windows Server 2012 R2 (windows/win2012r2) | ||
209 | 177 | * Windows Hyper-V (windows/win2012hv) | ||
210 | 178 | * Windows Hyper-V R2 (windows/win2012hvr2) | ||
211 | 179 | |||
212 | 180 | Examples:: | ||
213 | 181 | |||
214 | 182 | $ maas admin boot-resources create name=centos/centos7 | ||
215 | 183 | architecture=amd64/generic content@=centos7-amd64-root-tgz | ||
216 | 184 | |||
217 | 185 | $ maas admin boot-resources create name=windows/win2012 | ||
218 | 186 | architecture=amd64/generic filetype=ddtgz | ||
219 | 187 | content@=win2012-amd64-ddtgz | ||
220 | 188 | |||
221 | 189 | Installing Custom Images | ||
222 | 190 | ^^^^^^^^^^^^^^^^^^^^^^^^ | ||
223 | 191 | |||
224 | 192 | Installing custom images require the user to specify a unique | ||
225 | 193 | identifier for the OS and Release, as well as the title of the | ||
226 | 194 | Image:: | ||
227 | 195 | |||
228 | 196 | $ maas admin boot-resources create name=custom/<os-release-id> | ||
229 | 197 | title=<title> architecture=amd64/generic content@=<image-name> | ||
230 | 198 | |||
231 | 199 | Examples:: | ||
232 | 200 | |||
233 | 201 | $ maas admin boot-resources create name=custom/rhel7 | ||
234 | 202 | title="RedHat Enterprise Linux 7" architecture=amd64/generic | ||
235 | 203 | content@=rhel7-amd64-root-tgz | ||
236 | 204 | |||
237 | 205 | The list of tested Operating Systems under `Custom Images` is: | ||
238 | 206 | |||
239 | 207 | * OpenSUSE | ||
240 | 208 | * SLES 11 and SLES 12 | ||
241 | 209 | * Redhat Enterprise Linux 7 (RHEL7) | ||
242 | 210 | |||
243 | 211 | |||
244 | 212 | MAAS Image Builder | ||
245 | 213 | ------------------ | ||
246 | 214 | |||
247 | 215 | The MAAS Image Builder is a script that allows users to generate their | ||
248 | 216 | own images. However, ``maas-image-builder`` only supports the generation | ||
249 | 217 | of CentOS and RHEL images. To install ``maas-image-builder``, please | ||
250 | 218 | follow the instructions:: | ||
251 | 219 | |||
252 | 220 | $ sudo apt-get add-apt-repository ppa:maas-maintainers/stable | ||
253 | 221 | $ sudo apt-get install maas-image-builder | ||
254 | 222 | |||
255 | 223 | |||
256 | 224 | Creating and Installing CentOS MAAS Images | ||
257 | 225 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
258 | 226 | |||
259 | 227 | .. note:: | ||
260 | 228 | |||
261 | 229 | Supported CentOS versions are CentOS 6.5 (centos65) and CentOS 7 (centos7). | ||
262 | 230 | |||
263 | 231 | |||
264 | 232 | To create a MAAS CentOS image, no ISO is needed as all of the required | ||
265 | 233 | software to create the image is downloaded (from CentOS repositories) as part | ||
266 | 234 | of the image generation process. To create the MAAS CentOS image, | ||
267 | 235 | ``maas-image-builder`` can be used as:: | ||
268 | 236 | |||
269 | 237 | $ maas-image-builder -a amd64 -o centos7-amd64-root-tgz centos --edition 7 | ||
270 | 238 | |||
271 | 239 | The created image, ``centos7-amd64-root-tgz``, needs to be uploaded into the | ||
272 | 240 | MAAS Region Controller. This image will be listed under the `Generated` Image | ||
273 | 241 | Section in the `MAAS Image` page. This image can be uploaded with:: | ||
274 | 242 | |||
275 | 243 | $ maas admin boot-resources create name=centos/centos7 | ||
276 | 244 | architecture=amd64/generic content@=./build-output/centos7-amd64-root-tgz | ||
277 | 245 | >>>>>>> MERGE-SOURCE | ||
278 | 122 | 246 | ||
279 | === modified file 'required-packages/base' | |||
280 | === modified file 'src/maasserver/api/nodegroups.py' | |||
281 | === modified file 'src/maasserver/api/nodes.py' | |||
282 | === modified file 'src/maasserver/api/tests/test_events.py' | |||
283 | === modified file 'src/maasserver/api/tests/test_maas.py' | |||
284 | --- src/maasserver/api/tests/test_maas.py 2015-09-24 19:54:30 +0000 | |||
285 | +++ src/maasserver/api/tests/test_maas.py 2015-09-25 14:32:35 +0000 | |||
286 | @@ -1,3 +1,4 @@ | |||
287 | 1 | <<<<<<< TREE | ||
288 | 1 | # Copyright 2015 Canonical Ltd. This software is licensed under the | 2 | # Copyright 2015 Canonical Ltd. This software is licensed under the |
289 | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). | 3 | # GNU Affero General Public License version 3 (see the file LICENSE). |
290 | 3 | 4 | ||
291 | @@ -73,3 +74,80 @@ | |||
292 | 73 | }) | 74 | }) |
293 | 74 | self.assertEquals( | 75 | self.assertEquals( |
294 | 75 | httplib.BAD_REQUEST, response.status_code, response.content) | 76 | httplib.BAD_REQUEST, response.status_code, response.content) |
295 | 77 | ======= | ||
296 | 78 | # Copyright 2013-2015 Canonical Ltd. This software is licensed under the | ||
297 | 79 | # GNU Affero General Public License version 3 (see the file LICENSE). | ||
298 | 80 | |||
299 | 81 | """Tests for maas endpoint in the API.""" | ||
300 | 82 | |||
301 | 83 | from __future__ import ( | ||
302 | 84 | absolute_import, | ||
303 | 85 | print_function, | ||
304 | 86 | unicode_literals, | ||
305 | 87 | ) | ||
306 | 88 | |||
307 | 89 | str = None | ||
308 | 90 | |||
309 | 91 | __metaclass__ = type | ||
310 | 92 | __all__ = [] | ||
311 | 93 | |||
312 | 94 | import httplib | ||
313 | 95 | |||
314 | 96 | from django.core.urlresolvers import reverse | ||
315 | 97 | from maasserver.models.config import Config | ||
316 | 98 | from maasserver.testing.api import APITestCase | ||
317 | 99 | from maasserver.testing.factory import factory | ||
318 | 100 | from maasserver.testing.osystems import ( | ||
319 | 101 | make_osystem_with_releases, | ||
320 | 102 | make_usable_osystem, | ||
321 | 103 | patch_usable_osystems, | ||
322 | 104 | ) | ||
323 | 105 | |||
324 | 106 | |||
325 | 107 | class MAASHandlerAPITest(APITestCase): | ||
326 | 108 | |||
327 | 109 | def test_get_config_default_distro_series(self): | ||
328 | 110 | self.become_admin() | ||
329 | 111 | default_distro_series = factory.make_name("distro_series") | ||
330 | 112 | Config.objects.set_config( | ||
331 | 113 | "default_distro_series", default_distro_series) | ||
332 | 114 | response = self.client.get( | ||
333 | 115 | reverse('maas_handler'), { | ||
334 | 116 | "op": "get_config", | ||
335 | 117 | "name": "default_distro_series", | ||
336 | 118 | }) | ||
337 | 119 | self.assertEquals(httplib.OK, response.status_code, response.content) | ||
338 | 120 | self.assertEquals('"%s"' % default_distro_series, response.content) | ||
339 | 121 | |||
340 | 122 | def test_set_config_default_distro_series(self): | ||
341 | 123 | self.become_admin() | ||
342 | 124 | osystem = make_usable_osystem(self) | ||
343 | 125 | Config.objects.set_config("default_osystem", osystem['name']) | ||
344 | 126 | selected_release = osystem['releases'][0]['name'] | ||
345 | 127 | response = self.client.post( | ||
346 | 128 | reverse('maas_handler'), { | ||
347 | 129 | "op": "set_config", | ||
348 | 130 | "name": "default_distro_series", | ||
349 | 131 | "value": selected_release, | ||
350 | 132 | }) | ||
351 | 133 | self.assertEquals(httplib.OK, response.status_code, response.content) | ||
352 | 134 | self.assertEquals( | ||
353 | 135 | selected_release, | ||
354 | 136 | Config.objects.get_config("default_distro_series")) | ||
355 | 137 | |||
356 | 138 | def test_set_config_only_default_osystem_are_valid_for_distro_series(self): | ||
357 | 139 | self.become_admin() | ||
358 | 140 | default_osystem = make_osystem_with_releases(self) | ||
359 | 141 | other_osystem = make_osystem_with_releases(self) | ||
360 | 142 | patch_usable_osystems(self, [default_osystem, other_osystem]) | ||
361 | 143 | Config.objects.set_config("default_osystem", default_osystem['name']) | ||
362 | 144 | invalid_release = other_osystem['releases'][0]['name'] | ||
363 | 145 | response = self.client.post( | ||
364 | 146 | reverse('maas_handler'), { | ||
365 | 147 | "op": "set_config", | ||
366 | 148 | "name": "default_distro_series", | ||
367 | 149 | "value": invalid_release, | ||
368 | 150 | }) | ||
369 | 151 | self.assertEquals( | ||
370 | 152 | httplib.BAD_REQUEST, response.status_code, response.content) | ||
371 | 153 | >>>>>>> MERGE-SOURCE | ||
372 | 76 | 154 | ||
373 | === modified file 'src/maasserver/api/tests/test_nodegroup.py' | |||
374 | === modified file 'src/maasserver/clusterrpc/boot_images.py' | |||
375 | --- src/maasserver/clusterrpc/boot_images.py 2015-09-24 19:48:38 +0000 | |||
376 | +++ src/maasserver/clusterrpc/boot_images.py 2015-09-25 14:32:35 +0000 | |||
377 | @@ -24,6 +24,7 @@ | |||
378 | 24 | 24 | ||
379 | 25 | from collections import Sequence | 25 | from collections import Sequence |
380 | 26 | from functools import partial | 26 | from functools import partial |
381 | 27 | <<<<<<< TREE | ||
382 | 27 | from itertools import ( | 28 | from itertools import ( |
383 | 28 | imap, | 29 | imap, |
384 | 29 | izip, | 30 | izip, |
385 | @@ -32,6 +33,9 @@ | |||
386 | 32 | ParseResult, | 33 | ParseResult, |
387 | 33 | urlparse, | 34 | urlparse, |
388 | 34 | ) | 35 | ) |
389 | 36 | ======= | ||
390 | 37 | from itertools import imap | ||
391 | 38 | >>>>>>> MERGE-SOURCE | ||
392 | 35 | 39 | ||
393 | 36 | from maasserver.rpc import ( | 40 | from maasserver.rpc import ( |
394 | 37 | getAllClients, | 41 | getAllClients, |
395 | @@ -44,6 +48,7 @@ | |||
396 | 44 | ImportBootImages, | 48 | ImportBootImages, |
397 | 45 | IsImportBootImagesRunning, | 49 | IsImportBootImagesRunning, |
398 | 46 | ListBootImages, | 50 | ListBootImages, |
399 | 51 | <<<<<<< TREE | ||
400 | 47 | ListBootImagesV2, | 52 | ListBootImagesV2, |
401 | 48 | ) | 53 | ) |
402 | 49 | from provisioningserver.rpc.exceptions import NoConnectionsAvailable | 54 | from provisioningserver.rpc.exceptions import NoConnectionsAvailable |
403 | @@ -59,6 +64,12 @@ | |||
404 | 59 | ) | 64 | ) |
405 | 60 | from twisted.protocols.amp import UnhandledCommand | 65 | from twisted.protocols.amp import UnhandledCommand |
406 | 61 | from twisted.python import log | 66 | from twisted.python import log |
407 | 67 | ======= | ||
408 | 68 | ListBootImagesV2, | ||
409 | 69 | ) | ||
410 | 70 | from provisioningserver.utils.twisted import synchronous | ||
411 | 71 | from twisted.protocols.amp import UnhandledCommand | ||
412 | 72 | >>>>>>> MERGE-SOURCE | ||
413 | 62 | from twisted.python.failure import Failure | 73 | from twisted.python.failure import Failure |
414 | 63 | 74 | ||
415 | 64 | 75 | ||
416 | @@ -116,6 +127,7 @@ | |||
417 | 116 | 30 seconds. | 127 | 30 seconds. |
418 | 117 | """ | 128 | """ |
419 | 118 | client = getClientFor(nodegroup.uuid, timeout=1) | 129 | client = getClientFor(nodegroup.uuid, timeout=1) |
420 | 130 | <<<<<<< TREE | ||
421 | 119 | try: | 131 | try: |
422 | 120 | call = client(ListBootImagesV2) | 132 | call = client(ListBootImagesV2) |
423 | 121 | return call.wait(30).get("images") | 133 | return call.wait(30).get("images") |
424 | @@ -173,6 +185,53 @@ | |||
425 | 173 | images = frozenset() | 185 | images = frozenset() |
426 | 174 | # Return using the same format as get_boot_images. | 186 | # Return using the same format as get_boot_images. |
427 | 175 | return list(dict(image) for image in images) | 187 | return list(dict(image) for image in images) |
428 | 188 | ======= | ||
429 | 189 | try: | ||
430 | 190 | call = client(ListBootImagesV2) | ||
431 | 191 | return call.wait(30).get("images") | ||
432 | 192 | except UnhandledCommand: | ||
433 | 193 | call = client(ListBootImages) | ||
434 | 194 | return call.wait(30).get("images") | ||
435 | 195 | |||
436 | 196 | |||
437 | 197 | @synchronous | ||
438 | 198 | def _get_available_boot_images(): | ||
439 | 199 | """Obtain boot images available on connected clusters.""" | ||
440 | 200 | listimages_v1 = lambda client: partial(client, ListBootImages) | ||
441 | 201 | listimages_v2 = lambda client: partial(client, ListBootImagesV2) | ||
442 | 202 | clients_v2 = getAllClients() | ||
443 | 203 | responses_v2 = async.gather(imap(listimages_v2, clients_v2)) | ||
444 | 204 | clients_v1 = [] | ||
445 | 205 | for i, response in enumerate(responses_v2): | ||
446 | 206 | if (isinstance(response, Failure) and | ||
447 | 207 | response.check(UnhandledCommand) is not None): | ||
448 | 208 | clients_v1.append(clients_v2[i]) | ||
449 | 209 | elif not isinstance(response, Failure): | ||
450 | 210 | # Convert each image to a frozenset of its items. | ||
451 | 211 | yield frozenset( | ||
452 | 212 | frozenset(image.viewitems()) | ||
453 | 213 | for image in response["images"] | ||
454 | 214 | ) | ||
455 | 215 | responses_v1 = async.gather(imap(listimages_v1, clients_v1)) | ||
456 | 216 | for response in suppress_failures(responses_v1): | ||
457 | 217 | # Convert each image to a frozenset of its items. | ||
458 | 218 | yield frozenset( | ||
459 | 219 | frozenset(image.viewitems()) | ||
460 | 220 | for image in response["images"] | ||
461 | 221 | ) | ||
462 | 222 | |||
463 | 223 | |||
464 | 224 | @synchronous | ||
465 | 225 | def get_available_boot_images(): | ||
466 | 226 | """Obtain boot images that are available on all clusters.""" | ||
467 | 227 | image_sets = list(_get_available_boot_images()) | ||
468 | 228 | if len(image_sets) > 0: | ||
469 | 229 | images = frozenset.intersection(*image_sets) | ||
470 | 230 | else: | ||
471 | 231 | images = frozenset() | ||
472 | 232 | # Return using the same format as get_boot_images. | ||
473 | 233 | return list(dict(image) for image in images) | ||
474 | 234 | >>>>>>> MERGE-SOURCE | ||
475 | 176 | 235 | ||
476 | 177 | 236 | ||
477 | 178 | @synchronous | 237 | @synchronous |
478 | 179 | 238 | ||
479 | === modified file 'src/maasserver/clusterrpc/tests/test_boot_images.py' | |||
480 | --- src/maasserver/clusterrpc/tests/test_boot_images.py 2015-09-24 19:48:38 +0000 | |||
481 | +++ src/maasserver/clusterrpc/tests/test_boot_images.py 2015-09-25 14:32:35 +0000 | |||
482 | @@ -17,8 +17,12 @@ | |||
483 | 17 | import os | 17 | import os |
484 | 18 | import random | 18 | import random |
485 | 19 | 19 | ||
486 | 20 | <<<<<<< TREE | ||
487 | 20 | from maasserver.bootresources import get_simplestream_endpoint | 21 | from maasserver.bootresources import get_simplestream_endpoint |
488 | 21 | from maasserver.clusterrpc import boot_images as boot_images_module | 22 | from maasserver.clusterrpc import boot_images as boot_images_module |
489 | 23 | ======= | ||
490 | 24 | from maasserver.clusterrpc import boot_images as boot_images_module | ||
491 | 25 | >>>>>>> MERGE-SOURCE | ||
492 | 22 | from maasserver.clusterrpc.boot_images import ( | 26 | from maasserver.clusterrpc.boot_images import ( |
493 | 23 | get_all_available_boot_images, | 27 | get_all_available_boot_images, |
494 | 24 | get_boot_images, | 28 | get_boot_images, |
495 | @@ -44,6 +48,7 @@ | |||
496 | 44 | ) | 48 | ) |
497 | 45 | from maasserver.testing.factory import factory | 49 | from maasserver.testing.factory import factory |
498 | 46 | from maasserver.testing.testcase import MAASServerTestCase | 50 | from maasserver.testing.testcase import MAASServerTestCase |
499 | 51 | <<<<<<< TREE | ||
500 | 47 | from maastesting.matchers import ( | 52 | from maastesting.matchers import ( |
501 | 48 | MockCalledOnceWith, | 53 | MockCalledOnceWith, |
502 | 49 | MockCallsMatch, | 54 | MockCallsMatch, |
503 | @@ -56,6 +61,16 @@ | |||
504 | 56 | call, | 61 | call, |
505 | 57 | MagicMock, | 62 | MagicMock, |
506 | 58 | ) | 63 | ) |
507 | 64 | ======= | ||
508 | 65 | from maastesting.matchers import ( | ||
509 | 66 | MockCalledOnceWith, | ||
510 | 67 | MockCallsMatch, | ||
511 | 68 | ) | ||
512 | 69 | from mock import ( | ||
513 | 70 | call, | ||
514 | 71 | MagicMock, | ||
515 | 72 | ) | ||
516 | 73 | >>>>>>> MERGE-SOURCE | ||
517 | 59 | from provisioningserver.boot.tests import test_tftppath | 74 | from provisioningserver.boot.tests import test_tftppath |
518 | 60 | from provisioningserver.boot.tftppath import ( | 75 | from provisioningserver.boot.tftppath import ( |
519 | 61 | compose_image_path, | 76 | compose_image_path, |
520 | @@ -65,16 +80,24 @@ | |||
521 | 65 | boot_images, | 80 | boot_images, |
522 | 66 | clusterservice, | 81 | clusterservice, |
523 | 67 | ) | 82 | ) |
524 | 83 | <<<<<<< TREE | ||
525 | 68 | from provisioningserver.rpc.cluster import ( | 84 | from provisioningserver.rpc.cluster import ( |
526 | 69 | ImportBootImages, | 85 | ImportBootImages, |
527 | 70 | ListBootImages, | 86 | ListBootImages, |
528 | 71 | ListBootImagesV2, | 87 | ListBootImagesV2, |
529 | 72 | ) | 88 | ) |
530 | 73 | from provisioningserver.rpc.exceptions import NoConnectionsAvailable | 89 | from provisioningserver.rpc.exceptions import NoConnectionsAvailable |
531 | 90 | ======= | ||
532 | 91 | from provisioningserver.rpc.cluster import ( | ||
533 | 92 | ListBootImages, | ||
534 | 93 | ListBootImagesV2, | ||
535 | 94 | ) | ||
536 | 95 | >>>>>>> MERGE-SOURCE | ||
537 | 74 | from provisioningserver.testing.boot_images import ( | 96 | from provisioningserver.testing.boot_images import ( |
538 | 75 | make_boot_image_storage_params, | 97 | make_boot_image_storage_params, |
539 | 76 | make_image, | 98 | make_image, |
540 | 77 | ) | 99 | ) |
541 | 100 | <<<<<<< TREE | ||
542 | 78 | from provisioningserver.testing.config import ClusterConfigurationFixture | 101 | from provisioningserver.testing.config import ClusterConfigurationFixture |
543 | 79 | from testtools.matchers import ( | 102 | from testtools.matchers import ( |
544 | 80 | IsInstance, | 103 | IsInstance, |
545 | @@ -94,6 +117,14 @@ | |||
546 | 94 | 117 | ||
547 | 95 | def make_image_dir(image_params, tftp_root): | 118 | def make_image_dir(image_params, tftp_root): |
548 | 96 | """Fake a boot image matching `image_params` under `tftp_root`.""" | 119 | """Fake a boot image matching `image_params` under `tftp_root`.""" |
549 | 120 | ======= | ||
550 | 121 | from twisted.internet.defer import succeed | ||
551 | 122 | from twisted.protocols.amp import UnhandledCommand | ||
552 | 123 | |||
553 | 124 | |||
554 | 125 | def make_image_dir(image_params, tftproot): | ||
555 | 126 | """Fake a boot image matching `image_params` under `tftproot`.""" | ||
556 | 127 | >>>>>>> MERGE-SOURCE | ||
557 | 97 | image_dir = locate_tftp_path( | 128 | image_dir = locate_tftp_path( |
558 | 98 | compose_image_path( | 129 | compose_image_path( |
559 | 99 | osystem=image_params['osystem'], | 130 | osystem=image_params['osystem'], |
560 | @@ -346,6 +377,37 @@ | |||
561 | 346 | 377 | ||
562 | 347 | self.assertItemsEqual(images, self.get()) | 378 | self.assertItemsEqual(images, self.get()) |
563 | 348 | 379 | ||
564 | 380 | def test_fallback_to_ListBootImages_on_old_clusters(self): | ||
565 | 381 | nodegroup_1 = factory.make_NodeGroup() | ||
566 | 382 | nodegroup_1.accept() | ||
567 | 383 | nodegroup_2 = factory.make_NodeGroup() | ||
568 | 384 | nodegroup_2.accept() | ||
569 | 385 | nodegroup_3 = factory.make_NodeGroup() | ||
570 | 386 | nodegroup_3.accept() | ||
571 | 387 | |||
572 | 388 | images = [make_rpc_boot_image() for _ in range(3)] | ||
573 | 389 | |||
574 | 390 | # Limit the region's event loop to only the "rpc" service. | ||
575 | 391 | self.useFixture(RegionEventLoopFixture("rpc")) | ||
576 | 392 | # Now start the region's event loop. | ||
577 | 393 | self.useFixture(RunningEventLoopFixture()) | ||
578 | 394 | # This fixture allows us to simulate mock clusters. | ||
579 | 395 | rpc = self.useFixture(MockLiveRegionToClusterRPCFixture()) | ||
580 | 396 | |||
581 | 397 | # This simulates an older cluster, one without ListBootImagesV2. | ||
582 | 398 | cluster_1 = rpc.makeCluster(nodegroup_1, ListBootImages) | ||
583 | 399 | cluster_1.ListBootImages.return_value = succeed({'images': images}) | ||
584 | 400 | |||
585 | 401 | # This simulates a newer cluster, one with ListBootImagesV2. | ||
586 | 402 | cluster_2 = rpc.makeCluster(nodegroup_2, ListBootImagesV2) | ||
587 | 403 | cluster_2.ListBootImagesV2.return_value = succeed({'images': images}) | ||
588 | 404 | |||
589 | 405 | # This simulates a broken cluster. | ||
590 | 406 | cluster_3 = rpc.makeCluster(nodegroup_3, ListBootImagesV2) | ||
591 | 407 | cluster_3.ListBootImagesV2.side_effect = ZeroDivisionError | ||
592 | 408 | |||
593 | 409 | self.assertItemsEqual(images, get_available_boot_images()) | ||
594 | 410 | |||
595 | 349 | def test_returns_empty_list_when_all_clusters_fail(self): | 411 | def test_returns_empty_list_when_all_clusters_fail(self): |
596 | 350 | factory.make_NodeGroup().accept() | 412 | factory.make_NodeGroup().accept() |
597 | 351 | factory.make_NodeGroup().accept() | 413 | factory.make_NodeGroup().accept() |
598 | 352 | 414 | ||
599 | === modified file 'src/maasserver/dns/tests/test_config.py' | |||
600 | --- src/maasserver/dns/tests/test_config.py 2015-09-14 21:26:38 +0000 | |||
601 | +++ src/maasserver/dns/tests/test_config.py 2015-09-25 14:32:35 +0000 | |||
602 | @@ -493,15 +493,16 @@ | |||
603 | 493 | def test_dns_update_all_zones_now_passes_upstream_dns_parameter(self): | 493 | def test_dns_update_all_zones_now_passes_upstream_dns_parameter(self): |
604 | 494 | self.patch(settings, 'DNS_CONNECT', True) | 494 | self.patch(settings, 'DNS_CONNECT', True) |
605 | 495 | self.create_managed_nodegroup() | 495 | self.create_managed_nodegroup() |
608 | 496 | random_ip = factory.make_ipv4_address() | 496 | ips = [factory.make_ipv4_address() for _ in range(3)] |
609 | 497 | Config.objects.set_config("upstream_dns", random_ip) | 497 | input_ips = " ".join(ips) |
610 | 498 | Config.objects.set_config("upstream_dns", input_ips) | ||
611 | 498 | bind_write_options = self.patch_autospec( | 499 | bind_write_options = self.patch_autospec( |
612 | 499 | dns_config_module, "bind_write_options") | 500 | dns_config_module, "bind_write_options") |
613 | 500 | dns_update_all_zones_now() | 501 | dns_update_all_zones_now() |
614 | 501 | self.assertThat( | 502 | self.assertThat( |
615 | 502 | bind_write_options, | 503 | bind_write_options, |
616 | 503 | MockCalledOnceWith( | 504 | MockCalledOnceWith( |
618 | 504 | dnssec_validation='auto', upstream_dns=[random_ip])) | 505 | dnssec_validation='auto', upstream_dns=ips)) |
619 | 505 | 506 | ||
620 | 506 | def test_dns_update_all_zones_now_writes_trusted_networks_parameter(self): | 507 | def test_dns_update_all_zones_now_writes_trusted_networks_parameter(self): |
621 | 507 | self.patch(settings, 'DNS_CONNECT', True) | 508 | self.patch(settings, 'DNS_CONNECT', True) |
622 | 508 | 509 | ||
623 | === modified file 'src/maasserver/fields.py' | |||
624 | --- src/maasserver/fields.py 2015-09-21 20:29:36 +0000 | |||
625 | +++ src/maasserver/fields.py 2015-09-25 14:32:35 +0000 | |||
626 | @@ -15,8 +15,12 @@ | |||
627 | 15 | __all__ = [ | 15 | __all__ = [ |
628 | 16 | "CIDRField", | 16 | "CIDRField", |
629 | 17 | "EditableBinaryField", | 17 | "EditableBinaryField", |
630 | 18 | <<<<<<< TREE | ||
631 | 18 | "IPListFormField", | 19 | "IPListFormField", |
632 | 19 | "IPv4CIDRField", | 20 | "IPv4CIDRField", |
633 | 21 | ======= | ||
634 | 22 | "IPListFormField", | ||
635 | 23 | >>>>>>> MERGE-SOURCE | ||
636 | 20 | "MAASIPAddressField", | 24 | "MAASIPAddressField", |
637 | 21 | "MAC", | 25 | "MAC", |
638 | 22 | "MACAddressField", | 26 | "MACAddressField", |
639 | @@ -542,6 +546,7 @@ | |||
640 | 542 | raise AssertionError( | 546 | raise AssertionError( |
641 | 543 | "Invalid LargeObjectField value (expected integer): '%s'" | 547 | "Invalid LargeObjectField value (expected integer): '%s'" |
642 | 544 | % repr(value)) | 548 | % repr(value)) |
643 | 549 | <<<<<<< TREE | ||
644 | 545 | 550 | ||
645 | 546 | 551 | ||
646 | 547 | def parse_cidr(value): | 552 | def parse_cidr(value): |
647 | @@ -629,3 +634,28 @@ | |||
648 | 629 | if value not in self.empty_values: | 634 | if value not in self.empty_values: |
649 | 630 | value = value.lower() | 635 | value = value.lower() |
650 | 631 | return super(CaseInsensitiveChoiceField, self).to_python(value) | 636 | return super(CaseInsensitiveChoiceField, self).to_python(value) |
651 | 637 | ======= | ||
652 | 638 | |||
653 | 639 | |||
654 | 640 | class IPListFormField(CharField): | ||
655 | 641 | """Accepts a space/comma separated list of IP addresses. | ||
656 | 642 | |||
657 | 643 | This field normalizes the list to a space-separated list. | ||
658 | 644 | """ | ||
659 | 645 | separators = re.compile('[,\s]+') | ||
660 | 646 | |||
661 | 647 | def clean(self, value): | ||
662 | 648 | if value is None: | ||
663 | 649 | return None | ||
664 | 650 | else: | ||
665 | 651 | ips = re.split(self.separators, value) | ||
666 | 652 | ips = [ip.strip() for ip in ips if ip != ''] | ||
667 | 653 | for ip in ips: | ||
668 | 654 | try: | ||
669 | 655 | GenericIPAddressField().clean(ip, model_instance=None) | ||
670 | 656 | except ValidationError: | ||
671 | 657 | raise ValidationError( | ||
672 | 658 | "Invalid IP address: %s; provide a list of " | ||
673 | 659 | "space-separated IP addresses" % ip) | ||
674 | 660 | return ' '.join(ips) | ||
675 | 661 | >>>>>>> MERGE-SOURCE | ||
676 | 632 | 662 | ||
677 | === modified file 'src/maasserver/forms.py' | |||
678 | === modified file 'src/maasserver/forms_settings.py' | |||
679 | === added file 'src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py' | |||
680 | --- src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py 1970-01-01 00:00:00 +0000 | |||
681 | +++ src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py 2015-09-25 14:32:35 +0000 | |||
682 | @@ -0,0 +1,453 @@ | |||
683 | 1 | # -*- coding: utf-8 -*- | ||
684 | 2 | from django.db import models | ||
685 | 3 | from south.db import db | ||
686 | 4 | from south.utils import datetime_utils as datetime | ||
687 | 5 | from south.v2 import SchemaMigration | ||
688 | 6 | |||
689 | 7 | |||
690 | 8 | class Migration(SchemaMigration): | ||
691 | 9 | |||
692 | 10 | def forwards(self, orm): | ||
693 | 11 | # Adding field 'Node.power_state_updated' | ||
694 | 12 | db.add_column(u'maasserver_node', 'power_state_updated', | ||
695 | 13 | self.gf('django.db.models.fields.DateTimeField')(default=None, null=True), | ||
696 | 14 | keep_default=False) | ||
697 | 15 | |||
698 | 16 | |||
699 | 17 | # Changing field 'Node.power_parameters' | ||
700 | 18 | db.alter_column(u'maasserver_node', 'power_parameters', self.gf('maasserver.fields.JSONObjectField')(max_length=32768)) | ||
701 | 19 | |||
702 | 20 | def backwards(self, orm): | ||
703 | 21 | # Deleting field 'Node.power_state_updated' | ||
704 | 22 | db.delete_column(u'maasserver_node', 'power_state_updated') | ||
705 | 23 | |||
706 | 24 | |||
707 | 25 | # Changing field 'Node.power_parameters' | ||
708 | 26 | db.alter_column(u'maasserver_node', 'power_parameters', self.gf('maasserver.fields.JSONObjectField')()) | ||
709 | 27 | |||
710 | 28 | models = { | ||
711 | 29 | u'auth.group': { | ||
712 | 30 | 'Meta': {'object_name': 'Group'}, | ||
713 | 31 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
714 | 32 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), | ||
715 | 33 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) | ||
716 | 34 | }, | ||
717 | 35 | u'auth.permission': { | ||
718 | 36 | 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, | ||
719 | 37 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
720 | 38 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), | ||
721 | 39 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
722 | 40 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) | ||
723 | 41 | }, | ||
724 | 42 | u'auth.user': { | ||
725 | 43 | 'Meta': {'object_name': 'User'}, | ||
726 | 44 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
727 | 45 | 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}), | ||
728 | 46 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
729 | 47 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), | ||
730 | 48 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
731 | 49 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
732 | 50 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
733 | 51 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
734 | 52 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), | ||
735 | 53 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), | ||
736 | 54 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), | ||
737 | 55 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), | ||
738 | 56 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) | ||
739 | 57 | }, | ||
740 | 58 | u'contenttypes.contenttype': { | ||
741 | 59 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, | ||
742 | 60 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
743 | 61 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
744 | 62 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), | ||
745 | 63 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) | ||
746 | 64 | }, | ||
747 | 65 | u'maasserver.blockdevice': { | ||
748 | 66 | 'Meta': {'ordering': "[u'id']", 'unique_together': "((u'node', u'path'),)", 'object_name': 'BlockDevice'}, | ||
749 | 67 | 'block_size': ('django.db.models.fields.IntegerField', [], {}), | ||
750 | 68 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
751 | 69 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
752 | 70 | 'id_path': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), | ||
753 | 71 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
754 | 72 | 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}), | ||
755 | 73 | 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}), | ||
756 | 74 | 'size': ('django.db.models.fields.BigIntegerField', [], {}), | ||
757 | 75 | 'tags': ('djorm_pgarray.fields.ArrayField', [], {'default': '[]', 'dbtype': "u'text'", 'blank': 'True'}), | ||
758 | 76 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
759 | 77 | }, | ||
760 | 78 | u'maasserver.bootresource': { | ||
761 | 79 | 'Meta': {'unique_together': "((u'name', u'architecture'),)", 'object_name': 'BootResource'}, | ||
762 | 80 | 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
763 | 81 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
764 | 82 | 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), | ||
765 | 83 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
766 | 84 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
767 | 85 | 'rtype': ('django.db.models.fields.IntegerField', [], {'max_length': '10'}), | ||
768 | 86 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
769 | 87 | }, | ||
770 | 88 | u'maasserver.bootresourcefile': { | ||
771 | 89 | 'Meta': {'unique_together': "((u'resource_set', u'filetype'),)", 'object_name': 'BootResourceFile'}, | ||
772 | 90 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
773 | 91 | 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}), | ||
774 | 92 | 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
775 | 93 | 'filetype': ('django.db.models.fields.CharField', [], {'default': "u'root-tgz'", 'max_length': '20'}), | ||
776 | 94 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
777 | 95 | 'largefile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.LargeFile']"}), | ||
778 | 96 | 'resource_set': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'files'", 'to': u"orm['maasserver.BootResourceSet']"}), | ||
779 | 97 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
780 | 98 | }, | ||
781 | 99 | u'maasserver.bootresourceset': { | ||
782 | 100 | 'Meta': {'unique_together': "((u'resource', u'version'),)", 'object_name': 'BootResourceSet'}, | ||
783 | 101 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
784 | 102 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
785 | 103 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
786 | 104 | 'resource': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'sets'", 'to': u"orm['maasserver.BootResource']"}), | ||
787 | 105 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
788 | 106 | 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'}) | ||
789 | 107 | }, | ||
790 | 108 | u'maasserver.bootsource': { | ||
791 | 109 | 'Meta': {'object_name': 'BootSource'}, | ||
792 | 110 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
793 | 111 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
794 | 112 | 'keyring_data': ('maasserver.fields.EditableBinaryField', [], {'blank': 'True'}), | ||
795 | 113 | 'keyring_filename': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'blank': 'True'}), | ||
796 | 114 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
797 | 115 | 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'}) | ||
798 | 116 | }, | ||
799 | 117 | u'maasserver.bootsourcecache': { | ||
800 | 118 | 'Meta': {'object_name': 'BootSourceCache'}, | ||
801 | 119 | 'arch': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
802 | 120 | 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}), | ||
803 | 121 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
804 | 122 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
805 | 123 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
806 | 124 | 'os': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
807 | 125 | 'release': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
808 | 126 | 'subarch': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
809 | 127 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
810 | 128 | }, | ||
811 | 129 | u'maasserver.bootsourceselection': { | ||
812 | 130 | 'Meta': {'unique_together': "((u'boot_source', u'os', u'release'),)", 'object_name': 'BootSourceSelection'}, | ||
813 | 131 | 'arches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}), | ||
814 | 132 | 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}), | ||
815 | 133 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
816 | 134 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
817 | 135 | 'labels': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}), | ||
818 | 136 | 'os': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
819 | 137 | 'release': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
820 | 138 | 'subarches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}), | ||
821 | 139 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
822 | 140 | }, | ||
823 | 141 | u'maasserver.candidatename': { | ||
824 | 142 | 'Meta': {'unique_together': "((u'name', u'position'),)", 'object_name': 'CandidateName'}, | ||
825 | 143 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
826 | 144 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), | ||
827 | 145 | 'position': ('django.db.models.fields.IntegerField', [], {}) | ||
828 | 146 | }, | ||
829 | 147 | u'maasserver.componenterror': { | ||
830 | 148 | 'Meta': {'object_name': 'ComponentError'}, | ||
831 | 149 | 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), | ||
832 | 150 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
833 | 151 | 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}), | ||
834 | 152 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
835 | 153 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
836 | 154 | }, | ||
837 | 155 | u'maasserver.config': { | ||
838 | 156 | 'Meta': {'object_name': 'Config'}, | ||
839 | 157 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
840 | 158 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
841 | 159 | 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'}) | ||
842 | 160 | }, | ||
843 | 161 | u'maasserver.dhcplease': { | ||
844 | 162 | 'Meta': {'object_name': 'DHCPLease'}, | ||
845 | 163 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
846 | 164 | 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}), | ||
847 | 165 | 'mac': ('maasserver.fields.MACAddressField', [], {}), | ||
848 | 166 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}) | ||
849 | 167 | }, | ||
850 | 168 | u'maasserver.downloadprogress': { | ||
851 | 169 | 'Meta': {'object_name': 'DownloadProgress'}, | ||
852 | 170 | 'bytes_downloaded': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
853 | 171 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
854 | 172 | 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}), | ||
855 | 173 | 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
856 | 174 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
857 | 175 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}), | ||
858 | 176 | 'size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), | ||
859 | 177 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
860 | 178 | }, | ||
861 | 179 | u'maasserver.event': { | ||
862 | 180 | 'Meta': {'object_name': 'Event'}, | ||
863 | 181 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
864 | 182 | 'description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}), | ||
865 | 183 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
866 | 184 | 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}), | ||
867 | 185 | 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.EventType']"}), | ||
868 | 186 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
869 | 187 | }, | ||
870 | 188 | u'maasserver.eventtype': { | ||
871 | 189 | 'Meta': {'object_name': 'EventType'}, | ||
872 | 190 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
873 | 191 | 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
874 | 192 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
875 | 193 | 'level': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), | ||
876 | 194 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
877 | 195 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
878 | 196 | }, | ||
879 | 197 | u'maasserver.filestorage': { | ||
880 | 198 | 'Meta': {'unique_together': "((u'filename', u'owner'),)", 'object_name': 'FileStorage'}, | ||
881 | 199 | 'content': ('metadataserver.fields.BinaryField', [], {'blank': 'True'}), | ||
882 | 200 | 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
883 | 201 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
884 | 202 | 'key': ('django.db.models.fields.CharField', [], {'default': "u'c4af88bc-2ae9-11e5-9139-00163edfc3e6'", 'unique': 'True', 'max_length': '36'}), | ||
885 | 203 | 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) | ||
886 | 204 | }, | ||
887 | 205 | u'maasserver.filesystem': { | ||
888 | 206 | 'Meta': {'object_name': 'Filesystem'}, | ||
889 | 207 | 'block_device': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BlockDevice']", 'null': 'True', 'blank': 'True'}), | ||
890 | 208 | 'create_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
891 | 209 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
892 | 210 | 'filesystem_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filesystems'", 'null': 'True', 'to': u"orm['maasserver.FilesystemGroup']"}), | ||
893 | 211 | 'fstype': ('django.db.models.fields.CharField', [], {'default': "u'ext4'", 'max_length': '20'}), | ||
894 | 212 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
895 | 213 | 'mount_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
896 | 214 | 'mount_point': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
897 | 215 | 'partition': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Partition']", 'null': 'True', 'blank': 'True'}), | ||
898 | 216 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
899 | 217 | 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}) | ||
900 | 218 | }, | ||
901 | 219 | u'maasserver.filesystemgroup': { | ||
902 | 220 | 'Meta': {'object_name': 'FilesystemGroup'}, | ||
903 | 221 | 'create_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
904 | 222 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
905 | 223 | 'group_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}), | ||
906 | 224 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
907 | 225 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
908 | 226 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
909 | 227 | 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}) | ||
910 | 228 | }, | ||
911 | 229 | u'maasserver.largefile': { | ||
912 | 230 | 'Meta': {'object_name': 'LargeFile'}, | ||
913 | 231 | 'content': ('maasserver.fields.LargeObjectField', [], {}), | ||
914 | 232 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
915 | 233 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
916 | 234 | 'sha256': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}), | ||
917 | 235 | 'total_size': ('django.db.models.fields.BigIntegerField', [], {}), | ||
918 | 236 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
919 | 237 | }, | ||
920 | 238 | u'maasserver.licensekey': { | ||
921 | 239 | 'Meta': {'unique_together': "((u'osystem', u'distro_series'),)", 'object_name': 'LicenseKey'}, | ||
922 | 240 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
923 | 241 | 'distro_series': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
924 | 242 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
925 | 243 | 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
926 | 244 | 'osystem': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
927 | 245 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
928 | 246 | }, | ||
929 | 247 | u'maasserver.macaddress': { | ||
930 | 248 | 'Meta': {'ordering': "(u'created',)", 'object_name': 'MACAddress'}, | ||
931 | 249 | 'cluster_interface': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.NodeGroupInterface']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), | ||
932 | 250 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
933 | 251 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
934 | 252 | 'ip_addresses': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.StaticIPAddress']", 'symmetrical': 'False', 'through': u"orm['maasserver.MACStaticIPAddressLink']", 'blank': 'True'}), | ||
935 | 253 | 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}), | ||
936 | 254 | 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Network']", 'symmetrical': 'False', 'blank': 'True'}), | ||
937 | 255 | 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']", 'null': 'True', 'blank': 'True'}), | ||
938 | 256 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
939 | 257 | }, | ||
940 | 258 | u'maasserver.macstaticipaddresslink': { | ||
941 | 259 | 'Meta': {'unique_together': "((u'ip_address', u'mac_address'),)", 'object_name': 'MACStaticIPAddressLink'}, | ||
942 | 260 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
943 | 261 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
944 | 262 | 'ip_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.StaticIPAddress']", 'unique': 'True'}), | ||
945 | 263 | 'mac_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.MACAddress']"}), | ||
946 | 264 | 'nic_alias': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), | ||
947 | 265 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
948 | 266 | }, | ||
949 | 267 | u'maasserver.network': { | ||
950 | 268 | 'Meta': {'object_name': 'Network'}, | ||
951 | 269 | 'default_gateway': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
952 | 270 | 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
953 | 271 | 'dns_servers': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
954 | 272 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
955 | 273 | 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}), | ||
956 | 274 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), | ||
957 | 275 | 'netmask': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}), | ||
958 | 276 | 'vlan_tag': ('django.db.models.fields.PositiveSmallIntegerField', [], {'unique': 'True', 'null': 'True', 'blank': 'True'}) | ||
959 | 277 | }, | ||
960 | 278 | u'maasserver.node': { | ||
961 | 279 | 'Meta': {'object_name': 'Node'}, | ||
962 | 280 | 'agent_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
963 | 281 | 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}), | ||
964 | 282 | 'boot_type': ('django.db.models.fields.CharField', [], {'default': "u'fastpath'", 'max_length': '20'}), | ||
965 | 283 | 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
966 | 284 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
967 | 285 | 'disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
968 | 286 | 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
969 | 287 | 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
970 | 288 | 'error_description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}), | ||
971 | 289 | 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}), | ||
972 | 290 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
973 | 291 | 'installable': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), | ||
974 | 292 | 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), | ||
975 | 293 | 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
976 | 294 | 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), | ||
977 | 295 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}), | ||
978 | 296 | 'osystem': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}), | ||
979 | 297 | 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}), | ||
980 | 298 | 'parent': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "u'children'", 'null': 'True', 'blank': 'True', 'to': u"orm['maasserver.Node']"}), | ||
981 | 299 | 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'max_length': '32768', 'blank': 'True'}), | ||
982 | 300 | 'power_state': ('django.db.models.fields.CharField', [], {'default': "u'unknown'", 'max_length': '10'}), | ||
983 | 301 | 'power_state_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}), | ||
984 | 302 | 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}), | ||
985 | 303 | 'pxe_mac': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': u"orm['maasserver.MACAddress']", 'blank': 'True', 'null': 'True'}), | ||
986 | 304 | 'routers': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'macaddr'", 'null': 'True', 'blank': 'True'}), | ||
987 | 305 | 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}), | ||
988 | 306 | 'swap_size': ('django.db.models.fields.BigIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), | ||
989 | 307 | 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-c4b17d70-2ae9-11e5-9139-00163edfc3e6'", 'unique': 'True', 'max_length': '41'}), | ||
990 | 308 | 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}), | ||
991 | 309 | 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'null': 'True'}), | ||
992 | 310 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
993 | 311 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Zone']", 'on_delete': 'models.SET_DEFAULT'}) | ||
994 | 312 | }, | ||
995 | 313 | u'maasserver.nodegroup': { | ||
996 | 314 | 'Meta': {'object_name': 'NodeGroup'}, | ||
997 | 315 | 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}), | ||
998 | 316 | 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'unique': 'True'}), | ||
999 | 317 | 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}), | ||
1000 | 318 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
1001 | 319 | 'default_disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
1002 | 320 | 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
1003 | 321 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1004 | 322 | 'maas_url': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
1005 | 323 | 'name': ('maasserver.models.nodegroup.DomainNameField', [], {'max_length': '80', 'blank': 'True'}), | ||
1006 | 324 | 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), | ||
1007 | 325 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
1008 | 326 | 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}) | ||
1009 | 327 | }, | ||
1010 | 328 | u'maasserver.nodegroupinterface': { | ||
1011 | 329 | 'Meta': {'unique_together': "((u'nodegroup', u'name'),)", 'object_name': 'NodeGroupInterface'}, | ||
1012 | 330 | 'broadcast_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
1013 | 331 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
1014 | 332 | 'foreign_dhcp_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
1015 | 333 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1016 | 334 | 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
1017 | 335 | 'ip': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}), | ||
1018 | 336 | 'ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
1019 | 337 | 'ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
1020 | 338 | 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
1021 | 339 | 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), | ||
1022 | 340 | 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}), | ||
1023 | 341 | 'router_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
1024 | 342 | 'static_ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
1025 | 343 | 'static_ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
1026 | 344 | 'subnet_mask': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}), | ||
1027 | 345 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
1028 | 346 | }, | ||
1029 | 347 | u'maasserver.partition': { | ||
1030 | 348 | 'Meta': {'object_name': 'Partition'}, | ||
1031 | 349 | 'bootable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
1032 | 350 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
1033 | 351 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1034 | 352 | 'partition_table': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'partitions'", 'to': u"orm['maasserver.PartitionTable']"}), | ||
1035 | 353 | 'size': ('django.db.models.fields.BigIntegerField', [], {}), | ||
1036 | 354 | 'start_offset': ('django.db.models.fields.BigIntegerField', [], {}), | ||
1037 | 355 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
1038 | 356 | 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '36', 'unique': 'True', 'null': 'True', 'blank': 'True'}) | ||
1039 | 357 | }, | ||
1040 | 358 | u'maasserver.partitiontable': { | ||
1041 | 359 | 'Meta': {'object_name': 'PartitionTable'}, | ||
1042 | 360 | 'block_device': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BlockDevice']"}), | ||
1043 | 361 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
1044 | 362 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1045 | 363 | 'table_type': ('django.db.models.fields.CharField', [], {'default': "u'GPT'", 'max_length': '20'}), | ||
1046 | 364 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
1047 | 365 | }, | ||
1048 | 366 | u'maasserver.physicalblockdevice': { | ||
1049 | 367 | 'Meta': {'ordering': "[u'id']", 'object_name': 'PhysicalBlockDevice', '_ormbases': [u'maasserver.BlockDevice']}, | ||
1050 | 368 | u'blockdevice_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['maasserver.BlockDevice']", 'unique': 'True', 'primary_key': 'True'}), | ||
1051 | 369 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), | ||
1052 | 370 | 'serial': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) | ||
1053 | 371 | }, | ||
1054 | 372 | u'maasserver.sshkey': { | ||
1055 | 373 | 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'}, | ||
1056 | 374 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
1057 | 375 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1058 | 376 | 'key': ('django.db.models.fields.TextField', [], {}), | ||
1059 | 377 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
1060 | 378 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) | ||
1061 | 379 | }, | ||
1062 | 380 | u'maasserver.sslkey': { | ||
1063 | 381 | 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSLKey'}, | ||
1064 | 382 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
1065 | 383 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1066 | 384 | 'key': ('django.db.models.fields.TextField', [], {}), | ||
1067 | 385 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
1068 | 386 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) | ||
1069 | 387 | }, | ||
1070 | 388 | u'maasserver.staticipaddress': { | ||
1071 | 389 | 'Meta': {'object_name': 'StaticIPAddress'}, | ||
1072 | 390 | 'alloc_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}), | ||
1073 | 391 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
1074 | 392 | 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
1075 | 393 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1076 | 394 | 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}), | ||
1077 | 395 | 'updated': ('django.db.models.fields.DateTimeField', [], {}), | ||
1078 | 396 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) | ||
1079 | 397 | }, | ||
1080 | 398 | u'maasserver.tag': { | ||
1081 | 399 | 'Meta': {'object_name': 'Tag'}, | ||
1082 | 400 | 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
1083 | 401 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
1084 | 402 | 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
1085 | 403 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1086 | 404 | 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), | ||
1087 | 405 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}), | ||
1088 | 406 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
1089 | 407 | }, | ||
1090 | 408 | u'maasserver.userprofile': { | ||
1091 | 409 | 'Meta': {'object_name': 'UserProfile'}, | ||
1092 | 410 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1093 | 411 | 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}) | ||
1094 | 412 | }, | ||
1095 | 413 | u'maasserver.virtualblockdevice': { | ||
1096 | 414 | 'Meta': {'ordering': "[u'id']", 'object_name': 'VirtualBlockDevice', '_ormbases': [u'maasserver.BlockDevice']}, | ||
1097 | 415 | u'blockdevice_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['maasserver.BlockDevice']", 'unique': 'True', 'primary_key': 'True'}), | ||
1098 | 416 | 'filesystem_group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'virtual_devices'", 'to': u"orm['maasserver.FilesystemGroup']"}), | ||
1099 | 417 | 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'}) | ||
1100 | 418 | }, | ||
1101 | 419 | u'maasserver.zone': { | ||
1102 | 420 | 'Meta': {'ordering': "[u'name']", 'object_name': 'Zone'}, | ||
1103 | 421 | 'created': ('django.db.models.fields.DateTimeField', [], {}), | ||
1104 | 422 | 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), | ||
1105 | 423 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1106 | 424 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}), | ||
1107 | 425 | 'updated': ('django.db.models.fields.DateTimeField', [], {}) | ||
1108 | 426 | }, | ||
1109 | 427 | u'piston.consumer': { | ||
1110 | 428 | 'Meta': {'object_name': 'Consumer'}, | ||
1111 | 429 | 'description': ('django.db.models.fields.TextField', [], {}), | ||
1112 | 430 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1113 | 431 | 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}), | ||
1114 | 432 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), | ||
1115 | 433 | 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}), | ||
1116 | 434 | 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}), | ||
1117 | 435 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': u"orm['auth.User']"}) | ||
1118 | 436 | }, | ||
1119 | 437 | u'piston.token': { | ||
1120 | 438 | 'Meta': {'object_name': 'Token'}, | ||
1121 | 439 | 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), | ||
1122 | 440 | 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
1123 | 441 | 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Consumer']"}), | ||
1124 | 442 | u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), | ||
1125 | 443 | 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), | ||
1126 | 444 | 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}), | ||
1127 | 445 | 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}), | ||
1128 | 446 | 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1436961921L'}), | ||
1129 | 447 | 'token_type': ('django.db.models.fields.IntegerField', [], {}), | ||
1130 | 448 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': u"orm['auth.User']"}), | ||
1131 | 449 | 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'}) | ||
1132 | 450 | } | ||
1133 | 451 | } | ||
1134 | 452 | |||
1135 | 453 | complete_apps = ['maasserver'] | ||
1136 | 0 | 454 | ||
1137 | === renamed file 'src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py' => 'src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py.moved' | |||
1138 | === modified file 'src/maasserver/models/node.py' | |||
1139 | === modified file 'src/maasserver/models/tests/test_node.py' | |||
1140 | --- src/maasserver/models/tests/test_node.py 2015-09-24 15:01:52 +0000 | |||
1141 | +++ src/maasserver/models/tests/test_node.py 2015-09-25 14:32:35 +0000 | |||
1142 | @@ -59,8 +59,13 @@ | |||
1143 | 59 | ) | 59 | ) |
1144 | 60 | from maasserver.models.event import Event | 60 | from maasserver.models.event import Event |
1145 | 61 | from maasserver.models.node import PowerInfo | 61 | from maasserver.models.node import PowerInfo |
1146 | 62 | <<<<<<< TREE | ||
1147 | 62 | from maasserver.models.signals import power as node_query | 63 | from maasserver.models.signals import power as node_query |
1148 | 63 | from maasserver.models.timestampedmodel import now | 64 | from maasserver.models.timestampedmodel import now |
1149 | 65 | ======= | ||
1150 | 66 | from maasserver.models.staticipaddress import StaticIPAddress | ||
1151 | 67 | from maasserver.models.timestampedmodel import now | ||
1152 | 68 | >>>>>>> MERGE-SOURCE | ||
1153 | 64 | from maasserver.models.user import create_auth_token | 69 | from maasserver.models.user import create_auth_token |
1154 | 65 | from maasserver.node_status import ( | 70 | from maasserver.node_status import ( |
1155 | 66 | get_failed_status, | 71 | get_failed_status, |
1156 | 67 | 72 | ||
1157 | === modified file 'src/maasserver/node_action.py' | |||
1158 | --- src/maasserver/node_action.py 2015-09-23 20:33:01 +0000 | |||
1159 | +++ src/maasserver/node_action.py 2015-09-25 14:32:35 +0000 | |||
1160 | @@ -50,10 +50,14 @@ | |||
1161 | 50 | is_failed_status, | 50 | is_failed_status, |
1162 | 51 | NON_MONITORED_STATUSES, | 51 | NON_MONITORED_STATUSES, |
1163 | 52 | ) | 52 | ) |
1164 | 53 | <<<<<<< TREE | ||
1165 | 53 | from maasserver.utils.osystems import ( | 54 | from maasserver.utils.osystems import ( |
1166 | 54 | validate_hwe_kernel, | 55 | validate_hwe_kernel, |
1167 | 55 | validate_osystem_and_distro_series, | 56 | validate_osystem_and_distro_series, |
1168 | 56 | ) | 57 | ) |
1169 | 58 | ======= | ||
1170 | 59 | from maasserver.utils.osystems import validate_osystem_and_distro_series | ||
1171 | 60 | >>>>>>> MERGE-SOURCE | ||
1172 | 57 | from metadataserver.enum import RESULT_TYPE | 61 | from metadataserver.enum import RESULT_TYPE |
1173 | 58 | from metadataserver.models.noderesult import NodeResult | 62 | from metadataserver.models.noderesult import NodeResult |
1174 | 59 | from provisioningserver.rpc.exceptions import ( | 63 | from provisioningserver.rpc.exceptions import ( |
1175 | @@ -310,6 +314,7 @@ | |||
1176 | 310 | self.node.acquire(self.user, token=None) | 314 | self.node.acquire(self.user, token=None) |
1177 | 311 | 315 | ||
1178 | 312 | if osystem and distro_series: | 316 | if osystem and distro_series: |
1179 | 317 | <<<<<<< TREE | ||
1180 | 313 | try: | 318 | try: |
1181 | 314 | self.node.osystem, self.node.distro_series = ( | 319 | self.node.osystem, self.node.distro_series = ( |
1182 | 315 | validate_osystem_and_distro_series(osystem, distro_series)) | 320 | validate_osystem_and_distro_series(osystem, distro_series)) |
1183 | @@ -325,6 +330,14 @@ | |||
1184 | 325 | self.node.save() | 330 | self.node.save() |
1185 | 326 | except ValidationError as e: | 331 | except ValidationError as e: |
1186 | 327 | raise NodeActionError(e.message) | 332 | raise NodeActionError(e.message) |
1187 | 333 | ======= | ||
1188 | 334 | try: | ||
1189 | 335 | self.node.osystem, self.node.distro_series = ( | ||
1190 | 336 | validate_osystem_and_distro_series(osystem, distro_series)) | ||
1191 | 337 | self.node.save() | ||
1192 | 338 | except ValidationError as e: | ||
1193 | 339 | raise NodeActionError(e.message) | ||
1194 | 340 | >>>>>>> MERGE-SOURCE | ||
1195 | 328 | 341 | ||
1196 | 329 | try: | 342 | try: |
1197 | 330 | self.node.start(self.user) | 343 | self.node.start(self.user) |
1198 | 331 | 344 | ||
1199 | === modified file 'src/maasserver/plugin.py' | |||
1200 | --- src/maasserver/plugin.py 2015-09-15 13:52:51 +0000 | |||
1201 | +++ src/maasserver/plugin.py 2015-09-25 14:32:35 +0000 | |||
1202 | @@ -28,6 +28,7 @@ | |||
1203 | 28 | from twisted.python import usage | 28 | from twisted.python import usage |
1204 | 29 | from twisted.python.threadable import isInIOThread | 29 | from twisted.python.threadable import isInIOThread |
1205 | 30 | from zope.interface import implementer | 30 | from zope.interface import implementer |
1206 | 31 | from twisted.internet import reactor | ||
1207 | 31 | 32 | ||
1208 | 32 | 33 | ||
1209 | 33 | def serverFromString(description): | 34 | def serverFromString(description): |
1210 | @@ -49,6 +50,14 @@ | |||
1211 | 49 | ] | 50 | ] |
1212 | 50 | 51 | ||
1213 | 51 | 52 | ||
1214 | 53 | # The maximum number of threads used by the default twisted thread pool. | ||
1215 | 54 | # This value is a trade-off between a small value (such as the default: 10) | ||
1216 | 55 | # which can create deadlocks (see 1470013) and a huge value which can cause | ||
1217 | 56 | # MAAS to hit other limitations such as the number of open files or the | ||
1218 | 57 | # number of concurrent database connexions. | ||
1219 | 58 | MAX_THREADS = 100 | ||
1220 | 59 | |||
1221 | 60 | |||
1222 | 52 | @implementer(IServiceMaker, IPlugin) | 61 | @implementer(IServiceMaker, IPlugin) |
1223 | 53 | class RegionServiceMaker: | 62 | class RegionServiceMaker: |
1224 | 54 | """Create a service for the Twisted plugin.""" | 63 | """Create a service for the Twisted plugin.""" |
1225 | @@ -131,6 +140,10 @@ | |||
1226 | 131 | import crochet | 140 | import crochet |
1227 | 132 | crochet.no_setup() | 141 | crochet.no_setup() |
1228 | 133 | 142 | ||
1229 | 143 | def _configurePoolSize(self): | ||
1230 | 144 | threadpool = reactor.getThreadPool() | ||
1231 | 145 | threadpool.adjustPoolsize(10, MAX_THREADS) | ||
1232 | 146 | |||
1233 | 134 | def _makeIntrospectionService(self, endpoint): | 147 | def _makeIntrospectionService(self, endpoint): |
1234 | 135 | from provisioningserver.utils import introspect | 148 | from provisioningserver.utils import introspect |
1235 | 136 | introspect_service = ( | 149 | introspect_service = ( |
1236 | @@ -149,6 +162,7 @@ | |||
1237 | 149 | self._checkDatabase() | 162 | self._checkDatabase() |
1238 | 150 | self._configureReactor() | 163 | self._configureReactor() |
1239 | 151 | self._configureCrochet() | 164 | self._configureCrochet() |
1240 | 165 | self._configurePoolSize() | ||
1241 | 152 | 166 | ||
1242 | 153 | # Populate the region's event-loop with services. | 167 | # Populate the region's event-loop with services. |
1243 | 154 | from maasserver import eventloop | 168 | from maasserver import eventloop |
1244 | 155 | 169 | ||
1245 | === modified file 'src/maasserver/rpc/nodes.py' | |||
1246 | --- src/maasserver/rpc/nodes.py 2015-09-15 21:05:28 +0000 | |||
1247 | +++ src/maasserver/rpc/nodes.py 2015-09-25 14:32:35 +0000 | |||
1248 | @@ -71,6 +71,7 @@ | |||
1249 | 71 | 71 | ||
1250 | 72 | :return: A generator yielding `dict`s. | 72 | :return: A generator yielding `dict`s. |
1251 | 73 | """ | 73 | """ |
1252 | 74 | <<<<<<< TREE | ||
1253 | 74 | five_minutes_ago = now() - timedelta(minutes=5) | 75 | five_minutes_ago = now() - timedelta(minutes=5) |
1254 | 75 | 76 | ||
1255 | 76 | # This is meant to be temporary until all the power types support querying | 77 | # This is meant to be temporary until all the power types support querying |
1256 | @@ -99,6 +100,36 @@ | |||
1257 | 99 | power_info = node.get_effective_power_info() | 100 | power_info = node.get_effective_power_info() |
1258 | 100 | if power_info.power_type is not None: | 101 | if power_info.power_type is not None: |
1259 | 101 | yield { | 102 | yield { |
1260 | 103 | ======= | ||
1261 | 104 | five_minutes_ago = now() - timedelta(minutes=5) | ||
1262 | 105 | |||
1263 | 106 | # This is meant to be temporary until all the power types support querying | ||
1264 | 107 | # the power state of a node. See the definition of QUERY_POWER_TYPES for | ||
1265 | 108 | # more information. | ||
1266 | 109 | from provisioningserver.rpc.power import QUERY_POWER_TYPES | ||
1267 | 110 | |||
1268 | 111 | nodes_unchecked = ( | ||
1269 | 112 | nodes | ||
1270 | 113 | .filter(power_state_updated=None) | ||
1271 | 114 | .filter(power_type__in=QUERY_POWER_TYPES) | ||
1272 | 115 | .exclude(status=NODE_STATUS.BROKEN) | ||
1273 | 116 | .exclude(installable=False) | ||
1274 | 117 | ) | ||
1275 | 118 | nodes_checked = ( | ||
1276 | 119 | nodes | ||
1277 | 120 | .exclude(power_state_updated=None) | ||
1278 | 121 | .exclude(power_state_updated__gt=five_minutes_ago) | ||
1279 | 122 | .filter(power_type__in=QUERY_POWER_TYPES) | ||
1280 | 123 | .exclude(status=NODE_STATUS.BROKEN) | ||
1281 | 124 | .exclude(installable=False) | ||
1282 | 125 | .order_by("power_state_updated", "system_id") | ||
1283 | 126 | ) | ||
1284 | 127 | |||
1285 | 128 | for node in chain(nodes_unchecked, nodes_checked): | ||
1286 | 129 | power_info = node.get_effective_power_info() | ||
1287 | 130 | if power_info.power_type is not None: | ||
1288 | 131 | yield { | ||
1289 | 132 | >>>>>>> MERGE-SOURCE | ||
1290 | 102 | 'system_id': node.system_id, | 133 | 'system_id': node.system_id, |
1291 | 103 | 'hostname': node.hostname, | 134 | 'hostname': node.hostname, |
1292 | 104 | 'power_state': node.power_state, | 135 | 'power_state': node.power_state, |
1293 | 105 | 136 | ||
1294 | === modified file 'src/maasserver/rpc/tests/test_nodes.py' | |||
1295 | --- src/maasserver/rpc/tests/test_nodes.py 2015-08-29 01:42:44 +0000 | |||
1296 | +++ src/maasserver/rpc/tests/test_nodes.py 2015-09-25 14:32:35 +0000 | |||
1297 | @@ -22,11 +22,16 @@ | |||
1298 | 22 | from random import randint | 22 | from random import randint |
1299 | 23 | 23 | ||
1300 | 24 | from django.core.exceptions import ValidationError | 24 | from django.core.exceptions import ValidationError |
1301 | 25 | <<<<<<< TREE | ||
1302 | 25 | from maasserver.enum import ( | 26 | from maasserver.enum import ( |
1303 | 26 | INTERFACE_TYPE, | 27 | INTERFACE_TYPE, |
1304 | 27 | NODE_STATUS, | 28 | NODE_STATUS, |
1305 | 28 | ) | 29 | ) |
1306 | 29 | from maasserver.models.timestampedmodel import now | 30 | from maasserver.models.timestampedmodel import now |
1307 | 31 | ======= | ||
1308 | 32 | from maasserver.enum import NODE_STATUS | ||
1309 | 33 | from maasserver.models.timestampedmodel import now | ||
1310 | 34 | >>>>>>> MERGE-SOURCE | ||
1311 | 30 | from maasserver.rpc.nodes import ( | 35 | from maasserver.rpc.nodes import ( |
1312 | 31 | commission_node, | 36 | commission_node, |
1313 | 32 | create_node, | 37 | create_node, |
1314 | @@ -57,11 +62,17 @@ | |||
1315 | 57 | NodeStateViolation, | 62 | NodeStateViolation, |
1316 | 58 | NoSuchNode, | 63 | NoSuchNode, |
1317 | 59 | ) | 64 | ) |
1318 | 65 | from provisioningserver.rpc.power import QUERY_POWER_TYPES | ||
1319 | 60 | from simplejson import dumps | 66 | from simplejson import dumps |
1320 | 61 | from testtools import ExpectedException | 67 | from testtools import ExpectedException |
1321 | 62 | from testtools.matchers import ( | 68 | from testtools.matchers import ( |
1322 | 63 | Contains, | 69 | Contains, |
1324 | 64 | GreaterThan, | 70 | <<<<<<< TREE |
1325 | 71 | GreaterThan, | ||
1326 | 72 | ======= | ||
1327 | 73 | Equals, | ||
1328 | 74 | GreaterThan, | ||
1329 | 75 | >>>>>>> MERGE-SOURCE | ||
1330 | 65 | Is, | 76 | Is, |
1331 | 66 | LessThan, | 77 | LessThan, |
1332 | 67 | Not, | 78 | Not, |
1333 | 68 | 79 | ||
1334 | === modified file 'src/maasserver/rpc/tests/test_regionservice.py' | |||
1335 | --- src/maasserver/rpc/tests/test_regionservice.py 2015-09-16 11:18:09 +0000 | |||
1336 | +++ src/maasserver/rpc/tests/test_regionservice.py 2015-09-25 14:32:35 +0000 | |||
1337 | @@ -112,6 +112,7 @@ | |||
1338 | 112 | NoSuchNode, | 112 | NoSuchNode, |
1339 | 113 | ) | 113 | ) |
1340 | 114 | from provisioningserver.rpc.interfaces import IConnection | 114 | from provisioningserver.rpc.interfaces import IConnection |
1341 | 115 | from provisioningserver.rpc.power import QUERY_POWER_TYPES | ||
1342 | 115 | from provisioningserver.rpc.region import ( | 116 | from provisioningserver.rpc.region import ( |
1343 | 116 | Authenticate, | 117 | Authenticate, |
1344 | 117 | CommissionNode, | 118 | CommissionNode, |
1345 | @@ -663,11 +664,19 @@ | |||
1346 | 663 | nodegroup = yield deferToDatabase(self.create_nodegroup) | 664 | nodegroup = yield deferToDatabase(self.create_nodegroup) |
1347 | 664 | nodes = [] | 665 | nodes = [] |
1348 | 665 | for _ in range(3): | 666 | for _ in range(3): |
1349 | 667 | <<<<<<< TREE | ||
1350 | 666 | node = yield deferToDatabase( | 668 | node = yield deferToDatabase( |
1351 | 667 | self.create_node, nodegroup, | 669 | self.create_node, nodegroup, |
1352 | 668 | power_type=random.choice(QUERY_POWER_TYPES), | 670 | power_type=random.choice(QUERY_POWER_TYPES), |
1353 | 669 | power_state_updated=None) | 671 | power_state_updated=None) |
1354 | 670 | power_params = yield deferToDatabase( | 672 | power_params = yield deferToDatabase( |
1355 | 673 | ======= | ||
1356 | 674 | node = yield deferToThread( | ||
1357 | 675 | self.create_node, nodegroup, | ||
1358 | 676 | power_type=random.choice(QUERY_POWER_TYPES), | ||
1359 | 677 | power_state_updated=None) | ||
1360 | 678 | power_params = yield deferToThread( | ||
1361 | 679 | >>>>>>> MERGE-SOURCE | ||
1362 | 671 | self.get_node_power_parameters, node) | 680 | self.get_node_power_parameters, node) |
1363 | 672 | nodes.append({ | 681 | nodes.append({ |
1364 | 673 | 'system_id': node.system_id, | 682 | 'system_id': node.system_id, |
1365 | @@ -679,9 +688,15 @@ | |||
1366 | 679 | 688 | ||
1367 | 680 | # Create a node with an invalid power type (i.e. the empty string). | 689 | # Create a node with an invalid power type (i.e. the empty string). |
1368 | 681 | # This will not be reported by the call to ListNodePowerParameters. | 690 | # This will not be reported by the call to ListNodePowerParameters. |
1369 | 691 | <<<<<<< TREE | ||
1370 | 682 | yield deferToDatabase( | 692 | yield deferToDatabase( |
1371 | 683 | self.create_node, nodegroup, power_type="", | 693 | self.create_node, nodegroup, power_type="", |
1372 | 684 | power_state_updated=None) | 694 | power_state_updated=None) |
1373 | 695 | ======= | ||
1374 | 696 | yield deferToThread( | ||
1375 | 697 | self.create_node, nodegroup, power_type="", | ||
1376 | 698 | power_state_updated=None) | ||
1377 | 699 | >>>>>>> MERGE-SOURCE | ||
1378 | 685 | 700 | ||
1379 | 686 | response = yield call_responder( | 701 | response = yield call_responder( |
1380 | 687 | Region(), ListNodePowerParameters, | 702 | Region(), ListNodePowerParameters, |
1381 | 688 | 703 | ||
1382 | === modified file 'src/maasserver/static/css/maas-styles.css' | |||
1383 | --- src/maasserver/static/css/maas-styles.css 2015-09-23 22:21:35 +0000 | |||
1384 | +++ src/maasserver/static/css/maas-styles.css 2015-09-25 14:32:35 +0000 | |||
1385 | @@ -1,1 +1,5 @@ | |||
1386 | 1 | <<<<<<< TREE | ||
1387 | 1 | .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.woff2") format("woff2"),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.woff2") format("woff2"),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.woff2") format("woff2"),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:#fff;border:1px solid #b2b2b2;background:#eee}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:#EEE}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 .suggestion-list{background:#FFF;padding:10px 8px;border:1px solid #D2D2D2;border-top:0;border-radius:0 0 2px 2px;display:none}tags-input .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:''}.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{max-width:14.4px;width:100%}.table__column--2{max-width:28.8px;width:100%}.table__column--3{max-width:43.2px;width:100%}.table__column--4{max-width:57.6px;width:100%}.table__column--5{max-width:72px;width:100%}.table__column--6{max-width:86.4px;width:100%}.table__column--7{max-width:100.8px;width:100%}.table__column--8{max-width:115.2px;width:100%}.table__column--9{max-width:129.6px;width:100%}.table__column--10{max-width:144px;width:100%}.table__column--11{max-width:158.4px;width:100%}.table__column--12{max-width:172.8px;width:100%}.table__column--13{max-width:187.2px;width:100%}.table__column--14{max-width:201.6px;width:100%}.table__column--15{max-width:216px;width:100%}.table__column--16{max-width:230.4px;width:100%}.table__column--17{max-width:244.8px;width:100%}.table__column--18{max-width:259.2px;width:100%}.table__column--19{max-width:273.6px;width:100%}.table__column--20{max-width:288px;width:100%}.table__column--21{max-width:302.4px;width:100%}.table__column--22{max-width:316.8px;width:100%}.table__column--23{max-width:331.2px;width:100%}.table__column--24{max-width:345.6px;width:100%}.table__column--25{max-width:360px;width:100%}.table__column--26{max-width:374.4px;width:100%}.table__column--27{max-width:388.8px;width:100%}.table__column--28{max-width:403.2px;width:100%}.table__column--29{max-width:417.6px;width:100%}.table__column--30{max-width:432px;width:100%}.table__column--31{max-width:446.4px;width:100%}.table__column--32{max-width:460.8px;width:100%}.table__column--33{max-width:475.2px;width:100%}.table__column--34{max-width:489.6px;width:100%}.table__column--35{max-width:504px;width:100%}.table__column--36{max-width:518.4px;width:100%}.table__column--37{max-width:532.8px;width:100%}.table__column--38{max-width:547.2px;width:100%}.table__column--39{max-width:561.6px;width:100%}.table__column--40{max-width:576px;width:100%}.table__column--41{max-width:590.4px;width:100%}.table__column--42{max-width:604.8px;width:100%}.table__column--43{max-width:619.2px;width:100%}.table__column--44{max-width:633.6px;width:100%}.table__column--45{max-width:648px;width:100%}.table__column--46{max-width:662.4px;width:100%}.table__column--47{max-width:676.8px;width:100%}.table__column--48{max-width:691.2px;width:100%}.table__column--49{max-width:705.6px;width:100%}.table__column--50{max-width:720px;width:100%}.table__column--51{max-width:734.4px;width:100%}.table__column--52{max-width:748.8px;width:100%}.table__column--53{max-width:763.2px;width:100%}.table__column--54{max-width:777.6px;width:100%}.table__column--55{max-width:792px;width:100%}.table__column--56{max-width:806.4px;width:100%}.table__column--57{max-width:820.8px;width:100%}.table__column--58{max-width:835.2px;width:100%}.table__column--59{max-width:849.6px;width:100%}.table__column--60{max-width:864px;width:100%}.table__column--61{max-width:878.4px;width:100%}.table__column--62{max-width:892.8px;width:100%}.table__column--63{max-width:907.2px;width:100%}.table__column--64{max-width:921.6px;width:100%}.table__column--65{max-width:936px;width:100%}.table__column--66{max-width:950.4px;width:100%}.table__column--67{max-width:964.8px;width:100%}.table__column--68{max-width:979.2px;width:100%}.table__column--69{max-width:993.6px;width:100%}.table__column--70{max-width:1008px;width:100%}.table__column--71{max-width:1022.4px;width:100%}.table__column--72{max-width:1036.8px;width:100%}.table__column--73{max-width:1051.2px;width:100%}.table__column--74{max-width:1065.6px;width:100%}.table__column--75{max-width:1080px;width:100%}.table__column--76{max-width:1094.4px;width:100%}.table__column--77{max-width:1108.8px;width:100%}.table__column--78{max-width:1123.2px;width:100%}.table__column--79{max-width:1137.6px;width:100%}.table__column--80{max-width:1152px;width:100%}.table__column--81{max-width:1166.4px;width:100%}.table__column--82{max-width:1180.8px;width:100%}.table__column--83{max-width:1195.2px;width:100%}.table__column--84{max-width:1209.6px;width:100%}.table__column--85{max-width:1224px;width:100%}.table__column--86{max-width:1238.4px;width:100%}.table__column--87{max-width:1252.8px;width:100%}.table__column--88{max-width:1267.2px;width:100%}.table__column--89{max-width:1281.6px;width:100%}.table__column--90{max-width:1296px;width:100%}.table__column--91{max-width:1310.4px;width:100%}.table__column--92{max-width:1324.8px;width:100%}.table__column--93{max-width:1339.2px;width:100%}.table__column--94{max-width:1353.6px;width:100%}.table__column--95{max-width:1368px;width:100%}.table__column--96{max-width:1382.4px;width:100%}.table__column--97{max-width:1396.8px;width:100%}.table__column--98{max-width:1411.2px;width:100%}.table__column--99{max-width:1425.6px;width:100%}.table__column--100{max-width:1440px;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__controls{z-index:1;opacity:1}.table .table__row:hover .table__controls--secondary{z-index:1;opacity:1}.table .table__row.active{background-color:#FFF}.table .table__row.active:hover .table__input{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px}.table .table__row.active:hover .table__input.editible{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.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__header,.table .table__data{font-size:16px;display:table-cell;padding:13px 10px;box-sizing:border-box;min-height:21px;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__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.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-bottom:14px}.table ul li:last-of-type{margin-bottom:0}.table .table__dropdown{width:100%}.table .table__dropdown .table__dropdown-row{border-bottom:0;position:relative}.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 .table__row{border-bottom:0}.table .table__dropdown--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}.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;overflow:hidden;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")}.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;padding-top:20px}.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--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}.margin-left--ten{margin-left:10px !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-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}.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 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} | 2 | .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.woff2") format("woff2"),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.woff2") format("woff2"),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.woff2") format("woff2"),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:#fff;border:1px solid #b2b2b2;background:#eee}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:#EEE}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 .suggestion-list{background:#FFF;padding:10px 8px;border:1px solid #D2D2D2;border-top:0;border-radius:0 0 2px 2px;display:none}tags-input .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:''}.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{max-width:14.4px;width:100%}.table__column--2{max-width:28.8px;width:100%}.table__column--3{max-width:43.2px;width:100%}.table__column--4{max-width:57.6px;width:100%}.table__column--5{max-width:72px;width:100%}.table__column--6{max-width:86.4px;width:100%}.table__column--7{max-width:100.8px;width:100%}.table__column--8{max-width:115.2px;width:100%}.table__column--9{max-width:129.6px;width:100%}.table__column--10{max-width:144px;width:100%}.table__column--11{max-width:158.4px;width:100%}.table__column--12{max-width:172.8px;width:100%}.table__column--13{max-width:187.2px;width:100%}.table__column--14{max-width:201.6px;width:100%}.table__column--15{max-width:216px;width:100%}.table__column--16{max-width:230.4px;width:100%}.table__column--17{max-width:244.8px;width:100%}.table__column--18{max-width:259.2px;width:100%}.table__column--19{max-width:273.6px;width:100%}.table__column--20{max-width:288px;width:100%}.table__column--21{max-width:302.4px;width:100%}.table__column--22{max-width:316.8px;width:100%}.table__column--23{max-width:331.2px;width:100%}.table__column--24{max-width:345.6px;width:100%}.table__column--25{max-width:360px;width:100%}.table__column--26{max-width:374.4px;width:100%}.table__column--27{max-width:388.8px;width:100%}.table__column--28{max-width:403.2px;width:100%}.table__column--29{max-width:417.6px;width:100%}.table__column--30{max-width:432px;width:100%}.table__column--31{max-width:446.4px;width:100%}.table__column--32{max-width:460.8px;width:100%}.table__column--33{max-width:475.2px;width:100%}.table__column--34{max-width:489.6px;width:100%}.table__column--35{max-width:504px;width:100%}.table__column--36{max-width:518.4px;width:100%}.table__column--37{max-width:532.8px;width:100%}.table__column--38{max-width:547.2px;width:100%}.table__column--39{max-width:561.6px;width:100%}.table__column--40{max-width:576px;width:100%}.table__column--41{max-width:590.4px;width:100%}.table__column--42{max-width:604.8px;width:100%}.table__column--43{max-width:619.2px;width:100%}.table__column--44{max-width:633.6px;width:100%}.table__column--45{max-width:648px;width:100%}.table__column--46{max-width:662.4px;width:100%}.table__column--47{max-width:676.8px;width:100%}.table__column--48{max-width:691.2px;width:100%}.table__column--49{max-width:705.6px;width:100%}.table__column--50{max-width:720px;width:100%}.table__column--51{max-width:734.4px;width:100%}.table__column--52{max-width:748.8px;width:100%}.table__column--53{max-width:763.2px;width:100%}.table__column--54{max-width:777.6px;width:100%}.table__column--55{max-width:792px;width:100%}.table__column--56{max-width:806.4px;width:100%}.table__column--57{max-width:820.8px;width:100%}.table__column--58{max-width:835.2px;width:100%}.table__column--59{max-width:849.6px;width:100%}.table__column--60{max-width:864px;width:100%}.table__column--61{max-width:878.4px;width:100%}.table__column--62{max-width:892.8px;width:100%}.table__column--63{max-width:907.2px;width:100%}.table__column--64{max-width:921.6px;width:100%}.table__column--65{max-width:936px;width:100%}.table__column--66{max-width:950.4px;width:100%}.table__column--67{max-width:964.8px;width:100%}.table__column--68{max-width:979.2px;width:100%}.table__column--69{max-width:993.6px;width:100%}.table__column--70{max-width:1008px;width:100%}.table__column--71{max-width:1022.4px;width:100%}.table__column--72{max-width:1036.8px;width:100%}.table__column--73{max-width:1051.2px;width:100%}.table__column--74{max-width:1065.6px;width:100%}.table__column--75{max-width:1080px;width:100%}.table__column--76{max-width:1094.4px;width:100%}.table__column--77{max-width:1108.8px;width:100%}.table__column--78{max-width:1123.2px;width:100%}.table__column--79{max-width:1137.6px;width:100%}.table__column--80{max-width:1152px;width:100%}.table__column--81{max-width:1166.4px;width:100%}.table__column--82{max-width:1180.8px;width:100%}.table__column--83{max-width:1195.2px;width:100%}.table__column--84{max-width:1209.6px;width:100%}.table__column--85{max-width:1224px;width:100%}.table__column--86{max-width:1238.4px;width:100%}.table__column--87{max-width:1252.8px;width:100%}.table__column--88{max-width:1267.2px;width:100%}.table__column--89{max-width:1281.6px;width:100%}.table__column--90{max-width:1296px;width:100%}.table__column--91{max-width:1310.4px;width:100%}.table__column--92{max-width:1324.8px;width:100%}.table__column--93{max-width:1339.2px;width:100%}.table__column--94{max-width:1353.6px;width:100%}.table__column--95{max-width:1368px;width:100%}.table__column--96{max-width:1382.4px;width:100%}.table__column--97{max-width:1396.8px;width:100%}.table__column--98{max-width:1411.2px;width:100%}.table__column--99{max-width:1425.6px;width:100%}.table__column--100{max-width:1440px;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__controls{z-index:1;opacity:1}.table .table__row:hover .table__controls--secondary{z-index:1;opacity:1}.table .table__row.active{background-color:#FFF}.table .table__row.active:hover .table__input{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px}.table .table__row.active:hover .table__input.editible{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.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__header,.table .table__data{font-size:16px;display:table-cell;padding:13px 10px;box-sizing:border-box;min-height:21px;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__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.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-bottom:14px}.table ul li:last-of-type{margin-bottom:0}.table .table__dropdown{width:100%}.table .table__dropdown .table__dropdown-row{border-bottom:0;position:relative}.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 .table__row{border-bottom:0}.table .table__dropdown--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}.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;overflow:hidden;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")}.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;padding-top:20px}.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--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}.margin-left--ten{margin-left:10px !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-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}.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 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} |
1388 | 3 | ======= | ||
1389 | 4 | .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.woff2") format("woff2"),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.woff2") format("woff2"),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.woff2") format("woff2"),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:#fff;border:1px solid #b2b2b2;background:#eee}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:#EEE}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:#dd4814}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 7px 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[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:10px}.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 .suggestion-list{background:#FFF;padding:10px 8px;border:1px solid #D2D2D2;border-top:0;border-radius:0 0 2px 2px;display:none}tags-input .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:''}.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%}.t5{width:5%}.t10{width:10%}.t12{width:12.5%}.t15{width:15%}.t19{width:19%}.t20{width:20%}.t24{width:24%}.t25{width:25%}.t30{width:30%}.t33{width:33.333%}.t35{width:35%}.t37{width:37.5%}.t40{width:40%}.t45{width:45%}.t50{width:50%}.t55{width:55%}.t60{width:60%}.t62{width:62.5%}.t65{width:65%}.t66{width:66.666%}.t70{width:70%}.t75{width:75%}.t80{width:80%}.t85{width:85%}.t87{width:87.5%}.t90{width:90%}.t95{width:95%}#commissioning_scripts .script-content.slider{overflow:hidden}#commissioning_scripts .script-content.slider pre{margin-top:20px}h1 span,h2 span,h3 span,h4 span,h5 span{color:#888;font-size:75%;padding-left:20px}pre{border:0;background-color:#FFF;border-radius:2px}.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;overflow:hidden;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/cross.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}.clear{clear:both}.hidden{display:none}.align-right{text-align:right}.align-center{text-align:center}.align-left{text-align:left}.border{border-top:1px dotted #B2B2B2;padding-top:20px}.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--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}.padding-top{padding-top:20px}.padding-right{padding-right:20px}.padding-bottom{padding-bottom:20px}.padding-left{padding-left:20px}.border-top{border-top:1px dotted #888}.add-machine__list .add-machine__details,.border-bottom{border-bottom:1px dotted #888}.no-padding{padding:0}.no-padding-left{padding-left:0}.no-margin-bottom{margin-bottom:0}.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 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} | ||
1390 | 5 | >>>>>>> MERGE-SOURCE | ||
1391 | 2 | 6 | ||
1392 | === added file 'src/maasserver/static/img/icons/tag-close.svg' | |||
1393 | --- src/maasserver/static/img/icons/tag-close.svg 1970-01-01 00:00:00 +0000 | |||
1394 | +++ src/maasserver/static/img/icons/tag-close.svg 2015-09-25 14:32:35 +0000 | |||
1395 | @@ -0,0 +1,18 @@ | |||
1396 | 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
1397 | 2 | <svg width="11px" height="10px" viewBox="0 0 11 10" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"> | ||
1398 | 3 | <!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch --> | ||
1399 | 4 | <title>Imported Layers Copy</title> | ||
1400 | 5 | <desc>Created with Sketch.</desc> | ||
1401 | 6 | <defs></defs> | ||
1402 | 7 | <g id="Machine-details" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage"> | ||
1403 | 8 | <g id="06-maas-machine-details-copy-7" sketch:type="MSArtboardGroup" transform="translate(-390.000000, -456.000000)" stroke="#888888" stroke-width="3" stroke-linejoin="round"> | ||
1404 | 9 | <g id="tags" sketch:type="MSLayerGroup" transform="translate(0.000000, 50.000000)"> | ||
1405 | 10 | <g id="field" transform="translate(300.000000, 393.000000)" sketch:type="MSShapeGroup"> | ||
1406 | 11 | <g id="production-tag" transform="translate(0.000000, 9.000000)"> | ||
1407 | 12 | <path d="M92,5 L100,13 M100,5 L92,13" id="Imported-Layers-Copy"></path> | ||
1408 | 13 | </g> | ||
1409 | 14 | </g> | ||
1410 | 15 | </g> | ||
1411 | 16 | </g> | ||
1412 | 17 | </g> | ||
1413 | 18 | </svg> | ||
1414 | 0 | \ No newline at end of file | 19 | \ No newline at end of file |
1415 | 1 | 20 | ||
1416 | === modified file 'src/maasserver/static/partials/node-details.html' | |||
1417 | --- src/maasserver/static/partials/node-details.html 2015-09-24 17:13:07 +0000 | |||
1418 | +++ src/maasserver/static/partials/node-details.html 2015-09-25 14:32:35 +0000 | |||
1419 | @@ -166,6 +166,7 @@ | |||
1420 | 166 | </select> | 166 | </select> |
1421 | 167 | </div> | 167 | </div> |
1422 | 168 | </div> | 168 | </div> |
1423 | 169 | <<<<<<< TREE | ||
1424 | 169 | <div class="inline"> | 170 | <div class="inline"> |
1425 | 170 | <label for="min_hwe_kernel" class="two-col">Minimum Kernel</label> | 171 | <label for="min_hwe_kernel" class="two-col">Minimum Kernel</label> |
1426 | 171 | <div class="three-col"> | 172 | <div class="three-col"> |
1427 | @@ -178,6 +179,9 @@ | |||
1428 | 178 | </div> | 179 | </div> |
1429 | 179 | </div> | 180 | </div> |
1430 | 180 | <dl class="margin-top--ten"> | 181 | <dl class="margin-top--ten"> |
1431 | 182 | ======= | ||
1432 | 183 | <dl class="margin-top--ten"> | ||
1433 | 184 | >>>>>>> MERGE-SOURCE | ||
1434 | 181 | <dt class="two-col">Owner</dt> | 185 | <dt class="two-col">Owner</dt> |
1435 | 182 | <dd class="four-col last-col"> | 186 | <dd class="four-col last-col"> |
1436 | 183 | {$ node.owner || "Unassigned" $} | 187 | {$ node.owner || "Unassigned" $} |
1437 | @@ -896,6 +900,7 @@ | |||
1438 | 896 | <h4> | 900 | <h4> |
1439 | 897 | No storage information. Commissioning this node will gather the storage information. | 901 | No storage information. Commissioning this node will gather the storage information. |
1440 | 898 | </h4> | 902 | </h4> |
1441 | 903 | <<<<<<< TREE | ||
1442 | 899 | </div> | 904 | </div> |
1443 | 900 | <div class="twelve-col padding-bottom"> | 905 | <div class="twelve-col padding-bottom"> |
1444 | 901 | <h4>File System</h4> | 906 | <h4>File System</h4> |
1445 | @@ -1526,6 +1531,57 @@ | |||
1446 | 1526 | </div> | 1531 | </div> |
1447 | 1527 | </div> | 1532 | </div> |
1448 | 1528 | --> | 1533 | --> |
1449 | 1534 | ======= | ||
1450 | 1535 | <table class="table-listing ng-hide" data-ng-show="storage.physicalDisks.length"> | ||
1451 | 1536 | <thead> | ||
1452 | 1537 | <tr> | ||
1453 | 1538 | <th class="t20">Name</th> | ||
1454 | 1539 | <th class="t25">Path</th> | ||
1455 | 1540 | <th class="t10">Size (GB)</th> | ||
1456 | 1541 | <th class="table-listing__header" class="t25" colspan="2"> | ||
1457 | 1542 | <!-- XXX blake_r 2015-02-18 - Need to add e2e test. --> | ||
1458 | 1543 | <a class="table-listing__header-link" href="" data-ng-click="storage.column = 'model'" data-ng-class="{active: storage.column === 'model'}"> | ||
1459 | 1544 | Model | ||
1460 | 1545 | </a> | ||
1461 | 1546 | <span class="divide"></span> | ||
1462 | 1547 | <a class="table-listing__header-link" href="" data-ng-click="storage.column = 'serial'" data-ng-class="{active: storage.column === 'serial'}"> | ||
1463 | 1548 | Serial | ||
1464 | 1549 | </a> | ||
1465 | 1550 | </th> | ||
1466 | 1551 | <th class="t20">Tags</th> | ||
1467 | 1552 | </tr> | ||
1468 | 1553 | </thead> | ||
1469 | 1554 | <tbody> | ||
1470 | 1555 | <tr class="table-listing__row" data-ng-repeat="disk in storage.physicalDisks"> | ||
1471 | 1556 | <td class="t20">{$ disk.name $}</td> | ||
1472 | 1557 | <td class="t25">{$ disk.path $}</td> | ||
1473 | 1558 | <td class="t10">{$ disk.size_gb $}</td> | ||
1474 | 1559 | <td class="t25" colspan="2" data-ng-show="storage.column === 'model'">{$ disk.model $}</td> | ||
1475 | 1560 | <td class="t25 ng-hide" colspan="2" data-ng-show="storage.column === 'serial'">{$ disk.serial $}</td> | ||
1476 | 1561 | <td class="t20"> | ||
1477 | 1562 | <span class="tag-link" data-ng-repeat="tag in disk.tags" data-ng-hide="storage.editing"> | ||
1478 | 1563 | <a href="#/nodes/?query=storage_tags:({$ tag.text $})">{$ tag.text $}</a> | ||
1479 | 1564 | </span> | ||
1480 | 1565 | <tags-input ng-model="disk.tags" | ||
1481 | 1566 | data-ng-show="storage.editing" allowed-tags-pattern="[\w-]+"> | ||
1482 | 1567 | </tags-input> | ||
1483 | 1568 | </td> | ||
1484 | 1569 | </tr> | ||
1485 | 1570 | </tbody> | ||
1486 | 1571 | </table> | ||
1487 | 1572 | </div> | ||
1488 | 1573 | <div class="controls" data-ng-show="storage.physicalDisks.length && !storage.editing"> | ||
1489 | 1574 | <a href="" class="link-cta-ubuntu secondary" | ||
1490 | 1575 | data-ng-show="canEdit()" | ||
1491 | 1576 | data-ng-click="editStorage()">Edit</a> | ||
1492 | 1577 | </div> | ||
1493 | 1578 | <div class="controls ng-hide" data-ng-show="storage.editing"> | ||
1494 | 1579 | <a href="" class="link-cta-ubuntu clear" | ||
1495 | 1580 | data-ng-click="cancelEditStorage()">Cancel</a> | ||
1496 | 1581 | <button class="cta-ubuntu" | ||
1497 | 1582 | data-ng-click="saveEditStorage()">Save changes</button> | ||
1498 | 1583 | </div> | ||
1499 | 1584 | >>>>>>> MERGE-SOURCE | ||
1500 | 1529 | </form> | 1585 | </form> |
1501 | 1530 | </div> | 1586 | </div> |
1502 | 1531 | </div> | 1587 | </div> |
1503 | @@ -1539,8 +1595,14 @@ | |||
1504 | 1539 | <table class="table-listing no-hover" data-ng-show="node.events.length"> | 1595 | <table class="table-listing no-hover" data-ng-show="node.events.length"> |
1505 | 1540 | <thead> | 1596 | <thead> |
1506 | 1541 | <tr class="table-listing__row"> | 1597 | <tr class="table-listing__row"> |
1507 | 1598 | <<<<<<< TREE | ||
1508 | 1542 | <th class="t80" colspan="2">Event</th> | 1599 | <th class="t80" colspan="2">Event</th> |
1509 | 1543 | <th class="t20">Time</th> | 1600 | <th class="t20">Time</th> |
1510 | 1601 | ======= | ||
1511 | 1602 | <th class="t1"></th> | ||
1512 | 1603 | <th class="t75" colspan="2">Event</th> | ||
1513 | 1604 | <th class="t24">Time</th> | ||
1514 | 1605 | >>>>>>> MERGE-SOURCE | ||
1515 | 1544 | </tr> | 1606 | </tr> |
1516 | 1545 | </thead> | 1607 | </thead> |
1517 | 1546 | <tbody> | 1608 | <tbody> |
1518 | @@ -1549,8 +1611,13 @@ | |||
1519 | 1549 | <td class="t1 no-padding-right no-padding-left"> | 1611 | <td class="t1 no-padding-right no-padding-left"> |
1520 | 1550 | <span class="icon {$ event.type.level $}"></span> | 1612 | <span class="icon {$ event.type.level $}"></span> |
1521 | 1551 | </td> | 1613 | </td> |
1522 | 1614 | <<<<<<< TREE | ||
1523 | 1552 | <td class="t79">{$ getEventText(event) $}</td> | 1615 | <td class="t79">{$ getEventText(event) $}</td> |
1524 | 1553 | <td class="t20">{$ event.created $}</td> | 1616 | <td class="t20">{$ event.created $}</td> |
1525 | 1617 | ======= | ||
1526 | 1618 | <td class="t75">{$ getEventText(event) $}</td> | ||
1527 | 1619 | <td class="t24 align-right">{$ event.created $}</td> | ||
1528 | 1620 | >>>>>>> MERGE-SOURCE | ||
1529 | 1554 | </tr> | 1621 | </tr> |
1530 | 1555 | </tbody> | 1622 | </tbody> |
1531 | 1556 | </table> | 1623 | </table> |
1532 | 1557 | 1624 | ||
1533 | === modified file 'src/maasserver/static/partials/node-events.html' | |||
1534 | --- src/maasserver/static/partials/node-events.html 2015-08-10 10:03:04 +0000 | |||
1535 | +++ src/maasserver/static/partials/node-events.html 2015-09-25 14:32:35 +0000 | |||
1536 | @@ -45,7 +45,11 @@ | |||
1537 | 45 | <td class="t79"> | 45 | <td class="t79"> |
1538 | 46 | {$ getEventText(event) $} | 46 | {$ getEventText(event) $} |
1539 | 47 | </td> | 47 | </td> |
1540 | 48 | <<<<<<< TREE | ||
1541 | 48 | <td class="t20"> | 49 | <td class="t20"> |
1542 | 50 | ======= | ||
1543 | 51 | <td class="t24 align-right"> | ||
1544 | 52 | >>>>>>> MERGE-SOURCE | ||
1545 | 49 | {$ event.created $} | 53 | {$ event.created $} |
1546 | 50 | </td> | 54 | </td> |
1547 | 51 | </tr> | 55 | </tr> |
1548 | 52 | 56 | ||
1549 | === modified file 'src/maasserver/static/partials/nodes-list.html' | |||
1550 | --- src/maasserver/static/partials/nodes-list.html 2015-09-24 16:44:04 +0000 | |||
1551 | +++ src/maasserver/static/partials/nodes-list.html 2015-09-25 14:32:35 +0000 | |||
1552 | @@ -153,6 +153,7 @@ | |||
1553 | 153 | data-ng-options="arch for arch in architectures"> | 153 | data-ng-options="arch for arch in architectures"> |
1554 | 154 | </select> | 154 | </select> |
1555 | 155 | </div> | 155 | </div> |
1556 | 156 | <<<<<<< TREE | ||
1557 | 156 | <div class="inline"> | 157 | <div class="inline"> |
1558 | 157 | <label for="min_hwe_kernel" class="two-col">Minimum Kernel</label> | 158 | <label for="min_hwe_kernel" class="two-col">Minimum Kernel</label> |
1559 | 158 | <select name="min_hwe_kernel" id="min_hwe_kernel" class="three-col" placeholder="No minimum kernel" | 159 | <select name="min_hwe_kernel" id="min_hwe_kernel" class="three-col" placeholder="No minimum kernel" |
1560 | @@ -168,6 +169,15 @@ | |||
1561 | 168 | data-ng-options="zone as zone.name for zone in zones"> | 169 | data-ng-options="zone as zone.name for zone in zones"> |
1562 | 169 | </select> | 170 | </select> |
1563 | 170 | </div> | 171 | </div> |
1564 | 172 | ======= | ||
1565 | 173 | <div class="inline"> | ||
1566 | 174 | <label for="zone" class="two-col">Zone</label> | ||
1567 | 175 | <select name="zone" id="zone" class="three-col" placeholder="Choose a zone" | ||
1568 | 176 | data-ng-model="machine.zone" | ||
1569 | 177 | data-ng-options="zone as zone.name for zone in zones"> | ||
1570 | 178 | </select> | ||
1571 | 179 | </div> | ||
1572 | 180 | >>>>>>> MERGE-SOURCE | ||
1573 | 171 | <div class="inline five-col" data-ng-repeat="mac in machine.macs"> | 181 | <div class="inline five-col" data-ng-repeat="mac in machine.macs"> |
1574 | 172 | {$ mac $} | 182 | {$ mac $} |
1575 | 173 | <label for="mac-address" class="two-col"><span data-ng-hide="mac !== machine.macs[0]">MAC Address</span></label> | 183 | <label for="mac-address" class="two-col"><span data-ng-hide="mac !== machine.macs[0]">MAC Address</span></label> |
1576 | 174 | 184 | ||
1577 | === modified file 'src/maasserver/static/scss/maas/components/_accordion.scss' | |||
1578 | === modified file 'src/maasserver/static/scss/maas/components/_button.scss' | |||
1579 | === modified file 'src/maasserver/static/scss/maas/components/_forms.scss' | |||
1580 | === modified file 'src/maasserver/static/scss/maas/components/_placeholders.scss' | |||
1581 | --- src/maasserver/static/scss/maas/components/_placeholders.scss 2015-09-22 13:39:18 +0000 | |||
1582 | +++ src/maasserver/static/scss/maas/components/_placeholders.scss 2015-09-25 14:32:35 +0000 | |||
1583 | @@ -36,7 +36,11 @@ | |||
1584 | 36 | } | 36 | } |
1585 | 37 | 37 | ||
1586 | 38 | &.remove { | 38 | &.remove { |
1587 | 39 | <<<<<<< TREE | ||
1588 | 39 | background-image: url('../img/icons/filter-remove.svg'), none; | 40 | background-image: url('../img/icons/filter-remove.svg'), none; |
1589 | 41 | ======= | ||
1590 | 42 | background-image: url('../img/icons/cross.svg'), none; | ||
1591 | 43 | >>>>>>> MERGE-SOURCE | ||
1592 | 40 | } | 44 | } |
1593 | 41 | 45 | ||
1594 | 42 | &.warning { | 46 | &.warning { |
1595 | 43 | 47 | ||
1596 | === modified file 'src/maasserver/static/scss/maas/components/_tables.scss' | |||
1597 | === modified file 'src/maasserver/static/scss/maas/pages/_nodes.scss' | |||
1598 | === modified file 'src/maasserver/templates/maasserver/index.html' | |||
1599 | === modified file 'src/maasserver/testing/factory.py' | |||
1600 | --- src/maasserver/testing/factory.py 2015-09-23 20:58:24 +0000 | |||
1601 | +++ src/maasserver/testing/factory.py 2015-09-25 14:32:35 +0000 | |||
1602 | @@ -254,6 +254,7 @@ | |||
1603 | 254 | device.save() | 254 | device.save() |
1604 | 255 | return device | 255 | return device |
1605 | 256 | 256 | ||
1606 | 257 | <<<<<<< TREE | ||
1607 | 257 | def make_Node( | 258 | def make_Node( |
1608 | 258 | self, interface=False, hostname=None, status=None, | 259 | self, interface=False, hostname=None, status=None, |
1609 | 259 | architecture="i386/generic", min_hwe_kernel=None, hwe_kernel=None, | 260 | architecture="i386/generic", min_hwe_kernel=None, hwe_kernel=None, |
1610 | @@ -262,6 +263,15 @@ | |||
1611 | 262 | sortable_name=False, power_type=None, power_parameters=None, | 263 | sortable_name=False, power_type=None, power_parameters=None, |
1612 | 263 | power_state=None, power_state_updated=undefined, disable_ipv4=None, | 264 | power_state=None, power_state_updated=undefined, disable_ipv4=None, |
1613 | 264 | with_boot_disk=False, vlan=None, **kwargs): | 265 | with_boot_disk=False, vlan=None, **kwargs): |
1614 | 266 | ======= | ||
1615 | 267 | def make_Node( | ||
1616 | 268 | self, mac=False, hostname=None, status=None, | ||
1617 | 269 | architecture="i386/generic", installable=True, updated=None, | ||
1618 | 270 | created=None, nodegroup=None, routers=None, zone=None, | ||
1619 | 271 | networks=None, boot_type=None, sortable_name=False, | ||
1620 | 272 | power_type=None, power_parameters=None, power_state=None, | ||
1621 | 273 | power_state_updated=undefined, disable_ipv4=None, **kwargs): | ||
1622 | 274 | >>>>>>> MERGE-SOURCE | ||
1623 | 265 | """Make a :class:`Node`. | 275 | """Make a :class:`Node`. |
1624 | 266 | 276 | ||
1625 | 267 | :param sortable_name: If `True`, use a that will sort consistently | 277 | :param sortable_name: If `True`, use a that will sort consistently |
1626 | @@ -300,10 +310,17 @@ | |||
1627 | 300 | hostname=hostname, status=status, architecture=architecture, | 310 | hostname=hostname, status=status, architecture=architecture, |
1628 | 301 | min_hwe_kernel=min_hwe_kernel, hwe_kernel=hwe_kernel, | 311 | min_hwe_kernel=min_hwe_kernel, hwe_kernel=hwe_kernel, |
1629 | 302 | installable=installable, nodegroup=nodegroup, routers=routers, | 312 | installable=installable, nodegroup=nodegroup, routers=routers, |
1630 | 313 | <<<<<<< TREE | ||
1631 | 303 | zone=zone, boot_type=boot_type, power_type=power_type, | 314 | zone=zone, boot_type=boot_type, power_type=power_type, |
1632 | 304 | power_parameters=power_parameters, power_state=power_state, | 315 | power_parameters=power_parameters, power_state=power_state, |
1633 | 305 | power_state_updated=power_state_updated, disable_ipv4=disable_ipv4, | 316 | power_state_updated=power_state_updated, disable_ipv4=disable_ipv4, |
1634 | 306 | **kwargs) | 317 | **kwargs) |
1635 | 318 | ======= | ||
1636 | 319 | zone=zone, boot_type=boot_type, power_type=power_type, | ||
1637 | 320 | power_parameters=power_parameters, power_state=power_state, | ||
1638 | 321 | power_state_updated=power_state_updated, | ||
1639 | 322 | disable_ipv4=disable_ipv4, **kwargs) | ||
1640 | 323 | >>>>>>> MERGE-SOURCE | ||
1641 | 307 | self._save_node_unchecked(node) | 324 | self._save_node_unchecked(node) |
1642 | 308 | # We do not generate random networks by default because the limited | 325 | # We do not generate random networks by default because the limited |
1643 | 309 | # number of VLAN identifiers (4,094) makes it very likely to | 326 | # number of VLAN identifiers (4,094) makes it very likely to |
1644 | 310 | 327 | ||
1645 | === modified file 'src/maasserver/tests/test_fields.py' | |||
1646 | --- src/maasserver/tests/test_fields.py 2015-09-21 20:29:36 +0000 | |||
1647 | +++ src/maasserver/tests/test_fields.py 2015-09-25 14:32:35 +0000 | |||
1648 | @@ -526,6 +526,7 @@ | |||
1649 | 526 | field = LargeObjectField() | 526 | field = LargeObjectField() |
1650 | 527 | self.assertRaises( | 527 | self.assertRaises( |
1651 | 528 | AssertionError, field.to_python, factory.make_string()) | 528 | AssertionError, field.to_python, factory.make_string()) |
1652 | 529 | <<<<<<< TREE | ||
1653 | 529 | 530 | ||
1654 | 530 | 531 | ||
1655 | 531 | class TestCIDRField(TestModelMixin, MAASServerTestCase): | 532 | class TestCIDRField(TestModelMixin, MAASServerTestCase): |
1656 | @@ -610,3 +611,40 @@ | |||
1657 | 610 | def test_separators_dont_conflict_with_ipv6_address(self): | 611 | def test_separators_dont_conflict_with_ipv6_address(self): |
1658 | 611 | self.assertIsNone(re.search( | 612 | self.assertIsNone(re.search( |
1659 | 612 | IPListFormField.separators, factory.make_ipv6_address())) | 613 | IPListFormField.separators, factory.make_ipv6_address())) |
1660 | 614 | ======= | ||
1661 | 615 | |||
1662 | 616 | |||
1663 | 617 | class IPListFormFieldTest(MAASServerTestCase): | ||
1664 | 618 | |||
1665 | 619 | def test_accepts_none(self): | ||
1666 | 620 | self.assertIsNone(IPListFormField().clean(None)) | ||
1667 | 621 | |||
1668 | 622 | def test_accepts_single_ip(self): | ||
1669 | 623 | ip = factory.make_ip_address() | ||
1670 | 624 | self.assertEquals(ip, IPListFormField().clean(ip)) | ||
1671 | 625 | |||
1672 | 626 | def test_accepts_space_separated_ips(self): | ||
1673 | 627 | ips = [factory.make_ip_address() for _ in range(5)] | ||
1674 | 628 | input = ' '.join(ips) | ||
1675 | 629 | self.assertEquals(input, IPListFormField().clean(input)) | ||
1676 | 630 | |||
1677 | 631 | def test_accepts_comma_separated_ips(self): | ||
1678 | 632 | ips = [factory.make_ip_address() for _ in range(5)] | ||
1679 | 633 | input = ','.join(ips) | ||
1680 | 634 | self.assertEquals(' '.join(ips), IPListFormField().clean(input)) | ||
1681 | 635 | |||
1682 | 636 | def test_rejects_invalid_input(self): | ||
1683 | 637 | invalid = factory.make_name('invalid') | ||
1684 | 638 | input = ' '.join([factory.make_ip_address(), invalid]) | ||
1685 | 639 | error = self.assertRaises( | ||
1686 | 640 | ValidationError, IPListFormField().clean, input) | ||
1687 | 641 | self.assertIn("Invalid IP address: %s" % invalid, error.message) | ||
1688 | 642 | |||
1689 | 643 | def test_separators_dont_conflict_with_ipv4_address(self): | ||
1690 | 644 | self.assertIsNone(re.search( | ||
1691 | 645 | IPListFormField.separators, factory.make_ipv4_address())) | ||
1692 | 646 | |||
1693 | 647 | def test_separators_dont_conflict_with_ipv6_address(self): | ||
1694 | 648 | self.assertIsNone(re.search( | ||
1695 | 649 | IPListFormField.separators, factory.make_ipv6_address())) | ||
1696 | 650 | >>>>>>> MERGE-SOURCE | ||
1697 | 613 | 651 | ||
1698 | === modified file 'src/maasserver/tests/test_node_action.py' | |||
1699 | --- src/maasserver/tests/test_node_action.py 2015-09-16 08:36:46 +0000 | |||
1700 | +++ src/maasserver/tests/test_node_action.py 2015-09-25 14:32:35 +0000 | |||
1701 | @@ -428,6 +428,7 @@ | |||
1702 | 428 | self.assertThat( | 428 | self.assertThat( |
1703 | 429 | node_start, MockCalledOnceWith(user)) | 429 | node_start, MockCalledOnceWith(user)) |
1704 | 430 | 430 | ||
1705 | 431 | <<<<<<< TREE | ||
1706 | 431 | def test_Deploy_raises_NodeActionError_for_invalid_os(self): | 432 | def test_Deploy_raises_NodeActionError_for_invalid_os(self): |
1707 | 432 | user = factory.make_User() | 433 | user = factory.make_User() |
1708 | 433 | node = factory.make_Node( | 434 | node = factory.make_Node( |
1709 | @@ -446,41 +447,96 @@ | |||
1710 | 446 | "%s is not a support operating system." % os_name, | 447 | "%s is not a support operating system." % os_name, |
1711 | 447 | error.message) | 448 | error.message) |
1712 | 448 | 449 | ||
1713 | 450 | ======= | ||
1714 | 451 | def test_Deploy_raises_NodeActionError_for_invalid_os(self): | ||
1715 | 452 | user = factory.make_User() | ||
1716 | 453 | node = factory.make_Node( | ||
1717 | 454 | mac=True, status=NODE_STATUS.ALLOCATED, | ||
1718 | 455 | power_type='ether_wake', owner=user) | ||
1719 | 456 | self.patch(node, 'start') | ||
1720 | 457 | os_name = factory.make_name("os") | ||
1721 | 458 | release_name = factory.make_name("release") | ||
1722 | 459 | extra = { | ||
1723 | 460 | "osystem": os_name, | ||
1724 | 461 | "distro_series": release_name, | ||
1725 | 462 | } | ||
1726 | 463 | error = self.assertRaises( | ||
1727 | 464 | NodeActionError, Deploy(node, user).execute, **extra) | ||
1728 | 465 | self.assertEquals( | ||
1729 | 466 | "%s is not a support operating system." % os_name, | ||
1730 | 467 | error.message) | ||
1731 | 468 | |||
1732 | 469 | >>>>>>> MERGE-SOURCE | ||
1733 | 449 | def test_Deploy_sets_osystem_and_series(self): | 470 | def test_Deploy_sets_osystem_and_series(self): |
1734 | 450 | user = factory.make_User() | 471 | user = factory.make_User() |
1735 | 451 | node = factory.make_Node( | 472 | node = factory.make_Node( |
1768 | 452 | interface=True, status=NODE_STATUS.ALLOCATED, | 473 | <<<<<<< TREE |
1769 | 453 | power_type='ether_wake', owner=user) | 474 | interface=True, status=NODE_STATUS.ALLOCATED, |
1770 | 454 | self.patch(node, 'start') | 475 | power_type='ether_wake', owner=user) |
1771 | 455 | osystem = make_usable_osystem(self) | 476 | self.patch(node, 'start') |
1772 | 456 | os_name = osystem["name"] | 477 | osystem = make_usable_osystem(self) |
1773 | 457 | release_name = osystem["releases"][0]["name"] | 478 | os_name = osystem["name"] |
1774 | 458 | extra = { | 479 | release_name = osystem["releases"][0]["name"] |
1775 | 459 | "osystem": os_name, | 480 | extra = { |
1776 | 460 | "distro_series": release_name | 481 | "osystem": os_name, |
1777 | 461 | } | 482 | "distro_series": release_name |
1778 | 462 | Deploy(node, user).execute(**extra) | 483 | } |
1779 | 463 | self.expectThat(node.osystem, Equals(os_name)) | 484 | Deploy(node, user).execute(**extra) |
1780 | 464 | self.expectThat( | 485 | self.expectThat(node.osystem, Equals(os_name)) |
1781 | 465 | node.distro_series, Equals(release_name)) | 486 | self.expectThat( |
1782 | 466 | 487 | node.distro_series, Equals(release_name)) | |
1783 | 467 | def test_Deploy_sets_osystem_and_series_strips_license_key_token(self): | 488 | |
1784 | 468 | user = factory.make_User() | 489 | def test_Deploy_sets_osystem_and_series_strips_license_key_token(self): |
1785 | 469 | node = factory.make_Node( | 490 | user = factory.make_User() |
1786 | 470 | interface=True, status=NODE_STATUS.ALLOCATED, | 491 | node = factory.make_Node( |
1787 | 471 | power_type='ether_wake', owner=user) | 492 | interface=True, status=NODE_STATUS.ALLOCATED, |
1788 | 472 | self.patch(node, 'start') | 493 | power_type='ether_wake', owner=user) |
1789 | 473 | osystem = make_usable_osystem(self) | 494 | self.patch(node, 'start') |
1790 | 474 | os_name = osystem["name"] | 495 | osystem = make_usable_osystem(self) |
1791 | 475 | release_name = osystem["releases"][0]["name"] | 496 | os_name = osystem["name"] |
1792 | 476 | extra = { | 497 | release_name = osystem["releases"][0]["name"] |
1793 | 477 | "osystem": os_name, | 498 | extra = { |
1794 | 478 | "distro_series": release_name + '*' | 499 | "osystem": os_name, |
1795 | 479 | } | 500 | "distro_series": release_name + '*' |
1796 | 480 | Deploy(node, user).execute(**extra) | 501 | } |
1797 | 481 | self.expectThat(node.osystem, Equals(os_name)) | 502 | Deploy(node, user).execute(**extra) |
1798 | 482 | self.expectThat( | 503 | self.expectThat(node.osystem, Equals(os_name)) |
1799 | 483 | node.distro_series, Equals(release_name)) | 504 | self.expectThat( |
1800 | 505 | node.distro_series, Equals(release_name)) | ||
1801 | 506 | ======= | ||
1802 | 507 | mac=True, status=NODE_STATUS.ALLOCATED, | ||
1803 | 508 | power_type='ether_wake', owner=user) | ||
1804 | 509 | self.patch(node, 'start') | ||
1805 | 510 | osystem = make_usable_osystem(self) | ||
1806 | 511 | os_name = osystem["name"] | ||
1807 | 512 | release_name = osystem["releases"][0]["name"] | ||
1808 | 513 | extra = { | ||
1809 | 514 | "osystem": os_name, | ||
1810 | 515 | "distro_series": release_name | ||
1811 | 516 | } | ||
1812 | 517 | Deploy(node, user).execute(**extra) | ||
1813 | 518 | self.expectThat(node.osystem, Equals(os_name)) | ||
1814 | 519 | self.expectThat( | ||
1815 | 520 | node.distro_series, Equals(release_name)) | ||
1816 | 521 | |||
1817 | 522 | def test_Deploy_sets_osystem_and_series_strips_license_key_token(self): | ||
1818 | 523 | user = factory.make_User() | ||
1819 | 524 | node = factory.make_Node( | ||
1820 | 525 | mac=True, status=NODE_STATUS.ALLOCATED, | ||
1821 | 526 | power_type='ether_wake', owner=user) | ||
1822 | 527 | self.patch(node, 'start') | ||
1823 | 528 | osystem = make_usable_osystem(self) | ||
1824 | 529 | os_name = osystem["name"] | ||
1825 | 530 | release_name = osystem["releases"][0]["name"] | ||
1826 | 531 | extra = { | ||
1827 | 532 | "osystem": os_name, | ||
1828 | 533 | "distro_series": release_name + '*' | ||
1829 | 534 | } | ||
1830 | 535 | Deploy(node, user).execute(**extra) | ||
1831 | 536 | self.expectThat(node.osystem, Equals(os_name)) | ||
1832 | 537 | self.expectThat( | ||
1833 | 538 | node.distro_series, Equals(release_name)) | ||
1834 | 539 | >>>>>>> MERGE-SOURCE | ||
1835 | 484 | 540 | ||
1836 | 485 | def test_Deploy_doesnt_set_osystem_and_series_if_os_missing(self): | 541 | def test_Deploy_doesnt_set_osystem_and_series_if_os_missing(self): |
1837 | 486 | user = factory.make_User() | 542 | user = factory.make_User() |
1838 | 487 | 543 | ||
1839 | === modified file 'src/maasserver/tests/test_plugin.py' | |||
1840 | --- src/maasserver/tests/test_plugin.py 2015-09-11 19:22:33 +0000 | |||
1841 | +++ src/maasserver/tests/test_plugin.py 2015-09-25 14:32:35 +0000 | |||
1842 | @@ -22,6 +22,7 @@ | |||
1843 | 22 | from django.db.backends import BaseDatabaseWrapper | 22 | from django.db.backends import BaseDatabaseWrapper |
1844 | 23 | from maasserver import eventloop | 23 | from maasserver import eventloop |
1845 | 24 | from maasserver.plugin import ( | 24 | from maasserver.plugin import ( |
1846 | 25 | MAX_THREADS, | ||
1847 | 25 | Options, | 26 | Options, |
1848 | 26 | RegionServiceMaker, | 27 | RegionServiceMaker, |
1849 | 27 | ) | 28 | ) |
1850 | @@ -38,6 +39,7 @@ | |||
1851 | 38 | ) | 39 | ) |
1852 | 39 | from maastesting.testcase import MAASTestCase | 40 | from maastesting.testcase import MAASTestCase |
1853 | 40 | from provisioningserver import logger | 41 | from provisioningserver import logger |
1854 | 42 | <<<<<<< TREE | ||
1855 | 41 | from provisioningserver.utils.twisted import ( | 43 | from provisioningserver.utils.twisted import ( |
1856 | 42 | asynchronous, | 44 | asynchronous, |
1857 | 43 | ThreadPool, | 45 | ThreadPool, |
1858 | @@ -45,7 +47,12 @@ | |||
1859 | 45 | from south import migration | 47 | from south import migration |
1860 | 46 | from testtools import monkey | 48 | from testtools import monkey |
1861 | 47 | from testtools.matchers import IsInstance | 49 | from testtools.matchers import IsInstance |
1862 | 50 | ======= | ||
1863 | 51 | from provisioningserver.utils.twisted import asynchronous | ||
1864 | 52 | from testtools.matchers import GreaterThan | ||
1865 | 53 | >>>>>>> MERGE-SOURCE | ||
1866 | 48 | from twisted.application.service import MultiService | 54 | from twisted.application.service import MultiService |
1867 | 55 | <<<<<<< TREE | ||
1868 | 49 | from twisted.internet import reactor | 56 | from twisted.internet import reactor |
1869 | 50 | 57 | ||
1870 | 51 | 58 | ||
1871 | @@ -56,6 +63,9 @@ | |||
1872 | 56 | # prevented. The most sensible solution to this might be to disallow | 63 | # prevented. The most sensible solution to this might be to disallow |
1873 | 57 | # database access at import time. | 64 | # database access at import time. |
1874 | 58 | import maasserver.websockets.handlers # noqa | 65 | import maasserver.websockets.handlers # noqa |
1875 | 66 | ======= | ||
1876 | 67 | from twisted.internet import reactor | ||
1877 | 68 | >>>>>>> MERGE-SOURCE | ||
1878 | 59 | 69 | ||
1879 | 60 | 70 | ||
1880 | 61 | class TestOptions(MAASTestCase): | 71 | class TestOptions(MAASTestCase): |
1881 | @@ -121,6 +131,7 @@ | |||
1882 | 121 | "Not all services are named.") | 131 | "Not all services are named.") |
1883 | 122 | self.assertThat(logger.basicConfig, MockCalledOnceWith()) | 132 | self.assertThat(logger.basicConfig, MockCalledOnceWith()) |
1884 | 123 | self.assertThat(crochet.no_setup, MockCalledOnceWith()) | 133 | self.assertThat(crochet.no_setup, MockCalledOnceWith()) |
1885 | 134 | <<<<<<< TREE | ||
1886 | 124 | self.assertThat( | 135 | self.assertThat( |
1887 | 125 | RegionServiceMaker._checkDatabase, | 136 | RegionServiceMaker._checkDatabase, |
1888 | 126 | MockCalledOnceWith(service_maker)) | 137 | MockCalledOnceWith(service_maker)) |
1889 | @@ -226,3 +237,14 @@ | |||
1890 | 226 | self.assertEqual( | 237 | self.assertEqual( |
1891 | 227 | "The MAAS database schema is not yet fully installed: " | 238 | "The MAAS database schema is not yet fully installed: " |
1892 | 228 | "1 migration(s) are missing.", unicode(error)) | 239 | "1 migration(s) are missing.", unicode(error)) |
1893 | 240 | ======= | ||
1894 | 241 | |||
1895 | 242 | @asynchronous(timeout=5) | ||
1896 | 243 | def test__sets_pool_size(self): | ||
1897 | 244 | service_maker = RegionServiceMaker("Harry", "Hill") | ||
1898 | 245 | service_maker.makeService(Options()) | ||
1899 | 246 | threadpool = reactor.getThreadPool() | ||
1900 | 247 | self.assertEqual(MAX_THREADS, threadpool.max) | ||
1901 | 248 | # Max threads is reasonable. | ||
1902 | 249 | self.assertThat(threadpool.max, GreaterThan(50)) | ||
1903 | 250 | >>>>>>> MERGE-SOURCE | ||
1904 | 229 | 251 | ||
1905 | === modified file 'src/maasserver/utils/osystems.py' | |||
1906 | --- src/maasserver/utils/osystems.py 2015-09-08 18:41:57 +0000 | |||
1907 | +++ src/maasserver/utils/osystems.py 2015-09-25 14:32:35 +0000 | |||
1908 | @@ -194,6 +194,7 @@ | |||
1909 | 194 | for release in releases | 194 | for release in releases |
1910 | 195 | if release['can_commission'] | 195 | if release['can_commission'] |
1911 | 196 | ] | 196 | ] |
1912 | 197 | <<<<<<< TREE | ||
1913 | 197 | 198 | ||
1914 | 198 | 199 | ||
1915 | 199 | def validate_osystem_and_distro_series(osystem, distro_series): | 200 | def validate_osystem_and_distro_series(osystem, distro_series): |
1916 | @@ -308,3 +309,29 @@ | |||
1917 | 308 | if min_hwe_kernel not in usable_kernels: | 309 | if min_hwe_kernel not in usable_kernels: |
1918 | 309 | raise ValidationError('%s is not a usable kernel.' % min_hwe_kernel) | 310 | raise ValidationError('%s is not a usable kernel.' % min_hwe_kernel) |
1919 | 310 | return min_hwe_kernel | 311 | return min_hwe_kernel |
1920 | 312 | ======= | ||
1921 | 313 | |||
1922 | 314 | |||
1923 | 315 | def validate_osystem_and_distro_series(osystem, distro_series): | ||
1924 | 316 | """Validate `osystem` and `distro_series` are valid choices.""" | ||
1925 | 317 | if '/' in distro_series: | ||
1926 | 318 | series_os, release = distro_series.split('/', 1) | ||
1927 | 319 | if series_os != osystem: | ||
1928 | 320 | raise ValidationError( | ||
1929 | 321 | "%s in distro_series does not match with " | ||
1930 | 322 | "operating system %s." % (distro_series, osystem)) | ||
1931 | 323 | else: | ||
1932 | 324 | release = distro_series | ||
1933 | 325 | release = release.replace('*', '') | ||
1934 | 326 | usable_osystems = list_all_usable_osystems() | ||
1935 | 327 | found_osystem = get_osystem_from_osystems(usable_osystems, osystem) | ||
1936 | 328 | if found_osystem is None: | ||
1937 | 329 | raise ValidationError( | ||
1938 | 330 | "%s is not a support operating system." % osystem) | ||
1939 | 331 | found_release = get_release_from_osystem(found_osystem, release) | ||
1940 | 332 | if found_release is None: | ||
1941 | 333 | raise ValidationError( | ||
1942 | 334 | "%s/%s is not a support operating system and release " | ||
1943 | 335 | "combination." % (osystem, release)) | ||
1944 | 336 | return osystem, release | ||
1945 | 337 | >>>>>>> MERGE-SOURCE | ||
1946 | 311 | 338 | ||
1947 | === modified file 'src/maasserver/utils/tests/test_osystems.py' | |||
1948 | --- src/maasserver/utils/tests/test_osystems.py 2015-09-08 18:41:57 +0000 | |||
1949 | +++ src/maasserver/utils/tests/test_osystems.py 2015-09-25 14:32:35 +0000 | |||
1950 | @@ -36,9 +36,13 @@ | |||
1951 | 36 | list_commissioning_choices, | 36 | list_commissioning_choices, |
1952 | 37 | list_osystem_choices, | 37 | list_osystem_choices, |
1953 | 38 | list_release_choices, | 38 | list_release_choices, |
1954 | 39 | <<<<<<< TREE | ||
1955 | 39 | release_a_newer_than_b, | 40 | release_a_newer_than_b, |
1956 | 40 | validate_hwe_kernel, | 41 | validate_hwe_kernel, |
1957 | 41 | validate_osystem_and_distro_series, | 42 | validate_osystem_and_distro_series, |
1958 | 43 | ======= | ||
1959 | 44 | validate_osystem_and_distro_series, | ||
1960 | 45 | >>>>>>> MERGE-SOURCE | ||
1961 | 42 | ) | 46 | ) |
1962 | 43 | 47 | ||
1963 | 44 | 48 | ||
1964 | @@ -259,6 +263,7 @@ | |||
1965 | 259 | for release in comm_releases | 263 | for release in comm_releases |
1966 | 260 | ] | 264 | ] |
1967 | 261 | self.assertEqual(choices, list_commissioning_choices([osystem])) | 265 | self.assertEqual(choices, list_commissioning_choices([osystem])) |
1968 | 266 | <<<<<<< TREE | ||
1969 | 262 | 267 | ||
1970 | 263 | 268 | ||
1971 | 264 | class TestValidateOsystemAndDistroSeries(MAASServerTestCase): | 269 | class TestValidateOsystemAndDistroSeries(MAASServerTestCase): |
1972 | @@ -418,3 +423,45 @@ | |||
1973 | 418 | ' min_hwe_kernel(hwe-v).', e.message) | 423 | ' min_hwe_kernel(hwe-v).', e.message) |
1974 | 419 | exception_raised = True | 424 | exception_raised = True |
1975 | 420 | self.assertEqual(True, exception_raised) | 425 | self.assertEqual(True, exception_raised) |
1976 | 426 | ======= | ||
1977 | 427 | |||
1978 | 428 | |||
1979 | 429 | class TestValidateOsystemAndDistroSeries(MAASServerTestCase): | ||
1980 | 430 | |||
1981 | 431 | def test__raises_error_of_osystem_and_distro_series_dont_match(self): | ||
1982 | 432 | os = factory.make_name("os") | ||
1983 | 433 | release = "%s/%s" % ( | ||
1984 | 434 | factory.make_name("os"), factory.make_name("release")) | ||
1985 | 435 | error = self.assertRaises( | ||
1986 | 436 | ValidationError, validate_osystem_and_distro_series, os, release) | ||
1987 | 437 | self.assertEquals( | ||
1988 | 438 | "%s in distro_series does not match with " | ||
1989 | 439 | "operating system %s." % (release, os), error.message) | ||
1990 | 440 | |||
1991 | 441 | def test__raises_error_if_not_supported_osystem(self): | ||
1992 | 442 | os = factory.make_name("os") | ||
1993 | 443 | release = factory.make_name("release") | ||
1994 | 444 | error = self.assertRaises( | ||
1995 | 445 | ValidationError, validate_osystem_and_distro_series, os, release) | ||
1996 | 446 | self.assertEquals( | ||
1997 | 447 | "%s is not a support operating system." % os, | ||
1998 | 448 | error.message) | ||
1999 | 449 | |||
2000 | 450 | def test__raises_error_if_not_supported_release(self): | ||
2001 | 451 | osystem = make_usable_osystem(self) | ||
2002 | 452 | release = factory.make_name("release") | ||
2003 | 453 | error = self.assertRaises( | ||
2004 | 454 | ValidationError, validate_osystem_and_distro_series, | ||
2005 | 455 | osystem['name'], release) | ||
2006 | 456 | self.assertEquals( | ||
2007 | 457 | "%s/%s is not a support operating system and release " | ||
2008 | 458 | "combination." % (osystem['name'], release), | ||
2009 | 459 | error.message) | ||
2010 | 460 | |||
2011 | 461 | def test__returns_osystem_and_release_with_license_key_stripped(self): | ||
2012 | 462 | osystem = make_usable_osystem(self) | ||
2013 | 463 | release = osystem['default_release'] | ||
2014 | 464 | self.assertEquals( | ||
2015 | 465 | (osystem['name'], release), | ||
2016 | 466 | validate_osystem_and_distro_series(osystem['name'], release + '*')) | ||
2017 | 467 | >>>>>>> MERGE-SOURCE | ||
2018 | 421 | 468 | ||
2019 | === modified file 'src/maasserver/views/tests/test_rpc.py' | |||
2020 | --- src/maasserver/views/tests/test_rpc.py 2015-09-22 12:21:54 +0000 | |||
2021 | +++ src/maasserver/views/tests/test_rpc.py 2015-09-25 14:32:35 +0000 | |||
2022 | @@ -31,7 +31,6 @@ | |||
2023 | 31 | KeysEqual, | 31 | KeysEqual, |
2024 | 32 | LessThan, | 32 | LessThan, |
2025 | 33 | MatchesAll, | 33 | MatchesAll, |
2026 | 34 | MatchesDict, | ||
2027 | 35 | MatchesListwise, | 34 | MatchesListwise, |
2028 | 36 | MatchesSetwise, | 35 | MatchesSetwise, |
2029 | 37 | ) | 36 | ) |
2030 | @@ -84,14 +83,26 @@ | |||
2031 | 84 | self.assertEqual("application/json", response["Content-Type"]) | 83 | self.assertEqual("application/json", response["Content-Type"]) |
2032 | 85 | info = json.loads(response.content) | 84 | info = json.loads(response.content) |
2033 | 86 | self.assertThat(info, KeysEqual("eventloops")) | 85 | self.assertThat(info, KeysEqual("eventloops")) |
2035 | 87 | self.assertThat(info["eventloops"], MatchesDict({ | 86 | self.assertThat(info["eventloops"], KeysEqual(eventloop.loop.name)) |
2036 | 87 | self.assertThat( | ||
2037 | 88 | info["eventloops"][eventloop.loop.name], | ||
2038 | 88 | # Each entry in the endpoints dict is a mapping from an | 89 | # Each entry in the endpoints dict is a mapping from an |
2039 | 89 | # event loop to a list of (host, port) tuples. Each tuple is | 90 | # event loop to a list of (host, port) tuples. Each tuple is |
2040 | 90 | # a potential endpoint for connecting into that event loop. | 91 | # a potential endpoint for connecting into that event loop. |
2041 | 92 | <<<<<<< TREE | ||
2042 | 91 | eventloop.loop.name: MatchesSetwise(*( | 93 | eventloop.loop.name: MatchesSetwise(*( |
2043 | 94 | ======= | ||
2044 | 95 | MatchesSetwise(*[ | ||
2045 | 96 | >>>>>>> MERGE-SOURCE | ||
2046 | 92 | MatchesListwise((Equals(addr), is_valid_port)) | 97 | MatchesListwise((Equals(addr), is_valid_port)) |
2047 | 93 | for addr in get_all_interface_addresses() | 98 | for addr in get_all_interface_addresses() |
2048 | 99 | <<<<<<< TREE | ||
2049 | 94 | if not IPAddress(addr).is_link_local() and | 100 | if not IPAddress(addr).is_link_local() and |
2050 | 95 | IPAddress(addr).version == 4 | 101 | IPAddress(addr).version == 4 |
2051 | 96 | )), | 102 | )), |
2052 | 97 | })) | 103 | })) |
2053 | 104 | ======= | ||
2054 | 105 | if not IPAddress(addr).is_link_local() | ||
2055 | 106 | and IPAddress(addr).version == 4 | ||
2056 | 107 | ])) | ||
2057 | 108 | >>>>>>> MERGE-SOURCE | ||
2058 | 98 | 109 | ||
2059 | === modified file 'src/maasserver/websockets/handlers/device.py' | |||
2060 | === modified file 'src/maasserver/websockets/handlers/node.py' | |||
2061 | --- src/maasserver/websockets/handlers/node.py 2015-09-24 15:01:52 +0000 | |||
2062 | +++ src/maasserver/websockets/handlers/node.py 2015-09-25 14:32:35 +0000 | |||
2063 | @@ -111,6 +111,7 @@ | |||
2064 | 111 | "token", | 111 | "token", |
2065 | 112 | "netboot", | 112 | "netboot", |
2066 | 113 | "agent_name", | 113 | "agent_name", |
2067 | 114 | <<<<<<< TREE | ||
2068 | 114 | "power_state_updated", | 115 | "power_state_updated", |
2069 | 115 | "gateway_link_ipv4", | 116 | "gateway_link_ipv4", |
2070 | 116 | "gateway_link_ipv6", | 117 | "gateway_link_ipv6", |
2071 | @@ -118,6 +119,11 @@ | |||
2072 | 118 | "enable_ssh", | 119 | "enable_ssh", |
2073 | 119 | "skip_networking", | 120 | "skip_networking", |
2074 | 120 | "skip_storage", | 121 | "skip_storage", |
2075 | 122 | ======= | ||
2076 | 123 | # power_state_updated isn't needed in the client yet, plus it's | ||
2077 | 124 | # not native to JSON. Omit for now. | ||
2078 | 125 | "power_state_updated", | ||
2079 | 126 | >>>>>>> MERGE-SOURCE | ||
2080 | 121 | ] | 127 | ] |
2081 | 122 | list_fields = [ | 128 | list_fields = [ |
2082 | 123 | "system_id", | 129 | "system_id", |
2083 | @@ -654,6 +660,7 @@ | |||
2084 | 654 | POWER_QUERY_TIMEOUT, client, PowerQuery, system_id=node_id, | 660 | POWER_QUERY_TIMEOUT, client, PowerQuery, system_id=node_id, |
2085 | 655 | hostname=node_hostname, power_type=power_info.power_type, | 661 | hostname=node_hostname, power_type=power_info.power_type, |
2086 | 656 | context=power_info.power_parameters) | 662 | context=power_info.power_parameters) |
2087 | 663 | <<<<<<< TREE | ||
2088 | 657 | except CancelledError: | 664 | except CancelledError: |
2089 | 658 | # We got fed up waiting. The query may later discover the node's | 665 | # We got fed up waiting. The query may later discover the node's |
2090 | 659 | # power state but by then we won't be paying attention. | 666 | # power state but by then we won't be paying attention. |
2091 | @@ -672,3 +679,28 @@ | |||
2092 | 672 | 679 | ||
2093 | 673 | yield deferToDatabase(update_power_state, state) | 680 | yield deferToDatabase(update_power_state, state) |
2094 | 674 | returnValue(state) | 681 | returnValue(state) |
2095 | 682 | ======= | ||
2096 | 683 | try: | ||
2097 | 684 | state = call.wait(POWER_QUERY_TIMEOUT)['state'] | ||
2098 | 685 | except crochet.TimeoutError: | ||
2099 | 686 | maaslog.error( | ||
2100 | 687 | "%s: Timed out waiting for power response in " | ||
2101 | 688 | "Node.power_state", | ||
2102 | 689 | obj.hostname) | ||
2103 | 690 | state = "error" | ||
2104 | 691 | except (NotImplementedError, PowerActionFail): | ||
2105 | 692 | state = "error" | ||
2106 | 693 | |||
2107 | 694 | @asynchronous | ||
2108 | 695 | def update_power_state(state): | ||
2109 | 696 | transactional_update = transactional(obj.update_power_state) | ||
2110 | 697 | return deferToThread(transactional_update, state) | ||
2111 | 698 | |||
2112 | 699 | # Update the power_state of the node. This will cause the update to | ||
2113 | 700 | # occur in a seperate thread wrapped with transactional. This will make | ||
2114 | 701 | # sure the change is committed and retried if required. Not pushing | ||
2115 | 702 | # this to another thread, would result in the entire power query being | ||
2116 | 703 | # performed again. | ||
2117 | 704 | update_power_state(state).wait(POWER_QUERY_TIMEOUT) | ||
2118 | 705 | return state | ||
2119 | 706 | >>>>>>> MERGE-SOURCE | ||
2120 | 675 | 707 | ||
2121 | === modified file 'src/maasserver/websockets/handlers/tests/test_node.py' | |||
2122 | === modified file 'src/provisioningserver/__main__.py' | |||
2123 | === modified file 'src/provisioningserver/drivers/power/__init__.py' | |||
2124 | --- src/provisioningserver/drivers/power/__init__.py 2015-09-24 15:45:32 +0000 | |||
2125 | +++ src/provisioningserver/drivers/power/__init__.py 2015-09-25 14:32:35 +0000 | |||
2126 | @@ -30,8 +30,12 @@ | |||
2127 | 30 | abstractmethod, | 30 | abstractmethod, |
2128 | 31 | abstractproperty, | 31 | abstractproperty, |
2129 | 32 | ) | 32 | ) |
2130 | 33 | <<<<<<< TREE | ||
2131 | 33 | from datetime import timedelta | 34 | from datetime import timedelta |
2132 | 34 | import sys | 35 | import sys |
2133 | 36 | ======= | ||
2134 | 37 | from datetime import timedelta | ||
2135 | 38 | >>>>>>> MERGE-SOURCE | ||
2136 | 35 | 39 | ||
2137 | 36 | from jsonschema import validate | 40 | from jsonschema import validate |
2138 | 37 | from provisioningserver.drivers import ( | 41 | from provisioningserver.drivers import ( |
2139 | 38 | 42 | ||
2140 | === modified file 'src/provisioningserver/plugin.py' | |||
2141 | --- src/provisioningserver/plugin.py 2015-06-26 10:40:52 +0000 | |||
2142 | +++ src/provisioningserver/plugin.py 2015-09-25 14:32:35 +0000 | |||
2143 | @@ -20,11 +20,18 @@ | |||
2144 | 20 | import socket | 20 | import socket |
2145 | 21 | from socket import error as socket_error | 21 | from socket import error as socket_error |
2146 | 22 | 22 | ||
2147 | 23 | <<<<<<< TREE | ||
2148 | 23 | from provisioningserver.config import ClusterConfiguration | 24 | from provisioningserver.config import ClusterConfiguration |
2149 | 24 | from provisioningserver.monkey import ( | 25 | from provisioningserver.monkey import ( |
2150 | 25 | add_term_error_code_to_tftp, | 26 | add_term_error_code_to_tftp, |
2151 | 26 | force_simplestreams_to_use_urllib2, | 27 | force_simplestreams_to_use_urllib2, |
2152 | 27 | ) | 28 | ) |
2153 | 29 | ======= | ||
2154 | 30 | from provisioningserver.monkey import ( | ||
2155 | 31 | add_term_error_code_to_tftp, | ||
2156 | 32 | force_simplestreams_to_use_urllib2, | ||
2157 | 33 | ) | ||
2158 | 34 | >>>>>>> MERGE-SOURCE | ||
2159 | 28 | from provisioningserver.utils.debug import ( | 35 | from provisioningserver.utils.debug import ( |
2160 | 29 | register_sigusr2_thread_dump_handler, | 36 | register_sigusr2_thread_dump_handler, |
2161 | 30 | ) | 37 | ) |
2162 | 31 | 38 | ||
2163 | === modified file 'src/provisioningserver/power/__init__.py' | |||
2164 | --- src/provisioningserver/power/__init__.py 2015-09-24 15:45:32 +0000 | |||
2165 | +++ src/provisioningserver/power/__init__.py 2015-09-25 14:32:35 +0000 | |||
2166 | @@ -19,6 +19,22 @@ | |||
2167 | 19 | "QUERY_POWER_TYPES", | 19 | "QUERY_POWER_TYPES", |
2168 | 20 | ] | 20 | ] |
2169 | 21 | 21 | ||
2170 | 22 | <<<<<<< TREE | ||
2171 | 23 | ======= | ||
2172 | 24 | from datetime import timedelta | ||
2173 | 25 | from functools import partial | ||
2174 | 26 | import sys | ||
2175 | 27 | |||
2176 | 28 | from provisioningserver.events import ( | ||
2177 | 29 | EVENT_TYPES, | ||
2178 | 30 | send_event_node, | ||
2179 | 31 | ) | ||
2180 | 32 | from provisioningserver.logger.log import get_maas_logger | ||
2181 | 33 | from provisioningserver.power.poweraction import ( | ||
2182 | 34 | PowerAction, | ||
2183 | 35 | PowerActionFail, | ||
2184 | 36 | ) | ||
2185 | 37 | >>>>>>> MERGE-SOURCE | ||
2186 | 22 | from provisioningserver.rpc import getRegionClient | 38 | from provisioningserver.rpc import getRegionClient |
2187 | 23 | from provisioningserver.rpc.region import UpdateNodePowerState | 39 | from provisioningserver.rpc.region import UpdateNodePowerState |
2188 | 24 | from provisioningserver.utils.twisted import asynchronous | 40 | from provisioningserver.utils.twisted import asynchronous |
2189 | @@ -42,6 +58,18 @@ | |||
2190 | 42 | ] | 58 | ] |
2191 | 43 | 59 | ||
2192 | 44 | 60 | ||
2193 | 61 | <<<<<<< TREE | ||
2194 | 62 | ======= | ||
2195 | 63 | # Timeout for change_power_state(). We set it to 5 minutes by default, | ||
2196 | 64 | # but it would be lovely if this was configurable. This is only a backstop | ||
2197 | 65 | # meant to cope with broken BMCs. | ||
2198 | 66 | CHANGE_POWER_STATE_TIMEOUT = timedelta(minutes=5).total_seconds() | ||
2199 | 67 | |||
2200 | 68 | |||
2201 | 69 | maaslog = get_maas_logger("power") | ||
2202 | 70 | |||
2203 | 71 | |||
2204 | 72 | >>>>>>> MERGE-SOURCE | ||
2205 | 45 | # We could use a Registry here, but it seems kind of like overkill. | 73 | # We could use a Registry here, but it seems kind of like overkill. |
2206 | 46 | power_action_registry = {} | 74 | power_action_registry = {} |
2207 | 47 | 75 | ||
2208 | @@ -64,3 +92,145 @@ | |||
2209 | 64 | UpdateNodePowerState, | 92 | UpdateNodePowerState, |
2210 | 65 | system_id=system_id, | 93 | system_id=system_id, |
2211 | 66 | power_state=state) | 94 | power_state=state) |
2212 | 95 | <<<<<<< TREE | ||
2213 | 96 | ======= | ||
2214 | 97 | |||
2215 | 98 | |||
2216 | 99 | @asynchronous | ||
2217 | 100 | @inlineCallbacks | ||
2218 | 101 | def power_query_failure(system_id, hostname, message): | ||
2219 | 102 | """Deal with a node failing to be queried.""" | ||
2220 | 103 | maaslog.error(message) | ||
2221 | 104 | yield power_state_update(system_id, 'error') | ||
2222 | 105 | yield send_event_node( | ||
2223 | 106 | EVENT_TYPES.NODE_POWER_QUERY_FAILED, | ||
2224 | 107 | system_id, hostname, message) | ||
2225 | 108 | |||
2226 | 109 | |||
2227 | 110 | @synchronous | ||
2228 | 111 | def perform_power_query(system_id, hostname, power_type, context): | ||
2229 | 112 | """Issue the given `power_query` command. | ||
2230 | 113 | |||
2231 | 114 | No exception handling is performed here, this allows | ||
2232 | 115 | `get_power_state` to perform multiple queries and only | ||
2233 | 116 | log the final error. | ||
2234 | 117 | """ | ||
2235 | 118 | action = PowerAction(power_type) | ||
2236 | 119 | # `power_change` is a misnomer here. | ||
2237 | 120 | return action.execute(power_change='query', **context) | ||
2238 | 121 | |||
2239 | 122 | |||
2240 | 123 | @asynchronous | ||
2241 | 124 | @inlineCallbacks | ||
2242 | 125 | def get_power_state(system_id, hostname, power_type, context, clock=reactor): | ||
2243 | 126 | """Return the power state of the given node. | ||
2244 | 127 | |||
2245 | 128 | A side-effect of calling this method is that the power state recorded in | ||
2246 | 129 | the database is updated. | ||
2247 | 130 | |||
2248 | 131 | :return: The string "on" or "off". | ||
2249 | 132 | :raises PowerActionFail: When `power_type` is not queryable, or when | ||
2250 | 133 | there's a failure when querying the node's power state. | ||
2251 | 134 | """ | ||
2252 | 135 | if power_type not in QUERY_POWER_TYPES: | ||
2253 | 136 | # query_all_nodes() won't call this with an un-queryable power | ||
2254 | 137 | # type, however this is left here to prevent PEBKAC. | ||
2255 | 138 | raise PowerActionFail("Unknown power_type '%s'" % power_type) | ||
2256 | 139 | |||
2257 | 140 | def check_power_state(state): | ||
2258 | 141 | if state not in ("on", "off", "unknown"): | ||
2259 | 142 | # This is considered an error. | ||
2260 | 143 | raise PowerActionFail(state) | ||
2261 | 144 | |||
2262 | 145 | # Capture errors as we go along. | ||
2263 | 146 | exc_info = None, None, None | ||
2264 | 147 | |||
2265 | 148 | # Use increasing waiting times to work around race conditions that could | ||
2266 | 149 | # arise when power querying the node. | ||
2267 | 150 | for waiting_time in default_waiting_policy: | ||
2268 | 151 | # Perform power query. | ||
2269 | 152 | try: | ||
2270 | 153 | power_state = yield deferToThread( | ||
2271 | 154 | perform_power_query, system_id, hostname, | ||
2272 | 155 | power_type, context) | ||
2273 | 156 | check_power_state(power_state) | ||
2274 | 157 | except: | ||
2275 | 158 | # Hold the error; it may be reported later. | ||
2276 | 159 | exc_info = sys.exc_info() | ||
2277 | 160 | # Wait before trying again. | ||
2278 | 161 | yield pause(waiting_time, clock) | ||
2279 | 162 | else: | ||
2280 | 163 | yield power_state_update(system_id, power_state) | ||
2281 | 164 | returnValue(power_state) | ||
2282 | 165 | |||
2283 | 166 | # Reaching here means that things have gone wrong. | ||
2284 | 167 | assert exc_info != (None, None, None) | ||
2285 | 168 | exc_type, exc_value, exc_trace = exc_info | ||
2286 | 169 | message = "Power state could not be queried: %s" % (exc_value,) | ||
2287 | 170 | yield power_query_failure(system_id, hostname, message) | ||
2288 | 171 | raise exc_type, exc_value, exc_trace | ||
2289 | 172 | |||
2290 | 173 | |||
2291 | 174 | def maaslog_report_success(node, power_state): | ||
2292 | 175 | """Log change in power state for node.""" | ||
2293 | 176 | if node['power_state'] != power_state: | ||
2294 | 177 | maaslog.info( | ||
2295 | 178 | "%s: Power state has changed from %s to %s.", node['hostname'], | ||
2296 | 179 | node['power_state'], power_state) | ||
2297 | 180 | return power_state | ||
2298 | 181 | |||
2299 | 182 | |||
2300 | 183 | def maaslog_report_failure(node, failure): | ||
2301 | 184 | """Log failure to query node.""" | ||
2302 | 185 | if failure.check(PowerActionFail): | ||
2303 | 186 | maaslog.error( | ||
2304 | 187 | "%s: Could not query power state: %s.", | ||
2305 | 188 | node['hostname'], failure.getErrorMessage()) | ||
2306 | 189 | elif failure.check(NoSuchNode): | ||
2307 | 190 | maaslog.debug( | ||
2308 | 191 | "%s: Could not update power state: " | ||
2309 | 192 | "no such node.", node['hostname']) | ||
2310 | 193 | else: | ||
2311 | 194 | maaslog.error( | ||
2312 | 195 | "%s: Failed to refresh power state: %s", | ||
2313 | 196 | node['hostname'], failure.getErrorMessage()) | ||
2314 | 197 | # Also write out a full traceback to the server log. | ||
2315 | 198 | log.err(failure, "Failed to refresh power state.") | ||
2316 | 199 | |||
2317 | 200 | |||
2318 | 201 | def query_node(node, clock): | ||
2319 | 202 | """Calls `get_power_state` on the given node. | ||
2320 | 203 | |||
2321 | 204 | Logs to maaslog as errors and power states change. | ||
2322 | 205 | """ | ||
2323 | 206 | if node['system_id'] in power_action_registry: | ||
2324 | 207 | maaslog.debug( | ||
2325 | 208 | "%s: Skipping query power status, " | ||
2326 | 209 | "power action already in progress.", | ||
2327 | 210 | node['hostname']) | ||
2328 | 211 | return succeed(None) | ||
2329 | 212 | else: | ||
2330 | 213 | d = get_power_state( | ||
2331 | 214 | node['system_id'], node['hostname'], | ||
2332 | 215 | node['power_type'], node['context'], | ||
2333 | 216 | clock=clock) | ||
2334 | 217 | d.addCallbacks( | ||
2335 | 218 | partial(maaslog_report_success, node), | ||
2336 | 219 | partial(maaslog_report_failure, node)) | ||
2337 | 220 | return d | ||
2338 | 221 | |||
2339 | 222 | |||
2340 | 223 | def query_all_nodes(nodes, max_concurrency=5, clock=reactor): | ||
2341 | 224 | """Queries the given nodes for their power state. | ||
2342 | 225 | |||
2343 | 226 | Nodes' states are reported back to the region. | ||
2344 | 227 | |||
2345 | 228 | :return: A deferred, which fires once all nodes have been queried, | ||
2346 | 229 | successfully or not. | ||
2347 | 230 | """ | ||
2348 | 231 | semaphore = DeferredSemaphore(tokens=max_concurrency) | ||
2349 | 232 | queries = ( | ||
2350 | 233 | semaphore.run(query_node, node, clock) | ||
2351 | 234 | for node in nodes if node['power_type'] in QUERY_POWER_TYPES) | ||
2352 | 235 | return DeferredList(queries, consumeErrors=True) | ||
2353 | 236 | >>>>>>> MERGE-SOURCE | ||
2354 | 67 | 237 | ||
2355 | === modified file 'src/provisioningserver/power/tests/test_power.py' | |||
2356 | --- src/provisioningserver/power/tests/test_power.py 2015-08-21 16:40:28 +0000 | |||
2357 | +++ src/provisioningserver/power/tests/test_power.py 2015-09-25 14:32:35 +0000 | |||
2358 | @@ -17,6 +17,7 @@ | |||
2359 | 17 | import random | 17 | import random |
2360 | 18 | 18 | ||
2361 | 19 | from maastesting.factory import factory | 19 | from maastesting.factory import factory |
2362 | 20 | <<<<<<< TREE | ||
2363 | 20 | from maastesting.matchers import MockCalledOnceWith | 21 | from maastesting.matchers import MockCalledOnceWith |
2364 | 21 | from maastesting.testcase import MAASTestCase | 22 | from maastesting.testcase import MAASTestCase |
2365 | 22 | from mock import ANY | 23 | from mock import ANY |
2366 | @@ -25,6 +26,85 @@ | |||
2367 | 25 | from provisioningserver.rpc.testing import MockClusterToRegionRPCFixture | 26 | from provisioningserver.rpc.testing import MockClusterToRegionRPCFixture |
2368 | 26 | from testtools.deferredruntest import extract_result | 27 | from testtools.deferredruntest import extract_result |
2369 | 27 | from testtools.matchers import Equals | 28 | from testtools.matchers import Equals |
2370 | 29 | ======= | ||
2371 | 30 | from maastesting.matchers import ( | ||
2372 | 31 | MockCalledOnceWith, | ||
2373 | 32 | MockCalledWith, | ||
2374 | 33 | MockCallsMatch, | ||
2375 | 34 | MockNotCalled, | ||
2376 | 35 | ) | ||
2377 | 36 | from maastesting.testcase import ( | ||
2378 | 37 | MAASTestCase, | ||
2379 | 38 | MAASTwistedRunTest, | ||
2380 | 39 | ) | ||
2381 | 40 | from maastesting.twisted import ( | ||
2382 | 41 | always_fail_with, | ||
2383 | 42 | always_succeed_with, | ||
2384 | 43 | TwistedLoggerFixture, | ||
2385 | 44 | ) | ||
2386 | 45 | from mock import ( | ||
2387 | 46 | ANY, | ||
2388 | 47 | call, | ||
2389 | 48 | DEFAULT, | ||
2390 | 49 | Mock, | ||
2391 | 50 | sentinel, | ||
2392 | 51 | ) | ||
2393 | 52 | import provisioningserver | ||
2394 | 53 | from provisioningserver.drivers.power import PowerDriverRegistry | ||
2395 | 54 | from provisioningserver.events import EVENT_TYPES | ||
2396 | 55 | from provisioningserver.power.poweraction import PowerActionFail | ||
2397 | 56 | from provisioningserver.rpc import ( | ||
2398 | 57 | exceptions, | ||
2399 | 58 | power, | ||
2400 | 59 | region, | ||
2401 | 60 | ) | ||
2402 | 61 | from provisioningserver.rpc.testing import ( | ||
2403 | 62 | MockClusterToRegionRPCFixture, | ||
2404 | 63 | MockLiveClusterToRegionRPCFixture, | ||
2405 | 64 | ) | ||
2406 | 65 | from testtools import ExpectedException | ||
2407 | 66 | from testtools.deferredruntest import ( | ||
2408 | 67 | assert_fails_with, | ||
2409 | 68 | extract_result, | ||
2410 | 69 | ) | ||
2411 | 70 | from testtools.matchers import ( | ||
2412 | 71 | Equals, | ||
2413 | 72 | IsInstance, | ||
2414 | 73 | Not, | ||
2415 | 74 | ) | ||
2416 | 75 | from twisted.internet import reactor | ||
2417 | 76 | from twisted.internet.defer import ( | ||
2418 | 77 | Deferred, | ||
2419 | 78 | fail, | ||
2420 | 79 | inlineCallbacks, | ||
2421 | 80 | maybeDeferred, | ||
2422 | 81 | returnValue, | ||
2423 | 82 | succeed, | ||
2424 | 83 | ) | ||
2425 | 84 | from twisted.internet.task import Clock | ||
2426 | 85 | |||
2427 | 86 | |||
2428 | 87 | def patch_power_action(test, return_value=DEFAULT, side_effect=None): | ||
2429 | 88 | """Patch the PowerAction object. | ||
2430 | 89 | |||
2431 | 90 | Patch the PowerAction object so that PowerAction().execute | ||
2432 | 91 | is replaced by a Mock object created using the given `return_value` | ||
2433 | 92 | and `side_effect`. | ||
2434 | 93 | |||
2435 | 94 | This can be used to simulate various successes or failures patterns | ||
2436 | 95 | while manipulating the power state of a node. | ||
2437 | 96 | |||
2438 | 97 | Returns a tuple of mock objects: power.PowerAction and | ||
2439 | 98 | power.PowerAction().execute. | ||
2440 | 99 | """ | ||
2441 | 100 | power_action_obj = Mock() | ||
2442 | 101 | power_action_obj_execute = Mock( | ||
2443 | 102 | return_value=return_value, side_effect=side_effect) | ||
2444 | 103 | power_action_obj.execute = power_action_obj_execute | ||
2445 | 104 | power_action = test.patch(power, 'PowerAction') | ||
2446 | 105 | power_action.return_value = power_action_obj | ||
2447 | 106 | return power_action, power_action_obj_execute | ||
2448 | 107 | >>>>>>> MERGE-SOURCE | ||
2449 | 28 | 108 | ||
2450 | 29 | 109 | ||
2451 | 30 | class TestPowerHelpers(MAASTestCase): | 110 | class TestPowerHelpers(MAASTestCase): |
2452 | @@ -51,3 +131,924 @@ | |||
2453 | 51 | system_id=system_id, | 131 | system_id=system_id, |
2454 | 52 | power_state=state) | 132 | power_state=state) |
2455 | 53 | ) | 133 | ) |
2456 | 134 | <<<<<<< TREE | ||
2457 | 135 | ======= | ||
2458 | 136 | |||
2459 | 137 | |||
2460 | 138 | class TestChangePowerState(MAASTestCase): | ||
2461 | 139 | |||
2462 | 140 | run_tests_with = MAASTwistedRunTest.make_factory(timeout=5) | ||
2463 | 141 | |||
2464 | 142 | @inlineCallbacks | ||
2465 | 143 | def patch_rpc_methods(self, return_value={}, side_effect=None): | ||
2466 | 144 | fixture = self.useFixture(MockLiveClusterToRegionRPCFixture()) | ||
2467 | 145 | protocol, connecting = fixture.makeEventLoop( | ||
2468 | 146 | region.MarkNodeFailed, region.UpdateNodePowerState, | ||
2469 | 147 | region.SendEvent) | ||
2470 | 148 | protocol.MarkNodeFailed.return_value = return_value | ||
2471 | 149 | protocol.MarkNodeFailed.side_effect = side_effect | ||
2472 | 150 | self.addCleanup((yield connecting)) | ||
2473 | 151 | returnValue(protocol.MarkNodeFailed) | ||
2474 | 152 | |||
2475 | 153 | def test_change_power_state_calls_power_change_starting_early_on(self): | ||
2476 | 154 | # The first, or one of the first, things that change_power_state() | ||
2477 | 155 | # does is write to the node event log via power_change_starting(). | ||
2478 | 156 | |||
2479 | 157 | class ArbitraryException(Exception): | ||
2480 | 158 | """This allows us to return early from a function.""" | ||
2481 | 159 | |||
2482 | 160 | # Raise this exception when power_change_starting() is called, to | ||
2483 | 161 | # return early from change_power_state(). This lets us avoid set-up | ||
2484 | 162 | # for parts of the function that we're presently not interested in. | ||
2485 | 163 | self.patch_autospec(power, "power_change_starting") | ||
2486 | 164 | power.power_change_starting.side_effect = ArbitraryException() | ||
2487 | 165 | |||
2488 | 166 | d = power.change_power_state( | ||
2489 | 167 | sentinel.system_id, sentinel.hostname, sentinel.power_type, | ||
2490 | 168 | sentinel.power_change, sentinel.context) | ||
2491 | 169 | self.assertRaises(ArbitraryException, extract_result, d) | ||
2492 | 170 | self.assertThat( | ||
2493 | 171 | power.power_change_starting, MockCalledOnceWith( | ||
2494 | 172 | sentinel.system_id, sentinel.hostname, sentinel.power_change)) | ||
2495 | 173 | |||
2496 | 174 | @inlineCallbacks | ||
2497 | 175 | def test_change_power_state_changes_power_state(self): | ||
2498 | 176 | system_id = factory.make_name('system_id') | ||
2499 | 177 | hostname = factory.make_name('hostname') | ||
2500 | 178 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2501 | 179 | power_change = random.choice(['on', 'off']) | ||
2502 | 180 | context = { | ||
2503 | 181 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2504 | 182 | } | ||
2505 | 183 | self.patch(power, 'pause') | ||
2506 | 184 | power.power_action_registry[system_id] = power_change, sentinel.d | ||
2507 | 185 | # Patch the power action utility so that it says the node is | ||
2508 | 186 | # in the required power state. | ||
2509 | 187 | power_action, execute = patch_power_action( | ||
2510 | 188 | self, return_value=power_change) | ||
2511 | 189 | markNodeBroken = yield self.patch_rpc_methods() | ||
2512 | 190 | |||
2513 | 191 | yield power.change_power_state( | ||
2514 | 192 | system_id, hostname, power_type, power_change, context) | ||
2515 | 193 | self.assertThat( | ||
2516 | 194 | execute, | ||
2517 | 195 | MockCallsMatch( | ||
2518 | 196 | # One call to change the power state. | ||
2519 | 197 | call(power_change=power_change, **context), | ||
2520 | 198 | # One call to query the power state. | ||
2521 | 199 | call(power_change='query', **context), | ||
2522 | 200 | ), | ||
2523 | 201 | ) | ||
2524 | 202 | # The node hasn't been marked broken. | ||
2525 | 203 | self.assertThat(markNodeBroken, MockNotCalled()) | ||
2526 | 204 | |||
2527 | 205 | @inlineCallbacks | ||
2528 | 206 | def test_change_power_state_doesnt_retry_for_certain_power_types(self): | ||
2529 | 207 | system_id = factory.make_name('system_id') | ||
2530 | 208 | hostname = factory.make_name('hostname') | ||
2531 | 209 | # Use a power type that is not among power.QUERY_POWER_TYPES. | ||
2532 | 210 | power_type = factory.make_name('power_type') | ||
2533 | 211 | power_change = random.choice(['on', 'off']) | ||
2534 | 212 | context = { | ||
2535 | 213 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2536 | 214 | } | ||
2537 | 215 | power.power_action_registry[system_id] = power_change, sentinel.d | ||
2538 | 216 | self.patch(power, 'pause') | ||
2539 | 217 | power_action, execute = patch_power_action( | ||
2540 | 218 | self, return_value=random.choice(['on', 'off'])) | ||
2541 | 219 | markNodeBroken = yield self.patch_rpc_methods() | ||
2542 | 220 | |||
2543 | 221 | yield power.change_power_state( | ||
2544 | 222 | system_id, hostname, power_type, power_change, context) | ||
2545 | 223 | self.assertThat( | ||
2546 | 224 | execute, | ||
2547 | 225 | MockCallsMatch( | ||
2548 | 226 | # Only one call to change the power state. | ||
2549 | 227 | call(power_change=power_change, **context), | ||
2550 | 228 | ), | ||
2551 | 229 | ) | ||
2552 | 230 | # The node hasn't been marked broken. | ||
2553 | 231 | self.assertThat(markNodeBroken, MockNotCalled()) | ||
2554 | 232 | |||
2555 | 233 | @inlineCallbacks | ||
2556 | 234 | def test_change_power_state_retries_if_power_state_doesnt_change(self): | ||
2557 | 235 | system_id = factory.make_name('system_id') | ||
2558 | 236 | hostname = factory.make_name('hostname') | ||
2559 | 237 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2560 | 238 | power_change = 'on' | ||
2561 | 239 | context = { | ||
2562 | 240 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2563 | 241 | } | ||
2564 | 242 | self.patch(power, 'pause') | ||
2565 | 243 | power.power_action_registry[system_id] = power_change, sentinel.d | ||
2566 | 244 | # Simulate a failure to power up the node, then a success. | ||
2567 | 245 | power_action, execute = patch_power_action( | ||
2568 | 246 | self, side_effect=[None, 'off', None, 'on']) | ||
2569 | 247 | markNodeBroken = yield self.patch_rpc_methods() | ||
2570 | 248 | |||
2571 | 249 | yield power.change_power_state( | ||
2572 | 250 | system_id, hostname, power_type, power_change, context) | ||
2573 | 251 | self.assertThat( | ||
2574 | 252 | execute, | ||
2575 | 253 | MockCallsMatch( | ||
2576 | 254 | call(power_change=power_change, **context), | ||
2577 | 255 | call(power_change='query', **context), | ||
2578 | 256 | call(power_change=power_change, **context), | ||
2579 | 257 | call(power_change='query', **context), | ||
2580 | 258 | ) | ||
2581 | 259 | ) | ||
2582 | 260 | # The node hasn't been marked broken. | ||
2583 | 261 | self.assertThat(markNodeBroken, MockNotCalled()) | ||
2584 | 262 | |||
2585 | 263 | @inlineCallbacks | ||
2586 | 264 | def test_change_power_state_doesnt_retry_if_query_returns_unknown(self): | ||
2587 | 265 | system_id = factory.make_name('system_id') | ||
2588 | 266 | hostname = factory.make_name('hostname') | ||
2589 | 267 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2590 | 268 | power_change = random.choice(['on', 'off']) | ||
2591 | 269 | context = { | ||
2592 | 270 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2593 | 271 | } | ||
2594 | 272 | self.patch(power, 'pause') | ||
2595 | 273 | power.power_action_registry[system_id] = power_change, sentinel.d | ||
2596 | 274 | # Patch the power action utility so that it says the node is | ||
2597 | 275 | # in the required power state. | ||
2598 | 276 | power_action, execute = patch_power_action( | ||
2599 | 277 | self, return_value="unknown") | ||
2600 | 278 | markNodeBroken = yield self.patch_rpc_methods() | ||
2601 | 279 | |||
2602 | 280 | yield power.change_power_state( | ||
2603 | 281 | system_id, hostname, power_type, power_change, context) | ||
2604 | 282 | self.assertThat( | ||
2605 | 283 | execute, | ||
2606 | 284 | MockCallsMatch( | ||
2607 | 285 | # One call to change the power state. | ||
2608 | 286 | call(power_change=power_change, **context), | ||
2609 | 287 | # One call to query the power state. | ||
2610 | 288 | call(power_change='query', **context), | ||
2611 | 289 | ), | ||
2612 | 290 | ) | ||
2613 | 291 | # The node hasn't been marked broken. | ||
2614 | 292 | self.assertThat(markNodeBroken, MockNotCalled()) | ||
2615 | 293 | |||
2616 | 294 | @inlineCallbacks | ||
2617 | 295 | def test_change_power_state_marks_the_node_broken_if_failure(self): | ||
2618 | 296 | system_id = factory.make_name('system_id') | ||
2619 | 297 | hostname = factory.make_name('hostname') | ||
2620 | 298 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2621 | 299 | power_change = 'on' | ||
2622 | 300 | context = { | ||
2623 | 301 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2624 | 302 | } | ||
2625 | 303 | self.patch(power, 'pause') | ||
2626 | 304 | power.power_action_registry[system_id] = power_change, sentinel.d | ||
2627 | 305 | # Simulate a persistent failure. | ||
2628 | 306 | power_action, execute = patch_power_action( | ||
2629 | 307 | self, return_value='off') | ||
2630 | 308 | markNodeBroken = yield self.patch_rpc_methods() | ||
2631 | 309 | |||
2632 | 310 | yield power.change_power_state( | ||
2633 | 311 | system_id, hostname, power_type, power_change, context) | ||
2634 | 312 | |||
2635 | 313 | # The node has been marked broken. | ||
2636 | 314 | msg = "Timeout after %s tries" % len( | ||
2637 | 315 | power.default_waiting_policy) | ||
2638 | 316 | self.assertThat( | ||
2639 | 317 | markNodeBroken, | ||
2640 | 318 | MockCalledOnceWith( | ||
2641 | 319 | ANY, | ||
2642 | 320 | system_id=system_id, | ||
2643 | 321 | error_description=msg) | ||
2644 | 322 | ) | ||
2645 | 323 | |||
2646 | 324 | @inlineCallbacks | ||
2647 | 325 | def test_change_power_state_marks_the_node_broken_if_exception(self): | ||
2648 | 326 | system_id = factory.make_name('system_id') | ||
2649 | 327 | hostname = factory.make_name('hostname') | ||
2650 | 328 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2651 | 329 | power_change = 'on' | ||
2652 | 330 | context = { | ||
2653 | 331 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2654 | 332 | } | ||
2655 | 333 | self.patch(power, 'pause') | ||
2656 | 334 | power.power_action_registry[system_id] = power_change, sentinel.d | ||
2657 | 335 | # Simulate an exception. | ||
2658 | 336 | exception_message = factory.make_name('exception') | ||
2659 | 337 | power_action, execute = patch_power_action( | ||
2660 | 338 | self, side_effect=PowerActionFail(exception_message)) | ||
2661 | 339 | markNodeBroken = yield self.patch_rpc_methods() | ||
2662 | 340 | |||
2663 | 341 | with ExpectedException(PowerActionFail): | ||
2664 | 342 | yield power.change_power_state( | ||
2665 | 343 | system_id, hostname, power_type, power_change, context) | ||
2666 | 344 | |||
2667 | 345 | error_message = "Node could not be powered on: %s" % exception_message | ||
2668 | 346 | self.assertThat( | ||
2669 | 347 | markNodeBroken, MockCalledOnceWith( | ||
2670 | 348 | ANY, system_id=system_id, error_description=error_message)) | ||
2671 | 349 | |||
2672 | 350 | @inlineCallbacks | ||
2673 | 351 | def test_change_power_state_pauses_inbetween_retries(self): | ||
2674 | 352 | system_id = factory.make_name('system_id') | ||
2675 | 353 | hostname = factory.make_name('hostname') | ||
2676 | 354 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2677 | 355 | power_change = 'on' | ||
2678 | 356 | context = { | ||
2679 | 357 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2680 | 358 | } | ||
2681 | 359 | power.power_action_registry[system_id] = power_change, sentinel.d | ||
2682 | 360 | # Simulate two failures to power up the node, then a success. | ||
2683 | 361 | power_action, execute = patch_power_action( | ||
2684 | 362 | self, side_effect=[None, 'off', None, 'off', None, 'on']) | ||
2685 | 363 | # Patch calls to pause() to `execute` so that we record both in the | ||
2686 | 364 | # same place, and can thus see ordering. | ||
2687 | 365 | self.patch(power, 'pause', execute) | ||
2688 | 366 | |||
2689 | 367 | yield self.patch_rpc_methods() | ||
2690 | 368 | |||
2691 | 369 | yield power.change_power_state( | ||
2692 | 370 | system_id, hostname, power_type, power_change, context) | ||
2693 | 371 | |||
2694 | 372 | self.assertThat(execute, MockCallsMatch( | ||
2695 | 373 | call(power_change=power_change, **context), | ||
2696 | 374 | call(1, reactor), # pause(1, reactor) | ||
2697 | 375 | call(power_change='query', **context), | ||
2698 | 376 | call(power_change=power_change, **context), | ||
2699 | 377 | call(2, reactor), # pause(1, reactor) | ||
2700 | 378 | call(power_change='query', **context), | ||
2701 | 379 | )) | ||
2702 | 380 | |||
2703 | 381 | |||
2704 | 382 | class TestPowerQuery(MAASTestCase): | ||
2705 | 383 | |||
2706 | 384 | def setUp(self): | ||
2707 | 385 | super(TestPowerQuery, self).setUp() | ||
2708 | 386 | self.patch( | ||
2709 | 387 | provisioningserver.rpc.power, 'deferToThread', maybeDeferred) | ||
2710 | 388 | |||
2711 | 389 | def patch_rpc_methods(self, return_value={}, side_effect=None): | ||
2712 | 390 | fixture = self.useFixture(MockClusterToRegionRPCFixture()) | ||
2713 | 391 | protocol, io = fixture.makeEventLoop( | ||
2714 | 392 | region.MarkNodeFailed, region.SendEvent, | ||
2715 | 393 | region.UpdateNodePowerState) | ||
2716 | 394 | protocol.MarkNodeFailed.return_value = return_value | ||
2717 | 395 | protocol.MarkNodeFailed.side_effect = side_effect | ||
2718 | 396 | return protocol.SendEvent, protocol.MarkNodeFailed, io | ||
2719 | 397 | |||
2720 | 398 | def test_get_power_state_querys_node(self): | ||
2721 | 399 | system_id = factory.make_name('system_id') | ||
2722 | 400 | hostname = factory.make_name('hostname') | ||
2723 | 401 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2724 | 402 | power_state = random.choice(['on', 'off']) | ||
2725 | 403 | context = { | ||
2726 | 404 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2727 | 405 | } | ||
2728 | 406 | self.patch(power, 'pause') | ||
2729 | 407 | # Patch the power action utility so that it says the node is | ||
2730 | 408 | # in on/off power state. | ||
2731 | 409 | power_action, execute = patch_power_action( | ||
2732 | 410 | self, return_value=power_state) | ||
2733 | 411 | _, markNodeBroken, io = self.patch_rpc_methods() | ||
2734 | 412 | |||
2735 | 413 | d = power.get_power_state( | ||
2736 | 414 | system_id, hostname, power_type, context) | ||
2737 | 415 | # This blocks until the deferred is complete | ||
2738 | 416 | io.flush() | ||
2739 | 417 | self.assertEqual(power_state, extract_result(d)) | ||
2740 | 418 | self.assertThat( | ||
2741 | 419 | execute, | ||
2742 | 420 | MockCallsMatch( | ||
2743 | 421 | # One call to change the power state. | ||
2744 | 422 | call(power_change='query', **context), | ||
2745 | 423 | ), | ||
2746 | 424 | ) | ||
2747 | 425 | |||
2748 | 426 | def test_get_power_state_returns_unknown_for_certain_power_types(self): | ||
2749 | 427 | system_id = factory.make_name('system_id') | ||
2750 | 428 | hostname = factory.make_name('hostname') | ||
2751 | 429 | # Use a power type that is not among power.QUERY_POWER_TYPES. | ||
2752 | 430 | power_type = factory.make_name('power_type') | ||
2753 | 431 | context = { | ||
2754 | 432 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2755 | 433 | } | ||
2756 | 434 | _, _, io = self.patch_rpc_methods() | ||
2757 | 435 | |||
2758 | 436 | d = power.get_power_state( | ||
2759 | 437 | system_id, hostname, power_type, context) | ||
2760 | 438 | |||
2761 | 439 | return assert_fails_with(d, PowerActionFail) | ||
2762 | 440 | |||
2763 | 441 | def test_get_power_state_retries_if_power_query_fails(self): | ||
2764 | 442 | system_id = factory.make_name('system_id') | ||
2765 | 443 | hostname = factory.make_name('hostname') | ||
2766 | 444 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2767 | 445 | power_state = random.choice(['on', 'off']) | ||
2768 | 446 | err_msg = factory.make_name('error') | ||
2769 | 447 | context = { | ||
2770 | 448 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2771 | 449 | } | ||
2772 | 450 | self.patch(power, 'pause') | ||
2773 | 451 | # Simulate a failure to power query the node, then success. | ||
2774 | 452 | power_action, execute = patch_power_action( | ||
2775 | 453 | self, side_effect=[PowerActionFail(err_msg), power_state]) | ||
2776 | 454 | sendEvent, markNodeBroken, io = self.patch_rpc_methods() | ||
2777 | 455 | |||
2778 | 456 | d = power.get_power_state( | ||
2779 | 457 | system_id, hostname, power_type, context) | ||
2780 | 458 | # This blocks until the deferred is complete | ||
2781 | 459 | io.flush() | ||
2782 | 460 | self.assertEqual(power_state, extract_result(d)) | ||
2783 | 461 | self.assertThat( | ||
2784 | 462 | execute, | ||
2785 | 463 | MockCallsMatch( | ||
2786 | 464 | call(power_change='query', **context), | ||
2787 | 465 | call(power_change='query', **context), | ||
2788 | 466 | ) | ||
2789 | 467 | ) | ||
2790 | 468 | # The node hasn't been marked broken. | ||
2791 | 469 | self.assertThat(markNodeBroken, MockNotCalled()) | ||
2792 | 470 | |||
2793 | 471 | def test_get_power_state_changes_power_state_if_failure(self): | ||
2794 | 472 | system_id = factory.make_name('system_id') | ||
2795 | 473 | hostname = factory.make_name('hostname') | ||
2796 | 474 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2797 | 475 | err_msg = factory.make_name('error') | ||
2798 | 476 | context = { | ||
2799 | 477 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2800 | 478 | } | ||
2801 | 479 | self.patch(power, 'pause') | ||
2802 | 480 | power_state_update = self.patch_autospec(power, 'power_state_update') | ||
2803 | 481 | |||
2804 | 482 | # Simulate a persistent failure. | ||
2805 | 483 | power_action, execute = patch_power_action( | ||
2806 | 484 | self, side_effect=PowerActionFail(err_msg)) | ||
2807 | 485 | _, _, io = self.patch_rpc_methods() | ||
2808 | 486 | |||
2809 | 487 | d = power.get_power_state( | ||
2810 | 488 | system_id, hostname, power_type, context) | ||
2811 | 489 | io.flush() | ||
2812 | 490 | d.addCallback(self.fail) | ||
2813 | 491 | |||
2814 | 492 | error = self.assertRaises(PowerActionFail, extract_result, d) | ||
2815 | 493 | self.assertEqual(err_msg, unicode(error)) | ||
2816 | 494 | self.assertThat( | ||
2817 | 495 | power_state_update, MockCalledOnceWith(system_id, 'error')) | ||
2818 | 496 | |||
2819 | 497 | def test_get_power_state_changes_power_state_if_success(self): | ||
2820 | 498 | system_id = factory.make_name('system_id') | ||
2821 | 499 | hostname = factory.make_name('hostname') | ||
2822 | 500 | power_state = random.choice(['on', 'off']) | ||
2823 | 501 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2824 | 502 | context = { | ||
2825 | 503 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2826 | 504 | } | ||
2827 | 505 | self.patch(power, 'pause') | ||
2828 | 506 | power_state_update = self.patch_autospec(power, 'power_state_update') | ||
2829 | 507 | |||
2830 | 508 | # Simulate success. | ||
2831 | 509 | power_action, execute = patch_power_action( | ||
2832 | 510 | self, return_value=power_state) | ||
2833 | 511 | _, _, io = self.patch_rpc_methods() | ||
2834 | 512 | |||
2835 | 513 | d = power.get_power_state( | ||
2836 | 514 | system_id, hostname, power_type, context) | ||
2837 | 515 | io.flush() | ||
2838 | 516 | self.assertEqual(power_state, extract_result(d)) | ||
2839 | 517 | self.assertThat( | ||
2840 | 518 | power_state_update, MockCalledOnceWith(system_id, power_state)) | ||
2841 | 519 | |||
2842 | 520 | def test_get_power_state_changes_power_state_if_unknown(self): | ||
2843 | 521 | system_id = factory.make_name('system_id') | ||
2844 | 522 | hostname = factory.make_name('hostname') | ||
2845 | 523 | power_state = "unknown" | ||
2846 | 524 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2847 | 525 | context = { | ||
2848 | 526 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2849 | 527 | } | ||
2850 | 528 | self.patch(power, 'pause') | ||
2851 | 529 | power_state_update = self.patch_autospec(power, 'power_state_update') | ||
2852 | 530 | |||
2853 | 531 | # Simulate success. | ||
2854 | 532 | power_action, execute = patch_power_action( | ||
2855 | 533 | self, return_value=power_state) | ||
2856 | 534 | _, _, io = self.patch_rpc_methods() | ||
2857 | 535 | |||
2858 | 536 | d = power.get_power_state( | ||
2859 | 537 | system_id, hostname, power_type, context) | ||
2860 | 538 | io.flush() | ||
2861 | 539 | self.assertEqual(power_state, extract_result(d)) | ||
2862 | 540 | self.assertThat( | ||
2863 | 541 | power_state_update, MockCalledOnceWith(system_id, power_state)) | ||
2864 | 542 | |||
2865 | 543 | def test_get_power_state_pauses_inbetween_retries(self): | ||
2866 | 544 | system_id = factory.make_name('system_id') | ||
2867 | 545 | hostname = factory.make_name('hostname') | ||
2868 | 546 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2869 | 547 | context = { | ||
2870 | 548 | factory.make_name('context-key'): factory.make_name('context-val') | ||
2871 | 549 | } | ||
2872 | 550 | # Simulate two failures to power up the node, then a success. | ||
2873 | 551 | power_action, execute = patch_power_action( | ||
2874 | 552 | self, side_effect=[PowerActionFail, PowerActionFail, 'off']) | ||
2875 | 553 | self.patch(power, "deferToThread", maybeDeferred) | ||
2876 | 554 | _, _, io = self.patch_rpc_methods() | ||
2877 | 555 | clock = Clock() | ||
2878 | 556 | |||
2879 | 557 | calls_and_pause = [ | ||
2880 | 558 | ([ | ||
2881 | 559 | call(power_change='query', **context), | ||
2882 | 560 | ], 3), | ||
2883 | 561 | ([ | ||
2884 | 562 | call(power_change='query', **context), | ||
2885 | 563 | ], 5), | ||
2886 | 564 | ([ | ||
2887 | 565 | call(power_change='query', **context), | ||
2888 | 566 | ], 10), | ||
2889 | 567 | ] | ||
2890 | 568 | calls = [] | ||
2891 | 569 | d = power.get_power_state( | ||
2892 | 570 | system_id, hostname, power_type, context, clock=clock) | ||
2893 | 571 | for newcalls, waiting_time in calls_and_pause: | ||
2894 | 572 | calls.extend(newcalls) | ||
2895 | 573 | # This blocks until the deferred is complete | ||
2896 | 574 | io.flush() | ||
2897 | 575 | self.assertThat(execute, MockCallsMatch(*calls)) | ||
2898 | 576 | clock.advance(waiting_time) | ||
2899 | 577 | self.assertEqual("off", extract_result(d)) | ||
2900 | 578 | |||
2901 | 579 | |||
2902 | 580 | class TestPowerQueryExceptions(MAASTestCase): | ||
2903 | 581 | |||
2904 | 582 | scenarios = tuple( | ||
2905 | 583 | (power_type, { | ||
2906 | 584 | "power_type": power_type, | ||
2907 | 585 | "func": ( # Function to invoke driver. | ||
2908 | 586 | "perform_power_driver_query" | ||
2909 | 587 | if power_type in PowerDriverRegistry | ||
2910 | 588 | else "perform_power_query"), | ||
2911 | 589 | "waits": ( # Pauses between retries. | ||
2912 | 590 | [] if power_type in PowerDriverRegistry | ||
2913 | 591 | else power.default_waiting_policy), | ||
2914 | 592 | "calls": ( # No. of calls to the driver. | ||
2915 | 593 | 1 if power_type in PowerDriverRegistry | ||
2916 | 594 | else len(power.default_waiting_policy)), | ||
2917 | 595 | }) | ||
2918 | 596 | for power_type in power.QUERY_POWER_TYPES | ||
2919 | 597 | ) | ||
2920 | 598 | |||
2921 | 599 | def test_get_power_state_captures_all_exceptions(self): | ||
2922 | 600 | logger_twisted = self.useFixture(TwistedLoggerFixture()) | ||
2923 | 601 | logger_maaslog = self.useFixture(FakeLogger("maas")) | ||
2924 | 602 | |||
2925 | 603 | # Avoid threads here. | ||
2926 | 604 | self.patch(power, "deferToThread", maybeDeferred) | ||
2927 | 605 | |||
2928 | 606 | exception_type = factory.make_exception_type() | ||
2929 | 607 | exception_message = factory.make_string() | ||
2930 | 608 | exception = exception_type(exception_message) | ||
2931 | 609 | |||
2932 | 610 | # Pretend the query always fails with `exception`. | ||
2933 | 611 | query = self.patch_autospec(power, self.func) | ||
2934 | 612 | query.side_effect = always_fail_with(exception) | ||
2935 | 613 | |||
2936 | 614 | # Intercept calls to power_query_failure(). | ||
2937 | 615 | self.patch_autospec(power, "power_query_failure") | ||
2938 | 616 | |||
2939 | 617 | system_id = factory.make_name('system_id') | ||
2940 | 618 | hostname = factory.make_name('hostname') | ||
2941 | 619 | context = sentinel.context | ||
2942 | 620 | clock = Clock() | ||
2943 | 621 | |||
2944 | 622 | d = power.get_power_state( | ||
2945 | 623 | system_id, hostname, self.power_type, context, clock) | ||
2946 | 624 | |||
2947 | 625 | # Crank through some number of retries. | ||
2948 | 626 | for wait in self.waits: | ||
2949 | 627 | self.assertFalse(d.called) | ||
2950 | 628 | clock.advance(wait) | ||
2951 | 629 | self.assertTrue(d.called) | ||
2952 | 630 | |||
2953 | 631 | # Finally the exception from the query is raised. | ||
2954 | 632 | self.assertRaises(exception_type, extract_result, d) | ||
2955 | 633 | |||
2956 | 634 | # The broken power query function patched earlier was called the same | ||
2957 | 635 | # number of times as there are steps in the default waiting policy. | ||
2958 | 636 | expected_call = call(system_id, hostname, self.power_type, context) | ||
2959 | 637 | expected_calls = [expected_call] * self.calls | ||
2960 | 638 | self.assertThat(query, MockCallsMatch(*expected_calls)) | ||
2961 | 639 | |||
2962 | 640 | # power_query_failure() was called once at the end with a message | ||
2963 | 641 | # constructed using the error message we fabricated at the beginning. | ||
2964 | 642 | expected_message = ( | ||
2965 | 643 | "Power state could not be queried: %s" % exception_message) | ||
2966 | 644 | self.assertThat(power.power_query_failure, MockCalledOnceWith( | ||
2967 | 645 | system_id, hostname, expected_message)) | ||
2968 | 646 | |||
2969 | 647 | # Nothing was logged to the Twisted log or to maaslog; that happens | ||
2970 | 648 | # elsewhere, in maaslog_query_failure() and maaslog_query(). | ||
2971 | 649 | self.assertEqual("", logger_twisted.output) | ||
2972 | 650 | self.assertEqual("", logger_maaslog.output) | ||
2973 | 651 | |||
2974 | 652 | |||
2975 | 653 | class TestPowerQueryAsync(MAASTestCase): | ||
2976 | 654 | |||
2977 | 655 | run_tests_with = MAASTwistedRunTest.make_factory(timeout=5) | ||
2978 | 656 | |||
2979 | 657 | def make_node(self, power_type=None): | ||
2980 | 658 | system_id = factory.make_name('system_id') | ||
2981 | 659 | hostname = factory.make_name('hostname') | ||
2982 | 660 | if power_type is None: | ||
2983 | 661 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
2984 | 662 | state = random.choice(['on', 'off', 'unknown', 'error']) | ||
2985 | 663 | context = { | ||
2986 | 664 | factory.make_name('context-key'): ( | ||
2987 | 665 | factory.make_name('context-val')) | ||
2988 | 666 | } | ||
2989 | 667 | return { | ||
2990 | 668 | 'context': context, | ||
2991 | 669 | 'hostname': hostname, | ||
2992 | 670 | 'power_state': state, | ||
2993 | 671 | 'power_type': power_type, | ||
2994 | 672 | 'system_id': system_id, | ||
2995 | 673 | } | ||
2996 | 674 | |||
2997 | 675 | def make_nodes(self, count=3): | ||
2998 | 676 | nodes = [self.make_node() for _ in xrange(count)] | ||
2999 | 677 | # Sanity check that these nodes are something that can emerge | ||
3000 | 678 | # from a call to ListNodePowerParameters. | ||
3001 | 679 | region.ListNodePowerParameters.makeResponse({"nodes": nodes}, None) | ||
3002 | 680 | return nodes | ||
3003 | 681 | |||
3004 | 682 | def pick_alternate_state(self, state): | ||
3005 | 683 | return random.choice([ | ||
3006 | 684 | value for value in ['on', 'off', 'unknown', 'error'] | ||
3007 | 685 | if value != state]) | ||
3008 | 686 | |||
3009 | 687 | @inlineCallbacks | ||
3010 | 688 | def test_query_all_nodes_calls_get_power_state(self): | ||
3011 | 689 | nodes = self.make_nodes() | ||
3012 | 690 | # Report back that all nodes' power states are as recorded. | ||
3013 | 691 | power_states = [node['power_state'] for node in nodes] | ||
3014 | 692 | get_power_state = self.patch(power, 'get_power_state') | ||
3015 | 693 | get_power_state.side_effect = [ | ||
3016 | 694 | succeed(power_state) | ||
3017 | 695 | for power_state in power_states | ||
3018 | 696 | ] | ||
3019 | 697 | |||
3020 | 698 | yield power.query_all_nodes(nodes) | ||
3021 | 699 | self.assertThat(get_power_state, MockCallsMatch(*( | ||
3022 | 700 | call( | ||
3023 | 701 | node['system_id'], node['hostname'], | ||
3024 | 702 | node['power_type'], node['context'], | ||
3025 | 703 | clock=reactor) | ||
3026 | 704 | for node in nodes | ||
3027 | 705 | ))) | ||
3028 | 706 | |||
3029 | 707 | @inlineCallbacks | ||
3030 | 708 | def test_query_all_nodes_logs_skip_if_node_in_action_registry(self): | ||
3031 | 709 | node = self.make_node() | ||
3032 | 710 | power.power_action_registry[node['system_id']] = sentinel.action | ||
3033 | 711 | with FakeLogger("maas.power", level=logging.DEBUG) as maaslog: | ||
3034 | 712 | yield power.query_all_nodes([node]) | ||
3035 | 713 | self.assertDocTestMatches( | ||
3036 | 714 | "hostname-...: Skipping query power status, " | ||
3037 | 715 | "power action already in progress.", | ||
3038 | 716 | maaslog.output) | ||
3039 | 717 | |||
3040 | 718 | @inlineCallbacks | ||
3041 | 719 | def test_query_all_nodes_skips_nodes_in_action_registry(self): | ||
3042 | 720 | nodes = self.make_nodes() | ||
3043 | 721 | |||
3044 | 722 | # First node is in the registry. | ||
3045 | 723 | power.power_action_registry[nodes[0]['system_id']] = sentinel.action | ||
3046 | 724 | |||
3047 | 725 | # Report back power state of nodes' not in registry. | ||
3048 | 726 | power_states = [node['power_state'] for node in nodes[1:]] | ||
3049 | 727 | get_power_state = self.patch(power, 'get_power_state') | ||
3050 | 728 | get_power_state.side_effect = [ | ||
3051 | 729 | succeed(power_state) | ||
3052 | 730 | for power_state in power_states | ||
3053 | 731 | ] | ||
3054 | 732 | |||
3055 | 733 | yield power.query_all_nodes(nodes) | ||
3056 | 734 | self.assertThat(get_power_state, MockCallsMatch(*( | ||
3057 | 735 | call( | ||
3058 | 736 | node['system_id'], node['hostname'], | ||
3059 | 737 | node['power_type'], node['context'], | ||
3060 | 738 | clock=reactor) | ||
3061 | 739 | for node in nodes[1:] | ||
3062 | 740 | ))) | ||
3063 | 741 | self.assertThat( | ||
3064 | 742 | get_power_state, Not(MockCalledWith( | ||
3065 | 743 | nodes[0]['system_id'], nodes[0]['hostname'], | ||
3066 | 744 | nodes[0]['power_type'], nodes[0]['context'], | ||
3067 | 745 | clock=reactor))) | ||
3068 | 746 | |||
3069 | 747 | @inlineCallbacks | ||
3070 | 748 | def test_query_all_nodes_only_queries_queryable_power_types(self): | ||
3071 | 749 | nodes = self.make_nodes() | ||
3072 | 750 | # nodes are all queryable, so add one that isn't: | ||
3073 | 751 | nodes.append(self.make_node(power_type='ether_wake')) | ||
3074 | 752 | |||
3075 | 753 | # Report back that all nodes' power states are as recorded. | ||
3076 | 754 | power_states = [node['power_state'] for node in nodes] | ||
3077 | 755 | get_power_state = self.patch(power, 'get_power_state') | ||
3078 | 756 | get_power_state.side_effect = [ | ||
3079 | 757 | succeed(power_state) | ||
3080 | 758 | for power_state in power_states | ||
3081 | 759 | ] | ||
3082 | 760 | |||
3083 | 761 | yield power.query_all_nodes(nodes) | ||
3084 | 762 | self.assertThat(get_power_state, MockCallsMatch(*( | ||
3085 | 763 | call( | ||
3086 | 764 | node['system_id'], node['hostname'], | ||
3087 | 765 | node['power_type'], node['context'], | ||
3088 | 766 | clock=reactor) | ||
3089 | 767 | for node in nodes | ||
3090 | 768 | if node['power_type'] in power.QUERY_POWER_TYPES | ||
3091 | 769 | ))) | ||
3092 | 770 | |||
3093 | 771 | @inlineCallbacks | ||
3094 | 772 | def test_query_all_nodes_swallows_PowerActionFail(self): | ||
3095 | 773 | node1, node2 = self.make_nodes(2) | ||
3096 | 774 | new_state_2 = self.pick_alternate_state(node2['power_state']) | ||
3097 | 775 | get_power_state = self.patch(power, 'get_power_state') | ||
3098 | 776 | error_msg = factory.make_name("error") | ||
3099 | 777 | get_power_state.side_effect = [ | ||
3100 | 778 | fail(PowerActionFail(error_msg)), succeed(new_state_2)] | ||
3101 | 779 | |||
3102 | 780 | with FakeLogger("maas.power", level=logging.DEBUG) as maaslog: | ||
3103 | 781 | yield power.query_all_nodes([node1, node2]) | ||
3104 | 782 | |||
3105 | 783 | self.assertDocTestMatches( | ||
3106 | 784 | """\ | ||
3107 | 785 | hostname-...: Could not query power state: %s. | ||
3108 | 786 | hostname-...: Power state has changed from ... to ... | ||
3109 | 787 | """ % error_msg, | ||
3110 | 788 | maaslog.output) | ||
3111 | 789 | |||
3112 | 790 | @inlineCallbacks | ||
3113 | 791 | def test_query_all_nodes_swallows_NoSuchNode(self): | ||
3114 | 792 | node1, node2 = self.make_nodes(2) | ||
3115 | 793 | new_state_2 = self.pick_alternate_state(node2['power_state']) | ||
3116 | 794 | get_power_state = self.patch(power, 'get_power_state') | ||
3117 | 795 | get_power_state.side_effect = [ | ||
3118 | 796 | fail(exceptions.NoSuchNode()), succeed(new_state_2)] | ||
3119 | 797 | |||
3120 | 798 | with FakeLogger("maas.power", level=logging.DEBUG) as maaslog: | ||
3121 | 799 | yield power.query_all_nodes([node1, node2]) | ||
3122 | 800 | |||
3123 | 801 | self.assertDocTestMatches( | ||
3124 | 802 | """\ | ||
3125 | 803 | hostname-...: Could not update power state: no such node. | ||
3126 | 804 | hostname-...: Power state has changed from ... to ... | ||
3127 | 805 | """, | ||
3128 | 806 | maaslog.output) | ||
3129 | 807 | |||
3130 | 808 | @inlineCallbacks | ||
3131 | 809 | def test_query_all_nodes_swallows_Exception(self): | ||
3132 | 810 | node1, node2 = self.make_nodes(2) | ||
3133 | 811 | error_message = factory.make_name("error") | ||
3134 | 812 | error_type = factory.make_exception_type() | ||
3135 | 813 | new_state_2 = self.pick_alternate_state(node2['power_state']) | ||
3136 | 814 | get_power_state = self.patch(power, 'get_power_state') | ||
3137 | 815 | get_power_state.side_effect = [ | ||
3138 | 816 | fail(error_type(error_message)), | ||
3139 | 817 | succeed(new_state_2), | ||
3140 | 818 | ] | ||
3141 | 819 | |||
3142 | 820 | maaslog = FakeLogger("maas.power", level=logging.DEBUG) | ||
3143 | 821 | twistlog = TwistedLoggerFixture() | ||
3144 | 822 | |||
3145 | 823 | with maaslog, twistlog: | ||
3146 | 824 | yield power.query_all_nodes([node1, node2]) | ||
3147 | 825 | |||
3148 | 826 | self.assertDocTestMatches( | ||
3149 | 827 | """\ | ||
3150 | 828 | hostname-...: Failed to refresh power state: %s | ||
3151 | 829 | hostname-...: Power state has changed from ... to ... | ||
3152 | 830 | """ % error_message, | ||
3153 | 831 | maaslog.output) | ||
3154 | 832 | self.assertDocTestMatches( | ||
3155 | 833 | """\ | ||
3156 | 834 | Failed to refresh power state. | ||
3157 | 835 | Traceback (most recent call last): | ||
3158 | 836 | Failure: maastesting.factory.TestException#...: %s | ||
3159 | 837 | """ % error_message, | ||
3160 | 838 | twistlog.output) | ||
3161 | 839 | |||
3162 | 840 | @inlineCallbacks | ||
3163 | 841 | def test_query_all_nodes_returns_deferredlist_of_number_of_nodes(self): | ||
3164 | 842 | node1, node2 = self.make_nodes(2) | ||
3165 | 843 | get_power_state = self.patch(power, 'get_power_state') | ||
3166 | 844 | get_power_state.side_effect = [ | ||
3167 | 845 | succeed(node1['power_state']), succeed(node2['power_state'])] | ||
3168 | 846 | |||
3169 | 847 | results = yield power.query_all_nodes([node1, node2]) | ||
3170 | 848 | self.assertEqual( | ||
3171 | 849 | [(True, node1['power_state']), (True, node2['power_state'])], | ||
3172 | 850 | results) | ||
3173 | 851 | |||
3174 | 852 | |||
3175 | 853 | class TestMaybeChangePowerState(MAASTestCase): | ||
3176 | 854 | |||
3177 | 855 | run_tests_with = MAASTwistedRunTest.make_factory(timeout=5) | ||
3178 | 856 | |||
3179 | 857 | def setUp(self): | ||
3180 | 858 | super(TestMaybeChangePowerState, self).setUp() | ||
3181 | 859 | self.patch(power, 'power_action_registry', {}) | ||
3182 | 860 | |||
3183 | 861 | def patch_methods_using_rpc(self): | ||
3184 | 862 | self.patch_autospec(power, 'power_change_starting') | ||
3185 | 863 | power.power_change_starting.side_effect = always_succeed_with(None) | ||
3186 | 864 | |||
3187 | 865 | self.patch_autospec(power, 'change_power_state') | ||
3188 | 866 | power.change_power_state.side_effect = always_succeed_with(None) | ||
3189 | 867 | |||
3190 | 868 | def test_always_returns_deferred(self): | ||
3191 | 869 | clock = Clock() | ||
3192 | 870 | d = power.maybe_change_power_state( | ||
3193 | 871 | sentinel.system_id, sentinel.hostname, sentinel.power_type, | ||
3194 | 872 | random.choice(("on", "off")), sentinel.context, clock=clock) | ||
3195 | 873 | self.assertThat(d, IsInstance(Deferred)) | ||
3196 | 874 | |||
3197 | 875 | @inlineCallbacks | ||
3198 | 876 | def test_adds_action_to_registry(self): | ||
3199 | 877 | self.patch_methods_using_rpc() | ||
3200 | 878 | |||
3201 | 879 | system_id = factory.make_name('system_id') | ||
3202 | 880 | hostname = factory.make_name('hostname') | ||
3203 | 881 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
3204 | 882 | power_change = random.choice(['on', 'off']) | ||
3205 | 883 | context = { | ||
3206 | 884 | factory.make_name('context-key'): factory.make_name('context-val') | ||
3207 | 885 | } | ||
3208 | 886 | |||
3209 | 887 | yield power.maybe_change_power_state( | ||
3210 | 888 | system_id, hostname, power_type, power_change, context) | ||
3211 | 889 | self.assertEqual( | ||
3212 | 890 | {system_id: (power_change, ANY)}, | ||
3213 | 891 | power.power_action_registry) | ||
3214 | 892 | reactor.runUntilCurrent() # Run all delayed calls. | ||
3215 | 893 | self.assertEqual({}, power.power_action_registry) | ||
3216 | 894 | |||
3217 | 895 | @inlineCallbacks | ||
3218 | 896 | def test_errors_when_change_conflicts_with_in_progress_change(self): | ||
3219 | 897 | system_id = factory.make_name('system_id') | ||
3220 | 898 | hostname = factory.make_name('hostname') | ||
3221 | 899 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
3222 | 900 | power_changes = ['on', 'off'] | ||
3223 | 901 | random.shuffle(power_changes) | ||
3224 | 902 | current_power_change, power_change = power_changes | ||
3225 | 903 | context = { | ||
3226 | 904 | factory.make_name('context-key'): factory.make_name('context-val') | ||
3227 | 905 | } | ||
3228 | 906 | power.power_action_registry[system_id] = ( | ||
3229 | 907 | current_power_change, sentinel.d) | ||
3230 | 908 | with ExpectedException(exceptions.PowerActionAlreadyInProgress): | ||
3231 | 909 | yield power.maybe_change_power_state( | ||
3232 | 910 | system_id, hostname, power_type, power_change, context) | ||
3233 | 911 | |||
3234 | 912 | @inlineCallbacks | ||
3235 | 913 | def test_does_nothing_when_change_matches_in_progress_change(self): | ||
3236 | 914 | system_id = factory.make_name('system_id') | ||
3237 | 915 | hostname = factory.make_name('hostname') | ||
3238 | 916 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
3239 | 917 | current_power_change = power_change = random.choice(['on', 'off']) | ||
3240 | 918 | context = { | ||
3241 | 919 | factory.make_name('context-key'): factory.make_name('context-val') | ||
3242 | 920 | } | ||
3243 | 921 | power.power_action_registry[system_id] = ( | ||
3244 | 922 | current_power_change, sentinel.d) | ||
3245 | 923 | yield power.maybe_change_power_state( | ||
3246 | 924 | system_id, hostname, power_type, power_change, context) | ||
3247 | 925 | self.assertThat(power.power_action_registry, Equals( | ||
3248 | 926 | {system_id: (power_change, sentinel.d)})) | ||
3249 | 927 | |||
3250 | 928 | @inlineCallbacks | ||
3251 | 929 | def test_calls_change_power_state_later(self): | ||
3252 | 930 | self.patch_methods_using_rpc() | ||
3253 | 931 | |||
3254 | 932 | system_id = factory.make_name('system_id') | ||
3255 | 933 | hostname = factory.make_name('hostname') | ||
3256 | 934 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
3257 | 935 | power_change = random.choice(['on', 'off']) | ||
3258 | 936 | context = { | ||
3259 | 937 | factory.make_name('context-key'): factory.make_name('context-val') | ||
3260 | 938 | } | ||
3261 | 939 | |||
3262 | 940 | yield power.maybe_change_power_state( | ||
3263 | 941 | system_id, hostname, power_type, power_change, context) | ||
3264 | 942 | reactor.runUntilCurrent() # Run all delayed calls. | ||
3265 | 943 | self.assertThat( | ||
3266 | 944 | power.change_power_state, | ||
3267 | 945 | MockCalledOnceWith( | ||
3268 | 946 | system_id, hostname, power_type, power_change, context, | ||
3269 | 947 | power.reactor)) | ||
3270 | 948 | |||
3271 | 949 | @inlineCallbacks | ||
3272 | 950 | def test_clears_lock_if_change_power_state_success(self): | ||
3273 | 951 | self.patch_methods_using_rpc() | ||
3274 | 952 | |||
3275 | 953 | system_id = factory.make_name('system_id') | ||
3276 | 954 | hostname = factory.make_name('hostname') | ||
3277 | 955 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
3278 | 956 | power_change = random.choice(['on', 'off']) | ||
3279 | 957 | context = { | ||
3280 | 958 | factory.make_name('context-key'): factory.make_name('context-val') | ||
3281 | 959 | } | ||
3282 | 960 | |||
3283 | 961 | yield power.maybe_change_power_state( | ||
3284 | 962 | system_id, hostname, power_type, power_change, context) | ||
3285 | 963 | reactor.runUntilCurrent() # Run all delayed calls. | ||
3286 | 964 | self.assertNotIn(system_id, power.power_action_registry) | ||
3287 | 965 | |||
3288 | 966 | @inlineCallbacks | ||
3289 | 967 | def test_clears_lock_if_change_power_state_fails(self): | ||
3290 | 968 | |||
3291 | 969 | class TestException(Exception): | ||
3292 | 970 | pass | ||
3293 | 971 | |||
3294 | 972 | self.patch_autospec(power, 'power_change_starting') | ||
3295 | 973 | power.power_change_starting.side_effect = TestException('boom') | ||
3296 | 974 | |||
3297 | 975 | system_id = factory.make_name('system_id') | ||
3298 | 976 | hostname = factory.make_hostname() | ||
3299 | 977 | power_type = sentinel.power_type | ||
3300 | 978 | power_change = random.choice(['on', 'off']) | ||
3301 | 979 | context = sentinel.context | ||
3302 | 980 | |||
3303 | 981 | logger = self.useFixture(TwistedLoggerFixture()) | ||
3304 | 982 | |||
3305 | 983 | yield power.maybe_change_power_state( | ||
3306 | 984 | system_id, hostname, power_type, power_change, context) | ||
3307 | 985 | reactor.runUntilCurrent() # Run all delayed calls. | ||
3308 | 986 | self.assertNotIn(system_id, power.power_action_registry) | ||
3309 | 987 | self.assertDocTestMatches( | ||
3310 | 988 | """\ | ||
3311 | 989 | %s: Power could not be turned %s. | ||
3312 | 990 | Traceback (most recent call last): | ||
3313 | 991 | ... | ||
3314 | 992 | %s.TestException: boom | ||
3315 | 993 | """ % (hostname, power_change, __name__), | ||
3316 | 994 | logger.dump()) | ||
3317 | 995 | |||
3318 | 996 | @inlineCallbacks | ||
3319 | 997 | def test_clears_lock_if_change_power_state_is_cancelled(self): | ||
3320 | 998 | # Patch in an unfired Deferred here. This will pause the call so that | ||
3321 | 999 | # we can grab the delayed call from the registry in time to cancel it. | ||
3322 | 1000 | self.patch_autospec(power, 'change_power_state') | ||
3323 | 1001 | power.change_power_state.return_value = Deferred() | ||
3324 | 1002 | mock_power_change_failure = self.patch_autospec( | ||
3325 | 1003 | power, 'power_change_failure') | ||
3326 | 1004 | |||
3327 | 1005 | system_id = factory.make_name('system_id') | ||
3328 | 1006 | hostname = factory.make_hostname() | ||
3329 | 1007 | power_type = sentinel.power_type | ||
3330 | 1008 | power_change = random.choice(['on', 'off']) | ||
3331 | 1009 | context = sentinel.context | ||
3332 | 1010 | |||
3333 | 1011 | logger = self.useFixture(TwistedLoggerFixture()) | ||
3334 | 1012 | |||
3335 | 1013 | yield power.maybe_change_power_state( | ||
3336 | 1014 | system_id, hostname, power_type, power_change, context) | ||
3337 | 1015 | |||
3338 | 1016 | # Get the Deferred from the registry and cancel it. | ||
3339 | 1017 | _, d = power.power_action_registry[system_id] | ||
3340 | 1018 | d.cancel() | ||
3341 | 1019 | yield d | ||
3342 | 1020 | |||
3343 | 1021 | self.assertNotIn(system_id, power.power_action_registry) | ||
3344 | 1022 | self.assertDocTestMatches( | ||
3345 | 1023 | """\ | ||
3346 | 1024 | %s: Power could not be turned %s; timed out. | ||
3347 | 1025 | """ % (hostname, power_change), | ||
3348 | 1026 | logger.dump()) | ||
3349 | 1027 | self.assertThat( | ||
3350 | 1028 | mock_power_change_failure, | ||
3351 | 1029 | MockCalledOnceWith( | ||
3352 | 1030 | system_id, hostname, power_change, "Timed out") | ||
3353 | 1031 | ) | ||
3354 | 1032 | |||
3355 | 1033 | @inlineCallbacks | ||
3356 | 1034 | def test__calls_change_power_state_with_timeout(self): | ||
3357 | 1035 | self.patch_methods_using_rpc() | ||
3358 | 1036 | defer_with_timeout = self.patch(power, 'deferWithTimeout') | ||
3359 | 1037 | |||
3360 | 1038 | system_id = factory.make_name('system_id') | ||
3361 | 1039 | hostname = factory.make_name('hostname') | ||
3362 | 1040 | power_type = random.choice(power.QUERY_POWER_TYPES) | ||
3363 | 1041 | power_change = random.choice(['on', 'off']) | ||
3364 | 1042 | context = { | ||
3365 | 1043 | factory.make_name('context-key'): factory.make_name('context-val') | ||
3366 | 1044 | } | ||
3367 | 1045 | |||
3368 | 1046 | yield power.maybe_change_power_state( | ||
3369 | 1047 | system_id, hostname, power_type, power_change, context) | ||
3370 | 1048 | reactor.runUntilCurrent() # Run all delayed calls. | ||
3371 | 1049 | self.assertThat( | ||
3372 | 1050 | defer_with_timeout, MockCalledOnceWith( | ||
3373 | 1051 | power.CHANGE_POWER_STATE_TIMEOUT, | ||
3374 | 1052 | power.change_power_state, system_id, hostname, | ||
3375 | 1053 | power_type, power_change, context, power.reactor)) | ||
3376 | 1054 | >>>>>>> MERGE-SOURCE | ||
3377 | 54 | 1055 | ||
3378 | === modified file 'src/provisioningserver/pserv_services/node_power_monitor_service.py' | |||
3379 | === modified file 'src/provisioningserver/rpc/cluster.py' | |||
3380 | === modified file 'src/provisioningserver/rpc/clusterservice.py' | |||
3381 | === modified file 'src/provisioningserver/rpc/dhcp.py' | |||
3382 | === modified file 'src/provisioningserver/rpc/region.py' | |||
3383 | === modified file 'src/provisioningserver/rpc/tests/test_clusterservice.py' | |||
3384 | === modified file 'src/provisioningserver/rpc/tests/test_dhcp.py' | |||
3385 | === modified file 'src/provisioningserver/tests/test_plugin.py' | |||
3386 | --- src/provisioningserver/tests/test_plugin.py 2015-06-29 14:41:52 +0000 | |||
3387 | +++ src/provisioningserver/tests/test_plugin.py 2015-09-25 14:32:35 +0000 | |||
3388 | @@ -114,14 +114,26 @@ | |||
3389 | 114 | service_maker.makeService(options) | 114 | service_maker.makeService(options) |
3390 | 115 | self.assertThat(mock_simplestreams_patch, MockCalledOnceWith()) | 115 | self.assertThat(mock_simplestreams_patch, MockCalledOnceWith()) |
3391 | 116 | 116 | ||
3400 | 117 | def test_makeService_patches_tftp_service(self): | 117 | <<<<<<< TREE |
3401 | 118 | mock_tftp_patch = ( | 118 | def test_makeService_patches_tftp_service(self): |
3402 | 119 | self.patch(plugin_module, 'add_term_error_code_to_tftp')) | 119 | mock_tftp_patch = ( |
3403 | 120 | options = Options() | 120 | self.patch(plugin_module, 'add_term_error_code_to_tftp')) |
3404 | 121 | service_maker = ProvisioningServiceMaker("Harry", "Hill") | 121 | options = Options() |
3405 | 122 | service_maker.makeService(options) | 122 | service_maker = ProvisioningServiceMaker("Harry", "Hill") |
3406 | 123 | self.assertThat(mock_tftp_patch, MockCalledOnceWith()) | 123 | service_maker.makeService(options) |
3407 | 124 | 124 | self.assertThat(mock_tftp_patch, MockCalledOnceWith()) | |
3408 | 125 | |||
3409 | 126 | ======= | ||
3410 | 127 | def test_makeService_patches_tftp_service(self): | ||
3411 | 128 | mock_tftp_patch = ( | ||
3412 | 129 | self.patch(plugin_module, 'add_term_error_code_to_tftp')) | ||
3413 | 130 | options = Options() | ||
3414 | 131 | options["config-file"] = self.write_config({}) | ||
3415 | 132 | service_maker = ProvisioningServiceMaker("Harry", "Hill") | ||
3416 | 133 | service_maker.makeService(options) | ||
3417 | 134 | self.assertThat(mock_tftp_patch, MockCalledOnceWith()) | ||
3418 | 135 | |||
3419 | 136 | >>>>>>> MERGE-SOURCE | ||
3420 | 125 | def test_image_download_service(self): | 137 | def test_image_download_service(self): |
3421 | 126 | options = Options() | 138 | options = Options() |
3422 | 127 | service_maker = ProvisioningServiceMaker("Harry", "Hill") | 139 | service_maker = ProvisioningServiceMaker("Harry", "Hill") |
3423 | 128 | 140 | ||
3424 | === modified file 'src/provisioningserver/tests/test_service_monitor.py' | |||
3425 | === modified file 'src/provisioningserver/utils/fs.py' | |||
3426 | --- src/provisioningserver/utils/fs.py 2015-08-17 10:38:17 +0000 | |||
3427 | +++ src/provisioningserver/utils/fs.py 2015-09-25 14:32:35 +0000 | |||
3428 | @@ -20,8 +20,12 @@ | |||
3429 | 20 | 'FileLock', | 20 | 'FileLock', |
3430 | 21 | 'incremental_write', | 21 | 'incremental_write', |
3431 | 22 | 'read_text_file', | 22 | 'read_text_file', |
3432 | 23 | <<<<<<< TREE | ||
3433 | 23 | 'RunLock', | 24 | 'RunLock', |
3434 | 24 | 'sudo_delete_file', | 25 | 'sudo_delete_file', |
3435 | 26 | ======= | ||
3436 | 27 | 'sudo_delete_file', | ||
3437 | 28 | >>>>>>> MERGE-SOURCE | ||
3438 | 25 | 'sudo_write_file', | 29 | 'sudo_write_file', |
3439 | 26 | 'SystemLock', | 30 | 'SystemLock', |
3440 | 27 | 'tempdir', | 31 | 'tempdir', |
3441 | 28 | 32 | ||
3442 | === modified file 'src/provisioningserver/utils/script.py' | |||
3443 | === modified file 'src/provisioningserver/utils/tests/test_fs.py' | |||
3444 | --- src/provisioningserver/utils/tests/test_fs.py 2015-08-17 16:27:21 +0000 | |||
3445 | +++ src/provisioningserver/utils/tests/test_fs.py 2015-09-25 14:32:35 +0000 | |||
3446 | @@ -14,8 +14,13 @@ | |||
3447 | 14 | __metaclass__ = type | 14 | __metaclass__ = type |
3448 | 15 | __all__ = [] | 15 | __all__ = [] |
3449 | 16 | 16 | ||
3450 | 17 | <<<<<<< TREE | ||
3451 | 17 | from base64 import urlsafe_b64encode | 18 | from base64 import urlsafe_b64encode |
3452 | 18 | import os | 19 | import os |
3453 | 20 | ======= | ||
3454 | 21 | import hashlib | ||
3455 | 22 | import os | ||
3456 | 23 | >>>>>>> MERGE-SOURCE | ||
3457 | 19 | import os.path | 24 | import os.path |
3458 | 20 | from random import randint | 25 | from random import randint |
3459 | 21 | import re | 26 | import re |
3460 | @@ -50,14 +55,23 @@ | |||
3461 | 50 | atomic_symlink, | 55 | atomic_symlink, |
3462 | 51 | atomic_write, | 56 | atomic_write, |
3463 | 52 | ensure_dir, | 57 | ensure_dir, |
3464 | 58 | <<<<<<< TREE | ||
3465 | 53 | FileLock, | 59 | FileLock, |
3466 | 54 | get_maas_provision_command, | 60 | get_maas_provision_command, |
3467 | 61 | ======= | ||
3468 | 62 | FileLockProxy, | ||
3469 | 63 | get_maas_provision_command, | ||
3470 | 64 | >>>>>>> MERGE-SOURCE | ||
3471 | 55 | get_mtime, | 65 | get_mtime, |
3472 | 56 | incremental_write, | 66 | incremental_write, |
3473 | 57 | pick_new_mtime, | 67 | pick_new_mtime, |
3474 | 58 | read_text_file, | 68 | read_text_file, |
3475 | 69 | <<<<<<< TREE | ||
3476 | 59 | RunLock, | 70 | RunLock, |
3477 | 60 | sudo_delete_file, | 71 | sudo_delete_file, |
3478 | 72 | ======= | ||
3479 | 73 | sudo_delete_file, | ||
3480 | 74 | >>>>>>> MERGE-SOURCE | ||
3481 | 61 | sudo_write_file, | 75 | sudo_write_file, |
3482 | 62 | SystemLock, | 76 | SystemLock, |
3483 | 63 | tempdir, | 77 | tempdir, |
3484 | 64 | 78 | ||
3485 | === modified file 'src/provisioningserver/utils/tests/test_isc.py' | |||
3486 | --- src/provisioningserver/utils/tests/test_isc.py 2015-07-13 18:47:01 +0000 | |||
3487 | +++ src/provisioningserver/utils/tests/test_isc.py 2015-09-25 14:32:35 +0000 | |||
3488 | @@ -1,3 +1,4 @@ | |||
3489 | 1 | <<<<<<< TREE | ||
3490 | 1 | # Copyright 2015 Canonical Ltd. This software is licensed under the | 2 | # Copyright 2015 Canonical Ltd. This software is licensed under the |
3491 | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). | 3 | # GNU Affero General Public License version 3 (see the file LICENSE). |
3492 | 3 | 4 | ||
3493 | @@ -276,3 +277,281 @@ | |||
3494 | 276 | u'zone "."': | 277 | u'zone "."': |
3495 | 277 | {u'file': u'"/etc/bind/db.special"', u'type': u'master'}}, | 278 | {u'file': u'"/etc/bind/db.special"', u'type': u'master'}}, |
3496 | 278 | parsed) | 279 | parsed) |
3497 | 280 | ======= | ||
3498 | 281 | # Copyright 2015 Canonical Ltd. This software is licensed under the | ||
3499 | 282 | # GNU Affero General Public License version 3 (see the file LICENSE). | ||
3500 | 283 | |||
3501 | 284 | """Test ISC configuration file parser/generator.""" | ||
3502 | 285 | |||
3503 | 286 | from __future__ import ( | ||
3504 | 287 | absolute_import, | ||
3505 | 288 | print_function, | ||
3506 | 289 | unicode_literals, | ||
3507 | 290 | ) | ||
3508 | 291 | |||
3509 | 292 | |||
3510 | 293 | str = None | ||
3511 | 294 | |||
3512 | 295 | __metaclass__ = type | ||
3513 | 296 | __all__ = [] | ||
3514 | 297 | |||
3515 | 298 | from collections import OrderedDict | ||
3516 | 299 | from textwrap import dedent | ||
3517 | 300 | |||
3518 | 301 | from maastesting.testcase import MAASTestCase | ||
3519 | 302 | from provisioningserver.utils.isc import ( | ||
3520 | 303 | ISCParseException, | ||
3521 | 304 | make_isc_string, | ||
3522 | 305 | parse_isc_string, | ||
3523 | 306 | read_isc_file, | ||
3524 | 307 | ) | ||
3525 | 308 | from testtools import ExpectedException | ||
3526 | 309 | |||
3527 | 310 | |||
3528 | 311 | class TestParseISCString(MAASTestCase): | ||
3529 | 312 | |||
3530 | 313 | def test_parses_simple_bind_options(self): | ||
3531 | 314 | testdata = dedent("""\ | ||
3532 | 315 | options { | ||
3533 | 316 | directory "/var/cache/bind"; | ||
3534 | 317 | |||
3535 | 318 | dnssec-validation auto; | ||
3536 | 319 | |||
3537 | 320 | auth-nxdomain no; # conform to RFC1035 | ||
3538 | 321 | listen-on-v6 { any; }; | ||
3539 | 322 | }; | ||
3540 | 323 | """) | ||
3541 | 324 | options = parse_isc_string(testdata) | ||
3542 | 325 | self.assertEqual( | ||
3543 | 326 | OrderedDict({u'options': OrderedDict({u'auth-nxdomain': u'no', | ||
3544 | 327 | u'directory': u'"/var/cache/bind"', | ||
3545 | 328 | u'dnssec-validation': u'auto', | ||
3546 | 329 | u'listen-on-v6': OrderedDict({u'any': True})})}), | ||
3547 | 330 | options) | ||
3548 | 331 | |||
3549 | 332 | def test_parses_bind_acl(self): | ||
3550 | 333 | testdata = dedent("""\ | ||
3551 | 334 | acl goodclients { | ||
3552 | 335 | 192.0.2.0/24; | ||
3553 | 336 | localhost; | ||
3554 | 337 | localnets; | ||
3555 | 338 | }; | ||
3556 | 339 | """) | ||
3557 | 340 | acl = parse_isc_string(testdata) | ||
3558 | 341 | self.assertEqual( | ||
3559 | 342 | {u'acl goodclients': {u'192.0.2.0/24': True, | ||
3560 | 343 | u'localhost': True, | ||
3561 | 344 | u'localnets': True}}, acl) | ||
3562 | 345 | |||
3563 | 346 | def test_parses_multiple_forwarders(self): | ||
3564 | 347 | testdata = dedent("""\ | ||
3565 | 348 | forwarders { | ||
3566 | 349 | 91.189.94.2; | ||
3567 | 350 | 91.189.94.3; | ||
3568 | 351 | 91.189.94.4; | ||
3569 | 352 | 91.189.94.5; | ||
3570 | 353 | 91.189.94.6; | ||
3571 | 354 | }; | ||
3572 | 355 | """) | ||
3573 | 356 | forwarders = parse_isc_string(testdata) | ||
3574 | 357 | self.assertEqual( | ||
3575 | 358 | {u'forwarders': {u'91.189.94.2': True, | ||
3576 | 359 | u'91.189.94.3': True, | ||
3577 | 360 | u'91.189.94.4': True, | ||
3578 | 361 | u'91.189.94.5': True, | ||
3579 | 362 | u'91.189.94.6': True}}, forwarders) | ||
3580 | 363 | |||
3581 | 364 | def test_parses_bug_1413388_config(self): | ||
3582 | 365 | testdata = dedent("""\ | ||
3583 | 366 | acl canonical-int-ns { 91.189.90.151; 91.189.89.192; }; | ||
3584 | 367 | |||
3585 | 368 | options { | ||
3586 | 369 | directory "/var/cache/bind"; | ||
3587 | 370 | |||
3588 | 371 | forwarders { | ||
3589 | 372 | 91.189.94.2; | ||
3590 | 373 | 91.189.94.2; | ||
3591 | 374 | }; | ||
3592 | 375 | |||
3593 | 376 | dnssec-validation auto; | ||
3594 | 377 | |||
3595 | 378 | auth-nxdomain no; # conform to RFC1035 | ||
3596 | 379 | listen-on-v6 { any; }; | ||
3597 | 380 | |||
3598 | 381 | allow-query { any; }; | ||
3599 | 382 | allow-transfer { 10.222.64.1; canonical-int-ns; }; | ||
3600 | 383 | |||
3601 | 384 | notify explicit; | ||
3602 | 385 | also-notify { 91.189.90.151; 91.189.89.192; }; | ||
3603 | 386 | |||
3604 | 387 | allow-query-cache { 10.222.64.0/18; }; | ||
3605 | 388 | recursion yes; | ||
3606 | 389 | }; | ||
3607 | 390 | |||
3608 | 391 | zone "." { type master; file "/etc/bind/db.special"; }; | ||
3609 | 392 | """) | ||
3610 | 393 | config = parse_isc_string(testdata) | ||
3611 | 394 | self.assertEqual( | ||
3612 | 395 | {u'acl canonical-int-ns': | ||
3613 | 396 | {u'91.189.89.192': True, u'91.189.90.151': True}, | ||
3614 | 397 | u'options': {u'allow-query': {u'any': True}, | ||
3615 | 398 | u'allow-query-cache': {u'10.222.64.0/18': True}, | ||
3616 | 399 | u'allow-transfer': {u'10.222.64.1': True, | ||
3617 | 400 | u'canonical-int-ns': True}, | ||
3618 | 401 | u'also-notify': {u'91.189.89.192': True, | ||
3619 | 402 | u'91.189.90.151': True}, | ||
3620 | 403 | u'auth-nxdomain': |