[tor-commits] [bridgedb/master] Prettier error pages. I hear folks get less mad about downtime that way.

isis at torproject.org isis at torproject.org
Sun Jul 26 12:22:01 UTC 2015


commit 2afaa4368e2723172d336fcb3e5f4e4cf5051afe
Author: Isis Lovecruft <isis at torproject.org>
Date:   Tue May 12 05:26:58 2015 +0000

    Prettier error pages. I hear folks get less mad about downtime that way.
---
 bridgedb/https/server.py                           |  104 ++++--
 bridgedb/https/templates/assets/css/error.css      |  208 +++++++++++
 .../templates/assets/images/404-excavator.svg      |  260 ++++++++++++++
 .../templates/assets/images/404-hills-left.svg     |   20 ++
 .../templates/assets/images/404-hills-right.svg    |   34 ++
 .../assets/images/500-hills-left-shade.svg         |    8 +
 .../templates/assets/images/500-hills-left.svg     |   22 ++
 .../assets/images/500-hills-right-shade.svg        |    8 +
 .../templates/assets/images/500-hills-right.svg    |   41 +++
 .../https/templates/assets/images/500-road.svg     |   97 ++++++
 .../assets/images/maintenance-hills-left-shade.svg |    7 +
 .../assets/images/maintenance-hills-left.svg       |   43 +++
 .../images/maintenance-hills-right-shade.svg       |    9 +
 .../assets/images/maintenance-hills-right.svg      |   21 ++
 .../assets/images/maintenance-tractor.svg          |  367 ++++++++++++++++++++
 bridgedb/https/templates/base.html                 |    1 +
 bridgedb/https/templates/error-404.html            |   39 +++
 bridgedb/https/templates/error-500.html            |   36 ++
 bridgedb/https/templates/error-503.html            |   37 ++
 setup.py                                           |    3 +-
 test/test_https.py                                 |    9 +
 test/test_https_server.py                          |   93 ++++-
 22 files changed, 1434 insertions(+), 33 deletions(-)

diff --git a/bridgedb/https/server.py b/bridgedb/https/server.py
index 2f5ed83..346d81f 100644
--- a/bridgedb/https/server.py
+++ b/bridgedb/https/server.py
@@ -132,20 +132,28 @@ def getClientIP(request, useForwardedHeader=False):
 
     return ip
 
-def replaceErrorPage(error, template_name=None):
+def replaceErrorPage(request, error, template_name=None, html=True):
     """Create a general error page for displaying in place of tracebacks.
 
     Log the error to BridgeDB's logger, and then display a very plain "Sorry!
     Something went wrong!" page to the client.
 
+    :type request: :api:`twisted.web.http.Request`
+    :param request: A ``Request`` object containing the HTTP method, full
+        URI, and any URL/POST arguments and headers present.
     :type error: :exc:`Exception`
     :param error: Any exeption which has occurred while attempting to retrieve
-                  a template, render a page, or retrieve a resource.
+        a template, render a page, or retrieve a resource.
     :param str template_name: A string describing which template/page/resource
-                              was being used when the exception occurred,
-                              i.e. ``'index.html'``.
-    :returns: A string containing HTML to serve to the client (rather than
-              serving a traceback).
+        was being used when the exception occurred, i.e. ``'index.html'``.
+    :param bool html: If ``True``, return one of two HTML error pages.  First,
+        we attempt to render a fancier error page.  If that rendering failed,
+        or if **html** is ``False``, then we return a very simple HTML page
+        (without CSS, Javascript, images, etc.)  which simply says
+        ``"Sorry! Something went wrong with your request."``
+    :rtype: str
+    :returns: A string containing some content to serve to the client (rather
+        than serving a Twisted traceback).
     """
     logging.error("Error while attempting to render %s: %s"
                   % (template_name or 'template',
@@ -164,16 +172,16 @@ def replaceErrorPage(error, template_name=None):
     # "Tor"
     # "Tor Browser"
     #
-    errmsg = _("Sorry! Something went wrong with your request.")
-    rendered = """<html>
-                    <head>
-                      <link href="/assets/bootstrap.min.css" rel="stylesheet">
-                      <link href="/assets/custom.css" rel="stylesheet">
-                    </head>
-                    <body>
-                      <p>{0}</p>
-                    </body>
-                  </html>""".format(errmsg)
+    errorMessage = _("Sorry! Something went wrong with your request.")
+
+    if not html:
+        return bytes(errorMessage)
+
+    try:
+        rendered = resource500.render(request)
+    except Exception as err:
+        logging.exception(err)
+        rendered = bytes(errorMessage)
 
     return rendered
 
@@ -299,7 +307,49 @@ class CSPResource(resource.Resource):
         return redirectTo(request.uri, request)
 
 
-class TranslatedTemplateResource(CSPResource):
+class ErrorResource(CSPResource):
+    """A resource which explains that BridgeDB is undergoing maintenance, or
+    that some other (unexpected) error has occured.
+    """
+    isLeaf = True
+
+    def __init__(self, template=None, code=200):
+        """Create a :api:`twisted.web.resource.Resource` for an error page."""
+        CSPResource.__init__(self)
+        self.template = template
+        self.code = code
+
+    def render_GET(self, request):
+        self.setCSPHeader(request)
+        request.setHeader("Content-Type", "text/html; charset=utf-8")
+        request.setResponseCode(self.code)
+
+        try:
+            template = lookup.get_template(self.template)
+            rendered = template.render()
+        except Exception as err:
+            rendered = replaceErrorPage(request, err, html=False)
+
+        return rendered
+
+    render_POST = render_GET
+
+resource404 = ErrorResource('error-404.html', code=404)
+resource500 = ErrorResource('error-500.html', code=500)
+maintenance = ErrorResource('error-503.html', code=503)
+
+
+class CustomErrorHandlingResource(resource.Resource):
+    """A :api:`twisted.web.resource.Resource` which wraps the
+    :api:`twisted.web.resource.Resource.getChild` method in order to use
+    custom error handling pages.
+    """
+    def getChild(self, path, request):
+        logging.debug("[404] %s" % request.uri)
+        return resource404
+
+
+class TranslatedTemplateResource(CustomErrorHandlingResource, CSPResource):
     """A generalised resource which uses gettext translations and Mako
     templates.
     """
@@ -322,7 +372,7 @@ class TranslatedTemplateResource(CSPResource):
             template = lookup.get_template(self.template)
             rendered = template.render(strings, rtl=rtl, lang=langs[0])
         except Exception as err:  # pragma: no cover
-            rendered = replaceErrorPage(err)
+            rendered = replaceErrorPage(request, err)
         request.setHeader("Content-Type", "text/html; charset=utf-8")
         return rendered
 
@@ -354,7 +404,7 @@ class HowtoResource(TranslatedTemplateResource):
         TranslatedTemplateResource.__init__(self, 'howto.html')
 
 
-class CaptchaProtectedResource(CSPResource):
+class CaptchaProtectedResource(CustomErrorHandlingResource, CSPResource):
     """A general resource protected by some form of CAPTCHA."""
 
     isLeaf = True
@@ -447,7 +497,7 @@ class CaptchaProtectedResource(CSPResource):
                                        imgstr=imgstr,
                                        challenge_field=challenge)
         except Exception as err:
-            rendered = replaceErrorPage(err, 'captcha.html')
+            rendered = replaceErrorPage(request, err, 'captcha.html')
 
         request.setHeader("Content-Type", "text/html; charset=utf-8")
         return rendered
@@ -476,7 +526,7 @@ class CaptchaProtectedResource(CSPResource):
             try:
                 rendered = self.resource.render(request)
             except Exception as err:
-                rendered = replaceErrorPage(err)
+                rendered = replaceErrorPage(request, err)
             return rendered
 
         logging.debug("Client failed a CAPTCHA; returning redirect to %s"
@@ -638,7 +688,7 @@ class ReCaptchaProtectedResource(CaptchaProtectedResource):
             try:
                 rendered = self.resource.render(request)
             except Exception as err:  # pragma: no cover
-                rendered = replaceErrorPage(err)
+                rendered = replaceErrorPage(request, err)
         else:
             logging.info("Client failed a CAPTCHA; redirecting to %s"
                          % request.uri)
@@ -780,7 +830,7 @@ class ReCaptchaProtectedResource(CaptchaProtectedResource):
         return NOT_DONE_YET
 
 
-class BridgesResource(CSPResource):
+class BridgesResource(CustomErrorHandlingResource, CSPResource):
     """This resource displays bridge lines in response to a request."""
 
     isLeaf = True
@@ -930,7 +980,7 @@ class BridgesResource(CSPResource):
             try:
                 rendered = bytes('\n'.join(bridgeLines))
             except Exception as err:
-                rendered = replaceErrorPage(err)
+                rendered = replaceErrorPage(request, err, html=False)
         else:
             request.setHeader("Content-Type", "text/html; charset=utf-8")
             qrcode = None
@@ -948,7 +998,7 @@ class BridgesResource(CSPResource):
                                            answer=bridgeLines,
                                            qrcode=qrcode)
             except Exception as err:
-                rendered = replaceErrorPage(err)
+                rendered = replaceErrorPage(request, err)
 
         return rendered
 
@@ -1008,13 +1058,15 @@ def addWebServer(config, distributor):
                           reportViolations=config.CSP_REPORT_ONLY,
                           useForwardedHeader=fwdHeaders)
 
-    root = resource.Resource()
+    root = CustomErrorHandlingResource()
     root.putChild('', index)
     root.putChild('robots.txt', robots)
     root.putChild('keys', keys)
     root.putChild('assets', assets)
     root.putChild('options', options)
     root.putChild('howto', howto)
+    root.putChild('maintenance', maintenance)
+    root.putChild('error', resource500)
     root.putChild(CSPResource.reportURI, csp)
 
     if config.RECAPTCHA_ENABLED:
diff --git a/bridgedb/https/templates/assets/css/error.css b/bridgedb/https/templates/assets/css/error.css
new file mode 100644
index 0000000..a1cf350
--- /dev/null
+++ b/bridgedb/https/templates/assets/css/error.css
@@ -0,0 +1,208 @@
+.application,
+.application>.error,
+.application>.error>.main {
+    /*min-height: 100vh*/
+}
+.error,
+.maintenance {
+    height: 100%;
+    overflow: hidden
+}
+.error .full-size,
+.maintenance .full-size {
+    position: absolute;
+    top: 0;
+    height: 100%;
+    width: 100%;
+    overflow: hidden;
+    background-repeat: no-repeat
+}
+.main--error {
+    min-height: 100%;
+    overflow: hidden
+}
+.error-text,
+.maintenance-text {
+    position: absolute;
+    top: 6%;
+    left: 0;
+    right: 0;
+    z-index: 10
+}
+.error-text h1,
+.maintenance-text h1 {
+    margin: 1em 0 .4em;
+    font-weight: 600;
+    /*color: #357389;*/
+    font-size: 40px;
+    line-height: 1;
+    text-align: center
+}
+ at media only screen and (min-width: 50.063em) {
+    .error-text h1,
+    .maintenance-text h1 {
+        margin: 1.5em 0 .4em;
+        font-size: 70px
+    }
+}
+.error-text p,
+.maintenance-text p {
+    padding: 0 1em;
+    /*color: #9d9fa1;*/
+    font-size: 18px;
+    text-align: center
+}
+.error-text a,
+.maintenance-text a {
+    /*color: #9d9fa1*/
+}
+.error-text a:focus,
+.error-text a:hover,
+.maintenance-text a:focus,
+.maintenance-text a:hover {
+    /*color: #9d9fa1;*/
+    /*text-decoration: underline*/
+}
+.error500 .error-bg {
+    background: -webkit-linear-gradient(90deg, #dcc682, #dcc682 38.9%, #ccebf7 39%, #fff 60%, #fff);
+    background: linear-gradient(0deg, #dcc682, #dcc682 38.9%, #ccebf7 39%, #fff 60%, #fff)
+}
+.error500 .hill-left {
+    background-image: url("/assets/images/500-hills-left.svg");
+    background-size: auto 10vh;
+    background-position: 0 58%
+}
+ at media only screen and (min-width: 50.063em) {
+    .error500 .hill-left {
+        background-size: 38vw auto;
+        background-position: 0 58%
+    }
+}
+.error500 .hill-right {
+    background-image: url("/assets/images/500-hills-right.svg");
+    background-size: 38vw auto;
+    background-position: 99% 59%;
+    display: none
+}
+ at media only screen and (min-width: 50.063em) {
+    .error500 .hill-right {
+        display: block
+    }
+}
+.error500 .shadow-left {
+    background-image: url("/assets/images/500-hills-left-shade.svg");
+    background-size: 24vw auto;
+    background-position: 6% 72%
+}
+.error500 .shadow-right {
+    background-image: url("/assets/images/500-hills-right-shade.svg");
+    background-size: 17vw auto;
+    background-position: 95% 79%
+}
+.error500 .road {
+    background-image: url("/assets/images/500-road.svg");
+    background-size: auto 27vh;
+    background-position: 42% 78%
+}
+ at media only screen and (min-width: 50.063em) {
+    .error500 .road {
+        background-size: auto 40vh;
+        background-position: 42% 91.3%
+    }
+}
+.error404 .top {
+    position: absolute;
+    top: 0;
+    width: 100%;
+    z-index: 5
+}
+.error404 .error-bg {
+    background: -webkit-linear-gradient(90deg, #bbcac6, #bbcac6 38.9%, #ccebf7 39%, #fff 60%, #fff);
+    background: linear-gradient(0deg, #bbcac6, #bbcac6 38.9%, #ccebf7 39%, #fff 60%, #fff)
+}
+.error404 .hill-left {
+    display: none;
+    background-image: url("/assets/images/404-hills-left.svg");
+    background-size: 30vw auto;
+    background-position: 0 58%
+}
+ at media only screen and (min-width: 50.063em) {
+    .error404 .hill-left {
+        display: block
+    }
+}
+.error404 .hill-right {
+    background-image: url("/assets/images/404-hills-right.svg");
+    background-size: auto 30vw;
+    background-position: 99% 58%
+}
+ at media only screen and (min-width: 50.063em) {
+    .error404 .hill-right {
+        background-size: 50vw auto;
+        background-position: 99% 58%
+    }
+}
+ at media only screen and (min-width: 64.063em) {
+    .error404 .hill-right {
+        background-size: 50vw auto;
+        background-position: 99% 54%
+    }
+}
+.error404 .error-excavator {
+    background-image: url("/assets/images/404-excavator.svg");
+    background-size: auto 25vh;
+    background-position: 71% 83%
+}
+.maintenance .maintenance-bg {
+    background: -webkit-linear-gradient(90deg, #8cad7d, #8cad7d 38.9%, #ccebf7 39%, #fff 60%, #fff);
+    background: linear-gradient(0deg, #8cad7d, #8cad7d 38.9%, #ccebf7 39%, #fff 60%, #fff)
+}
+.maintenance .hill-left {
+    background-image: url("/assets/images/maintenance-hills-left.svg");
+    background-size: 80vw auto;
+    background-position: 0 58%
+}
+ at media only screen and (min-width: 50.063em) {
+    .maintenance .hill-left {
+        background-size: 58vw auto;
+        background-position: 0 58%
+    }
+}
+ at media only screen and (min-width: 64.063em) {
+    .maintenance .hill-left {
+        background-size: 50vw auto;
+        background-position: 0 56%
+    }
+}
+.maintenance .hill-right {
+    background-image: url("/assets/images/maintenance-hills-right.svg");
+    background-size: 38vw auto;
+    background-position: 99% 59%;
+    display: none
+}
+ at media only screen and (min-width: 50.063em) {
+    .maintenance .hill-right {
+        display: block
+    }
+}
+.maintenance .shadow-left {
+    background-image: url("/assets/images/maintenance-hills-left-shade.svg");
+    background-size: 24vw auto;
+    background-position: 6% 72%
+}
+.maintenance .shadow-right {
+    background-image: url("/assets/images/maintenance-hills-right-shade.svg");
+    background-size: 17vw auto;
+    background-position: 95% 79%
+}
+.maintenance .maintenance-tractor {
+    background-image: url("/assets/images/maintenance-tractor.svg");
+    background-size: 87vw auto;
+    background-position: 63% 87%
+}
+ at media only screen and (min-width: 50.063em) {
+    .maintenance .maintenance-tractor {
+        background-size: auto 44vh;
+        background-position: 63% 83%
+    }
+}
diff --git a/bridgedb/https/templates/assets/images/404-excavator.svg b/bridgedb/https/templates/assets/images/404-excavator.svg
new file mode 100644
index 0000000..be053b4
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/404-excavator.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="428.987px" height="182.097px" viewBox="0 0 428.987 182.097" enable-background="new 0 0 428.987 182.097"
+	 xml:space="preserve">
+<g>
+	<polygon fill="#C9D7D4" points="394,127.112 276.388,93.224 277.151,93.225 265.363,73.113 255.724,73.113 251.999,65.205 
+		222.836,65.205 209.363,79.792 194.416,79.792 179.263,93.112 131.647,93.112 122.503,85.798 117.563,85.798 109.096,75.213 
+		84.21,75.213 63.913,93.112 49,93.112 0,133.112 45.016,163.097 178,163.097 223,182.097 403,182.097 428.987,154.112 	"/>
+	<polygon fill="#C1D0CE" points="163.665,143.162 145.467,143.162 153.893,135.828 165.067,134.812 170.308,130.252 
+		178.498,130.252 	"/>
+	<polygon fill="#CFDEDD" points="182.445,127.289 195.292,137.871 204.185,137.871 214.396,143.162 219.423,143.162 
+		205.168,135.837 197.48,135.837 184.302,125.252 160.513,125.252 156.945,127.289 	"/>
+	<polygon fill="#C1D0CE" points="76.928,93.123 68.737,93.123 83.57,80.213 91.761,80.213 	"/>
+	<polygon fill="#CFDEDD" points="108.278,77.25 116.532,87.832 122.246,87.832 128.808,93.123 132.037,93.123 122.878,85.798 
+		117.938,85.798 109.471,75.213 84.178,75.213 81.886,77.25 	"/>
+	<polygon fill="#CFDEDD" points="206.86,82.795 209.363,79.792 194.416,79.792 191,82.795 	"/>
+	<polygon fill="#C1D0CE" points="210.364,87.8 223.837,73.213 232.984,73.213 214.967,93.202 189.338,93.145 195.417,87.8 	"/>
+	<polygon fill="#CFDEDD" points="249.997,68.208 253.722,76.116 263.361,76.116 273.387,93.221 277.151,93.225 265.363,73.113 
+		255.724,73.113 251.999,65.205 222.836,65.205 220.062,68.208 	"/>
+</g>
+<g>
+	<path fill="#828E88" d="M332.502,144.806l-0.859-2.127c-0.063-0.153-0.24-0.229-0.393-0.165l-0.524,0.214l0.576-0.533
+		c0.122-0.114,0.13-0.308,0.018-0.43l-1.546-1.688c-0.113-0.121-0.306-0.129-0.428-0.017l-0.332,0.308
+		c-0.026-0.028-0.053-0.058-0.08-0.085l0.316-0.521c0.088-0.142,0.042-0.329-0.099-0.417l-1.948-1.196
+		c-0.141-0.087-0.328-0.042-0.414,0.101l-0.193,0.317c-0.018-0.01-0.035-0.02-0.054-0.028l0.09-0.414
+		c0.035-0.164-0.069-0.326-0.231-0.36l-2.232-0.48c-0.16-0.036-0.322,0.069-0.357,0.232l-0.06,0.276
+		c-0.049-0.003-0.094-0.005-0.139-0.006l-0.012-0.317c-0.006-0.167-0.146-0.299-0.312-0.293l-2.281,0.083
+		c-0.165,0.005-0.296,0.146-0.291,0.313l0.009,0.226l-0.245,0.009l-0.011-0.294c-0.005-0.166-0.146-0.299-0.311-0.292l-2.282,0.081
+		c-0.164,0.005-0.296,0.146-0.29,0.314l0.01,0.285l-0.257,0.008l-0.01-0.301c-0.006-0.166-0.145-0.298-0.312-0.292l-2.281,0.083
+		c-0.164,0.006-0.296,0.147-0.29,0.313l0.011,0.291l-0.269,0.009l-0.009-0.272c-0.007-0.166-0.146-0.299-0.312-0.292l-2.281,0.082
+		c-0.164,0.005-0.296,0.147-0.29,0.313l0.009,0.264l-0.238,0.007l-0.008-0.21c-0.006-0.171-0.149-0.306-0.319-0.299l-2.343,0.084
+		c-0.17,0.006-0.305,0.15-0.299,0.322l0.007,0.2l-0.198,0.007l-0.01-0.252c-0.006-0.176-0.153-0.312-0.326-0.306l-2.388,0.086
+		c-0.174,0.006-0.311,0.154-0.305,0.328l0.008,0.241l-0.279,0.009l-0.008-0.253c-0.007-0.178-0.156-0.318-0.335-0.312l-2.443,0.089
+		c-0.177,0.005-0.316,0.156-0.311,0.336l0.008,0.242l-0.261,0.009l-0.011-0.287c-0.006-0.187-0.163-0.333-0.348-0.327l-2.547,0.092
+		c-0.186,0.008-0.332,0.164-0.325,0.351l0.011,0.277l-0.407,0.014l-0.009-0.304c-0.008-0.187-0.164-0.333-0.35-0.326l-2.547,0.092
+		c-0.185,0.006-0.331,0.164-0.325,0.351l0.011,0.293l-0.227,0.007l-0.012-0.325c-0.007-0.166-0.146-0.298-0.312-0.292l-2.28,0.082
+		c-0.166,0.006-0.297,0.147-0.291,0.312l0.011,0.318l-0.266,0.009l-0.011-0.299c-0.006-0.166-0.146-0.299-0.312-0.293l-2.282,0.083
+		c-0.164,0.006-0.296,0.147-0.29,0.314l0.009,0.288l-0.236,0.008l-0.008-0.236c-0.007-0.171-0.15-0.306-0.32-0.3l-2.344,0.085
+		c-0.17,0.006-0.304,0.15-0.298,0.322l0.007,0.226l-0.198,0.008l-0.01-0.277c-0.007-0.176-0.153-0.312-0.327-0.307l-2.388,0.085
+		c-0.174,0.006-0.311,0.153-0.305,0.329l0.01,0.269l-0.279,0.009l-0.01-0.279c-0.006-0.179-0.156-0.318-0.335-0.313l-2.442,0.089
+		c-0.178,0.006-0.318,0.157-0.312,0.336l0.009,0.27l-0.261,0.008l-0.011-0.313c-0.006-0.186-0.162-0.333-0.348-0.327l-2.548,0.092
+		c-0.185,0.007-0.331,0.164-0.324,0.351l0.011,0.304l-0.406,0.014l-0.012-0.329c-0.007-0.188-0.164-0.334-0.348-0.327l-2.548,0.092
+		c-0.186,0.007-0.331,0.164-0.325,0.351l0.012,0.319l-0.374,0.012l-0.083-0.414c-0.037-0.184-0.216-0.303-0.397-0.265l-1.949,0.532
+		c-0.182,0.036-0.3,0.217-0.264,0.399l0.129,0.641c-0.172,0.068-0.349,0.142-0.527,0.219l-0.331-0.647
+		c-0.084-0.165-0.288-0.232-0.453-0.146l-2.268,1.171c-0.164,0.085-0.231,0.29-0.146,0.456l0.394,0.772
+		c-0.097,0.071-0.19,0.145-0.286,0.217l-0.603-0.639c-0.146-0.155-0.386-0.155-0.533,0l-2.023,2.15
+		c-0.146,0.153-0.146,0.408,0,0.563l0.636,0.675c-0.089,0.139-0.175,0.278-0.258,0.423l-0.689-0.362
+		c-0.188-0.1-0.418-0.021-0.509,0.173l-1.282,2.725c-0.091,0.194-0.011,0.433,0.178,0.532l1.031,0.543
+		c-0.015,0.093-0.027,0.188-0.04,0.282c-0.053-0.022-0.111-0.034-0.172-0.029l-1.201,0.107c-0.212,0.02-0.373,0.211-0.355,0.424
+		l0.227,3.034c0.015,0.215,0.201,0.374,0.414,0.354l1.146-0.103c0.031,0.163,0.065,0.323,0.104,0.48l-0.976,0.419
+		c-0.196,0.084-0.294,0.317-0.219,0.517l1.061,2.815c0.075,0.201,0.298,0.296,0.494,0.212l1.123-0.481
+		c0.017-0.006,0.029-0.021,0.044-0.029c0.051,0.075,0.102,0.15,0.153,0.224c-0.014,0.014-0.031,0.02-0.043,0.035l-0.82,0.975
+		c-0.139,0.163-0.123,0.417,0.031,0.563l2.118,2.008c0.154,0.147,0.395,0.135,0.533-0.029l0.725-0.86
+		c0.093,0.074,0.187,0.149,0.277,0.221l-0.186,0.791c-0.051,0.208,0.077,0.428,0.281,0.489l2.245,0.802
+		c0.155,0.047,13.595-0.089,13.595-0.089l0.656-1.729l42.13-2.704l4.654-1.203l2.609-4.277l0.764-4.83l-3.083-5.14l0.113,0.062
+		l1.17,0.933l0.815,2.016c0.062,0.154,0.239,0.229,0.394,0.166l0.907-0.372C332.49,145.137,332.564,144.96,332.502,144.806z"/>
+	<path fill="#94A39E" d="M333.067,150.386l-0.819-0.226c0.008-0.061,0.018-0.121,0.023-0.185l0.715-0.049
+		c0.17-0.012,0.302-0.161,0.29-0.334l-0.159-2.371c-0.012-0.172-0.162-0.303-0.333-0.292l-0.748,0.05
+		c-0.012-0.047-0.021-0.095-0.032-0.141l0.666-0.296c0.156-0.069,0.229-0.256,0.159-0.413l-0.954-2.175
+		c-0.068-0.157-0.254-0.229-0.411-0.16l-0.645,0.286c-0.034-0.054-0.067-0.107-0.101-0.161l0.571-0.6
+		c0.119-0.125,0.115-0.325-0.009-0.444l-1.706-1.644c-0.124-0.119-0.323-0.116-0.44,0.01l-0.438,0.46
+		c-0.041-0.031-0.082-0.06-0.124-0.089l0.253-0.627c0.063-0.161-0.013-0.344-0.172-0.409l-2.189-0.892
+		c-0.157-0.063-0.341,0.013-0.405,0.173l-0.227,0.561c-0.05-0.01-0.101-0.016-0.151-0.023l0.031-0.585
+		c0.008-0.171-0.125-0.32-0.297-0.329l-2.359-0.123c-0.172-0.009-0.318,0.124-0.328,0.297l-0.036,0.707l-0.229,0.016l-0.046-0.766
+		c-0.011-0.172-0.159-0.305-0.33-0.295l-2.357,0.147c-0.171,0.01-0.303,0.16-0.292,0.333l0.048,0.781l-0.247,0.016l-0.044-0.728
+		c-0.012-0.177-0.164-0.312-0.34-0.303l-2.422,0.151c-0.176,0.011-0.311,0.165-0.301,0.342l0.045,0.743l-0.205,0.015l-0.048-0.8
+		c-0.012-0.181-0.166-0.318-0.347-0.308l-2.469,0.151c-0.179,0.013-0.318,0.169-0.307,0.35l0.05,0.815l-0.289,0.02l-0.05-0.829
+		c-0.011-0.185-0.171-0.326-0.354-0.314l-2.524,0.157c-0.185,0.011-0.325,0.172-0.314,0.356l0.051,0.844l-0.289,0.021l-0.053-0.867
+		c-0.01-0.171-0.158-0.304-0.33-0.292l-2.359,0.146c-0.171,0.011-0.303,0.16-0.292,0.333l0.055,0.881l-0.277,0.019l-0.052-0.863
+		c-0.011-0.174-0.16-0.306-0.331-0.294l-2.357,0.145c-0.171,0.011-0.303,0.161-0.292,0.333l0.052,0.881l-0.244,0.016l-0.051-0.826
+		c-0.01-0.176-0.162-0.313-0.338-0.302l-2.424,0.149c-0.175,0.012-0.311,0.166-0.301,0.343l0.052,0.842l-0.204,0.014l-0.055-0.897
+		c-0.012-0.181-0.168-0.319-0.347-0.308l-2.47,0.152c-0.179,0.011-0.317,0.168-0.306,0.349l0.056,0.913l-0.288,0.021l-0.058-0.927
+		c-0.011-0.185-0.17-0.326-0.354-0.315l-2.524,0.157c-0.185,0.011-0.325,0.171-0.313,0.356l0.056,0.943l-0.269,0.018l-0.062-0.994
+		c-0.012-0.191-0.178-0.339-0.369-0.327l-2.632,0.163c-0.191,0.013-0.339,0.18-0.327,0.373l0.061,1.009l-0.418,0.028l-0.063-1.04
+		c-0.012-0.192-0.178-0.34-0.369-0.328l-2.633,0.163c-0.19,0.012-0.338,0.18-0.326,0.372l0.062,1.058l-0.465,0.03l-0.061-1.021
+		c-0.011-0.191-0.178-0.34-0.368-0.328l-2.635,0.163c-0.192,0.012-0.34,0.179-0.327,0.372l0.067,1.136
+		c0.002,0.009,0.007,0.014,0.007,0.022c-0.098,0.023-0.195,0.04-0.292,0.066c-0.003-0.006-0.003-0.014-0.005-0.02l-0.504-1.021
+		c-0.084-0.173-0.295-0.242-0.466-0.157l-2.363,1.181c-0.172,0.086-0.243,0.297-0.157,0.471l0.438,0.887
+		c-0.082,0.052-0.163,0.104-0.242,0.159l-0.722-0.724c-0.136-0.137-0.357-0.137-0.493,0l-1.864,1.878
+		c-0.134,0.137-0.135,0.36,0.001,0.496l0.605,0.608c-0.09,0.117-0.171,0.236-0.255,0.355l-0.644-0.321
+		c-0.172-0.086-0.382-0.014-0.467,0.158l-1.174,2.377c-0.086,0.173-0.014,0.384,0.157,0.47l0.806,0.403
+		c-0.017,0.1-0.027,0.2-0.038,0.299l-1.122,0.094c-0.19,0.016-0.334,0.187-0.318,0.378l0.215,2.645
+		c0.015,0.191,0.185,0.336,0.375,0.321l1.085-0.09c0.029,0.141,0.055,0.282,0.089,0.419l-0.916,0.371
+		c-0.178,0.072-0.265,0.277-0.192,0.456l0.982,2.461c0.071,0.179,0.277,0.266,0.454,0.195l1.004-0.407
+		c0.051,0.074,0.101,0.146,0.154,0.217l-0.728,0.82c-0.128,0.145-0.115,0.367,0.027,0.496l1.968,1.768
+		c0.142,0.13,0.363,0.116,0.49-0.027l0.755-0.851c0.005-0.005,0.006-0.01,0.009-0.015c0.104,0.058,0.207,0.115,0.316,0.167
+		l-0.255,0.904c-0.052,0.186,0.056,0.38,0.24,0.432l2.54,0.722c0.186,0.052,0.379-0.058,0.43-0.243l0.26-0.923
+		c0.092,0.01,0.178,0.025,0.27,0.034l0.056,0.004c0.015,0.001,0.043,0,0.062,0.001l0.058,0.796c0.013,0.191,0.181,0.338,0.372,0.324
+		l2.631-0.193c0.191-0.014,0.337-0.183,0.323-0.374l-0.054-0.747l0.337-0.018l0.057,0.806c0.013,0.19,0.182,0.337,0.373,0.322
+		l2.633-0.188c0.191-0.014,0.337-0.184,0.322-0.375l-0.053-0.744l0.259-0.014l0.057,0.786c0.014,0.192,0.181,0.339,0.372,0.325
+		l2.632-0.192c0.189-0.015,0.335-0.183,0.322-0.375l-0.052-0.723l0.27-0.016l0.051,0.72c0.014,0.185,0.176,0.324,0.357,0.311
+		l2.524-0.184c0.184-0.014,0.323-0.175,0.31-0.358l-0.048-0.659l0.273-0.015l0.045,0.655c0.015,0.192,0.182,0.339,0.373,0.324
+		l2.631-0.192c0.191-0.014,0.337-0.182,0.322-0.374l-0.042-0.593l0.338-0.017l0.046,0.647c0.014,0.192,0.181,0.338,0.372,0.325
+		l2.632-0.19c0.191-0.015,0.336-0.184,0.322-0.375l-0.041-0.586l0.26-0.014l0.045,0.629c0.014,0.192,0.182,0.339,0.372,0.325
+		l2.632-0.193c0.191-0.015,0.337-0.183,0.322-0.375l-0.041-0.565l0.271-0.014l0.041,0.561c0.011,0.185,0.173,0.326,0.356,0.312
+		l2.524-0.185c0.183-0.014,0.322-0.175,0.31-0.358l-0.036-0.503l0.289-0.015l0.033,0.485c0.013,0.179,0.171,0.316,0.35,0.303
+		l2.468-0.179c0.179-0.013,0.316-0.171,0.303-0.352l-0.039-0.56l0.282-0.028l0.042,0.582c0.012,0.179,0.166,0.312,0.343,0.299
+		l2.42-0.177c0.175-0.014,0.31-0.169,0.296-0.345l-0.047-0.659l0.271-0.026l0.045,0.628c0.012,0.172,0.163,0.303,0.333,0.29
+		l2.357-0.171c0.171-0.013,0.301-0.162,0.288-0.336l-0.051-0.703l0.345-0.034l0.052,0.711c0.012,0.174,0.163,0.304,0.334,0.291
+		l2.357-0.17c0.17-0.013,0.301-0.163,0.288-0.336l-0.057-0.789l0.169-0.017l0.09,0.656c0.025,0.171,0.184,0.291,0.354,0.267
+		l2.339-0.33c0.171-0.024,0.29-0.183,0.267-0.355l-0.117-0.834c0.04-0.016,0.082-0.029,0.121-0.046l0.524,0.751
+		c0.099,0.141,0.294,0.176,0.435,0.076l1.934-1.369c0.14-0.1,0.174-0.295,0.075-0.437l-0.506-0.723
+		c0.049-0.05,0.096-0.102,0.145-0.151l0.787,0.483c0.146,0.091,0.339,0.045,0.429-0.103l1.235-2.025
+		c0.09-0.147,0.045-0.343-0.103-0.433l-0.671-0.415c0.039-0.087,0.082-0.171,0.12-0.261l0.791,0.218
+		c0.167,0.045,0.34-0.054,0.386-0.221l0.624-2.293C333.332,150.605,333.233,150.432,333.067,150.386z M282.141,160.61l0.02-0.552
+		c-4.448-0.405-7.001-3.354-7.189-8.305c-0.057-1.552,0.624-3.175,1.92-4.571c1.69-1.823,4.179-3,6.51-3.072l40.068-2.693
+		c0.52-0.022,0.873-0.032,1.248-0.016c0.152,0.007,0.311,0.02,0.486,0.035c1.715,0.156,3.303,1.182,4.472,2.886
+		c1.111,1.62,1.676,3.679,1.51,5.51c-0.349,3.839-2.96,6.902-6.202,7.281l-14.086,1.387l-26.629,1.43l-0.078,0.009
+		c-0.21,0.038-1.72,0.134-2.024,0.12L282.141,160.61z"/>
+	<path fill="#767F79" d="M331.731,149.882c0.365-4.032-2.486-8.631-6.479-8.995c-0.621-0.056-1.018-0.055-1.808-0.021l-40.08,2.695
+		c-4.442,0.137-9.101,4.009-8.941,8.214c0.203,5.341,3.003,8.407,7.687,8.833c0.265,0.025,1.962-0.082,2.187-0.127l26.628-1.43
+		l14.11-1.388C328.479,157.26,331.354,154.038,331.731,149.882z"/>
+	<path fill="#707973" d="M328.651,156.044c1.67-1.409,2.849-3.608,3.08-6.162c0.365-4.032-2.486-8.631-6.479-8.995
+		c-0.621-0.056-1.018-0.055-1.808-0.021l-40.08,2.695c-1.606,0.049-3.239,0.589-4.663,1.453L328.651,156.044z"/>
+	<path fill="#94A39E" d="M325.508,145.672c-1.182-0.65-3.09-0.605-4.241,0.098c-0.553,0.338-1.438,1.205-1.438,1.205l-34.933,2.436
+		c-0.366-0.518-0.817-0.958-1.304-1.228c-1.183-0.65-3.091-0.605-4.241,0.098c-1.151,0.704-2.069,2.388-2.04,3.743
+		c0.029,1.354,1.021,2.994,2.2,3.646c1.183,0.651,3.091,0.606,4.241-0.098c0.457-0.279,0.874-0.716,1.213-1.223l35.136-2.448
+		c0.373,0.53,0.831,0.983,1.328,1.258c1.181,0.65,3.089,0.607,4.24-0.097s2.07-2.389,2.04-3.744
+		C327.679,147.963,326.689,146.322,325.508,145.672z"/>
+	<polyline fill="#B4BBA6" points="225.113,26.793 221.273,32.681 292.776,76.062 311.414,118.406 316.369,104.793 298.303,66.471 
+		225.19,25.084 	"/>
+	<polygon fill="#BFC3A6" points="226.825,22.132 225.113,26.793 297.323,71.526 314.001,107.146 321.7,98.964 309.949,59.018 	"/>
+	<path fill="#A6AA92" d="M332.548,97.035c0.626-1.238,1.054-1.915,1.054-1.915l-15.787,1.756c0,0-0.3,0.526-0.76,1.507l15.311-1.365
+		L332.548,97.035z"/>
+	<path fill="#B6B99C" d="M354.62,97.083l-21.019-1.963c0,0-0.428,0.677-1.054,1.915l22.106,2.15L354.62,97.083z"/>
+	<polygon fill="#BFC3A6" points="177.713,80.935 231.844,21.957 233.559,0.552 221.286,0 176.322,72.525 	"/>
+	<polygon fill="#B4BBA6" points="214.881,2.502 173.011,68.087 178.215,75.15 221.286,0 	"/>
+	<path fill="#828E88" d="M154.559,50.259l-19.388,6.167c0,0-12.852,5.93-12.029,25.848c0.817,19.812,2.029,29.532,2.029,29.532
+		l15.491-0.194l1.359-30.268L154.559,50.259z"/>
+	<path fill="#94A39E" d="M168.724,56.053c-2.498-3.515-6.896-7.101-11.574-6.415c-6.17,0.904-11.164,3.425-13.564,8.462
+		c-6.903,11.874-2.923,53.512-2.923,53.512l2.018-0.584l-0.543-9.717c0.14-9.815,12.638-13.326,12.638-13.326l27.521-8.361
+		C176.204,65.405,168.724,56.053,168.724,56.053z"/>
+	<polygon fill="#707973" points="308.684,135.338 308.762,145.788 340.373,141.313 340.074,135.729 	"/>
+	<g>
+		<path fill="#828E88" d="M385.802,148.452l-1.01-2.493c-0.073-0.182-0.28-0.269-0.461-0.196l-0.614,0.252l0.676-0.626
+			c0.143-0.134,0.152-0.359,0.021-0.504l-1.813-1.979c-0.133-0.144-0.356-0.153-0.5-0.02l-0.846,0.783
+			c-0.144,0.133-0.152,0.358-0.02,0.502l1.812,1.981c0.044,0.047,0.097,0.073,0.153,0.092c-0.13,0.094-0.191,0.263-0.128,0.418
+			l1.009,2.494c0.073,0.182,0.282,0.271,0.463,0.196l1.063-0.438C385.788,148.841,385.875,148.633,385.802,148.452z"/>
+		<path fill="#828E88" d="M376.8,141.704l1.453,0.313c0.071,0.015,0.14,0.002,0.203-0.024c0.018,0.098,0.07,0.188,0.16,0.244
+			l2.285,1.402c0.165,0.102,0.385,0.049,0.487-0.118l0.598-0.986c0.103-0.167,0.049-0.387-0.117-0.489l-2.284-1.402
+			c-0.167-0.104-0.384-0.05-0.487,0.118l-0.332,0.547l0.149-0.694c0.04-0.191-0.082-0.382-0.272-0.423l-2.617-0.564
+			c-0.189-0.041-0.379,0.082-0.421,0.273l-0.156,0.735l-0.063-0.05l-0.025-0.741c-0.008-0.195-0.172-0.35-0.365-0.342l-2.676,0.095
+			c-0.194,0.008-0.348,0.173-0.342,0.369l0.01,0.265l-0.289,0.01l-0.011-0.346c-0.007-0.194-0.172-0.349-0.365-0.343l-2.677,0.096
+			c-0.193,0.007-0.347,0.173-0.341,0.368l0.013,0.336l-0.301,0.01l-0.013-0.353c-0.007-0.195-0.171-0.35-0.366-0.343l-2.676,0.096
+			c-0.193,0.007-0.347,0.173-0.341,0.368l0.013,0.342l-0.312,0.01l-0.012-0.319c-0.007-0.194-0.172-0.35-0.365-0.343l-2.676,0.096
+			c-0.194,0.007-0.349,0.174-0.342,0.368l0.011,0.31l-0.279,0.009l-0.009-0.245c-0.007-0.201-0.175-0.359-0.375-0.353l-2.749,0.099
+			c-0.2,0.007-0.356,0.177-0.351,0.378l0.009,0.235l-0.233,0.008l-0.01-0.295c-0.007-0.205-0.18-0.366-0.383-0.359l-2.803,0.1
+			c-0.203,0.009-0.364,0.182-0.357,0.387l0.011,0.283l-0.328,0.011l-0.01-0.297c-0.008-0.209-0.184-0.374-0.392-0.367l-2.867,0.104
+			c-0.208,0.009-0.371,0.186-0.364,0.395l0.01,0.285l-0.307,0.01l-0.012-0.338c-0.007-0.219-0.19-0.391-0.408-0.382l-2.989,0.106
+			c-0.217,0.007-0.389,0.193-0.381,0.41l0.013,0.326l-0.477,0.017l-0.013-0.356c-0.008-0.217-0.192-0.39-0.409-0.383l-2.986,0.108
+			c-0.218,0.007-0.389,0.191-0.382,0.41l0.013,0.345l-0.267,0.009l-0.014-0.382c-0.007-0.197-0.172-0.351-0.366-0.344l-2.675,0.097
+			c-0.195,0.007-0.348,0.172-0.342,0.367l0.014,0.372l-0.312,0.011l-0.013-0.35c-0.007-0.197-0.171-0.35-0.366-0.343l-2.676,0.096
+			c-0.193,0.006-0.348,0.171-0.34,0.368l0.011,0.339l-0.28,0.009l-0.009-0.276c-0.008-0.201-0.176-0.358-0.375-0.352l-2.749,0.099
+			c-0.2,0.007-0.357,0.178-0.351,0.378l0.009,0.266l-0.231,0.007l-0.012-0.323c-0.008-0.205-0.179-0.367-0.384-0.359l-2.802,0.1
+			c-0.204,0.007-0.364,0.18-0.358,0.386l0.012,0.314l-0.327,0.011l-0.011-0.327c-0.008-0.21-0.184-0.375-0.392-0.367l-2.866,0.103
+			c-0.209,0.007-0.373,0.186-0.365,0.396l0.011,0.314l-0.307,0.01l-0.013-0.369c-0.008-0.217-0.191-0.39-0.408-0.383l-2.989,0.109
+			c-0.217,0.007-0.388,0.192-0.38,0.41l0.012,0.357l-0.476,0.015l-0.015-0.386c-0.008-0.22-0.191-0.391-0.409-0.383l-2.986,0.107
+			c-0.217,0.007-0.388,0.192-0.381,0.41l0.014,0.374l-0.439,0.016l-0.098-0.486c-0.044-0.215-0.253-0.354-0.466-0.311l-2.932,0.595
+			c-0.213,0.045-0.353,0.255-0.309,0.47l0.15,0.751c-0.202,0.08-0.408,0.167-0.616,0.258l-0.389-0.761
+			c-0.1-0.194-0.339-0.271-0.531-0.172l-2.661,1.373c-0.193,0.101-0.271,0.341-0.172,0.535l0.463,0.906
+			c-0.112,0.083-0.224,0.168-0.335,0.256l-0.708-0.75c-0.171-0.182-0.453-0.183-0.624,0l-2.376,2.521
+			c-0.171,0.184-0.171,0.481,0.002,0.662l0.745,0.792c-0.104,0.162-0.206,0.326-0.304,0.496l-0.808-0.425
+			c-0.222-0.115-0.489-0.025-0.598,0.202l-1.503,3.197c-0.107,0.228-0.013,0.509,0.207,0.625l1.212,0.637
+			c-0.019,0.108-0.033,0.219-0.049,0.33c-0.062-0.024-0.129-0.039-0.202-0.033l-1.408,0.126c-0.247,0.022-0.437,0.245-0.417,0.497
+			l0.265,3.559c0.02,0.252,0.238,0.438,0.487,0.416l1.346-0.121c0.036,0.191,0.074,0.38,0.12,0.565l-1.145,0.49
+			c-0.229,0.1-0.346,0.372-0.257,0.607l1.246,3.303c0.089,0.236,0.348,0.347,0.578,0.248l1.319-0.565
+			c0.02-0.008,0.032-0.023,0.05-0.034c0.061,0.089,0.12,0.177,0.182,0.264c-0.019,0.014-0.037,0.022-0.052,0.04l-0.964,1.142
+			c-0.161,0.193-0.144,0.491,0.037,0.663l2.485,2.356c0.184,0.172,0.464,0.155,0.625-0.036l0.853-1.01
+			c0.107,0.089,0.217,0.175,0.324,0.26l-0.22,0.927c-0.058,0.245,0.091,0.503,0.33,0.574l3.278,0.97
+			c0.183,0.054,15.949-0.103,15.949-0.103l0.771-2.029l49.419-3.173l5.462-1.411l3.062-5.017l0.895-5.667l-3.744-6.243
+			L376.8,141.704z"/>
+	</g>
+	<path fill="#B4BBA6" d="M327.736,131.17l4.984-34.432l-15.647,1.63c0,0-7.701,12.955-5.316,32.196l-9.961-0.378l0.35,5.356
+		l26.518,1.191l-0.561-5.551L327.736,131.17z"/>
+	<g>
+		<path fill="#828E88" d="M319.786,99.882c-0.603,0.054-1.354,0.521-1.668,1.038c0,0-6.353,10.418-4.044,27.862l9.647,0.558
+			c0.604,0.035,0.979-0.417,0.833-1.004c0,0-1.326-5.333-0.212-14.279c0.562-4.521,1.532-9.666,4.632-15.004L319.786,99.882z"/>
+	</g>
+	<path fill="#767F79" d="M384.897,154.409c0.429-4.73-2.917-10.125-7.601-10.554c-0.729-0.064-1.192-0.064-2.12-0.024l-47.02,3.161
+		c-5.21,0.162-10.675,4.702-10.487,9.636c0.237,6.267,3.522,9.862,9.017,10.363c0.311,0.028,2.302-0.095,2.565-0.15l31.236-1.677
+		l16.554-1.628C381.08,163.063,384.454,159.285,384.897,154.409z"/>
+	<path fill="#707973" d="M381.284,161.638c1.96-1.655,3.341-4.232,3.613-7.229c0.429-4.73-2.917-10.125-7.601-10.554
+		c-0.729-0.064-1.192-0.064-2.12-0.024l-47.02,3.161c-1.884,0.059-3.798,0.691-5.47,1.706L381.284,161.638z"/>
+	<path fill="#828E88" d="M374.678,140.227c0,0,6.621-0.738,9.856,7.691l-2.781-2.22l-4.437-2.339L374.678,140.227z"/>
+	<path fill="#94A39E" d="M386.465,155l-1.055-0.288c0.008-0.064,0.019-0.124,0.025-0.188l0.933-0.063
+		c0.2-0.015,0.354-0.19,0.34-0.393l-0.185-2.781c-0.015-0.202-0.19-0.355-0.391-0.343l-0.939,0.064
+		c-0.011-0.049-0.024-0.096-0.037-0.145l0.841-0.372c0.184-0.082,0.268-0.301,0.187-0.486l-1.119-2.55
+		c-0.081-0.185-0.298-0.27-0.481-0.188l-0.813,0.36c-0.035-0.055-0.073-0.106-0.109-0.161l0.72-0.756
+		c0.139-0.146,0.135-0.381-0.012-0.521l-1.999-1.929c-0.146-0.14-0.38-0.135-0.519,0.011l-0.598,0.628
+		c-0.036-0.026-0.072-0.05-0.106-0.076l0.343-0.851c0.076-0.188-0.015-0.404-0.201-0.48l-2.569-1.047
+		c-0.186-0.076-0.4,0.016-0.476,0.202l-0.302,0.75c-0.05-0.009-0.099-0.014-0.146-0.022l0.041-0.781
+		c0.011-0.202-0.146-0.378-0.348-0.389l-2.767-0.144c-0.201-0.011-0.375,0.146-0.386,0.349l-0.048,0.927l-0.255,0.018l-0.062-0.993
+		c-0.012-0.204-0.187-0.358-0.388-0.346l-2.766,0.172c-0.201,0.011-0.355,0.187-0.343,0.389l0.062,1.012l-0.288,0.021l-0.059-0.95
+		c-0.013-0.208-0.191-0.366-0.397-0.353l-2.842,0.176c-0.206,0.013-0.365,0.193-0.352,0.4l0.059,0.968l-0.241,0.016l-0.062-1.032
+		c-0.014-0.212-0.195-0.374-0.406-0.361l-2.896,0.18c-0.211,0.014-0.373,0.196-0.36,0.408l0.064,1.053l-0.338,0.023l-0.064-1.068
+		c-0.014-0.216-0.201-0.383-0.416-0.37l-2.962,0.186c-0.216,0.013-0.381,0.201-0.368,0.418l0.065,1.087l-0.339,0.021l-0.067-1.11
+		c-0.013-0.203-0.187-0.358-0.388-0.346l-2.766,0.173c-0.201,0.012-0.355,0.188-0.345,0.389l0.069,1.131l-0.324,0.021l-0.067-1.108
+		c-0.013-0.203-0.188-0.357-0.388-0.346l-2.766,0.173c-0.2,0.011-0.354,0.187-0.344,0.389l0.069,1.128l-0.29,0.02l-0.062-1.065
+		c-0.014-0.208-0.193-0.366-0.399-0.353l-2.841,0.176c-0.207,0.013-0.364,0.192-0.353,0.399l0.066,1.085l-0.24,0.016l-0.069-1.148
+		c-0.015-0.212-0.197-0.374-0.406-0.361l-2.897,0.18c-0.211,0.014-0.372,0.196-0.359,0.408l0.071,1.169l-0.34,0.021l-0.07-1.183
+		c-0.013-0.217-0.201-0.383-0.416-0.37l-2.962,0.186c-0.215,0.013-0.381,0.201-0.368,0.418l0.073,1.201l-0.316,0.021l-0.077-1.26
+		c-0.014-0.227-0.209-0.399-0.433-0.385l-3.088,0.191c-0.225,0.014-0.397,0.21-0.384,0.436l0.076,1.28l-0.491,0.033l-0.079-1.316
+		c-0.015-0.226-0.209-0.398-0.434-0.385l-3.088,0.192c-0.224,0.014-0.396,0.21-0.383,0.436l0.08,1.333c0,0.001,0,0.002,0,0.003
+		l-0.545,0.036l-0.078-1.293c-0.014-0.226-0.209-0.399-0.434-0.385l-3.09,0.192c-0.225,0.014-0.397,0.21-0.384,0.436l0.081,1.331
+		c0.002,0.041,0.018,0.077,0.03,0.112c-0.113,0.026-0.229,0.054-0.342,0.082c-0.007-0.038-0.012-0.077-0.03-0.113l-0.59-1.194
+		c-0.101-0.204-0.347-0.287-0.549-0.187l-2.771,1.385c-0.201,0.101-0.283,0.35-0.184,0.553l0.551,1.118
+		c-0.088,0.056-0.177,0.11-0.264,0.169l-0.905-0.909c-0.158-0.16-0.418-0.16-0.577,0l-2.188,2.204c-0.158,0.16-0.159,0.422,0,0.581
+		l0.777,0.783c-0.099,0.13-0.187,0.262-0.279,0.391l-0.841-0.42c-0.2-0.101-0.447-0.018-0.549,0.185l-1.375,2.79
+		c-0.102,0.203-0.018,0.45,0.184,0.551l1.036,0.518c-0.019,0.105-0.029,0.21-0.043,0.316c-0.029-0.005-0.056-0.014-0.086-0.011
+		l-1.324,0.11c-0.224,0.019-0.392,0.218-0.373,0.442l0.251,3.104c0.02,0.225,0.217,0.395,0.44,0.376l1.324-0.111
+		c0.017-0.001,0.027-0.008,0.043-0.012c0.032,0.159,0.063,0.32,0.101,0.474l-1.164,0.472c-0.208,0.085-0.311,0.325-0.227,0.535
+		l1.153,2.886c0.084,0.211,0.324,0.313,0.532,0.229l1.231-0.498c0.014-0.004,0.022-0.016,0.034-0.022
+		c0.054,0.078,0.109,0.156,0.165,0.232c-0.014,0.012-0.028,0.018-0.041,0.031l-0.885,0.997c-0.149,0.169-0.136,0.43,0.033,0.581
+		l2.307,2.073c0.167,0.151,0.427,0.137,0.577-0.031l0.884-0.997c0.028-0.031,0.044-0.067,0.061-0.102
+		c0.114,0.062,0.229,0.126,0.348,0.184l-0.323,1.157c-0.063,0.218,0.064,0.446,0.28,0.508l2.979,0.845
+		c0.216,0.062,0.442-0.066,0.504-0.284l0.331-1.177c0.101,0.012,0.196,0.029,0.298,0.038l0.063,0.004
+		c0.018,0.001,0.039,0.002,0.061,0.002l0.073,1.029c0.016,0.226,0.212,0.397,0.437,0.381l3.086-0.226
+		c0.225-0.017,0.395-0.215,0.379-0.44l-0.069-0.973l0.396-0.021l0.073,1.04c0.017,0.226,0.213,0.396,0.438,0.381l3.088-0.224
+		c0.224-0.017,0.394-0.214,0.378-0.439l-0.068-0.967l0.304-0.017l0.073,1.018c0.017,0.226,0.213,0.396,0.438,0.381l3.087-0.227
+		c0.225-0.016,0.395-0.214,0.378-0.439l-0.066-0.943l0.316-0.016l0.067,0.938c0.014,0.216,0.202,0.381,0.417,0.365l2.962-0.216
+		c0.215-0.016,0.378-0.206,0.363-0.421l-0.062-0.869l0.317-0.017l0.062,0.863c0.016,0.227,0.212,0.397,0.437,0.382l3.087-0.227
+		c0.225-0.017,0.395-0.214,0.378-0.44l-0.056-0.788l0.396-0.021l0.061,0.855c0.016,0.225,0.212,0.396,0.437,0.38l3.088-0.223
+		c0.225-0.017,0.395-0.214,0.379-0.439l-0.056-0.784l0.304-0.017l0.06,0.835c0.017,0.226,0.214,0.396,0.437,0.38l3.088-0.226
+		c0.225-0.017,0.395-0.214,0.379-0.439l-0.055-0.759l0.316-0.018l0.054,0.755c0.016,0.217,0.204,0.381,0.418,0.366l2.962-0.216
+		c0.215-0.016,0.379-0.206,0.362-0.422l-0.047-0.685l0.338-0.017l0.046,0.662c0.016,0.212,0.201,0.372,0.41,0.357l2.896-0.21
+		c0.211-0.017,0.37-0.201,0.354-0.413l-0.052-0.751l0.332-0.033l0.056,0.779c0.013,0.208,0.194,0.364,0.4,0.35l2.84-0.208
+		c0.206-0.016,0.361-0.197,0.348-0.405l-0.062-0.866l0.318-0.032l0.06,0.832c0.015,0.202,0.19,0.354,0.392,0.34l2.765-0.199
+		c0.2-0.015,0.353-0.192,0.338-0.395l-0.065-0.922l0.405-0.038l0.066,0.93c0.015,0.202,0.191,0.354,0.392,0.34l2.764-0.199
+		c0.201-0.015,0.354-0.192,0.338-0.395l-0.073-1.02l0.192-0.02l0.121,0.864c0.027,0.201,0.214,0.342,0.414,0.314l2.743-0.389
+		c0.2-0.029,0.34-0.216,0.312-0.417l-0.149-1.074c0.032-0.015,0.065-0.024,0.098-0.038l0.671,0.96
+		c0.116,0.167,0.346,0.206,0.512,0.09l2.268-1.605c0.164-0.115,0.205-0.347,0.089-0.512l-0.648-0.928
+		c0.048-0.049,0.094-0.101,0.142-0.15l1.004,0.62c0.174,0.106,0.398,0.052,0.504-0.121l1.45-2.377c0.105-0.173,0.052-0.4-0.12-0.507
+		l-0.869-0.536c0.044-0.093,0.09-0.186,0.132-0.281l1.021,0.28c0.194,0.053,0.396-0.063,0.449-0.259l0.732-2.689
+		C386.774,155.257,386.658,155.053,386.465,155z M326.725,166.993l0.012-0.552c-5.271-0.48-8.296-3.973-8.519-9.835
+		c-0.07-1.845,0.737-3.773,2.276-5.431c2-2.155,4.943-3.547,7.7-3.634l47.006-3.16c0.612-0.026,1.028-0.036,1.473-0.017
+		c0.181,0.008,0.367,0.021,0.575,0.04c4.472,0.408,7.489,5.686,7.104,9.954c-0.414,4.548-3.514,8.177-7.361,8.628l-16.53,1.626
+		l-31.237,1.677l-0.08,0.011c-0.24,0.045-2.025,0.158-2.394,0.142L326.725,166.993z"/>
+	<path fill="#94A39E" d="M377.596,149.471c-1.386-0.764-3.624-0.712-4.976,0.113c-0.522,0.319-1.003,0.816-1.396,1.393
+		l-40.762,2.842c-0.426-0.579-0.938-1.073-1.491-1.379c-1.386-0.762-3.625-0.711-4.976,0.115c-1.351,0.824-2.427,2.801-2.392,4.39
+		c0.035,1.59,1.196,3.515,2.581,4.277c1.385,0.764,3.625,0.713,4.975-0.113c0.557-0.34,1.059-0.879,1.464-1.5l40.629-2.833
+		c0.437,0.621,0.974,1.154,1.559,1.477c1.385,0.763,3.623,0.712,4.974-0.114c1.352-0.825,2.428-2.802,2.393-4.391
+		C380.143,152.157,378.981,150.233,377.596,149.471z"/>
+	<path fill="#BFC3A6" d="M384.231,113.409l-29.379-2.072l-0.205-12.595l-21.927-2.004c0,0-9.462,14.98-5.043,34.145l0.985,5.852
+		l56.224-3.152L384.231,113.409z"/>
+	<g>
+		<path fill="#828E88" d="M335.304,98.867l6.75,0.598c0.603,0.053,1.073,0.591,1.047,1.195l-0.988,21.977
+			c-0.026,0.604-0.402,1.445-0.835,1.868l-3.866,3.79c-0.433,0.423-1.28,0.792-1.885,0.819l-3.916,0.178
+			c-0.604,0.027-1.236-0.426-1.406-1.007c0,0-1.134-3.9-0.816-11.101C329.646,111.313,331.092,103.582,335.304,98.867z"/>
+	</g>
+	<g>
+		<path fill="#828E88" d="M347.251,99.878c-0.602-0.058-1.11,0.39-1.129,0.994l-0.598,19.017c-0.019,0.604,0.331,0.766,0.777,0.357
+			l5.535-5.065c0.446-0.408,0.813-1.237,0.815-1.843l0.047-11.834c0.002-0.605-0.489-1.148-1.091-1.206L347.251,99.878z"/>
+	</g>
+	<polygon fill="#B6B99C" points="384.887,133.582 384.754,128.73 327.736,131.17 327.727,131.17 328.663,136.734 	"/>
+	<polygon fill="#A6AA92" points="328.663,136.734 327.736,131.17 311.757,130.564 311.757,130.564 301.796,130.187 302.146,135.543 
+			"/>
+</g>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/404-hills-left.svg b/bridgedb/https/templates/assets/images/404-hills-left.svg
new file mode 100644
index 0000000..13901d4
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/404-hills-left.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="281.52px" height="112.055px" viewBox="0 0 281.52 112.055" enable-background="new 0 0 281.52 112.055"
+	 xml:space="preserve">
+<g>
+	
+		<image overflow="visible" opacity="0.1" width="1173" height="495" xlink:href="BEFA45F0C4EFA63F.png"  transform="matrix(0.24 0 0 0.24 0 0)">
+	</image>
+	<g>
+		<polyline fill="#BBCAC6" points="275.011,102.099 245.136,64.12 231.537,64.12 185.894,6.48 106.606,6.48 83.963,41.12 
+			56.652,41.12 6.48,102.099 6.48,112.106 275.011,112.106 275.011,102.099 		"/>
+	</g>
+</g>
+<polygon fill="#B4C0BF" points="101.003,30.779 90.214,49.96 64.831,49.96 41.867,81.083 118.687,81.083 132.261,64.343 
+	102.193,64.343 118.981,30.776 "/>
+<polygon fill="#CAD8D7" points="106.605,6.48 99.325,17.594 178.144,17.594 224.897,76.345 237.25,76.345 260.021,102.099 
+	275.011,101.977 245.136,64.12 231.537,64.12 185.894,6.48 "/>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/404-hills-right.svg b/bridgedb/https/templates/assets/images/404-hills-right.svg
new file mode 100644
index 0000000..6ac747c
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/404-hills-right.svg
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="397.299px" height="119.108px" viewBox="0 0 397.299 119.108" enable-background="new 0 0 397.299 119.108"
+	 xml:space="preserve">
+<g>
+	
+		<image overflow="visible" opacity="0.1" width="1333" height="602" xlink:href="392229F0603DFEAA.png"  transform="matrix(0.24 0 0 0.24 -12.6143 -12.6143)">
+	</image>
+	<g>
+		<g>
+			<polygon fill="#BBCAC6" points="294.665,109.152 228.193,40.046 209.505,40.046 177.47,0 117.4,0 0,109.152 0,119.16 
+				294.665,119.16 			"/>
+			<g>
+				<polygon fill="#CAD8D7" points="263.641,77.142 228.193,40.046 209.505,40.046 177.47,0 117.4,0 108.58,8.013 169.454,8.013 
+					201.49,48.06 221.179,48.06 255.625,85.158 254.624,109.152 263.641,109.152 				"/>
+			</g>
+		</g>
+	</g>
+</g>
+<g>
+	
+		<image overflow="visible" opacity="0.1" width="867" height="309" xlink:href="392229F0603DFEAE.png"  transform="matrix(0.24 0 0 0.24 189.2192 51.5386)">
+	</image>
+	<g>
+		<polygon fill="#BBCAC6" points="195.699,109.152 281.896,58.019 326.86,58.019 350.841,87.996 364.83,87.996 390.81,109.152 
+			390.81,119.16 195.699,119.16 		"/>
+	</g>
+</g>
+<polygon fill="#B4C0BF" points="233.388,109.152 210.191,109.152 267.733,72.18 290.93,72.18 "/>
+<polygon fill="#CAD8D7" points="323.482,63.788 346.859,93.758 363.043,93.758 381.624,109.152 390.77,109.152 364.83,87.996 
+	350.841,87.996 326.86,58.019 281.896,58.019 272.146,63.788 "/>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/500-hills-left-shade.svg b/bridgedb/https/templates/assets/images/500-hills-left-shade.svg
new file mode 100644
index 0000000..904c64b
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/500-hills-left-shade.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="202.271px" height="25.842px" viewBox="0 0 202.271 25.842" enable-background="new 0 0 202.271 25.842"
+	 xml:space="preserve">
+<polygon fill="#D6BA6B" points="176.225,0 51.492,0 21.469,11.69 6.005,11.69 -0.001,25.842 202.271,25.842 "/>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/500-hills-left.svg b/bridgedb/https/templates/assets/images/500-hills-left.svg
new file mode 100644
index 0000000..a01274e
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/500-hills-left.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="331.68px" height="128.235px" viewBox="0 0 331.68 128.235" enable-background="new 0 0 331.68 128.235"
+	 xml:space="preserve">
+<g>
+	<g>
+		
+			<image overflow="visible" opacity="0.1" width="1382" height="561" xlink:href="6AB008E8BA7227E6.png"  transform="matrix(0.24 0 0 0.24 0 0)">
+		</image>
+		<g>
+			<polygon fill="#DDC782" points="325.052,117.99 275.16,64.12 241.545,64.12 185.894,6.48 96.599,6.48 73.956,41.12 46.645,41.12 
+				6.48,118.112 6.48,128.12 325.052,128.12 			"/>
+		</g>
+	</g>
+</g>
+<polygon fill="#E2D5A8" points="95.996,6.48 88.886,17.594 178.145,17.594 234.905,76.345 267.272,76.345 307.058,118.301 
+	325.052,117.99 275.16,64.12 241.545,64.12 185.894,6.48 "/>
+<polygon fill="#D6BA6B" points="90.997,34.783 80.208,53.964 52.821,53.964 17.847,117.112 94.667,117.112 114.246,68.347 
+	93.186,68.347 108.974,34.78 "/>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/500-hills-right-shade.svg b/bridgedb/https/templates/assets/images/500-hills-right-shade.svg
new file mode 100644
index 0000000..5cfedae
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/500-hills-right-shade.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="202.271px" height="25.842px" viewBox="0 0 202.271 25.842" enable-background="new 0 0 202.271 25.842"
+	 xml:space="preserve">
+<polygon fill="#D6BA6B" points="186.234,11.69 176.226,0 51.494,0 0,25.842 202.272,25.842 202.272,11.69 "/>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/500-hills-right.svg b/bridgedb/https/templates/assets/images/500-hills-right.svg
new file mode 100644
index 0000000..1ceb110
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/500-hills-right.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="364.08px" height="99.524px" viewBox="0 0 364.08 99.524" enable-background="new 0 0 364.08 99.524" xml:space="preserve">
+<g>
+	<g>
+		<g>
+			
+				<image overflow="visible" opacity="0.1" width="973" height="390" xlink:href="423B8197D66693F1.png"  transform="matrix(0.24 0 0 0.24 127.1021 0)">
+			</image>
+			<g>
+				<polygon fill="#DDC782" points="357.594,90.549 274.083,3 210.635,3 182.937,36.624 164.445,36.624 130.102,90.549 				"/>
+			</g>
+		</g>
+		<polygon fill="#D6BA6B" points="231.917,22.801 206.431,22.801 187.94,47.95 171.654,47.206 145.282,88.371 168.425,88.371 
+			182.449,63.548 199.237,63.572 		"/>
+		<g>
+			<polygon fill="#E2D5A8" points="274.083,3 210.654,3 204.371,10.625 267.201,10.625 344.072,90.549 357.594,90.549 			"/>
+		</g>
+	</g>
+	<g>
+		
+			<image overflow="visible" opacity="0.1" width="1517" height="309" xlink:href="423B8197D66693F3.png"  transform="matrix(0.24 0 0 0.24 0 32.2876)">
+		</image>
+		<g>
+			<polygon fill="#DDC782" points="189.581,89.523 163.601,68.745 149.612,68.745 125.631,38.768 80.667,38.768 6.48,89.779 
+				6.48,99.787 357.594,99.787 357.594,89.523 			"/>
+		</g>
+	</g>
+	<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="270.4526" y1="86.5244" x2="270.4526" y2="89.5244">
+		<stop  offset="0" style="stop-color:#B5A339;stop-opacity:0"/>
+		<stop  offset="0.4085" style="stop-color:#C2AC4D;stop-opacity:0.1"/>
+		<stop  offset="1" style="stop-color:#D6BA6B"/>
+	</linearGradient>
+	<polygon fill="url(#SVGID_1_)" points="352.266,86.524 183.286,86.524 183.286,89.524 357.62,89.524 	"/>
+	<polygon fill="#E2D5A8" points="122.253,44.537 145.63,74.507 161.814,74.507 180.395,89.492 189.541,89.492 163.601,68.745 
+		149.612,68.745 125.631,38.768 80.667,38.768 72.039,44.537 	"/>
+	<polygon fill="#D6BA6B" points="42.167,89.492 18.97,89.492 69.507,52.929 92.704,52.929 	"/>
+</g>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/500-road.svg b/bridgedb/https/templates/assets/images/500-road.svg
new file mode 100644
index 0000000..3d5a5b1
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/500-road.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="432.973px" height="305.408px" viewBox="0 0 432.973 305.408" enable-background="new 0 0 432.973 305.408"
+	 xml:space="preserve">
+<g>
+	<polygon fill="#56524F" points="362.724,165.068 404.552,48.501 250.935,48.501 107.346,105.933 49.844,231.263 114.297,268.895 
+		389.082,268.895 407.378,232.175 	"/>
+</g>
+<g>
+	<g>
+		<polygon fill="#FFFFFF" points="308.927,60.146 304.964,59.876 314.111,52.344 318.259,52.311 		"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M269.763,257.904l-23.545-42.796l7.771-0.163l24.545,43.797L269.763,257.904z M239.668,200.162
+			L223,166.075l7.982,0.34l16.457,33.584L239.668,200.162z M228.845,154.631l-6.869-0.887l10.46-27.177l5.869,0.887L228.845,154.631
+			z M243.781,117.623l-5.965-0.27l14.85-11.64l5.963,0.271L243.781,117.623z M267.365,97.261l-5.965-0.27l17.854-13.642l4.963,0.27
+			L267.365,97.261z M289.949,76.897l-3.963-0.27l13.729-10.752l3.963,0.27L289.949,76.897z"/>
+	</g>
+</g>
+<g>
+	<g>
+		<path fill="#FFFFFF" d="M111.666,304.173c-4.279,1.647-11.282,1.647-15.562,0L3.111,268.366c-4.279-1.647-4.125-3.842,0.343-4.875
+			l92.308-21.353c4.468-1.033,11.778-1.033,16.246,0l92.306,21.353c4.468,1.033,4.622,3.228,0.342,4.875L111.666,304.173z"/>
+	</g>
+	<polygon fill="#D25031" points="179.687,74.322 106.597,85.136 106.597,17.599 179.687,29.491 160.061,51.613 	"/>
+	<path fill="#FFFFFF" d="M110.097,12.992c-0.011-3.069-2.511-5.549-5.581-5.538c-3.069,0.013-5.548,2.511-5.537,5.578
+		c0.007,1.555,1.485,2.956,2.518,3.962v135.272l6.112-0.03V16.993C108.633,15.981,110.101,14.548,110.097,12.992z"/>
+	<g>
+		<path fill="#CD6632" d="M175.843,261.758c-2.501-5.839-63.367-143.689-63.367-143.689s-1.186-3.058-3.056-3.058
+			c-2.189,0-7.214,0-9.402,0c-1.964,0-3.057,3.058-3.057,3.058S36.096,255.919,33.594,261.758c-2.502,5.835,1.111,6.112,1.111,6.112
+			c42.475,19.179,104.313,15.982,140.027,0C174.732,267.87,178.343,267.593,175.843,261.758z"/>
+		<path fill="#FFFFFF" d="M165.442,238.104c-3.729-8.463-8.184-18.562-12.902-29.261c-16.927,3.859-35.25,6.054-49.863,6.121
+			c-19.318,0.091-35.643-2.262-46.023-5.569c-4.623,10.482-8.985,20.371-12.649,28.681c8.834,2.624,29.308,10.009,58.882,9.849
+			C120.642,247.83,141.678,243.415,165.442,238.104z"/>
+		<path fill="#FFFFFF" d="M82.841,150.052c-3.585,8.122-7.609,17.241-11.774,26.674c8.936,1.415,19.597,2.471,31.82,2.413
+			c10.549-0.048,22.264-1.415,35.013-3.473c-4.11-9.316-8.075-18.298-11.602-26.285c-8.365,0.867-16.44,1.339-23.621,1.369
+			C95.615,150.779,88.959,150.522,82.841,150.052z"/>
+	</g>
+</g>
+<g>
+	<g>
+		<path fill="#FFFFFF" d="M384.685,177.18c-2.205,0.688-5.812,0.688-8.018,0l-46.656-14.549c-2.205-0.688-2.168-1.676,0.082-2.196
+			l46.492-10.754c2.25-0.521,5.932-0.521,8.184,0l46.492,10.754c2.25,0.521,2.287,1.509,0.082,2.196L384.685,177.18z"/>
+	</g>
+	<polygon fill="#D25031" points="418.652,65.256 382.044,70.603 382.044,36.587 418.652,41.933 409.099,53.174 	"/>
+	<path fill="#FFFFFF" d="M383.806,34.267c-0.006-1.546-1.266-2.795-2.809-2.789c-1.549,0.006-2.797,1.264-2.789,2.81
+		c0.002,0.783,0.746,1.488,1.266,1.994v68.134l3.078-0.016l0.002-68.118C383.07,35.772,383.808,35.05,383.806,34.267z"/>
+	<g>
+		<path fill="#CD6632" d="M416.921,159.56c-1.262-2.938-31.918-72.368-31.918-72.368s-0.596-1.541-1.539-1.541
+			c-1.102,0-3.633,0-4.736,0c-0.986,0-1.537,1.541-1.537,1.541s-30.656,69.431-31.916,72.368c-1.26,2.94,0.559,3.08,0.559,3.08
+			c21.393,9.659,52.539,8.05,70.527,0C416.361,162.64,418.181,162.5,416.921,159.56z"/>
+		<path fill="#FFFFFF" d="M411.681,147.648c-1.877-4.262-4.121-9.351-6.498-14.737c-8.525,1.943-17.754,3.049-25.113,3.083
+			c-9.73,0.045-17.951-1.14-23.182-2.807c-2.328,5.281-4.525,10.261-6.369,14.448c4.449,1.318,14.762,5.039,29.656,4.958
+			C389.119,152.546,399.712,150.322,411.681,147.648z"/>
+		<path fill="#FFFFFF" d="M370.078,103.299c-1.805,4.092-3.832,8.684-5.93,13.435c4.5,0.713,9.871,1.244,16.027,1.216
+			c5.314-0.023,11.213-0.714,17.633-1.749c-2.068-4.692-4.064-9.216-5.842-13.238c-4.213,0.435-8.281,0.673-11.896,0.689
+			C376.513,103.665,373.162,103.536,370.078,103.299z"/>
+	</g>
+</g>
+<g>
+	<g>
+		<path fill="#FFFFFF" d="M248.083,59.489c-0.941,0.197-2.481,0.197-3.423,0l-19.341-4.045c-0.941-0.197-0.945-0.536-0.008-0.752
+			l19.356-4.478c0.937-0.216,2.47-0.216,3.407,0l19.357,4.478c0.937,0.216,0.934,0.555-0.008,0.752L248.083,59.489z"/>
+	</g>
+	<polygon fill="#D25031" points="262.183,14.063 246.941,16.29 246.941,2.127 262.183,4.353 258.206,9.033 	"/>
+	<path fill="#FFFFFF" d="M247.675,1.161c-0.003-0.644-0.527-1.163-1.17-1.161c-0.645,0.002-1.164,0.526-1.162,1.17
+		c0.002,0.326,0.312,0.619,0.528,0.831v28.366l1.282-0.006V2.001C247.369,1.788,247.676,1.487,247.675,1.161z"/>
+	<g>
+		<path fill="#CD6632" d="M261.462,53.327c-0.525-1.224-13.289-30.131-13.289-30.131s-0.248-0.641-0.641-0.641
+			c-0.459,0-1.513,0-1.973,0c-0.41,0-0.64,0.641-0.64,0.641s-12.764,28.907-13.288,30.131c-0.524,1.225,0.232,1.282,0.232,1.282
+			c8.907,4.021,21.875,3.351,29.364,0C261.229,54.609,261.987,54.552,261.462,53.327z"/>
+		<path fill="#FFFFFF" d="M259.281,48.368c-0.781-1.775-1.716-3.894-2.705-6.136c-3.55,0.808-7.393,1.269-10.456,1.283
+			c-4.052,0.019-7.476-0.476-9.651-1.169c-0.971,2.198-1.885,4.272-2.652,6.016c1.852,0.55,6.146,2.099,12.347,2.064
+			C249.886,50.407,254.297,49.481,259.281,48.368z"/>
+		<path fill="#FFFFFF" d="M241.959,29.903c-0.752,1.703-1.597,3.615-2.47,5.594c1.874,0.296,4.11,0.517,6.673,0.505
+			c2.213-0.01,4.669-0.297,7.343-0.728c-0.862-1.954-1.693-3.837-2.433-5.512c-1.755,0.181-3.448,0.28-4.953,0.287
+			C244.638,30.055,243.243,30.002,241.959,29.903z"/>
+	</g>
+</g>
+<g opacity="0.6">
+	<path fill="#FFFFFF" d="M135.408,57.719c2.591,0.164,4.419,2.344,4.36,4.94c-0.06,2.599-1.98,4.538-4.571,4.374
+		c-2.59-0.164-4.418-2.342-4.359-4.94C130.896,59.496,132.818,57.555,135.408,57.719z M131.922,42.896l-0.123-7.646l8.543,0.978
+		l-0.979,7.121l-1.41,11.379l-5.209-0.316L131.922,42.896z"/>
+</g>
+<g>
+	<path opacity="0.6" fill="#FFFFFF" d="M395.474,56.781c1.379,0.088,2.352,1.247,2.32,2.628c-0.031,1.382-1.055,2.413-2.432,2.325
+		c-1.377-0.087-2.348-1.245-2.318-2.627C393.076,57.728,394.097,56.694,395.474,56.781z M393.621,48.899l-0.064-4.065l4.287,0.394
+		l-0.266,3.913l-0.748,6.051l-2.77-0.168L393.621,48.899z"/>
+</g>
+<g>
+	<path opacity="0.6" fill="#FFFFFF" d="M252.903,10.373c0.533,0.034,0.909,0.482,0.897,1.017c-0.012,0.535-0.408,0.934-0.941,0.9
+		c-0.532-0.034-0.908-0.482-0.896-1.017S252.371,10.339,252.903,10.373z M252.185,7.322l-0.025-1.573l1.646,0.307l-0.09,1.36
+		l-0.289,2.342l-1.072-0.065L252.185,7.322z"/>
+</g>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/maintenance-hills-left-shade.svg b/bridgedb/https/templates/assets/images/maintenance-hills-left-shade.svg
new file mode 100644
index 0000000..696f772
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/maintenance-hills-left-shade.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="287.992px" height="34px" viewBox="0 0 287.992 34" enable-background="new 0 0 287.992 34" xml:space="preserve">
+<polygon opacity="0.1" fill="#49623D" points="41.02,0 287.992,0 272.992,14 57.992,14 47.992,23 168.992,23 160.992,34 0,34 "/>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/maintenance-hills-left.svg b/bridgedb/https/templates/assets/images/maintenance-hills-left.svg
new file mode 100644
index 0000000..8b7d9d2
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/maintenance-hills-left.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="424.45px" height="127.792px" viewBox="0 0 424.45 127.792" enable-background="new 0 0 424.45 127.792"
+	 xml:space="preserve">
+<g>
+	
+		<image overflow="visible" opacity="0.1" width="887" height="370" xlink:href="6887344C08643948.png"  transform="matrix(0.24 0 0 0.24 211.5703 38.9922)">
+	</image>
+	<g>
+		<polygon fill="#8DAE7D" points="415.362,118.76 329.481,47.992 284.517,47.992 260.536,77.97 246.548,77.97 220.57,118.76 		"/>
+	</g>
+</g>
+<g>
+	
+		<image overflow="visible" opacity="0.1" width="1173" height="522" xlink:href="6887344C08643949.png"  transform="matrix(0.24 0 0 0.24 0 0)">
+	</image>
+	<g>
+		<polygon fill="#8DAE7D" points="6.48,118.76 46.645,41.12 73.956,41.12 96.598,6.48 165.878,6.48 211.521,64.12 245.136,64.12 
+			275.012,118.76 		"/>
+	</g>
+</g>
+<polygon fill="#8DAE7D" points="415.362,118.76 329.481,47.992 284.517,47.992 260.536,77.97 246.548,77.97 220.57,118.76 "/>
+<polygon opacity="0.15" fill="#49623D" points="314.24,62.971 282.851,62.971 238.867,117.112 258.644,117.112 291.235,77.354 "/>
+<g>
+	<polygon fill="#B6C8A9" points="329.481,47.992 284.962,47.992 283.845,48.833 279.903,53.76 327.304,53.76 405.134,118.76 
+		415.362,118.76 	"/>
+</g>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="328.7197" y1="115.2598" x2="328.7197" y2="118.7598">
+	<stop  offset="0" style="stop-color:#345338;stop-opacity:0"/>
+	<stop  offset="1" style="stop-color:#345338;stop-opacity:0.1"/>
+</linearGradient>
+<polygon fill="url(#SVGID_1_)" points="242.077,118.76 415.362,118.76 411.115,115.26 242.077,115.26 "/>
+<g>
+	<polygon fill="#8DAE7D" points="415.362,118.76 275.012,118.76 245.136,64.12 211.521,64.12 165.878,6.48 96.598,6.48 
+		73.956,41.12 46.645,41.12 6.48,118.76 6.479,123.765 415.362,123.765 	"/>
+</g>
+<polygon opacity="0.15" fill="#49623D" points="90.996,30.779 80.207,49.96 53.822,49.96 17.847,117.112 94.667,117.112 
+	122.253,64.343 92.185,64.343 108.973,30.776 "/>
+<polygon fill="#B6C8A9" points="158.128,17.594 204.881,76.345 237.249,76.345 259.896,118.76 274.888,118.76 245.136,64.12 
+	211.521,64.12 165.878,6.48 96.598,6.48 89.333,17.594 "/>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/maintenance-hills-right-shade.svg b/bridgedb/https/templates/assets/images/maintenance-hills-right-shade.svg
new file mode 100644
index 0000000..00c1757
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/maintenance-hills-right-shade.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="211.627px" height="24.984px" viewBox="0 0 211.627 24.984" enable-background="new 0 0 211.627 24.984"
+	 xml:space="preserve">
+<polygon opacity="0.1" fill="#49623D" points="181.484,0 0,0 11.022,10.288 169.012,10.288 176.36,16.901 87.445,16.901 
+	93.324,24.984 211.627,24.984 "/>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/maintenance-hills-right.svg b/bridgedb/https/templates/assets/images/maintenance-hills-right.svg
new file mode 100644
index 0000000..6225deb
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/maintenance-hills-right.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="213.12px" height="69.84px" viewBox="0 0 213.12 69.84" enable-background="new 0 0 213.12 69.84" xml:space="preserve">
+<g>
+	
+		<image overflow="visible" opacity="0.1" width="888" height="291" xlink:href="7F0562F1CC30193A.png"  transform="matrix(0.24 0 0 0.24 0 0)">
+	</image>
+	<g>
+		<polygon fill="#8DAE7D" points="204.111,60.781 178.13,38.978 164.142,38.978 140.162,9 95.196,9 9,60.781 		"/>
+	</g>
+</g>
+<g>
+	<polygon fill="#8DAE7D" points="204.111,60.781 178.13,38.977 164.142,38.977 140.162,9 95.196,9 9,60.781 9,65.786 
+		204.111,65.786 	"/>
+</g>
+<polygon fill="#B6C8A9" points="136.783,14.769 160.16,44.739 176.343,44.739 194.925,60.781 204.07,60.781 178.13,38.977 
+	164.142,38.977 140.162,9 95.196,9 85.447,14.769 "/>
+<polygon opacity="0.15" fill="#49623D" points="46.688,59.724 23.492,59.724 81.034,23.161 104.23,23.161 "/>
+</svg>
diff --git a/bridgedb/https/templates/assets/images/maintenance-tractor.svg b/bridgedb/https/templates/assets/images/maintenance-tractor.svg
new file mode 100644
index 0000000..6846f47
--- /dev/null
+++ b/bridgedb/https/templates/assets/images/maintenance-tractor.svg
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="466.269px" height="318.696px" viewBox="0 0 466.269 318.696" enable-background="new 0 0 466.269 318.696"
+	 xml:space="preserve">
+<g>
+	<polygon fill="#B6C8A9" points="452.322,251.25 421.783,109.235 124.896,109.235 0,219.235 0,271.848 78.523,317.695 
+		345.258,317.695 	"/>
+	<g opacity="0.1">
+		<path fill="#414042" d="M455.162,203.627c-1.621-4.677-6.867-7.486-11.659-6.243l-118.478,30.744
+			c-4.792,1.243-7.386,6.088-5.765,10.765l2.957,8.534c1.621,4.677,6.867,7.486,11.659,6.243l118.478-30.744
+			c4.792-1.243,7.386-6.088,5.765-10.765L455.162,203.627z"/>
+		<path fill="#414042" d="M250.36,233.819c-4.297,2.457-11.807,3.799-16.689,2.982l-88.066-14.738
+			c-4.882-0.816-9.545,2.509-10.362,7.392l-0.873,5.213c-0.817,4.883,2.474,9.726,7.314,10.764l1.241,0.266
+			c4.84,1.038,4.75,1.887-0.2,1.887h-18.504c-4.95,0-9,1.95-9,4.333s-4.05,4.333-9,4.333h-24c-4.95,0-9,3.45-9,7.667
+			s4.05,7.667,9,7.667h92c4.95,0,9-2.7,9-6s4.05-6,9-6h6.481c4.95,0,12.96,0.849,17.8,1.887l11.938,2.559
+			c4.84,1.038,11.505,3.271,14.812,4.963s9.107,0.464,12.89-2.728l16.161-13.637c3.782-3.192,5.507-9.615,3.832-14.273l-2.704-7.52
+			c-1.676-4.658-6.562-6.458-10.858-4.001L250.36,233.819z"/>
+	</g>
+	<g>
+		<polygon fill="#162628" points="423.094,135.842 409.504,120.741 254.732,120.741 254.732,224.174 380.815,224.174 		"/>
+		<rect x="362.695" y="14.288" fill="#24747F" width="57.38" height="110.606"/>
+		<polygon fill="#12353A" points="369.396,137.398 301.164,143.681 301.164,17.402 369.396,11.734 		"/>
+		<path fill="#1A575F" d="M425.588,138.957c-0.01,0.66-0.559,1.192-1.219,1.182l-9.083-0.138c-0.66-0.011-1.192-0.559-1.182-1.219
+			l0.059-3.897c0.011-0.66,0.559-1.192,1.219-1.182l9.085,0.139c0.66,0.011,1.191,0.559,1.182,1.219L425.588,138.957z"/>
+		<path fill="#1A575F" d="M412.963,139.052c0.094,0.654-0.365,1.266-1.019,1.359l-8.992,1.291c-0.653,0.094-1.265-0.363-1.358-1.018
+			l-0.553-3.858c-0.094-0.653,0.365-1.265,1.019-1.358l8.991-1.29c0.654-0.093,1.266,0.364,1.358,1.019L412.963,139.052z"/>
+		<path fill="#1A575F" d="M400.553,140.903c0.094,0.654-0.365,1.266-1.019,1.359l-8.99,1.291c-0.653,0.094-1.265-0.363-1.358-1.018
+			l-0.554-3.857c-0.094-0.654,0.364-1.266,1.019-1.359l8.99-1.289c0.654-0.094,1.266,0.363,1.358,1.018L400.553,140.903z"/>
+		<path fill="#1A575F" d="M388.292,142.98c0.096,0.671-0.374,1.299-1.045,1.396l-9.235,1.326c-0.671,0.097-1.299-0.373-1.395-1.045
+			l-0.568-3.961c-0.096-0.672,0.374-1.3,1.045-1.396l9.235-1.326c0.671-0.096,1.299,0.374,1.395,1.045L388.292,142.98z"/>
+		<path fill="#1A575F" d="M375.817,144.643c0.099,0.685-0.381,1.324-1.065,1.423l-9.418,1.353c-0.685,0.099-1.324-0.381-1.423-1.065
+			l-0.578-4.041c-0.099-0.685,0.381-1.324,1.065-1.423l9.417-1.351c0.685-0.099,1.324,0.381,1.423,1.065L375.817,144.643z"/>
+		<path fill="#1A575F" d="M362.816,146.554c0.101,0.7-0.39,1.354-1.09,1.455l-9.631,1.384c-0.7,0.101-1.354-0.39-1.455-1.09
+			l-0.592-4.132c-0.101-0.7,0.39-1.354,1.09-1.455l9.631-1.382c0.7-0.101,1.354,0.39,1.455,1.09L362.816,146.554z"/>
+		<path fill="#1A575F" d="M349.611,148.444c0.104,0.73-0.406,1.413-1.137,1.518l-10.043,1.442c-0.73,0.104-1.413-0.406-1.517-1.137
+			l-0.617-4.308c-0.104-0.73,0.407-1.413,1.138-1.518l10.041-1.44c0.73-0.104,1.413,0.406,1.518,1.137L349.611,148.444z"/>
+		<path fill="#1A575F" d="M335.301,150.389c0.104,0.73-0.406,1.413-1.137,1.518l-10.042,1.443c-0.73,0.104-1.413-0.406-1.517-1.137
+			l-0.617-4.308c-0.104-0.73,0.407-1.413,1.138-1.518l10.04-1.44c0.73-0.104,1.413,0.406,1.518,1.137L335.301,150.389z"/>
+		<path fill="#1A575F" d="M320.853,152.61c0.104,0.73-0.406,1.413-1.137,1.518l-10.041,1.444c-0.73,0.104-1.413-0.406-1.518-1.137
+			l-0.617-4.308c-0.104-0.73,0.406-1.413,1.137-1.518l10.042-1.44c0.73-0.104,1.413,0.406,1.518,1.137L320.853,152.61z"/>
+		<path fill="#1A575F" d="M307.059,154.788c0.38,0.632,0.175,1.46-0.457,1.84l-8.689,5.235c-0.632,0.38-1.459,0.175-1.84-0.457
+			l-2.244-3.729c-0.381-0.632-0.175-1.46,0.457-1.84l8.688-5.233c0.632-0.38,1.46-0.175,1.84,0.457L307.059,154.788z"/>
+		<path fill="#1A575F" d="M295.289,162.064c0.595,0.436,0.726,1.278,0.291,1.873l-5.987,8.191c-0.436,0.595-1.278,0.726-1.873,0.291
+			l-3.514-2.571c-0.595-0.435-0.726-1.278-0.291-1.873l5.988-8.188c0.435-0.595,1.278-0.727,1.873-0.291L295.289,162.064z"/>
+		<path fill="#1A575F" d="M287.06,173.59c0.685,0.273,1.021,1.058,0.748,1.742l-3.761,9.421c-0.273,0.685-1.058,1.021-1.742,0.748
+			l-4.041-1.616c-0.685-0.273-1.021-1.058-0.748-1.742l3.761-9.417c0.273-0.685,1.058-1.021,1.742-0.748L287.06,173.59z"/>
+		<path fill="#1A575F" d="M437.191,139.15l-11.076-4.819l-106.076,13.968c0,0-36.616,4.906-40.014,47.186
+			c-3.397,42.28,32.086,46.811,32.086,46.811L437.191,139.15z"/>
+		<path fill="#153B3F" d="M459.709,178.122c0-15.477-12.517-31.994-27.931-31.994c-2.401,0-3.918,0.142-6.934,0.546l-98.969,14.461
+			l0.004,0.05c-17.336,0.975-31.135,21.845-31.135,38.035c0,21.032,14.659,38.083,32.742,38.083c1.021,0,2.028-0.062,3.025-0.168
+			l0.016,0.254l2.718-0.686c0.869-0.179,1.728-0.392,2.571-0.647l100.989-25.469l-0.041-0.523
+			C449.81,207.335,459.709,194.077,459.709,178.122z"/>
+		<path fill="#183235" d="M431.779,146.128c-2.401,0-3.918,0.142-6.934,0.546l-98.969,14.461l0.004,0.05
+			c-0.38,0.021-0.756,0.063-1.132,0.104l-9.639,3.141c-3.488,1.941-6.672,4.642-9.437,7.801l147.957,26.069
+			c3.794-5.541,6.079-12.542,6.079-20.177C459.709,162.646,447.193,146.128,431.779,146.128z"/>
+		<path fill="none" stroke="#387986" stroke-width="3.3974" stroke-miterlimit="10" d="M459.709,178.122
+			c0-15.477-12.517-31.994-27.931-31.994c-2.401,0-3.918,0.142-6.934,0.546l-98.969,14.461l0.004,0.05
+			c-17.336,0.975-31.135,21.845-31.135,38.035c0,21.032,14.659,38.083,32.742,38.083c1.021,0,2.028-0.062,3.025-0.168l0.016,0.254
+			l2.718-0.686c0.869-0.179,1.728-0.392,2.571-0.647l100.989-25.469l-0.041-0.523C449.81,207.335,459.709,194.077,459.709,178.122z"
+			/>
+		<path fill="#C0D1D6" d="M355.24,83.699c0,4.485-3.67,8.154-8.154,8.154h-30.408c-4.484,0-8.153-3.669-8.153-8.154V34.048
+			c0-4.484,3.651-8.508,8.115-8.942l30.485-2.958c4.463-0.434,8.115,2.881,8.115,7.366V83.699z"/>
+		<path opacity="0.7" fill="#FFFFFF" d="M347.125,22.148l-30.485,2.958c-1.81,0.176-3.48,0.948-4.834,2.096l43.435,51.165V29.514
+			C355.24,25.029,351.587,21.714,347.125,22.148z"/>
+		<path fill="none" stroke="#1C3D43" stroke-width="3.3974" stroke-miterlimit="10" d="M355.24,83.699
+			c0,4.485-3.669,8.154-8.154,8.154h-30.407c-4.485,0-8.154-3.669-8.154-8.154V34.048c0-4.484,3.652-8.508,8.115-8.941l30.484-2.959
+			c4.464-0.433,8.116,2.882,8.116,7.366V83.699z"/>
+		<polygon fill="#24747F" points="420.072,132.438 362.315,138.105 362.315,12.779 420.072,17.314 		"/>
+		<path fill="#C0D1D6" d="M412.998,84.566c0,4.485-3.67,8.154-8.154,8.154h-28.429c-4.484,0-8.153-3.669-8.153-8.154v-54.48
+			c0-4.485,3.65-7.784,8.112-7.332l28.512,2.89c4.461,0.453,8.112,4.492,8.112,8.977V84.566z"/>
+		<path opacity="0.7" fill="#FFFFFF" d="M404.885,25.644l-28.512-2.89c-2.273-0.23-4.331,0.516-5.808,1.893l42.432,49.983V34.62
+			C412.998,30.136,409.346,26.096,404.885,25.644z"/>
+		<path fill="none" stroke="#1C3D43" stroke-width="3.3974" stroke-miterlimit="10" d="M412.998,84.566
+			c0,4.485-3.669,8.154-8.154,8.154h-28.428c-4.485,0-8.154-3.669-8.154-8.154V30.085c0-4.484,3.65-7.784,8.112-7.332l28.512,2.89
+			c4.462,0.452,8.112,4.492,8.112,8.976V84.566z"/>
+		<polygon fill="#24747F" points="419.508,87.05 432.249,106.585 432.249,121.024 438.194,121.024 438.194,130.65 369.441,137.398 
+			369.396,119.608 		"/>
+		<g>
+			
+				<image overflow="visible" opacity="0.1" width="336" height="128" xlink:href="DA577FBAEA2E3E61.png"  transform="matrix(0.24 0 0 0.24 351.7466 -0.8115)">
+			</image>
+			<g>
+				<polygon fill="#6FB4BF" points="425.359,22.978 358.542,15.042 358.542,5.983 425.359,13.918 				"/>
+			</g>
+		</g>
+		<g>
+			
+				<image overflow="visible" opacity="0.1" width="315" height="123" xlink:href="DA577FBAEA2E3E60.png"  transform="matrix(0.24 0 0 0.24 289.8433 -1.001)">
+			</image>
+			<g>
+				<polygon fill="#12353A" points="358.637,14.854 296.638,21.653 296.638,13.727 358.637,5.794 				"/>
+			</g>
+		</g>
+		<g>
+			
+				<image overflow="visible" opacity="0.1" width="629" height="408" xlink:href="DA577FBAEA2E3E6E.png"  transform="matrix(0.24 0 0 0.24 205.6558 65.6816)">
+			</image>
+			<g>
+				<polygon fill="#24747F" points="349.61,89.275 329.838,72.477 212.451,77.71 212.451,156.599 349.754,140.135 				"/>
+			</g>
+		</g>
+		<path fill="#387986" d="M460.57,170.961c-0.619,0.23-1.313-0.087-1.544-0.706l-3.173-8.511c-0.23-0.619,0.087-1.313,0.706-1.544
+			l3.651-1.361c0.619-0.23,1.313,0.087,1.544,0.706l3.173,8.513c0.23,0.619-0.087,1.313-0.706,1.544L460.57,170.961z"/>
+		<path fill="#387986" d="M461.197,183.599c-0.66,0.013-1.211-0.517-1.224-1.177l-0.182-9.081c-0.013-0.66,0.517-1.211,1.177-1.224
+			l3.896-0.078c0.66-0.013,1.211,0.517,1.224,1.177l0.182,9.083c0.013,0.66-0.517,1.211-1.177,1.224L461.197,183.599z"/>
+		<path fill="#387986" d="M457.85,195.681c-0.633-0.188-0.995-0.861-0.807-1.493l2.605-8.703c0.189-0.632,0.862-0.994,1.494-0.806
+			l3.734,1.118c0.632,0.188,0.994,0.861,0.805,1.493l-2.605,8.703c-0.188,0.632-0.861,0.994-1.494,0.806L457.85,195.681z"/>
+		<path fill="#387986" d="M449.876,205.417c-0.518-0.41-0.604-1.169-0.194-1.687l5.647-7.115c0.41-0.518,1.169-0.604,1.687-0.194
+			l3.053,2.423c0.518,0.41,0.604,1.169,0.194,1.687l-5.647,7.115c-0.41,0.518-1.169,0.604-1.687,0.194L449.876,205.417z"/>
+		<path fill="#387986" d="M438.726,212.112c-0.321-0.577-0.112-1.312,0.465-1.633l7.938-4.419c0.577-0.321,1.312-0.112,1.633,0.465
+			l1.896,3.406c0.321,0.577,0.112,1.312-0.465,1.633l-7.937,4.418c-0.577,0.321-1.312,0.112-1.633-0.465L438.726,212.112z"/>
+		<path fill="#387986" d="M456.279,159.44c-0.507,0.423-1.268,0.355-1.69-0.151l-5.825-6.97c-0.423-0.507-0.354-1.268,0.151-1.69
+			l2.991-2.498c0.507-0.423,1.268-0.355,1.69,0.151l5.825,6.971c0.423,0.507,0.354,1.268-0.151,1.69L456.279,159.44z"/>
+		<path fill="#387986" d="M448.237,149.599c-0.285,0.595-1.006,0.849-1.601,0.562l-8.19-3.928c-0.595-0.285-0.849-1.006-0.563-1.601
+			l1.686-3.515c0.285-0.595,1.006-0.849,1.601-0.562l8.19,3.928c0.595,0.286,0.849,1.007,0.563,1.602L448.237,149.599z"/>
+		<path fill="#387986" d="M437.112,144.246c-0.01,0.66-0.559,1.192-1.219,1.182l-9.082-0.138c-0.66-0.011-1.192-0.559-1.182-1.219
+			l0.059-3.896c0.01-0.66,0.558-1.192,1.218-1.182l9.085,0.139c0.66,0.011,1.191,0.559,1.182,1.219L437.112,144.246z"/>
+		<path fill="#387986" d="M424.488,144.341c0.093,0.654-0.364,1.266-1.019,1.359l-8.992,1.292c-0.654,0.094-1.265-0.364-1.358-1.018
+			l-0.553-3.858c-0.094-0.654,0.364-1.266,1.019-1.358l8.991-1.29c0.653-0.094,1.265,0.365,1.358,1.019L424.488,144.341z"/>
+		<path fill="#387986" d="M412.078,146.193c0.093,0.653-0.364,1.266-1.019,1.359l-8.991,1.291c-0.653,0.094-1.265-0.364-1.358-1.018
+			l-0.554-3.857c-0.094-0.653,0.364-1.266,1.019-1.359l8.991-1.29c0.653-0.094,1.265,0.363,1.358,1.018L412.078,146.193z"/>
+		<path fill="#387986" d="M399.816,148.271c0.096,0.671-0.374,1.299-1.045,1.396l-9.236,1.326c-0.671,0.097-1.299-0.373-1.395-1.044
+			l-0.568-3.963c-0.096-0.671,0.374-1.299,1.045-1.395l9.236-1.326c0.671-0.096,1.299,0.374,1.395,1.045L399.816,148.271z"/>
+		<path fill="#387986" d="M387.341,149.933c0.099,0.685-0.381,1.324-1.065,1.423l-9.418,1.352c-0.685,0.099-1.324-0.381-1.423-1.065
+			l-0.579-4.041c-0.099-0.685,0.381-1.324,1.065-1.423l9.418-1.35c0.685-0.099,1.324,0.381,1.423,1.065L387.341,149.933z"/>
+		<path fill="#387986" d="M374.34,151.844c0.101,0.7-0.39,1.354-1.09,1.455l-9.632,1.383c-0.7,0.101-1.354-0.39-1.455-1.09
+			l-0.591-4.131c-0.101-0.7,0.39-1.354,1.09-1.455l9.63-1.383c0.7-0.101,1.354,0.39,1.455,1.09L374.34,151.844z"/>
+		<path fill="#387986" d="M361.135,153.734c0.104,0.73-0.406,1.413-1.137,1.518l-10.043,1.441c-0.73,0.104-1.413-0.406-1.518-1.137
+			l-0.616-4.308c-0.104-0.73,0.406-1.413,1.137-1.518l10.041-1.44c0.73-0.104,1.413,0.406,1.518,1.137L361.135,153.734z"/>
+		<path fill="#387986" d="M346.826,155.679c0.104,0.73-0.406,1.413-1.137,1.518l-10.042,1.442c-0.73,0.104-1.413-0.406-1.518-1.137
+			l-0.616-4.308c-0.104-0.73,0.406-1.413,1.137-1.518l10.04-1.44c0.73-0.104,1.413,0.406,1.518,1.137L346.826,155.679z"/>
+		<path fill="#387986" d="M332.377,157.9c0.104,0.73-0.406,1.413-1.137,1.518l-10.042,1.444c-0.73,0.104-1.413-0.406-1.518-1.137
+			l-0.617-4.308c-0.104-0.73,0.406-1.413,1.137-1.518l10.042-1.44c0.73-0.104,1.413,0.406,1.518,1.137L332.377,157.9z"/>
+		<path fill="#387986" d="M438.098,216.6c0.162,0.64-0.229,1.296-0.868,1.458l-8.808,2.233c-0.64,0.162-1.296-0.229-1.458-0.868
+			l-0.957-3.778c-0.162-0.64,0.229-1.296,0.868-1.458l8.805-2.233c0.64-0.162,1.296,0.229,1.458,0.868L438.098,216.6z"/>
+		<path fill="#387986" d="M425.675,219.752c0.162,0.64-0.229,1.296-0.868,1.458L416,223.444c-0.64,0.162-1.296-0.229-1.458-0.869
+			l-0.956-3.777c-0.162-0.64,0.229-1.296,0.868-1.458l8.805-2.232c0.64-0.162,1.296,0.229,1.458,0.868L425.675,219.752z"/>
+		<path fill="#387986" d="M413.562,222.972c0.166,0.656-0.235,1.331-0.892,1.498l-9.044,2.296c-0.656,0.167-1.331-0.234-1.497-0.892
+			l-0.983-3.879c-0.167-0.657,0.235-1.332,0.892-1.498l9.043-2.294c0.656-0.166,1.331,0.235,1.497,0.892L413.562,222.972z"/>
+		<path fill="#387986" d="M401.055,226.082c0.17,0.671-0.238,1.357-0.909,1.528l-9.225,2.34c-0.671,0.171-1.357-0.239-1.527-0.909
+			l-1.001-3.956c-0.17-0.67,0.239-1.357,0.91-1.527l9.221-2.34c0.671-0.17,1.357,0.239,1.528,0.91L401.055,226.082z"/>
+		<path fill="#387986" d="M388.33,229.356c0.174,0.686-0.244,1.389-0.93,1.562l-9.434,2.393c-0.686,0.174-1.388-0.244-1.562-0.93
+			l-1.023-4.045c-0.174-0.686,0.245-1.389,0.931-1.562l9.429-2.392c0.686-0.174,1.389,0.244,1.562,0.93L388.33,229.356z"/>
+		<path fill="#387986" d="M375.398,232.633c0.181,0.714-0.256,1.447-0.97,1.629l-9.834,2.495c-0.714,0.182-1.447-0.255-1.629-0.969
+			l-1.07-4.221c-0.181-0.714,0.256-1.447,0.971-1.628l9.834-2.494c0.714-0.181,1.447,0.256,1.628,0.97L375.398,232.633z"/>
+		<path fill="#387986" d="M361.374,236.079c0.181,0.714-0.256,1.447-0.97,1.629l-9.834,2.495c-0.714,0.182-1.447-0.255-1.628-0.97
+			l-1.07-4.22c-0.181-0.715,0.256-1.448,0.971-1.629l9.832-2.494c0.715-0.181,1.448,0.256,1.629,0.97L361.374,236.079z"/>
+		<path fill="#387986" d="M347.242,239.815c0.181,0.714-0.256,1.447-0.97,1.629l-9.835,2.494c-0.714,0.182-1.447-0.255-1.628-0.97
+			l-1.068-4.218c-0.181-0.715,0.256-1.448,0.97-1.629l9.833-2.494c0.714-0.182,1.447,0.255,1.628,0.969L347.242,239.815z"/>
+		<path fill="#387986" d="M318.583,160.078c0.38,0.632,0.175,1.46-0.457,1.84l-8.689,5.234c-0.632,0.38-1.459,0.175-1.84-0.457
+			l-2.243-3.729c-0.381-0.632-0.175-1.46,0.457-1.84l8.688-5.232c0.632-0.38,1.46-0.175,1.84,0.457L318.583,160.078z"/>
+		<path fill="#387986" d="M306.812,167.354c0.595,0.436,0.727,1.278,0.291,1.873l-5.987,8.192c-0.436,0.595-1.277,0.726-1.873,0.291
+			l-3.514-2.572c-0.596-0.435-0.726-1.278-0.291-1.873l5.988-8.188c0.435-0.595,1.278-0.727,1.873-0.291L306.812,167.354z"/>
+		<path fill="#387986" d="M306.331,231.972c0.366-0.64,1.189-0.863,1.829-0.497l8.806,5.04c0.64,0.366,0.863,1.189,0.497,1.829
+			l-2.164,3.778c-0.366,0.64-1.189,0.863-1.829,0.497l-8.804-5.04c-0.64-0.366-0.863-1.189-0.497-1.829L306.331,231.972z"/>
+		<path fill="#387986" d="M319.117,238.369c0.078-0.733,0.742-1.269,1.476-1.19l10.09,1.076c0.733,0.078,1.269,0.742,1.19,1.476
+			l-0.464,4.328c-0.078,0.733-0.742,1.269-1.476,1.19l-10.087-1.077c-0.733-0.078-1.269-0.742-1.19-1.476L319.117,238.369z"/>
+		<path fill="#387986" d="M298.583,178.88c0.685,0.273,1.021,1.058,0.748,1.742l-3.761,9.421c-0.273,0.685-1.058,1.021-1.742,0.748
+			l-4.041-1.616c-0.685-0.273-1.021-1.058-0.748-1.742l3.762-9.417c0.273-0.685,1.058-1.021,1.742-0.748L298.583,178.88z"/>
+		<path fill="#387986" d="M293.6,192.311c0.736,0.033,1.311,0.664,1.277,1.4l-0.47,10.133c-0.033,0.736-0.664,1.311-1.4,1.276
+			l-4.35-0.201c-0.736-0.034-1.311-0.665-1.276-1.401l0.471-10.132c0.034-0.736,0.665-1.311,1.401-1.277L293.6,192.311z"/>
+		<path fill="#387986" d="M293.418,206.434c0.705-0.216,1.459,0.185,1.675,0.89l2.967,9.698c0.216,0.705-0.185,1.459-0.889,1.675
+			l-4.162,1.273c-0.704,0.216-1.458-0.185-1.674-0.889l-2.969-9.7c-0.216-0.704,0.185-1.458,0.89-1.674L293.418,206.434z"/>
+		<path fill="#387986" d="M297.704,220.038c0.604-0.423,1.444-0.275,1.867,0.328l5.823,8.305c0.423,0.604,0.275,1.444-0.328,1.867
+			l-3.563,2.499c-0.604,0.423-1.444,0.275-1.867-0.328l-5.824-8.305c-0.423-0.604-0.275-1.444,0.328-1.867L297.704,220.038z"/>
+		<g>
+			
+				<image overflow="visible" opacity="0.1" width="549" height="180" xlink:href="DA577FBAEA2E3E78.png"  transform="matrix(0.24 0 0 0.24 275.4946 164.9082)">
+			</image>
+			<g>
+				<polygon fill="#6FB4BF" points="282.29,201.157 400.256,190.955 400.256,171.703 282.29,181.905 				"/>
+			</g>
+		</g>
+		<polygon fill="#6FB4BF" points="214.776,77.606 232.977,98.345 349.61,89.275 329.838,72.477 		"/>
+		<g>
+			
+				<image overflow="visible" opacity="0.1" width="233" height="251" xlink:href="DA577FBAEA2E3E79.png"  transform="matrix(0.24 0 0 0.24 185.1792 70.9141)">
+			</image>
+			<g>
+				<polygon fill="#12353A" points="234.11,98.345 220.2,77.709 207.049,77.709 192.118,98.345 191.974,124.269 234.255,124.269 
+									"/>
+			</g>
+		</g>
+		<g opacity="0.2">
+			
+				<image overflow="visible" opacity="0.1" width="233" height="251" xlink:href="DA577FBAEA2E3E7A.png"  transform="matrix(0.24 0 0 0.24 185.1792 70.9141)">
+			</image>
+			<g>
+				<polygon fill="#24747F" points="234.11,98.345 220.2,77.709 207.049,77.709 192.118,98.345 191.974,124.269 234.255,124.269 
+									"/>
+			</g>
+		</g>
+		<g>
+			
+				<image overflow="visible" opacity="0.2" width="390" height="616" xlink:href="DA577FBAEA2E3E7B.png"  transform="matrix(0.24 0 0 0.24 198.3687 118.166)">
+			</image>
+			<g>
+				<polygon fill="#6FB4BF" points="256.196,124.961 284.944,150.575 284.944,235.517 248.885,259.103 205.164,248.447 				"/>
+			</g>
+		</g>
+		<polygon fill="#256870" points="136.366,138.442 136.366,213.418 273.61,235.517 273.61,150.575 		"/>
+		<polygon fill="#24747F" points="115.01,231.371 248.888,260.236 273.61,235.517 136.366,213.418 		"/>
+		<polygon opacity="0.6" fill="#6FB4BF" points="115.01,231.371 248.888,260.236 273.61,235.517 136.366,213.418 		"/>
+		<polygon fill="#24747F" points="255.691,123.205 120.886,118.2 136.366,139.576 273.61,150.575 		"/>
+		<g>
+			
+				<image overflow="visible" opacity="0.1" width="177" height="188" xlink:href="DA577FBAEA2E3E7C.png"  transform="matrix(0.24 0 0 0.24 379.0737 158.8359)">
+			</image>
+			<g>
+				<polygon fill="#24747F" points="391.871,176.532 400.206,171.72 408.542,176.532 408.542,186.157 400.206,190.971 
+					391.871,186.157 				"/>
+				<polygon fill="none" stroke="#1E6C72" stroke-width="1.1325" stroke-miterlimit="10" points="391.871,176.532 400.206,171.72 
+					408.542,176.532 408.542,186.157 400.206,190.971 391.871,186.157 				"/>
+			</g>
+		</g>
+	</g>
+	<g>
+		
+			<image overflow="visible" opacity="0.1" width="698" height="391" xlink:href="DA577FBAEA2E3E7D.png"  transform="matrix(0.24 0 0 0.24 52.6411 165.6338)">
+		</image>
+		<g>
+			<polygon fill="#D0B5A1" points="212.777,217.852 192.737,196.271 181.865,196.271 163.227,172.973 128.281,172.973 
+				61.29,218.214 59.979,218.214 59.979,252.055 212.777,252.055 			"/>
+			<g>
+				<polygon fill="#E2D4C9" points="212.777,217.852 192.737,196.271 181.865,196.271 163.227,172.973 128.281,172.973 
+					120.819,177.635 158.564,177.635 177.202,200.933 188.074,200.933 208.114,222.516 208.114,252.055 212.777,252.055 				"/>
+			</g>
+		</g>
+	</g>
+	<g>
+		
+			<image overflow="visible" opacity="0.1" width="637" height="357" xlink:href="8EA57603D8AF04C2.png"  transform="matrix(0.24 0 0 0.24 33.603 184.1553)">
+		</image>
+		<g>
+			<polygon fill="#DEC8B6" points="40.941,252.648 50.597,232.264 68.483,232.264 80.285,191.494 110.325,191.494 119.98,203.285 
+				156.458,203.285 178.988,239.773 171.478,262.304 65.617,262.304 			"/>
+			<polygon fill="#EBE0D5" points="119.98,203.285 110.325,191.494 80.285,191.494 78.938,196.149 105.935,196.149 118.28,208.495 
+				152.054,208.495 171.619,240.405 164.32,262.304 171.478,262.304 178.988,239.773 156.458,203.285 			"/>
+		</g>
+	</g>
+	<polygon opacity="0.5" fill="#D0B5A1" points="85.717,203.991 76.217,239.737 59.467,239.737 53.967,249.987 67.967,255.237 
+		104.79,255.237 104.79,241.148 93.95,230.987 100.465,203.991 	"/>
+	<g opacity="0.25">
+		<path fill="none" d="M372.808,84.245c0.049-0.014,0.098-0.031,0.146-0.044c-1.018-1.453-1.854-3.109-2.441-4.944l-0.27-0.812
+			c-0.029-0.092-0.057-0.186-0.084-0.28c-0.02-0.066-0.041-0.133-0.059-0.2l-0.064-0.045v5.046
+			C370.975,83.395,372.339,84.027,372.808,84.245z"/>
+		<path fill="#FFFFFF" d="M385.226,64.212c3.107,0.007,6.201,0.213,9.283,0.531c3.375,0.348,7.17,0.621,9.006,0.02
+			c-0.131,0.148-0.297,0.257-0.465,0.354c-0.168,0.095-0.348,0.178-0.529,0.256c-0.363,0.146-0.738,0.263-1.119,0.356
+			c-0.055,0.014-0.111,0.026-0.17,0.039c1.834,0.339,2.9,0.616,3.016,0.646l0.217-0.035c0,0,0.279-1.2,0.363-1.816
+			c0.08-0.614,0.123-1.235,0.117-1.854c-0.004-0.311-0.016-0.619-0.041-0.927c-0.014-0.156-0.576-0.646-1.062-0.925
+			c-0.525-0.309-1.076-0.582-1.635-0.835c-0.559-0.266-1.131-0.504-1.705-0.735c-0.287-0.116-4.271-0.999-6.799-1.325
+			c-0.309-0.04-1.969-1.208-2.264-1.314c0.617,0.102,5.678,0.554,9.334,1.527c-2.768-7.234-8.197-10.562-15.424-10.562
+			c-7.137,0-12.517,3.445-15.312,10.5v0.233c0.983-0.205,8.822-1.402,9.412-1.501c-0.293,0.108-1.971,1.401-2.26,1.512
+			c-0.291,0.11-4.174,0.624-5.262,0.821c-0.535,0.098-1.243,0.24-1.891,0.391v5.543c1.793,0.011,3.917-0.163,5.904-0.368
+			C379.027,64.425,382.117,64.219,385.226,64.212z M380.585,53.992v-2.705v-1.187h9.703v1.187v2.705v1.186h-2.758v-1.135h-0.621
+			v4.064h0.939v1.187v1.748v1.188h-4.824v-1.188v-1.748v-1.187h0.934v-4.064h-0.619v1.135h-2.754V53.992z"/>
+		<path fill="#FFFFFF" d="M387.433,87.507c-0.314-0.328-0.596-0.636-0.814-0.882c-0.109,0.246-0.252,0.571-0.439,0.992h0.055
+			c0.15,0,0.314-0.018,0.473-0.025C386.947,87.571,387.187,87.54,387.433,87.507z"/>
+		<path fill="#FFFFFF" d="M398.941,78.376l-0.939,0.657c-0.061,0.042-0.139,0.063-0.215,0.055l-9.311-1.058l-0.139-0.017
+			l-0.541-0.06c-0.123-0.015-0.23-0.103-0.266-0.226l-1.459-4.799c-0.242-0.031-0.461-0.048-0.643-0.048
+			c-0.184,0-0.398,0.017-0.643,0.048l-1.414,4.661c-0.033,0.107-0.123,0.19-0.236,0.216l-0.678,0.15l-9.248,2.06
+			c-0.021,0.005-0.045,0.007-0.066,0.007c-0.064,0-0.129-0.02-0.186-0.058l-0.359-0.25l-1.08-0.757v-0.003l-0.438-0.306
+			c0.031,0.101,0.066,0.197,0.102,0.291v0.003c0.029,0.091,0.162,0.476,0.404,1.041c0.41,0.971,1.141,2.479,2.215,3.968
+			c1.82-0.536,3.396-1.035,3.898-1.195c1.025-1.58,2.486-3.148,3.521-3.202c0.18-0.008,0.367-0.013,0.549-0.013
+			c0.51,0,0.992,0.035,1.443,0.088c-0.381-0.346-0.459-0.752-0.516-0.933c0,0,1.322,1.035,3.01,0.818
+			c1.686-0.217,2.732-1.189,2.732-1.189s-0.006,0.709-0.74,1.258c1.412-0.428,1.996-0.573,2.398-0.573
+			c0.441,0,0.658,0.184,0.848,0.346c0.039,0.03,0.074,0.062,0.117,0.095c1.084,0.856,2.391,1.895,2.773,2.2
+			c0.441,0.051,1.848,0.21,2.73,0.291c0.508,0.048,0.971,0.085,1.42,0.085c0.145,0,0.281-0.005,0.41-0.012
+			c0.467-0.894,0.896-1.883,1.277-2.969c0.096-0.273,0.189-0.553,0.279-0.838c0.061-0.22,0.117-0.44,0.172-0.663l-0.32,0.225
+			L398.941,78.376z"/>
+		<path fill="#FFFFFF" d="M373.652,77.374l7.582-1.686l1.42-4.676c0.023-0.078,0.076-0.143,0.145-0.181
+			c0.021-0.015,0.045-0.027,0.072-0.032c0.043-0.013,0.801-0.229,1.678-0.336l1.391-0.84c0.416-0.253,0.818-0.544,1.199-0.852
+			c-0.547-0.008-1.1-0.016-1.664-0.016c-2.316,0-4.48,0.096-6.441,0.243c-1.967,0.963-3.17,1.755-3.197,1.774l-1.889,1.261
+			l1.297-1.862c0.215-0.311,0.441-0.604,0.674-0.882c-2.178,0.243-3.992,0.531-5.348,0.782l0.693,5.628L373.652,77.374z
+			 M376.439,74.338c-0.094-0.208-0.154-0.499-0.17-0.899c-0.059-1.539,0.891-2.803,1.873-2.812c0.98-0.01,1.666,1.237,1.68,2.779
+			c0.016,1.541-0.801,1.446-1.781,1.455c-0.102,0.006-0.195,0.007-0.289,0.007c-0.109,0.001-0.215,0.004-0.316,0.001
+			c-0.953-0.001-1.561-0.045-2.102,0.247C375.345,75.082,375.583,74.554,376.439,74.338z"/>
+		<path fill="#FFFFFF" d="M387.847,87.928c-0.365,0.072-0.736,0.128-1.117,0.16c-0.158,0.008-0.311,0.021-0.477,0.021l-0.248,0.002
+			l-0.094-0.002c-1.006,1.496-3.236,1.786-3.338,1.799c-0.094,0.01-0.166,0.022-0.271,0.043c1.244,0.341,2.512,0.488,3.764,0.403
+			c1.256-0.084,2.885-0.356,4.615-1.057c-1.029-0.076-1.965-0.505-2.721-1.252C387.921,88.005,387.886,87.968,387.847,87.928z"/>
+		<path fill="#FFFFFF" d="M392.359,72.226c0.277-0.005,0.498-0.233,0.492-0.509c-0.004-0.279-0.232-0.5-0.508-0.494
+			c-0.279,0.006-0.5,0.233-0.494,0.511C391.853,72.01,392.082,72.23,392.359,72.226z"/>
+		<rect x="386.91" y="58.107" fill="#FFFFFF" width="0.939" height="1.187"/>
+		<rect x="380.585" y="50.101" fill="#FFFFFF" width="9.703" height="1.187"/>
+		<rect x="383.025" y="58.107" fill="#FFFFFF" width="0.934" height="1.187"/>
+		<path fill="#FFFFFF" d="M378.308,72.598c0.275-0.006,0.494-0.237,0.488-0.515c-0.01-0.277-0.242-0.496-0.516-0.486
+			c-0.279,0.005-0.496,0.238-0.488,0.513C377.798,72.387,378.029,72.605,378.308,72.598z"/>
+		<path fill="#FFFFFF" d="M386.191,70.419l-0.182,0.013c0.994,0.085,1.932,0.353,1.979,0.368c0.102,0.03,0.182,0.108,0.213,0.213
+			l1.416,4.653l7.574,0.862l2.408-1.688l0.682-4.788c-1.926-0.351-4.748-0.774-8.201-1.04
+			C388.96,70.088,386.347,70.408,386.191,70.419z M394.431,72.974c0.033,0.425-0.014,0.732-0.117,0.962
+			c0.912-0.108,1.117,0.512,1.129,0.548c-0.662-0.319-1.385,0.085-2.705,0.11c-0.979,0.035-1.803,0.046-1.857-1.494
+			c-0.055-1.543,0.574-2.818,1.557-2.853C393.416,70.213,394.312,71.437,394.431,72.974z"/>
+		<path fill="#A2B7BE" d="M390.88,73.1c0.055,1.54,0.879,1.529,1.857,1.494c1.32-0.025,2.043-0.43,2.705-0.11
+			c-0.012-0.036-0.217-0.656-1.129-0.548c0.104-0.229,0.15-0.537,0.117-0.962c-0.119-1.537-1.016-2.761-1.994-2.727
+			C391.455,70.281,390.826,71.557,390.88,73.1z M392.343,71.223c0.275-0.006,0.504,0.215,0.508,0.494
+			c0.006,0.275-0.215,0.504-0.492,0.509s-0.506-0.216-0.51-0.492C391.843,71.456,392.064,71.229,392.343,71.223z"/>
+		<path fill="#A2B7BE" d="M377.435,74.869c0.102,0.003,0.207,0,0.316-0.001c0.094,0,0.188-0.001,0.289-0.007
+			c0.98-0.009,1.797,0.086,1.781-1.455c-0.014-1.542-0.699-2.789-1.68-2.779c-0.982,0.009-1.932,1.272-1.873,2.812
+			c0.016,0.4,0.076,0.691,0.17,0.899c-0.855,0.216-1.094,0.744-1.105,0.778C375.875,74.824,376.482,74.868,377.435,74.869z
+			 M378.281,71.597c0.273-0.01,0.506,0.209,0.516,0.486c0.006,0.277-0.213,0.509-0.488,0.515c-0.279,0.008-0.51-0.211-0.516-0.488
+			C377.785,71.835,378.001,71.602,378.281,71.597z"/>
+		<polygon fill="#A2B7BE" points="383.339,54.043 383.958,54.043 383.958,52.856 383.339,52.856 383.339,53.992 380.585,53.992 
+			380.585,55.178 383.339,55.178 		"/>
+		<polygon fill="#A2B7BE" points="387.531,52.856 386.91,52.856 386.91,54.043 387.531,54.043 387.531,55.178 390.289,55.178 
+			390.289,53.992 387.531,53.992 		"/>
+		<rect x="383.025" y="61.042" fill="#A2B7BE" width="4.824" height="1.188"/>
+		<polygon fill="#A2B7BE" points="383.339,52.856 383.958,52.856 383.958,54.043 383.958,58.107 383.958,59.294 383.025,59.294 
+			383.025,61.042 387.849,61.042 387.849,59.294 386.91,59.294 386.91,58.107 386.91,54.043 386.91,52.856 387.531,52.856 
+			387.531,53.992 390.289,53.992 390.289,51.287 380.585,51.287 380.585,53.992 383.339,53.992 		"/>
+		<path fill="#A2B7BE" d="M406.431,62.681c-0.014-0.333-0.049-0.664-0.096-0.995c-0.021-0.165-0.047-0.331-0.082-0.496
+			c-0.031-0.168-0.064-0.324-0.117-0.506l-0.035-0.131l-0.092-0.072c-0.523-0.411-1.09-0.722-1.664-0.998
+			c-0.475-0.224-0.957-0.418-1.443-0.598c-1.359-3.77-3.693-7.11-6.762-9.439c-3.174-2.407-6.906-3.681-10.791-3.681
+			c-3.887,0-7.617,1.273-10.791,3.681c-1.768,1.342-3.288,3.024-4.521,4.928v1.513c2.243-3.688,7.053-9.286,15.6-9.286
+			c0,0,11.656-0.199,16.201,12.149c0,0,3.26,1.581,3.557,2.271c0.293,0.691,0.592,1.187,0.293,3.458
+			c-0.293,2.271-0.492,4.05-3.357,4.248l-0.395,5.036l-1.283,2.47c0,0-1.975,13.829-14.225,14.226
+			c-12.332,0.396-15.902-12.941-15.902-12.941l-0.488-2.302v2.704l0.064,0.045c0.018,0.067,0.039,0.134,0.059,0.2
+			c0.027,0.095,0.055,0.188,0.084,0.28l0.27,0.812c0.588,1.835,1.424,3.491,2.441,4.944c-0.049,0.013-0.098,0.03-0.146,0.044
+			c-0.469-0.218-1.833-0.85-2.771-1.28v2.372c0.482,0.704,1.031,1.478,1.537,2.129c1.174,1.506,2.779,3.047,5.811,3.047
+			c0.367,0,0.746-0.023,1.139-0.067c0.906-0.103,1.584-0.185,2.102-0.251c3.182,1.168,6.689,1.24,10.02-0.02
+			c0.91-0.346,1.74-0.768,2.502-1.238c0.018-0.001,0.033-0.005,0.047-0.01c1.238-0.299,2.643-0.632,3.336-0.827
+			c0.113-0.03,0.25-0.064,0.395-0.098c0.967-0.224,2.582-0.597,3.443-2.32c0.867-1.737,2.283-4.4,2.299-4.429l0.662-1.242
+			l-1.291,0.561c-0.068,0.03-1.703,0.742-2.551,1.188c-0.031,0.015-0.064,0.032-0.1,0.046c0.689-1.405,1.035-2.529,1.156-2.959
+			l0.469-1.921l1.342-3c0,0,0.373-3.278,0.381-3.275l0.133-1.253c0.117-0.051,0.834-0.1,0.975-0.155
+			c0.199-0.08,0.398-0.157,0.6-0.244l0.295-0.133c0.102-0.049,0.193-0.094,0.309-0.149l0.102-0.054l0.07-0.105
+			c0.035-0.056,0.055-0.089,0.08-0.131l0.062-0.115c0.045-0.08,0.084-0.158,0.119-0.235c0.074-0.158,0.141-0.316,0.205-0.474
+			c0.123-0.317,0.229-0.637,0.32-0.96c0.176-0.649,0.299-1.304,0.369-1.965C406.449,64.015,406.464,63.347,406.431,62.681z"/>
+		<path fill="#A2B7BE" d="M385.349,47.611c7.227,0,12.656,3.328,15.424,10.562c-3.656-0.974-8.717-1.426-9.334-1.527
+			c0.295,0.106,1.955,1.274,2.264,1.314c2.527,0.326,6.512,1.209,6.799,1.325c0.574,0.231,1.146,0.47,1.705,0.735
+			c0.559,0.253,1.109,0.526,1.635,0.835c0.486,0.279,1.049,0.769,1.062,0.925c0.025,0.308,0.037,0.616,0.041,0.927
+			c0.006,0.619-0.037,1.24-0.117,1.854c-0.084,0.616-0.363,1.816-0.363,1.816l-0.217,0.035c-0.115-0.03-1.182-0.308-3.016-0.646
+			c0.059-0.013,0.115-0.025,0.17-0.039c0.381-0.094,0.756-0.211,1.119-0.356c0.182-0.078,0.361-0.161,0.529-0.256
+			c0.168-0.097,0.334-0.205,0.465-0.354c-1.836,0.602-5.631,0.328-9.006-0.02c-3.082-0.318-6.176-0.524-9.283-0.531
+			c-3.109,0.007-6.199,0.213-9.285,0.531c-1.987,0.205-4.111,0.379-5.904,0.368v10.104l0.488,2.302c0,0,3.57,13.337,15.902,12.941
+			c12.25-0.396,14.225-14.226,14.225-14.226l1.283-2.47l0.395-5.036c2.865-0.198,3.064-1.978,3.357-4.248
+			c0.299-2.271,0-2.767-0.293-3.458c-0.297-0.69-3.557-2.271-3.557-2.271c-4.545-12.349-16.201-12.149-16.201-12.149
+			c-8.547,0-13.356,5.599-15.6,9.286v2.225C372.833,51.056,378.212,47.611,385.349,47.611z M375.917,69.291
+			c-0.232,0.278-0.459,0.571-0.674,0.882l-1.297,1.862l1.889-1.261c0.027-0.02,1.23-0.812,3.197-1.774
+			c1.961-0.147,4.125-0.243,6.441-0.243c0.564,0,1.117,0.008,1.664,0.016c-0.381,0.308-0.783,0.599-1.199,0.852l-1.391,0.84
+			c-0.877,0.107-1.635,0.323-1.678,0.336c-0.027,0.005-0.051,0.018-0.072,0.032c-0.068,0.038-0.121,0.103-0.145,0.181l-1.42,4.676
+			l-7.582,1.686l-2.389-1.673l-0.693-5.628C371.925,69.822,373.74,69.534,375.917,69.291z M386.066,90.354
+			c-1.252,0.085-2.52-0.062-3.764-0.403c0.105-0.021,0.178-0.033,0.271-0.043c0.102-0.013,2.332-0.303,3.338-1.799l0.094,0.002
+			l0.248-0.002c0.166,0,0.318-0.013,0.477-0.021c0.381-0.032,0.752-0.088,1.117-0.16c0.039,0.04,0.074,0.077,0.113,0.117
+			c0.756,0.747,1.691,1.176,2.721,1.252C388.951,89.997,387.322,90.27,386.066,90.354z M386.179,87.617
+			c0.188-0.421,0.33-0.746,0.439-0.992c0.219,0.246,0.5,0.554,0.814,0.882c-0.246,0.033-0.486,0.064-0.727,0.085
+			c-0.158,0.008-0.322,0.025-0.473,0.025H386.179z M399.955,78.21c-0.09,0.285-0.184,0.564-0.279,0.838
+			c-0.381,1.086-0.811,2.075-1.277,2.969c-0.129,0.007-0.266,0.012-0.41,0.012c-0.449,0-0.912-0.037-1.42-0.085
+			c-0.883-0.081-2.289-0.24-2.73-0.291c-0.383-0.306-1.689-1.344-2.773-2.2c-0.043-0.032-0.078-0.064-0.117-0.095
+			c-0.189-0.162-0.406-0.346-0.848-0.346c-0.402,0-0.986,0.146-2.398,0.573c0.734-0.549,0.74-1.258,0.74-1.258
+			s-1.047,0.973-2.732,1.189c-1.688,0.217-3.01-0.818-3.01-0.818c0.057,0.181,0.135,0.587,0.516,0.933
+			c-0.451-0.053-0.934-0.088-1.443-0.088c-0.182,0-0.369,0.005-0.549,0.013c-1.035,0.054-2.496,1.622-3.521,3.202
+			c-0.502,0.16-2.078,0.659-3.898,1.195c-1.074-1.488-1.805-2.997-2.215-3.968c-0.242-0.565-0.375-0.95-0.404-1.041v-0.003
+			c-0.035-0.094-0.07-0.19-0.102-0.291l0.438,0.306v0.003l1.08,0.757l0.359,0.25c0.057,0.038,0.121,0.058,0.186,0.058
+			c0.021,0,0.045-0.002,0.066-0.007l9.248-2.06l0.678-0.15c0.113-0.025,0.203-0.108,0.236-0.216l1.414-4.661
+			c0.244-0.031,0.459-0.048,0.643-0.048c0.182,0,0.4,0.017,0.643,0.048l1.459,4.799c0.035,0.123,0.143,0.211,0.266,0.226l0.541,0.06
+			l0.139,0.017l9.311,1.058c0.076,0.009,0.154-0.013,0.215-0.055l0.939-0.657l0.865-0.604l0.32-0.225
+			C400.072,77.77,400.015,77.99,399.955,78.21z M399.599,74.841l-2.408,1.688l-7.574-0.862l-1.416-4.653
+			c-0.031-0.104-0.111-0.183-0.213-0.213c-0.047-0.016-0.984-0.283-1.979-0.368l0.182-0.013c0.156-0.011,2.77-0.331,5.889-1.406
+			c3.453,0.266,6.275,0.689,8.201,1.04L399.599,74.841z"/>
+		<path fill="#A2B7BE" d="M377.189,58.355c0.289-0.11,1.967-1.403,2.26-1.512c-0.59,0.099-8.429,1.296-9.412,1.501v1.223
+			c0.647-0.151,1.355-0.293,1.891-0.391C373.015,58.979,376.898,58.466,377.189,58.355z"/>
+		<path fill="#FFFFFF" d="M369.929,58.368c0.016-0.005,0.065-0.015,0.107-0.023v-0.233C370.002,58.199,369.963,58.28,369.929,58.368
+			z"/>
+	</g>
+</g>
+</svg>
diff --git a/bridgedb/https/templates/base.html b/bridgedb/https/templates/base.html
index 8097c60..86bf85d 100644
--- a/bridgedb/https/templates/base.html
+++ b/bridgedb/https/templates/base.html
@@ -8,6 +8,7 @@
   <head>
     <meta charset="utf-8">
     <title>BridgeDB</title>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <meta name="description" content="Tor Bridges">
     <meta name="author" content="The Tor Project">
diff --git a/bridgedb/https/templates/error-404.html b/bridgedb/https/templates/error-404.html
new file mode 100644
index 0000000..1e46b1c
--- /dev/null
+++ b/bridgedb/https/templates/error-404.html
@@ -0,0 +1,39 @@
+## -*- coding: utf-8 -*-
+
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>BridgeDB - 404</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="description" content="Bridge IP database">
+    <meta name="author" content="The Tor Project">
+
+    <!-- Le styles -->
+    <link rel="stylesheet" href="/assets/css/main.css">
+    <!--[if IE 7]>
+        <link rel="stylesheet" href="/assets/css/font-awesome-ie7.min.css">
+        <![endif]-->
+    <link rel="stylesheet" href="/assets/css/error.css">
+  </head>
+  <body>
+    <div class="application error error404">
+      <main class="main main--error" role="main">
+        <div class="error-bg full-size">
+          <div class="top full-size"></div>
+          <div class="hill-left full-size"></div>
+          <div class="hill-right full-size"></div>
+          <div class="shadow-left full-size"></div>
+          <div class="shadow-right full-size"></div>
+        </div>
+        <div class="error-excavator full-size"></div>
+        <div class="error-text">
+          <h1>Page Not Found</h1>
+          <p>We dug around for the page you requested, but we couldn't find it!
+             Please <a href="/">go back</a> and try again.
+          </p>
+        </div>
+      </main>
+    </div>
+  </body>
+</html>
diff --git a/bridgedb/https/templates/error-500.html b/bridgedb/https/templates/error-500.html
new file mode 100644
index 0000000..5c56c39
--- /dev/null
+++ b/bridgedb/https/templates/error-500.html
@@ -0,0 +1,36 @@
+## -*- coding: utf-8 -*-
+
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>BridgeDB - 500</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="description" content="Bridge IP database">
+    <meta name="author" content="The Tor Project">
+
+    <!-- Le styles -->
+    <link rel="stylesheet" href="/assets/css/main.css">
+    <!--[if IE 7]>
+        <link rel="stylesheet" href="/assets/css/font-awesome-ie7.min.css">
+        <![endif]-->
+    <link rel="stylesheet" href="/assets/css/error.css">
+  </head>
+  <body>
+    <div class="application error error500">
+      <main class="main main--error" role="main">
+        <div class="error-bg full-size">
+          <div class="hill-left full-size"></div>
+          <div class="hill-right full-size"></div>
+          <div class="shadow-left full-size"></div>
+          <div class="shadow-right full-size"></div>
+        </div>
+        <div class="road full-size"></div>
+        <div class="error-text">
+          <h1>Bad News Bears</h1>
+          <p>Something wicked totally just borked <a href="/">BridgeDB</a>… :'(</p>
+        </div>
+      </main>
+    </div>
+  </body>
+</html>
diff --git a/bridgedb/https/templates/error-503.html b/bridgedb/https/templates/error-503.html
new file mode 100644
index 0000000..c926743
--- /dev/null
+++ b/bridgedb/https/templates/error-503.html
@@ -0,0 +1,37 @@
+## -*- coding: utf-8 -*-
+
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>BridgeDB - Under Maintenance</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="description" content="Bridge IP database">
+    <meta name="author" content="The Tor Project">
+
+    <!-- Le styles -->
+    <link rel="stylesheet" href="/assets/css/main.css">
+    <!--[if IE 7]>
+        <link rel="stylesheet" href="/assets/css/font-awesome-ie7.min.css">
+        <![endif]-->
+    <link rel="stylesheet" href="/assets/css/error.css">
+  </head>
+  <body>
+    <div class="application error maintenance">
+      <main class="main main--error" role="main">
+        <div class="maintenance-bg full-size">
+          <div class="hill-left full-size"></div>
+          <div class="hill-right full-size"></div>
+          <div class="shadow-left full-size"></div>
+          <div class="shadow-right full-size"></div>
+        </div>
+        <div class="maintenance-tractor full-size"></div>
+        <div class="maintenance-text">
+          <h1>Under Maintenance</h1>
+          <p>Please try again in a minute…
+            <a href="/">BridgeDB</a> will be back soon!</p>
+        </div>
+      </main>
+    </div>
+  </body>
+</html>
diff --git a/setup.py b/setup.py
index 0402391..e92afee 100644
--- a/setup.py
+++ b/setup.py
@@ -174,7 +174,8 @@ def get_template_files():
                         'assets/font/*.ttf',
                         'assets/font/*.svg',
                         'assets/font/*.eot',
-                        'assets/js/*.js']
+                        'assets/js/*.js',
+                        'assets/images/*.svg']
     template_files = []
 
     for include_pattern in include_patterns:
diff --git a/test/test_https.py b/test/test_https.py
index 2a12eee..c1c9772 100644
--- a/test/test_https.py
+++ b/test/test_https.py
@@ -172,6 +172,15 @@ class HTTPTests(unittest.TestCase):
         self.assertIn("Content-Security-Policy", headers)
         self.assertIn("default-src 'none';", headers)
 
+    def test_404(self):
+        """Asking for a non-existent resource should yield our custom 404 page,
+        but we can't actually check because Mechanize flips out if we get
+        anything response code other than 200. :/
+        """
+        page = '/'.join([HTTP_ROOT, '404'])
+        self.openBrowser()
+        self.assertRaises(mechanize.HTTPError, self.br.open, page)
+
     def test_get_obfs2_ipv4(self):
         if os.environ.get("CI"):
             if not self.pid or not processExists(self.pid):
diff --git a/test/test_https_server.py b/test/test_https_server.py
index 020b050..ce388a1 100644
--- a/test/test_https_server.py
+++ b/test/test_https_server.py
@@ -116,13 +116,74 @@ class GetClientIPTests(unittest.TestCase):
 class ReplaceErrorPageTests(unittest.TestCase):
     """Tests for :func:`bridgedb.https.server.replaceErrorPage`."""
 
+    def setUp(self):
+        self.resource500 = server.resource500
+
+    def tearDown(self):
+        server.resource500 = self.resource500
+
     def test_replaceErrorPage(self):
-        """``replaceErrorPage`` should return the expected html."""
+        """``replaceErrorPage`` should return the error-500.html page."""
+        request = DummyRequest([''])
         exc = Exception("vegan gümmibären")
-        errorPage = server.replaceErrorPage(exc)
-        self.assertSubstring("Something went wrong", errorPage)
+        errorPage = server.replaceErrorPage(request, exc)
+        self.assertSubstring("Bad News Bears", errorPage)
         self.assertNotSubstring("vegan gümmibären", errorPage)
 
+    def test_replaceErrorPage_matches_resource500(self):
+        """``replaceErrorPage`` should return the error-500.html page."""
+        request = DummyRequest([''])
+        exc = Exception("vegan gümmibären")
+        errorPage = server.replaceErrorPage(request, exc)
+        error500Page = server.resource500.render(request)
+        self.assertEqual(errorPage, error500Page)
+
+    def test_replaceErrorPage_no_resource500(self):
+        """If ``server.resource500`` is missing/broken, then
+        ``replaceErrorPage`` should return custom hardcoded HTML error text.
+        """
+        request = DummyRequest([''])
+        exc = Exception("vegan gümmibären")
+        server.resource500 = None
+        errorPage = server.replaceErrorPage(request, exc)
+        self.assertNotSubstring("Bad News Bears", errorPage)
+        self.assertNotSubstring("vegan gümmibären", errorPage)
+        self.assertSubstring("Sorry! Something went wrong with your request.",
+                             errorPage)
+
+class ErrorResourceTests(unittest.TestCase):
+    """Tests for :class:`bridgedb.https.server.ErrorResource`."""
+
+    def setUp(self):
+        self.request = DummyRequest([''])
+
+    def test_resource404(self):
+        """``server.resource404`` should display the error-404.html page."""
+        page = server.resource404.render(self.request)
+        self.assertSubstring('We dug around for the page you requested', page)
+
+    def test_resource500(self):
+        """``server.resource500`` should display the error-500.html page."""
+        page = server.resource500.render(self.request)
+        self.assertSubstring('Bad News Bears', page)
+
+    def test_maintenance(self):
+        """``server.maintenance`` should display the error-503.html page."""
+        page = server.maintenance.render(self.request)
+        self.assertSubstring('Under Maintenance', page)
+
+
+class CustomErrorHandlingResourceTests(unittest.TestCase):
+    """Tests for :class:`bridgedb.https.server.CustomErrorHandlingResource`."""
+
+    def test_getChild(self):
+        """``CustomErrorHandlingResource.getChild`` should return a rendered
+        copy of ``server.resource404``.
+        """
+        request = DummyRequest([''])
+        resource = server.CustomErrorHandlingResource()
+        self.assertEqual(server.resource404, resource.getChild('foobar', request))
+
 
 class CSPResourceTests(unittest.TestCase):
     """Tests for :class:`bridgedb.HTTPServer.CSPResource`."""
@@ -279,7 +340,7 @@ class CaptchaProtectedResourceTests(unittest.TestCase):
             request = DummyRequest([self.pagename])
             request.method = b'GET'
             page = self.captchaResource.render_GET(request)
-            errorPage = server.replaceErrorPage(Exception('kablam'))
+            errorPage = server.replaceErrorPage(request, Exception('kablam'))
             self.assertEqual(page, errorPage)
         finally:
             server.lookup = oldLookup
@@ -423,7 +484,7 @@ class GimpCaptchaProtectedResourceTests(unittest.TestCase):
             server.lookup = None
             self.request.method = b'GET'
             page = self.captchaResource.render_GET(self.request)
-            errorPage = server.replaceErrorPage(Exception('kablam'))
+            errorPage = server.replaceErrorPage(self.request, Exception('kablam'))
             self.assertEqual(page, errorPage)
         finally:
             server.lookup = oldLookup
@@ -583,7 +644,7 @@ class ReCaptchaProtectedResourceTests(unittest.TestCase):
             server.lookup = None
             self.request.method = b'GET'
             page = self.captchaResource.render_GET(self.request)
-            errorPage = server.replaceErrorPage(Exception('kablam'))
+            errorPage = server.replaceErrorPage(self.request, Exception('kablam'))
             self.assertEqual(page, errorPage)
         finally:
             server.lookup = oldLookup
@@ -864,6 +925,26 @@ class BridgesResourceTests(unittest.TestCase):
             self.assertGreater(int(port), 0)
             self.assertLessEqual(int(port), 65535)
 
+    def test_renderAnswer_textplain_error(self):
+        """If we hit some error while returning bridge lines in text/plain
+        format, then our custom plaintext error message (the hardcoded HTML in
+        ``server.replaceErrorPage``) should be returned.
+        """
+        self.useBenignBridges()
+
+        request = DummyRequest([self.pagename])
+        request.args.update({'format': ['plain']})
+        request.getClientIP = lambda: '4.4.4.4'
+        request.method = b'GET'
+
+        # We'll cause a TypeError here due to calling '\n'.join(None)
+        page = self.bridgesResource.renderAnswer(request, bridgeLines=None)
+
+        # We don't want the fancy version:
+        self.assertNotSubstring("Bad News Bears", page)
+        self.assertSubstring("Sorry! Something went wrong with your request.",
+                             page)
+
 
 class OptionsResourceTests(unittest.TestCase):
     """Tests for :class:`bridgedb.https.server.OptionsResource`."""





More information about the tor-commits mailing list