From 0204e35cfdb3265e22e61f7a649d24ed67772c52 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 12 Nov 2015 10:49:13 -0800 Subject: [PATCH 1/2] ref(rootfs): remove tech previews and fleet, default to kubernetes --- rootfs/scheduler/fleet.py | 389 ----------------------------- rootfs/scheduler/k8s.py | 42 ++-- rootfs/scheduler/mesos_marathon.py | 115 --------- rootfs/scheduler/swarm.py | 124 --------- rootfs/templates/confd_settings.py | 19 +- 5 files changed, 22 insertions(+), 667 deletions(-) delete mode 100644 rootfs/scheduler/fleet.py delete mode 100644 rootfs/scheduler/mesos_marathon.py delete mode 100644 rootfs/scheduler/swarm.py diff --git a/rootfs/scheduler/fleet.py b/rootfs/scheduler/fleet.py deleted file mode 100644 index 22cdc2338..000000000 --- a/rootfs/scheduler/fleet.py +++ /dev/null @@ -1,389 +0,0 @@ -import base64 -import copy -import cStringIO -import httplib -import json -import paramiko -import re -import socket -import time - -from django.conf import settings - -from . import AbstractSchedulerClient -from .states import JobState - - -MATCH = re.compile( - '(?P[a-z0-9-]+)_?(?Pv[0-9]+)?\.?(?P[a-z-_]+)?.(?P[0-9]+)') -RETRIES = 3 - - -class UHTTPConnection(httplib.HTTPConnection): - """Subclass of Python library HTTPConnection that uses a Unix domain socket. - """ - - def __init__(self, path): - httplib.HTTPConnection.__init__(self, 'localhost') - self.path = path - - def connect(self): - sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - sock.connect(self.path) - self.sock = sock - - -class FleetHTTPClient(AbstractSchedulerClient): - - def __init__(self, target, auth, options, pkey): - super(FleetHTTPClient, self).__init__(target, auth, options, pkey) - # single global connection - self.conn = UHTTPConnection(self.target) - - # connection helpers - - def _request_unit(self, method, name, body=None): - headers = {'Content-Type': 'application/json'} - self.conn.request(method, '/v1-alpha/units/{name}.service'.format(**locals()), - headers=headers, body=json.dumps(body)) - return self.conn.getresponse() - - def _get_unit(self, name): - for attempt in xrange(RETRIES): - try: - resp = self._request_unit('GET', name) - data = resp.read() - if not 200 <= resp.status <= 299: - errmsg = "Failed to retrieve unit: {} {} - {}".format( - resp.status, resp.reason, data) - raise RuntimeError(errmsg) - return data - except: - if attempt >= (RETRIES - 1): - raise - - def _put_unit(self, name, body): - for attempt in xrange(RETRIES): - try: - resp = self._request_unit('PUT', name, body) - data = resp.read() - if not 200 <= resp.status <= 299: - errmsg = "Failed to create unit: {} {} - {}".format( - resp.status, resp.reason, data) - raise RuntimeError(errmsg) - return data - except: - if attempt >= (RETRIES - 1): - raise - - def _delete_unit(self, name): - headers = {'Content-Type': 'application/json'} - self.conn.request('DELETE', '/v1-alpha/units/{name}.service'.format(**locals()), - headers=headers) - resp = self.conn.getresponse() - data = resp.read() - if resp.status not in (404, 204): - errmsg = "Failed to delete unit: {} {} - {}".format( - resp.status, resp.reason, data) - raise RuntimeError(errmsg) - return data - - def _get_state(self, name=None): - headers = {'Content-Type': 'application/json'} - url = '/v1-alpha/state' - if name: - url += '?unitName={name}.service'.format(**locals()) - self.conn.request('GET', url, headers=headers) - resp = self.conn.getresponse() - data = resp.read() - if resp.status not in (200,): - errmsg = "Failed to retrieve state: {} {} - {}".format( - resp.status, resp.reason, data) - raise RuntimeError(errmsg) - return json.loads(data) - - def _get_machines(self): - headers = {'Content-Type': 'application/json'} - url = '/v1-alpha/machines' - self.conn.request('GET', url, headers=headers) - resp = self.conn.getresponse() - data = resp.read() - if resp.status not in (200,): - errmsg = "Failed to retrieve machines: {} {} - {}".format( - resp.status, resp.reason, data) - raise RuntimeError(errmsg) - return json.loads(data) - - # container api - - def create(self, name, image, command='', template=None, **kwargs): - """Create a container.""" - self._create_container(name, image, command, - template or copy.deepcopy(CONTAINER_TEMPLATE), **kwargs) - - def _create_container(self, name, image, command, unit, **kwargs): - l = locals().copy() - l.update(re.match(MATCH, name).groupdict()) - # prepare memory limit for the container type - mem = kwargs.get('memory', {}).get(l['c_type'], None) - if mem: - l.update({'memory': '-m {} {}'.format(mem.lower(), settings.DISABLE_SWAP)}) - else: - l.update({'memory': ''}) - # prepare memory limit for the container type - cpu = kwargs.get('cpu', {}).get(l['c_type'], None) - if cpu: - l.update({'cpu': '-c {}'.format(cpu)}) - else: - l.update({'cpu': ''}) - # set unit hostname - l.update({'hostname': self._get_hostname(name)}) - # should a special entrypoint be used - entrypoint = kwargs.get('entrypoint') - if entrypoint: - l.update({'entrypoint': '{}'.format(entrypoint)}) - # encode command as utf-8 - if isinstance(l.get('command'), basestring): - l['command'] = l['command'].encode('utf-8') - # construct unit from template - for f in unit: - f['value'] = f['value'].format(**l) - # prepare tags only if one was provided - tags = kwargs.get('tags', {}) - tagset = ' '.join(['"{}={}"'.format(k, v) for k, v in tags.viewitems()]) - if settings.ENABLE_PLACEMENT_OPTIONS in ['true', 'True', 'TRUE', '1']: - unit.append({"section": "X-Fleet", "name": "MachineMetadata", - "value": tagset + ' "dataPlane=true"'}) - # post unit to fleet - self._put_unit(name, {"desiredState": "loaded", "options": unit}) - - def _get_hostname(self, application_name): - hostname = settings.UNIT_HOSTNAME - if hostname == "default": - return '' - elif hostname == "application": - # replace underscore with dots, since underscore is not valid in DNS hostnames - dns_name = application_name.replace("_", ".") - return '-h ' + dns_name - elif hostname == "server": - return '-h %H' - else: - raise RuntimeError('Unsupported hostname: ' + hostname) - - def start(self, name): - """Start a container.""" - self._put_unit(name, {'desiredState': 'launched'}) - self._wait_for_container_running(name) - - def _wait_for_container_state(self, name): - # wait for container to get scheduled - for _ in xrange(30): - states = self._get_state(name) - if states and len(states.get('states', [])) == 1: - return states.get('states')[0] - time.sleep(1) - else: - raise RuntimeError('container timeout while retrieving state') - - def _wait_for_container_running(self, name): - # we bump to 20 minutes here to match the timeout on the router and in the app unit files - try: - self._wait_for_job_state(name, JobState.up) - except RuntimeError: - raise RuntimeError('container failed to start') - - def _wait_for_job_state(self, name, state): - # we bump to 20 minutes here to match the timeout on the router and in the app unit files - for _ in xrange(1200): - if self.state(name) == state: - return - time.sleep(1) - else: - raise RuntimeError('timeout waiting for job state: {}'.format(state)) - - def _wait_for_destroy(self, name): - for _ in xrange(30): - if not self._get_state(name): - break - time.sleep(1) - else: - raise RuntimeError('timeout on container destroy') - - def stop(self, name): - """Stop a container.""" - self._put_unit(name, {"desiredState": "loaded"}) - self._wait_for_job_state(name, JobState.created) - - def destroy(self, name): - """Destroy a container.""" - # call all destroy functions, ignoring any errors - try: - self._destroy_container(name) - except: - pass - self._wait_for_destroy(name) - - def _destroy_container(self, name): - for attempt in xrange(RETRIES): - try: - self._delete_unit(name) - break - except: - if attempt == (RETRIES - 1): # account for 0 indexing - raise - - def run(self, name, image, entrypoint, command): # noqa - """Run a one-off command.""" - self._create_container(name, image, command, copy.deepcopy(RUN_TEMPLATE), - entrypoint=entrypoint) - # launch the container - self._put_unit(name, {'desiredState': 'launched'}) - # wait for the container to get scheduled - state = self._wait_for_container_state(name) - - try: - machineID = state.get('machineID') - - # find the machine - machines = self._get_machines() - if not machines: - raise RuntimeError('no available hosts to run command') - - # find the machine's primaryIP - primaryIP = None - for m in machines.get('machines', []): - if m['id'] == machineID: - primaryIP = m['primaryIP'] - if not primaryIP: - raise RuntimeError('could not find host') - - # prepare ssh key - file_obj = cStringIO.StringIO(base64.b64decode(self.pkey)) - pkey = paramiko.RSAKey(file_obj=file_obj) - - # grab output via docker logs over SSH - ssh = paramiko.SSHClient() - ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - ssh.connect(primaryIP, username="core", pkey=pkey) - # share a transport - tran = ssh.get_transport() - - def _do_ssh(cmd): - with tran.open_session() as chan: - chan.exec_command(cmd) - while not chan.exit_status_ready(): - time.sleep(1) - out = chan.makefile() - output = out.read() - rc = chan.recv_exit_status() - return rc, output - - # wait for container to launch - # we loop indefinitely here, as we have no idea how long the docker pull will take - while True: - rc, _ = _do_ssh('docker inspect {name}'.format(**locals())) - if rc == 0: - break - time.sleep(1) - else: - raise RuntimeError('failed to create container') - - # wait for container to start - for _ in xrange(2): - _rc, _output = _do_ssh('docker inspect {name}'.format(**locals())) - if _rc != 0: - raise RuntimeError('failed to inspect container') - _container = json.loads(_output) - started_at = _container[0]["State"]["StartedAt"] - if not started_at.startswith('0001'): - break - time.sleep(1) - else: - raise RuntimeError('container failed to start') - - # wait for container to complete - for _ in xrange(1200): - _rc, _output = _do_ssh('docker inspect {name}'.format(**locals())) - if _rc != 0: - raise RuntimeError('failed to inspect container') - _container = json.loads(_output) - finished_at = _container[0]["State"]["FinishedAt"] - if not finished_at.startswith('0001'): - break - time.sleep(1) - else: - raise RuntimeError('container timed out') - - # gather container output - _rc, output = _do_ssh('docker logs {name}'.format(**locals())) - if _rc != 0: - raise RuntimeError('could not attach to container') - - # determine container exit code - _rc, _output = _do_ssh('docker inspect {name}'.format(**locals())) - if _rc != 0: - raise RuntimeError('could not determine exit code') - container = json.loads(_output) - rc = container[0]["State"]["ExitCode"] - - finally: - # cleanup - self._destroy_container(name) - self._wait_for_destroy(name) - - # return rc and output - return rc, output - - def state(self, name): - """Display the given job's running state.""" - systemdActiveStateMap = { - 'active': 'up', - 'reloading': 'down', - 'inactive': 'created', - 'failed': 'crashed', - 'activating': 'down', - 'deactivating': 'down', - } - try: - # NOTE (bacongobbler): this call to ._get_unit() acts as a pre-emptive check to - # determine if the job no longer exists (will raise a RuntimeError on 404) - self._get_unit(name) - state = self._wait_for_container_state(name) - activeState = state['systemdActiveState'] - # FIXME (bacongobbler): when fleet loads a job, sometimes it'll automatically start and - # stop the container, which in our case will return as 'failed', even though - # the container is perfectly fine. - if activeState == 'failed' and state['systemdLoadState'] == 'loaded': - return JobState.created - return getattr(JobState, systemdActiveStateMap[activeState]) - except KeyError: - # failed retrieving a proper response from the fleet API - return JobState.error - except RuntimeError: - # failed to retrieve a response from the fleet API, - # which means it does not exist - return JobState.destroyed - -SchedulerClient = FleetHTTPClient - - -CONTAINER_TEMPLATE = [ - {"section": "Unit", "name": "Description", "value": "{name}"}, - {"section": "Service", "name": "ExecStartPre", "value": '''/bin/sh -c "IMAGE=$(etcdctl get /deis/registry/host 2>&1):$(etcdctl get /deis/registry/port 2>&1)/{image}; docker pull $IMAGE"'''}, # noqa - {"section": "Service", "name": "ExecStartPre", "value": '''/bin/sh -c "docker inspect {name} >/dev/null 2>&1 && docker rm -f {name} || true"'''}, # noqa - {"section": "Service", "name": "ExecStart", "value": '''/bin/sh -c "IMAGE=$(etcdctl get /deis/registry/host 2>&1):$(etcdctl get /deis/registry/port 2>&1)/{image}; docker run --name {name} --rm {memory} {cpu} {hostname} -P $IMAGE {command}"'''}, # noqa - {"section": "Service", "name": "ExecStop", "value": '''/usr/bin/docker stop {name}'''}, - {"section": "Service", "name": "TimeoutStartSec", "value": "20m"}, - {"section": "Service", "name": "TimeoutStopSec", "value": "10"}, - {"section": "Service", "name": "RestartSec", "value": "5"}, - {"section": "Service", "name": "Restart", "value": "on-failure"}, -] - - -RUN_TEMPLATE = [ - {"section": "Unit", "name": "Description", "value": "{name} admin command"}, - {"section": "Service", "name": "ExecStartPre", "value": '''/bin/sh -c "IMAGE=$(etcdctl get /deis/registry/host 2>&1):$(etcdctl get /deis/registry/port 2>&1)/{image}; docker pull $IMAGE"'''}, # noqa - {"section": "Service", "name": "ExecStartPre", "value": '''/bin/sh -c "docker inspect {name} >/dev/null 2>&1 && docker rm -f {name} || true"'''}, # noqa - {"section": "Service", "name": "ExecStart", "value": '''/bin/sh -c "IMAGE=$(etcdctl get /deis/registry/host 2>&1):$(etcdctl get /deis/registry/port 2>&1)/{image}; docker run --name {name} --entrypoint={entrypoint} -a stdout -a stderr $IMAGE {command}"'''}, # noqa - {"section": "Service", "name": "TimeoutStartSec", "value": "20m"}, -] diff --git a/rootfs/scheduler/k8s.py b/rootfs/scheduler/k8s.py index b0878deb1..68c3ef118 100644 --- a/rootfs/scheduler/k8s.py +++ b/rootfs/scheduler/k8s.py @@ -102,14 +102,12 @@ class KubeHTTPClient(AbstractSchedulerClient): def __init__(self, target, auth, options, pkey): super(KubeHTTPClient, self).__init__(target, auth, options, pkey) - self.target = settings.K8S_MASTER - self.port = "8080" - self.registry = settings.REGISTRY_HOST+":"+settings.REGISTRY_PORT + self.registry = settings.REGISTRY_URL self.apiversion = "v1" - self.conn = httplib.HTTPConnection(self.target+":"+self.port) + self.conn = httplib.HTTPConnection(settings.SCHEDULER_URL) def _get_old_rc(self, name, app_type): - con_app = httplib.HTTPConnection(self.target+":"+self.port) + con_app = httplib.HTTPConnection(self.url) con_app.request('GET', '/api/'+self.apiversion + '/namespaces/'+name+'/replicationcontrollers') resp = con_app.getresponse() @@ -136,7 +134,7 @@ def _get_old_rc(self, name, app_type): return 0 def _get_rc_status(self, name, namespace): - conn_rc = httplib.HTTPConnection(self.target+":"+self.port) + conn_rc = httplib.HTTPConnection(self.url) conn_rc.request('GET', '/api/'+self.apiversion+'/' + 'namespaces/'+namespace+'/replicationcontrollers/'+name) resp = conn_rc.getresponse() @@ -145,7 +143,7 @@ def _get_rc_status(self, name, namespace): return status def _get_rc_(self, name, namespace): - conn_rc_resver = httplib.HTTPConnection(self.target+":"+self.port) + conn_rc_resver = httplib.HTTPConnection(self.url) conn_rc_resver.request('GET', '/api/'+self.apiversion+'/' + 'namespaces/'+namespace+'/replicationcontrollers/'+name) resp = conn_rc_resver.getresponse() @@ -183,7 +181,7 @@ def deploy(self, name, image, command, **kwargs): self._delete_rc(old_rc_name, app_name) def _get_events(self, namespace): - con_get = httplib.HTTPConnection(self.target+":"+self.port) + con_get = httplib.HTTPConnection(self.url) con_get.request('GET', '/api/'+self.apiversion+'/namespaces/'+namespace+'/events') resp = con_get.getresponse() reason = resp.reason @@ -229,7 +227,7 @@ def _scale_rc(self, rc, namespace): name = rc['metadata']['name'] num = rc["spec"]["replicas"] headers = {'Content-Type': 'application/json'} - conn_scalepod = httplib.HTTPConnection(self.target+":"+self.port) + conn_scalepod = httplib.HTTPConnection(self.url) conn_scalepod.request('PUT', '/api/'+self.apiversion+'/namespaces/'+namespace+'/' + 'replicationcontrollers/'+name, headers=headers, body=json.dumps(rc)) resp = conn_scalepod.getresponse() @@ -322,7 +320,7 @@ def _create_rc(self, name, image, command, **kwargs): cpu = float(cpu)/1024 containers[0]["resources"]["limits"]["cpu"] = cpu headers = {'Content-Type': 'application/json'} - conn_rc = httplib.HTTPConnection(self.target+":"+self.port) + conn_rc = httplib.HTTPConnection(self.url) conn_rc.request('POST', '/api/'+self.apiversion+'/namespaces/'+app_name+'/' + 'replicationcontrollers', headers=headers, body=json.dumps(js_template)) resp = conn_rc.getresponse() @@ -363,7 +361,7 @@ def create(self, name, image, command, **kwargs): raise RuntimeError(err) def _get_service(self, name, namespace): - con_get = httplib.HTTPConnection(self.target+":"+self.port) + con_get = httplib.HTTPConnection(self.url) con_get.request('GET', '/api/'+self.apiversion+'/namespaces/'+namespace+'/services/'+name) resp = con_get.getresponse() reason = resp.reason @@ -405,7 +403,7 @@ def _create_service(self, name, app_name, app_type): l["name"] = appname template = string.Template(SERVICE_TEMPLATE).substitute(l) headers = {'Content-Type': 'application/json'} - conn_serv = httplib.HTTPConnection(self.target+":"+self.port) + conn_serv = httplib.HTTPConnection(self.url) conn_serv.request('POST', '/api/'+self.apiversion+'/namespaces/'+app_name+'/services', headers=headers, body=copy.deepcopy(template)) resp = conn_serv.getresponse() @@ -421,7 +419,7 @@ def _create_service(self, name, app_name, app_type): srv['spec']['selector']['type'] = app_type srv['spec']['ports'][0]['targetPort'] = port headers = {'Content-Type': 'application/json'} - conn_scalepod = httplib.HTTPConnection(self.target+":"+self.port) + conn_scalepod = httplib.HTTPConnection(self.url) conn_scalepod.request('PUT', '/api/'+self.apiversion+'/namespaces/'+app_name+'/' + 'services/'+appname, headers=headers, body=json.dumps(srv)) resp = conn_scalepod.getresponse() @@ -448,7 +446,7 @@ def stop(self, name): def _delete_rc(self, name, namespace): headers = {'Content-Type': 'application/json'} - con_dest = httplib.HTTPConnection(self.target+":"+self.port) + con_dest = httplib.HTTPConnection(self.url) con_dest.request('DELETE', '/api/'+self.apiversion+'/namespaces/'+namespace+'/' + 'replicationcontrollers/'+name, headers=headers, body=POD_DELETE) resp = con_dest.getresponse() @@ -469,7 +467,7 @@ def destroy(self, name): name = name.replace("_", "-") headers = {'Content-Type': 'application/json'} - con_dest = httplib.HTTPConnection(self.target+":"+self.port) + con_dest = httplib.HTTPConnection(self.url) con_dest.request('DELETE', '/api/'+self.apiversion+'/namespaces/'+appname+'/' + 'replicationcontrollers/'+name, headers=headers, body=POD_DELETE) resp = con_dest.getresponse() @@ -487,7 +485,7 @@ def destroy(self, name): random.seed(appname) app_id = random.randint(1, 100000) app_name = "app-"+str(app_id) - con_serv = httplib.HTTPConnection(self.target+":"+self.port) + con_serv = httplib.HTTPConnection(self.url) con_serv.request('DELETE', '/api/'+self.apiversion + '/namespaces/'+appname+'/services/'+app_name) resp = con_serv.getresponse() @@ -505,7 +503,7 @@ def destroy(self, name): for pod in parsed_json['items']: if 'generateName' in pod['metadata'] and pod['metadata']['generateName'] == name+'-': self._delete_pod(pod['metadata']['name'], appname) - con_ns = httplib.HTTPConnection(self.target+":"+self.port) + con_ns = httplib.HTTPConnection(self.url) con_ns.request('DELETE', '/api/'+self.apiversion+'/namespaces/'+appname) resp = con_ns.getresponse() reason = resp.reason @@ -518,7 +516,7 @@ def destroy(self, name): raise RuntimeError(errmsg) def _get_pod(self, name, namespace): - conn_pod = httplib.HTTPConnection(self.target+":"+self.port) + conn_pod = httplib.HTTPConnection(self.url) conn_pod.request('GET', '/api/'+self.apiversion+'/namespaces/'+namespace+'/pods/'+name) resp = conn_pod.getresponse() status = resp.status @@ -528,7 +526,7 @@ def _get_pod(self, name, namespace): return (status, data, reason) def _get_pods(self, namespace): - con_get = httplib.HTTPConnection(self.target+":"+self.port) + con_get = httplib.HTTPConnection(self.url) con_get.request('GET', '/api/'+self.apiversion+'/namespaces/'+namespace+'/pods') resp = con_get.getresponse() reason = resp.reason @@ -543,7 +541,7 @@ def _get_pods(self, namespace): def _delete_pod(self, name, namespace): headers = {'Content-Type': 'application/json'} - con_dest_pod = httplib.HTTPConnection(self.target+":"+self.port) + con_dest_pod = httplib.HTTPConnection(self.url) con_dest_pod.request('DELETE', '/api/'+self.apiversion+'/namespaces/' + namespace+'/pods/'+name, headers=headers, body=POD_DELETE) resp = con_dest_pod.getresponse() @@ -567,7 +565,7 @@ def _delete_pod(self, name, namespace): raise RuntimeError(errmsg) def _pod_log(self, name, namespace): - conn_log = httplib.HTTPConnection(self.target+":"+self.port) + conn_log = httplib.HTTPConnection(self.url) conn_log.request('GET', '/api/'+self.apiversion+'/namespaces/' + namespace+'/pods/'+name+'/log') resp = conn_log.getresponse() @@ -613,7 +611,7 @@ def run(self, name, image, entrypoint, command): js_template['spec']['containers'][0]['command'] = [entrypoint] js_template['spec']['containers'][0]['args'] = args - con_dest = httplib.HTTPConnection(self.target+":"+self.port) + con_dest = httplib.HTTPConnection(self.url) headers = {'Content-Type': 'application/json'} con_dest.request('POST', '/api/'+self.apiversion+'/namespaces/'+appname+'/pods', headers=headers, body=json.dumps(js_template)) diff --git a/rootfs/scheduler/mesos_marathon.py b/rootfs/scheduler/mesos_marathon.py deleted file mode 100644 index 3338c9c50..000000000 --- a/rootfs/scheduler/mesos_marathon.py +++ /dev/null @@ -1,115 +0,0 @@ -import re -import time - -from django.conf import settings -from docker import Client -from marathon import MarathonClient -from marathon.models import MarathonApp - -from . import AbstractSchedulerClient -from .fleet import FleetHTTPClient -from .states import JobState - -# turn down standard marathon logging - -MATCH = re.compile( - '(?P[a-z0-9-]+)_?(?Pv[0-9]+)?\.?(?P[a-z-_]+)?.(?P[0-9]+)') -RETRIES = 3 -POLL_ATTEMPTS = 30 -POLL_WAIT = 100 - - -class MarathonHTTPClient(AbstractSchedulerClient): - - def __init__(self, target, auth, options, pkey): - super(MarathonHTTPClient, self).__init__(target, auth, options, pkey) - self.target = settings.MARATHON_HOST - self.registry = settings.REGISTRY_HOST + ':' + settings.REGISTRY_PORT - self.client = MarathonClient('http://'+self.target+':8180') - self.fleet = FleetHTTPClient('/var/run/fleet.sock', auth, options, pkey) - - # helpers - def _app_id(self, name): - return name.replace('_', '.') - - # container api - def create(self, name, image, command='', **kwargs): - """Create a new container""" - app_id = self._app_id(name) - l = locals().copy() - l.update(re.match(MATCH, name).groupdict()) - image = self.registry + '/' + image - mems = kwargs.get('memory', {}).get(l['c_type']) - m = 0 - if mems: - mems = mems.lower() - if mems[-2:-1].isalpha() and mems[-1].isalpha(): - mems = mems[:-1] - m = int(mems[:-1]) - c = 0.5 - cpu = kwargs.get('cpu', {}).get(l['c_type']) - if cpu: - c = cpu - cmd = "docker run --name {name} -P {image} {command}".format(**locals()) - self.client.create_app(app_id, MarathonApp(cmd=cmd, mem=m, cpus=c, instances=0)) - for _ in xrange(POLL_ATTEMPTS): - if self.client.get_app(self._app_id(name)).tasks_running == 0: - return - time.sleep(1) - - def start(self, name): - """Start a container.""" - self.client.scale_app(self._app_id(name), 1, force=True) - for _ in xrange(POLL_ATTEMPTS): - if self.client.get_app(self._app_id(name)).tasks_running == 1: - break - time.sleep(1) - host = self.client.get_app(self._app_id(name)).tasks[0].host - self._waitforcontainer(host, name) - - def destroy(self, name): - """Destroy a container.""" - try: - host = self.client.get_app(self._app_id(name)).tasks[0].host - self.client.delete_app(self._app_id(name), force=True) - self._delete_container(host, name) - except: - self.client.delete_app(self._app_id(name), force=True) - - def _get_container_state(self, host, name): - docker_cli = Client("tcp://{}:2375".format(host), timeout=1200, version='1.17') - try: - if docker_cli.inspect_container(name)['State']['Running']: - return JobState.up - except: - return JobState.destroyed - - def _waitforcontainer(self, host, name): - for _ in xrange(POLL_WAIT): - if self._get_container_state(host, name) == JobState.up: - return - time.sleep(1) - raise RuntimeError("App container Not Started") - - def _delete_container(self, host, name): - docker_cli = Client("tcp://{}:2375".format(host), timeout=1200, version='1.17') - if docker_cli.inspect_container(name)['State']: - docker_cli.remove_container(name, force=True) - - def run(self, name, image, entrypoint, command): # noqa - """Run a one-off command.""" - return self.fleet.run(name, image, entrypoint, command) - - def state(self, name): - """Display the given job's running state.""" - try: - for _ in xrange(POLL_ATTEMPTS): - if self.client.get_app(self._app_id(name)).tasks_running == 1: - return JobState.up - elif self.client.get_app(self._app_id(name)).tasks_running == 0: - return JobState.created - time.sleep(1) - except: - return JobState.destroyed - -SchedulerClient = MarathonHTTPClient diff --git a/rootfs/scheduler/swarm.py b/rootfs/scheduler/swarm.py deleted file mode 100644 index 6d4142f4d..000000000 --- a/rootfs/scheduler/swarm.py +++ /dev/null @@ -1,124 +0,0 @@ -import re -import time - -from django.conf import settings -from docker import Client - -from . import AbstractSchedulerClient -from .states import JobState - - -MATCH = re.compile( - r'(?P[a-z0-9-]+)_?(?Pv[0-9]+)?\.?(?P[a-z-_]+)?.(?P[0-9]+)') - - -class SwarmClient(AbstractSchedulerClient): - - def __init__(self, target, auth, options, pkey): - super(SchedulerClient, self).__init__(target, auth, options, pkey) - self.target = settings.SWARM_HOST - # single global connection - self.registry = settings.REGISTRY_HOST + ':' + settings.REGISTRY_PORT - self.docker_cli = Client("tcp://{}:2395".format(self.target), - timeout=1200, version='1.17') - - def create(self, name, image, command='', template=None, **kwargs): - """Create a new container.""" - cimage = self.registry + '/' + image - affinity = "affinity:container!=~/{}*/".format(re.split(r'_v\d.', name)[0]) - l = locals().copy() - l.update(re.match(MATCH, name).groupdict()) - mem = kwargs.get('memory', {}).get(l['c_type']) - if mem: - mem = mem.lower() - if mem[-2:-1].isalpha() and mem[-1].isalpha(): - mem = mem[:-1] - cpu = kwargs.get('cpu', {}).get(l['c_type']) - self.docker_cli.create_container(image=cimage, name=name, - command=command.encode('utf-8'), - mem_limit=mem, - cpu_shares=cpu, - environment=[affinity], - host_config={'PublishAllPorts': True}) - - def start(self, name): - """Start a container.""" - self.docker_cli.start(name) - - def stop(self, name): - """Stop a container.""" - self.docker_cli.stop(name) - - def destroy(self, name): - """Destroy a container.""" - self.stop(name) - self.docker_cli.remove_container(name) - - def run(self, name, image, entrypoint, command): - """Run a one-off command.""" - cimage = self.registry + '/' + image - # use affinity for nodes that already have the image - affinity = "affinity:image==~{}".format(cimage) - self.docker_cli.create_container(image=cimage, name=name, - command=command.encode('utf-8'), - environment=[affinity], - entrypoint=[entrypoint]) - time.sleep(2) - self.start(name) - rc = 0 - while (True): - if self._get_container_state(name) == JobState.created: - break - time.sleep(1) - try: - output = self.docker_cli.logs(name) - return rc, output - except: - rc = 1 - return rc, output - - def _get_container_state(self, name): - try: - if self.docker_cli.inspect_container(name)['State']['Running']: - return JobState.up - else: - return JobState.created - except: - return JobState.destroyed - - def state(self, name): - """Display the given job's running state.""" - try: - for _ in xrange(30): - return self._get_container_state(name) - time.sleep(1) - # FIXME (smothiki): should be able to send JobState.crashed - except KeyError: - return JobState.error - except RuntimeError: - return JobState.destroyed - - def _get_hostname(self, application_name): - hostname = settings.UNIT_HOSTNAME - if hostname == 'default': - return '' - elif hostname == 'application': - # replace underscore with dots, since underscore is not valid in DNS hostnames - dns_name = application_name.replace('_', '.') - return dns_name - elif hostname == 'server': - raise NotImplementedError - else: - raise RuntimeError('Unsupported hostname: ' + hostname) - - def _get_portbindings(self, image): - dictports = self.docker_cli.inspect_image(image)['ContainerConfig']['ExposedPorts'] - for port in dictports: - dictports[port] = None - return dictports - - def _get_ports(self, image): - dictports = self.docker_cli.inspect_image(image)['ContainerConfig']['ExposedPorts'] - return [int(port.split('/')[0]) for port in dictports] - -SchedulerClient = SwarmClient diff --git a/rootfs/templates/confd_settings.py b/rootfs/templates/confd_settings.py index 2b7cd8eb4..390e78a40 100644 --- a/rootfs/templates/confd_settings.py +++ b/rootfs/templates/confd_settings.py @@ -3,20 +3,8 @@ BUILDER_KEY = '{{ getv "/deis/controller/builderKey" }}' # scheduler settings -SCHEDULER_MODULE = 'scheduler.{{ if exists "/deis/controller/schedulerModule" }}{{ getv "/deis/controller/schedulerModule" }}{{ else }}fleet{{ end }}' -SCHEDULER_TARGET = '{{ if exists "/deis/controller/schedulerTarget" }}{{ getv "/deis/controller/schedulerTarget" }}{{ else }}/var/run/fleet.sock{{ end }}' -try: - SCHEDULER_OPTIONS = dict('{{ if exists "/deis/controller/schedulerOptions" }}{{ getv "/deis/controller/schedulerOptions" }}{{ else }}{}{{ end }}') -except: - SCHEDULER_OPTIONS = {} - -# scheduler swarm manager host - -SWARM_HOST = '{{ if exists "/deis/scheduler/swarm/host" }}{{ getv "/deis/scheduler/swarm/host" }}{{ else }}127.0.0.1{{ end }}' - -MARATHON_HOST = '{{ if exists "/deis/scheduler/mesos/marathon" }}{{ getv "/deis/scheduler/mesos/marathon" }}{{ else }}127.0.0.1{{ end }}' - -K8S_MASTER = '{{ if exists "/deis/scheduler/k8s/master" }}{{ getv "/deis/scheduler/k8s/master" }}{{ else }}127.0.0.1{{ end }}' +SCHEDULER_MODULE = 'scheduler.k8s' +SCHEDULER_URL = 'kubernetes' # base64-encoded SSH private key to facilitate current version of "deis run" SSH_PRIVATE_KEY = """{{ if exists "/deis/platform/sshPrivateKey" }}{{ getv "/deis/platform/sshPrivateKey" }}{{ else }}""{{end}}""" @@ -24,8 +12,6 @@ # platform domain must be provided DEIS_DOMAIN = '{{ getv "/deis/platform/domain" }}' -ENABLE_PLACEMENT_OPTIONS = """{{ if exists "/deis/platform/enablePlacementOptions" }}{{ getv "/deis/platform/enablePlacementOptions" }}{{ else }}false{{end}}""" - # use the private registry module REGISTRY_URL = '{{ getv "/deis/registry/protocol" }}://{{ getv "/deis/registry/host" }}:{{ getv "/deis/registry/port" }}' # noqa REGISTRY_HOST = '{{ getv "/deis/registry/host" }}' @@ -53,7 +39,6 @@ {{ if exists "/deis/controller/webEnabled" }} WEB_ENABLED = bool({{ getv "/deis/controller/webEnabled" }}) {{ end }} -UNIT_HOSTNAME = '{{ if exists "/deis/controller/unitHostname" }}{{ getv "/deis/controller/unitHostname" }}{{ else }}default{{ end }}' {{ if exists "/deis/controller/subdomain" }} DEIS_RESERVED_NAMES = ['{{ getv "/deis/controller/subdomain" }}'] From 863520005e22d71c4436fc9d2a867a2e4c69e9cc Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 12 Nov 2015 14:36:06 -0800 Subject: [PATCH 2/2] ref(controller): tons of breaking changes List of changes are as follows: - removed legacy web UI - added ADMIN_ENABLED flag for /admin endpoint - replaced confd with kubernetes service discovery (PoC) - removed LDAP auth (for now) - removed etcd data migrations (v2 = code cleanup) - docker client now reads DOCKER_URL via service discovery - refactored rootfs to reflect final filesystem layout TODO: - remove database schema migrations, start from clean slate - fix up scheduler tests to use scheduler.mock - add back LDAP auth if user opts in - fix tests - m0ar cleanup Main motivation for removing confd entirely is so that the controller can take over PID 1 after we're done all the database migrations. That way we don't require all that `trap` logic. However that means we won't have a way to configure LDAP auth on the fly, which may or may not be important. --- rootfs/.coveragerc | 4 - rootfs/Dockerfile | 25 +- rootfs/{ => app}/api/__init__.py | 0 rootfs/{ => app}/api/admin.py | 0 rootfs/{ => app}/api/authentication.py | 0 rootfs/{ => app}/api/exceptions.py | 0 rootfs/{ => app}/api/fields.py | 0 rootfs/{ => app}/api/fixtures/dev.json | 0 rootfs/{ => app}/api/fixtures/test_auth.json | 0 .../{ => app}/api/fixtures/test_sharing.json | 0 rootfs/{ => app}/api/fixtures/tests.json | 0 rootfs/{ => app}/api/management/__init__.py | 0 .../api/management/commands/__init__.py | 0 .../commands/load_db_state_to_etcd.py | 0 rootfs/{ => app}/api/middleware.py | 0 rootfs/{ => app}/api/models.py | 0 rootfs/{ => app}/api/permissions.py | 0 rootfs/{ => app}/api/routers.py | 0 rootfs/{ => app}/api/serializers.py | 0 .../api/south_migrations/0001_initial.py | 0 .../south_migrations/0002_drop_djcelery.py | 0 .../0003_drop_socialaccount.py | 0 .../south_migrations/0004_add_custom_perms.py | 0 ...uto__add_push__add_unique_push_app_uuid.py | 0 .../0006_auto__add_field_release_summary.py | 0 ...avor_owner_id__del_layer__del_unique_la.py | 0 .../0008_auto__add_field_release_image.py | 0 .../0009_auto__chg_field_container_state.py | 0 ...field_build_procfile__add_field_build_d.py | 0 .../south_migrations/0011_auto__add_domain.py | 0 ..._limit_app_uuid__add_field_config_limit.py | 0 ...it_app_uuid__del_field_config_limit__ad.py | 0 .../0014_auto__add_field_config_tags.py | 0 .../0015_migration_config_defaults.py | 0 .../api/south_migrations/0016_drop_allauth.py | 0 ...uto__del_cluster__del_field_app_cluster.py | 0 ..._release_image__chg_field_release_build.py | 0 .../0019_fix_dockerfile_empty_value.py | 0 .../0020_auto__del_field_container_state.py | 0 .../0021_auto__add_certificate.py | 0 .../0022_auto__add_field_key_fingerprint.py | 0 .../south_migrations/0023_key_fingerprints.py | 0 ...__del_unique_key_owner_id__add_unique_k.py | 0 .../api/south_migrations/__init__.py | 0 rootfs/{ => app}/api/static/500.html | 0 rootfs/{ => app}/api/tests/__init__.py | 0 .../api/tests/test_api_middleware.py | 0 rootfs/{ => app}/api/tests/test_app.py | 0 rootfs/{ => app}/api/tests/test_auth.py | 0 rootfs/{ => app}/api/tests/test_build.py | 0 .../{ => app}/api/tests/test_certificate.py | 0 rootfs/{ => app}/api/tests/test_config.py | 0 rootfs/{ => app}/api/tests/test_container.py | 0 rootfs/{ => app}/api/tests/test_domain.py | 0 rootfs/{ => app}/api/tests/test_hooks.py | 0 rootfs/{ => app}/api/tests/test_key.py | 0 rootfs/{ => app}/api/tests/test_limits.py | 0 rootfs/{ => app}/api/tests/test_perm.py | 0 rootfs/{ => app}/api/tests/test_release.py | 0 rootfs/{ => app}/api/tests/test_scheduler.py | 0 rootfs/{ => app}/api/tests/test_users.py | 0 rootfs/{ => app}/api/urls.py | 0 rootfs/{ => app}/api/utils.py | 0 rootfs/{ => app}/api/views.py | 0 rootfs/{ => app}/api/viewsets.py | 0 rootfs/{ => app}/deis/__init__.py | 0 rootfs/{ => app}/deis/context_processors.py | 0 rootfs/{templates => app/deis}/gconf.py | 11 +- rootfs/{ => app}/deis/middleware.py | 0 rootfs/{ => app}/deis/settings.py | 130 +--- rootfs/{ => app}/deis/urls.py | 3 +- rootfs/{ => app}/deis/wsgi.py | 0 rootfs/{ => app}/dev_requirements.txt | 0 rootfs/{ => app}/manage.py | 0 rootfs/{ => app}/registry/__init__.py | 0 rootfs/{ => app}/registry/dockerclient.py | 2 +- rootfs/{ => app}/registry/models.py | 0 rootfs/{ => app}/registry/tests.py | 0 rootfs/{ => app}/requirements.txt | 2 - rootfs/{ => app}/scheduler/__init__.py | 0 rootfs/{ => app}/scheduler/chaos.py | 0 rootfs/{ => app}/scheduler/k8s.py | 0 rootfs/{ => app}/scheduler/mock.py | 0 rootfs/{ => app}/scheduler/states.py | 0 rootfs/{ => app}/setup.cfg | 0 rootfs/bin/boot | 147 +--- rootfs/bin/reload | 6 - rootfs/build.sh | 49 -- rootfs/conf.d/confd_settings.toml | 16 - rootfs/conf.d/gconf.toml | 10 - rootfs/migrations/data/0001.sh | 17 - rootfs/migrations/data/0002.sh | 24 - rootfs/templates/confd_settings.py | 58 -- rootfs/web/__init__.py | 0 rootfs/web/fixtures/test_web.json | 66 -- rootfs/web/models.py | 0 .../static/css/bootstrap-responsive.min.css | 9 - rootfs/web/static/css/bootstrap.min.css | 9 - rootfs/web/static/css/deis-controller.css | 1 - rootfs/web/static/css/deis-docs.css | 32 - rootfs/web/static/css/main.css | 702 ------------------ rootfs/web/static/favicon.ico | Bin 1406 -> 0 bytes rootfs/web/static/img/404.png | Bin 5170 -> 0 bytes rootfs/web/static/img/aws-ec2.png | Bin 14401 -> 0 bytes rootfs/web/static/img/blog-social.png | Bin 3106 -> 0 bytes rootfs/web/static/img/cover-image.png | Bin 23015 -> 0 bytes rootfs/web/static/img/deis-graphic.png | Bin 29035 -> 0 bytes rootfs/web/static/img/deis_builder.png | Bin 28223 -> 0 bytes rootfs/web/static/img/deis_logo.png | Bin 10104 -> 0 bytes rootfs/web/static/img/favicon.png | Bin 324 -> 0 bytes rootfs/web/static/img/fork.png | Bin 1731 -> 0 bytes rootfs/web/static/img/glyphs.png | Bin 3854 -> 0 bytes rootfs/web/static/img/large-social.png | Bin 18518 -> 0 bytes rootfs/web/static/img/logo.png | Bin 617 -> 0 bytes rootfs/web/static/img/mag_glass.png | Bin 307 -> 0 bytes rootfs/web/static/img/menu-logo.png | Bin 4609 -> 0 bytes rootfs/web/static/img/social.png | Bin 3606 -> 0 bytes rootfs/web/static/js/adjustments.js | 60 -- rootfs/web/static/js/bootstrap.min.js | 6 - rootfs/web/static/js/checkURL.js | 50 -- rootfs/web/static/js/jquery-1.10.2.min.js | 6 - .../js/modernizr-2.6.2-respond-1.1.0.min.js | 11 - rootfs/web/templates/rest_framework/api.html | 1 - .../web/templates/rest_framework/login.html | 5 - rootfs/web/templates/web/account.html | 28 - rootfs/web/templates/web/apps.html | 32 - rootfs/web/templates/web/base.html | 80 -- rootfs/web/templates/web/dashboard.html | 17 - rootfs/web/templates/web/support.html | 28 - rootfs/web/templatetags/__init__.py | 0 rootfs/web/templatetags/gravatar_tags.py | 37 - rootfs/web/tests.py | 83 --- rootfs/web/urls.py | 17 - rootfs/web/views.py | 46 -- 134 files changed, 33 insertions(+), 1797 deletions(-) rename rootfs/{ => app}/api/__init__.py (100%) rename rootfs/{ => app}/api/admin.py (100%) rename rootfs/{ => app}/api/authentication.py (100%) rename rootfs/{ => app}/api/exceptions.py (100%) rename rootfs/{ => app}/api/fields.py (100%) rename rootfs/{ => app}/api/fixtures/dev.json (100%) rename rootfs/{ => app}/api/fixtures/test_auth.json (100%) rename rootfs/{ => app}/api/fixtures/test_sharing.json (100%) rename rootfs/{ => app}/api/fixtures/tests.json (100%) rename rootfs/{ => app}/api/management/__init__.py (100%) rename rootfs/{ => app}/api/management/commands/__init__.py (100%) rename rootfs/{ => app}/api/management/commands/load_db_state_to_etcd.py (100%) rename rootfs/{ => app}/api/middleware.py (100%) rename rootfs/{ => app}/api/models.py (100%) rename rootfs/{ => app}/api/permissions.py (100%) rename rootfs/{ => app}/api/routers.py (100%) rename rootfs/{ => app}/api/serializers.py (100%) rename rootfs/{ => app}/api/south_migrations/0001_initial.py (100%) rename rootfs/{ => app}/api/south_migrations/0002_drop_djcelery.py (100%) rename rootfs/{ => app}/api/south_migrations/0003_drop_socialaccount.py (100%) rename rootfs/{ => app}/api/south_migrations/0004_add_custom_perms.py (100%) rename rootfs/{ => app}/api/south_migrations/0005_auto__add_push__add_unique_push_app_uuid.py (100%) rename rootfs/{ => app}/api/south_migrations/0006_auto__add_field_release_summary.py (100%) rename rootfs/{ => app}/api/south_migrations/0007_auto__del_flavor__del_unique_flavor_owner_id__del_layer__del_unique_la.py (100%) rename rootfs/{ => app}/api/south_migrations/0008_auto__add_field_release_image.py (100%) rename rootfs/{ => app}/api/south_migrations/0009_auto__chg_field_container_state.py (100%) rename rootfs/{ => app}/api/south_migrations/0010_auto__add_field_build_sha__add_field_build_procfile__add_field_build_d.py (100%) rename rootfs/{ => app}/api/south_migrations/0011_auto__add_domain.py (100%) rename rootfs/{ => app}/api/south_migrations/0012_auto__add_limit__add_unique_limit_app_uuid__add_field_config_limit.py (100%) rename rootfs/{ => app}/api/south_migrations/0013_auto__del_limit__del_unique_limit_app_uuid__del_field_config_limit__ad.py (100%) rename rootfs/{ => app}/api/south_migrations/0014_auto__add_field_config_tags.py (100%) rename rootfs/{ => app}/api/south_migrations/0015_migration_config_defaults.py (100%) rename rootfs/{ => app}/api/south_migrations/0016_drop_allauth.py (100%) rename rootfs/{ => app}/api/south_migrations/0017_auto__del_cluster__del_field_app_cluster.py (100%) rename rootfs/{ => app}/api/south_migrations/0018_drop_field_release_image__chg_field_release_build.py (100%) rename rootfs/{ => app}/api/south_migrations/0019_fix_dockerfile_empty_value.py (100%) rename rootfs/{ => app}/api/south_migrations/0020_auto__del_field_container_state.py (100%) rename rootfs/{ => app}/api/south_migrations/0021_auto__add_certificate.py (100%) rename rootfs/{ => app}/api/south_migrations/0022_auto__add_field_key_fingerprint.py (100%) rename rootfs/{ => app}/api/south_migrations/0023_key_fingerprints.py (100%) rename rootfs/{ => app}/api/south_migrations/0024_auto__chg_field_key_fingerprint__del_unique_key_owner_id__add_unique_k.py (100%) rename rootfs/{ => app}/api/south_migrations/__init__.py (100%) rename rootfs/{ => app}/api/static/500.html (100%) rename rootfs/{ => app}/api/tests/__init__.py (100%) rename rootfs/{ => app}/api/tests/test_api_middleware.py (100%) rename rootfs/{ => app}/api/tests/test_app.py (100%) rename rootfs/{ => app}/api/tests/test_auth.py (100%) rename rootfs/{ => app}/api/tests/test_build.py (100%) rename rootfs/{ => app}/api/tests/test_certificate.py (100%) rename rootfs/{ => app}/api/tests/test_config.py (100%) rename rootfs/{ => app}/api/tests/test_container.py (100%) rename rootfs/{ => app}/api/tests/test_domain.py (100%) rename rootfs/{ => app}/api/tests/test_hooks.py (100%) rename rootfs/{ => app}/api/tests/test_key.py (100%) rename rootfs/{ => app}/api/tests/test_limits.py (100%) rename rootfs/{ => app}/api/tests/test_perm.py (100%) rename rootfs/{ => app}/api/tests/test_release.py (100%) rename rootfs/{ => app}/api/tests/test_scheduler.py (100%) rename rootfs/{ => app}/api/tests/test_users.py (100%) rename rootfs/{ => app}/api/urls.py (100%) rename rootfs/{ => app}/api/utils.py (100%) rename rootfs/{ => app}/api/views.py (100%) rename rootfs/{ => app}/api/viewsets.py (100%) rename rootfs/{ => app}/deis/__init__.py (100%) rename rootfs/{ => app}/deis/context_processors.py (100%) rename rootfs/{templates => app/deis}/gconf.py (62%) rename rootfs/{ => app}/deis/middleware.py (100%) rename rootfs/{ => app}/deis/settings.py (70%) rename rootfs/{ => app}/deis/urls.py (88%) rename rootfs/{ => app}/deis/wsgi.py (100%) rename rootfs/{ => app}/dev_requirements.txt (100%) rename rootfs/{ => app}/manage.py (100%) rename rootfs/{ => app}/registry/__init__.py (100%) rename rootfs/{ => app}/registry/dockerclient.py (98%) rename rootfs/{ => app}/registry/models.py (100%) rename rootfs/{ => app}/registry/tests.py (100%) rename rootfs/{ => app}/requirements.txt (89%) rename rootfs/{ => app}/scheduler/__init__.py (100%) rename rootfs/{ => app}/scheduler/chaos.py (100%) rename rootfs/{ => app}/scheduler/k8s.py (100%) rename rootfs/{ => app}/scheduler/mock.py (100%) rename rootfs/{ => app}/scheduler/states.py (100%) rename rootfs/{ => app}/setup.cfg (100%) delete mode 100755 rootfs/bin/reload delete mode 100755 rootfs/build.sh delete mode 100644 rootfs/conf.d/confd_settings.toml delete mode 100644 rootfs/conf.d/gconf.toml delete mode 100755 rootfs/migrations/data/0001.sh delete mode 100755 rootfs/migrations/data/0002.sh delete mode 100644 rootfs/templates/confd_settings.py delete mode 100644 rootfs/web/__init__.py delete mode 100644 rootfs/web/fixtures/test_web.json delete mode 100644 rootfs/web/models.py delete mode 100644 rootfs/web/static/css/bootstrap-responsive.min.css delete mode 100644 rootfs/web/static/css/bootstrap.min.css delete mode 100644 rootfs/web/static/css/deis-controller.css delete mode 100644 rootfs/web/static/css/deis-docs.css delete mode 100644 rootfs/web/static/css/main.css delete mode 100644 rootfs/web/static/favicon.ico delete mode 100644 rootfs/web/static/img/404.png delete mode 100644 rootfs/web/static/img/aws-ec2.png delete mode 100644 rootfs/web/static/img/blog-social.png delete mode 100644 rootfs/web/static/img/cover-image.png delete mode 100644 rootfs/web/static/img/deis-graphic.png delete mode 100644 rootfs/web/static/img/deis_builder.png delete mode 100644 rootfs/web/static/img/deis_logo.png delete mode 100644 rootfs/web/static/img/favicon.png delete mode 100644 rootfs/web/static/img/fork.png delete mode 100644 rootfs/web/static/img/glyphs.png delete mode 100644 rootfs/web/static/img/large-social.png delete mode 100644 rootfs/web/static/img/logo.png delete mode 100644 rootfs/web/static/img/mag_glass.png delete mode 100644 rootfs/web/static/img/menu-logo.png delete mode 100644 rootfs/web/static/img/social.png delete mode 100644 rootfs/web/static/js/adjustments.js delete mode 100644 rootfs/web/static/js/bootstrap.min.js delete mode 100644 rootfs/web/static/js/checkURL.js delete mode 100644 rootfs/web/static/js/jquery-1.10.2.min.js delete mode 100644 rootfs/web/static/js/modernizr-2.6.2-respond-1.1.0.min.js delete mode 100644 rootfs/web/templates/rest_framework/api.html delete mode 100644 rootfs/web/templates/rest_framework/login.html delete mode 100644 rootfs/web/templates/web/account.html delete mode 100644 rootfs/web/templates/web/apps.html delete mode 100644 rootfs/web/templates/web/base.html delete mode 100644 rootfs/web/templates/web/dashboard.html delete mode 100644 rootfs/web/templates/web/support.html delete mode 100644 rootfs/web/templatetags/__init__.py delete mode 100644 rootfs/web/templatetags/gravatar_tags.py delete mode 100644 rootfs/web/tests.py delete mode 100644 rootfs/web/urls.py delete mode 100644 rootfs/web/views.py diff --git a/rootfs/.coveragerc b/rootfs/.coveragerc index 159091a69..dbc826603 100644 --- a/rootfs/.coveragerc +++ b/rootfs/.coveragerc @@ -6,9 +6,6 @@ omit = api/__init__.py api/docker.py scheduler/* - web/__init__.py - web/models.py - web/templatetags/__init__.py # osx library files when not running in virtualenv /Library/* /System/* @@ -26,5 +23,4 @@ exclude_lines = if __name__ == .__main__.: [html] -extra_css = web/static/css/main.css title = Deis Coverage Report diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile index 8eabfd418..d48187abf 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile @@ -3,31 +3,16 @@ FROM alpine:3.2 # install common packages RUN apk add --update-cache curl bash openssl sudo && rm -rf /var/cache/apk/* -# install etcdctl and confd -RUN apk add --update-cache curl tar \ - && curl -sSL https://github.com/coreos/etcd/releases/download/v2.2.1/etcd-v2.2.1-linux-amd64.tar.gz \ - | tar -vxz -C /usr/local/bin --strip=1 etcd-v2.2.1-linux-amd64/etcdctl \ - && chown root:root /usr/local/bin/etcdctl \ - && curl -sSL -o /usr/local/bin/confd https://github.com/kelseyhightower/confd/releases/download/v0.10.0/confd-0.10.0-linux-amd64 \ - && chmod +x /usr/local/bin/confd \ - && apk del --purge curl tar \ - && rm -rf /var/cache/apk/* - # define execution environment -CMD ["/app/bin/boot"] +CMD ["/bin/boot"] EXPOSE 8000 -# define work environment -WORKDIR /app - -ADD build.sh /app/tmp/build.sh +COPY . / -ADD requirements.txt /app/requirements.txt - -RUN DOCKER_BUILD=true /app/tmp/build.sh && rm -rf /app/* +WORKDIR /app -ADD . /app +RUN build -RUN ./manage.py collectstatic --settings=deis.settings --noinput # create static resources +RUN python manage.py collectstatic --settings=deis.settings --noinput ENV DEIS_RELEASE 1.13.0-dev diff --git a/rootfs/api/__init__.py b/rootfs/app/api/__init__.py similarity index 100% rename from rootfs/api/__init__.py rename to rootfs/app/api/__init__.py diff --git a/rootfs/api/admin.py b/rootfs/app/api/admin.py similarity index 100% rename from rootfs/api/admin.py rename to rootfs/app/api/admin.py diff --git a/rootfs/api/authentication.py b/rootfs/app/api/authentication.py similarity index 100% rename from rootfs/api/authentication.py rename to rootfs/app/api/authentication.py diff --git a/rootfs/api/exceptions.py b/rootfs/app/api/exceptions.py similarity index 100% rename from rootfs/api/exceptions.py rename to rootfs/app/api/exceptions.py diff --git a/rootfs/api/fields.py b/rootfs/app/api/fields.py similarity index 100% rename from rootfs/api/fields.py rename to rootfs/app/api/fields.py diff --git a/rootfs/api/fixtures/dev.json b/rootfs/app/api/fixtures/dev.json similarity index 100% rename from rootfs/api/fixtures/dev.json rename to rootfs/app/api/fixtures/dev.json diff --git a/rootfs/api/fixtures/test_auth.json b/rootfs/app/api/fixtures/test_auth.json similarity index 100% rename from rootfs/api/fixtures/test_auth.json rename to rootfs/app/api/fixtures/test_auth.json diff --git a/rootfs/api/fixtures/test_sharing.json b/rootfs/app/api/fixtures/test_sharing.json similarity index 100% rename from rootfs/api/fixtures/test_sharing.json rename to rootfs/app/api/fixtures/test_sharing.json diff --git a/rootfs/api/fixtures/tests.json b/rootfs/app/api/fixtures/tests.json similarity index 100% rename from rootfs/api/fixtures/tests.json rename to rootfs/app/api/fixtures/tests.json diff --git a/rootfs/api/management/__init__.py b/rootfs/app/api/management/__init__.py similarity index 100% rename from rootfs/api/management/__init__.py rename to rootfs/app/api/management/__init__.py diff --git a/rootfs/api/management/commands/__init__.py b/rootfs/app/api/management/commands/__init__.py similarity index 100% rename from rootfs/api/management/commands/__init__.py rename to rootfs/app/api/management/commands/__init__.py diff --git a/rootfs/api/management/commands/load_db_state_to_etcd.py b/rootfs/app/api/management/commands/load_db_state_to_etcd.py similarity index 100% rename from rootfs/api/management/commands/load_db_state_to_etcd.py rename to rootfs/app/api/management/commands/load_db_state_to_etcd.py diff --git a/rootfs/api/middleware.py b/rootfs/app/api/middleware.py similarity index 100% rename from rootfs/api/middleware.py rename to rootfs/app/api/middleware.py diff --git a/rootfs/api/models.py b/rootfs/app/api/models.py similarity index 100% rename from rootfs/api/models.py rename to rootfs/app/api/models.py diff --git a/rootfs/api/permissions.py b/rootfs/app/api/permissions.py similarity index 100% rename from rootfs/api/permissions.py rename to rootfs/app/api/permissions.py diff --git a/rootfs/api/routers.py b/rootfs/app/api/routers.py similarity index 100% rename from rootfs/api/routers.py rename to rootfs/app/api/routers.py diff --git a/rootfs/api/serializers.py b/rootfs/app/api/serializers.py similarity index 100% rename from rootfs/api/serializers.py rename to rootfs/app/api/serializers.py diff --git a/rootfs/api/south_migrations/0001_initial.py b/rootfs/app/api/south_migrations/0001_initial.py similarity index 100% rename from rootfs/api/south_migrations/0001_initial.py rename to rootfs/app/api/south_migrations/0001_initial.py diff --git a/rootfs/api/south_migrations/0002_drop_djcelery.py b/rootfs/app/api/south_migrations/0002_drop_djcelery.py similarity index 100% rename from rootfs/api/south_migrations/0002_drop_djcelery.py rename to rootfs/app/api/south_migrations/0002_drop_djcelery.py diff --git a/rootfs/api/south_migrations/0003_drop_socialaccount.py b/rootfs/app/api/south_migrations/0003_drop_socialaccount.py similarity index 100% rename from rootfs/api/south_migrations/0003_drop_socialaccount.py rename to rootfs/app/api/south_migrations/0003_drop_socialaccount.py diff --git a/rootfs/api/south_migrations/0004_add_custom_perms.py b/rootfs/app/api/south_migrations/0004_add_custom_perms.py similarity index 100% rename from rootfs/api/south_migrations/0004_add_custom_perms.py rename to rootfs/app/api/south_migrations/0004_add_custom_perms.py diff --git a/rootfs/api/south_migrations/0005_auto__add_push__add_unique_push_app_uuid.py b/rootfs/app/api/south_migrations/0005_auto__add_push__add_unique_push_app_uuid.py similarity index 100% rename from rootfs/api/south_migrations/0005_auto__add_push__add_unique_push_app_uuid.py rename to rootfs/app/api/south_migrations/0005_auto__add_push__add_unique_push_app_uuid.py diff --git a/rootfs/api/south_migrations/0006_auto__add_field_release_summary.py b/rootfs/app/api/south_migrations/0006_auto__add_field_release_summary.py similarity index 100% rename from rootfs/api/south_migrations/0006_auto__add_field_release_summary.py rename to rootfs/app/api/south_migrations/0006_auto__add_field_release_summary.py diff --git a/rootfs/api/south_migrations/0007_auto__del_flavor__del_unique_flavor_owner_id__del_layer__del_unique_la.py b/rootfs/app/api/south_migrations/0007_auto__del_flavor__del_unique_flavor_owner_id__del_layer__del_unique_la.py similarity index 100% rename from rootfs/api/south_migrations/0007_auto__del_flavor__del_unique_flavor_owner_id__del_layer__del_unique_la.py rename to rootfs/app/api/south_migrations/0007_auto__del_flavor__del_unique_flavor_owner_id__del_layer__del_unique_la.py diff --git a/rootfs/api/south_migrations/0008_auto__add_field_release_image.py b/rootfs/app/api/south_migrations/0008_auto__add_field_release_image.py similarity index 100% rename from rootfs/api/south_migrations/0008_auto__add_field_release_image.py rename to rootfs/app/api/south_migrations/0008_auto__add_field_release_image.py diff --git a/rootfs/api/south_migrations/0009_auto__chg_field_container_state.py b/rootfs/app/api/south_migrations/0009_auto__chg_field_container_state.py similarity index 100% rename from rootfs/api/south_migrations/0009_auto__chg_field_container_state.py rename to rootfs/app/api/south_migrations/0009_auto__chg_field_container_state.py diff --git a/rootfs/api/south_migrations/0010_auto__add_field_build_sha__add_field_build_procfile__add_field_build_d.py b/rootfs/app/api/south_migrations/0010_auto__add_field_build_sha__add_field_build_procfile__add_field_build_d.py similarity index 100% rename from rootfs/api/south_migrations/0010_auto__add_field_build_sha__add_field_build_procfile__add_field_build_d.py rename to rootfs/app/api/south_migrations/0010_auto__add_field_build_sha__add_field_build_procfile__add_field_build_d.py diff --git a/rootfs/api/south_migrations/0011_auto__add_domain.py b/rootfs/app/api/south_migrations/0011_auto__add_domain.py similarity index 100% rename from rootfs/api/south_migrations/0011_auto__add_domain.py rename to rootfs/app/api/south_migrations/0011_auto__add_domain.py diff --git a/rootfs/api/south_migrations/0012_auto__add_limit__add_unique_limit_app_uuid__add_field_config_limit.py b/rootfs/app/api/south_migrations/0012_auto__add_limit__add_unique_limit_app_uuid__add_field_config_limit.py similarity index 100% rename from rootfs/api/south_migrations/0012_auto__add_limit__add_unique_limit_app_uuid__add_field_config_limit.py rename to rootfs/app/api/south_migrations/0012_auto__add_limit__add_unique_limit_app_uuid__add_field_config_limit.py diff --git a/rootfs/api/south_migrations/0013_auto__del_limit__del_unique_limit_app_uuid__del_field_config_limit__ad.py b/rootfs/app/api/south_migrations/0013_auto__del_limit__del_unique_limit_app_uuid__del_field_config_limit__ad.py similarity index 100% rename from rootfs/api/south_migrations/0013_auto__del_limit__del_unique_limit_app_uuid__del_field_config_limit__ad.py rename to rootfs/app/api/south_migrations/0013_auto__del_limit__del_unique_limit_app_uuid__del_field_config_limit__ad.py diff --git a/rootfs/api/south_migrations/0014_auto__add_field_config_tags.py b/rootfs/app/api/south_migrations/0014_auto__add_field_config_tags.py similarity index 100% rename from rootfs/api/south_migrations/0014_auto__add_field_config_tags.py rename to rootfs/app/api/south_migrations/0014_auto__add_field_config_tags.py diff --git a/rootfs/api/south_migrations/0015_migration_config_defaults.py b/rootfs/app/api/south_migrations/0015_migration_config_defaults.py similarity index 100% rename from rootfs/api/south_migrations/0015_migration_config_defaults.py rename to rootfs/app/api/south_migrations/0015_migration_config_defaults.py diff --git a/rootfs/api/south_migrations/0016_drop_allauth.py b/rootfs/app/api/south_migrations/0016_drop_allauth.py similarity index 100% rename from rootfs/api/south_migrations/0016_drop_allauth.py rename to rootfs/app/api/south_migrations/0016_drop_allauth.py diff --git a/rootfs/api/south_migrations/0017_auto__del_cluster__del_field_app_cluster.py b/rootfs/app/api/south_migrations/0017_auto__del_cluster__del_field_app_cluster.py similarity index 100% rename from rootfs/api/south_migrations/0017_auto__del_cluster__del_field_app_cluster.py rename to rootfs/app/api/south_migrations/0017_auto__del_cluster__del_field_app_cluster.py diff --git a/rootfs/api/south_migrations/0018_drop_field_release_image__chg_field_release_build.py b/rootfs/app/api/south_migrations/0018_drop_field_release_image__chg_field_release_build.py similarity index 100% rename from rootfs/api/south_migrations/0018_drop_field_release_image__chg_field_release_build.py rename to rootfs/app/api/south_migrations/0018_drop_field_release_image__chg_field_release_build.py diff --git a/rootfs/api/south_migrations/0019_fix_dockerfile_empty_value.py b/rootfs/app/api/south_migrations/0019_fix_dockerfile_empty_value.py similarity index 100% rename from rootfs/api/south_migrations/0019_fix_dockerfile_empty_value.py rename to rootfs/app/api/south_migrations/0019_fix_dockerfile_empty_value.py diff --git a/rootfs/api/south_migrations/0020_auto__del_field_container_state.py b/rootfs/app/api/south_migrations/0020_auto__del_field_container_state.py similarity index 100% rename from rootfs/api/south_migrations/0020_auto__del_field_container_state.py rename to rootfs/app/api/south_migrations/0020_auto__del_field_container_state.py diff --git a/rootfs/api/south_migrations/0021_auto__add_certificate.py b/rootfs/app/api/south_migrations/0021_auto__add_certificate.py similarity index 100% rename from rootfs/api/south_migrations/0021_auto__add_certificate.py rename to rootfs/app/api/south_migrations/0021_auto__add_certificate.py diff --git a/rootfs/api/south_migrations/0022_auto__add_field_key_fingerprint.py b/rootfs/app/api/south_migrations/0022_auto__add_field_key_fingerprint.py similarity index 100% rename from rootfs/api/south_migrations/0022_auto__add_field_key_fingerprint.py rename to rootfs/app/api/south_migrations/0022_auto__add_field_key_fingerprint.py diff --git a/rootfs/api/south_migrations/0023_key_fingerprints.py b/rootfs/app/api/south_migrations/0023_key_fingerprints.py similarity index 100% rename from rootfs/api/south_migrations/0023_key_fingerprints.py rename to rootfs/app/api/south_migrations/0023_key_fingerprints.py diff --git a/rootfs/api/south_migrations/0024_auto__chg_field_key_fingerprint__del_unique_key_owner_id__add_unique_k.py b/rootfs/app/api/south_migrations/0024_auto__chg_field_key_fingerprint__del_unique_key_owner_id__add_unique_k.py similarity index 100% rename from rootfs/api/south_migrations/0024_auto__chg_field_key_fingerprint__del_unique_key_owner_id__add_unique_k.py rename to rootfs/app/api/south_migrations/0024_auto__chg_field_key_fingerprint__del_unique_key_owner_id__add_unique_k.py diff --git a/rootfs/api/south_migrations/__init__.py b/rootfs/app/api/south_migrations/__init__.py similarity index 100% rename from rootfs/api/south_migrations/__init__.py rename to rootfs/app/api/south_migrations/__init__.py diff --git a/rootfs/api/static/500.html b/rootfs/app/api/static/500.html similarity index 100% rename from rootfs/api/static/500.html rename to rootfs/app/api/static/500.html diff --git a/rootfs/api/tests/__init__.py b/rootfs/app/api/tests/__init__.py similarity index 100% rename from rootfs/api/tests/__init__.py rename to rootfs/app/api/tests/__init__.py diff --git a/rootfs/api/tests/test_api_middleware.py b/rootfs/app/api/tests/test_api_middleware.py similarity index 100% rename from rootfs/api/tests/test_api_middleware.py rename to rootfs/app/api/tests/test_api_middleware.py diff --git a/rootfs/api/tests/test_app.py b/rootfs/app/api/tests/test_app.py similarity index 100% rename from rootfs/api/tests/test_app.py rename to rootfs/app/api/tests/test_app.py diff --git a/rootfs/api/tests/test_auth.py b/rootfs/app/api/tests/test_auth.py similarity index 100% rename from rootfs/api/tests/test_auth.py rename to rootfs/app/api/tests/test_auth.py diff --git a/rootfs/api/tests/test_build.py b/rootfs/app/api/tests/test_build.py similarity index 100% rename from rootfs/api/tests/test_build.py rename to rootfs/app/api/tests/test_build.py diff --git a/rootfs/api/tests/test_certificate.py b/rootfs/app/api/tests/test_certificate.py similarity index 100% rename from rootfs/api/tests/test_certificate.py rename to rootfs/app/api/tests/test_certificate.py diff --git a/rootfs/api/tests/test_config.py b/rootfs/app/api/tests/test_config.py similarity index 100% rename from rootfs/api/tests/test_config.py rename to rootfs/app/api/tests/test_config.py diff --git a/rootfs/api/tests/test_container.py b/rootfs/app/api/tests/test_container.py similarity index 100% rename from rootfs/api/tests/test_container.py rename to rootfs/app/api/tests/test_container.py diff --git a/rootfs/api/tests/test_domain.py b/rootfs/app/api/tests/test_domain.py similarity index 100% rename from rootfs/api/tests/test_domain.py rename to rootfs/app/api/tests/test_domain.py diff --git a/rootfs/api/tests/test_hooks.py b/rootfs/app/api/tests/test_hooks.py similarity index 100% rename from rootfs/api/tests/test_hooks.py rename to rootfs/app/api/tests/test_hooks.py diff --git a/rootfs/api/tests/test_key.py b/rootfs/app/api/tests/test_key.py similarity index 100% rename from rootfs/api/tests/test_key.py rename to rootfs/app/api/tests/test_key.py diff --git a/rootfs/api/tests/test_limits.py b/rootfs/app/api/tests/test_limits.py similarity index 100% rename from rootfs/api/tests/test_limits.py rename to rootfs/app/api/tests/test_limits.py diff --git a/rootfs/api/tests/test_perm.py b/rootfs/app/api/tests/test_perm.py similarity index 100% rename from rootfs/api/tests/test_perm.py rename to rootfs/app/api/tests/test_perm.py diff --git a/rootfs/api/tests/test_release.py b/rootfs/app/api/tests/test_release.py similarity index 100% rename from rootfs/api/tests/test_release.py rename to rootfs/app/api/tests/test_release.py diff --git a/rootfs/api/tests/test_scheduler.py b/rootfs/app/api/tests/test_scheduler.py similarity index 100% rename from rootfs/api/tests/test_scheduler.py rename to rootfs/app/api/tests/test_scheduler.py diff --git a/rootfs/api/tests/test_users.py b/rootfs/app/api/tests/test_users.py similarity index 100% rename from rootfs/api/tests/test_users.py rename to rootfs/app/api/tests/test_users.py diff --git a/rootfs/api/urls.py b/rootfs/app/api/urls.py similarity index 100% rename from rootfs/api/urls.py rename to rootfs/app/api/urls.py diff --git a/rootfs/api/utils.py b/rootfs/app/api/utils.py similarity index 100% rename from rootfs/api/utils.py rename to rootfs/app/api/utils.py diff --git a/rootfs/api/views.py b/rootfs/app/api/views.py similarity index 100% rename from rootfs/api/views.py rename to rootfs/app/api/views.py diff --git a/rootfs/api/viewsets.py b/rootfs/app/api/viewsets.py similarity index 100% rename from rootfs/api/viewsets.py rename to rootfs/app/api/viewsets.py diff --git a/rootfs/deis/__init__.py b/rootfs/app/deis/__init__.py similarity index 100% rename from rootfs/deis/__init__.py rename to rootfs/app/deis/__init__.py diff --git a/rootfs/deis/context_processors.py b/rootfs/app/deis/context_processors.py similarity index 100% rename from rootfs/deis/context_processors.py rename to rootfs/app/deis/context_processors.py diff --git a/rootfs/templates/gconf.py b/rootfs/app/deis/gconf.py similarity index 62% rename from rootfs/templates/gconf.py rename to rootfs/app/deis/gconf.py index 4724b87d3..3a5310130 100644 --- a/rootfs/templates/gconf.py +++ b/rootfs/app/deis/gconf.py @@ -1,14 +1,5 @@ bind = '0.0.0.0' -try: - workers = int({{ if exists "/deis/controller/workers" }}{{ getv "/deis/controller/workers" }}{{ else }}"not set"{{end}}) - if workers < 1: - raise ValueError() -except (NameError, ValueError): - import multiprocessing - try: - workers = multiprocessing.cpu_count() * 2 + 1 - except NotImplementedError: - workers = 8 +workers = 8 timeout = 1200 pidfile = '/tmp/gunicorn.pid' loglevel = 'info' diff --git a/rootfs/deis/middleware.py b/rootfs/app/deis/middleware.py similarity index 100% rename from rootfs/deis/middleware.py rename to rootfs/app/deis/middleware.py diff --git a/rootfs/deis/settings.py b/rootfs/app/deis/settings.py similarity index 70% rename from rootfs/deis/settings.py rename to rootfs/app/deis/settings.py index 5d0452b45..18739f172 100644 --- a/rootfs/deis/settings.py +++ b/rootfs/app/deis/settings.py @@ -9,9 +9,6 @@ import string import sys import tempfile -import ldap - -from django_auth_ldap.config import LDAPSearch, GroupOfNamesType PROJECT_ROOT = os.path.normpath(os.path.join(os.path.dirname(__file__), '..')) @@ -87,9 +84,6 @@ 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ) -# Make this unique, and don't share it with anybody. -SECRET_KEY = None # @UnusedVariable - # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', @@ -125,14 +119,6 @@ # Python dotted path to the WSGI application used by Django's runserver. WSGI_APPLICATION = 'deis.wsgi.application' -TEMPLATE_DIRS = ( - # Put strings here, like "/home/html/django_templates" - # or "C:/www/django/templates". - # Always use forward slashes, even on Windows. - # Don't forget to use absolute paths, not relative paths. - PROJECT_ROOT + '/web/templates', -) - INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', @@ -143,7 +129,6 @@ 'django.contrib.sites', 'django.contrib.staticfiles', # Third-party apps - 'django_auth_ldap', 'guardian', 'json_field', 'gunicorn', @@ -154,11 +139,9 @@ # Deis apps 'api', 'registry', - 'web', ) AUTHENTICATION_BACKENDS = ( - "django_auth_ldap.backend.LDAPBackend", "django.contrib.auth.backends.ModelBackend", "guardian.backends.ObjectPermissionBackend", ) @@ -298,40 +281,40 @@ # names which apps cannot reserve for routing DEIS_RESERVED_NAMES = ['deis'] -# default scheduler settings -SCHEDULER_MODULE = 'scheduler.mock' -SCHEDULER_TARGET = '' # path to scheduler endpoint (e.g. /var/run/fleet.sock) -SCHEDULER_AUTH = '' -SCHEDULER_OPTIONS = {} +SCHEDULER_MODULE = 'scheduler.k8s' +SCHEDULER_HOST = os.environ.get('KUBERNETES_SERVICE_HOST', 'localhost') +SCHEDULER_PORT = os.environ.get('KUBERNETES_SERVICE_PORT', 443) +SCHEDULER_URL = "{}:{}".format(SCHEDULER_HOST, SCHEDULER_PORT) # security keys and auth tokens -SSH_PRIVATE_KEY = '' # used for SSH connections to facilitate "deis run" SECRET_KEY = os.environ.get('DEIS_SECRET_KEY', 'CHANGEME_sapm$s%upvsw5l_zuy_&29rkywd^78ff(qi') BUILDER_KEY = os.environ.get('DEIS_BUILDER_KEY', 'CHANGEME_sapm$s%upvsw5l_zuy_&29rkywd^78ff(qi') +# docker client settings +DOCKER_URL = os.environ.get('DOCKER_SERVICE_HOST', 'unix://var/run/docker.sock') + # registry settings -REGISTRY_URL = 'http://localhost:5000' -REGISTRY_HOST = 'localhost' -REGISTRY_PORT = 5000 +REGISTRY_HOST = os.environ.get('REGISTRY_SERVICE_HOST', 'localhost') +REGISTRY_PORT = os.environ.get('REGISTRY_SERVICE_PORT', 5000) # logger settings -LOGGER_HOST = 'localhost' -LOGGER_PORT = 8088 +LOGGER_HOST = os.environ.get('LOGGER_SERVICE_HOST', 'localhost') +LOGGER_PORT = os.environ.get('LOGGER_SERVICE_PORT', 8088) # check if we can register users with `deis register` REGISTRATION_ENABLED = True -# check if we should enable the web UI module -WEB_ENABLED = False +# if True, enable the /admin web views +ADMIN_ENABLED = False -# default to sqlite3, but allow postgresql config through envvars DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.' + os.environ.get('DATABASE_ENGINE', 'postgresql_psycopg2'), + 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ.get('DATABASE_NAME', 'deis'), - # randomize test database name so we can run multiple unit tests simultaneously - 'TEST_NAME': "unittest-{}".format(''.join( - random.choice(string.ascii_letters + string.digits) for _ in range(8))) + 'USER': os.environ.get('DATABASE_USER', 'deis'), + 'PASSWORD': os.environ.get('DATABASE_PASSWORD', ''), + 'HOST': os.environ.get('DATABASE_SERVICE_HOST', 'localhost'), + 'PORT': os.environ.get('DATABASE_SERVICE_PORT', 5432), } } @@ -340,80 +323,3 @@ # Honor HTTPS from a trusted proxy # see https://docs.djangoproject.com/en/1.6/ref/settings/#secure-proxy-ssl-header SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') - -# Unit Hostname handling. -# Supports: -# default - Docker generated hostname -# application - Hostname based on application unit name (i.e. my-application.v2.web.1) -# server - Hostname based on CoreOS server hostname -UNIT_HOSTNAME = 'default' - -# LDAP DEFAULT SETTINGS (Overrided by confd later) -LDAP_ENDPOINT = "" -BIND_DN = "" -BIND_PASSWORD = "" -USER_BASEDN = "" -USER_FILTER = "" -GROUP_BASEDN = "" -GROUP_FILTER = "" -GROUP_TYPE = "" - -# Create a file named "local_settings.py" to contain sensitive settings data -# such as database configuration, admin email, or passwords and keys. It -# should also be used for any settings which differ between development -# and production. -# The local_settings.py file should *not* be checked in to version control. -try: - from .local_settings import * # noqa -except ImportError: - pass - -# have confd_settings within container execution override all others -# including local_settings (which may end up in the container) -if os.path.exists('/templates/confd_settings.py'): - sys.path.append('/templates') - from confd_settings import * # noqa - -# Disable swap when mem limits are set, unless Docker is too old -DISABLE_SWAP = '--memory-swap=-1' -try: - version = 'unknown' - from registry.dockerclient import DockerClient - version = DockerClient().client.version().get('Version') - if not semver.validate(version) or semver.Version(version) < semver.Version('1.5.0'): - DISABLE_SWAP = '' -except: - print("Not disabling --memory-swap for Docker version {}".format(version)) - -# LDAP Backend Configuration -# Should be always after the confd_settings import. -LDAP_USER_SEARCH = LDAPSearch( - base_dn=USER_BASEDN, - scope=ldap.SCOPE_SUBTREE, - filterstr="(%s=%%(user)s)" % USER_FILTER -) -LDAP_GROUP_SEARCH = LDAPSearch( - base_dn=GROUP_BASEDN, - scope=ldap.SCOPE_SUBTREE, - filterstr="(%s=%s)" % (GROUP_FILTER, GROUP_TYPE) -) -AUTH_LDAP_SERVER_URI = LDAP_ENDPOINT -AUTH_LDAP_BIND_DN = BIND_DN -AUTH_LDAP_BIND_PASSWORD = BIND_PASSWORD -AUTH_LDAP_USER_SEARCH = LDAP_USER_SEARCH -AUTH_LDAP_GROUP_SEARCH = LDAP_GROUP_SEARCH -AUTH_LDAP_GROUP_TYPE = GroupOfNamesType() -AUTH_LDAP_USER_ATTR_MAP = { - "first_name": "givenName", - "last_name": "sn", - "email": "mail", - "username": USER_FILTER, -} -AUTH_LDAP_GLOBAL_OPTIONS = { - ldap.OPT_X_TLS_REQUIRE_CERT: False, - ldap.OPT_REFERRALS: False -} -AUTH_LDAP_ALWAYS_UPDATE_USER = True -AUTH_LDAP_MIRROR_GROUPS = True -AUTH_LDAP_FIND_GROUP_PERMS = True -AUTH_LDAP_CACHE_GROUPS = False diff --git a/rootfs/deis/urls.py b/rootfs/app/deis/urls.py similarity index 88% rename from rootfs/deis/urls.py rename to rootfs/app/deis/urls.py index e7df3d405..57fa16a43 100644 --- a/rootfs/deis/urls.py +++ b/rootfs/app/deis/urls.py @@ -20,9 +20,8 @@ url(r'^v1/', include('api.urls')), ) -if settings.WEB_ENABLED: +if settings.ADMIN_ENABLED: urlpatterns += patterns( '', - url(r'^', include('web.urls')), url(r'^admin/', include(admin.site.urls)), ) diff --git a/rootfs/deis/wsgi.py b/rootfs/app/deis/wsgi.py similarity index 100% rename from rootfs/deis/wsgi.py rename to rootfs/app/deis/wsgi.py diff --git a/rootfs/dev_requirements.txt b/rootfs/app/dev_requirements.txt similarity index 100% rename from rootfs/dev_requirements.txt rename to rootfs/app/dev_requirements.txt diff --git a/rootfs/manage.py b/rootfs/app/manage.py similarity index 100% rename from rootfs/manage.py rename to rootfs/app/manage.py diff --git a/rootfs/registry/__init__.py b/rootfs/app/registry/__init__.py similarity index 100% rename from rootfs/registry/__init__.py rename to rootfs/app/registry/__init__.py diff --git a/rootfs/registry/dockerclient.py b/rootfs/app/registry/dockerclient.py similarity index 98% rename from rootfs/registry/dockerclient.py rename to rootfs/app/registry/dockerclient.py index 0bc2b2d5b..69d3dc453 100644 --- a/rootfs/registry/dockerclient.py +++ b/rootfs/app/registry/dockerclient.py @@ -19,7 +19,7 @@ class DockerClient(object): FLOCKFILE = '/tmp/controller-pull' def __init__(self): - self.client = docker.Client(version='auto') + self.client = docker.Client(base_url=settings.DOCKER_URL, version='auto') self.registry = settings.REGISTRY_HOST + ':' + str(settings.REGISTRY_PORT) def publish_release(self, source, config, target, deis_registry): diff --git a/rootfs/registry/models.py b/rootfs/app/registry/models.py similarity index 100% rename from rootfs/registry/models.py rename to rootfs/app/registry/models.py diff --git a/rootfs/registry/tests.py b/rootfs/app/registry/tests.py similarity index 100% rename from rootfs/registry/tests.py rename to rootfs/app/registry/tests.py diff --git a/rootfs/requirements.txt b/rootfs/app/requirements.txt similarity index 89% rename from rootfs/requirements.txt rename to rootfs/app/requirements.txt index 94048c58a..e518ad59d 100644 --- a/rootfs/requirements.txt +++ b/rootfs/app/requirements.txt @@ -6,7 +6,6 @@ django-cors-headers==1.0.0 django-fsm==2.2.0 django-guardian==1.2.5 django-json-field==0.5.7 -django-auth-ldap==1.2.5 djangorestframework==3.0.5 docker-py==1.5.0 gunicorn==19.3.0 @@ -14,7 +13,6 @@ marathon==0.6.15 paramiko==1.15.2 psycopg2==2.6.1 python-etcd==0.3.2 -python-ldap==2.4.19 PyYAML==3.11 semantic_version==2.4.2 simpleflock==0.0.2 diff --git a/rootfs/scheduler/__init__.py b/rootfs/app/scheduler/__init__.py similarity index 100% rename from rootfs/scheduler/__init__.py rename to rootfs/app/scheduler/__init__.py diff --git a/rootfs/scheduler/chaos.py b/rootfs/app/scheduler/chaos.py similarity index 100% rename from rootfs/scheduler/chaos.py rename to rootfs/app/scheduler/chaos.py diff --git a/rootfs/scheduler/k8s.py b/rootfs/app/scheduler/k8s.py similarity index 100% rename from rootfs/scheduler/k8s.py rename to rootfs/app/scheduler/k8s.py diff --git a/rootfs/scheduler/mock.py b/rootfs/app/scheduler/mock.py similarity index 100% rename from rootfs/scheduler/mock.py rename to rootfs/app/scheduler/mock.py diff --git a/rootfs/scheduler/states.py b/rootfs/app/scheduler/states.py similarity index 100% rename from rootfs/scheduler/states.py rename to rootfs/app/scheduler/states.py diff --git a/rootfs/setup.cfg b/rootfs/app/setup.cfg similarity index 100% rename from rootfs/setup.cfg rename to rootfs/app/setup.cfg diff --git a/rootfs/bin/boot b/rootfs/bin/boot index c23ff6f47..e14a03be6 100755 --- a/rootfs/bin/boot +++ b/rootfs/bin/boot @@ -9,150 +9,17 @@ set -eo pipefail # set debug based on envvar [[ $DEBUG ]] && set -x -# configure etcd -export ETCD_PORT=${DEIS_ETCD_1_SERVICE_PORT_CLIENT:-4001} -export ETCD_HOST=${DEIS_ETCD_1_SERVICE_HOST:-$HOST} -export ETCD="$ETCD_HOST:$ETCD_PORT" -export ETCD_PATH=${ETCD_PATH:-/deis/controller} -export ETCD_TTL=${ETCD_TTL:-20} - -# wait for etcd to be available -until etcdctl --no-sync -C "$ETCD" ls >/dev/null 2>&1; do - echo "waiting for etcd at $ETCD..." - sleep $((ETCD_TTL/2)) # sleep for half the TTL -done - -# wait until etcd has discarded potentially stale values -sleep $((ETCD_TTL+1)) - -function etcd_set_default { - set +e - ERROR="$(etcdctl --no-sync -C "$ETCD" mk "$ETCD_PATH/$1" "$2" 2>&1)" - if [[ $? -ne 0 ]] && echo "$ERROR" | grep -iqve "key already exists"; then - echo "etcd_set_default: an etcd error occurred ($ERROR)" - echo "aborting..." - exit 1 - fi - set -e -} - -function etcd_safe_mkdir { - set +e - ERROR="$(etcdctl --no-sync -C "$ETCD" mkdir "$1" 2>&1)" - - if [[ $? -ne 0 ]] && echo "$ERROR" | grep -iqve "key already exists"; then - echo "etcd_safe_mkdir: an etcd error occurred ($ERROR)" - echo "aborting..." - exit 1 - fi - set -e -} - -etcd_set_default protocol "${DEIS_PROTOCOL:-http}" -etcd_set_default secretKey "${DEIS_SECRET_KEY:-$(openssl rand -base64 64 | tr -d '\n')}" -etcd_set_default builderKey "${DEIS_BUILDER_KEY:-$(openssl rand -base64 64 | tr -d '\n')}" -etcd_set_default registrationMode "enabled" -etcd_set_default webEnabled 0 -etcd_set_default unitHostname default - -# safely create required keyspaces -etcd_safe_mkdir /deis/domains -etcd_safe_mkdir /deis/platform -etcd_safe_mkdir /deis/scheduler -etcd_safe_mkdir /deis/services - -# HACK: set up keys for database -etcd_safe_mkdir /deis/database -ETCD_PATH=/deis/database etcd_set_default engine postgresql_psycopg2 -ETCD_PATH=/deis/database etcd_set_default name deis -ETCD_PATH=/deis/database etcd_set_default user deis -ETCD_PATH=/deis/database etcd_set_default password changeme123 -ETCD_PATH=/deis/database etcd_set_default host "${DEIS_DATABASE_SERVICE_HOST:-127.0.0.1}" -ETCD_PATH=/deis/database etcd_set_default port "${DEIS_DATABASE_SERVICE_PORT:-5432}" - -# HACK: set up keys for logs -etcd_safe_mkdir /deis/logs -ETCD_PATH=/deis/logs etcd_set_default host "${DEIS_LOGS_SERVICE_HOST:-127.0.0.1}" - -# HACK: set up keys for platform -etcd_safe_mkdir /deis/platform -ETCD_PATH=/deis/platform etcd_set_default domain localhost - -# HACK: set up keys for registry -etcd_safe_mkdir /deis/registry -ETCD_PATH=/deis/registry etcd_set_default protocol "${DEIS_REGISTRY_SERVICE_PROTOCOL:-http}" -ETCD_PATH=/deis/registry etcd_set_default host "${DEIS_REGISTRY_SERVICE_HOST:-127.0.0.1}" -ETCD_PATH=/deis/registry etcd_set_default port "${DEIS_REGISTRY_SERVICE_PORT:-5000}" - -# run etcd data migrations -echo "controller: running etcd data migrations..." -for script in /app/migrations/data/*.sh; -do - # shellcheck disable=SC1090 - . "$script"; -done -echo "controller: done running etcd data migrations." - -# wait for confd to run once and install initial templates -until confd -onetime -node "$ETCD" --confdir /app --log-level error; do - echo "controller: waiting for confd to write initial templates..." - sleep $((ETCD_TTL/2)) # sleep for half the TTL -done - -cd /app - -mkdir -p /data/logs -chmod 777 /data/logs - -# allow deis user permission to Docker -if addgroup -g "$(stat -c "%g" /var/run/docker.sock)" docker; then - addgroup deis docker +# allow deis user permission to Docker if the socket is present +if [ -f /var/run/docker.sock ]; then + if addgroup -g "$(stat -c "%g" /var/run/docker.sock)" docker; then + addgroup deis docker + fi fi # run an idempotent database migration sudo -E -u deis ./manage.py syncdb --migrate --noinput -# spawn a gunicorn server in the background -sudo -E -u deis gunicorn -c deis/gconf.py deis.wsgi & - ./manage.py load_db_state_to_etcd -# smart shutdown on SIGTERM (SIGINT is handled by gunicorn) -function on_exit() { - GUNICORN_PID=$(cat /tmp/gunicorn.pid) - kill -TERM "$GUNICORN_PID" 2>/dev/null - wait "$GUNICORN_PID" 2>/dev/null - exit 0 -} -trap on_exit TERM - -# spawn confd in the background to update services based on etcd changes -confd -node "$ETCD" --confdir /app --log-level error --interval 5 & - -echo deis-controller running... - -# publish the service to etcd using the injected EXTERNAL_PORT -if [[ ! -z $EXTERNAL_PORT ]]; then - - # configure service discovery - PORT=${PORT:-8000} - PROTO=${PROTO:-tcp} - - set +e - - # wait for the service to become available on PORT - sleep 1 && while [[ -z $(netstat -lnt | awk "\$6 == \"LISTEN\" && \$4 ~ \".$PORT\" && \$1 ~ \"$PROTO.?\"") ]] ; do sleep 1; done - - # while the port is listening, publish to etcd - while [[ ! -z $(netstat -lnt | awk "\$6 == \"LISTEN\" && \$4 ~ \".$PORT\" && \$1 ~ \"$PROTO.?\"") ]] ; do - etcdctl --no-sync -C "$ETCD" set "$ETCD_PATH/host" "$HOST" --ttl "$ETCD_TTL" >/dev/null - etcdctl --no-sync -C "$ETCD" set "$ETCD_PATH/port" "$EXTERNAL_PORT" --ttl "$ETCD_TTL" >/dev/null - sleep $((ETCD_TTL/2)) # sleep for half the TTL - done - - # if the loop quits, something went wrong - exit 1 - -fi - -wait +# run the controller +exec sudo -E -u deis gunicorn -c deis/gconf.py deis.wsgi & diff --git a/rootfs/bin/reload b/rootfs/bin/reload deleted file mode 100755 index 1ce458cb9..000000000 --- a/rootfs/bin/reload +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -# gracefully reload gunicorn -kill -HUP "$(cat /tmp/gunicorn.pid)" - -exit 0 diff --git a/rootfs/build.sh b/rootfs/build.sh deleted file mode 100755 index 80e50fdf0..000000000 --- a/rootfs/build.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash - -# fail on any command exiting non-zero -set -eo pipefail - -if [[ -z $DOCKER_BUILD ]]; then - echo - echo "Note: this script is intended for use by the Dockerfile and not as a way to build the controller locally" - echo - exit 1 -fi - -# install required system packages -# HACK: install git so we can install bacongobbler's fork of django-fsm -apk add --update-cache \ - build-base \ - git \ - libffi-dev \ - libpq \ - openldap \ - openldap-dev \ - postgresql-dev \ - python \ - python-dev - -# install pip -curl -sSL https://raw.githubusercontent.com/pypa/pip/7.0.3/contrib/get-pip.py | python - - -# add a deis user -adduser deis -D -h /app -s /bin/bash - -# create a /app directory for storing application data -mkdir -p /app && chown -R deis:deis /app - -# create directory for confd templates -mkdir -p /templates && chown -R deis:deis /templates - -# install dependencies -pip install --disable-pip-version-check --no-cache-dir -r /app/requirements.txt - -# cleanup. -apk del --purge \ - build-base \ - git \ - libffi-dev \ - openldap-dev \ - postgresql-dev \ - python-dev -rm -rf /var/cache/apk/* diff --git a/rootfs/conf.d/confd_settings.toml b/rootfs/conf.d/confd_settings.toml deleted file mode 100644 index c6c8f5b15..000000000 --- a/rootfs/conf.d/confd_settings.toml +++ /dev/null @@ -1,16 +0,0 @@ -[template] -src = "confd_settings.py" -dest = "/templates/confd_settings.py" -uid = 1000 -gid = 1000 -mode = "0640" -keys = [ - "/deis/controller", - "/deis/database", - "/deis/registry", - "/deis/domains", - "/deis/platform", - "/deis/scheduler", - "/deis/logs", -] -reload_cmd = "/app/bin/reload" diff --git a/rootfs/conf.d/gconf.toml b/rootfs/conf.d/gconf.toml deleted file mode 100644 index ceb9326e7..000000000 --- a/rootfs/conf.d/gconf.toml +++ /dev/null @@ -1,10 +0,0 @@ -[template] -src = "gconf.py" -dest = "/app/deis/gconf.py" -uid = 1000 -gid = 1000 -mode = "0640" -keys = [ - "/deis/controller", -] -reload_cmd = "/app/bin/reload" diff --git a/rootfs/migrations/data/0001.sh b/rootfs/migrations/data/0001.sh deleted file mode 100755 index fccfb19b9..000000000 --- a/rootfs/migrations/data/0001.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -ETCDCTL="etcdctl -C $ETCD" - -if [[ "$($ETCDCTL get /deis/migrations/data/0001 2> /dev/null)" != "done" ]]; -then - for i in $($ETCDCTL ls /deis/domains 2> /dev/null); - do - for j in $($ETCDCTL get "$i"); - do - $ETCDCTL set "/deis/domains/$j" "$(basename "$i")" 1> /dev/null; - echo "migrated $j" - done; - $ETCDCTL rm "$i"; - done - $ETCDCTL set /deis/migrations/data/0001 "done" -fi diff --git a/rootfs/migrations/data/0002.sh b/rootfs/migrations/data/0002.sh deleted file mode 100755 index 83d2c8a15..000000000 --- a/rootfs/migrations/data/0002.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -ETCDCTL="etcdctl -C $ETCD" - -# April 8, 2015: If registrationEnabled key exists, migrate it to registrationMode and delete it. - -if [[ "$($ETCDCTL get /deis/migrations/data/0002 2> /dev/null)" != "done" ]]; -then - if $ETCDCTL ls /deis/controller | grep -q '/deis/controller/registrationEnabled' - then - if [[ "$($ETCDCTL get /deis/controller/registrationEnabled 2> /dev/null)" == "false" ]] - then - $ETCDCTL set /deis/controller/registrationMode "disabled" - else - $ETCDCTL set /deis/controller/registrationMode "enabled" - fi - - $ETCDCTL rm /deis/controller/registrationEnabled - else - echo "registrationEnabled key doesn't exist, skipping migration" - fi - - $ETCDCTL set /deis/migrations/data/0002 "done" -fi diff --git a/rootfs/templates/confd_settings.py b/rootfs/templates/confd_settings.py deleted file mode 100644 index 390e78a40..000000000 --- a/rootfs/templates/confd_settings.py +++ /dev/null @@ -1,58 +0,0 @@ -# security keys and auth tokens -SECRET_KEY = '{{ getv "/deis/controller/secretKey" }}' -BUILDER_KEY = '{{ getv "/deis/controller/builderKey" }}' - -# scheduler settings -SCHEDULER_MODULE = 'scheduler.k8s' -SCHEDULER_URL = 'kubernetes' - -# base64-encoded SSH private key to facilitate current version of "deis run" -SSH_PRIVATE_KEY = """{{ if exists "/deis/platform/sshPrivateKey" }}{{ getv "/deis/platform/sshPrivateKey" }}{{ else }}""{{end}}""" - -# platform domain must be provided -DEIS_DOMAIN = '{{ getv "/deis/platform/domain" }}' - -# use the private registry module -REGISTRY_URL = '{{ getv "/deis/registry/protocol" }}://{{ getv "/deis/registry/host" }}:{{ getv "/deis/registry/port" }}' # noqa -REGISTRY_HOST = '{{ getv "/deis/registry/host" }}' -REGISTRY_PORT = '{{ getv "/deis/registry/port" }}' - -# default to sqlite3, but allow postgresql config through envvars -# 'ENGINE': 'django.db.backends.{{ getv "/deis/database/engine" }}', -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': '{{ getv "/deis/database/name" }}', - 'USER': '{{ getv "/deis/database/user" }}', - 'PASSWORD': '{{ getv "/deis/database/password" }}', - 'HOST': '{{ getv "/deis/database/host" }}', - 'PORT': '{{ getv "/deis/database/port" }}', - } -} - -LOGGER_HOST = '{{ getv "/deis/logs/host"}}' - -{{ if exists "/deis/controller/registrationMode" }} -REGISTRATION_MODE = '{{ getv "/deis/controller/registrationMode" }}' -{{ end }} - -{{ if exists "/deis/controller/webEnabled" }} -WEB_ENABLED = bool({{ getv "/deis/controller/webEnabled" }}) -{{ end }} - -{{ if exists "/deis/controller/subdomain" }} -DEIS_RESERVED_NAMES = ['{{ getv "/deis/controller/subdomain" }}'] -{{ end }} - -# AUTH -# LDAP -{{ if exists "/deis/controller/auth/ldap/endpoint" }} -LDAP_ENDPOINT = '{{ if exists "/deis/controller/auth/ldap/endpoint" }}{{ getv "/deis/controller/auth/ldap/endpoint"}}{{ else }} {{ end }}' -BIND_DN = '{{ if exists "/deis/controller/auth/ldap/bind/dn" }}{{ getv "/deis/controller/auth/ldap/bind/dn"}}{{ else }} {{ end }}' -BIND_PASSWORD = '{{ if exists "/deis/controller/auth/ldap/bind/password" }}{{ getv "/deis/controller/auth/ldap/bind/password"}}{{ else }} {{ end }}' -USER_BASEDN = '{{ if exists "/deis/controller/auth/ldap/user/basedn" }}{{ getv "/deis/controller/auth/ldap/user/basedn"}}{{ else }} {{ end }}' -USER_FILTER = '{{ if exists "/deis/controller/auth/ldap/user/filter" }}{{ getv "/deis/controller/auth/ldap/user/filter"}}{{ else }} {{ end }}' -GROUP_BASEDN = '{{ if exists "/deis/controller/auth/ldap/group/basedn" }}{{ getv "/deis/controller/auth/ldap/group/basedn"}}{{ else }} {{ end }}' -GROUP_FILTER = '{{ if exists "/deis/controller/auth/ldap/group/filter" }}{{ getv "/deis/controller/auth/ldap/group/filter"}}{{ else }} {{ end }}' -GROUP_TYPE = '{{ if exists "/deis/controller/auth/ldap/group/type" }}{{ getv "/deis/controller/auth/ldap/group/type"}}{{ else }} {{ end }}' -{{ end }} diff --git a/rootfs/web/__init__.py b/rootfs/web/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/rootfs/web/fixtures/test_web.json b/rootfs/web/fixtures/test_web.json deleted file mode 100644 index 36ebbf687..000000000 --- a/rootfs/web/fixtures/test_web.json +++ /dev/null @@ -1,66 +0,0 @@ -[ -{ - "pk": -1, - "model": "auth.user", - "fields": { - "username": "AnonymousUser", - "first_name": "", - "last_name": "", - "is_active": true, - "is_superuser": false, - "is_staff": false, - "last_login": "2013-11-25T21:33:19.120Z", - "groups": [], - "user_permissions": [], - "password": "", - "email": "", - "date_joined": "2013-11-25T21:33:19.120Z" - } -}, -{ - "pk": 2, - "model": "auth.user", - "fields": { - "username": "autotest-1", - "first_name": "", - "last_name": "", - "is_active": true, - "is_superuser": false, - "is_staff": false, - "last_login": "2013-11-25T21:58:47.420Z", - "groups": [], - "user_permissions": [], - "password": "pbkdf2_sha256$10000$SLr4X1T9L3QA$NB4d4a0d+3NZuAwLbdnKGb2z3P/hQrKQHVaGG3zAaMw=", - "email": "autotest@deis.io", - "date_joined": "2013-11-25T21:58:46.208Z" - } -}, -{ - "pk": 3, - "model": "auth.user", - "fields": { - "username": "autotest-2", - "first_name": "", - "last_name": "", - "is_active": true, - "is_superuser": false, - "is_staff": false, - "last_login": "2013-11-25T21:59:31.404Z", - "groups": [], - "user_permissions": [], - "password": "pbkdf2_sha256$10000$FrfwTVAtWPMD$HUfDokMeY37YshdyS3uhDZ+d/r8galU7kNuBfZxJl2s=", - "email": "autotest@deis.io", - "date_joined": "2013-11-25T21:59:30.760Z" - } -}, -{ - "pk": "5a09a1e0-a27e-4839-928b-449310ed90f0", - "model": "api.app", - "fields": { - "updated": "2013-11-25T22:09:36.726Z", - "created": "2013-11-25T22:09:36.726Z", - "owner": 2, - "id": "autotest-1-app" - } -} -] diff --git a/rootfs/web/models.py b/rootfs/web/models.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/rootfs/web/static/css/bootstrap-responsive.min.css b/rootfs/web/static/css/bootstrap-responsive.min.css deleted file mode 100644 index 8bca63fcc..000000000 --- a/rootfs/web/static/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}/*@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}*/@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}/*@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}*/ diff --git a/rootfs/web/static/css/bootstrap.min.css b/rootfs/web/static/css/bootstrap.min.css deleted file mode 100644 index f50f67640..000000000 --- a/rootfs/web/static/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/rootfs/web/static/css/deis-controller.css b/rootfs/web/static/css/deis-controller.css deleted file mode 100644 index 08343f81e..000000000 --- a/rootfs/web/static/css/deis-controller.css +++ /dev/null @@ -1 +0,0 @@ -.social-menu {margin: 20px 0 20px 15px;} diff --git a/rootfs/web/static/css/deis-docs.css b/rootfs/web/static/css/deis-docs.css deleted file mode 100644 index a5e6bf2ae..000000000 --- a/rootfs/web/static/css/deis-docs.css +++ /dev/null @@ -1,32 +0,0 @@ - -a.headerlink { - visibility: hidden; - margin-left: 8px; - vertical-align: middle; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink { - visibility: visible; -} - -span.viewcode-link { - font-size: 10px; - margin-left: 6px; - vertical-align: super; -} - -a.viewcode-back { - font-size: 10px; - margin-right: 6px; - vertical-align: super; -} - -blockquote { - border-left: none; -} diff --git a/rootfs/web/static/css/main.css b/rootfs/web/static/css/main.css deleted file mode 100644 index 2cf7c52cb..000000000 --- a/rootfs/web/static/css/main.css +++ /dev/null @@ -1,702 +0,0 @@ -footer { - display: none; - width: 201px; -} -.testClass { - padding: 0; - margin: 0; -} -h1, h2, h3, h4, h5, h6 { - font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; - font-weight: 300; -} -h1 { - display: inline-block; - padding: 50px 0 45px 0; - margin-bottom: 21px; - font-size: 36px; -} -h2 { - margin-top: 48px; - margin-bottom: 24px; - font-size: 36px; -} -h3 { - font-size: 16px; - font-weight: 300; -} -h4 { - margin: 50px 0 50px 0; - font-size: 28px; - font-style: italic; - line-height: normal; - color: #999; -} -a { - font-family: helvetica; - font-size: 16px; - font-weight: 300; - text-decoration: underline; - border: 0!important; -} -p { - font-family: helvetica; - font-size: 16px; - line-height: 22px; -} -img { - border: 0!important; -} -.fork { - float: right; -} -.fork .forkImage { - width: 103px; - height: 58px; - background: url(../img/fork.png); -} -.fork .forkImage:hover { - background: url(../img/fork.png) 0 -58px; -} -a.get-deis-link { - font-size: 28px; - font-style: italic; - line-height: normal; - color: #999!important; - text-decoration: none; -} -a.get-deis-link:hover { - color: #00aeff!important; - text-decoration: none; -} -.main-fork { - position: absolute; - right: 0; - z-index: 999; -} -.menu { - padding-right: 0; -} -.menu .divider { - margin: 0; - background: #ccc; - border-bottom: 0; -} -.menu a { - text-decoration: none; -} -.menu a .logo { - padding-top: 50px; - padding-bottom: 49px; -} -.menu a:hover { - background: none!important; -} -.nav-border { - border-right: solid 1px #ccc; -} -#video { - height: 390px; -} -.navitem { - padding: 0; -} -.navitem.selected.pink { - color: #ff135a; - border-right: solid 5px #ff135a; -} -.navitem.selected.pink a:hover { - color: #ff135a!important; -} -.navitem.selected.green { - color: #00bd50; - border-right: solid 5px #00bd50; -} -.navitem.selected.green a:hover { - color: #00bd50!important; -} -.navitem.selected.blue { - color: #00aeff; - border-right: solid 5px #00aeff; -} -.navitem.selected.blue a:hover { - color: #00aeff!important; -} -.navitem.overview:hover { - color: #00bd50; - border-right: solid 5px #00bd50; -} -.navitem.overview:hover a { - color: #00bd50; -} -.navitem.get-deis:hover { - color: #00aeff; - border-right: solid 5px #00aeff; -} -.navitem.get-deis:hover a { - color: #00aeff; -} -.navitem.get-involved:hover { - color: #ff135a; - border-right: solid 5px #ff135a; -} -.navitem.get-involved:hover a { - color: #ff135a; -} -.navitem.documentation:hover { - color: #00bd50; - border-right: solid 5px #00bd50; -} -.navitem.documentation:hover a { - color: #00bd50; -} -.navitem.blog:hover { - color: #00aeff; - border-right: solid 5px #00aeff; -} -.navitem.blog:hover a { - color: #00aeff; -} -.navitem a { - width: 227px; - padding-top: 26px!important; - padding-right: 0!important; - padding-bottom: 26px!important; - color: #999; -} -.navitem a:hover { - background: none!important; -} -.social-menu { - height: 34px; - margin: 0 0 28px 15px; -} -.social-menu a { - border: 0; -} -.social-menu a:hover { - border: 0; -} -.social-menu a span { - display: inline-block; - float: left; - width: 34px; - height: 33px; -} -.social-menu a span.twitter { - margin-right: 4px; - background: url(../img/social.png) 0 0; -} -.social-menu a span.twitter:hover { - background: url(../img/social.png) 0 -33px; -} -.social-menu a span.irc { - margin-right: 4px; - background: url(../img/social.png) -37px 0; -} -.social-menu a span.irc:hover { - background: url(../img/social.png) -37px -33px; -} -.social-menu a span.github { - margin-right: 4px; - background: url(../img/social.png) -74px 0; -} -.social-menu a span.github:hover { - background: url(../img/social.png) -74px -33px; -} -.social-menu a span.stack { - background: url(../img/social.png) -110px 0; -} -.social-menu a span.stack:hover { - background: url(../img/social.png) -110px -33px; -} -.byline-menu { - height: 34px; - margin-left: 15px; -} -.byline-menu a { - font-size: 12px; - line-height: 16px; - color: #ccc; - text-decoration: none; - border: 0; -} -.byline-menu a:hover { - color: #00aeff; - text-decoration: none; - border: 0; -} -.byline-menu span { - display: inline-block; - float: left; - width: 36px; - height: 33px; -} -.byline-menu span.cloud-logo { - margin-right: 15px; - background: url(../img/social.png) -143px 0; -} -.byline-menu p { - font-size: 12px; - line-height: 16px; - color: #ccc; -} -.home p { - line-height: 25px; - color: #ff135a; -} -.home img.cover-image { - padding-top: 165px; - padding-left: 100px; -} -.overview img { - width: 165px; - margin-top: 35px; - margin-left: 72px; -} -div.navigation-left { - float: left; -} -div.navigation-right { - float: right; -} -.pink a { - color: #ff135a; -} -.pink a:hover { - color: #999; -} -.pink h1 { - color: #ff135a; - border-bottom: solid 1px #ff135a; -} -.pink h2 { - color: #ff135a; -} -.pink h3 { - color: #ff135a; -} -.green a { - color: #00bd50; -} -.green a:hover { - color: #999; -} -.green h1 { - color: #00bd50; - border-bottom: solid 1px #00bd50; -} -.green h2 { - color: #00bd50; -} -.green h3 { - color: #00bd50; -} -.blue a { - color: #00aeff; -} -.blue a:hover { - color: #999; -} -.blue h1 { - color: #00aeff; - border-bottom: solid 1px #00aeff; -} -.blue h2 { - color: #00aeff; -} -.blue h3 { - color: #00aeff; -} -pre, code pre { - padding-top: 30px; - padding-bottom: 30px; - padding-left: 30px; - font-size: 12px; - color: #fff; - background-color: #00aeff; - border: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.gd-code p { - font-size: 15px; -} -.gd-code a { - font-size: 15px; -} -.spacer { - margin-bottom: 10px; -} -.spacer2 { - margin-bottom: 14px; -} -.social-container { - height: 330px; -} -.gi { - width: 434px; - height: 285px; -} -.gi.twitter { - float: left; - width: 436px; - height: 286px; - background: url(../img/large-social.png) 0 0; -} -.gi.twitter:hover { - background: url(../img/large-social.png) 0 -571px; -} -.gi.irc { - float: left; - height: 286px; - background: url(../img/large-social.png) -436px 0; -} -.gi.irc:hover { - background: url(../img/large-social.png) -436px -571px; -} -.gi.github { - float: left; - width: 436px; - background: url(../img/large-social.png) 0 -286px; -} -.gi.github:hover { - background: url(../img/large-social.png) 0 -857px; -} -.gi.stack { - float: left; - background: url(../img/large-social.png) -436px -286px; -} -.gi.stack:hover { - background: url(../img/large-social.png) -436px -857px; -} -.author-only { - padding-top: 16px; -} -.blog-social { - margin-top: 50px; -} -.blog-social .blog { - width: 32px; - height: 32px; -} -.blog-social .blog.facebook { - float: left; - margin-right: 5px; - background: url(../img/blog-social.png) 0 0; -} -.blog-social .blog.facebook:hover { - background: url(../img/blog-social.png) 0 -32px; -} -.blog-social .blog.twitter { - float: left; - margin-right: 5px; - background: url(../img/blog-social.png) -37px 0; -} -.blog-social .blog.twitter:hover { - background: url(../img/blog-social.png) -37px -32px; -} -.blog-social .blog.google-plus { - float: left; - background: url(../img/blog-social.png) -74px 0; -} -.blog-social .blog.google-plus:hover { - background: url(../img/blog-social.png) -74px -32px; -} -.blog-social .time { - display: inline-block; - padding-top: 7px; - padding-left: 30px; - color: #ccc; -} -.blog-social .time p { - display: inline; - padding-top: 5px; - font-weight: 300; -} -.blog-social .blog-tags { - padding-left: 86px; -} -.blog-social .blog-tags a { - color: #00aeff; - text-decoration: none; -} -.blog-social .blog-tags a:hover { - color: #999; -} -.blog a h1:hover { - color: #999; - border-bottom: solid 1px #999; -} -.blog-nav a { - display: inline-block; - padding: 23px 23px 23px 23px; - margin: 100px 5px 14px 0; - color: #fff; - text-decoration: none; - background-color: #00aeff; -} -.blog-nav a:hover { - background-color: #999; -} -.bio { - margin-top: 80px; -} -.bio .bio-pic { - float: left; -} -.bio .bio-info { - float: left; - width: 230px; - height: 98px; - padding-right: 30px; - margin-left: 20px; - border-right: solid 2px #ccc; -} -.bio .bio-info p { - margin-bottom: 0; - font-size: 12px; - line-height: 18px; -} -.bio .bio-info a { - font-size: 12px; - color: #00aeff; - text-decoration: none; -} -.bio .bio-info .bio-name { - font-weight: 600; -} -.bio .bio-info .bio-twitter { - margin-bottom: 0; -} -.bio .bio-links { - float: left; - margin-left: 30px; -} -.bio .bio-links a { - display: block; - font-size: 12px; - color: #00aeff; - text-decoration: none; -} -.bio .bio-links .inline { - display: inline; -} -.asciicast iframe { - height: 400px!important; -} -.content { - padding-bottom: 50px; -} -.doc-content { - padding-bottom: 50px; -} -.doc-content h1 { - height: 40px!important; - color: #00bd50; - border-bottom: solid 1px #00bd50; -} -.doc-content h2 { - color: #00bd50; -} -.doc-content h3 { - color: #00bd50; -} -.doc-content a, .doc-content a em, .doc-content em { - font-style: normal!imporant; - color: #00bd50!important; -} -.doc-content a:hover, .doc-content a em:hover, .doc-content em:hover { - color: #999!important; -} -.doc-content pre, .doc-content code pre { - color: #000!important; - background-color: #f5f5f5!important; -} -.doc-content .admonition { - padding: 10px; - margin-bottom: 10px; - border: solid 4px #00bd50; -} -.doc-content .admonition .admonition-title { - font-size: 18px; - font-weight: bold; - line-height: 26px; - text-indent: 50px; -} -.doc-content .warning { - border: solid 4px #F93; -} -.doc-content .warning .admonition-title { - background: url(../img/glyphs.png) no-repeat; -} -.doc-content .note .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -25px; -} -.doc-content .tip .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -53px; -} -.doc-content .important .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -81px; -} -.doc-content .hint .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -108px; -} -.doc-content .attention .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -135px; -} -.doc-content .caution .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -160px; -} -.doc-content .danger .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -186px; -} -.doc-content .error .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -218px; -} -.docs-sidebar { - position: absolute; - right: 0; - width: 195px!important; - min-height: 600px; - padding-bottom: 50px; - margin-left: 105px!important; -} -.docs-sidebar .docs-border { - margin: 145px 0 30px 0; - border-top: 1px solid #999; -} -.docs-sidebar .toctree-l1 ul { - display: none; -} -.docs-sidebar ul, .docs-sidebar li { - margin: 0; - list-style: none; -} -.docs-sidebar li.toctree-l1 { - margin-bottom: 20px; -} -.docs-sidebar li.toctree-l1 a { - color: #00bd50; - text-decoration: none; -} -.docs-sidebar li.toctree-l2.current:before { - content: "• "; - color: #00bd50; -} -.docs-sidebar li.toctree-l2 { - margin-top: 10px; -} -.docs-sidebar li.toctree-l2 a { - font-size: 16px; - color: #999; - text-decoration: none; -} -.searchbox { - width: 134px!important; - height: 54px!important; - padding-left: 50px!important; - font-family: helvetica!important; - font-size: 16px!important; - font-weight: 300!important; - color: white!important; - background: url(../img/mag_glass.png) no-repeat 15px 21px #ccc!important; - border: 0!important; - border-left: 5px solid #00bd50!important; - border-radius: 0!important; - border-shadow: none!important; -} -table.docutils { - border-spacing: 5px; -} -table.docutils td { - padding: 5px; -} -#notfound { - display: block; - width: 175px!important; - margin-top: 178px!important; -} -em { - font-style: normal!important; -} -.mc_merge_var, .mc_signup_submit { - float: left; -} -#mc_mv_EMAIL { - width: 211px!important; - height: 30px!important; - margin-bottom: 0; - font-family: helvetica!important; - font-size: 12px!important; - font-weight: 400!important; - color: #333!important; - border: 1px solid #ff135a; -} -.mc_merge_var input { - font-family: helvetica!important; - font-size: 12px!important; - font-weight: 400!important; - color: #333!important; -} -textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input { - -webkit-box-shadow: none!important; - -moz-box-shadow: none!important; - box-shadow: none!important; - -webkit-transition: none!important; - -moz-transition: none!important; - -o-transition: none!important; - transition: none!important; -} -.mc_signup_submit { - margin-top: 5px; - margin-left: 10px; -} -#mc_signup_submit { - width: 49px!important; - padding: 6px 14px 4px 14px; - margin-top: 2px!important; - font-family: helvetica; - font-size: 12px; - color: #fff; - background: #ff135a; - border: 0; -} -.mailchimp form { - margin-bottom: 0; -} -.mailchimp p { - margin: 0; -} -#mc_message strong { - font-family: helvetica; - font-size: 12px; - font-weight: 400!important; - color: #333!important; -} -.mc_error_msg { - font-family: helvetica; - font-size: 12px; - font-weight: 400!important; - color: #333!important; -} -.mc_error_msg a { - font-size: 12px; - color: #ff135a; -} -.highlight-link { - display: none; -} -.rtd-docs br { - display: none!important; -} -@media(max-width:767px) { - .main-fork { - left: 1000px!important; -} -}@media(max-width:480px) { - .main-fork { - left: 1000px!important; -} -} diff --git a/rootfs/web/static/favicon.ico b/rootfs/web/static/favicon.ico deleted file mode 100644 index fdc7e80cf9247e09528df32b755709c79a4ec6ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 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 Sbi9)GxiT>{GblRka_wL3a`OWK diff --git a/rootfs/web/static/img/aws-ec2.png b/rootfs/web/static/img/aws-ec2.png deleted file mode 100644 index 1d27b839625c942a46ada0bef3bd60afaeae15d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14401 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 C-N)7d diff --git a/rootfs/web/static/img/blog-social.png b/rootfs/web/static/img/blog-social.png deleted file mode 100644 index a379db88a924d79c262b43c6927c0d599fe1bd0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3106 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 YFzR-51S+1WTm5UtIl5zS*dIRjAGL63TmS$7 diff --git a/rootfs/web/static/img/cover-image.png b/rootfs/web/static/img/cover-image.png deleted file mode 100644 index 83b7a0a64e04c424eecd23cf7066e91c458dca2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23015 zcmZU4WmH_twk{By0Kr`X0fM`GaCZytPGg~QC%6X)PH+hx+&#EMaA*kb?!3j`=bd}U zdyMs?yVk7fRrSqTO}Mh66e=3PIU)=&VzW$E1_gyrW-TVB zEF&gHuIvo5u(mUYg3?AR*8!`m4<{ab(XhWY{>{6S!Jfb_tr*C%^`6}NhFvHA>i3tjMVblrqWlqxRAFWj9|r@TJS|2CgKW!|qdbG+NPz7tgyFZ}H#(%IEv54XLcl zYGcK@-^~1wh7W!bC0K#H7<%}aR@N7~26!ZvTerHa3emN$k}UMy9+;S*jdP;${?I0T zitl*wm7x+kpbHG)u8eqJH+~Fx$*N+%pRACFqk5yOZ|^J{)`-*nMX=OhDf1BBiX?cS zH$r=-ATXi4c7+3%;HLc7kn>DVS zw0E8aSy?P)*x!wJ{xN)7sb~Da)Vlx^Psx?{9bz@MM4TV{ah1F@l`0TpNjc&@N2IWG z(C(?BDPc*Zb73F9!-FVxmuNsd(~{6~@(zNse7#TPE$kPV@6gCO0V3-N6kWvcV7WT+ zzd!mSQ=ChSZ=>gm@SGPQu|3mvd3Or*xAqA1$(v9=|Bg%R@bE{5dH2{*@lqW7J5vPt zHp&VWw%YHrm`mQ(B%c-0mbJfk(qx)dxv;s|#nFY|DM&XczS+6s3(-@(5cFi@S?G?~ zXyH>=$HDEB+NR&48T=|GDdKaFvOpzIQR8#bbBADmnu$Uct~UEm?0u+xpd0;aL6>J^*T&fP{f(CnT)|d&k3KCl9S0$U`+H z1RTOv1A0YJs?qzR^iFW;;EhIbAYAUFJo9}x`sAvj@B3`G}6m&307#uaHl*zI1(+R2>WMuC!W%{ z6Tm5pWAn=*QiV>56Xdz&3aE&FB%~urilr0P$YaWBj;rR0NE08;)11`iK>7TRF;sjC z<|y!5Y9MEN5@8Z&*VC1#nM^RkH_|`^WFn1k5cO7)$TZw(0M-AVHm%V_>rK4&AN?0G5&}=4P#Nz z&ND4c%$d$}DMTq4&ZW<55#biONjRpDm&T^H!5|4!H=(YMa*uaUxlL}ARVqv={O}0Fi0lY|D&=={Hg2{x(=4jZ z-w-o3XDHrKJ+XF)EECb{uqyo8+uB3(5_1BhRExeE*{aVqUu$ryxN6a=nX2L!)ED#? z68_LFRMaZe>4osjqy8vz$w5q*fbfAU+r!oU(c|2M=|W&9#G}B2#6!)))*Znk zm3)<qJpDSRkUa$$1obG^jJBZcrN!>l7h!jd9Z zFmy3e-hr{!m{*yE=(}i*Y2zuJ3?Ky`WSm3IqRi^HuxNjND^&lko-|X%!B9?3LZMIl zBn_XelJa9neNZ5|@3+mMDTU=g7d~z@l!I5PszJ z2%CtFh`I>oZ@*PRX0OYx zO6-emi>GIpi^r|QY;J8bCfo}LORXzClrJi9C5NTy#maPTHFWj)6(4G@4f&k;jQOJZ zYMU{e1Dfla)jYdBvD?@^6Ym4>+wY66Xuya^IfuooXJaD0+`D}c@DF27y&tdCAU{jh$>74>fR7hQ)N~C47 zck**GYBGu@p{BLw)7<5p;vCN0iCw0u?W5y>G59f=SR9q+MI>t-)xYjbAza%JK7UDX8&o=l2+ijbD17V|v(JPtQj14V-j z819DS27z>$R6Q0=DWj;&GIQsgXkP%E`mXGsu__m1-3^BgMvPm;wXiX1XESXxKWsmB)tODJ)ZOLXLHwid zo2)1twx9JGun$OPbmV zWv?6eUc1x#s`vT0_KEL7iA01fhZKKEZIFI^X$1XuhhdJkvTBv@#LN1Vm~7|}nmrCY z4jPH3u=hFQwe(hebsm4r93CrP0k#6p5^e(tmO!%K;gVDK=8denoMO^cQh$nK^1`<- z-y)OAXbme7OWZ$Ot1mbQ-iWV;Czbk_#wWtlFlRvcH5~VMtoQfM*tabgOZ&>?Y^pes zILU1EZBH_01(uWt^tF^5oS4p+&DukJb%{k7St_%oL@=JP3 zDM*5ZtG&^!Jq)!v;ytI? zN`yR~$_JOaz=|gZ@^?x;o@5WcK72cG_QVFGI^}zQp4;7IEG(Z6=#v!*OZa_GAAcHo zyz9jqWY&6NyR~)f@-g;|uWzh#J*A(YcUe>KxMEyl?sz6W^RcITL70!d*BG7U7hdrl z`$<)?IXBFe&(+LT&TZ%*VP`L)X7$a`5*qtFI4BTGn=f=rf)uLi?HiGSQ?SEjWB@Vv zeQ=NwHu?La5Bggf>Tkc2vu&Zx_OK8`EB$~`k=uodqOic!4MFKkf7iQ*AI2gW(K|xk zV>KvlDkSFHH#ELI;G2py`ghnTQOln>)=y-WX`#d(7wlP z*p{YRZO~w;>-Xf;;Ml@sU*GKL=*mh@&-AoQN>NHt!;S-(Ov_LzqC7jb!`J_Fj%%C< ziyR`8S@b>CrTw48Q~uvS1;{jTd_GdAN``YrZALs`uB9ud;U}3TF(kCcpEJ~%j|Xt9 zxkkT*H*?S*rW-j-Z4ZR|8-5L#ZDf%Qf8p;`~C)BLM;3&V{=pAlS zqM9n(WE1kaU=itx?kLfs2u3L-lc3VLj8ou1AJ2oSK&WBE%JlDDtpej{CZ0oGl-{Ga z&aUj`>;_lK^=VAaSbc@myhSs&*B{Ww71txi{q&;-{NmQ9)3K!%l$&bwUieWm__uvR z$YgFFKUuqlWx1R0&Gz?ts)@#%`&(!n1WtS=FKYhIPR?(DqNtmwQ&!PB4l+vp40(OF zdfHRB7Q%SfV(YWjw+An>h1Q-`AGD4??dGl|>}zd+REJmBynH`akUrd5WZL%l)VkT) zdSyUStcxm!$4E0x!3v3BDr381Z3onDP^ok5BiuttBC`8O_Y7{fLmm({T&;VdJi!TA zLHv1SY633MObL%A(k=P5}sD^b@(pWlln#08zI#2d5bHkOD7nq|(I?tyCL zofFPWkv~U#mZcj~rF$%uw~1TizOpuJXfB&AS;w(}FzVpM^5*tm8?xgzF;zNkKgbGQb$@x*(i1*8fwS&>bm^f9Pm zYLNrIu~ZofQA%tI77AIiO&MuT15DA}N2Z=y{Xa$~7zXUH%*?D#)W$WInO#H}l*qHo z{JrDc5q+%kP9HY|*q3dR-ec zi1mi(tuhF2*}B#1W_9_^RL+pt_>V&=g`RQAs=QJq@2u^pS)l{6m(z^nkZ!pht-(sA z_9phGb4BZj>*t}%si;G{Q@zmv?hAqJm5z*CTVvLZvSl`p5C@#+JL{)K>MQW$9uz_x z9ImvY2J*3(_HSZ7WQ8uzQvz(HI`n8UJmX$g?rLZrwqw#~sIC}Ae}|;o;PxQb%`sa~xPz3!5R)MraEuy&=Suv2JK zfPYubM$V+prYn|~ng@H-g4{(J?p<=b=Kh@cflRvQk^n!*tf2Fc5)TKj1s^YOB(ER1 z>EQDQ?smnd=%xFHhp$#dN(gt$&BIEHH=B1kE%7(n4wPqFXp4Z60Or8`K+{jI#a8>u zR@UD^jq0~1;!YQDHfqbb zjTgz>)cK<~ zLK9__uDC(n_Wxo;=FY5#j^1Ucviwm@9dRGgS?m-|LA)%Fc2{gy@$&6gRMUuXshSEW z2En;^>0xdDnSDr`-i|a*m1o_z?;a%{;k&*%rk!SvWmTj~Q%GV;?Q-so$A#s?PGJYV z5o69{GiAiWo5rw!xe#KLAG7GH+Nx%&POc5F);H!hCff;v^t#MB6S%bPtd3I-TzumW zQc6Cd^84W*-ucxiMLD9X9Z_;Ceix~l#YqsUrdMjvx5Q@8E>%Q_h?mjB0}f8YhYIhn zV^Z7igtbzk(lh-?r6oNY(FW0zQ8cDE+&#{D+|&t$XBG{Njf_F%F}f*>AN~;jaag!I z7O*1Q7x^;c)V%w+nzS@J*fwG6h&MRg)nazj$V@5GH@>_^MNZB_x$Aw(ph3$)Z^!Wo zlfYx#l*5XuS{Sl|nT9D$ zq7;72B96X5p{IAwOvRybh{WF`y3j;n#kKO|k~Tf9&)HMb_KRP-PAQfO8nn`M*%!fJ zPlF|wwx@oZY)!x3qsNxNH?|16Up>E)#f}K{2~VfY;~oOR??@9uGk#zf6AoVD88iJsL<@@T z;oeY^9&?B~q}KR7Izjju{wRb={3bVrbqXK3@a+Y@TyL7`jq!t%b_UKdivuxpL~I}W zJ9nh;U{*fH=4o+06AGuVtC`R52fxpZ<_u2s7mxiJ{1vpvm5`?x_hwLzVd3Y`pI3JL zf2jX#@@n%g@(4B=RZu&ilfo!*gBUOmbe>&c)I~kIPCm7Dhe~*hYxM5+u14O-%*bxb z^vOO9@%&C3+8eU{SWH_=Z%t2B@~8AzHBxNhAd%ram#Bi_x? za~Kj5W1ckoHM-5ddgUqe0PQ>mT9GC*o09d~S$OlzDJ5;*;6#Otbxm8gVa>wd!059w z2r*!v(38uKs++oo+D5QHXbxilr-Nq0Bf-SkX6R}r+j?V|e3_xL5j zGG$G>%I$ZKG-|PSq)vu{D=ckA?tlQG!MAM?Hv6CZ6=0eIOk38z^t+v4)m;Gul zmPW1TO>>c2mDe3AS>6}N>t30Acd3akZe%Gt=-viT!_LNQkb;6Am9=a2?JgC?kB$Z_ z7qw1Dn_suL&kWB}J{^B!6M2IVmmY_W`6OSAL>O9KMR$lmCUNYLtW5DyOP$o2@)n0N z`4i+~*K z4>1FYDjpr_+`Av|76|M~*-42oVik%N+2nl_)4qLGU>-3WrCX!Vn9eAxeKF4RgLXaj z{xOenI5}kUY&sz4SP*W`j+2#?r*TZvk?By3_OmZ@wDQ5=WOc$btB$t9Z#|KTZo_i$tZ?s!?O=+{0P2uHTFOUw+Hu_>&z0Z4Z2*OW!{aXT8NsiI%2g zgi_$OB4Zl6td_L8_)UJ6beNZqX zXm~vKnwQ;1ZzDq~(-9sNR;t99Gnu2Fi=G>vx8&yFy0#Zsz+T9A-~ut(l{iq@>o3Ll z*~LYiUmru0ds1%QpIyz(X*oeTN3Czv}a<*h<<>lpNW?^GyV`Bs;7+pLZT#els z9b72?W%7Udh?~2ZI$JxsT7w+OU-=rFfWEj2Qc%1K`tRSrdYZdi|BoaGm;aar7|8tk zhMAR#h55g{fvEzoqkPKN?&fyd;@0-&4laNUAucXffq&@#zc>FQ@qf+K`Jb6=JUst< z=Kp&0pP2&8uLk@tgZ}l_Kcj%VgpdW8|Lb}oWCizbYbYq;MHz8Xb$95aOrI#N*`^cj zx8&?v8P@oQ>%qpQZSwDNs__MRn{owjh_7O8!W9;u14^1oICL{<9_nb4Z zJvoVqUps8O{ycs!FuuBW_4A3#*2IKj;}gsWk$;|dH~|YPI&!8m{;<;jJk&_a9Rvvf z_bnOpKG<6*ukSzKSwaz|$v?u7d7pN*oU}*2Wb?Yfe;rNd1{oQxPsuU&#pWF5v%bryRy2SF{wGqC%8OpF z#kq|QW7%5{)aTbXywCm^XiBJ7#(P9|73vKn{?h4d=`>Z%3R0Ie;S3@8?~dAYa>)uPN_EzCKCEnbTTJHe7X z?&igElnZ#A=Ud3&QbJ>r2UuX`_;N3G9Fn}Uh!bH4B&6@nH+qH)^l+daA05py44S-J zH(>`eb7Jwp9kY6Mb!FY2W!@DC=j0l$nE=f4XMx^tU@_9Hl!C&nPGvfaD`dIE<=^s)d(flJ) zl9H#Tb=<4&rjCy9m<8rL_%oGXgPbD>2s%3ZqAkey4ur^+%!m(K%_zKmx^p*663UC&*g#Z1h^r@^rNaZ@o%u`lj4_G=u2`(>9)Ah9owp%CxI(TE|_&(&XG}nJzEqCGNmxuYV z9tm}|gtvEHCwAtLJ-%QHsN@GQf7Wg&rHTNTEsu@?;kcy{dAc5Ny<=2uO+PWcjsxs> z0K_#5PBdQAu134i@{7ZKct-(<3o{6xr;Y%(w&(o?qTz&*<2&%TGN-)29pQ+S5YTCY z;Wg%Wwe73Qtp}##$$(Ca(*E}=l9l`??0rkTs+#|Vu@6w8&%3cM1FEkj14HgLkNj<6 zWazOIe^ zJK3i~cdhRJ%-6i{6a@0pt5Bgl92Fk4@B4#+RYwSNcQML5LJ@km| zGY~crm=(ZbE8?GTx%*l|6fIK#W+p&V#H<9>U#qp+BRTuM>QEd6>=$VJUB6_`(E4#W zfVA|79Rai$b>}SM=xdQ#H8TW87A1jzbHyrMr9f6x2Wpo9?g~I89U^EH?nTeIe)QG6 zD)FCm!l(;}Fh-;#C5jxu_AAahz@VOr8pXs){*h#X{kYoI82D9OalO~Q#sz%-_-qD1 zx+Kb#%qCxt8t0EXwG>TXzT8j`cKlejH59m7K11R-FBrBsX-u|sms$QYF9>YnQ`35j zBIHbGLhh&Qxe}4M4B8X$^Hs5|7(9;#HGAP^J6T&#XU?^u@QM6$AJ*Eb_D<-T?ermI zDT=~;o^H))WHFa^#CxgFiNb`hX0e2ByU{S6NpcsjHMMVjZAK*D@jcZV6jLH<@KZ57 z?>tJRV`?HM%)Y$@S;}YLj4Pl$O}7R#C6w13-y@#hgMAJK>xnbnz07(FrA1;pheHz& zjw>lvi%C=OZyIR0L9#3`?{v9Hd8RdP!qo=n8k)7-k~Xr>UQ_UZUw@c(wK-oq2KF3L zpq{?TTFrS&d)2M{s!=-z1F9by1|{KSEcId!H)pLi(>_hI$5*+7XnW%LSh=+&{1k-A zLIri!{(wW3; zSB@&sJ@x>7=~vpu_hVKOY8`n_N%23hL6mw7@-PdqjtxzJIZqBf6Sug%Fy)6^v?CHh zvoLCoc=oKP^DCPK;umy_*7*QE{b}7RD05eU1fKh%^Hr_2w%Cyb={uIldE1l6 z#md{8DpHEw4{Jlzh3jA2!*h79_+e=$dwnu5Fr!-Q zO0}87hf^eI6dg`V?Yj5VTe>=Z*vljQ#wmrqz^X$%__#_KryUF{kGNh9+8OuWsf$H9 zO2P%`IJ>c1F%Lz+xxNVd_zJcC0|Qc0QZ2|g*Vi#oQJ0seEdlyQw=_t*7@ah2ZH#-M zP+Jat#yd?McDQ*cVkwM$FtP8@FHA^utX&o_`{u(Z>=SuSJsB7U3T1!__In^VHD>Wz zb#np)ICQMIk^W#*$+T+>%Xb|Kyc=4bIZ+lcHj^Ui_1fqT!P9dLz`(_&4&ZtR(BP02 zu8)Rc0Z_-+F37!ye&WRAV!LmL^z$+lj27e7d^mk*)MAZNyM~K=S9DdV&i8wgLPO_r zn{fA?>ue(F&Nl(i?OVA*=tuHg)t4rDUk`zx6RSB=9vb5UF4;@5EBm;*px2lTn}MZW zyX=v)fRo0tMF+T_1#bLWTEMnsZSpn(LK0nOW%UN}`|nZ>umYiTk~e)&YM?GJlYeH( z8Z?h+4{SsO{0H3k&|p{x{iBMC$F#5TiAl}#i!0Rs#QUy2+z910-YTt>j+hE|_|SUE z2H-aLY_8>swcsTn!G^K*vieYRfh)XU4%=0SvU39Jf~+ri2C;|9On(A>&4T>OnJOElc4zHuIG*vD0K+&R8d zdtd4Iuwl0>o7hW~+CX*&|M#j=*kL4%KTd=cS^yC(>B}<%kHwgu8`vOy?+R0^onLoD z<5ZCl;|U1F?oaA)?%SA5!W+rE)6jvoy1uWUMWJp&K?XZDMfj*j^8WDws}xR49?j;f zVObWK&xHG6M_CY9{#%i6 z=z7QnmvZZP?K(3iVkp!H;%1bqI-Lr`tkzRX$}>{_Bmq9pxk7~}pKQVHlJ`D|+BM&S zQ|Ei^d^t9#vT*?)2_K_VoNopXoUf(LV)>l-WpJA4vS?I;(o0EMjegx>nCUf#70v+U z@GA(|D%W$bw)qpDbg2!Gay`_DRNVw<+>C6`k95y%7_~b}{kR;^Zff6-Wd1FBUk{0Z z%6@T^m?|ZWXuuIVmWL5ST5md)I#%S0r2#qt<0nejB#H*SQ!7G+Lt1E5wwfQ@PK^6( zHR^pG#_okP`>(8<;KYKjQf}6To2a#GVWEXy7)57)j`c_0)cW}xp)fy{5nxA7VZGeC zM7A~2ze34gQU8k_&WDmSh(5a^m(uH5j7lZ)R54wReZsd_YyW!ghNS`?;5q@$d9m@Y zujf3uF8~lcy`|48Liu(7K_7+ha(w64Wg@_+6AK?+`EtAhzXoC2)%NgO!B-|$0Df!G zs#I-lgIJipp1>1&0OIm%FK~Y_9ZmiR^zXsmK65IOj$xlD3+lNz5(+b!AdKXS1Ehqi0aeLDjk%9cb2jv~@y8{^h)yIj&@RUj zYkOGTb)VWeNp@$9VYA(JjIAwysO#tRE2`QC{iCS_dnvz$=c@sw3?b{Gf#S!hI~4HG zR?FECF-b2R>|-<4An?2DmTMZNV_csiJJFk^`tTDaoEx6L^b;jcw3?n1s`M;rw_}-A zGUhcr!{43rjAtHiz4gU>n=T5bGYx+|Zb*;!$9q!8IXphiuzdQm_=C!{Xdv|ERM7fN z(_)Q<<@|8RZ+!?<=Rva`_N9-j)6@M)ca9btq|-iHMnW*+6H7IGqEIhfNwrGuxb-Lh zPwY=6-}`SIv0|H8nULu1`t~pIyxA{sWM!HzP}2(hzsyb$q#nb#qx>8WJ6-V@{AM;u z#2LDoXTs{l32%>QK%xjLt#BJ$HTx;(H1jLj0++5yWAD{op0BsI6_Cb?Oosd4ST^tX zgR99i^yvj331X;7`N|f=QRUTpKXuSE7*Ny)>SG*zdP;W2?bD60Q#rD@Ye6X!y`Z#N>{jNnLWE^YIR_Dil47_}*s* zhMI=|n!Y@^8G_Yn7Zm^bXd8BU25*pXZ+}1@(ZJX>cYLx7aYYi&U&kF!*aM>Qwh3EL z_%69VAGUE|w7sp?r6G1~LEy2%=8N&Jv(23BkNt4hvK$Z;?fj%UdaGgoo1;xlQzn1CaIhhR%3_O3 zZhk$pG{7vXOINHvIi&8*RZFh$$5oszq?0+}BCSR^so71{+zZS03;CXqYuQL^&mzKj zX~1*&n9}i?Hb$7e0yD?+)I-W|h`$H4E@ z$y>9jyZye!D5vUd+V*O=)(kqpW-qf;xnRAb9fdT83a(KAM1eKl*<%-TZ@-Nf(Lhk? zQUIK^$J!p_O&zzOU0Ay*{#ow)^#kS;g73CVYUx``x)2A?rqXk~nE!p|8;fn5h#Ps*$Kf;)KSO7g>@SR- zI1FvtmCNe150{D>X4$XFfgv*4{e=yQ(?lX5RFC(nWtkuQ#95L-CBVNSxIh2B)?OyW zI5DtAw*82)WL@`%zRh)v47m=*>0De=($$Il6Vn-VUkmIzZY}EdqYvg&ab=f^D%G#) zonI50d7{mpsH??)qT&{^N;u>olvX!$LZPM78oBG3P6aJYL#rpNSK?K^V((dWsxH?B zz$LC^ZN7z#<14S7dRt;Qng+VWu+j2-5+b1V@hx=U$=!gbfpygJT)9%Tp({1(Ig-$| zbZ|*uEom+*0M;>EqH?C+>^Lm9y?fXn(3&dE-{QqWU(1$ANakpW?FuFf#ylM(Wm1!A z^mYv9UZ%|=2V9DDdznsd_?TF=aw{cCb)$qLKd@V&w<7I>zXC{~K)F#i5K8qFw8Efr zrk}CDk(LaeU$H|bkh%H$c`ihDsOI@2rxIsGo$Q!05i=er50bO zFS$P9`b=$Vre1xLKL;u7cU;JC_ix_nVV@B2+=e2+{O0oY zsC=;OVx_)aSh?RGE&va~KVb_H%U$ltq`Zv`*XxCdtebrDzxT<)?RyYFc|Mo<4^R@- z6Ynii_99i~Yg5yomgy=;1o_D6HTP6hIJUa9lYNmo^pIP8io6&6>lXoTK@V>BiuH0M zeJ)IAAWpquC%Vig5F0O;=7-awfm^$u(?QRgsO}9SNK**j%p`!PH1XT8T1D(p=n2a- zmWh1H@m1o>hO9uu$iG)?28Y#t|6Av%C+fW+B?%F9qw{c`3AKUYm^y%2uG*USqoq@> zs@y9yk(0Mgq$i63v)zZa&}WDr29!%;q#MiVYN>S4uG&XGK|MrU%M^p^_^0A~AI?3uOv628Bc}s^?v6P7u&IM z?`uGO;G#Dh?X_Y>e3*7{_CVNZUA_;I1pvo?RnDsk7P>dgT{*cv{y#kdF4I!)zsfZh zAkJOBr73VvoJY5Pr?o z+WqbyftuaMszzHg)Z&K~PlJgq1(fy632xu4Dt*;jmoPRC3z!1hXsG)YWumv^rEuxN zMM=4MMbQj_9XCcpXT90XG!(oG~{hDk5Fs?2JKR$TeIXbUA z0R%_PPf5*aE0Bhl(X1 zi`G4o|DdPBRW(&$Iyp~MFY$C)DzU2e^5jg)m2GaxWFYJHB2izbkq}X4^L#Pv7|w1m+)DEM?z96VjD65@M0F#s8W|khLvJ4ZYY*y1WyO|{mk+{&)q(5 zc?(5E5UehST~wl~tPWgS9*|TFFIl<`wjJzeni`Ne7s2?fl%ZmHpThONWNoz6@um;I z{eINl*n_PJAX^oo>3s2HJWjZDFgsY5^*UPLQoPF|?8j(OCqWTll_&s8{+hcBWFRiG z0LvNB<$XR)4aC!(`h%_4hcuS&fH&_1nd3`e#HZo9Y`*EUi|(~9ZAm43PL52Z-UaOW z@Zm?zn9@+Gj2_AWCkuclUpXWO9%!4eo4JX~6~-X=nR|`$k28Ut66OP6uA;DRMx4fB znbtULX%*Ww4C%9#a_0d>WPX`$6I&`Z!Nuk_X-9+>m%<6tHpWn)%6B=5nbZ|wayn`xjSZ4jCkluT5lMU^G7TE!r zpFkSUA#+IK70E4jqsrpO1|0yA1u*FHOoENrHs<#_yK5|(@1@qgwPr`riJ2`v!Io+e zaiBk@PM@KaI|J-s$0}Ppt#54sFiMtNYA{@|UYN{512>?6>5B_Om2oR-b24%Ip3d8= zD`sJlnsoh+<_t)vCGs!<`7Cvx8RSC>Pmav!mF{j_V zK=*laX`Jgzs5zC1j{s|-*HSS`Zk?5RHUTtins*_SdGE8GC^4;o4N_3P!Y<=rspJyZ zAaP9(T+*Hj#%|5Z39r=Xm+=-V>oEa2u?<+B^!N7*-J0=woSSL2w6(RN223WCepo8#sBzlGBS4SAsW_}o2LnfsW5NW>4aT+v5 zznzh>r<=`KVNw#3l@{g@6*XVDbA!8EK0Yo7{BL>Y;X5%H`T5Lq33&cf>_|zx;YGE{iv<;Bg?_>#6_OT~`o7 z3w0akgQ0R1L?4O>WC!g`gNpftkfweo2N@cA<-j^(8HB$ zl!sSov)*>>CHVozGNVzU9cN|g0^sPo8O@y$$<47t}of}=N?n*FZXfoK>BRPZOw6>*y^s)1|$iq~L9$j8@Np_%|uBw0;8aD&ktuw{t za=A=Ka8IaH!VyXnPgkE1^&0Ii+z!Cd=kfMTeVTy&G;M~yqS54Pe^$%D<8P@(+36cU z6LZPQ8M;ww)rUGSxc=IX)_Fmg<@&Gj0oN4V;u_SuMe9?^y=j4EJWkJ1%>A&`PPrt? z5I6#wg|NR6aR^7!3POslZ4{Q}eKa`z;KQ0+GDFvrROLKUd8F*aa#DLuOF32;Tx6c z;<{Dgoo#D;zSepX&i>R7mf>3(enbsv-%5~U<2L@=9fI=X*h9By{(yr+|GV%QR%h=w zdL*gsr*7&e%YLJv%Xb=I)c&a-qPSr)cQ!Aze$w)g7xOqJgiv1iT8KrBM?nW=he>4E z5zTs5|C&B^RRK<0yqo4GmQW+p4D9<4C*BaH4puR=5GD?`faVm%e6@~90$lsP_cz(; zc9l+$&)e+i_~G30p2xT1@y5sX_WY`@T*UlIkN3<%mqa9=V0J2WeQiHwtb5ydFcQzR z8Q!YoLr|AVDY+JTy4si(AzPhu?webaDoV%00@*y%CsPCc$ZRKLiE7r>Q(yUPH%}a3 zzTbB1)GdO-+JlM}1$u!)0H%qxm51<_?wJ&l)$q3G0RJy?^AK`*+J1 z+#oGha-5#`5yot6wX$*@l_1l#Do4$L0H9#;s)e=3(Wx;i_EQ9jLWib1;NzF5>RJL& zr$}i)ra;T_Cvy0p1|ANaDoz&f!#8m|Y55v2f1a*E(M+Y!xHLlJG^wXvTn@|Mo4Q=7 zgzz+5har8Dktp(@K85YRhVDHrPJJ3bS1kNn=E3s$4?N>cy5H92@_s|F3Qp?7tL1#B zcrbjSyvsIBfAm~`+^2Y~>qw7ovfWdEv$Oo-Gn+BIy_4m!bMxWP{oz?HnauVEKE>mD z$MvJT#AI#!h2?mgoxw}3X{C?rwJWzG10d@e|FW@Fu>CLwic6Y4;f=#iI8~5=K-oI8>z%4mE*7waOkg}EDM!(!= zzU+&BLW|WblCJH41?5t&>vlk+uy192h~=}g5_m1P;()8@*0JpQRb4`$i2LUmC07=E zUU}=Na0IuSz@_}eY0Fd+_St#2$23%t)WzCCO8?(lieIz$j9ryF*9kLpM^*D{kN6Dc zWEjc!r3RqD#9pk@6fapTV79_Ck7CZ(ck06t6f6NRgxAv<@(P)?T=z}yhs3Y7wOStR z*c_0@+|@B>sTxw;-6t%#cjfo2g82VixrTlzEbG>l1A65H*SEr~S%=G+0v*B&U>=XZ z(qMY`mZPB`W}^{<;N?X|R@S{;Ys(Dpy_yC7iZ28-Bu871!C!!~@oeRn5nj4Um!{cV`CQrmhG0hEPUwFq&kwvI(hVA=};bg|h>1(|* z(BsoLvrM4>|*5pT||h4B}1Jn-4q|J|c!;%UM$MC}5b zpVE1G%XE8(f0Ze<1-H94UmQd~Q_SUoRWq4%REQG4>E|ZDJ-o*gmSTm6gg$Sqsb)^= z2JqbNsSTQr+miI%UJipDSOp_Io^;2t*yT2!TVjQu-M5Q7tk|h23zbRc%}o|~n4fPY=?fJW$eI<7{z9in>iJo&RfSA)fB$3uOC8>R z16OG(+z#*yFBgerKYIbk!m>9siV9ipS~NXx*@@)@T8;Hi08abu`> z;bkknx?s@kwP-{w_8!mMPlRLbH(<INR^$&ers+i_Ur2%2OEWo`8x$*Ln<+9H=4x-BZ3dzTg3AZT z=9WJC#80(Advij5o(O}6XE}qcuegduv3RY5gh0cmkG66@;vtwCMTIBXOoyiFxXWX(`l;?d=N(gjV z;RAZw!wS8!UI?{$bE{{gAJ()sv=cyiBe>{J35kJf9p(arV&!~6=CkN~|2XF!wa2YB zU&1q9s7ZQhO{HU=rwc~`eRYtR8SL7;Ris57QXgz8^CPu_n?mt4OMH*YGDGSq8J^7Q z=^k*7e>&hC$$yUO@4nLw-6D*FDVlGRbqk+P--y3K#9S0bVzqMj8+tpk%CNOfOL1uVA9ecDY4Nb z9o^vXo<6_lx}Jys;M(}yyYF+(^?9Gy>rDLbcnLi2I^jQ1h1;b1XGc{S1zC6IM~wk@ z!|2c5m~qFO4eLEM`KCMwHUFT|;{8^$GLVeWd8HcvY zKx7w4-KbAy2SD`b)WIVmY&I3HKEUt#dlHz%2HfV^%E<~em zAG5{B#l(=n*yqHr7~jTp9xyIQ>f*1S*+E`58Pi8_&mh~gxrZE6Dpno4EJ_LrJYxYI zpm=JKN^y9J1!OHYBSh66Ey8`<7EOC(#f_r@&!`_dO)O!UC`W{26hZfU?yMg10{ za8;NpvlKk9YZ#|Tk4yIHy#l-M$`@@+qgUi0=nUoUN|WW*23@7-(4!yr2;87DYh9av zNkRV@dHSm+mLDHKyskj!5$ZyT%WA%yjHIUigD%14`?nm%hLD%{gB;X zLtMbN<;7`HuW*sHekL|=w2exIvcQRdStu_e1s^TtNF$NC#8q5)1=>h$%oocI#x? zee8a&8|mCM0F!5U1AG2y{fkg()2pdd;Qt zm}k4Ep^#b?|GdQr(Rk?$e@heVA*GN{TIV0atfINtVNaY(Dr!u|l3nM6pZwcJ8?sZR zM4sYaiB+CYjH9`L0mB4!FWCMEBrzwo;>mHgH<8t1q_g`?gnSveTi+dNcn_)_dI@&* z=Gz=28bdE1-*dkEE6JUzOuU|(kw+02K;HB7usd)$?vpnY+rVlJCQa$;MZtizW=9PG zg1N(Ya@&BM6v(e*ayYxv(#P$Q-A0BP%BLTa_yvg^llzR1w(L8(_(}IxpB~6=nWk3r z{|k4CcHBuk;t1TPu#aNnzn{KK{$F%0`l&W%MnG6P1q-n-oUHx2x;WGT({{c~^J6m})WNbUBU;_GQ%x~kVh&N{E<7ouA+2tSb@k^m{2{Q+TdhQ=@&CN^U zR~vQ<%YW5<&O@|E55bKKzNxP?6Wm-kIJeu3Z_fyuZpcCCpq%{ENrsRFP6WuDf%L8! zcpw%?5Jr|=sm1^U2$aqZrm!|RH=rmuy|RY8D-^p{DHpxx#+|_sZvy>P#F_L=bQ4Fn z{-IhbB4ZV>&y4&>l=$rYz`)D7OP=(Q&E7YKS$L}84%%C-nUKS^GjA$eOP?*H|F3988GhDBI#zmPekLryYFN80$s&b)vY4@3|^YmU6tO(lJYW!Y1 zt94-OE~K$vaDYW?{2!FUS2^Qy<1dL>xC2>UC6kzL&eAU2i^?wvPH_ieF|%}*0s=_N z96#^&xzd=4)fZxukR{SRfzo-klwA)-AT5-P#Z4CS!G)MdrBDcEp#8$_J+w7x>S0`s z7q-OvZueZ5Ie1jJtWEs{TU;}X0@RTWXo>yK8X&|lbBI2T8#Tn2J7>Im{s_%}I(0O9 zTh{p~Bj?y@j0C{hJnG;AU5WqK!D__uwS#Cz3Q7VL?DT|`v8_~r9^YJ)sYq+%DN?n1 zr8Pm4E9sfbE0iG4x?}Ir=gb91~i(hmoAe9%w1zv6fKff4M-kvo~ z2U0KgB#wTeExrG@rAN>^6%Y^)zYP5SmFpii0M-PR?gs6VrDAdl&;!iYiCOEtn7@fc z5in#`ws?;J9t!AZ1`M1kWWp)epPXSu4* z%LM<{vcDsg4dyVHHRXI=tTWbd=RU5h?`*g7B)m#*#*+)r<@u{BSqmSUuMkNK32;hn?%6BD7M zxh6MRSfXs7l~^Q+yUo^VBRO&H=A;lRtdI-gIL2}B^w)y4o~+iEizesb3HJU@9`$EC zy-k|iq!;zO31&SmoEMgxfap+iD<$3FI87bnR-tyrz(;m@R$K#mIjgWWp+b z5SiKdv{w#SW~Gnhrm)x+`7IC*&(!Dki~UYE+ez5%-p#r8&AcIzk&&Xt)qcU+`RK;R zMk{=g_d&hcAVbFL9<7#n_gi}ksY=gnTVw}!i%J<8b4DErHQ@V4gx#>1v=M# z%*7fE$=1%7fvJMKolxjL7s)o`h6f(V5-2q-%!yORiS$XXaZ0zm$H!RY#unXUo(R-Vvr!oyG%xouqxX7&?N~G+AujKF^PV7fr#LA#^ep+H zJ%w$QGzFy->IjUBVDMEU_RIFf)GbDvx6Xg{=6{Si*~#s=Q?neHe(+`@-!Bi2<5dp# zJ*pON5L@Yo(#aJFl9sYW73vKAc8AmDBUQ1~fh%sgb85sA7kpk0%4{=c?4Npa>DGA?5sxNeOr;Mb0Yg;1M zsz|YUnU=kkKuEsQu1KRSh14ylLK3qm^RE?l*QaL^4l-Coa(hN=MLDuj=NX-X4mhgX zJ-7pKcO+c8bD&c}0p*qtB_D`#mHZovxItI9fHbI6$92szhAH?eOeWF zTbgcst6Ud;aPh{MAnutcO0zyVvmDW#jf+c4+D>avOqRlPl>_sb6+GkRJS$7FZ%;Kl zpRZT(3w2NW2Vf_)ggEkKO7Ci(oAvAB0eYYT$L@=2*nBTTMdUq(QYh=1sk0Xs-0Mv8#`7yfI)VBPIg{pW88%xB;G7k#}!bzLsDGaMLt4gs6j z8pzTzIUE5wM`MAHmA>G1PTR}V5_av94E1&k- zH?jBmBN$S6YqVfPh%nc$6BJs5m}GYBL+8+@EHNY{=qVA8xLDxZjM`!IOx#ZJl#wh1 zpSu#K`)uK=;w5w$^JtT^Xm6`3rZa~*AwH0>A9vi0uk?I{98=){z$&O?+ny@YM8C5C8zVb@!1of4)l43rJ5tkPK(0WsZ$ss9qj2L}cEd#>aOAZg z-kY5*X}&=xi(pMX@Pw(L!Uu&|sTRMgPm%iW6#@rQkQ(v4RmC8K3tsYjqt9#6koc;)#HYlrU+#Y z)#73Hki-v1dJ26Vck&tET03E5Er{`b8iNJ{N+90qT!2X?=2h$1J);ZO2@MCVWKOo$ z5_DSuG5kz676Ar8S7akpqkhF-b`bIrw&kl==34EOu*~{E!*sJd)gO2y=xz8{%Q9P= zU3iuMs##w@!VK?aRigN$Y0h4q()w2S%IfL8OKas;3ISt95D_9@4TVT~6kzwn>sVx} z%*p-Yt8s*3Yx~mf5R|)34ljm#Tw1To;=1 zI6Vi|pI44VF-|6WI(>dM537WHRM@g9X-PcJ6Eg!?n$f2XIE}Hv?vSOO4cfD8w{EAj zG_bpFkiW+ysgChvq(G%y`|;DHL=oHjU`y8{K1@0GoewbqR2Qlf zkqCFO+^`kn9bP1RMBY!OV~BI?JPz5HfE#D)<@biXF6^O;YBEEjm~u8`vI(Djv`41x3_*UV2(m zvl44Tte@>vsEZCM&X45bQEM;N^D0jpX`M3>oSg1Z!D#J{V_sVZZ$7+vzedSi9mfeUGOu<^TCIP= z-zQGCg{VYpm2=}KEdd*CUXLOu-1Ay zy(kuoU~W$c3??S!(M|iyhCp)B^TUoE_Mz=9AZQ#+%#Inr`9fh9nif#eehTGGhJxf;%ijCut{`#A5^7_Yn_~ z#L)a!*~b>M9JvsYVy(My^{Wm?h_WMa<2vCK{=s*9#z(%ZzecXhX-<~zV-zfR9&tVlO4lqK5L8nUdh@sht$ zy{FnitkvqJ|Mpk8<2ykw<5=8Y)Z|on-l~!AgVr8}-x4&y*1XS7euwZWx^?c&fNT0x z&*|DPxg|Qruxk~9vz-8%#R23pYU~_#kVAO)6wCoSQZ#^|mA&W4%3dVj487ht;F2MJ zq@f$BI^a-m5a{qd$FrmGo|MCG%P@<9a_>eKL&tYfH$Fu${PFjAQuEWt4qsk3y$}=gR9m^_Eu!xH9n!a{Aad8Bd?KJ% z6-HmQ-nLC~o@QwUBO&Vui#AH$n{o6gDmg8@K#j<+Rsh@xl(w4FzcIhAfT8oMBl6$`kIKtMbBWLMPpU3$5 z`F(Oy+fl;4>2;HD+={#F%1!@$-C!)^cQ=b9H_-J=ny54y*Xxm{OGf>f6@=!y^8pD% zp|LtVnYT&+h_YiLki*t`2Z5S`Ye2zzsM-ByT69-khBE*#Og^`|o3*WA#p zv0x;3blmt(H};d?wHI9`FRXr)^H;4aVB}@KuD3vI&{U*2%qQ@h zx~VBs3Ag>O|jBywwvN~q# ze}w<^AudN#iPM#H7PtWz@A9WiyFBf**^F^h7z7niCXmYrI(3El%w?V9`7x=k4g+t{ zw)Goe)AI?aiw?lH-^`nPc}Ojzb5}~v!B0ICJ$2A$3@f2N$@`8EkS^1L57H|1oQTu{$%=ir8BE>!ibVcVDDBz*o|iz=jOPoyDzk4D*VMNX56_xQ(kqU~ zN(?wq1&5?S-bk(0RB^$9ZH?96Zn}~t?)<#_;90ZLv-ysxXY!i~Oh=L4ichJ^pEbnM*?v?avgCk0f^6AaQD++TMrC^#AIafm8wU50MhGCwigRBa-?TnCy}a) zgGK)a-Ka!7TO3~ub;!bgQclYA%UR;Y6HXC<$cXxMpiaQjy;zi%hIsfzC`|;in zJkMS;Yh{v5lF2U@+J>rs(AIO6RQPJAM z5Gr*=t8;0I5GrA!8;ry>p}l^5Q&d_Q2tZ2Upx)xYKO?+&+VI{Se_3ZSpG@a+JNI@1 zC>|Mwi7pr80l0d-9c3i}EYw^-rCL#dg1FHTNXgY)9wcvvhmx03zh992B(pTm@*BI~ z)aP5;d65B1e9=B#DHq7NXc{*fRNRcvwElGXc@6JC?_!5O^Qool1^DZ&M8Ee zl0F!w1r9(?lSVfQ@LNFnJq{@kTc0QV(}rOWAt;(s@NWBZS!Z}4+Scj2nRE+Qt?7#X zsmXK5M7>g)jq4!Q*dht7w0{7v61x}s!;hqNn~~wqu+_@fwML{{aS*%e!-jAJ!VAIe zu~Q$zREOQduAq!CuJQt&t2r&hiS&16gm*EYbz(6uP&84llFC!ilznh0Rkf4ZsS#>n zO;qFwXvOT%UFdd($Z4EOTH3pbh8?hTq;^u6NFSfu1D4P{l+d!+EJX$4zRpv6mYa9!sKZQ|F{z0v$4@MVk3aC-7#VAiIA~ zp>Z8BTzyl7e)UuLAhI`M*TKH;>9~|!dh9s{w(Sy-`eeLJyyWSP_)Pd2pJBuTe%`}O z?<}Hq;0B285Dw-?L_V}B^lXKWmkRfFZgft)jtxIt&{DvnL51e@8{}d(BJuz;hU5*; zmXykI8EeqLeO&PW5_g4CSB5%kh66fuhw0r z!;`8(j(^&|-je|c3KWz7=nk?&Yz?ab4llaKWH-7u0htLyt(>16{dIz6@FBASYRykB zTO)>$Uvsh|yD{A%1W=)Sg)o3nBL>{z^n`nYQRerV}h+v?9*M(xz1o$#1w<0y{HZ8*U;PHj(O7aSfjv+Rzfn{S?3Bq$SfNy`(55H6%OoqohZrgQX*-d!(tQg$u-_e@lDCN7Cvl zc^0yYs*|S0@Qo;$(0j0ZV0vJ;BzUK+$q?igt9+%}i0721FeNSsm=)xbX_4?KD=)Vx zKh5FQ)XZ)dY!UY8x`O!~GMZJ4r)o_T#+^WuQ<=Y@sGw}GvN>zP>Xb@I_cKvJTdFKC zqmVD#M>VG`T;+qxcImiAiL#|~OYW6)Lb+ApaTT|2gJgrwZT7M0FJHFW)D}FMhzfRv z3h6W8id=(`OKWSOXS`?RBf>4;@!9bdn8g1CpJ3PK2{dCG1hxaS1V)-OA9V*atll=HOnt^$A$)oPU1MEX*D26KgYm79^tPz zZ%pk>V?(UrEzJ9Yci(IUY%^U;T=VW+&Zf9!Gl(+2X0UNjaNoN)>RPXlwAMK{9cTVJ zBP`=uu>NXpbF>6yd~ulLx!}p<>2%|I>~e^7jDHw%7J8u*)_RY zxrMa)6vSk_RC!i9_6m*;V{vvTj@>j{Rv!Dip0!@y8SfI0y1z~zZNnJDNWwhByb@Vu z^v86@tj4U>MQPp2zLwFc>n;>Ggt2Y5jy~2RS?yYpRxcaP*~(PkR%5QHuWr=mt^8fZ zT>7=j_jw2ho6ByddEc>WFfCF6x6ADL@1M<6-P5`=x8+TjX$N?>Z+p|nmxD7aF}vS> zyHAAfW1O;XmJA#<)J3pNd6Zq#VYiNnCKb@z((CK4>kL#PRr=T!+LhR)t=qL)w@S2C zIdp9aUBX``UpUV1#ub&BcOF1Y33Qyc*S6oe^JN(@`EwX91`TZtZrEIW+2G@s%~H)e zQ-) z_x+twAA#DKZX6rTdY?8Evr`$_a_F~3j0|>G`ZM$YNIAvPlb=w0jMY|_r2atNrUF|8 zEw{{A;8r>|A6vpvs3}XEzQC{R=6QEx%%W;uZT?x7JfEWQT{<89*oE{f zU&ZYi`YQ;j^$cl#s6)mo#YXtZW2QZ&$N!|MV@;0l@n1GqV zR&Uii?yt=LJw3dpVq0`AqxJSh*eP~}?v0(}&dvh)qYTzpk7t!(gnRsLu)91OnuesE=rPmNEG??ppGtHqvTr`2&JL*8}esV1nl zYt}I_#_?mRcm2C*+2%s9?c?fbqt6EYlCQPIaAcv?_3>3ke+CRs*17bO%PaQ1{;})H zIsNKOgZQ^O6?_%1!pVwCyQqy!wOfmh{7(Ce`3~JD$omG?CAL!w6V}8txF_-_{pZxj zlL#m@xE179LK{vKSBq=I$L(2)d`s6kL6)wTBJ!4kC&`DHM)j(NzOIO;iv8l5nNnk| zA@wgspY^|cKZwqR_Qd7Jy%aIa^Vy}%xZXR@9$A}HWF7J1JKpuSY&jK8J!J_v_B{2@ zxK7=XVy`o>>woWuS1cU0_qa#3jiNA*ob32bSgrHK)fp~4e@HH2%{|_UN zS2Eg4!2AOQY8Svy(p_R1p$ylA##_4TucI%(bRIGu+iU=U2p}aYr0TwMn&IY*A<;N^QE{H4 z1c*VRz+J%kJlwcwxX5K*<#fjl=bGX4%^ctOv%}zr1KlUC)g|jVC-q2pDZe1pSjF_2 z{PWg}C_@+r!sMo`VXm)bry~Z8d$LglM3jAx^L%4#nqyx_^IRAtClLBKB2V z7`%@Mi$T3VF@DAS=gDxU`~3+q4EBA_5a<8T%imc4`SkxAW$??glp><(AHb^>=6=Uw zWKVzxep69VQBx~8;RfUv6r43}`hs#D_Q6Dxp|2joYe-#OT<|&U;*}u*B)xCx!SnO; zfymrcWYnBVU{=8d*YQYJT3xJ7O-Ts6e07&zPh#{qUoAKEs8MAF#6e{U>^lHdW0HLCR5Gm`%$ z?L(Zq(cu-M1_jE!IbTn6(`Ei=H(INV9NN~wGJYw8&|O5~+yYF}|FZ+K_XB6H*jQM> zYKVCfQRg#xaOT*3jN#jtKh?rBFalAH6cUJn;N`yEoUOV&Ty7(W1lEQ9ZzW6-At53B zf#~>n=V9WI!`95SG@kE!!}ay7TOVt2gAK=niYRgLX<hzuJ8HsnYC(W)W0I^yn7)WP_> z34&+;`v{TteKX%p66F7nfPK~f5CCueKd-z`{qqXgsN<4BITIb9{uyuOr!j{xCKsKb zovl5vUG(1nSH$3DIVN}B%z%IZc98!?0+^K=7+$`fZ$&s-T3X+jz^uIc$bUi%5)Dj? zKa(y~^ZI#iZZ7+1_wVl!Uw9HR!JZTzVNm4HqyeT&@ZX0N?M75zzpkk; zef~a7{GTYY?gIe8e-Go42~q$322WHU=zaL_HfCUHX~mncXlZHf z``8ghaXO4F*@Jf{A7i}1L-1$1A4qms8D0Icg_*t75WOnB-)Yr2j|d_0@;`d8O-$v7e=4?w_Ghf-AYjK+ z$OIOBkshH}#SBwPP+?%urEm$bk3uu{`lvTEE(%%OZE{zLL-9nIpXXPycgQBg*7 zQ3=t4iM?NLUd`HlYp|J_2H>@3SjqXbs@A>8DP)toBQg3!i*asbvXY{F10r!W!gF$m z!?G4HJd>s|C~?pf^r=>#^8y@3m~m5;-knMIVQ})|{-Oj&RSk(6mLPypmh4Nd?~X`) zF5~250Ptr0`-{Co;D^?naXJ2u47_!WpmI;JpM}9v7!42w8GyCVM9SbB$*zj0tdEMe zU>p7BJ#@L^cI>@;-bD-4pf|7c2mA25-(1gRy>L`~Wv%WcB6+FSd5y6%AmL~oVYqKy zsUZd&x$t6+fbE-G6|tqI1?&zKnVw`}G=~#eN;qq|xu{piNyUvL(V6K$`IOC=q-^-- zCxp=9(s$ygx=i&-uobj~VEdHKPwcL+&z_5~yJ8$E+2rku9&H|hdUZ&nX@WCwq4WA5 z=iN=ZEV9n*eQSs`U*WDx$FIC;DnN5KM7b(h!_`u%FdOY!Bvm%=$~Am9<=w#uW3Z$% z%ZOFpA@U)iRSsOgZ|rx=6ViCM7D;0v*?hk#_0i(LtCMqp(f9d5k#xAFpD{+AO5bl* zM)t>;Mp*Fxp+bd#i+^~vRT<=4O`--n_{>dqsCy4l6e|c~b^Cr+z9Ol6LG5x(C~q8| z-9-|ARx9|wX-$|xfgKF9PYM*fmt^aSNG7I42W~#nD5>qWk1ttKp=F@eOjPH| zp}H$@r@f1)jtC|@_^tGquC$jH!RW~_1z+o?xb5vb!`GF;{}DX@FK|=bjjFAh%%pv1 zA5_1e(jqf1-jer6G5hpCN^R7zqW^f=F4DJ~+}3>@U)3GhCM@Hju9BZvsx`~q;9VQI z?9zM>TIdYQS~nzo!Pqk%VFkd3NFEse#D4_HS*3+lQ$x2@&sE6c2mPg;!7237K@QWK zC#7D|FSidUG|;PXN2TLqnR*q zWKiRGon|uEG{X=QQj*v{$WMZW*|Bt zp`pkKN5GdC94DEYkvfi{5v&TWVeJ7!QNZVmYrJfBgKr#Nohkcvrtiic-3&f@dIdW* z0t{s#DW69Ia1lQ91A>u(I>tI3!Zd?wu1Nt?d;im0H>2$H#Nl6wxDtGZg8qXy0*|wa z$`Grro-f`?=wLnpfbSS&u|~t=! z#`ab@JaS)m-m4ITKW%!ySx#6a@_TdR{t~f)jo*kGoJy#fGL7)l-AW*WHs>D69FXVqWM`M+^~;9RML_9&4;}ZpX8226jgLV8>hwy z;P<0EW}g}sK4Uprru;n&m*ceR(@veV;N-bL5pZH0@Z0-&$Uw`hjbw$ENX1OKl`qSu zY00`pE^^E~(~Kaqfy0_329yF9lWft45GIj?=ahLKwtcx|GV;?^4U8Yak;-Cq$!Ft= zbJRi^!=eC{>t!2*nQpRZqpkG>#JSK~2xT4Vg;n<#OQKwDR&mjMnw^@lfzm}ks!_HC z)oGI%4!b{B)j{B#`#pmRbcTYYQqUzIsaG)^z;uBRK!p8!dcG>hnbv~a@_UFMDi8!& z8el8|l%O9Fkr-G^nzN^*8k&rO-d_Qf`b|ZuH#dM|=8_1LiHXTSWQZg2;f5kkvb&vtmi5MQ|kQqz&RK9Tr^|xmDU2hgEcr5)%Y7(IH6m2BiGq?D4IwW_CBR>S^Sin- zBa7>ce`Ed~=z#r=lvu^6XEBC6Wv)eRPE7dc5zYpmA?#Cp*#CqM^0Ia;+Cna${zIZ9To|BNBrHutxcr>C|`lD-)dPcZW>$jpXRM^|W z-NEeyN+VDhtqV4^=EAZt6OoadA|k$aX`~MO0CD+rt+8^*1mE}8bz@kxk`1~Gceq&& z#SZ)+L4O{52{K5(Xw#`W%so}7T%{S#df^XY7qz8wPsA!PfbUbR$ zB_U#iED*z9n;|fo^%W4PZedG`hmw%ghJp;d$3%Y~D-N9<;CgcXEmwQ3QWL=&mVpTs z7F^snc$R?8FTrJ6OoOJI_m!OM%R^IM!V!n~kL&OApKro8axb2z@*ewsyyiMf^UFP} zRiPM_1#^}Pc;9ODDKi^w{N|SY$lq7taiZ`vQd}hWD7SgOi3{1GHq0#pNXGdj3Jtt! z)v(Z`K+Wz3`U(gA;QID_V8|+9lp?vsh6Fy*o?s9mhL1Ln;npF4{ytPBwUzxTC>K(N zb+T(;6f3Qw@}Tn5*}4r$a^F60f}qwtUKm>6Hs9)vewQpr?3e03`&V*b-1>d(fPCD- z$@Thmg*I_H+h_#52|Bz-+lbFDd=q2+(QT+B*;r^l{eHtd0}23pH8x!JP*`Hlw_0WwWN=0JCtlbb+#Y5z#rF`@Q{3(-pxAZXdk5mydT}*#8wy{ zY_vR}?L#l3GK^o%h_23DdvW^1MP00GSLC_N+W8vxMNfZ?X>Fag&Dl|Vey}Si*iZ4p zCoW7=jM+xf_nM*ng0q}5+T71ehgD$~eR~?ax!rLmRaZNVa(;O(YWV_=S|G5eqSqL4 z-l7#3v*i~_6iHu<7oz;&STk#O(tQehR#Ell)z)$kWa&^9jJ$is3F&TIbWy3>P8Z`= z;vuX=X!kAnV;1PUD4Uw~v)8W^_Gh*W{>@m?ckAxloHUx?^78V=-^9?gux9odHQrky z!wekL_<}_=gwMb$4qTk2E{##YHS3}4Rdv!u^q>aZ#zzZ=ln=CxDq>-$c4i_iA$S2^ z5!rNlqve!PfkLnCv7Opx2G+rlmX@8bEBD4T24^4s$H(`GrLp{;lnF0$)mC7V8*9upT)Qa!ER`t#Sir( zW+LCxh=V}xyQSww?5H!EA8)IF?4!C5X+e#{UOi-2ua&op1s%g`st?eCy%d@f2hq&T z479!o4aV2K96k1LpAL4e86zCDK+i@(yl6n+$EFeZw$!YqWDBtEXr%QnAy()ri1VpE zwfjs2gVRIYfGGB!4D?qbE?eHMn6mk_g(C z1x2YoFw0C#sEHOkUFX7LA%&LXFf%i+eAR@fhTTdlPDYN&n&=}dI;yg~6aJH!Y#U7e zOF7gG^63CUWgM2|ftxukr{QG8F8k~inggt9MM7Y%GibfOHqi(fR#VfuCuWL_{G~B* z6%GsOLm3W+*z%k)7^(!B+t$FyF;Z|*)v-3lkfZ6gerW&zEN^VcVU5n+eSa|#HzmY43OS>JY4*=(bol2|)f2<9 z>~?iKY(T|t1gpc}#cZ8loPmV2i2Ow0b7fg})f?l??SMmBgvf9r7?gNu6O0NYSKm&N zh)4`b?HEi24j?6f(_Tr&f#}T4jY=cdfGr8p9+r{id%3NW)dbJ0LU(!$#qK* z@Aw`7B%6VeF>2YbDT2ykb;gGw;Y*URy15bq=ryw%p6qgk-QaYN7i{e=GpV7HSXgZ@ zd{t87`Z%tR_>RYcs6`GYU#?#Da0fvo;-ft)3jON*CJIGTZlAlKeVRkD61yiyutEU*V^!BKuBAoy)`}8E z2Zq5JIXFN`B@A`MFD%o)%wLtN9Qd7){SWE&k>%*po4!$$Fbz7Pz`fFH`+kpyXp=%a zDoOu_(HEHomD!ezl^$>LW$$m83!1g{uJYx`=Txsx8i-~|jtu7h10V?ZFCxt`wC2J^ zF{z(z4J(%AnP`JiyHu4u*0AM2^+f$vJt^XZM3GJ%$s?a14UVuYy&Y2HZi%SR*ZMvI z26N7-Mh3}L65Rmgvd=yK9eK65WHVf0J7-E@H?vT0r^QFz{_|ORhp!%I>RYlR{nk&J z8_v4^f~~n03>U+9xb}bvrC-(Czm$MoFNtty0xAsFi#Ax-O#@tQ3CEE`%j6ApzCK8Jfk?0a5#-<6XQqf4cD&i7Y$|I8 zh4$Pi#ts{SrUq2p5cXZaGwTaBE4{*1=UzstcTWo^F=F6cNuBC%dmWU6em{*6>$LB~ zH8SA$!(e&O6i?A+gomfmq7S~t!VbECK=)?-%>5EUUMx~LNf;!&j-6){!L*4-gVfv( z)DJd#dz4P3M4xh7?r?ns^AOHPC3=br&nT)p!Y$*j6-j(S0T)}lIU z*7*~tMtYcP9(njX=sgz+wOke^lSJTh3(TnvI|kbfR#i^{dcv|F(C9Iu(2Njb8*}Jd zm}5>eo7GFNHquB1Ycvx^oj6j4)83Bae%pPn~kW) z)tU(2Jy>3{X?FctiML)aVakpg(|lM}3||*dk5&qD-^a5v&}3cuK!QLW%cKs$*A`k(u zWG!7JU1XJt1a~bYm7nQ^AntoK;BxZ1S<_&~pl-C}#M8`-V#n@al7u8{s5=?WekUPq z_=xfMkw%8!u7r4I;>W~fHUzg1?LKlC1P}2I7~CVhL5Lx{`^y)Kq@wMH36%&cSN+77 zDQi?~D!jhD=X0xw1z{y4JCoNf?@I^_Ob^O~V_)(jE|FjI3z>&EEL@!k8pAry-?htG ztM3Tc{OE}binh>T%b2K&)yt5ry+(DE`3U38lY%4~zbc5&N0BIh=r=rk|C`2IA8x=v z0|X5UNNG<62f_d<*vwc1+44%`;7|raqAbHO{9$~>+RZ_#!r8-E(|!3n9&jmz`x%uG z&0fWO7Oo6Z<8yaVq6 zkpEFSp4V~C&KO+DfS+91^!gM(|2kHZY<#ja?TaWIZ@|@h z8fL*>F*b!F+2~x*`RA+E|-2Y$yUZN05~!#F*+EOb=DxOEvi$D{P@hs z!OoBoSPJB@*I4L4{y`wO0dGc2rlj(b-=RkNPYUO)Vs5e5IvGrWdPHlV-BG;_kBPoU zviAx{NfsM*N_^vwp^m@VWMNk(g35?+ZX^IIj;x&WH$WwS3~%RUB@|jqhr`0Q^tRXN zu0}Mf_YboqoTf{>d3a0_3-w$%HZWKV$h~B?3H}X2kjS%eu_^o z%je?ul(TbMW*WP2h9BrZ`b5%&i1qnxWD6Na+L1->RZc-oE~+V^h=x?z7%^AzK`AV% zcI>cY^Kd8u01pB{0N`TUZ;&{22*UWJ#`9$&#l5618wB|Iy&4}etdZhU|o zoTwt^VGQ&L{o2dajz^e6(U~v08wM3TR2+cx+n0-9#qPb0>Tn4Gw*Cl(5e9Gr{7VHvA3e$H#0_Sm{XjzSJ&#FX z9DBrnY2y7AWcd8>2aIn1!NcGSfNUy+f53HNTh4c^Q#q!fJL!Mna5CyC>%YIiz}XS( zd+(PP?;sit9HJ;W|GiGZ(VMGIGa4Qq_T!uM-UF83F!7o4Go>pciYp!f;H z$x09aBjw?XF2+nf`EDGiE8u`81?VV6MFNepvv`L&y$z&}S!8|6pGKck(tI~gD=6kB z1)Q@V7dwp=a2=AFEH_l;j_`}W^RRk$V?+CIeHY#&U^F87%mnLs&q!v^zxHfxIi`Mn zB`RiWv{L->j&E?uIDGNfh<>9V$f1XkmvLf?^Y4A4$KP`~?i3e_d;o9r0gyI0-9$Fk z8qadVb43T~*6tDp0$vCCa2+c6E~F3Hujd7EB#p3)lSADt}2~V%839}@Z<+LC2Uig zFBYCEHOp?wUM_FtA5bz`E{m6TO{~AXnCE!EP&zzK{|1;w9p@eG-R}1E{ke0x+%cZc z>HkcLUEyP7D&oIvS`p`MH;%N3#Is%uhs8Rpe{jsF3hkGj-&@zGV}pjN!r{$jyz54j z>ebi*&J}~xZ?1Zp2Kb*Z9}Z6ju5PmooY=^?R$FYwd$td(M39A8WCB;gTdMdU#%VH@8K_THvT~Qg=N4(K4mwszbRA+8}!HT#D&cyG|p0cC|fET zv`rZ>7-Mn@eFwVY24btflX`3^e^|$JbD1>mFI2M`-OKzWFT%m1fPv@tD;< zi*Z^DscE43zQV!!qAlwxjzK9pzcZvgi5jKrKQf84;eL9>GuEz#wI}6Mz3j76CBCld z`kUEDYC=9^Z_#q>FG%nZ!Azv-99xsgSy2N`DeJMp_wY-!CSHjV03aqreU!*?6GvEB zh@~>;zKVyt_B+5tw3#D=EasN`;p|p9j)%5R@S!sRv7!J=%s6i0lW8(4$!M1PabKlB zp@xxFe;qR<(=rT$cR^H3D5%N#cWHKR*n`FQ|9SxoQ?m3VB6@U_WPA3ptdQ}rY1Cb) zd~t!MH|d>1gr02ew@&$^%=4d%D0{uk~Ovxy%-aKI@O!DP9r*4z-xuYVgPK)qy1`~-9xaL3% zIk0tmf?g!J+{j6Z%}6Jf`H-!XZY<7hzqxK^QK5xmf~u+Aut62;8|sCazgwEF^edTSSMG@}{ zjSs)R-m|ySNw6PsSm|m?umgh5H!)tmnFb7~DsM!WrYnYfqp;2780#qvkJq_))8S_o>SD9abRp3jC)cryRqur`=fjYolPE~q{oDL#g30oNgtB_2WlccqdVbbP|dT= zQ8=iGLDHm7=*Kqgqvr>_nfhGR`dUT3H>;g4y}hcKE+XI^Rs5Z6NPt zW0Kkp(*MeKskzpJmWVI=K81}3H-)V>;kx$YZ=aQ+JECf;lV?4wJ#b1nj>zcyiR!F5 ztm5fnez~b|UxDQN)0ql9%r!@<3Z)A2w!ngE2pVHbtrd5zuERsC)FRHQn+Uce!vo*C zQYd7OgZzP#vEEyxiWAGV$+{Fjw5^BZUR%_yV!1!V_U&q_CnHs19MgG9#E_!CYKw(p zQ34)Q-h`95@HhGRUkL3fzxn7Wkv9FU-US;#PhwD9(xZn$+KmZWti(o!f#Ym$&&77? z$D(eo3|n?*?3rnQqpjTvB37n9r%8vbXOa?XF>X_=`KzhAxW09@B$pjXg=t7EVNxIN zVdZuzKA5l*kyOx%H!ZefPv4KBmkYl-Rj86$SfJaOLcy>O)3aDR(vtjQ9bFj|wd%Og zqD*jD{t3TW9-S!H<*Gk}%6;u<5AwH#1-JQldNr1eE!Hg49^?=GjpkYWS%a$;@}TfL z*_vIJVVckL;Z!(C;M15*^kNr+StYi(*f7tgT=FRxQa3%4l&YukCQGhT-INvOqIiVMtt;Z3>OrSoVvtUz5r%Q&? zB227{gh}3J2BB%*n@Y0P{>}wDyo^q=;(yWs=ODoP%(r%gFNK8NvR&nol;anAl()c> zP(gS8#jkbS1>POEj9Zd4f75M4r<;jM=onb7+4?FSYa1eInkWS$=_(U3H>mJZA_#06 zyTDkkzGDQW!jT`uh5G@OQcehT{0&=dt4f=@;!WD*J!XK+JjMJmtE60eM|+b)7&bLT zJ#M&n(!>grkq8sSt=@0zI4FacFGqAfZUmH)2xO)K=6<1=NQMAu47N}E8S(XAH$a>a z(N(@#faP0sNNEL;IN+0=p6PYRLu>uHE^LO>N+@qEX2!&{me{1W ziG7_vFuTWidF+&cGRj;^;sz;RFu7J8vU<)ywEdHkB-81N+GR@A7xroXvGbuoKdcuA zNWxJv;F0<_{|75HT(t(Eg%wz)fh%p%^tOq8tfWe9H@+ad-N-oLzQ#yI&0X4nodrCq zJ&b}ou$W(PGhW4}0R-@+GM}mD0e31D6cl)Pc%-DHaB*?{{P{B>AwjRottc}>mI=_^ zABwKYbjtPsnd;JXY~@*hD;;-pAy*US=n|lT5ROYixS?D!alx=;mF>=R@psZ9~md|TmpBh)ql+yb|b zkTN0Ajkw2FCIIdaTO-#Ac?y1sg%=Ozlu2`OJxgKUA;)MO4D!`W2hQ=MC0*KXp~r{Gy_# zmsfafn&8)PAiM2Kd`e1*r53m?3w#Y*j?){LXrx5G=z=rLa7B-fmNiLCeolJ@z0-!j zqXn+RGVGt&P5345bZMV)dy4`N7w1yNAs+AQjj_;X)+%cIf!0RXcsYaSV+ly`fL(Ei zx)sOt`NyL%IarKJ{ocj2);J4zE(GxYtEs7>&M9+<&b#n|Zvu4(vX>V2>YHPCiNUSE zYraU7=Y)pT=rQ_5C^8Y6ky~+$bozs9kfb~1%AdrY@3?2;*<9K1FQ4629;N=;jxE0$eN0<^F$sbSp#!i@4cRfyPzlf{XiZ2 z43VC15`>E&<-V=Rc)k(nl;`qX@i=P>_|>d-eWMmMGT5J9t<~(B3`NO4h-H+&e@kn zZ_?255Dx025cQ_c(gDRx6a;XVv08ycMIrVfK}7h(B_WNgv^mdD>DrIr65<-?2P^kg z&Bn2m=!xpiw{iaa{HI~IIYw4zN5tJ+X_`bXL&M)^{o8^@HM5m&hFFy^q{{5eq( zV`F0)Gk%=65)JNl;NzQ7Te?uc`4wVf3t&t6@{SG60#H)Nl{b|u z?x!%&lEV*a*Tl0^RtZVIk>;|67kBlhj87B_4HFwXt-cD}E)tZe#ys=0SM$ff zx>4*6xT&&IccW*j=QSzIsLEUq=K`|Q>}Wl<<|}p z)MDn=1o+*C+S*t#!LNaVQRfsC&jPOf<<4346z63QIgd zPSD=(iW>lAz#dlp6`!jLBR@v@aXfeu4JnPo9$6bs_+I|@_?PwGa16Ldlz`1@eyb-? z#GFNRT5800weipP*$gZz@)6}ms&J=YPZa+t;P(Ox>7utimJ-NH9leCeR~ah?91g0m zkNDU7sUD5cT^3#%9S1^1)Dk;{?W%gBR7_0Ew-Ar{^EZrW3+6gbPEJcxB)Q;TUGVuDfyY*=-{lLA-W{H| zc)aeHdn0iY;W%h_2f${ZCs(~?RGB1)qZ;=i4^&n=$G&X-owOm6_Q-VLnoz2`!MQES zE`nrP+#kpS8n4CGf`f}PS^16{`gBIx=`ko%xhE_HQvhstn);NE}@xG&DpecMZP zuK+;ykGI#5&)+2fU-z&^2wR-(7lL;V8i>; zh>OQ);5T=4+8n)P1N3nK5Ycm~kN99CFGoEqWfl;JLW7zLfhlgHC+r%3iI!tY*)jTI z)C^hu?S2)XH;~j?rUU$vA1F<)iyQ_Gm9$kv_fU5Duz`OWgtZWsT$yX~mveWX8e+@4 z;5_Vq61o&49u}CiQ`>Qa>$Qi8q^RIZXwqj|5WgQ3tOP!#E@kO!ac%J_dqXllrFvL! zHKq7RV$YjHv=QbJy$(+oUgevom+t<)?v0(rqJeTRgEya&0m8;o6+u!pf1XLTQGP7! zXPCS$S+WTTUm1C6vVb0HG#3z-!*e$ygS2w`LcWRYarM%76_5KYqseQBJ^#HwKflPu z7ODsahD9lX1W@mvk&H*JB3P}j$mHbCI6Yo;u?9w7`Kov29e`zBY}7{=vSE%?S5>qL z<4s$qq{G-meBnis%CUCQL&a!mz~G@@cC zlC8JB^7!gae)k89=hc~=o4&0d_t67)jYlw#PT*s5-*>tiLsmeO!s-uvcxXvTL!9H$Ba*LTS1U??Mc zcL#Uq%#C7M_Bn}jXA>(ZE8B-Eo@CD?(Jn*!GXKhK)_m!g5)0!s@Q*2S9tj3ixh*kF&sVdu|DsK3}E39$N>QP zk-_B`?9emMN1JFoS`}E*CDX(URd%BJUaK=CH*skQEpgzIPR5Jk0p?=Z+R+V$pzwKN= ziv6fDQwO_p35hk<>UpJtoAr@zV3xO{!Id_u+^$+8ax`YLmac??&r{Xb2X7baP@Y4{ zw=s;IB|orB2%jk25;$?w=clk7XCG0a{q#zvX@7-te&{e&RNkCKL4yW-o;TegBe0xp zh*lQIL0E0FKj=(DZ z(14T4!ovTxfPV{LF;$@mT59*W9*n@p6qAyYnqjRdC=i492mV_>4;B;Qne_+q5}*L6 zK)o=7??f{esGYEqL%vke*I&5B*b2-QW4l~_{;1cpM1Ru!wauI^5}nOoX6ED;3j@P> zVO2$0IT#5)(Vc~w$F+)eL}Bc(o3+_SU>h~#AwqQ)F)MyFhVOC|?U41nR)~ZoTfbEO zYsD1X#pglQ80TwW^C7Q(y~AQIsjcg=V^~RsoLU+S8wfRje!k1-7lYm`#$RGmlbi~6 z$PJodjpncF9pV9+UP-Y(PezF;qt2P;mxdM|4m&=jy{j53ByB9`2p|% zhzy#yLO(~Tl=i)Ss~>^OgcPB#57+e~v*P`0vwi}Sgs=2j&yeXfG`TMVbL2NC)cmdZ zlo7&W{cEkdS+}$4D-CAY){4g}DD8hP`s6u|{c&Bc=3$t{!~mC8s;-%_xyb~z7*@+{ z8NOQ77rrR0Uw++H@_a~$ECn_dZI#5$QiQare5`J^)QHlQCfqQQ_O zzA2&TGMxW98Zz!zfFK@y+30AP2YU>EsaW32k6E`bb6woH z3^)s1G?(4_&KGZui>Te`#(#oekYq-xJ(9GpF-u5FE`t<|EG_cmIVQ6O77Y8xe5g<{ zE?&{6_?UyaapJY!1SS=n^0ky|OZpBz|BY2r;IYi??CH1`c;g0uTN9ZYc0$A>ZsxJC z*7av_Eu+LzBk%Qy&bbMHGVT*ZcR1}`cow*s7qN7USu0$8-u>H(`S^UC@y5jqlbCMw z?I;}_PKEEyK6d6(AC_?4!kOP32LTTc)UFa2XO4h3l&z6P@>my}m{R~EWb*+n;g9$^ zUVgxwIf_rA9E)S@bpW^WI8Sqoy))Oca9uO%Zg42rRuhK04yfZOf~35Ovbj+df}K=k2}aHdvu_BXP2bqzIfp(v4jpXKp%q%>SRx z&MGR7C|c842tgYO5E^%PcWK-qK!UpyLU4CzJh%t<0KwfIf)m_=ySq;1%FC=fYt2l* z)#}q-Ri}>b|ND2DFDS-!3e3vJw-aGr?{>sl2oh`X{A&57zMXX%SM$Qk55o-YQM+RYF+gO!0sTJ+xC^o zV?s$nc4nA_omu9nvFT`f$!M(RPT!sksdg9GOI6P4v^gAGrvoO&G{PeV&mn*In++^$)9kc7AK+K~@LO zK;EcKoJBjwJkL|ZI&Ndu2)^Z^bkcFW|2Vv6JG0Vzv3k4R`WqpsX?#02udVePfF_im zgGH}G%_qmpqUebpyxL!O#zSbnDFf6R{n>*?bK=hQXjy@LZB`uKCH4Y)!e!0Y3I|$5 zeD^o^eG~wzVV-*#TPD@>T+jYL&L6v-I$(S-?yYlNdGH-5-s3reMDCf0JYI~Pux>2QoG`Blx zWfyr(SJ~u~-7y0^0q|*FcjrD=pbRnChd;kwFByeQ;w)T`cy64L3V>0 z$hW2!*s$Nq^LwaP!=2*N80*A;CO3G5jasdURMHT+@sVj%B_bED!2|A6VqLMUz^Gso zWuomg$NH=g^<$9WrGvFKTmB{a@j?bi(Qlkmr=vmd zTpaGS8gbn6pjahHTdpI9j&<%$^dzs5+E4G|O`vzC=zKk+IK|Mp@&v>LCDk`fV_YNU zV)>`Z>XLTLD>RwB${~t*66*;1-l6Ks+d2E8UE{RTZc2 z11g+@hnRQ@PzUFPHJThp!#C!vO-)tQ4N00K8|LAH#?yx-eE6Oj6Akj^Q1)c_>Jj4# z%@b1F3&{CWH?_8wg&Y(5L9MkX4!>busE;ygjnOoBu^oF`p9|k!JRi{Alx%#{1FyV@ zC8?rES;69p{a4+4QX+6h9{$fu1dvZ{#J@Y_aN;ve_fFc!;+inbR6p`mB6p4?_kH1> z7%x-dY9o`>h`r=6Dc5wGC8x{1FPHCna;tc}qvliejS~IT z_CpeW+Uof9?c_Y_PAbr*#vY0>3_!px9;?eXyPBRsp8|x;aK!AGJU6JuBMGkhjJ6fM zU^`#El7?1ROUY7C!i|{SOLRTA%`=sDjF^s=mS5+ry2jGn6ue_w*Ri1T(a8U*A-f3} zTk)+pjyS=QOH!EDj6X(V9F{pocXsEoVLtMFx~hmPcS&x#HG^1i9Nm$vQ&pv*nYQn? z2L6tl$GU5v5~zrYK~4_9upqGI)@|j)#XJSwStcEiA|BFfIp>uq5=S7KS00}}f^+LX zxTK-=6M;U+g<+}3lY!Q>mFs!HjPgEt1GDU|8s(AJJ3e#JQM+tC7R4wygU-?^t1vQe zXCK<|>xbbCDQ!KQl!a_rxysP_hZiROGy^lonw%0Uwq^i>Rd_tE6i8FVK2AdmAq2@n zAZHMzBlR(?y+7jjx}8*3XxI)K;`>93UFwq=Q!`VL|_6js4@D)Xx<&TH$XIwwhJA~88Jio zIK1q!ZJGMNQ3u;pc7krhm`1 zcKW4VoiKTHg5RmdJ8FjR#t50*M^&n#QJowlLSI+*53a23kUS;e>MdmFsZr9rr+tAk zS(4k=n)mqW<0g(7y@i-@d~_!(>+(w(x6DpFPX$`h&pQCbt@F{=w9~4A#lW|nj0m~n z(D+nkX}DP5p&z9mxnyp6T<%)|b@(a@Ny~p^k8E0|BHd3VTuMVT`MEbDJMHjL)yGviCs!SyywhvO-3!F_R1j91`;!3J z?(h7wOpWRNNJ`ETV0x+Vu>Z+(&}0zs-z-3<`CXPJ;Ae`*i3i3%1G`+)Kg9{_G-ma{ z+=Zl^VkqgjdET|9T5l5@Mq4B{dpDGQ7n*B+v9BtqsO#h9^;S^&CKVP9gM`RPh&+Ia z=~u<-FH7ah7;m#cRUiWOKw4f}mj(PW>pjfbok9$@-oWNSdYT9@I;<=jbSSaB|L#xp z7S6|j_G(Uvc=AFKqgm-dotGGJW!QDA30aU`nhgSbrhC9Y)r zQfN%SkC5W)7$r^Q2LdA@@q9X){OQKLpt$#5U3q|<3|aZ}yhOX;McL7_CtoPXeH6bD*f z&81UyCTI`gO)bAjTX2)YWVrLnuwM(D4>7P!bp($Re`;D;zv?yT?(MKLR!-y6ZdplU z0H2*)j@F}|=ZDeWCCT@f-tf@wCyKL+GX5z4;1Qd-bSSU<4JI2|r2>WNHP zPfkAqZiJke6@Of0m=f655%_py9WNS^Yp+qJ2bhY7NEmTIjJQd|b;c;;3%^r_@z@XG zXi=_EV%j?ORBNkmP`3Thly(G5s;Ef`rA)Ro>?M4*=t)F_xm$QPFZUzsc8mddyWdIb zz;h-#u2i~u@L;D~MLH`}#Q9t%4J+GF!Dh2On>!uP%>@QR#XI;hZbzR4FGK}~mmTrI z_8hhKox9Q|-0K|`qK-HEYOkEFSB-<)WAGpPm;QxYHzzX|zNWqdRGWtm%Mzi{5RsU! z&4E-b8tBF`9WD|b;P#5XxxLrjXSZWlAQk-nAr@$XA_?kgJ*^4r9d_2-#o>1wusxx4 z`AFyY&xQ?RV9Z3$5!@(+k*~Cti1u4cw9wvh<$y0|kz7{I)n}4Ww`qtK2U96q6)nf1 zm7S@%glJLS4lsxRV4*8o4PgL7dy8&kjlYh|!zz0Di12?z3Bmy!eoh_mZ5j%N{pplX z-%L`v#0Je9&7ztF-q>1m!{pwLkQpytwPYLnC{!?MpIOcV`aHHA zt$FiFd|v$g8CGPb`=*ksw5)s6sn=r})y?sBWYx}Mf1UxoTd!()nV1N3T!--(zag7m z?g5Nwj{b)0e8YJorD|4paxB*$7UIP|Fo>q@$pI!FMRsJXSokM*on?)>2<^%0ddIol zXtSF_%8;ox6^}BlrPCXJGd(vqMNyJ(@#HASY`opLJKxy!9D-)zKqz;V-&4GmdWlCH zKwDqzG`L#s-ydWpH-lOGvEo)s%1hFa+FwV+HN)IKAwNLk!sV+MWZu^;E+57 zGtmMb42Y(Xxyw={s^b!qwr-q2!&qQn z38)t9<-l90!KEHb$IS<8XcEWGg1c;c~uu zt062?wKXj2Z+S3NxxX*s@{{%fMhcx=Pl|>JilnORSv}|h{`kgLhs3!osmqL8)M-V8 z{G_9j_8uul@H;e@nTVX%{HNL(@r_(qJ;uF#fh1X5mm-mGZyNt$GfvB_5kw_;&`Vy| zmEC9t9wrV;3Kd84G{R)y^UB?)r}l&d9PpYQK^-W+wzjt7wGBRgB8?MEj73`7_j{=y zbvb?7*8_-Hg!Mpd8%A_Np9Af1u9fjB%7g&dlh{g5hYA9ru=c`TmD>$Lq<$9-1M>*I zl3b(f=UJ^{{OcAFCTv0_3Ff|i=P%eGkm^2Zx6dQ3Bnhp7peRltbvG<-BF5FpS2#?} zk7eOBN1kd4lq1^fIDaF_lzOMt_ac)F(nuAs_RtPbxooYzqxxDrd+1Z!E?-tz z$wEiBkDlAL?-WfUvWhF)=9u~7-P9B-3Zn#jIIfw1j;Ab`RW`nC=%G?r{K>6;FME_M z*CIm1v(l@6;e9XJ%=LhGDKgcLO&ciINpJO)?6*F=SoyKIpnq}c_l@pH796cC91CmT z3T+?HRn%$a7_q98%F`Ryn*&ni7acl#J&J-M|6F8U$F#lO@G8AkReqR@Cf^>5OS0nl z!qZs>(%e$fIQU8t#br;iLuF&nmFD9MdwGSm4-gmR3LT?l%pQ&1Ii^$wkKZ#%t3~ZJa zXepL*#=J6TQ2Xq$i@epG>^3ySY-k8Qv`2poN@Hp48K3V*&szP7CdPb&STq?f8c7Z7 z0X}Ajt1_B5=s*ofG4nbb3WBlZ4|4g`NJtAw7lD#A?7&ZJ8)+2FVr~t+$_?})DqtGU zVEM1eNhgDV%%7BeQFgasFq6y86d<)3BpWt2t|?FEZRz)aoCU9AWtQ5u}cQKqGQj?(&apj)^Y;ec6L1` zOtt|*G}wP2IxsLaZ@Vr9s_oS1nRz7-{BY0aj4$<9Va`|WAz#6?@t;Z`X|+&=_p8Zh z2-JYoPTXJe`kHDh@U6jJm13{@ZWAhk4FgI80u5omBYh;S_lP{MIoeAH~a7MZr+dUMVLr` z!k&e&=E?Y$_~Ag{4t9Hga|HYId?4!BIJy3TY;^HQhG3r|+Q-rKp#5ABqV$~R^GQsn zA&`2BiAYAi%Lx7~R=)2Y_J;f98i&DCn@f~&wM0qm%j~=W3%*k%8QL4n^5TMsB)Rvo zejkI-c7vK=`dXpoSHmK&%()_V$T!AD8fCCRVsY?q zZ+p_mI&GB1%d}HMNFyILFf=%$EMLNgQ#e^m_kf3T8=H&q@uR{sa^}`{pt9TccRGi} zvC~7#MV^nU@T2WSb&ZPq#mMLOAqAWm&55+<3gfILKuNE#idaxFYGiu?7@az@$XyGyG$R+~c#uWzx@^TNMq zX#CJ46`Jlt@|?*pZzQo*&cGe>fWo>}wn+!8jdt(zu86+AfnF7UA0bx5u{UjmCAeEd zT|zgH&rmBVq2oP~E2h;*vZ)u0vH!(9j?%W+uJuLPgedzRyWK{xj9NYF!Y(q`fi|H;F#& zYEx9+)!1U$#k=aDzKiep8JA}tv^JNM5KD`Qq?e#IO?#SALh=fOaBVsLfpoO`u-iGX zPz1U+$5j1Wq6LA@OG`<(4clC1jz=}obuMB3!TdXQ=!e9)z0eid)2DD^1IlnC>5SUD z?Us(=ck0E4H6_OiW+&W4Ef)v|%-Hlq&o?~ViX5FJkp)hK$O(4S z(rcnNv#z1xH@3uluF0+R8$$cD237J}m88zM382Y+lmb}?ahQutgDa7>H(XKKkd>J{ z^6V}qW%rNmml5s-js_vN>in|E!m$)B61QR~HP>uB-8*SW+ubL6JmL`s`fQ4;udtta zyV=w@gKU$QmzTeHbyky#BO@ap93Hl4X64Jf&j@|j2#@BS9U}J|powXe-}%DXWA4VQ z{y=rC8gur;iDEQ_xpa5Tm%v9mxT29+UmEWDh-QnW3|q(Wxmhx)$ttED*{3wyua;Q} zDLXrMSm#FJ9WIx@xs#kr%4&=cdDgvat3xjRMG4FGfCyKfQ@y*D7}xQF-p}$pXXk|Z z!|m;4lxul?=mf=)p&NCFE^Vb7=0r0}85%YkS>O8Q{U_@fcAcoHIfm zD=Q40S}J3&*HkLAmp2YSFgkw75-Tzc1+hk9d5)K$3zVnak4n#>l-v7WC0nA#ndiGG zi_FNc$0}lql&4za>ZMFwdYkhP$29r5Ny)C8jW?(lQM+ZI!Q=Kz%N>|5$U|PYf8Mr??0YbhKNoT>M5oeD z`qu5NgNg~zOW)4s%3qp${=O`wa#b7iZryD8KuPR-6T@R)(_<@|o!&sSWS&yI%<|=< zHsDg6{50SAM11AW*%3T0!6Pi?AR$i@41H~m(jBmO77kk*=c_SV9&X!0|9xv!K@=lj z?&hD?VuvpllyqSK9~DS-?j{IAQZQ!2!d!W9N@Bt%EiOj z`3`8$TEf|ZLP^f>;@-EP!@+#&hEO+q3HEfOjZmIh+6YJS23wJbyMDI!zco%RY`8&~ z&R3K6Jlc2cm2+yYzDeFVJ zfDkf2_`@36+S>Yo!#u-f(W=ILl%9^Rsw+xMZhLz>F)3*=qj>F9gk6;^C>4U~U}$Lg zt$P@*n8pB}p=V3gLZq#OCY?)_ys<$)HI+cF*YnVE&{i~GdM;<6JNtCcWwI>YvCvh2 ztt7f3biFv|p_~}Sj34vps7M4Y-Q%SK7P+s+mRcsJwRGh{Snj!ODQkrN(}l{%KUb;R zpfYfNNEaa+7!>PM1AEz)G>a~DSN(@VrhY|*mr#>F7@v|nYg|i1BeBs7R#*`80M=lGv_;R)dh8QMw(bl=r|1@`u3gYnhZCGD>Fb>yfc6_nT zW;8aS*qCCHOM49W#4te%@4S0h>Z91$P zrm3Y>q`(Oz^fs=N{oYymMXcevA-S!YFP*MOnIPewFBI~${{yJpnbK>`V{_hWm$YUw zhX!bmT?kLhN1KVKYSPvv6IlVWfJNa&j)eYrn@20oAARYk*4=_5OYb1YS5kKU?u20_ z$M9B1Eh`+5$B=K`ww5OWt7IbrjvdnFK0Q-CDhrZHqNs?0Lj~~(7m*xeGFW@ngiA znezD+MO2xm5YOC+QpqOG(KtBQr339Ted07HQ<2Y*V_8G`hZF81&R?wtT9j|%BJ*~$ z<|!)821{}KV~7wp8@xuwtb{yy^VYav=$x0Rl^)z~qT6M??)-wNKzc2LxeQl6%KQ_J zd2I1-_^r=xFb{L`9`Wu%bj*Zw-C|IPg3OeQ4nb%r<7S zNxoUj_F8g^sq9ouG77rZ8k(AgRhzu`Tk)fm{Ej;cQDI3*NrehHFlz1ll*>{MZlHXo zvJi1o!wIT~a2j;eZ|OrSkw0v{xf#I2_>-kiS?{|zeJ0yDZi$nG@Dd~bof?(1QCdHF zxUvnwNCY#N4Nce%{_YilY6=eSMXebpf0M!Bl8=~eSrv_;XNs*j`dCnV4)pEoZt z%l-y;r9{2x04okV9R$E8YPk%P6t`@YGzI0xuRjp+(E{z(Oel{VB=SRV=u%bD_25We z;xDymZ4a441ICyr$rmT`_{9@G!`dJGaTTE#RTMoY7(DYoy`2)}q;U8UzW8zWuO(s~ zc66DL#0M!%8^VGe%uv9&?(%sM*B~P;(GohKZoBBvq)WXN-(Q1DJ#Gw&?NPQ8d1oEQQmRP2kYYEPh(>Wwju8TDRVTW;^4tZ z=-xDh&*9zEPCa&WpW4H1Da8gJx4F+jH^tc^(-=3Hc56LGKHc(bi#h}&5<(7~)d;_t zAZRF+pS<6gO)spFQ}1_jSb|Fyi+IOCd)eD5!90H%VMmU*91mXI%zvh8<3k_Ev zi~6{G9z!);X)oi%gKnKu&=7ucWxJr7UKih@s~ZFzUn0yPxAep_E%TXCL)$RL1Y)5uO9t$0sU0%sFUbq{q zDdAR4u*kBMv3O<0?8SMqwXb(SjG3s3<_6oQ8z$oL)(4%f)yFfm?3p6|6|u16ChcrP zOIA;o~-3lh1lBI$kR2zlA8JB;LNW&C^I4GR6N2B<9iz3t z_42+*L%>1uQJQl(Y!);BhOH5K=FqB=H{kQp|-r7X`Ad%Kmc5N2Qq?ROybgHle9@=cK4R9KTXqakUNivmn{XT#XEwq*Dmxp;L_&G&C`u@hJOI@L?uphW-N>t%_N+eBDh(|; z!!FcJ20>%{`&c=Da(fw+Ga*cV9gmxD%9fP;6K^`Ine_3eR!VuwLqquu|O%4wZu$J&+QZ0RbeeLb-FK{apF7CZNHk!(K%-vDEp9Tq|d6Vu@@F{C5wxTU0q#y;CLfo_%3Q|TM74}j|DFB)qtiMK#pf; zH6yTAs!XH}4A$7N?Y?|bx(~|DC6AX@;%o@CVa|p2NehMbq9x}ptclNOCtmZX`;dx{ z6Mp>xM9=S7lEr#20vj9M+Uw?UKWPf{%%rr9bmlL7KW9VM=kffxZH;M^WN~2 zuf~2Yxx<&ldtJTUA#?oG5)jMMx=amhk+OeqViFB@#OAd;BNK_%jls{6?eKxkAxF9( zV5N-!lRT1`l|>RWAT2G8jhVzqh!iXnIjuGfG=&~kDJiL+N}LWo&hql|8;Xf)Jv}{l zWON#UG3b7abI-BNaHsaSaec}k)Yz29o!l)kj+l(I=hDwsN50tRJ?d}w3hBS*FKozCO42M8IgPp7Hwa&Xw+U{AZ92CNw4{C`YUgHW|qE7yz;9SZ?m-fcITj-Y`REenjt0#h`)26EWfq;m3|0cMD+ z(GX8CCqqck!Y^Z20w&yKeT6P)Fcon`L}*fKW#)K$-n99h3eS3+Yo-;q?u`R0qb_gu zSJcy{*@HSTS`kfnM1(q`t>JG}REr<(JCrW%8zT{2)piXy(czEwtgnv-4YZXLYjjBd z%0yqcq(mIPy!SEB(RkO3cHVuP;g(=0EfUo~7yuU^;yY~+C>`;C%O*K%7 zK7pZigw)r*HgpY^Mhka9!)?V!UdHF@qD!>m_&Zkj7Z zjgtO{0s2-e`vR9}7w_i;8;IBGSyha|^R>*`fN)*ST60F{tIGtLr*Frdn1#XPc6VA>5&_VKI#*R=4gxtkYoaWsR4AP6P-{W{NjDN1dS9Vz+!uEpdgcNVO?-M`6x7o8K_KXR#~)oG^{ z5Y1G^Ntoc7)fFF+dG~h)O=a+xrY`x$(#rQ`0Nq*?uJfEY$mncFx8@*1jfM6;$$1@z zYLBU^voh*Gw0{y@J356$ee)>YdEjU*!M2-T(N(-dpKTW3lZ;ubB2& zu96gFo$_ShlZQaJm<)P%+cUQnf?K~VJTPRaZcJe8(nr{ZgiU(vCz%2y#Hyb3m&5d* z2J3Ru0${9TNQMs8%bjKYF(pB~4l!nyk_k35oNl|=Lf#OI$4HftzOsNMw~+KgYBMKR zZ?X@mePe>Hu0D>o2rFgo{&W$GZX@ft{Vc+O1f7Pqw#OLX?!0eN!H`FV{05{WkT>H}T#lxIr?sL}3oK`iueQ8~qNHO1u^DnFk1sMQl0r(jJ(_ft|21_t5$ z-#Y@ZdhGScUY~wqOYkXzG`P!)TY;sDPlxL~dMXN%4Myy}C*#1T3OGZv5?e2HE#Gu;O!Z83 z%&1_a{l03mC>h4D`3nip%?jo3OC<#mp@5qFviz{wuR<~iIh8wcH){y zr*SxnJ6T@r3*1hH8GpZBY8cl!d<#a@;e{2+`4@n86FM~ z4=2Q#CC@PmL%MM-9+;h!2aCx$$%Eh!;4o=(8(}ATy;|kGUgh0Z_dlg1`|GC2e3c|B zw^mE~!XUp@v42T^uQ<$bEAsmBke{b{V))L3;@t4j!dGW+c%;z<#!tKXPbtq{vc33k z(FO#%0h>^$F=Fq=*M5bnC%INj*d){ULPz&EB3>4!z7GWhQ`C3`ZqLDGO6N+7Y8NaG zCHAxQF^MgGVWg%L72{zSt)>^}u0+=RxQVCL>@+YEsveKV?)tKtRw`N|8VbH`o-FJx_OXiE3)FZ<%yWAmAaP+fdC z0@K^NP4*kHImyd#8DB%EP^vxhfT&NCy3iASty7>*w7s$vf}|ln4oBxG6gLeiZbaXvLqUR(LO@=ALiMW~9HuN?Fi1@fSU!9TBPHJ*riSzD1ffQXv%)#N zf$KU9pnJnwPFuCaHqt;r4zVQg7h|y3{*GjU6Oc+=PBs6B1YGqM7lpTBoinSDEd}sn zAs|W_F`}};BLpnHQNPH^2VJ(NS-)Kp550(hCUEEGZq*-3^k`ARW?z)Y2W&sC0LCcOxy`p&-&q_kHm9ulu?0 zFRymzIaA*=GiS~`ON8nhSxhuyG!O`cDK96b4g$e_c5>E!_mJMOU<5mAxU8Rt^S?slW@IEC zKo&z}2|c!UkaE5{&EE`z!-9a&q3~}@-?=8`baY@|i)K{?ftHHBsk$f+p3LtynB*Se zrhP%s%j)F?(PcLHZ6;8*{(bHq2gsQBXT-pel>KHO#APZc5Tfm{nZ40$fpGUY=+otq zP8Ll$Ne{x1V*E^w2s&fV*Vw)f%qAtE0`a+}`hhWd^2Ex2y;QnD@n1msJ1i|F<*-Q_ zUf}&C`DV(`m~rlkB1QB4l<4)9jp@<%0!ku%fAJaw7Nr z2k|!AYc=Hz=x!(J`Jn!6xWePz-o-*LEYZjlpEK0RoBv?i?gdYRpPlsepyR9al-HVUSsP7C9tP0}|f??NdQWI%reCK>Ir5={wCPvGH%vrbFjDX5r%| zp|L>}^eb1bW=0QxCIE;wWW8y^m zB0yagZXy6Z8;2{1X9~`%+vgN4gizH@pNvS+Ep&}G4?*mq9s?6?i3dZRr3lo-xp0L0 zU(|?`;$Ziqph{TFG1rpF%VJT<##8;oP!BSYsH7wtHvGx)7oJGcGH!C15iOc3mroU* z9yN(d0nZ}5R)#;%Ejv(EP))uVLzA@>@;0Vak~>F0^-670HLn=En3hY7GpA*$*V?n5 zZkf{1FP_xIilSDsdoVN9iLQ*X;PqHtuUbd|9a;p@=A_^{0S?q=hAc0mq?WKt!Z zUD86-nGnxFqP{URU(=MDdmY_!f_dD77|h;5GtL^MMaILocDx3YiHlWyq%r8PB4+&S z)(~Dsu7r&CWb|@xI&6{u7<5+j5XwYhi&_|1*($jv^rm~H>BREG6ZOyP_cJp#g_x?E zu$!HlXLICpykJkaYVKk0K8-Pnj*nJLSBsjCna<*f=ZLLIsQFxz<(%LgEk-4W>xw!N ztSZ5n6Q`=ON7qir{F;L!g5BQagE5-P@~GypYy5Al8NwN~_zZeUE;@%-gSajcbN%}L zFZ-n}EiF+k5iC`933m;4iFa4VsK+*RhMCcrzc4>C!*n8bQ+1Gac6Eq!2XrxYJ9H9t z&~@1AF6$<0IcnvriR#pr)E6U{Dr+!nSmK9iEE32V0+S>KR9Y2NEr;q9tJ7-l>a41@ zt2ZnuUgeGCnw!;9@MjpvAJeIP*yN+(XXcmS$NFHf=`qYPIWp0bGV_@;pf0&C!zBrQ zoVLee1b^c5(A+Tha6_xSapG2?zcLEXoFnmK{n+@BeK%Qm#`s$I!zbA1uwJuoc!Ms% zMJZOvFZ-DK4!TJuVW~}N?q6bqRMIA6+0v@wPiRFW--T|(`@Qr-@}qc4@Xz*d5liZp z4_JY(3p5Bs4$KL>3FJkz3Lcj5lAx5hk>Cwk*WhCaO>$D8EQor|HpXU0Ny_9cbDeXV z8lE2>C6_7}G+a$DuBpML%Jr^Z!_`Ph&aQ0Hp+>Lf>-MMZ)a{<_SN*Voue3C@t2DJV zskDW(Ewn7Oi8Qvf?-V%{e=8m(F@E)8j82?S!b%jOeUL+@&7;F()?l7ti%NL=6*FF# z_D%uR*3^Jpi8V@DFYc@sdD~_1R1r`d&?Wx4M^MtHPqj~=kDr>Bx^?<(o`o69 z5Az@Tbk=w-iFS!$g@=W#h0=x8mQrbTD+$bZ&L$btd#} zbZGTI>f%*olt-0sEDtYE+3PjsHtN|6H(oSUG_#C1E@3U|E|b-fG=8n$u<=`i`(=Eh zddR+0eAv8Fvk-Ck^T>7mcUfJ$OXeBVONOsHU*BkJEgV&HSB^T+ImoWbtl_UEuARV6 zy@EaJJ+_4nh0BD#Hl{cTcG`bvTfQ7S3KFDor#Wms7&yQ`o;x1jSH9>x47zYW<3Bme zcrVLR#CoH5`{jD#j_5Aq^lsB}GwVbYFPp@PYtt~>VRO3sH*_uAOq{dlwg;)Fj&hJv zni4&SAg3T_)WpqX&g5XrVG9!n14jgB!TPYCT~9mT*j(c05BjCzvEu0rJ;B(M^dkM4 zvfTJRvS}6$($j>MmrVF=Y;MeN*edys_1kUlcM#R#S#sFa=>CXpx6#z)*R`>?-Mf7} zCRopCg)uL&-zcFaY^Qy1k#$uW%pB?1g-sUVs`sf=a=e_2nZjH}@_^Uk{I zTvqy`2|F5(MaXYR(kt2U>4kM#^$652??2t76n=>K8;E8gZ7`r& zU~6%rJ6^~Aw*4(inXl$dsq7?w=0WLnaS8vVpGXzKTM~Uiji!#{X{1DSmW#g^R>aN3 zSVo91&Dc7-e!AFHPq)^b)$Z=xGHq)sR3=ne@=_{CD4&h@jOVeCv&2^E8XnlqIdpg# zZh3u7bJBMfw1TZ;_C|jqIp9rnU|oxB?Z7N!h!^=BMIbX- z=(p$loAXD`6{}bjL*y)MdkSKo<0tQ1>FcPFug+`>Mn^u;J{iJeJO=E&qUw(_x5|CR zx7K&bBRU)UMNL(M4}+pgQYzkAW67qOj2^GfD=qabTI~nzcBk*`PhN>i`RJsL-^<*Gdci_~-SvO>^$H ze>VPXp!>-^SwGl3oLzYJ-+I0H{N~}~OR+v&d_r*dulIy6Jwal=h@gNScf0c_1S5Bx zVT2l{51iJAs%#Z9e+CHwv*g5V&wmf=E`aHjV-lRKn*xlNZ-}ut` za2jJ;#ku}gARfV7cA$t)}wD-uwvf6EMSXgd$3FIy#J{%I+sw`G49J!xIm*% zq*qjR)tF(g(oyqJILOkd&q+p>5z=I1IJhRXhAtfI#kRrFoaQ=t(5aR+i|_?S5&PYh zyKpJY+Z(zgKc#VJr5BVdIVL$eIb?*q2zFr!wK?lamdi73e z&0Cv4gB$PC_W&hCcl&T^sJ5kAh4^goCMTqIk|;{#9md!Gu3F!R8lfk9ubrd)m4-hj z8lobP_qCmmqfdqOlJ!(xSTh0Rz5HAFgnUHn9G8&NOJXJ%h;t*)Hn^lsamaLsB+m$bZ>OU)09%^_}h8Pc&eY3_FoJ&j_ zn%m*t<`!&7uFr6d{5W)8fJucx60N0lt~4{gJeH+DrsG>TxD?ljwydzsuv{ikELbX7 zA~4z(-uAbprWN5zg`7GQyRpGRw9c$*fya@XLMw~t{a4474OYLepaC(7P4lUW&F#2r z)iCxJC-3W(aJS_VIj^MgH>d*HU7tEhUFdn}C)hLD9u<50`uFqe4OiS8-_X&i6s)dl zH1i6~2`jT1as^SEIc&^~&6n3c++hVc`5RXv_gQ#;Exkdu9ewg?d5>f@(DY5)%2D&Pc2UMz1&08edQ>G@ zRhv&vtw=}DQ|<_Djf~Qd{+(kct13&b8{V|~aKk>sG=^rr#LHZWDve zeo>7&*==#{d{}$&t>f!2z7wQQhew=%x0G0s3Dp&H`PP+-NPm1Iq!}D+d{UrGq%Bc@ zCDBBafCq$->zfU29N`l1}=~NJJ z^AL}c$Lwb6zFt@)b0F;(+d_~ADI#csyvu@op-(s|86fGGCsY3aPj`tIggR< zSUg^W-ePRTHtlbd-0X3uE^T&e@x-L1-H@7;N~<4S>D=_e;8jEXGQY#=+KaA&?pILT(uC=5*lrv^CrI^yElYq z2-FK?lBh^BH!;J>9d?;!tnqMWLgkQ``k+~=(Mo*miuwWW?;EtjNIivb-(EA~mTsrf z&Y91><*MiY+$3ikVH>p{{#)TU!@ez%4v_e(j5UR|1>uqvFSlVB{xx(~ZiDwR2ChRKxo1HFv+tIwab`CUYl=4aWbpXY zO9hYAq_!2-5VOg&*{I*TciwdvSnO8VJ4wG}$a(k_1bCe9mm}H}dj9tl$D|I&5zR;y9lLxbVvAgx5&nsxTLC^pVCM=d9M7X4XYK@oajjYZG=i>1}2 z>hsY@%J%$k^RW4RThqx~tHfQs-CqO@idv)7Os^Iyp9mis{GcGr2NgtfDCi6`&1A42 zbyo_vn^G0k1uSWdV!3zQd$bR7q)S>XjD8|T|C?9-^&mPbvx;dyJtp=k$l{T}V zUXFT=QOVnz%x~fQ3B+Zs>7fmU3tx09gpTwwV6AnxGzctxpgiv%f9f@HVp`59MjW3BwnOfs0-I=myY87k34zNDB zUp|haT-~iuyz`RqqZ7S8_FPhIS_t0S<@GiD!~YMacyyd%vdL?UQs`@(#E7gE$&?~vU$a#1gpbiIVKfS@BgcxC zR81eGK79M&>(3UNt+wmCNO59bYf$+IrD{j!no+d_#<#x}0*MyQqt$celj6 z{QZ!Qtes3Yy~D6@m1@n;i+r86C9iKKEb>pqg*$pbk|A~kS|SET-shgS7V~q7!|3aF zsV+l-5d#KASXR;6aPbK9Vph^oLSBO6#GRY@Po0xLgLoFNuwNEsL^5HD;;C-A%(pF< zh3Xx+injz@Y!3}~GW|-c)$`VGSk_sQb)0vnS)D&Z7Un%UY%Owo`VsWkH+F~_0VQ+Q zFBIcFMu;dIjN=ro{R@Q~d4!(^yPoL$pUa->&HlQPAq~S5;vz-MgbkRVY7p<>R_vV1 zxypW4=lDDQ@SE~ePs^I0QERyGe{V04jRx;9ZMczEykW_<%$X} z`0(6QkQJl3d^r^lmtlY4tL^NhhjaNX3wP~o?&DM8?eidugu!Ek;KX!)^~6dt#+O{i zX0t9PJV*rN?R>hqe;Ir{@T)Cjpa^(lkYS^#qBw*%f&uU`sXllXgVebUIL;!(= zJOqG`_7<)tP!D@M2NwYkVXA*C1c1-aWHu`3za_4=!c;oSs!&PC4;D~vRu0zJR3d0l zC{*Z!xut-*l+1sz1K)(HtX*B51lZWz-Q8K;IawV)Sg~>N^YgQ@zh-;=ngv+F;^OJx zYU07-;6nW$A^$B$%EHC$gN>7`jiUqfS+0qx<40FvDynBi|MT}BJ1snH{#TQO%YV5A zILP+=gpGrho$Y^Q1FS;NQ~^~R4+}dTDI0qW2Nytx2roOA(7*NnpC|vT@&9n@{x2sd z2mk-&{6A0ri&Kd0*@6G#(0|bSM+M*#K@(#8ALvEUNU-DsKp-)Yyp*`62i%blX0xHR z=P~I7YMj~dq%tS~5!Xz`SB|wmjy`|cA58V=Uq6`pXa37Pc)^-N9M{_OwqGK5Ph$W% zs9-=pDbgs?`T82D~Gtn=T`0mcAhihs=i7|Ma~)uEq|{#zpCnf;%ne=7d}W)HxU5JNG{7SU8irRq@M%2u%Qa@Qk@J6k3{exuCj`X)$Lnq)xXJ*h z&={n&2vDb9ejN%SN@xH!>3DrY>pvMg(*B6K?e_ZnsrE~?v~|AM^}y4VrR0GBU``5w z1~`GDrBgq3E3$Q%6Y7a&=Z-Y03qNmBc0M>xEUDf^(XgTec11joEgt@GcST}p$@8Bb zVwd$t>?LK|Wu}1_78VYvPm{rW2LEp~2vw?cC2Zc4dTP37{7t)fKIoZ2j0~Oz@-gmI z<`{?YwRw0>^rH6r)6JgHl$7ZI*fIueC;Lz&|5+f&Eu5IkIxd2H6{Q!Ec9-%wMEIa$ z@LM3_C@vzn=dq(t?K)jB#T${EpSO4IlK%;+N5I}|GdWZ>91u*W%l9EiGVFCj3=tF4EaA+JBj%pjFO6(#TQa$FG*Tn2UwYKRfH5LgCPN5!~v`R09%M_chg#^Ws>R0L8vewqt(x}ta z|9I0&+06~vsxC0+KzzLvluU<4_3Q-%juTN1I_6|rxl1W_IVE&hlJdNK3JBfs(5X{# zatIVQEXg$W&sZ^G0I`eY(>F%XR7J%ptp68|BF|J=!6~$V)Yrh;k>*ne7aSIG-p#}?EGUMRF)rQ6Gsq;KhC;Ng(>!uWLZ7efjkgH@<5Ex+w|?W>6v5SI8f-x{_|1>@REdj zH%{9BP@F(Tf%+L~E})o%7k00=DvXfpH67`?04RM60hG5ab8a+H!iL@NrUU?5xIYqr z9Dy-M88+ag$X*TeKPMfZove`lW&|S;Vpxkdud$uQ73NVtUwSpz>FsET9tKk(O@aJ=awFjiV z6|N1lq*Up64v+vofY{&D(oi2KT(1SIYXpe(G=LJ8r9(<4z;kSPRe?B|dUN6Oe z2!+wh3f2<*<5mJddrfJItbsU8t`u)7^6a75pJ&v3Np|y)0o1Hf^u(W03xD1Tn(Wbv z(8HY7qtRs?IAHBQu(Eh4*!>WQt?It0mVY&*Kn(Eb#rR^oLYy!cHthXB^;~#>ddu8* zu50Gl(vITG|LU6)uoJyRty*kyms9(~{uj?qHaw$tbm?9pycERrf%)H#(W3$m(b^0r z&p~0~5j-FN>HZr57$mYn+ocsR{Ikj4n&{s~Pys7(dRRLdYs0piC~X0EKsa$gqDmkS zX~jugPN7wd3E)1PjsfUlM=YJIix;lRXF38vBn(G+QjqXJq(sGE{}&qdT+eW> z-P3)31!EVF@cdUvD?$P7Wev@SJ|pCZr=|}7fExvh&h%?#`*&)!D6lb|z<;^Q2zISk zkk(aE1R!RHGjpTb4DJqPc|X9|;8k}!9<~1%{XkVnQDx+p>orQl?UEp1EAjN8qiySc z^~U$mf4OSb_@eJ=$$2Xx-F`5zlh13}3kHiaV_}I77Q!R6kFNdy?BvpjhPF?c`p$=-lFI>k&@QIX2oGf zT?*eRT0-E}T;)zCC;apWClJ z?z2B~fN`+S0u|^2=&k!k(v&Zuu?)1h0V0Uqvdd^FtO{cWh*S&WsjA* zu*{VqZkLF~`aNaba02`5)c1+Pv!Gtl2!9&*+Cy=Df>22=G*Rme3<-Dd9>9Mp{?n`pvwi16+v{39$`aCxzWo6oFk2g@Hy?V~gUfFD3jPaN zsMCnWbE@`}vfH6BZGHA@&im|fQ%G;2r$Xje#N3~l>FPjwzi_$^2M9K}b4V}Y@@p%a0D6}Ly7}ls zN*sc98u-89`(d*oc_!Ox++MRN+p^Q3#wc-c*(HOmC2n|aquqy&Ve$m$Eki1345;&6 zGHDWRf%}etm3-qCN=3Lh*s5DmBMvc_OF6|5r#8&)Q*sbkj`DQXjX_@K!@L8}H?6ND zl=s;d>|nJpi_tY8<3H2Af?0q5Vkztr=wBx5&gIuY9pHp6YE4ZP>||G7`+_=vUQw}d zKIo7VpIn3nen8f^Xq16uVhbhuWe{ZGgx8208gLp|1qm4;N1ImSN&xrEcE7sMuCRbm z`Iha-Qlm=wE>nfmnq!L_7pPLHdLs(;VH1OpDI+&z%bYwlW&%be73} zycmDtcf`MYladJ5q4tONBW-B&IS8sg7o#UQm!+*<>}6y`$}bu6O{VM6fr+L0l@fe?ZRPP9O2+r4UA@$u$Y7AD$%~SPeR~!Pm>5~rn(I57OOORDtK*<4b{1h& z@VRrj7lC&Wk?I{nH@gHq;MjD{vM)rRM(Vf5y8(|ZK6##=j|9f@=<_foz*M!Y=~w{3Gf zqf}|w9l!}@pBzgccy7c!>}4-i+j;T^q{OKG9f_E}7V~S6{^_p7WpY&2HZs-sJ~}pP z*l2{D;RRqkALO8KD`vG}?G50ge??(3)R9>e+rVCyT8s?R;c<`t?RR*zeBbgcRFKo> z!zB60JCo~8?d00~9tV?Dw9o`$061$V969mLRU5P?mgU^zn-VW;<-TaDZjyB#X~RoP z-gVWAr{j_%7hmV<+c(*^)nNm8D+s7Xiv~bL7hkq3#~FG^iAg3x4KFPP>N@T34G#%Z z_Vf0!$E3?F4Glk1{o6TxRQEWfrhkdDas5k~nrN}oex&wM8D8zv7g`v-jNr5a)#fMv znI=>w`^Ak2eIZ@S!Li@qIL5*siBU!7*e%w`#Q)k6;P-w&|n z`~(Wm5(J#<V5&|Kw}Z98SHJ2jU(njiLdWo{Hw8SXdbKh?-b?xZNev?c$DG#n;$Jc z9q&#m?TWnztMgceYHsk79o;Ba>#N-Rvm5#IVu=Oht`Wn8h3~$)RaFNJah$9!WOCjv z#>a$^yhKNPW7dF>1)TWv!fC6~((e1D#h?9%fPFAQ)CgAkrx+D~6Z4&6<*}zyg%?Lf z=b2?`lqEeW77<5)@TbQ~gnfT4PwSrRJc6wCF-q%oHrOpz=Hub6WSQkh@CR^pm`SWr zp4X)`=(?3b+@FT(b^U9=Dn9&e_yjI=4q&-X!)^s@fHJRYw62R z8ZK64ik7IyH!R^MzoohTkX60Hl^NwOjRSGdfN}Bu=`>qu;;*uU&aXY>Q0pbLePPA9 zy)MlrUqQ+8)gLO3d>+BVn!&7|yAb-2bPqv!(G}<7SmErSGcd2O_DMpvrMR&0UUJ5{ z<0bc_!n?!$tW=WC^BNR$M80sD{4a4Z@P75F+s9S>_s3*Jhj0QX8#*JQWAuT6O3pxc z7arxFz*8GWqvfAfAMXhcQhI2VkT%cmg)LCN>bhnd=*suYzrsK8nQl4}|I!1w_r$qv%nBA%+xPL%$@ zXa|A+gU~+-c>^l>s7N2ajUnBf^Gh=lu@{vmN5ULiLaebm8B>4u6Vg(=5neDPvU`(+ zjy9B{zEsK-XE4&YF+ce z$oFvKQEC`_Xe1E{6m;pdPIX13-=T@oX~HLkrWj5UESG6w%cUm*jz@lz4Gp%$))|L> zhDMS~pp9wr(?Cj25n*zd5RBz7IG;?e%$nqDQKCutg3rT#CY=V&r%13#a9QOMHO|j% zi-)^91tL;b-b5;aD_X1kCB>LEi~)e)5z=Wg{{xT|w7W;^dFn%}*Y%9>?5yuLaMABdfR0oO!KR@`7YT3=yC$o2h zg@{z$8=n1zVtwtQW6(DcDp+X6!E}N+Si=c12-395^n_X2`fA&qNVVq$aPJK_o|;Fc zgB1q_^QJ@mZB;fbzRSP2&yn6J?=X96GPxE<=gB9&)H?slo?>#a%0d{-jv`A34p;;c ztOmbP?SV?M$H@a$2&%F#^@#~xe?@_Je<+eQ`H{Oxf33RxwVY3U4;uU%LtndPAQ0lV z8IDLb4a5zhA1^3PKoDnsC zSydMY>pLL^Lij3a-`su;+x`z{4++4@*UwU5ymRX@*Kzhsq?L40tQi`-254)u2!yb1 zdLUDF2T^;6&K!ZI?<2R)=y+Kb;im~nB3_wevKRdt7zn{Wu{6 zm4ftIgjSTT!Ha|4oxB4fYi!LIOhfANbNqU`?WQ!4oaIl4Jw!{Rp(?Jd2dYk&r>Iy3 zsaod0PI60)e%0nBxm=5DkEeKZNetSDRup^|0dFD1z#yhk)ExG+{X|#PWuw)FLa_kQ z^|VVt*yZR$od<=^UrS@&P*BQPgr(m;lu(GmJie;!rkmpmz3$GJfnBElEFJkV0x}PR z9CO+kmZ_sqdiOYEN!WSU6ix;|aMrd~e;$cHk0D)BC(sxszt_hlg@3vk%?Z8+djKie zlMNl6NFvJcwp?5$M5Nq}J|Gh)W)Vrw;l2$Dg7)9ZG=()L{ymETQA2uL>rDftV^w zUqX>-kqV&ftPY5##cN7x{RaojcPNzRfVHXLktk_;oWT+pWC`Dgb||7n#Es}^8KvPV zXV8bq&7Ja-ln~!gq@_qR_c3IY+J0)`>H+%7eR)7?x_1i{*3 zdmra3)L=0RC=3FMr^3MTIN<901i!S-J)jU?)K#^xgBKi^ZelyC@FF-4Wrzn1XNu-U z{7U!lCZEh_Np#d;M?rESkJH~pS%Xiuh#%eD+@23&7oQK9?DsR+0f{oD=z}*A?5sZ1 z7(dGSzO=l2To>vxd1IwcCD=DV|Ah{W15bJY?O)|3zJ%Mbn|^Uatk(`eU}TTHUTxAB zs%_+1AcM9fi3z>ezzt}rqb=Z02=QF;B$&psQrVE}>O3I`j>~%92Ap6pQj9%hyYFQo zZ^z<{b!0y?>nA8K_^R;xp~*(44>#2?`Fqe-RxjA#HIvNsRcq8-Tu`g=yB`>Hhv$%7vRxb4SPTtD?m1UP_+*=fl!@e=%;B;L8VClxlVpH*Y%~S_Zk_c zW-!X56h>S%{ycjbQivDU@gFG1frzDVc9zjx_zSPPbj(%T?kzk-bD>J~Cz~9kzF-IA zV3V#u5q(qcyD<|;;Sb^9DZenV1D+Rx5`~kg2D~|NJg)fP7ffvmIu^3P7G0pj>)6q! zqcluePs&Gb%+XRe8?unzcXCRo&b`>JGH&AFBym1W)_3MXc;EnfR-f?iO>)pr#&j_D zz=)L8K#*2$g~9e+RI{LHdFQ=z*&@RJZJ)hb#@<0~BkO(F3hYNicYsIfJ$Jyqa6L5@ z-`$aN=&0=ZsEaafq$GGLNci4?Rt{S0Obr_z4Chac0_8Sr=;+*}Z#gaUeo+$fi|U;e zIGj0d=bvt0GQ+mX#$}V18FWR6511QB2nqSBP4yn@PBQzslUNYOK;+(gM*|@`O%OH* z^$*>MgR(fupCm$Ll0S7_zbP;2+h$7dBIx?jpEsMWb3u_mLHLEkh=njKUVLhPiF)OG zL5Ee+0GsZ2=@g-d^F4I+THu!S#l}g&c|{ie&80P1YPLJH2YE_V8Ml^_Gcp^hVSors zm#7CDw&%y+kt_v?h9*ssB3>SAGcA-fq|K?!W3hvZ0)7aoq=(SI*fnfxy9&h=Ua{qM zp~#+jibbumxm&4p^XO4h%UYW{3wjw8YZLXVvCGE1G1l94AvCSkufCzkt!{ZtZ_yG2 zYqp*x`dx5}Z}ulNNOT3CAYDziOr>)IobGCSmnG6^B;2S~v0m<`)x(#op)9OCo-Xx$ z3R{!2QVvR-`{r^ALM#G(9+U!ecv)zgR1=-l|4vi^GU4;k9rWVA<{tlAd#P;T{YW?? zJJ!1d;aRHQuK)Dv{@_`lXXXIm)`r13onk-F@t*Gim_Tywp#ZZ^3Us4?<3@lg2i(cF z-+By_tKXqg{2L+yL_&Yy!hnPYaAySiL7pdz0C8BtA2INdvMlzLACUFWN&!TH{p0$1 z%t7+i71#mR#i|?kpV@Rfk*C$p^&iM3IYG6&Os-Y6%JO#8d^S4tX289=W@m?tXIJN! zFmO(NBWS=64F( z*Yr-OcwEV6T7O!0NsqdE>3xcNQP;4qoi?|oa=9_9&G%qC$oFv?gWD|7Z!!RZ&*y?= zf9I${um9W05>zYhIc(V=iari{c;Ve^YwHgeP3W(y>pl*OCeaRW^Z@$<3+6P!UaWa zOkEXuI<2R=?n+)(qm5-laCm40 zM!$v^EYuX)ADLlF<2w24UCrB~>FP?CAOxf?s+^(R4J~cr4q~6S+n7o2UhF@M2pC68 zSF`JVStNGR$iEG|zY2JE>ix~OnH1-Gk)no(q_!&ZRw)_++v8N?l9*qGtHwt~T#|gJ z@}{l3>>9WXo{3nAla&ro{sde3YYRB(HCIjuE8f|i5qsC&Wj`jU8|JqJ7cM8rEjT@8 z$7;>yEWd_K5uwkzlb3XA-yWci3aRRk26q~!4V<53ACN0W508a0pve9DxG_4GoDPS? zu@dpxQJyE8$Q@5Wz8|i72aLEBr1om)L)fT;W-^W!UHkWBRRLvmC9Z`!N5fKG5!l4C z01rYCRp%sKcF1^8Cc@Rbr-5Y!rrjj4DNFlWsj4&QLKuasAUlOr${%runLFD za4+-6Z-iSrX@gd7J}J{{@xH0*u&W%+81!auRhbe*wTd1}Vz*cw1Y>j@a4kyS0$%2$ zS<}q~!h0?g5wC%l?~iYumco5(NB;P@eYh6a$2;)3l$|pSWQI+-`AY^rq3s%3L?lE5 zqenMIL`w6eAmmCUJ}GkKZY@fPId-8LnNWw-J--^>Hbm#`t5o7z#|qlY$v3E?)-Kz4 z#A?-b!2#|@kDey$B_Fq$2(|ux;RR;lt_7U8p40JgC+&Y@pr8G9z-*4+_6XIGyT3r6 zWwK2#XwlrOZ`3Te`XbT%+>__*mk+qdI0@jl3SvdgvVhp9eZ)b2X*9$s?9 z-)ztCeb{;*M}i>RePNd-3iG zI*3lP95Dc?Oq1kFS~^6b1IEKH9Y}Zc^ugy# zT7VaCtR>9W&NGq7^?opP*YklZSE&p%3VQzPhEUYw&kKtt|A7yz*=BsRiPk8iLF2F3 z2tIItd;l?10y2k>gD&`eHQkj=eaK4$u|;>7N51&jN^f~L8a{*f*T)Tcz6QD~HYM%E zZ7EFf1LHe!2IXTtrl>WE0)DX0l^xiaf^sZ)FfKggDuc@`WK@1^0g zkxrds1@zOT8yG;Z7l&A1$mdMf4WW$pjyOH`FL3v?Z#H|Hl&wI~!AU`v(c;Z6P4MG$ z^JhnZGHNjb@-`RWQqQ<(*KQAXa???IH!40`b?D=E2$~qkbQj{8QQMmEi9tHk9Aml9 zwpGo9_8-6IviRxnxd{$3$A%4f7`~eJqs+y8V_DTE>xk5MYBw0l^+#XoV;AJ@@0pd{ zQuMqre&F@ZA20OY*&F2AQ3GQmbHr8c)Cubt1@ z>a7e*l4yK89zXj!x#4R?R)m4K6sTt+U-K$R=6ku_=2VT(QA7aW>^uV@(>-kUz3rI( z#A7k(#%PhC_0#W)YyoIouYd35#gcQF_5;5b0e%l+kP&v6LmXXe1gmkx{AQB%P{JA@ zazX^y>pwL{vLNWHs;`@-)M+#m`}Hf4cCOX6I7yWIR*!B=+T8$B?N0s9d(fd|*G&hc z-Q;3_Zc^wB0~iCr{0G1ib}NncG z;)*+tFJ8&KeN{0gdY{e0C<)pAG?PEA{Q2sOd`axtBfBGlF@@1M4dhy{#_ecXIgO{l zFLST1;RI;sN#WBGkeq8A-yM0S1Jl^b%F4^j%TB6xImyj(R2!9ntffh6q{XJnkl;yz z=dzR!j`qMyK}+WwkokHq|`sn9ZORoXoqtEYF zQS|boB8p_x^XHVJ1?}-G(li0g-d;od$C@bvhWDjlZ`P5!_rGz6iMhJFQ=h8Zhpl{c zbaYe}uMHy>Q+o1Vc`=jzcw?F2Kr8vl$F{;(M4$aRPF`_o8KYT|zt%A{mPP5npsyu? z0F?nFWCOh_w1$l|#Y;xZDppnjbu09e1Y~8>O= zW>^|Y0IAj?BBK8q*aRG(tnmQ+QGP+KN&W&2>Bo7x(D(!(&DtW#g2Uy7e~oLZYL6u~ z!BryWWboh!KEvI70tCkJ=WP^s-49`4#dwj zgxG~fa;N=pJcnjsIOA?Gl?3TlL+BnjXMY}rBOkmy3D4ipC5nH6q>7gxVTjUwdn-)~ z(K&0j82#c!Ep=Sq(BM3mFPLDww_tc^wA!9OUW^myW2?C4-RKQuBlVR?T2qkDL?y@j zH%TY&&e-tl_$#v^z*H&76oqnINspb)>x$o*#6U?O!234xS@u=jqvW{P-Pp+{FBx0= zX`rX?Zn^ZPqLzl-T!JKKNX~f^3bPD&KB0HVgBh z!2`t&6>bA3O`!E>G^b4jC)=aCq(IQ!}s4J zPDR-6iajs-Y8>r@Dkib;eW&KZ9h1AK3cLN^5xp(3zOqM{U+2KJ4`4|cct)Vz-m!VJ zheVnd0@)iuKS&MH5lpcb&r2I3d!zGmiC*%-ry2#Ba^Iw;Ip{0PYVK_sYoi|G%Qzof zDLZesDWE?X`ZA@%WgA@1`}DT^bS{A(Lo~nM}x}FLLT<*(`A?nZZi9*!(_WZXFP6U_D_k7MtA(z9&n$QE1M#qiy;?j1<;BMgs zls|}@wCHTSuQ#0vrw;Y?O^@sPp3fBAlREz1UVfZTuT5l=6g^TABk$9DXhI)4X47rX z@+Gh>)uFqcWu;}*ZkRO?qkmzA6B!Ri^!1(|4&1-XlZl2mBNXxWxKLI_N%!OUxUZRL zjhKu^AgTHCR|6URGT!hb6~ZB0dp{kL)y6U*XBHXoCU~6V6&H`r;5U+9Jbz*4PAV;= zpBISF;{=ENs{*}(P40Q=oE!_h?F^pL3iHo*icz!KmI%fQ9|4~ePZ1XTY>K#7ZLqlD z;ZX6g0>~IO7{_Fnz}JrIz{y2hPz@zpa3h)hpT|;bt-XmgjrZ458aNe2ASE z`M-KJ@M;qn^5;1HCCl5SH-CAa!i5VjR--_l63N20xBSF}Z=c>@aaPPfu67#XbL3wH zy`1?}!oys&un95FdSv>si4aK&6FVqhnkmETw=KByCHYfZ_H?X~&--6iT@G|CV| zz7pq${V(Clo|{gxAMK|I5qp28^`gE?H?I8#hvI2wZ{cO(_jI>WWVNY5jktNyRinCg zV=|;o%!=sv+S{KN#$Kz;HB;qQ)KQ83)Ky=U8=53dxcEyl3g2|t0hO}sLNW3fVYT#F zW8bRnd-1Potf;v?5lfHH!tSYhE&UHKg|8VPk&<%9Gntw7@*}q!1>6>uj4y-4&d<-y z=lK%}&gF;4A}k<2DV|$Vp!q7w7XiPsJq?Iw;hYbLx>Un?iLO5#*(r+K>^pO;$BQ5U z|IhFB5YMK7HtgeCM6`o=QuZh21?(gp04vWFb=Ou(L-yY_y0Y{y{;UMZ zizjPa-I2GC{b@d}CZS4^6dV`X$>GZ`s!qR|+a1ZmpANLfAmX2g|!t&!-X2S8Ga$M9dNmmu~IuPVjck9kJSO+w})QmLq<; z{we1Y96xx-4MTr2yJ$NXqJxQYo#eT!%?9GiuK@`Ai1e(}hY|T2(x-DJ$ff_}XE!fqOz`vW_lNBS=#(t+yygR{HExZOH9UF7FO%E+@ zbnZxQ52Mu|DqfGf4QDm*{;ar-BVD$)f1IQFl!~Fu+YM|g(uihId&+xUy}9_Lovbf^ zR{R{3`E134ih1#^Wh8l_`PdTA#T+AMQ_1<>5a7%+CmJ-Be9skM=v z!-=<%Cicc?jb|d%%e;O@kuGDYqu6kmD5XiM@nKGNet3HBDO{LkIbO;=4$p-|o#kEz zyjDzyg%I(3WWQn;lbjZwOJf!r>7(EWG^fKu48hIDFTVsGMlGXAkbHE$PhlPV&WsOV!OMkX zi2xbxFJ1aX8+n3U-CJ!nTZy4SS(^WT$XEW}o_aRIl{JTI zHZp2>{C85Q63|=-2!_JtG<+G8_R;SXx8PCOrC$q#E&AX5V770H)71^!Wl825EnUpbgfheqfM^~q-jD}QE z{|WTR>VgFuEfvTlvcK-gX6)XFD=f1Mw33-cw{0+wo$nLw60$wn6QWI=rBKkC z-V%4?fmeh%HNPx&cR(rtWsPKSSd=ZV;2t+YjfhXHR4ss-G2i?^f_#W}y%zk=I)U%D zNZ+@N{@7rT<;YoQglsH7CpAYVEuAU+`>5S%IYBmQdL6{yh*DcyyN*+K930Bpp+>na zn1^(C{N#EGeS;cT{sP^kaBqq2dh8=rIc28h#!~+AzPS1=umi+SdB?7RfM$$tUAvXL zJDkQ$N%J-ZViG@?a^Mn<5U>DjdK0Xn_;kc2Q;NRR?i$>)qY*hC4X1BF#Zy`E;(qob z5W)I-_p8H*L7%Mu`Ns%Jn$702ul<7`mC=(g`pO!w{Q_~%X?i&14n(}(-hQNrTRkXO zS0=h~dCCaYNt}I*Uz*8;cyLs*vbavbxgHMZSjf` z*JPUZGajwH8UZw))+yLEs&Uid_!60@r;r3>qrf<1k#ZTUIiG&07UiV`@Kc0>eKGmu30H%*)qgcw41^uHAfS{z9Y#j^eBr|=Q&U(eQYa4M`a{^+G3Ut$U zLC;fnhrODjSYx6facH^4@);d%fMd)VS?_bn)e}t?7{Xi!^+z|G7RezKZpeECE-REt3 zlJR*X)#bt`4pwv-Wv@OnaY?9|+H*I-{t5^WAx3au>kQ^s`3WwAOCiS4yqcS}aUo6mWGYOKw4vNtjX$*qprbY>L zYpUk?s#yT}u#beIm?lEqMgx2$-S>Ih;J@OM9*Jcy;lNRwyndsmF?0_!N7rc&ev0m8 zv-NeBSv@jEnb2pc}PrEN`n5wOH~2D5isJc&bR+?Bak;AsA5+I`I-Z88AQMoXsum7 z^uB2CClaVOIenBlgTpP*O1l}k5$DQ2b025(g0 z=q#H0%b*xy(Mk->zNN2c* z-?oolvhJ2h-eOn+s%6vx6k4#Sm_O9MeO&!J)c+=#qRk|^oJ^M@WYpiP8}W23-E?Xc zBW2M#?je{sreZs|T9 zJ|w2BD={%M&H>{v0PBn_^^VgNTAcq1x*7ufJVzw)AVHd7l$a|zr8y^FU;-I%dGiZp zeE$>fVP+Gj^mBb$`VDloQpKlAL(t+6Pr`_!E*D3Sqs^d$`N~YU=}yCnUtZa+K85F~ zqYEnS@dF+Cq+cDi4rd`1@1JkyaNL&`ZzTu{qN&IHabg{=Rje|D{0thH-<8hX5@2m+=t0d`%l|SA zSS0nlF?6W9LU}|LuPWA^w)$Jc0#<`|>)H$abj<_j)v~OP08~Bq>azm!piu@fs@ti! zgA5+*$fGuOIVc*mPxLqB*mfpzO$hvc?ybkcurZVoAtS$5poQrPCGPKob6|g5JQD!=yq~wo5YvF0K)f56Zlsp7dguv<=p5c`fyVQL ziM!6am5D+QX>1*>x5yPSFsvTq#sb2NY-hepuchjF^G{{$b3~M#pPgDs6bFsO>2a0HgacnN@zzxB+S>NXv;@*hgdPTCkbs5m z+Cc>>9D6W|oI81HHwryoRfeZ1XE8V%n6O~LJm}F769PNol_bV zMwHN=*wg8;BgBNk0B%>(L9#8!rSNvf#ra`@Hswr^#Kd<3k6t6Qki0EVs2^L0-!7QNvGNKplr1U6ZrKD&m%K&Amm&?0?ptD;Ni4Gg&C zWNaH5&)XK(80_EKzn=!~gTbHP41BYh@$Pr=jx^ya?e-hxZh=GagEr&X6Bh4p>ouXk zd{Waur`;TONGNRD42KDg&K}xVl(;MV+e`w1qh?}9N!55Qc)6b?@z_f& z_ghC1U`TBWjU71A23R+Bc2!D$V`E4WkrsK7&FUd*7qro_ zCj0Qj`7`M>A&Up46T}$N45@oq7GjY6?>n`6C=I)bbFr@HX9n&8HL)YO1ID_M!Wm^! zqK1wrw4=2v<39vaSI`q=kRZh#m`nn-9ca|uB7#W3?ODyA$!W;tj#)y>P}6xamK=Z;(g-cJkTZZE zN#n#NC4mFf+V48&gK$P8$Y2y?*c7n7iyqei0U?w3}|Nu`MjF;5?dsI zqC8|rXgr{e93OB=*6XoLrcwC~waQRPOq9wGxq3U@r|xYm*+%|Iev<#C%mAk2ApR`J z5Qy^=+ue~HnB1$_`5Cve)1-R1h?k|;!EdJm;wb=&e@~CZe>7Fhh8N=!;Wh|Y_a~iz z#f-sbMOKq*fPXh>Z!KBZ7RI(elo8AlB?o1A%i4_HXfXETWMhb|{_s%5pYxf@Y{{|% z-414kj2$S7#)$BzFv7yf)21#cl)#7%6y@BqqBKMcetii$Mr4WCC_~?FeEg!|C%ivM z35&B9^skfpWiR$2AZC@Rac$2k>bq{nU0)eG6fnBytr(4OW*3@HD64%YorHDPYZlUd z+dpzN3sq{|IOp`+U+zluP;>u!a&jx-s4ib^r3IuChpoUS-*Jr$BpThDJwd69)I|cw z&q9pWCatXIH9Bd*ZRc%Ii86Fcb!?=uu`vkJ`27IoD~3Z` z_ZwM%Vq?0|mCA2Lmx?UbrH^0G0%EhhR1%l?56F1hhh`PQm$0%gJ}3! z3p$Uire5Y3zJ**MO8X8^PH_cfyVP^`bc-B!y`xW}rfOZ;Qs1`N{)%6~WUdLtnMx`g z_QC~>to7a*wsni5_ibyq%+J4wZzz&a@wypmy(M~RN6#OC4R1SOeO_8j6Fnw+A!2N! zxiCV#m`!(El-&Jk`?JCQ;T{DRkts?y7Kh)tKL@`tLptuvQQIV~_T#MGdnw$L2V1fh z{_DZ((BfF!?~@Y|KX)^*PLK>6`vDb=$9}I9HI4Q3rKsr6(CD^?o;`v+@;N0+<|{YcSLuGV zT(6UjdizHks}~pL%2KEV9rtIe_Lke6X`bWIf}$*eQk(gwjRdIA$B?f5`-p!=3zed? z(wqs*x<@1KBUYh8>(%~2iJ|d%f2p(nU9yaEsQug0T$88qL!zsF&8=+Kg5x(-DKw-! z2M;!VDqlK?FJ@e;OiDDHJ|4`gN4a)?G1JKXTXo;KNg&H#4G1>RG_AHZjmUpYd4|6H z>1I~65in!E!wRhR^OtL?sWE5mWT=XW9UQzJ)%Pyy7waX9+|-H|3LTGBTV_8&zDds6 z=A3O45Dud_G2&b>Jxp}_K^9M14$MTexhN>z1s+zr{r0>_rVu^OE3+2)W=$o^3-5Yr zte>QXP0O8%NiPCivX)*j5gY-U_wPH@Dx-$kYkg@8osqVDH;E(X;HndlR4~N-U*8>I zB7|5z`#b7oyOQSr88l!Y5TLlPK*4#Y6;dt&yxu>9=zw?~1kvy}^dB;V zNcWZ(#Wzjmq@Sha{_(11sZ>uA9?6vlQ&%S$Mr;E%Xk0?#Hcl=ci17{x=UGd13Wtas z$3Io%I%&uzuRnT!K+|pMVtaX%R}Wb)FSo3AZvX7yhHEXE&uGwKzEf#zeRY`nf@u7- zsu8-Zn>^Mbj6Ro`Y>`TuV~qT3w?a>eSB~l}YbVW$TX@l=cw1XQ1?*r!-~5N=<3wO6 z*(~h=q%?ZRZtjk)O{AhYdEyF-vjMZ5VB_)OuFUqL+2iiB>kcCqmwakLMFjz~!LnGS ze)RVvp-gJ+EYI^_nhwq*f0AT6;FuN61$;_h1>^E%5+>7T2%Jvo(a(J{`R7)f6RDUQ zjFJm98h09|EgPqWTHJ=ihjVk-5`+vZ8&I_IC7*;vKj0O;yRudUf2$x`%xgi ztz6WFQOyJ~Z@xw#^PY~2@nMxMJ6z;;I~pcZrz;x*0M$o_y80crU4aVYu4iXk6_bJN z=T6E2+BpZZC5^AkDcQaK+(jlCH!(PxM5uaHr4{~%I1XpUPKiCZ5?2^8yPhkZy>y_~ z_bh!-Khk*Ul4_&1TJ6j_Qm&Ji|Jub|L~65tzF=+2C&VY-A7CbM<_Wi(t9S_fFLv8IjsKsCqk8G> zN+;rTUqPZ~%(X(m6!kZMS>mw?X0lUB@+vRbH3*9tB@`IWRngNB*dqYq6iOc6)p~t? zyX!Y*C)$|oogxq8a7{PuXD2i-sYFcs^DR6wVAgrUGuFeivw|1dNDGL``NnvoNM8B$ zmpg$YiKA@jl{ioUq#S@?*yuC!wZyMxf5ABCYAdkCMBQ;SNixqaaqyox{V!hUgwF zclCy2>-{`Q2ObX6lq-RYv6lhcRg0WD_@C=GtMY z04#zHyHTD%r+I0l+tg7kw^;JRy^<_Hb*MG?+a3}H@>CEX;jamfS`9yJ`Jtw))$yM* zCSj#9q6D^bjfr%>jw4zpnOIA+a3>wQ-y{0NTveFGpd8trk2hNdN*h%eNWf;d@LuT_BXYLby3*rTd%4Yk`UbXgZ6HDBVI__?Bt7Cqx@ zi}%7l5dr87i9>QD73Orc9PK{RrVV@~rSVv)kvHP87`bkF1InGnzL#V^x`Fgs|;fr4;24kYpEjL7HNJEiHm z({QoWbQu`IlcMcR>2F#V90ObOWDG+8(MDCXfONevN~9mse-Vz_IKDW@J%!K^kDOls zcSRWrcGle&UpInRnUfGl1qI=QPfebnK$x}~jdE3?y~Tf!bX$SOzx7t_>DtbLV#nOs zcR-Zput2q`z1L}+%CRe<76^?1Yr*v`IIS}?w)9BdDi#sKhKlh57gsNQ9Q%z%`SO#) zt1+8F0uJ?afRL!S0YK?Db>?M_~j{z*sf1K@`Kf*M6N#@yznqL)G=~b6j;nGsk zYSrG@U|5W}wM7Hl6xTj9FFTWo1SPp$?1DXk(-+4fY@&%9nE%&eE{u=jo||M?0ia(AemJ1 zQ`)-!F%aM}V?O?NhqH&$4%klAB{8vB2@OKcJilIS@wmGj9SZ>@3<8)C#5E9`3`zCs za3Q2Bn1dqsE2-vT9FD7OC}~DbVK>h%Rufb!U=Tq-uOiuONd*+o7OSgf#+238-&UBM^K^T-9G>-h%Dr9Y9T11<;4Rkj^&S$$jW)mo~bWtaO5n>vtx)HvFJ&Hlk`W489xf`vC)PYFEXgNRpFzhtkPiZxJs&3-v-ugIw8-n6_ z7#Wvwf6Q|z_!a@g|GxHYEK3%a^4bAd$1&m0pN5k2V7^d(y~8j>4Mid0K6OI?J_me>hDmS^Yz6lGw7H*oTvK z1$U8Np_iB$AopcC_9Iu4&y@SLP28qo&i9h4nf6UVG6|icipxss>(_)P7BUKe<5k!X za0H^*7od}hs^RUAB-mHcl;*1LSp57Jd6mWm#>VxfWKU2OWvkFQo77zMazH~7&c>7| z47tXV^$!tpgj6wsuk+I2oE&2#gUGq&KiE{29nc8y!tPhaLEs!2&Iq%!w@ZT-Ovh>i zF?BNUg_JE+lN-h#;xogMT@!u5EkA_bzG!%gS*;|oFS?86sM0hlE|P~Y|Xm1qzI4IYssESc25(S8n>Lx{O#bCpBKp&>8*Oe-8Q zIWcIXkjBkgw%?%K2x=PSdY7+xWpVl-=A_*htOc;mOd;{0loqT%tbO`A{iz%bB!d&$ zCV^q{{9mWKC!I{VQh^e_1*5Q}WTJ5jaLHohnL!YjAETDH1wpqm)lA?EITp0_bU+iA1BP!ohMe=B2%+78ONO1&Jc}_ zi-Tx@OG>!~4|*k|?Di=y*We)h{ZPd`U(6&fnUiO-CkRWt#*Avm)IRJ{^WYn*H^u&`INF(e3Uh_bW}k4jmX22g450p?|!Xp&}h&QiL4z$KQU(1Zrc zyQii5rToI0fgTEj4tj94UnH`;_)(->Z{8(s*g}{Al}ZK#JO7a#%3B>OdpmBn(QE?=Swq{Ra!n>2N-A@i1TyHt|hEG)zda%*ltY!wEGG zAB9$?vAfv|O^%TGAR@XIH=V^JR7;u`*+*07OS; z#SfeX<3Q7-TYG+({92O$M1U8F{BoRm!{!XI?Ko^N)sCUXqYDcupAFA8hc;<|6vu_I zv~;S=X5#rS0+^uvSIxs=H09B%B?LYGW3JZZfZcNOXbv@4|aAAg^cYpG6+c_l--Do<#+LK9v|<(f%{-Y zRG@#9?@QQuz6K}4rEZmB#_a03ISMjVh?6>fp>ai=dPj3NE%Wv0oGHzlPHF@>kNhOT zYfst+KAEulO3{}Ish96B;aY6NR#7;j+pdIyAfHIFN{w?tliq4~#V@P46y1V$A6~s8>LyXm;XC%DhD@sMN6nmGX($?i8fi5-LhyXD(_hOasU# z5j`$CEoJyNcAK#-?k1dA*4_*_kOtz8S0%8_`L?nZmvWDtxVCj3{z5__13$hAp3B6J zf<*B$2@Fa=4a6b$SvSbk`e;MKP*X0FEv6GW&p>L`b-*Ol@W+9qprAQ6Wr(Y1@`#57 z{I>xEJ&4o#)6uB7?QzGJiaL2oTK<-n^-^kK+- z>P?ahE!@ru9;+#vFC>5tC5}}7r3gLq+aQ6LiP_3^g4dzA69O&L%H6^xn6KR1TX*n2 z@Hs#CMlen6tD!|y3X^i*ZeK359e5-MmIwtp+p*vT`SylD<@D!WiYt_ksCaj=;1vMW zmL)g0-2DVb`qM1mheoG7bn82Gr?<0NmJNy+mbQno+m|N}GtRC`K%u?spYo(U8WV#M z)I_-j?hz_RjjSJRGF|lfNIXVAy{`o>amEY_ZSj+sMs>|OjMUTgk9v`_r3SAZ18A)G zkN+Ltuu|=F=e^CR4`go!Re+Z{Z6^e51e4T;1v6yp!;^!hhh*}`uXZS28#cxq)fPwjy#*)JqTfw zCC)FO?LKfH50y=pm^*$2;b5-x8?Hq9X-Elp6Kv`f%E~JmePW3;c4|xM*kxD&#O(e) z@webLUJ}l!{~*>P_a9Y5#oCNXbn3{e1A3`YYEGo*Wf*9=Gh5P7D9LaH)(h2RC9fDk zVD10yNy8~*=Gu40Z=)CgFKgBOtHD8g0c{RU{&C#RGd*{Vl6QY(z4l}#R1%DIhSC_T zVheJ+1OtN`$b7+o!GpH@m9vvhpMfYauW?PCB@#blT>+}wy*-vCPM>5KAU6S4xxMK-4$gaGId-wuV#jF>;-6bBd3U#`tz(O^yxehlLkQ75zKl+Y2+~P=M zFUj*Vd--(bT6oF!Sg4c4k~rT`O~+eI4BdDD+T8Jn_??Grlkkb3ZfkE-`Ej`%mf z4m^E!4}eNSy+NK*9G>^r#l`H!!E!so%Rt-0=Oit4a-5Y%5Z8k>ojgUGp)V*vdjfRI zAA9zWQu7Zfi$Ch|Mg(P3;OH{`Av^S}mk89lcp^fGcG%mSw)BQNfm?&Eq- z?{W>!m^Y^X{n}~tgwVo{WcM@lh(n9xvMeS%vI7-zDIEI)7Yg!>d}L!1Uh|nDOY^;h z*j(coZ~Qwx14$W5H^}xN))_gkFmo-EV>OzC*m4F(BQ2x~=vVMR#N+jl;~2tSn@P4t zsJz#<*@Lfe48ZmC%csLOm8#JlE`o^u`H5SK7LRq9mq+|AoMe`?G!Q-K{wRZLG0MB? zZW0-mCp(>|WAS?dOoH4`)2zHAH*%IM$kk{@d5Sh{!gsE#jWukEmyDL*kXvnH_2xV5 zNL>W(XML;}_HH)6q*wnXw?JoofSPE!F238FIr&kGpG)G?m*tAk!p(6D^ z#EAkVW5FoVng4OrN=yKo7LAV=G6Tr;pF!e43j>t4U(fz~qat4boBrGH?k`uB68qcN yQk>&?@PE=-!QZZAFW81$|BEdC|2d7;C-m!R2e>U#X9@!F_eNS-s#rqT_x}KDA8!wDz0HF2_I+u5--F(x)9HYdgelZlOqZQHi(JKwqYKj&2aZ&knD zz1Di3g{tnV?haQ{kOU&)BLV;bptO{j%HO{8Z{vW6{QFPaa()H?aPh1}MU|vQMM;#L z?9Hug%m4r|Lb;X)ck)K##swZv%og|HY1#pg=)T7|zb5zo)g&wZFdF3)34(Z-SQ27* z1Ts+Omn9jSm^1}Kaw~^-N5{*m*GKEc&7YUI%=!g=ue195x_Joy2Sg4!I)Xk}A!x?$ z=azP2jt`eVH$x#%&;Upzkm{udE=hT9ZNNvtoXQ};Qi(TN2kFU&>B|Pa)H}qKFM#B} zYI#9$nHh4M9+0c^nt#X&Fyz_|?;8-a-Rwbgp3DnG)3n>n-Dom{dU@~n>2S{^j3%9+ z0U(RfB@;mdZWw;5ZodZR5@3@7xLwoz;DMY4LS+Xya(8h43vkzi;$mWUn*?En-XEe0 zlYWMDa}UHn)V@v%K0bgAWf!ZZrCijwIj$CBKPJe?__3Ey7Rcdcja||bIbNNFTPYuv z<+DikzjJeOcTVr4w$ah`4_=|RF;etT;~Aq2-mr7eckiKQ#{ivKgVTtoJ3_^^?Jq_7 z@|vvL8(h(9MH%*SY>{m{rf_6Hw2Mn;sIk$0{^7K}4%m6CNAWR!PeBDcneWqy34zhJ zAJ?HO<(#i$kWaP0T*7>hg6NRpxi$_pp{GysjZe95R}W7}8CUNoz)F|_F15gH;PY3Z z+sZ4uLu>-fQyYjQB@1>PQBb~Z0pn1n0 z6k{|v*hyVZnbL@TGIdnp&Bn<~Z?BfjB6FJpmX<}n& z1u(#hqB0-ZXbG(ytM$7g)(bM!c@nINezzosqkMlHIUr1s_=xpP ze%n(jRZmxbes6s1An*UNE$4vE{Uwv#Q}CIs1!pawJss&~()NZ5G@Ai2G z2}^~utj1`|(hyjV3o!P3%YQq&=+L6QCyo)s0Gonm{mE^_p^U1Sc5{ey{j3PD1%LL6 zpcpKg(CpT~4-os^c1sDJlo~~`v`mgq_Tw@kGsg|se8=YMJrpG_5kBtFf4wM(hYRQ^ zBYd!CFfv4pAt$3EA%z{MG$g=FmO@29jLF08USkuAF_ykjjVmajq5T~g-R2eq=Py2B z;6>Lx_rc641p}yu;a;HpC=AI2Z1U=AK4yJPQ*7cJ9sxG(+6@>$=Z*ZM{cuPRE*edA z?*1fbFe;N|bV7udP*8@5W&VT?utc3m<6DMk5F9aZt-^GJ&~RNw4g{Y9RFojb1CVmj z*@HMIAv`;MF5&s1Dm!V?pou&A9}(x#pu5ON;qkVFgV7wtu$6_`(LueRs)Y&AQG4MK zL@cEkYCcO#qL4|(lkFm_1nG)YkP;5+?Xq4&;)$BaO$^c@Mw8`pD?!pAB$3HrnuXO! z@D#Y_1}gC>OP3(4F_ogJ$CQe4W2H?akVD@mC_aF2Id7m z1#&@K1P_XMijaytiExFit8&wRPjZkUEsSJi9%Z&6C7}0~c+9&@5BnJwDU~i2G+0F= ztftDY#BNZh>Y^_vW%GN{u3Eb~bvtT1eYfC`gAm0^ZCGC@5R7!RU+0i)12ipNlCGI3ET zCUGUjCRQdBt8S`PDNCtZYNV-tQoU8<&tLrgs46W_tNTmkD4DIbCfO<7>G!n-79N&h zvT<^8>1e5Wsh66L8V=`(9m=A&=Z!N*&9X*4L%l*h@iG3f%bn*P9*`AC9E}l8Dvu)X zHAXPTr&Fa9)o{8r-C!mzt4A;KTlplh;g4(Dy~mjqp>!4?OD4-v4_&YH9B)ne?^=n~ z|FK@uUL~O3q5DxDP!iA~oZQ7HYSp9E!`s6{PD$P}rCwlW!nk9)qeEqh>6~bj7+Q2% z#8f0+L~c%IE^JC@ZzNwdMw>i~$M6#A^BK)Q6xeKPNmb9N#oD?Y!JFhTr#K_fX&gf*z zZVQNxj4pt_V0l`{qOJMU&{Sl1hi0i{v}7tvn=kevvsh>5cYgdK;S?h)!DYe<4n0;Y zvnzuFa|QRg&L8X7J!ln3#ynr>v)w##M8fc;`H|FUzIKdG0HvxN02vj=sme zp`w-$aeHi9H2B@O1Wb_3sTEqAU1*Kfa;X1Nhx_fTHd87& z!IOPbI#u$EXTndQ5?lSV4xegc+xZksA`;`>^_>NN6F!PQG>!>#d&jP`Rn=5W^-azG z-ZTBSrc6abr8yU=e7OA0Sl3tqBN1b4rIy}_&757Er{0$5w+sgzM?MR$bzpaN)aMhf zL_4Onh!&0&^jX&RqqV2whL^KqJrq6E*7DYi+qApYbB@zC56K6G6}|G-g>$QQ>-I|D zj$ex97spWbaGJ!Wf;PtshxQ(Id&(y!Sp!_Kw{X1KY5YeXU!QK@zpPlq!s)^0pxP4S z`<#DxKZ`#`hNL<&FX*57MEhicMmcp^x&>9n8Z{crt(a$<_! zIiqRD*>vvIw-x5vW-Ye;Hv3aAwincbVm{!Eu~(^QFdH?8+g@To% zs?)rw&ug7WKo%S4Pp3she=Wf8@GR;tW*pbH+n1$-8r#B27u0-qXnF@S8|CITpDj+2uN5MSKCRR2KIs(jesaiDBHHB=bS6ZL3r_Gk`ujwRsryj*;Lt=k!b zVWsXy@=g4IgzGoh_UtLCg$ndPP9eDPYioZnK1 zv~|Y>e8wqcj%R+e$!ve!l^K~!C~6z?Wh`2t(81F#u6$_7vQ=!Wek`70mzF24n<%^Drj!X>b zBmX(|o_lQZejFTJ=ZY`j>n~d`jaH?C$IPKNkX!TCogAoXu2RIm zS$xV1X_>%_6fi(e?d_=XeXHjGu=U(KJ6@^3x=;Fe;@fMq7khl^F)~m80+TQ z!ouaoTW7sTD@}6>a~xe~z%IkLfux|CR;(cl#jz03B<4z&4B|?=K>nyAsf>f7)NE2r zA~9!bSKO}n6jYZiS8=N9K^kJ%_j}k9i*GJ5V_-1J!?G>n~6bn~ZRhzhY=Roqzdh9`@CUzS$qw{4oZ!ajp zW-G*MBU?jSg6#2L)Rpg-Q{;}4jf683#RPBz8=qGBl{L~l6SPg$7_D@c0x2QB{ zf8xrh3)Ab-%dquveUs3Uf2saV%hhA&;gaU|bv5O9`^@}E_|E$ztM!YA+vED?+k1N} z>NC;(gP`y2?$u`J4K;I4yDujjH}CEJQ*Y$2)C>JKKM)_kV9n$H$>Fe$sjhdoE1P5K z^I9a{wATu%q`AT9khe?@@rO;VyN~ppbr08E@`<(iMyT)i*Q*Z5Ylv@%XTe6Dx;_0{ zvyMoQ*xx@%AVCTmW&er0Z}x@Piz zVW~hTU$fG{+F_Yxf~Jpqw0CW`Q?5I6%6mC~<+@His{RKsbnI~cron~pTdVquYv?CQ z#sSLW$Z;d4Z6tyM3O3aFkRr*X~}b(yrzWbmY_u@H58Mne92ZM*e!VV4*) z7o!So5$zK?113MA3f3{P1j1(&<_L$vc&oQ~xB>=OW4HC9Vu=%Rzu0E%476hGMl^#Q zv=o{j+}Ub~7KjVy0lTZ8B0-0s#)tjRX0q&txb^J#wh0bZ_8ZmtyEiR3f?Al`4dOrP zwGVOMm^9D9`fFQFuPWcTiS3kATC8u!tIT96@GWS6sy=Ao& z$Npcsf4s|$tFE_~PU$|rzBzjzw9g}F+Lw&|LTWbDXP)x6N^5d|Q4u$JHv6F0(5z2S zN~hEbu5fI0(xtACU*@s9T>I2fIBhh2xk?Xd{w6`AfVuE`AVDHP$qjb-1 zsdUjiD*LpcBY7<$7)z}i^-d3YUwqFQ%IVv5E2a zIr60ErT`V-We&(}1k4Hu`!9{|$LfW^DoVYsJ%b&pcdd zO&GRoK?K!v}|`PRk@b&JG(?fnC6T3L;eDSGOK ziVxhkdOs2X@J$iglmu`C%rNTjMc5a^=pBiEo4xJa$2V*TrzcO9Sp=?__h8wOE<(Y&ON!Y%{Jfiuug%U+ zl4$}jGCW0rp}axI&>7-XK0-3e?5>`&ObXvamL5C*~)Bk3Zl zBYm)llif*{sOCuYC{^in$TS)JwDVM|^?#{9WexmTUvuTZ=OcX1{F(L8I@-e1)aWT=GqMqICv%xy z0Q(a2@&Y3V9RfQMTJ+snY*r#&EP6`Sq}TXm+XPcQG5dTyC%?mjvYry;nB$9W=cni@ z5#z|jTlpY$&$_a+8;BE9C>}t0U7RAbGGVIDosCtR4sv^Y?c!bWbn3Y*Odq+@WK4h3 z#@4=QR9{OFpHKwL z#r!FduWVP$5cgZV!h>MG7_R`FZn*8wm%mve6DC-?O2*y&uYkhQak6PfY-Xh-Z0L#MIX^^y z6dU@Qq;n*Ei)IX^kZBn@mo+DAbP{tKcJlS7=SyBmmJCk~am%(3>rl;Au97K9Qep6x z`6*JTUnc)r(HplL#ZK14{G0KBvBO}ibUTTyBO>ECe5`V|k3FB=-ZH*U)TQOF_ZAhG z0sjdfHGTQVoz|ijiuTJA!}9bg72zL3$;>vrqE)grKTo1{rsjg4mC%T*@;f)AUKl;p zaKuDp;)3L^)@IXNk<;kMKVltvyhFOQvR*mGYl9_242wBQX9)!fvg0qVrn}&atA0!~ zYE+!!tO$CbAg0om^L*>_@9)|tF2cNDN&9&>iq-iuSP<96 zX-l!|$4=0-Z|ndA6kPVI-*@D%$RUEvUaXghe^Q8DiNgI56E?j3l!CbWw_@jc{iqYX5k8#R)#|J7~@7D+T}{GOg6WE?{{%UK4v; zCL>dOV>2dqTZg}o2mk=TJMZ72t(l7viMy?hoindHi0oe$yno04h?&Vq{$=7~4I%@} zE0KuWJDHJiFtIYRkqID@kdW{@nVR#eh)Mh({O=4zX6fSMz{||+=H|xa_Jzsb$%2`c zhlhumg^ihwjq$GqqqB#di;+8{oiq9WlKej&F*9cqCo2aRD|pw`2FaHhvFU9`>`I-NT|G)D2-(vks`nOsFi2Tg|uDk#uH>J1X z-$x!NX)$3ncZf4xD;xCzEF#qxNmZ8MNlrsiVUYk4^xS?WBdlb`B#rVB6#^AC*S=W{ zFIfOYH@pg6N|pFeW1Qe7hJIyHSs1DSNSM@`pZ>yX$|g`Mm^7SWVfgNEr>p}v=B>^f zt@mCr=ZP=}**wnUKbki{wTdzn7)D#nWdUI8T&*&^9&aPy?5q%cE*hNU+~2OLlzEf@ zlBQQkmm>~e^PI(5^>=_yqg@t{bJ3qanSARtW+QfMEoNqBeYz-IfVK9X2!+|D!B^PN ziy0grrG2||!-EDF0%Kz~DcLFc5pPE~kvK%&rPtw!IXv8;xuP5j@$L7wmoFCMf7~vz z2Tzx354uB;#K)%#WtsK=NM-)j1;vyTRqC}i7VU3K4aJ^WU zkHvh)S(oe##dSd1VWQ6h!ZQUA5?0~V8iOxZP}*||w|DIV z=;QIaXJ~}Shf!1iMNm|e&+TC^E-WdQ03jN(7aNeB-XR)G_wm3kqjMHS2$G715cT~-f2ZgoqGgF;;wjy(i z>FnWhCbOIln?l}2z0wTAn+>fHlZk-9d<2j#EX!KGb*k)(0xypd%p`plh1E*|fp3!w z`F-%|d2?|-5tsdXlwu0qrwe3U5$o-Wp8*t8bfl-vxgHbQpjEh}z;v}pO|+4bky?1m z#4^CJhgL>$HqYyem~{`TqOG=Ym`t#u#;FUGDExI2K1sFB5?hSggd>3W&N7)h{R{Xkh}HAfvQ?X74l&mN#SCxam&Y;ph~MaPyU?%a%bvsxL$vLf0%sCqc)j3nC-chj zL1ax>$YH1D$fN2S8cqe!D2b@-Y5qbTzRFO9s@RwHZ~T$`31xt87v~`|(D!xR&iyut zQpT;&5fb=#hZ!=ZVm`NXikxD_ob#t^sl_aRtWmM1k(UHHMMbyNVvWz3t4z&hfWW}i z<=UEWHain|ccItMvr+3CnG9bqrtrVG>r|zTgpwRifhKNK8`LEXNvMNcnTY>C_61q7Ui1ZzX#?ishlKBm!=@$w+lg$KLKSwGeV>M}_KCClh zYYX^OGlt&C-w~+wphs}b`uD;yTRFSUC(iaQF6*T%CLCqvCvi<`^k*nLfhbd7HBhPi z@H&GvG2O6)G0~;6@lx2tnekV2`w)SvUhZA9Z}VkZ?3mH*elPcDAW08>I*y|TcvDH# zByrml;n}Wbt@m}$TOmm6YAqP#$eQmP(qb6#!?cvFEcw0828R5^L_m9A z`$rf$IfHc%D^3?8iGlV44xXmIGiObQ^*jWc@A^|63fIkWFeTW)^|Nx5{YJZKH0K>U zH3Gt^5@sWmVRNHqrG6cNAgrf>YBUtWMl16pK;CyGXYP9$)hqvtk9#o{yw63*Cg4rZ z+5aQbcK&K-KyMz7!TJaf4==wP@J69-=~}3+!rrc0B-iY)1v%v3i7hsY)yIjBHHkz& z2aP)={>>mB*SE_@s&Q3y#LNzMUKwKTCoG?7JF@|6>zJ#5fLI+`>Hq|7nGVF)jXGXy;h7@$_j1lO1%jC~%<5%e33BW3b=-PBj_0>8C@ z=wM|Zy63G_AGbKtMnR;GUB5*`Q4qZM0x~3IBb3B^Y;PwB7NW`lG931>rHoxS`G7#B zBYW%ZxZ55X-`nXozDCeKvS5YGG-FkGf*P+5rfc)V z=f0dAu03eaYqo;MDnq{|uN$y151&`GI>>P29ed=sG}{QYMt#@hvHtW_mqeS@Zp@Yr z7Wn3`G{PPyT_)S5ElJRQFMeCltSzQHp`Q*ET1&Uso@k7O7k~Wn!J?D4i}_u9gLOq> zO-{RbR)z`{Q{YAKqq{-_a&m7Z6$D{w+nrEMmC%`Zce0R()7;!FM$H&7#cdAn6FsDi zT|MG=G)*}%y+jt5^yIcc{9v>ncwE=!iQ6g0 z=hc4x*t*P1^1jxlzKt9hPFaO4ts0mXBl~_IY2P7Pm`4xQG_YUgq8f6K)dUIOnthN0 zGP6>gODvjft==9a7UV1D==@>w?!|#91aA4byV$#njuN@Qhj#p9uDqBgjhkQymc{PN zGV7J&3~bowVYRV}1_}}Kx!y9QQe|4+%o4W1AA9%hHk#gc9*>10pWN@a5o-_Nr-#SG z$D~4uuA;%VRJS3w=2Qjd=uz#@CQ>W592AKP2-P)%OqEo2=U!hkc-f zSHfUc=f8~XNE(7a z9Km(L&yNWsDj7IK0#>_(cvVk!b))W|hIAe?Y@lpgkV1k0Z#jR<{cb1B$wR zF^I|g-%+~khCA`x5Hv?P#8Z7;s5%I|Zs*7Xs~Riv!8#8l7Ep12S9K^_@HMaa&y@i& zgJ|}18}PgESgzhnWP7bJeLh43)H;+SPVnB;y$NWRQnGZR+iz zox-qGYz#g?*oL3Y2;RSwy#@YL+0bMS@)Bf#B8=B6Lm_qukF9k#_G%SVhGuOy;&1=2 z(aw)qz~%1@&*QL(kOtn%eaP-p$voJ=v?JkYla=O5Pl^zCxW9Wup`<}@9nU0)If9DN zKNOYUVcUR!3gS;yVzRT`S0lnV!Hq)f2_D(olY`$U=Q?|h6*3=0o-TX(Ym{ZF7pb*7 zPbnvw)cR|5w6U9zThZe2n%J|ekdaDSPzD?Z}R`>Q}TP|2aA;28l2InW@bD&jAfG=af@YjwT6DqSd2|6P299G}0Z i8WMv!EW{CxOFz8Az8-NdbE|*O!qVajVih8Wf&T+Q4OPMb diff --git a/rootfs/web/static/img/favicon.png b/rootfs/web/static/img/favicon.png deleted file mode 100644 index 9d33fc3da1e47196b4e0a6748cf66f360e82ad8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmV-K0lWT*P)_oxqUL-h zYSpg>_LF;#0p2PV`;yQ>Dg*~S5`gVPV6}iF!-0L-fF}XA@qb}So4~F$*aUWM3I(9r zC_`YC2ZtEWxCgBE;M5{t0$clFwFf7M59#WI)q8H8$7(i4IkI#GYze5NxUv7~BftO$ W?O)`lOBpNx0000N8b}QQ0BE35 z@Zg;tzcVSS$~zV*TJ-EJy%a=f3I-pSLXIKe0G_dUEbajM*O+)*FfJyRn%spu3IHhM z&~VQX%Gf;99c6L?+{y9;S`{B!R?B-DYNo*TV;j=Wv>yTfIm&F$ym|aYIjXqs+1Ywj z^34bcjqmf_i<4L)!Eo#}DDPgmjlt>rI{AcqFQ51MU1+N7nC3xQ zv!7&tXrF!Sl(976GBR6!c`(f`ON7cccE0{i)dG{9{MBsZ-QN_UB$!{r7C&}*_f85I zCQ1@#d8fJsUq<%N-pU{^(oXdL5xP$!(6MqmOXWbRU+yuhftvV22+Or;iSw|$bQmBP zw^5=knw^DmSP)vfAPb#v`st!ngMsEs{r(l(dd%0LCs(G4I3B;Y87B_|jVC82^zs>j zB^#gL3M-Q)_(6iuKc|nX5tUYg<&*Jr%`vCirdnnW&qCl?oCyBV$SU+{dRIp(PtDX?nW@( z7Ja9`*7oR`k??i=V%|ILS2f>znHpLWA|LXg8wbJc>HicZYeub~bKh<_vN8Ie{<;ur z_FC9m)^?>UuplcdrZQ(LT^kt*1hBO4wy~}2D#;%=%p-H7GK9~lfS<$qS26nZ=$5@2 z;D{=$J~Cx*Ly$AGyP1AzwIq+oSGMV|ty0?)3IGLJLVIyI#@u00D$^u5*{SRzACp!UM+3+jCj5VBvo#Yp z;Y-rqQ61N}ulc>vUoTz9Hq^_F(!WeeJUf5gFJ?c?3I*RN8EKf2Z^&K9}>wKYm(NF*}5uhJK;FMIxajk5HG-1z(NqEs^3 zdc|*Ya6&RU5*erO&<5>-p`sJDM z%f>IRtBRn@UhnDz0%%e(y%}z_DH4hPZf$)sK0aQ{V`KJ%!99AWW=v-y`vF2fE3NR{ zLKF-J<5g4~oHI~RL=9k}EzIuFNEWi3Gv?E|E5|BgpT)GzL*cE*p!kMDs)Ax@+|20c zDATHz&1Odr$pxOuKH+9hhEEy>$tV(EQb|dPtR-|yoPHLb=~)jtIeDQGD+(ER0fe~k9Sb)>h-^_XKqA5{Xn@X!4069H=Y{}9Zm_3 znWKZUpQuk@XP5NMuDWn`Kb&ERa}M;$_vU?Ul5CzHL$w{!Xmkl!-bOPOY#QmU%q@rT z{v;&H~4{*^aIw&259TJ3tB<7GJ70I)3KCW5V}0INICW z;|Fzhzu#%w%dW0Feh}G(pO#|=7c;9+zLi{JSx2LPA9f{knNy?o0_ZXzG4{@Y9c$GB ww=$HxlT5y;2}bYauPS+K{UfuQlcA&wfX;kK><`$Nu=AAwXhZ;<=M|m(UxEBYx&QzG diff --git a/rootfs/web/static/img/glyphs.png b/rootfs/web/static/img/glyphs.png deleted file mode 100644 index 5f046512eec12e338a5411ba6ff36a2a0a6d54b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3854 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 Qdw-~wrZ&j?#+M@h4Jr)YDgXcg diff --git a/rootfs/web/static/img/large-social.png b/rootfs/web/static/img/large-social.png deleted file mode 100644 index e95428419227858d98dd22f822a14e17fda528af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18518 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 D3#1Vk diff --git a/rootfs/web/static/img/mag_glass.png b/rootfs/web/static/img/mag_glass.png deleted file mode 100644 index 511274ef002e3520653c0786afdba2eafeee8847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8tDY{7Ar-fh5+vR<2+n`<|Nnp1hAE5!+6*6=1=3PdY8*D{ zDl|9jkngz9{IOEu9{Y@6Gj#Hv%o8_>+#VJh%s(_fY=A`BmEGbTI;UGYJl zNu*m;Xq%j-G11P^a7ycv_+ diff --git a/rootfs/web/static/img/menu-logo.png b/rootfs/web/static/img/menu-logo.png deleted file mode 100644 index cd3b7786bd027dde195a1837e3ccb1d44ed4b8c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4609 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 diff --git a/rootfs/web/static/js/adjustments.js b/rootfs/web/static/js/adjustments.js deleted file mode 100644 index 0ceae93d3..000000000 --- a/rootfs/web/static/js/adjustments.js +++ /dev/null @@ -1,60 +0,0 @@ -$(function(){ - var pageHeight; - - function set_columns() { - pageHeight = 0; - $('footer').css('margin-top', '0'); - $('.nav-border').css('height', '600'); - pageHeight = $(document).height(); - // console.log(pageHeight); - $('.nav-border').css('height', pageHeight); - - var margin = pageHeight - 511 - 158; - if (pageHeight < 800){ - margin = 270; - $('body').css('height', '930'); - $('.nav-border').css('height', '930'); - } - $('footer').css('margin-top', margin); - $('footer').css('display', 'block'); - - if($(window).width() > 1171){$('.docs-sidebar').css({'position': 'absolute', 'right': '0'})}; - if($(window).width() < 1171){$('.docs-sidebar').css('position', 'static');} - } - -//This variable checks if all accordions are closed. Used to ensure styling for Releases & FAQ page. - var allClosed; - - //Close all accordions, besides the menu containing the page that you've clicked on. - $('.toctree-l1').each(function(){ - if($(this).children('a').attr('state') == 'open') { - $(this).children('ul').show(); - set_columns(); - allClosed = false; - return false; - } else { - allClosed = true; - } - }); - - if (allClosed == true) {set_columns();} - - - //If menu is closed when clicked, expand it - $('.toctree-l1 > a').click(function() { - - //Make the titles of open accordions dead links - if ($(this).attr('state') == 'open') {return false;} - - //Clicking on a title of a closed accordion - if($(this).attr('state') != 'open' && $(this).siblings().size() > 0) { - $('.toctree-l1 > ul').hide(); - $('.toctree-l1 > a').attr('state', ''); - $(this).attr('state', 'open'); - $(this).next().slideDown(function(){set_columns();}); - return false; - } - }); - - $(window).resize(set_columns); -}); diff --git a/rootfs/web/static/js/bootstrap.min.js b/rootfs/web/static/js/bootstrap.min.js deleted file mode 100644 index 848258d38..000000000 --- a/rootfs/web/static/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -* Bootstrap.js by @fat & @mdo -* Copyright 2013 Twitter, Inc. -* http://www.apache.org/licenses/LICENSE-2.0.txt -*/ -!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('