aboutsummaryrefslogtreecommitdiff
path: root/ihatemoney
diff options
context:
space:
mode:
authorAlexis Metaireau <alexis@notmyidea.org>2017-07-07 00:06:56 +0200
committerGitHub <noreply@github.com>2017-07-07 00:06:56 +0200
commit3a4282fd75e3b3317b2b08b4aa2e6ac154310e73 (patch)
tree9470c907ba1f884246af87d26d55c3aaac6d6dc5 /ihatemoney
parent0e374cd5e0ef5a9be67084365f91de2ab84f636c (diff)
downloadihatemoney-mirror-3a4282fd75e3b3317b2b08b4aa2e6ac154310e73.zip
ihatemoney-mirror-3a4282fd75e3b3317b2b08b4aa2e6ac154310e73.tar.gz
ihatemoney-mirror-3a4282fd75e3b3317b2b08b4aa2e6ac154310e73.tar.bz2
Absolute imports & some other improvements (#243)
* Use absolute imports and rename package to ihatemoney * Add a ihatemoney command * Factorize application creation logic * Refactor the tests * Update the wsgi.py module with the new create_app() function * Fix some styling thanks to Flake8. * Automate Flake8 check in the CI.
Diffstat (limited to 'ihatemoney')
-rw-r--r--ihatemoney/__init__.py0
-rw-r--r--ihatemoney/api.py154
-rw-r--r--ihatemoney/babel.cfg3
-rw-r--r--ihatemoney/default_settings.py31
-rw-r--r--ihatemoney/forms.py195
-rwxr-xr-xihatemoney/manage.py32
-rw-r--r--ihatemoney/messages.pot476
-rwxr-xr-xihatemoney/migrations/README1
-rw-r--r--ihatemoney/migrations/alembic.ini45
-rwxr-xr-xihatemoney/migrations/env.py85
-rwxr-xr-xihatemoney/migrations/script.py.mako22
-rw-r--r--ihatemoney/migrations/versions/26d6a218c329_.py26
-rw-r--r--ihatemoney/migrations/versions/b9a10d5d63ce_.py68
-rw-r--r--ihatemoney/migrations/versions/f629c8ef4ab0_initialize_all_members_weights_to_1.py39
-rw-r--r--ihatemoney/models.py308
-rw-r--r--ihatemoney/run.py144
-rw-r--r--ihatemoney/static/css/bootstrap-datepicker3.standalone.css707
-rw-r--r--ihatemoney/static/css/bootstrap.min.css6
-rw-r--r--ihatemoney/static/css/main.css254
-rw-r--r--ihatemoney/static/fonts/OFL.txt95
-rw-r--r--ihatemoney/static/fonts/comfortaa-regular-webfont.eotbin0 -> 40370 bytes
-rw-r--r--ihatemoney/static/fonts/comfortaa-regular-webfont.svg253
-rw-r--r--ihatemoney/static/fonts/comfortaa-regular-webfont.woffbin0 -> 20920 bytes
-rw-r--r--ihatemoney/static/fonts/fontfaces.css26
-rw-r--r--ihatemoney/static/fonts/lobster-webfont.eotbin0 -> 63744 bytes
-rw-r--r--ihatemoney/static/fonts/lobster-webfont.svg247
-rw-r--r--ihatemoney/static/fonts/lobster-webfont.woffbin0 -> 33380 bytes
-rw-r--r--ihatemoney/static/images/delete.pngbin0 -> 274 bytes
-rw-r--r--ihatemoney/static/images/deleter.pngbin0 -> 226 bytes
-rw-r--r--ihatemoney/static/images/edit.pngbin0 -> 258 bytes
-rw-r--r--ihatemoney/static/images/glyphicons-halflings-white.pngbin0 -> 4352 bytes
-rw-r--r--ihatemoney/static/images/glyphicons-halflings.pngbin0 -> 4352 bytes
-rw-r--r--ihatemoney/static/images/gradient.pngbin0 -> 24656 bytes
-rw-r--r--ihatemoney/static/images/reactivate.pngbin0 -> 259 bytes
-rw-r--r--ihatemoney/static/js/bootstrap-datepicker.js2096
-rw-r--r--ihatemoney/static/js/bootstrap.min.js7
-rw-r--r--ihatemoney/static/js/ihatemoney.js18
-rw-r--r--ihatemoney/static/js/jquery-3.1.1.min.js4
-rw-r--r--ihatemoney/static/js/locales/bootstrap-datepicker.fr.min.js2
-rw-r--r--ihatemoney/static/js/tether.min.js1
-rw-r--r--ihatemoney/templates/add_bill.html17
-rw-r--r--ihatemoney/templates/add_member.html9
-rw-r--r--ihatemoney/templates/authenticate.html19
-rw-r--r--ihatemoney/templates/create_project.html8
-rw-r--r--ihatemoney/templates/dashboard.html21
-rw-r--r--ihatemoney/templates/debug.html1
-rw-r--r--ihatemoney/templates/display_errors.html5
-rw-r--r--ihatemoney/templates/edit_member.html17
-rw-r--r--ihatemoney/templates/edit_project.html19
-rw-r--r--ihatemoney/templates/forms.html168
-rw-r--r--ihatemoney/templates/home.html56
-rw-r--r--ihatemoney/templates/invitation_mail.en10
-rw-r--r--ihatemoney/templates/invitation_mail.fr9
-rw-r--r--ihatemoney/templates/layout.html98
-rw-r--r--ihatemoney/templates/list_bills.html128
-rw-r--r--ihatemoney/templates/password_reminder.en8
-rw-r--r--ihatemoney/templates/password_reminder.fr7
-rw-r--r--ihatemoney/templates/password_reminder.html8
-rw-r--r--ihatemoney/templates/recent_projects.html8
-rw-r--r--ihatemoney/templates/reminder_mail.en9
-rw-r--r--ihatemoney/templates/reminder_mail.fr8
-rw-r--r--ihatemoney/templates/send_invites.html20
-rw-r--r--ihatemoney/templates/settle_bills.html34
-rw-r--r--ihatemoney/templates/sidebar_table_layout.html14
-rw-r--r--ihatemoney/tests/__init__.py0
-rw-r--r--ihatemoney/tests/ihatemoney.cfg7
-rw-r--r--ihatemoney/tests/ihatemoney_envvar.cfg7
-rw-r--r--ihatemoney/tests/tests.py1179
-rw-r--r--ihatemoney/translations/fr/LC_MESSAGES/messages.mobin0 -> 8425 bytes
-rw-r--r--ihatemoney/translations/fr/LC_MESSAGES/messages.po527
-rw-r--r--ihatemoney/utils.py133
-rw-r--r--ihatemoney/web.py500
-rw-r--r--ihatemoney/wsgi.py3
73 files changed, 8402 insertions, 0 deletions
diff --git a/ihatemoney/__init__.py b/ihatemoney/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ihatemoney/__init__.py
diff --git a/ihatemoney/api.py b/ihatemoney/api.py
new file mode 100644
index 0000000..a34fa12
--- /dev/null
+++ b/ihatemoney/api.py
@@ -0,0 +1,154 @@
+# -*- coding: utf-8 -*-
+from flask import Blueprint, request
+from flask_rest import RESTResource, need_auth
+
+from ihatemoney.models import db, Project, Person, Bill
+from ihatemoney.forms import (ProjectForm, EditProjectForm, MemberForm,
+ get_billform_for)
+
+
+api = Blueprint("api", __name__, url_prefix="/api")
+
+
+def check_project(*args, **kwargs):
+ """Check the request for basic authentication for a given project.
+
+ Return the project if the authorization is good, False otherwise
+ """
+ auth = request.authorization
+
+ # project_id should be contained in kwargs and equal to the username
+ if auth and "project_id" in kwargs and \
+ auth.username == kwargs["project_id"]:
+ project = Project.query.get(auth.username)
+ if project and project.password == auth.password:
+ return project
+ return False
+
+
+class ProjectHandler(object):
+
+ def add(self):
+ form = ProjectForm(meta={'csrf': False})
+ if form.validate():
+ project = form.save()
+ db.session.add(project)
+ db.session.commit()
+ return 201, project.id
+ return 400, form.errors
+
+ @need_auth(check_project, "project")
+ def get(self, project):
+ return 200, project
+
+ @need_auth(check_project, "project")
+ def delete(self, project):
+ db.session.delete(project)
+ db.session.commit()
+ return 200, "DELETED"
+
+ @need_auth(check_project, "project")
+ def update(self, project):
+ form = EditProjectForm(meta={'csrf': False})
+ if form.validate():
+ form.update(project)
+ db.session.commit()
+ return 200, "UPDATED"
+ return 400, form.errors
+
+
+class MemberHandler(object):
+
+ def get(self, project, member_id):
+ member = Person.query.get(member_id, project)
+ if not member or member.project != project:
+ return 404, "Not Found"
+ return 200, member
+
+ def list(self, project):
+ return 200, project.members
+
+ def add(self, project):
+ form = MemberForm(project, meta={'csrf': False})
+ if form.validate():
+ member = Person()
+ form.save(project, member)
+ db.session.commit()
+ return 201, member.id
+ return 400, form.errors
+
+ def update(self, project, member_id):
+ form = MemberForm(project, meta={'csrf': False})
+ if form.validate():
+ member = Person.query.get(member_id, project)
+ form.save(project, member)
+ db.session.commit()
+ return 200, member
+ return 400, form.errors
+
+ def delete(self, project, member_id):
+ if project.remove_member(member_id):
+ return 200, "OK"
+ return 404, "Not Found"
+
+
+class BillHandler(object):
+
+ def get(self, project, bill_id):
+ bill = Bill.query.get(project, bill_id)
+ if not bill:
+ return 404, "Not Found"
+ return 200, bill
+
+ def list(self, project):
+ return project.get_bills().all()
+
+ def add(self, project):
+ form = get_billform_for(project, True, meta={'csrf': False})
+ if form.validate():
+ bill = Bill()
+ form.save(bill, project)
+ db.session.add(bill)
+ db.session.commit()
+ return 201, bill.id
+ return 400, form.errors
+
+ def update(self, project, bill_id):
+ form = get_billform_for(project, True, meta={'csrf': False})
+ if form.validate():
+ bill = Bill.query.get(project, bill_id)
+ form.save(bill, project)
+ db.session.commit()
+ return 200, bill.id
+ return 400, form.errors
+
+ def delete(self, project, bill_id):
+ bill = Bill.query.delete(project, bill_id)
+ db.session.commit()
+ if not bill:
+ return 404, "Not Found"
+ return 200, "OK"
+
+
+project_resource = RESTResource(
+ name="project",
+ route="/projects",
+ app=api,
+ actions=["add", "update", "delete", "get"],
+ handler=ProjectHandler())
+
+member_resource = RESTResource(
+ name="member",
+ inject_name="project",
+ route="/projects/<project_id>/members",
+ app=api,
+ handler=MemberHandler(),
+ authentifier=check_project)
+
+bill_resource = RESTResource(
+ name="bill",
+ inject_name="project",
+ route="/projects/<project_id>/bills",
+ app=api,
+ handler=BillHandler(),
+ authentifier=check_project)
diff --git a/ihatemoney/babel.cfg b/ihatemoney/babel.cfg
new file mode 100644
index 0000000..f0234b3
--- /dev/null
+++ b/ihatemoney/babel.cfg
@@ -0,0 +1,3 @@
+[python: **.py]
+[jinja2: **/templates/**.html]
+extensions=jinja2.ext.autoescape,jinja2.ext.with_
diff --git a/ihatemoney/default_settings.py b/ihatemoney/default_settings.py
new file mode 100644
index 0000000..4ca11ca
--- /dev/null
+++ b/ihatemoney/default_settings.py
@@ -0,0 +1,31 @@
+# You can find more information about what these settings mean in the
+# documentation, available online at
+# http://ihatemoney.readthedocs.io/en/latest/installation.html#configuration
+
+# Turn this on if you want to have more output on what's happening under the
+# hood.
+DEBUG = False
+
+# The database URI, reprensenting the type of database and how to connect to it.
+# Enter an absolute path here.
+SQLALCHEMY_DATABASE_URI = 'sqlite://'
+SQLACHEMY_ECHO = DEBUG
+
+# Will likely become the default value in flask-sqlalchemy >=3 ; could be removed
+# then:
+SQLALCHEMY_TRACK_MODIFICATIONS = False
+
+# You need to change this secret key, otherwise bad things might happen to your
+# users.
+SECRET_KEY = "tralala"
+
+# A python tuple describing the name and email adress of the sender of the mails.
+MAIL_DEFAULT_SENDER = ("Budget manager", "budget@notmyidea.org")
+
+# If set to True, a demonstration project will be activated.
+ACTIVATE_DEMO_PROJECT = True
+
+# If not empty, the specified password must be entered to create new projects.
+# DO NOT enter the password in cleartext. Generate a password hash with
+# "ihatemoney generate_password_hash" instead.
+ADMIN_PASSWORD = ""
diff --git a/ihatemoney/forms.py b/ihatemoney/forms.py
new file mode 100644
index 0000000..ead5586
--- /dev/null
+++ b/ihatemoney/forms.py
@@ -0,0 +1,195 @@
+from flask_wtf.form import FlaskForm
+from wtforms.fields.core import SelectField, SelectMultipleField
+from wtforms.fields.html5 import DateField, DecimalField
+from wtforms.fields.simple import PasswordField, SubmitField, TextAreaField, StringField
+from wtforms.validators import Email, Required, ValidationError
+from flask_babel import lazy_gettext as _
+from flask import request
+
+from datetime import datetime
+from jinja2 import Markup
+
+from ihatemoney.models import Project, Person
+from ihatemoney.utils import slugify
+
+
+def get_billform_for(project, set_default=True, **kwargs):
+ """Return an instance of BillForm configured for a particular project.
+
+ :set_default: if set to True, on GET methods (usually when we want to
+ display the default form, it will call set_default on it.
+
+ """
+ form = BillForm(**kwargs)
+ active_members = [(m.id, m.name) for m in project.active_members]
+
+ form.payed_for.choices = form.payer.choices = active_members
+ form.payed_for.default = [m.id for m in project.active_members]
+
+ if set_default and request.method == "GET":
+ form.set_default()
+ return form
+
+
+class CommaDecimalField(DecimalField):
+
+ """A class to deal with comma in Decimal Field"""
+
+ def process_formdata(self, value):
+ if value:
+ value[0] = str(value[0]).replace(',', '.')
+ return super(CommaDecimalField, self).process_formdata(value)
+
+
+class EditProjectForm(FlaskForm):
+ name = StringField(_("Project name"), validators=[Required()])
+ password = StringField(_("Private code"), validators=[Required()])
+ contact_email = StringField(_("Email"), validators=[Required(), Email()])
+
+ def save(self):
+ """Create a new project with the information given by this form.
+
+ Returns the created instance
+ """
+ project = Project(name=self.name.data, id=self.id.data,
+ password=self.password.data,
+ contact_email=self.contact_email.data)
+ return project
+
+ def update(self, project):
+ """Update the project with the information from the form"""
+ project.name = self.name.data
+ project.password = self.password.data
+ project.contact_email = self.contact_email.data
+
+ return project
+
+
+class ProjectForm(EditProjectForm):
+ id = StringField(_("Project identifier"), validators=[Required()])
+ password = PasswordField(_("Private code"), validators=[Required()])
+ submit = SubmitField(_("Create the project"))
+
+ def validate_id(form, field):
+ form.id.data = slugify(field.data)
+ if (form.id.data == "dashboard") or Project.query.get(form.id.data):
+ message = _("The project identifier is used to log in and for the "
+ "URL of the project. "
+ "We tried to generate an identifier for you but a "
+ "project with this identifier already exists. "
+ "Please create a new identifier that you will be able "
+ "to remember")
+ raise ValidationError(Markup(message))
+
+
+class AuthenticationForm(FlaskForm):
+ id = StringField(_("Project identifier"), validators=[Required()])
+ password = PasswordField(_("Private code"), validators=[Required()])
+ submit = SubmitField(_("Get in"))
+
+
+class AdminAuthenticationForm(FlaskForm):
+ admin_password = PasswordField(_("Admin password"), validators=[Required()])
+ submit = SubmitField(_("Get in"))
+
+
+class PasswordReminder(FlaskForm):
+ id = StringField(_("Project identifier"), validators=[Required()])
+ submit = SubmitField(_("Send me the code by email"))
+
+ def validate_id(form, field):
+ if not Project.query.get(field.data):
+ raise ValidationError(_("This project does not exists"))
+
+
+class BillForm(FlaskForm):
+ date = DateField(_("Date"), validators=[Required()], default=datetime.now)
+ what = StringField(_("What?"), validators=[Required()])
+ payer = SelectField(_("Payer"), validators=[Required()], coerce=int)
+ amount = CommaDecimalField(_("Amount paid"), validators=[Required()])
+ payed_for = SelectMultipleField(_("For whom?"),
+ validators=[Required()], coerce=int)
+ submit = SubmitField(_("Submit"))
+ submit2 = SubmitField(_("Submit and add a new one"))
+
+ def save(self, bill, project):
+ bill.payer_id = self.payer.data
+ bill.amount = self.amount.data
+ bill.what = self.what.data
+ bill.date = self.date.data
+ bill.owers = [Person.query.get(ower, project)
+ for ower in self.payed_for.data]
+
+ return bill
+
+ def fill(self, bill):
+ self.payer.data = bill.payer_id
+ self.amount.data = bill.amount
+ self.what.data = bill.what
+ self.date.data = bill.date
+ self.payed_for.data = [int(ower.id) for ower in bill.owers]
+
+ def set_default(self):
+ self.payed_for.data = self.payed_for.default
+
+ def validate_amount(self, field):
+ if field.data == 0:
+ raise ValidationError(_("Bills can't be null"))
+
+
+class MemberForm(FlaskForm):
+
+ name = StringField(_("Name"), validators=[Required()])
+ weight = CommaDecimalField(_("Weight"), default=1)
+ submit = SubmitField(_("Add"))
+
+ def __init__(self, project, edit=False, *args, **kwargs):
+ super(MemberForm, self).__init__(*args, **kwargs)
+ self.project = project
+ self.edit = edit
+
+ def validate_name(form, field):
+ if field.data == form.name.default:
+ raise ValidationError(_("User name incorrect"))
+ if (not form.edit and Person.query.filter(
+ Person.name == field.data,
+ Person.project == form.project,
+ Person.activated == True).all()): # NOQA
+ raise ValidationError(_("This project already have this member"))
+
+ def save(self, project, person):
+ # if the user is already bound to the project, just reactivate him
+ person.name = self.name.data
+ person.project = project
+ person.weight = self.weight.data
+
+ return person
+
+ def fill(self, member):
+ self.name.data = member.name
+ self.weight.data = member.weight
+
+
+class InviteForm(FlaskForm):
+ emails = TextAreaField(_("People to notify"))
+ submit = SubmitField(_("Send invites"))
+
+ def validate_emails(form, field):
+ validator = Email()
+ for email in [email.strip() for email in form.emails.data.split(",")]:
+ if not validator.regex.match(email):
+ raise ValidationError(_("The email %(email)s is not valid",
+ email=email))
+
+
+class ExportForm(FlaskForm):
+ export_type = SelectField(
+ _("What do you want to download ?"),
+ validators=[Required()],
+ coerce=str,
+ choices=[("bills", _("bills")), ("transactions", _("transactions"))])
+ export_format = SelectField(
+ _("Export file format"),
+ validators=[Required()],
+ coerce=str,
+ choices=[("csv", "csv"), ("json", "json")])
diff --git a/ihatemoney/manage.py b/ihatemoney/manage.py
new file mode 100755
index 0000000..6f63a98
--- /dev/null
+++ b/ihatemoney/manage.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+
+from getpass import getpass
+from flask_script import Manager, Command
+from flask_migrate import Migrate, MigrateCommand
+from werkzeug.security import generate_password_hash
+
+from ihatemoney.run import create_app
+from ihatemoney.models import db
+
+
+class GeneratePasswordHash(Command):
+
+ """Get password from user and hash it without printing it in clear text."""
+
+ def run(self):
+ password = getpass(prompt='Password: ')
+ print(generate_password_hash(password))
+
+
+def main():
+ app = create_app()
+ Migrate(app, db)
+
+ manager = Manager(app)
+ manager.add_command('db', MigrateCommand)
+ manager.add_command('generate_password_hash', GeneratePasswordHash)
+ manager.run()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ihatemoney/messages.pot b/ihatemoney/messages.pot
new file mode 100644
index 0000000..0b1759b
--- /dev/null
+++ b/ihatemoney/messages.pot
@@ -0,0 +1,476 @@
+# Translations template for PROJECT.
+# Copyright (C) 2013 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2013-10-13 21:32+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: forms.py:22
+msgid "Select all"
+msgstr ""
+
+#: forms.py:22
+msgid "Select none"
+msgstr ""
+
+#: forms.py:61
+msgid "Project name"
+msgstr ""
+
+#: forms.py:62 forms.py:86 forms.py:102
+msgid "Private code"
+msgstr ""
+
+#: forms.py:63
+msgid "Email"
+msgstr ""
+
+#: forms.py:85 forms.py:101 forms.py:107
+msgid "Project identifier"
+msgstr ""
+
+#: forms.py:87 templates/send_invites.html:5
+msgid "Create the project"
+msgstr ""
+
+#: forms.py:92
+msgid ""
+"The project identifier is used to log in and for the URL of the project. "
+"We tried to generate an identifier for you but a project with this "
+"identifier already exists. Please create a new identifier that you will "
+"be able to remember."
+msgstr ""
+
+#: forms.py:103
+msgid "Get in"
+msgstr ""
+
+#: forms.py:108
+msgid "Send me the code by email"
+msgstr ""
+
+#: forms.py:112
+msgid "This project does not exists"
+msgstr ""
+
+#: forms.py:116
+msgid "Date"
+msgstr ""
+
+#: forms.py:117
+msgid "What?"
+msgstr ""
+
+#: forms.py:118
+msgid "Payer"
+msgstr ""
+
+#: forms.py:119
+msgid "Amount paid"
+msgstr ""
+
+#: forms.py:120 templates/list_bills.html:103
+msgid "For whom?"
+msgstr ""
+
+#: forms.py:122
+msgid "Submit"
+msgstr ""
+
+#: forms.py:123
+msgid "Submit and add a new one"
+msgstr ""
+
+#: forms.py:149
+msgid "Bills can't be null"
+msgstr ""
+
+#: forms.py:154
+msgid "Name"
+msgstr ""
+
+#: forms.py:155 templates/forms.html:95
+msgid "Add"
+msgstr ""
+
+#: forms.py:163
+msgid "User name incorrect"
+msgstr ""
+
+#: forms.py:167
+msgid "This project already have this member"
+msgstr ""
+
+#: forms.py:178
+msgid "People to notify"
+msgstr ""
+
+#: forms.py:179
+msgid "Send invites"
+msgstr ""
+
+#: forms.py:185
+#, python-format
+msgid "The email %(email)s is not valid"
+msgstr ""
+
+#: forms.py:191
+msgid "Start date"
+msgstr ""
+
+#: forms.py:192
+msgid "End date"
+msgstr ""
+
+#: web.py:95
+msgid "This private code is not the right one"
+msgstr ""
+
+#: web.py:147
+#, python-format
+msgid "You have just created '%(project)s' to share your expenses"
+msgstr ""
+
+#: web.py:165
+#, python-format
+msgid "%(msg_compl)sThe project identifier is %(project)s"
+msgstr ""
+
+#: web.py:185
+msgid "a mail has been sent to you with the password"
+msgstr ""
+
+#: web.py:211
+msgid "Project successfully deleted"
+msgstr ""
+
+#: web.py:254
+#, python-format
+msgid "You have been invited to share your expenses for %(project)s"
+msgstr ""
+
+#: web.py:261
+msgid "Your invitations have been sent"
+msgstr ""
+
+#: web.py:290
+#, python-format
+msgid "%(member)s had been added"
+msgstr ""
+
+#: web.py:303
+#, python-format
+msgid "%(name)s is part of this project again"
+msgstr ""
+
+#: web.py:312
+#, python-format
+msgid "User '%(name)s' has been deactivated"
+msgstr ""
+
+#: web.py:314
+#, python-format
+msgid "User '%(name)s' has been removed"
+msgstr ""
+
+#: web.py:331
+msgid "The bill has been added"
+msgstr ""
+
+#: web.py:351
+msgid "The bill has been deleted"
+msgstr ""
+
+#: web.py:369
+msgid "The bill has been modified"
+msgstr ""
+
+#: templates/add_bill.html:9
+msgid "Back to the list"
+msgstr ""
+
+#: templates/authenticate.html:6
+msgid ""
+"The project you are trying to access do not exist, do you want \n"
+"to"
+msgstr ""
+
+#: templates/authenticate.html:7
+msgid "create it"
+msgstr ""
+
+#: templates/authenticate.html:7
+msgid "?"
+msgstr ""
+
+#: templates/create_project.html:4
+msgid "Create a new project"
+msgstr ""
+
+#: templates/dashboard.html:5
+msgid "Project"
+msgstr ""
+
+#: templates/dashboard.html:5
+msgid "Number of members"
+msgstr ""
+
+#: templates/dashboard.html:5
+msgid "Number of bills"
+msgstr ""
+
+#: templates/dashboard.html:5
+msgid "Newest bill"
+msgstr ""
+
+#: templates/dashboard.html:5
+msgid "Oldest bill"
+msgstr ""
+
+#: templates/edit_project.html:6 templates/list_bills.html:24
+msgid "you sure?"
+msgstr ""
+
+#: templates/edit_project.html:11
+msgid "Edit this project"
+msgstr ""
+
+#: templates/forms.html:23
+msgid "Can't remember the password?"
+msgstr ""
+
+#: templates/forms.html:26
+msgid "Cancel"
+msgstr ""
+
+#: templates/forms.html:68
+msgid "Edit the project"
+msgstr ""
+
+#: templates/forms.html:69 templates/list_bills.html:70
+#: templates/list_bills.html:114
+msgid "delete"
+msgstr ""
+
+#: templates/forms.html:77
+msgid "Edit this bill"
+msgstr ""
+
+#: templates/forms.html:77 templates/list_bills.html:94
+msgid "Add a bill"
+msgstr ""
+
+#: templates/forms.html:95
+msgid "Type user name here"
+msgstr ""
+
+#: templates/forms.html:102
+msgid "Send the invitations"
+msgstr ""
+
+#: templates/forms.html:103
+msgid "No, thanks"
+msgstr ""
+
+#: templates/home.html:8
+msgid "Manage your shared <br>expenses, easily"
+msgstr ""
+
+#: templates/home.html:9
+msgid "Try out the demo"
+msgstr ""
+
+#: templates/home.html:12
+msgid "You're sharing a house?"
+msgstr ""
+
+#: templates/home.html:12
+msgid "Going on holidays with friends?"
+msgstr ""
+
+#: templates/home.html:12
+msgid "Simply sharing money with others?"
+msgstr ""
+
+#: templates/home.html:12
+msgid "We can help!"
+msgstr ""
+
+#: templates/home.html:24
+msgid "Log to an existing project"
+msgstr ""
+
+#: templates/home.html:28
+msgid "log in"
+msgstr ""
+
+#: templates/home.html:29
+msgid "can't remember your password?"
+msgstr ""
+
+#: templates/home.html:36
+msgid "or create a new one"
+msgstr ""
+
+#: templates/home.html:40
+msgid "let's get started"
+msgstr ""
+
+#: templates/home.html:51
+msgid ""
+"This access code will be sent to your friends. It is stored as-is by the "
+"server, so don\\'t reuse a personal password!"
+msgstr ""
+
+#: templates/layout.html:5
+msgid "Account manager"
+msgstr ""
+
+#: templates/layout.html:45 templates/settle_bills.html:4
+msgid "Bills"
+msgstr ""
+
+#: templates/layout.html:46 templates/settle_bills.html:5
+msgid "Settle"
+msgstr ""
+
+#: templates/layout.html:53
+msgid "options"
+msgstr ""
+
+#: templates/layout.html:55
+msgid "Project settings"
+msgstr ""
+
+#: templates/layout.html:59
+msgid "switch to"
+msgstr ""
+
+#: templates/layout.html:62
+msgid "Start a new project"
+msgstr ""
+
+#: templates/layout.html:64
+msgid "Logout"
+msgstr ""
+
+#: templates/layout.html:92
+msgid "This is a free software"
+msgstr ""
+
+#: templates/layout.html:92
+msgid "you can contribute and improve it!"
+msgstr ""
+
+#: templates/list_bills.html:74
+msgid "reactivate"
+msgstr ""
+
+#: templates/list_bills.html:88
+msgid "The project identifier is"
+msgstr ""
+
+#: templates/list_bills.html:88
+msgid "remember it!"
+msgstr ""
+
+#: templates/list_bills.html:89
+msgid "Add a new bill"
+msgstr ""
+
+#: templates/list_bills.html:103
+msgid "When?"
+msgstr ""
+
+#: templates/list_bills.html:103
+msgid "Who paid?"
+msgstr ""
+
+#: templates/list_bills.html:103
+msgid "For what?"
+msgstr ""
+
+#: templates/list_bills.html:103 templates/settle_bills.html:31
+msgid "How much?"
+msgstr ""
+
+#: templates/list_bills.html:103
+msgid "Actions"
+msgstr ""
+
+#: templates/list_bills.html:111
+msgid "each"
+msgstr ""
+
+#: templates/list_bills.html:113
+msgid "edit"
+msgstr ""
+
+#: templates/list_bills.html:122
+msgid "Nothing to list yet. You probably want to"
+msgstr ""
+
+#: templates/list_bills.html:122
+msgid "add a bill"
+msgstr ""
+
+#: templates/password_reminder.html:4
+msgid "Password reminder"
+msgstr ""
+
+#: templates/recent_projects.html:2
+msgid "Your projects"
+msgstr ""
+
+#: templates/send_invites.html:6
+msgid "Invite people"
+msgstr ""
+
+#: templates/send_invites.html:7
+msgid "Use it!"
+msgstr ""
+
+#: templates/send_invites.html:11
+msgid "Invite people to join this project"
+msgstr ""
+
+#: templates/send_invites.html:12
+msgid ""
+"Specify a (coma separated) list of email adresses you want to notify "
+"about the \n"
+"creation of this budget management project and we will send them an email"
+" for you."
+msgstr ""
+
+#: templates/send_invites.html:14
+msgid "If you prefer, you can"
+msgstr ""
+
+#: templates/send_invites.html:14
+msgid "skip this step"
+msgstr ""
+
+#: templates/send_invites.html:14
+msgid "and notify them yourself"
+msgstr ""
+
+#: templates/settle_bills.html:31
+msgid "Who pays?"
+msgstr ""
+
+#: templates/settle_bills.html:31
+msgid "To whom?"
+msgstr ""
+
diff --git a/ihatemoney/migrations/README b/ihatemoney/migrations/README
new file mode 100755
index 0000000..98e4f9c
--- /dev/null
+++ b/ihatemoney/migrations/README
@@ -0,0 +1 @@
+Generic single-database configuration. \ No newline at end of file
diff --git a/ihatemoney/migrations/alembic.ini b/ihatemoney/migrations/alembic.ini
new file mode 100644
index 0000000..f8ed480
--- /dev/null
+++ b/ihatemoney/migrations/alembic.ini
@@ -0,0 +1,45 @@
+# A generic, single database configuration.
+
+[alembic]
+# template used to generate migration files
+# file_template = %%(rev)s_%%(slug)s
+
+# set to 'true' to run the environment during
+# the 'revision' command, regardless of autogenerate
+# revision_environment = false
+
+
+# Logging configuration
+[loggers]
+keys = root,sqlalchemy,alembic
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = WARN
+handlers = console
+qualname =
+
+[logger_sqlalchemy]
+level = WARN
+handlers =
+qualname = sqlalchemy.engine
+
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %H:%M:%S
diff --git a/ihatemoney/migrations/env.py b/ihatemoney/migrations/env.py
new file mode 100755
index 0000000..e2f9a28
--- /dev/null
+++ b/ihatemoney/migrations/env.py
@@ -0,0 +1,85 @@
+from __future__ import with_statement
+from alembic import context
+from sqlalchemy import engine_from_config, pool
+from logging.config import fileConfig
+import logging
+
+# This is the Alembic Config object, which provides access to the values within
+# the .ini file in use.
+config = context.config
+
+# Interpret the config file for Python logging. This line sets up loggers
+# basically.
+fileConfig(config.config_file_name)
+logger = logging.getLogger('alembic.env')
+
+# Add your model's MetaData object here for 'autogenerate' support from myapp
+# import mymodel target_metadata = mymodel.Base.metadata.
+from flask import current_app
+config.set_main_option('sqlalchemy.url',
+ current_app.config.get('SQLALCHEMY_DATABASE_URI'))
+target_metadata = current_app.extensions['migrate'].db.metadata
+
+# Other values from the config, defined by the needs of env.py,
+# can be acquired:
+# my_important_option = config.get_main_option("my_important_option")
+# ... etc.
+
+
+def run_migrations_offline():
+ """Run migrations in 'offline' mode.
+
+ This configures the context with just a URL
+ and not an Engine, though an Engine is acceptable
+ here as well. By skipping the Engine creation
+ we don't even need a DBAPI to be available.
+
+ Calls to context.execute() here emit the given string to the
+ script output.
+
+ """
+ url = config.get_main_option("sqlalchemy.url")
+ context.configure(url=url)
+
+ with context.begin_transaction():
+ context.run_migrations()
+
+
+def run_migrations_online():
+ """Run migrations in 'online' mode.
+
+ In this scenario we need to create an Engine
+ and associate a connection with the context.
+
+ """
+
+ # This callback is used to prevent an auto-migration from being generated
+ # when there are no changes to the schema.
+ # reference: https://alembic.readthedocs.io/en/latest/cookbook.html
+ def process_revision_directives(context, revision, directives):
+ if getattr(config.cmd_opts, 'autogenerate', False):
+ script = directives[0]
+ if script.upgrade_ops.is_empty():
+ directives[:] = []
+ logger.info('No changes in schema detected.')
+
+ engine = engine_from_config(config.get_section(config.config_ini_section),
+ prefix='sqlalchemy.',
+ poolclass=pool.NullPool)
+
+ connection = engine.connect()
+ context.configure(connection=connection,
+ target_metadata=target_metadata,
+ process_revision_directives=process_revision_directives,
+ **current_app.extensions['migrate'].configure_args)
+
+ try:
+ with context.begin_transaction():
+ context.run_migrations()
+ finally:
+ connection.close()
+
+if context.is_offline_mode():
+ run_migrations_offline()
+else:
+ run_migrations_online()
diff --git a/ihatemoney/migrations/script.py.mako b/ihatemoney/migrations/script.py.mako
new file mode 100755
index 0000000..9570201
--- /dev/null
+++ b/ihatemoney/migrations/script.py.mako
@@ -0,0 +1,22 @@
+"""${message}
+
+Revision ID: ${up_revision}
+Revises: ${down_revision}
+Create Date: ${create_date}
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = ${repr(up_revision)}
+down_revision = ${repr(down_revision)}
+
+from alembic import op
+import sqlalchemy as sa
+${imports if imports else ""}
+
+def upgrade():
+ ${upgrades if upgrades else "pass"}
+
+
+def downgrade():
+ ${downgrades if downgrades else "pass"}
diff --git a/ihatemoney/migrations/versions/26d6a218c329_.py b/ihatemoney/migrations/versions/26d6a218c329_.py
new file mode 100644
index 0000000..859b9af
--- /dev/null
+++ b/ihatemoney/migrations/versions/26d6a218c329_.py
@@ -0,0 +1,26 @@
+"""Add Person.weight column
+
+Revision ID: 26d6a218c329
+Revises: b9a10d5d63ce
+Create Date: 2016-06-15 09:22:04.069447
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '26d6a218c329'
+down_revision = 'b9a10d5d63ce'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+ ### commands auto generated by Alembic - please adjust! ###
+ op.add_column('person', sa.Column('weight', sa.Float(), nullable=True))
+ ### end Alembic commands ###
+
+
+def downgrade():
+ ### commands auto generated by Alembic - please adjust! ###
+ op.drop_column('person', 'weight')
+ ### end Alembic commands ###
diff --git a/ihatemoney/migrations/versions/b9a10d5d63ce_.py b/ihatemoney/migrations/versions/b9a10d5d63ce_.py
new file mode 100644
index 0000000..92bb446
--- /dev/null
+++ b/ihatemoney/migrations/versions/b9a10d5d63ce_.py
@@ -0,0 +1,68 @@
+"""Initial migration
+
+Revision ID: b9a10d5d63ce
+Revises: None
+Create Date: 2016-05-21 23:21:21.605076
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = 'b9a10d5d63ce'
+down_revision = None
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+ ### commands auto generated by Alembic - please adjust! ###
+ op.create_table('project',
+ sa.Column('id', sa.String(length=64), nullable=False),
+ sa.Column('name', sa.UnicodeText(), nullable=True),
+ sa.Column('password', sa.String(length=128), nullable=True),
+ sa.Column('contact_email', sa.String(length=128), nullable=True),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_table('archive',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('project_id', sa.String(length=64), nullable=True),
+ sa.Column('name', sa.UnicodeText(), nullable=True),
+ sa.ForeignKeyConstraint(['project_id'], ['project.id'], ),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_table('person',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('project_id', sa.String(length=64), nullable=True),
+ sa.Column('name', sa.UnicodeText(), nullable=True),
+ sa.Column('activated', sa.Boolean(), nullable=True),
+ sa.ForeignKeyConstraint(['project_id'], ['project.id'], ),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_table('bill',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('payer_id', sa.Integer(), nullable=True),
+ sa.Column('amount', sa.Float(), nullable=True),
+ sa.Column('date', sa.Date(), nullable=True),
+ sa.Column('what', sa.UnicodeText(), nullable=True),
+ sa.Column('archive', sa.Integer(), nullable=True),
+ sa.ForeignKeyConstraint(['archive'], ['archive.id'], ),
+ sa.ForeignKeyConstraint(['payer_id'], ['person.id'], ),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_table('billowers',
+ sa.Column('bill_id', sa.Integer(), nullable=True),
+ sa.Column('person_id', sa.Integer(), nullable=True),
+ sa.ForeignKeyConstraint(['bill_id'], ['bill.id'], ),
+ sa.ForeignKeyConstraint(['person_id'], ['person.id'], )
+ )
+ ### end Alembic commands ###
+
+
+def downgrade():
+ ### commands auto generated by Alembic - please adjust! ###
+ op.drop_table('billowers')
+ op.drop_table('bill')
+ op.drop_table('person')
+ op.drop_table('archive')
+ op.drop_table('project')
+ ### end Alembic commands ###
diff --git a/ihatemoney/migrations/versions/f629c8ef4ab0_initialize_all_members_weights_to_1.py b/ihatemoney/migrations/versions/f629c8ef4ab0_initialize_all_members_weights_to_1.py
new file mode 100644
index 0000000..5542146
--- /dev/null
+++ b/ihatemoney/migrations/versions/f629c8ef4ab0_initialize_all_members_weights_to_1.py
@@ -0,0 +1,39 @@
+"""Initialize all members weights to 1
+
+Revision ID: f629c8ef4ab0
+Revises: 26d6a218c329
+Create Date: 2016-06-15 09:40:30.400862
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = 'f629c8ef4ab0'
+down_revision = '26d6a218c329'
+
+from alembic import op
+import sqlalchemy as sa
+
+# Snapshot of the person table
+person_helper = sa.Table(
+ 'person', sa.MetaData(),
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('project_id', sa.String(length=64), nullable=True),
+ sa.Column('name', sa.UnicodeText(), nullable=True),
+ sa.Column('activated', sa.Boolean(), nullable=True),
+ sa.Column('weight', sa.Float(), nullable=True),
+ sa.ForeignKeyConstraint(['project_id'], ['project.id'], ),
+ sa.PrimaryKeyConstraint('id')
+)
+
+
+def upgrade():
+ op.execute(
+ person_helper.update()
+ .where(person_helper.c.weight == None)
+ .values(weight=1)
+ )
+
+
+def downgrade():
+ # Downgrade path is not possible, because information has been lost.
+ pass
diff --git a/ihatemoney/models.py b/ihatemoney/models.py
new file mode 100644
index 0000000..6c71a57
--- /dev/null
+++ b/ihatemoney/models.py
@@ -0,0 +1,308 @@
+from collections import defaultdict
+
+from datetime import datetime
+from flask_sqlalchemy import SQLAlchemy, BaseQuery
+from flask import g
+
+from sqlalchemy import orm
+
+db = SQLAlchemy()
+
+
+class Project(db.Model):
+
+ _to_serialize = (
+ "id", "name", "password", "contact_email", "members", "active_members",
+ "balance"
+ )
+
+ id = db.Column(db.String(64), primary_key=True)
+
+ name = db.Column(db.UnicodeText)
+ password = db.Column(db.String(128))
+ contact_email = db.Column(db.String(128))
+ members = db.relationship("Person", backref="project")
+
+ @property
+ def active_members(self):
+ return [m for m in self.members if m.activated]
+
+ @property
+ def balance(self):
+
+ balances, should_pay, should_receive = (defaultdict(int)
+ for time in (1, 2, 3))
+
+ # for each person
+ for person in self.members:
+ # get the list of bills he has to pay
+ bills = Bill.query.options(orm.subqueryload(Bill.owers)).filter(
+ Bill.owers.contains(person))
+ for bill in bills.all():
+ if person != bill.payer:
+ share = bill.pay_each() * person.weight
+ should_pay[person] += share
+ should_receive[bill.payer] += share
+
+ for person in self.members:
+ balance = should_receive[person] - should_pay[person]
+ balances[person.id] = balance
+
+ return balances
+
+ @property
+ def uses_weights(self):
+ return len([i for i in self.members if i.weight != 1]) > 0
+
+ def get_transactions_to_settle_bill(self, pretty_output=False):
+ """Return a list of transactions that could be made to settle the bill"""
+
+ def prettify(transactions, pretty_output):
+ """ Return pretty transactions
+ """
+ if not pretty_output:
+ return transactions
+ pretty_transactions = []
+ for transaction in transactions:
+ pretty_transactions.append({
+ 'ower': transaction['ower'].name,
+ 'receiver': transaction['receiver'].name,
+ 'amount': round(transaction['amount'], 2)
+ })
+ return pretty_transactions
+
+ # cache value for better performance
+ balance = self.balance
+ credits, debts, transactions = [], [], []
+ # Create lists of credits and debts
+ for person in self.members:
+ if round(balance[person.id], 2) > 0:
+ credits.append({"person": person, "balance": balance[person.id]})
+ elif round(balance[person.id], 2) < 0:
+ debts.append({"person": person, "balance": -balance[person.id]})
+
+ # Try and find exact matches
+ for credit in credits:
+ match = self.exactmatch(round(credit["balance"], 2), debts)
+ if match:
+ for m in match:
+ transactions.append({
+ "ower": m["person"],
+ "receiver": credit["person"],
+ "amount": m["balance"]
+ })
+ debts.remove(m)
+ credits.remove(credit)
+ # Split any remaining debts & credits
+ while credits and debts:
+
+ if credits[0]["balance"] > debts[0]["balance"]:
+ transactions.append({
+ "ower": debts[0]["person"],
+ "receiver": credits[0]["person"],
+ "amount": debts[0]["balance"]
+ })
+ credits[0]["balance"] = credits[0]["balance"] - debts[0]["balance"]
+ del debts[0]
+ else:
+ transactions.append({
+ "ower": debts[0]["person"],
+ "receiver": credits[0]["person"],
+ "amount": credits[0]["balance"]
+ })
+ debts[0]["balance"] = debts[0]["balance"] - credits[0]["balance"]
+ del credits[0]
+
+ return prettify(transactions, pretty_output)
+
+ def exactmatch(self, credit, debts):
+ """Recursively try and find subsets of 'debts' whose sum is equal to credit"""
+ if not debts:
+ return None
+ if debts[0]["balance"] > credit:
+ return self.exactmatch(credit, debts[1:])
+ elif debts[0]["balance"] == credit:
+ return [debts[0]]
+ else:
+ match = self.exactmatch(credit - debts[0]["balance"], debts[1:])
+ if match:
+ match.append(debts[0])
+ else:
+ match = self.exactmatch(credit, debts[1:])
+ return match
+
+ def has_bills(self):
+ """return if the project do have bills or not"""
+ return self.get_bills().count() > 0
+
+ def get_bills(self):
+ """Return the list of bills related to this project"""
+ return Bill.query.join(Person, Project)\
+ .filter(Bill.payer_id == Person.id)\
+ .filter(Person.project_id == Project.id)\
+ .filter(Project.id == self.id)\
+ .order_by(Bill.date.desc())\
+ .order_by(Bill.id.desc())
+
+ def get_pretty_bills(self, export_format="json"):
+ """Return a list of project's bills with pretty formatting"""
+ bills = self.get_bills()
+ pretty_bills = []
+ for bill in bills:
+ if export_format == "json":
+ owers = [ower.name for ower in bill.owers]
+ else:
+ owers = ', '.join([ower.name for ower in bill.owers])
+
+ pretty_bills.append({
+ "what": bill.what,
+ "amount": round(bill.amount, 2),
+ "date": str(bill.date),
+ "payer_name": Person.query.get(bill.payer_id).name,
+ "payer_weight": Person.query.get(bill.payer_id).weight,
+ "owers": owers
+ })
+ return pretty_bills
+
+ def remove_member(self, member_id):
+ """Remove a member from the project.
+
+ If the member is not bound to a bill, then he is deleted, otherwise
+ he is only deactivated.
+
+ This method returns the status DELETED or DEACTIVATED regarding the
+ changes made.
+ """
+ try:
+ person = Person.query.get(member_id, self)
+ except orm.exc.NoResultFound:
+ return None
+ if not person.has_bills():
+ db.session.delete(person)
+ db.session.commit()
+ else:
+ person.activated = False
+ db.session.commit()
+ return person
+
+ def remove_project(self):
+ db.session.delete(self)
+ db.session.commit()
+
+ def __repr__(self):
+ return "<Project %s>" % self.name
+
+
+class Person(db.Model):
+
+ class PersonQuery(BaseQuery):
+
+ def get_by_name(self, name, project):
+ return Person.query.filter(Person.name == name)\
+ .filter(Project.id == project.id).one()
+
+ def get(self, id, project=None):
+ if not project:
+ project = g.project
+ return Person.query.filter(Person.id == id)\
+ .filter(Project.id == project.id).one()
+
+ query_class = PersonQuery
+
+ _to_serialize = ("id", "name", "weight", "activated")
+
+ id = db.Column(db.Integer, primary_key=True)
+ project_id = db.Column(db.String(64), db.ForeignKey("project.id"))
+ bills = db.relationship("Bill", backref="payer")
+
+ name = db.Column(db.UnicodeText)
+ weight = db.Column(db.Float, default=1)
+ activated = db.Column(db.Boolean, default=True)
+
+ def has_bills(self):
+ """return if the user do have bills or not"""
+ bills_as_ower_number = db.session.query(billowers)\
+ .filter(billowers.columns.get("person_id") == self.id)\
+ .count()
+ return bills_as_ower_number != 0 or len(self.bills) != 0
+
+ def __str__(self):
+ return self.name
+
+ def __repr__(self):
+ return "<Person %s for project %s>" % (self.name, self.project.name)
+
+
+# We need to manually define a join table for m2m relations
+billowers = db.Table(
+ 'billowers',
+ db.Column('bill_id', db.Integer, db.ForeignKey('bill.id')),
+ db.Column('person_id', db.Integer, db.ForeignKey('person.id')),
+)
+
+
+class Bill(db.Model):
+
+ class BillQuery(BaseQuery):
+
+ def get(self, project, id):
+ try:
+ return (self.join(Person, Project)
+ .filter(Bill.payer_id == Person.id)
+ .filter(Person.project_id == Project.id)
+ .filter(Project.id == project.id)
+ .filter(Bill.id == id).one())
+ except orm.exc.NoResultFound:
+ return None
+
+ def delete(self, project, id):
+ bill = self.get(project, id)
+ if bill:
+ db.session.delete(bill)
+ return bill
+
+ query_class = BillQuery
+
+ _to_serialize = ("id", "payer_id", "owers", "amount", "date", "what")
+
+ id = db.Column(db.Integer, primary_key=True)
+
+ payer_id = db.Column(db.Integer, db.ForeignKey("person.id"))
+ owers = db.relationship(Person, secondary=billowers)
+
+ amount = db.Column(db.Float)
+ date = db.Column(db.Date, default=datetime.now)
+ what = db.Column(db.UnicodeText)
+
+ archive = db.Column(db.Integer, db.ForeignKey("archive.id"))
+
+ def pay_each(self):
+ """Compute what each share has to pay"""
+ if self.owers:
+ # FIXME: SQL might dot that more efficiently
+ return self.amount / sum(i.weight for i in self.owers)
+ else:
+ return 0
+
+ def __repr__(self):
+ return "<Bill of %s from %s for %s>" % (
+ self.amount,
+ self.payer, ", ".join([o.name for o in self.owers])
+ )
+
+
+class Archive(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ project_id = db.Column(db.String(64), db.ForeignKey("project.id"))
+ name = db.Column(db.UnicodeText)
+
+ @property
+ def start_date(self):
+ pass
+
+ @property
+ def end_date(self):
+ pass
+
+ def __repr__(self):
+ return "<Archive>"
diff --git a/ihatemoney/run.py b/ihatemoney/run.py
new file mode 100644
index 0000000..22cf235
--- /dev/null
+++ b/ihatemoney/run.py
@@ -0,0 +1,144 @@
+import os
+import os.path
+import warnings
+
+from flask import Flask, g, request, session
+from flask_babel import Babel
+from flask_mail import Mail
+from flask_migrate import Migrate, upgrade, stamp
+from raven.contrib.flask import Sentry
+
+from ihatemoney.api import api
+from ihatemoney.models import db
+from ihatemoney.utils import PrefixedWSGI, minimal_round
+from ihatemoney.web import main as web_interface
+
+from ihatemoney import default_settings
+
+
+def setup_database(app):
+ """Prepare the database. Create tables, run migrations etc."""
+
+ def _pre_alembic_db():
+ """ Checks if we are migrating from a pre-alembic ihatemoney
+ """
+ con = db.engine.connect()
+ tables_exist = db.engine.dialect.has_table(con, 'project')
+ alembic_setup = db.engine.dialect.has_table(con, 'alembic_version')
+ return tables_exist and not alembic_setup
+
+ db.init_app(app)
+ db.app = app
+
+ Migrate(app, db)
+ migrations_path = os.path.join(app.root_path, 'migrations')
+
+ if _pre_alembic_db():
+ with app.app_context():
+ # fake the first migration
+ stamp(migrations_path, revision='b9a10d5d63ce')
+
+ # auto-execute migrations on runtime
+ with app.app_context():
+ upgrade(migrations_path)
+
+
+def load_configuration(app, configuration=None):
+ """ Find the right configuration file for the application and load it.
+
+ By order of preference:
+ - Use the IHATEMONEY_SETTINGS_FILE_PATH env var if defined ;
+ - If not, use /etc/ihatemoney/ihatemoney.cfg ;
+ - Otherwise, load the default settings.
+ """
+
+ env_var_config = os.environ.get('IHATEMONEY_SETTINGS_FILE_PATH')
+ app.config.from_object('ihatemoney.default_settings')
+ if configuration:
+ app.config.from_object(configuration)
+ elif env_var_config:
+ app.config.from_pyfile(env_var_config)
+ else:
+ app.config.from_pyfile('ihatemoney.cfg', silent=True)
+
+
+def validate_configuration(app):
+
+ if app.config['SECRET_KEY'] == default_settings.SECRET_KEY:
+ warnings.warn(
+ "Running a server without changing the SECRET_KEY can lead to"
+ + " user impersonation. Please update your configuration file.",
+ UserWarning
+ )
+ # Deprecations
+ if 'DEFAULT_MAIL_SENDER' in app.config:
+ # Since flask-mail 0.8
+ warnings.warn(
+ "DEFAULT_MAIL_SENDER is deprecated in favor of MAIL_DEFAULT_SENDER"
+ + " and will be removed in further version",
+ UserWarning
+ )
+ if 'MAIL_DEFAULT_SENDER' not in app.config:
+ app.config['MAIL_DEFAULT_SENDER'] = default_settings.DEFAULT_MAIL_SENDER
+
+ if "pbkdf2:sha256:" not in app.config['ADMIN_PASSWORD'] and app.config['ADMIN_PASSWORD']:
+ # Since 2.0
+ warnings.warn(
+ "The way Ihatemoney stores your ADMIN_PASSWORD has changed. You are using an unhashed"
+ + " ADMIN_PASSWORD, which is not supported anymore and won't let you access your admin"
+ + " endpoints. Please use the command 'ihatemoney generate_password_hash'"
+ + " to generate a proper password HASH and copy the output to the value of"
+ + " ADMIN_PASSWORD in your settings file.",
+ UserWarning
+ )
+
+
+def create_app(configuration=None, instance_path='/etc/ihatemoney',
+ instance_relative_config=True):
+ app = Flask(
+ __name__,
+ instance_path=instance_path,
+ instance_relative_config=instance_relative_config)
+
+ # If a configuration object is passed, use it. Otherwise try to find one.
+ load_configuration(app, configuration)
+ app.wsgi_app = PrefixedWSGI(app)
+
+ validate_configuration(app)
+ app.register_blueprint(web_interface)
+ app.register_blueprint(api)
+
+ # Configure the application
+ setup_database(app)
+
+ mail = Mail()
+ mail.init_app(app)
+ app.mail = mail
+
+ # Error reporting
+ Sentry(app)
+
+ # Jinja filters
+ app.jinja_env.filters['minimal_round'] = minimal_round
+
+ # Translations
+ babel = Babel(app)
+
+ @babel.localeselector
+ def get_locale():
+ # get the lang from the session if defined, fallback on the browser "accept
+ # languages" header.
+ lang = session.get('lang', request.accept_languages.best_match(['fr', 'en']))
+ setattr(g, 'lang', lang)
+ return lang
+
+ return app
+
+
+def main():
+ app = create_app()
+ app.run(host="0.0.0.0", debug=True)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ihatemoney/static/css/bootstrap-datepicker3.standalone.css b/ihatemoney/static/css/bootstrap-datepicker3.standalone.css
new file mode 100644
index 0000000..b61742e
--- /dev/null
+++ b/ihatemoney/static/css/bootstrap-datepicker3.standalone.css
@@ -0,0 +1,707 @@
+/*!
+ * Datepicker for Bootstrap v1.6.4 (https://github.com/eternicode/bootstrap-datepicker)
+ *
+ * Copyright 2012 Stefan Petre
+ * Improvements by Andrew Rowls
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+.datepicker {
+ border-radius: 4px;
+ direction: ltr;
+}
+.datepicker-inline {
+ width: 220px;
+}
+.datepicker.datepicker-rtl {
+ direction: rtl;
+}
+.datepicker.datepicker-rtl table tr td span {
+ float: right;
+}
+.datepicker-dropdown {
+ top: 0;
+ left: 0;
+ padding: 4px;
+}
+.datepicker-dropdown:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid rgba(0, 0, 0, 0.15);
+ border-top: 0;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ position: absolute;
+}
+.datepicker-dropdown:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #fff;
+ border-top: 0;
+ position: absolute;
+}
+.datepicker-dropdown.datepicker-orient-left:before {
+ left: 6px;
+}
+.datepicker-dropdown.datepicker-orient-left:after {
+ left: 7px;
+}
+.datepicker-dropdown.datepicker-orient-right:before {
+ right: 6px;
+}
+.datepicker-dropdown.datepicker-orient-right:after {
+ right: 7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:before {
+ top: -7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:after {
+ top: -6px;
+}
+.datepicker-dropdown.datepicker-orient-top:before {
+ bottom: -7px;
+ border-bottom: 0;
+ border-top: 7px solid rgba(0, 0, 0, 0.15);
+}
+.datepicker-dropdown.datepicker-orient-top:after {
+ bottom: -6px;
+ border-bottom: 0;
+ border-top: 6px solid #fff;
+}
+.datepicker table {
+ margin: 0;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.datepicker table tr td,
+.datepicker table tr th {
+ text-align: center;
+ width: 30px;
+ height: 30px;
+ border-radius: 4px;
+ border: none;
+}
+.table-striped .datepicker table tr td,
+.table-striped .datepicker table tr th {
+ background-color: transparent;
+}
+.datepicker table tr td.old,
+.datepicker table tr td.new {
+ color: #777777;
+}
+.datepicker table tr td.day:hover,
+.datepicker table tr td.focused {
+ background: #eeeeee;
+ cursor: pointer;
+}
+.datepicker table tr td.disabled,
+.datepicker table tr td.disabled:hover {
+ background: none;
+ color: #777777;
+ cursor: default;
+}
+.datepicker table tr td.highlighted {
+ color: #000;
+ background-color: #d9edf7;
+ border-color: #85c5e5;
+ border-radius: 0;
+}
+.datepicker table tr td.highlighted:focus,
+.datepicker table tr td.highlighted.focus {
+ color: #000;
+ background-color: #afd9ee;
+ border-color: #298fc2;
+}
+.datepicker table tr td.highlighted:hover {
+ color: #000;
+ background-color: #afd9ee;
+ border-color: #52addb;
+}
+.datepicker table tr td.highlighted:active,
+.datepicker table tr td.highlighted.active {
+ color: #000;
+ background-color: #afd9ee;
+ border-color: #52addb;
+}
+.datepicker table tr td.highlighted:active:hover,
+.datepicker table tr td.highlighted.active:hover,
+.datepicker table tr td.highlighted:active:focus,
+.datepicker table tr td.highlighted.active:focus,
+.datepicker table tr td.highlighted:active.focus,
+.datepicker table tr td.highlighted.active.focus {
+ color: #000;
+ background-color: #91cbe8;
+ border-color: #298fc2;
+}
+.datepicker table tr td.highlighted.disabled:hover,
+.datepicker table tr td.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.highlighted:hover,
+.datepicker table tr td.highlighted.disabled:focus,
+.datepicker table tr td.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.highlighted:focus,
+.datepicker table tr td.highlighted.disabled.focus,
+.datepicker table tr td.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.highlighted.focus {
+ background-color: #d9edf7;
+ border-color: #85c5e5;
+}
+.datepicker table tr td.highlighted.focused {
+ background: #afd9ee;
+}
+.datepicker table tr td.highlighted.disabled,
+.datepicker table tr td.highlighted.disabled:active {
+ background: #d9edf7;
+ color: #777777;
+}
+.datepicker table tr td.today {
+ color: #000;
+ background-color: #ffdb99;
+ border-color: #ffb733;
+}
+.datepicker table tr td.today:focus,
+.datepicker table tr td.today.focus {
+ color: #000;
+ background-color: #ffc966;
+ border-color: #b37400;
+}
+.datepicker table tr td.today:hover {
+ color: #000;
+ background-color: #ffc966;
+ border-color: #f59e00;
+}
+.datepicker table tr td.today:active,
+.datepicker table tr td.today.active {
+ color: #000;
+ background-color: #ffc966;
+ border-color: #f59e00;
+}
+.datepicker table tr td.today:active:hover,
+.datepicker table tr td.today.active:hover,
+.datepicker table tr td.today:active:focus,
+.datepicker table tr td.today.active:focus,
+.datepicker table tr td.today:active.focus,
+.datepicker table tr td.today.active.focus {
+ color: #000;
+ background-color: #ffbc42;
+ border-color: #b37400;
+}
+.datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.today:hover,
+.datepicker table tr td.today.disabled:focus,
+.datepicker table tr td.today[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.today:focus,
+.datepicker table tr td.today.disabled.focus,
+.datepicker table tr td.today[disabled].focus,
+fieldset[disabled] .datepicker table tr td.today.focus {
+ background-color: #ffdb99;
+ border-color: #ffb733;
+}
+.datepicker table tr td.today.focused {
+ background: #ffc966;
+}
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today.disabled:active {
+ background: #ffdb99;
+ color: #777777;
+}
+.datepicker table tr td.range {
+ color: #000;
+ background-color: #eeeeee;
+ border-color: #bbbbbb;
+ border-radius: 0;
+}
+.datepicker table tr td.range:focus,
+.datepicker table tr td.range.focus {
+ color: #000;
+ background-color: #d5d5d5;
+ border-color: #7c7c7c;
+}
+.datepicker table tr td.range:hover {
+ color: #000;
+ background-color: #d5d5d5;
+ border-color: #9d9d9d;
+}
+.datepicker table tr td.range:active,
+.datepicker table tr td.range.active {
+ color: #000;
+ background-color: #d5d5d5;
+ border-color: #9d9d9d;
+}
+.datepicker table tr td.range:active:hover,
+.datepicker table tr td.range.active:hover,
+.datepicker table tr td.range:active:focus,
+.datepicker table tr td.range.active:focus,
+.datepicker table tr td.range:active.focus,
+.datepicker table tr td.range.active.focus {
+ color: #000;
+ background-color: #c3c3c3;
+ border-color: #7c7c7c;
+}
+.datepicker table tr td.range.disabled:hover,
+.datepicker table tr td.range[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.range:hover,
+.datepicker table tr td.range.disabled:focus,
+.datepicker table tr td.range[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.range:focus,
+.datepicker table tr td.range.disabled.focus,
+.datepicker table tr td.range[disabled].focus,
+fieldset[disabled] .datepicker table tr td.range.focus {
+ background-color: #eeeeee;
+ border-color: #bbbbbb;
+}
+.datepicker table tr td.range.focused {
+ background: #d5d5d5;
+}
+.datepicker table tr td.range.disabled,
+.datepicker table tr td.range.disabled:active {
+ background: #eeeeee;
+ color: #777777;
+}
+.datepicker table tr td.range.highlighted {
+ color: #000;
+ background-color: #e4eef3;
+ border-color: #9dc1d3;
+}
+.datepicker table tr td.range.highlighted:focus,
+.datepicker table tr td.range.highlighted.focus {
+ color: #000;
+ background-color: #c1d7e3;
+ border-color: #4b88a6;
+}
+.datepicker table tr td.range.highlighted:hover {
+ color: #000;
+ background-color: #c1d7e3;
+ border-color: #73a6c0;
+}
+.datepicker table tr td.range.highlighted:active,
+.datepicker table tr td.range.highlighted.active {
+ color: #000;
+ background-color: #c1d7e3;
+ border-color: #73a6c0;
+}
+.datepicker table tr td.range.highlighted:active:hover,
+.datepicker table tr td.range.highlighted.active:hover,
+.datepicker table tr td.range.highlighted:active:focus,
+.datepicker table tr td.range.highlighted.active:focus,
+.datepicker table tr td.range.highlighted:active.focus,
+.datepicker table tr td.range.highlighted.active.focus {
+ color: #000;
+ background-color: #a8c8d8;
+ border-color: #4b88a6;
+}
+.datepicker table tr td.range.highlighted.disabled:hover,
+.datepicker table tr td.range.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.range.highlighted:hover,
+.datepicker table tr td.range.highlighted.disabled:focus,
+.datepicker table tr td.range.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.range.highlighted:focus,
+.datepicker table tr td.range.highlighted.disabled.focus,
+.datepicker table tr td.range.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.range.highlighted.focus {
+ background-color: #e4eef3;
+ border-color: #9dc1d3;
+}
+.datepicker table tr td.range.highlighted.focused {
+ background: #c1d7e3;
+}
+.datepicker table tr td.range.highlighted.disabled,
+.datepicker table tr td.range.highlighted.disabled:active {
+ background: #e4eef3;
+ color: #777777;
+}
+.datepicker table tr td.range.today {
+ color: #000;
+ background-color: #f7ca77;
+ border-color: #f1a417;
+}
+.datepicker table tr td.range.today:focus,
+.datepicker table tr td.range.today.focus {
+ color: #000;
+ background-color: #f4b747;
+ border-color: #815608;
+}
+.datepicker table tr td.range.today:hover {
+ color: #000;
+ background-color: #f4b747;
+ border-color: #bf800c;
+}
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today.active {
+ color: #000;
+ background-color: #f4b747;
+ border-color: #bf800c;
+}
+.datepicker table tr td.range.today:active:hover,
+.datepicker table tr td.range.today.active:hover,
+.datepicker table tr td.range.today:active:focus,
+.datepicker table tr td.range.today.active:focus,
+.datepicker table tr td.range.today:active.focus,
+.datepicker table tr td.range.today.active.focus {
+ color: #000;
+ background-color: #f2aa25;
+ border-color: #815608;
+}
+.datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today.disabled:focus,
+.datepicker table tr td.range.today[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.range.today:focus,
+.datepicker table tr td.range.today.disabled.focus,
+.datepicker table tr td.range.today[disabled].focus,
+fieldset[disabled] .datepicker table tr td.range.today.focus {
+ background-color: #f7ca77;
+ border-color: #f1a417;
+}
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today.disabled:active {
+ background: #f7ca77;
+ color: #777777;
+}
+.datepicker table tr td.selected,
+.datepicker table tr td.selected.highlighted {
+ color: #fff;
+ background-color: #777777;
+ border-color: #555555;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.selected:focus,
+.datepicker table tr td.selected.highlighted:focus,
+.datepicker table tr td.selected.focus,
+.datepicker table tr td.selected.highlighted.focus {
+ color: #fff;
+ background-color: #5e5e5e;
+ border-color: #161616;
+}
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected.highlighted:hover {
+ color: #fff;
+ background-color: #5e5e5e;
+ border-color: #373737;
+}
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected.highlighted:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected.highlighted.active {
+ color: #fff;
+ background-color: #5e5e5e;
+ border-color: #373737;
+}
+.datepicker table tr td.selected:active:hover,
+.datepicker table tr td.selected.highlighted:active:hover,
+.datepicker table tr td.selected.active:hover,
+.datepicker table tr td.selected.highlighted.active:hover,
+.datepicker table tr td.selected:active:focus,
+.datepicker table tr td.selected.highlighted:active:focus,
+.datepicker table tr td.selected.active:focus,
+.datepicker table tr td.selected.highlighted.active:focus,
+.datepicker table tr td.selected:active.focus,
+.datepicker table tr td.selected.highlighted:active.focus,
+.datepicker table tr td.selected.active.focus,
+.datepicker table tr td.selected.highlighted.active.focus {
+ color: #fff;
+ background-color: #4c4c4c;
+ border-color: #161616;
+}
+.datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected.highlighted.disabled:hover,
+.datepicker table tr td.selected[disabled]:hover,
+.datepicker table tr td.selected.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.selected:hover,
+fieldset[disabled] .datepicker table tr td.selected.highlighted:hover,
+.datepicker table tr td.selected.disabled:focus,
+.datepicker table tr td.selected.highlighted.disabled:focus,
+.datepicker table tr td.selected[disabled]:focus,
+.datepicker table tr td.selected.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.selected:focus,
+fieldset[disabled] .datepicker table tr td.selected.highlighted:focus,
+.datepicker table tr td.selected.disabled.focus,
+.datepicker table tr td.selected.highlighted.disabled.focus,
+.datepicker table tr td.selected[disabled].focus,
+.datepicker table tr td.selected.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.selected.focus,
+fieldset[disabled] .datepicker table tr td.selected.highlighted.focus {
+ background-color: #777777;
+ border-color: #555555;
+}
+.datepicker table tr td.active,
+.datepicker table tr td.active.highlighted {
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #2e6da4;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.active:focus,
+.datepicker table tr td.active.highlighted:focus,
+.datepicker table tr td.active.focus,
+.datepicker table tr td.active.highlighted.focus {
+ color: #fff;
+ background-color: #286090;
+ border-color: #122b40;
+}
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active.highlighted:hover {
+ color: #fff;
+ background-color: #286090;
+ border-color: #204d74;
+}
+.datepicker table tr td.active:active,
+.datepicker table tr td.active.highlighted:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active.highlighted.active {
+ color: #fff;
+ background-color: #286090;
+ border-color: #204d74;
+}
+.datepicker table tr td.active:active:hover,
+.datepicker table tr td.active.highlighted:active:hover,
+.datepicker table tr td.active.active:hover,
+.datepicker table tr td.active.highlighted.active:hover,
+.datepicker table tr td.active:active:focus,
+.datepicker table tr td.active.highlighted:active:focus,
+.datepicker table tr td.active.active:focus,
+.datepicker table tr td.active.highlighted.active:focus,
+.datepicker table tr td.active:active.focus,
+.datepicker table tr td.active.highlighted:active.focus,
+.datepicker table tr td.active.active.focus,
+.datepicker table tr td.active.highlighted.active.focus {
+ color: #fff;
+ background-color: #204d74;
+ border-color: #122b40;
+}
+.datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active.highlighted.disabled:hover,
+.datepicker table tr td.active[disabled]:hover,
+.datepicker table tr td.active.highlighted[disabled]:hover,
+fieldset[disabled] .datepicker table tr td.active:hover,
+fieldset[disabled] .datepicker table tr td.active.highlighted:hover,
+.datepicker table tr td.active.disabled:focus,
+.datepicker table tr td.active.highlighted.disabled:focus,
+.datepicker table tr td.active[disabled]:focus,
+.datepicker table tr td.active.highlighted[disabled]:focus,
+fieldset[disabled] .datepicker table tr td.active:focus,
+fieldset[disabled] .datepicker table tr td.active.highlighted:focus,
+.datepicker table tr td.active.disabled.focus,
+.datepicker table tr td.active.highlighted.disabled.focus,
+.datepicker table tr td.active[disabled].focus,
+.datepicker table tr td.active.highlighted[disabled].focus,
+fieldset[disabled] .datepicker table tr td.active.focus,
+fieldset[disabled] .datepicker table tr td.active.highlighted.focus {
+ background-color: #337ab7;
+ border-color: #2e6da4;
+}
+.datepicker table tr td span {
+ display: block;
+ width: 23%;
+ height: 54px;
+ line-height: 54px;
+ float: left;
+ margin: 1%;
+ cursor: pointer;
+ border-radius: 4px;
+}
+.datepicker table tr td span:hover,
+.datepicker table tr td span.focused {
+ background: #eeeeee;
+}
+.datepicker table tr td span.disabled,
+.datepicker table tr td span.disabled:hover {
+ background: none;
+ color: #777777;
+ cursor: default;
+}
+.datepicker table tr td span.active,
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active.disabled:hover {
+ color: #fff;
+ background-color: #337ab7;
+ border-color: #2e6da4;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td span.active:focus,
+.datepicker table tr td span.active:hover:focus,
+.datepicker table tr td span.active.disabled:focus,
+.datepicker table tr td span.active.disabled:hover:focus,
+.datepicker table tr td span.active.focus,
+.datepicker table tr td span.active:hover.focus,
+.datepicker table tr td span.active.disabled.focus,
+.datepicker table tr td span.active.disabled:hover.focus {
+ color: #fff;
+ background-color: #286090;
+ border-color: #122b40;
+}
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active:hover:hover,
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active.disabled:hover:hover {
+ color: #fff;
+ background-color: #286090;
+ border-color: #204d74;
+}
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active {
+ color: #fff;
+ background-color: #286090;
+ border-color: #204d74;
+}
+.datepicker table tr td span.active:active:hover,
+.datepicker table tr td span.active:hover:active:hover,
+.datepicker table tr td span.active.disabled:active:hover,
+.datepicker table tr td span.active.disabled:hover:active:hover,
+.datepicker table tr td span.active.active:hover,
+.datepicker table tr td span.active:hover.active:hover,
+.datepicker table tr td span.active.disabled.active:hover,
+.datepicker table tr td span.active.disabled:hover.active:hover,
+.datepicker table tr td span.active:active:focus,
+.datepicker table tr td span.active:hover:active:focus,
+.datepicker table tr td span.active.disabled:active:focus,
+.datepicker table tr td span.active.disabled:hover:active:focus,
+.datepicker table tr td span.active.active:focus,
+.datepicker table tr td span.active:hover.active:focus,
+.datepicker table tr td span.active.disabled.active:focus,
+.datepicker table tr td span.active.disabled:hover.active:focus,
+.datepicker table tr td span.active:active.focus,
+.datepicker table tr td span.active:hover:active.focus,
+.datepicker table tr td span.active.disabled:active.focus,
+.datepicker table tr td span.active.disabled:hover:active.focus,
+.datepicker table tr td span.active.active.focus,
+.datepicker table tr td span.active:hover.active.focus,
+.datepicker table tr td span.active.disabled.active.focus,
+.datepicker table tr td span.active.disabled:hover.active.focus {
+ color: #fff;
+ background-color: #204d74;
+ border-color: #122b40;
+}
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active:hover.disabled:hover,
+.datepicker table tr td span.active.disabled.disabled:hover,
+.datepicker table tr td span.active.disabled:hover.disabled:hover,
+.datepicker table tr td span.active[disabled]:hover,
+.datepicker table tr td span.active:hover[disabled]:hover,
+.datepicker table tr td span.active.disabled[disabled]:hover,
+.datepicker table tr td span.active.disabled:hover[disabled]:hover,
+fieldset[disabled] .datepicker table tr td span.active:hover,
+fieldset[disabled] .datepicker table tr td span.active:hover:hover,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,
+.datepicker table tr td span.active.disabled:focus,
+.datepicker table tr td span.active:hover.disabled:focus,
+.datepicker table tr td span.active.disabled.disabled:focus,
+.datepicker table tr td span.active.disabled:hover.disabled:focus,
+.datepicker table tr td span.active[disabled]:focus,
+.datepicker table tr td span.active:hover[disabled]:focus,
+.datepicker table tr td span.active.disabled[disabled]:focus,
+.datepicker table tr td span.active.disabled:hover[disabled]:focus,
+fieldset[disabled] .datepicker table tr td span.active:focus,
+fieldset[disabled] .datepicker table tr td span.active:hover:focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,
+.datepicker table tr td span.active.disabled.focus,
+.datepicker table tr td span.active:hover.disabled.focus,
+.datepicker table tr td span.active.disabled.disabled.focus,
+.datepicker table tr td span.active.disabled:hover.disabled.focus,
+.datepicker table tr td span.active[disabled].focus,
+.datepicker table tr td span.active:hover[disabled].focus,
+.datepicker table tr td span.active.disabled[disabled].focus,
+.datepicker table tr td span.active.disabled:hover[disabled].focus,
+fieldset[disabled] .datepicker table tr td span.active.focus,
+fieldset[disabled] .datepicker table tr td span.active:hover.focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled.focus,
+fieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus {
+ background-color: #337ab7;
+ border-color: #2e6da4;
+}
+.datepicker table tr td span.old,
+.datepicker table tr td span.new {
+ color: #777777;
+}
+.datepicker .datepicker-switch {
+ width: 145px;
+}
+.datepicker .datepicker-switch,
+.datepicker .prev,
+.datepicker .next,
+.datepicker tfoot tr th {
+ cursor: pointer;
+}
+.datepicker .datepicker-switch:hover,
+.datepicker .prev:hover,
+.datepicker .next:hover,
+.datepicker tfoot tr th:hover {
+ background: #eeeeee;
+}
+.datepicker .cw {
+ font-size: 10px;
+ width: 12px;
+ padding: 0 2px 0 5px;
+ vertical-align: middle;
+}
+.input-group.date .input-group-addon {
+ cursor: pointer;
+}
+.input-daterange {
+ width: 100%;
+}
+.input-daterange input {
+ text-align: center;
+}
+.input-daterange input:first-child {
+ border-radius: 3px 0 0 3px;
+}
+.input-daterange input:last-child {
+ border-radius: 0 3px 3px 0;
+}
+.input-daterange .input-group-addon {
+ width: auto;
+ min-width: 16px;
+ padding: 4px 5px;
+ line-height: 1.42857143;
+ text-shadow: 0 1px 0 #fff;
+ border-width: 1px 0;
+ margin-left: -5px;
+ margin-right: -5px;
+}
+.datepicker.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 160px;
+ list-style: none;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 4px;
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+ -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+ color: #333333;
+ font-size: 13px;
+ line-height: 1.42857143;
+}
+.datepicker.dropdown-menu th,
+.datepicker.datepicker-inline th,
+.datepicker.dropdown-menu td,
+.datepicker.datepicker-inline td {
+ padding: 0px 5px;
+}
+/*# sourceMappingURL=bootstrap-datepicker3.standalone.css.map */ \ No newline at end of file
diff --git a/ihatemoney/static/css/bootstrap.min.css b/ihatemoney/static/css/bootstrap.min.css
new file mode 100644
index 0000000..a8da074
--- /dev/null
+++ b/ihatemoney/static/css/bootstrap.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors
+ * Copyright 2011-2017 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}@media print{*,::after,::before,blockquote::first-letter,blockquote::first-line,div::first-letter,div::first-line,li::first-letter,li::first-line,p::first-letter,p::first-line{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}html{-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{cursor:help}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse;background-color:transparent}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,select,textarea{line-height:inherit}input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type=search]{-webkit-appearance:none}output{display:inline-block}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;color:#636c72}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#636c72}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f7f7f9;border-radius:.25rem}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#292b2c;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#292b2c}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{position:relative;margin-left:auto;margin-right:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container{padding-right:15px;padding-left:15px}}@media (min-width:576px){.container{width:540px;max-width:100%}}@media (min-width:768px){.container{width:720px;max-width:100%}}@media (min-width:992px){.container{width:960px;max-width:100%}}@media (min-width:1200px){.container{width:1140px;max-width:100%}}.container-fluid{position:relative;margin-left:auto;margin-right:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container-fluid{padding-right:15px;padding-left:15px}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}@media (min-width:576px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:768px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:992px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:1200px){.row{margin-right:-15px;margin-left:-15px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:576px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}@media (min-width:992px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}.col{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-0{right:auto}.pull-1{right:8.333333%}.pull-2{right:16.666667%}.pull-3{right:25%}.pull-4{right:33.333333%}.pull-5{right:41.666667%}.pull-6{right:50%}.pull-7{right:58.333333%}.pull-8{right:66.666667%}.pull-9{right:75%}.pull-10{right:83.333333%}.pull-11{right:91.666667%}.pull-12{right:100%}.push-0{left:auto}.push-1{left:8.333333%}.push-2{left:16.666667%}.push-3{left:25%}.push-4{left:33.333333%}.push-5{left:41.666667%}.push-6{left:50%}.push-7{left:58.333333%}.push-8{left:66.666667%}.push-9{left:75%}.push-10{left:83.333333%}.push-11{left:91.666667%}.push-12{left:100%}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-sm-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-md-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-lg-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-xl-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #eceeef}.table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody{border-top:2px solid #eceeef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered td,.table-bordered th{border:1px solid #eceeef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table-success,.table-success>td,.table-success>th{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>td,.table-info>th{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>td,.table-warning>th{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>td,.table-danger>th{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.thead-inverse th{color:#fff;background-color:#292b2c}.thead-default th{color:#464a4c;background-color:#eceeef}.table-inverse{color:#fff;background-color:#292b2c}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#fff}.table-inverse.table-bordered{border:0}.table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#464a4c;background-color:#fff;background-image:none;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#464a4c;background-color:#fff;border-color:#5cb3fd;outline:0}.form-control::-webkit-input-placeholder{color:#636c72;opacity:1}.form-control::-moz-placeholder{color:#636c72;opacity:1}.form-control:-ms-input-placeholder{color:#636c72;opacity:1}.form-control::placeholder{color:#636c72;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eceeef;opacity:1}.form-control:disabled{cursor:not-allowed}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#464a4c;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);margin-bottom:0}.col-form-label-lg{padding-top:calc(.75rem - 1px * 2);padding-bottom:calc(.75rem - 1px * 2);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem - 1px * 2);padding-bottom:calc(.25rem - 1px * 2);font-size:.875rem}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1rem}.form-control-static{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;border:solid transparent;border-width:1px 0}.form-control-static.form-control-lg,.form-control-static.form-control-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:1.8125rem}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:3.166667rem}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-check{position:relative;display:block;margin-bottom:.5rem}.form-check.disabled .form-check-label{color:#636c72;cursor:not-allowed}.form-check-label{padding-left:1.25rem;margin-bottom:0;cursor:pointer}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-input:only-child{position:static}.form-check-inline{display:inline-block}.form-check-inline .form-check-label{vertical-align:middle}.form-check-inline+.form-check-inline{margin-left:.75rem}.form-control-feedback{margin-top:.25rem}.form-control-danger,.form-control-success,.form-control-warning{padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .5625rem;-webkit-background-size:1.125rem 1.125rem;background-size:1.125rem 1.125rem}.has-success .col-form-label,.has-success .custom-control,.has-success .form-check-label,.has-success .form-control-feedback,.has-success .form-control-label{color:#5cb85c}.has-success .form-control{border-color:#5cb85c}.has-success .input-group-addon{color:#5cb85c;border-color:#5cb85c;background-color:#eaf6ea}.has-success .form-control-success{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E")}.has-warning .col-form-label,.has-warning .custom-control,.has-warning .form-check-label,.has-warning .form-control-feedback,.has-warning .form-control-label{color:#f0ad4e}.has-warning .form-control{border-color:#f0ad4e}.has-warning .input-group-addon{color:#f0ad4e;border-color:#f0ad4e;background-color:#fff}.has-warning .form-control-warning{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E")}.has-danger .col-form-label,.has-danger .custom-control,.has-danger .form-check-label,.has-danger .form-control-feedback,.has-danger .form-control-label{color:#d9534f}.has-danger .form-control{border-color:#d9534f}.has-danger .input-group-addon{color:#d9534f;border-color:#d9534f;background-color:#fdf7f7}.has-danger .form-control-danger{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E")}.form-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .form-check{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.25);box-shadow:0 0 0 2px rgba(2,117,216,.25)}.btn.disabled,.btn:disabled{cursor:not-allowed;opacity:.65}.btn.active,.btn:active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#0275d8;border-color:#0275d8}.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#025aa5;background-image:none;border-color:#01549b}.btn-secondary{color:#292b2c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{color:#292b2c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#fff;border-color:#ccc}.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#292b2c;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#5bc0de;border-color:#5bc0de}.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;background-image:none;border-color:#2aabd2}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#5cb85c;border-color:#5cb85c}.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;background-image:none;border-color:#419641}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;background-image:none;border-color:#eb9316}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#d9534f;border-color:#d9534f}.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;background-image:none;border-color:#c12e2a}.btn-outline-primary{color:#0275d8;background-image:none;background-color:transparent;border-color:#0275d8}.btn-outline-primary:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0275d8;background-color:transparent}.btn-outline-primary.active,.btn-outline-primary:active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-secondary{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.btn-outline-secondary:hover{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#ccc;background-color:transparent}.btn-outline-secondary.active,.btn-outline-secondary:active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-info{color:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#5bc0de;background-color:transparent}.btn-outline-info.active,.btn-outline-info:active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-success{color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.btn-outline-success:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#5cb85c;background-color:transparent}.btn-outline-success.active,.btn-outline-success:active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-warning{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f0ad4e;background-color:transparent}.btn-outline-warning.active,.btn-outline-warning:active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-danger{color:#d9534f;background-image:none;background-color:transparent;border-color:#d9534f}.btn-outline-danger:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#d9534f;background-color:transparent}.btn-outline-danger.active,.btn-outline-danger:active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-link{font-weight:400;color:#0275d8;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.btn-link:disabled{color:#636c72}.btn-link:disabled:focus,.btn-link:disabled:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.3em;vertical-align:middle;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:focus{outline:0}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#292b2c;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:1px;margin:.5rem 0;overflow:hidden;background-color:#eceeef}.dropdown-item{display:block;width:100%;padding:3px 1.5rem;clear:both;font-weight:400;color:#292b2c;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1d1e1f;text-decoration:none;background-color:#f7f7f9}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0275d8}.dropdown-item.disabled,.dropdown-item:disabled{color:#636c72;cursor:not-allowed;background-color:transparent}.show>.dropdown-menu{display:block}.show>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#636c72;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.dropup .dropdown-menu{top:auto;bottom:100%;margin-bottom:.125rem}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.btn-group-vertical{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.input-group .form-control{position:relative;z-index:2;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#464a4c;text-align:center;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative;-webkit-box-flex:1;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem;cursor:pointer}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#0275d8}.custom-control-input:focus~.custom-control-indicator{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 3px #0275d8;box-shadow:0 0 0 1px #fff,0 0 0 3px #0275d8}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#8fcafe}.custom-control-input:disabled~.custom-control-indicator{cursor:not-allowed;background-color:#eceeef}.custom-control-input:disabled~.custom-control-description{color:#636c72;cursor:not-allowed}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;-webkit-background-size:50% 50%;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#0275d8;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.25;color:#464a4c;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-moz-appearance:none;-webkit-appearance:none}.custom-select:focus{border-color:#5cb3fd;outline:0}.custom-select:focus::-ms-value{color:#464a4c;background-color:#fff}.custom-select:disabled{color:#636c72;cursor:not-allowed;background-color:#eceeef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;margin-bottom:0;cursor:pointer}.custom-file-input{min-width:14rem;max-width:100%;height:2.5rem;margin:0;filter:alpha(opacity=0);opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#464a4c;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.custom-file-control:lang(en)::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#464a4c;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5em 1em}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#636c72;cursor:not-allowed}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-right-radius:.25rem;border-top-left-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#eceeef #eceeef #ddd}.nav-tabs .nav-link.disabled{color:#636c72;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#464a4c;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-item.show .nav-link,.nav-pills .nav-link.active{color:#fff;cursor:default;background-color:#0275d8}.nav-fill .nav-item{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-webkit-box-flex:1;-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:.5rem 1rem}.navbar-brand{display:inline-block;padding-top:.25rem;padding-bottom:.25rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-text{display:inline-block;padding-top:.425rem;padding-bottom:.425rem}.navbar-toggler{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;padding:.25rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;-webkit-background-size:100% 100%;background-size:100% 100%}.navbar-toggler-left{position:absolute;left:1rem}.navbar-toggler-right{position:absolute;right:1rem}@media (max-width:575px){.navbar-toggleable .navbar-nav .dropdown-menu{position:static;float:none}.navbar-toggleable>.container{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-toggleable{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-toggleable .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-toggleable>.container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;width:100%}.navbar-toggleable .navbar-toggler{display:none}}@media (max-width:767px){.navbar-toggleable-sm .navbar-nav .dropdown-menu{position:static;float:none}.navbar-toggleable-sm>.container{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-toggleable-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-toggleable-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-toggleable-sm>.container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-sm .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;width:100%}.navbar-toggleable-sm .navbar-toggler{display:none}}@media (max-width:991px){.navbar-toggleable-md .navbar-nav .dropdown-menu{position:static;float:none}.navbar-toggleable-md>.container{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-toggleable-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-toggleable-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-toggleable-md>.container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-md .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;width:100%}.navbar-toggleable-md .navbar-toggler{display:none}}@media (max-width:1199px){.navbar-toggleable-lg .navbar-nav .dropdown-menu{position:static;float:none}.navbar-toggleable-lg>.container{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-toggleable-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-toggleable-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-toggleable-lg>.container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-lg .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;width:100%}.navbar-toggleable-lg .navbar-toggler{display:none}}.navbar-toggleable-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-xl .navbar-nav .dropdown-menu{position:static;float:none}.navbar-toggleable-xl>.container{padding-right:0;padding-left:0}.navbar-toggleable-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-toggleable-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-toggleable-xl>.container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-toggleable-xl .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;width:100%}.navbar-toggleable-xl .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-toggler{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover,.navbar-light .navbar-toggler:focus,.navbar-light .navbar-toggler:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.open,.navbar-light .navbar-nav .open>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-toggler{color:#fff}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-toggler:focus,.navbar-inverse .navbar-toggler:hover{color:#fff}.navbar-inverse .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-inverse .navbar-nav .nav-link:focus,.navbar-inverse .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-inverse .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-inverse .navbar-nav .active>.nav-link,.navbar-inverse .navbar-nav .nav-link.active,.navbar-inverse .navbar-nav .nav-link.open,.navbar-inverse .navbar-nav .open>.nav-link{color:#fff}.navbar-inverse .navbar-toggler{border-color:rgba(255,255,255,.1)}.navbar-inverse .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E")}.navbar-inverse .navbar-text{color:rgba(255,255,255,.5)}.card{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card-block{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f7f7f9;border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:#f7f7f9;border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-primary{background-color:#0275d8;border-color:#0275d8}.card-primary .card-footer,.card-primary .card-header{background-color:transparent}.card-success{background-color:#5cb85c;border-color:#5cb85c}.card-success .card-footer,.card-success .card-header{background-color:transparent}.card-info{background-color:#5bc0de;border-color:#5bc0de}.card-info .card-footer,.card-info .card-header{background-color:transparent}.card-warning{background-color:#f0ad4e;border-color:#f0ad4e}.card-warning .card-footer,.card-warning .card-header{background-color:transparent}.card-danger{background-color:#d9534f;border-color:#d9534f}.card-danger .card-footer,.card-danger .card-header{background-color:transparent}.card-outline-primary{background-color:transparent;border-color:#0275d8}.card-outline-secondary{background-color:transparent;border-color:#ccc}.card-outline-info{background-color:transparent;border-color:#5bc0de}.card-outline-success{background-color:transparent;border-color:#5cb85c}.card-outline-warning{background-color:transparent;border-color:#f0ad4e}.card-outline-danger{background-color:transparent;border-color:#d9534f}.card-inverse{color:rgba(255,255,255,.65)}.card-inverse .card-footer,.card-inverse .card-header{background-color:transparent;border-color:rgba(255,255,255,.2)}.card-inverse .card-blockquote,.card-inverse .card-footer,.card-inverse .card-header,.card-inverse .card-title{color:#fff}.card-inverse .card-blockquote .blockquote-footer,.card-inverse .card-link,.card-inverse .card-subtitle,.card-inverse .card-text{color:rgba(255,255,255,.65)}.card-inverse .card-link:focus,.card-inverse .card-link:hover{color:#fff}.card-blockquote{padding:0;margin-bottom:0;border-left:0}.card-img{border-radius:calc(.25rem - 1px)}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img-top{border-top-right-radius:calc(.25rem - 1px);border-top-left-radius:calc(.25rem - 1px)}.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}@media (min-width:576px){.card-deck{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-deck .card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.card-deck .card:not(:first-child){margin-left:15px}.card-deck .card:not(:last-child){margin-right:15px}}@media (min-width:576px){.card-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-webkit-box-flex:1;-webkit-flex:1 0 0%;-ms-flex:1 0 0%;flex:1 0 0%}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%;margin-bottom:.75rem}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eceeef;border-radius:.25rem}.breadcrumb::after{display:block;content:"";clear:both}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#636c72;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#636c72}.pagination{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-item:first-child .page-link{margin-left:0;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.page-item.disabled .page-link{color:#636c72;pointer-events:none;cursor:not-allowed;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#0275d8;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#014c8c;text-decoration:none;background-color:#eceeef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-default{background-color:#636c72}.badge-default[href]:focus,.badge-default[href]:hover{background-color:#4b5257}.badge-primary{background-color:#0275d8}.badge-primary[href]:focus,.badge-primary[href]:hover{background-color:#025aa5}.badge-success{background-color:#5cb85c}.badge-success[href]:focus,.badge-success[href]:hover{background-color:#449d44}.badge-info{background-color:#5bc0de}.badge-info[href]:focus,.badge-info[href]:hover{background-color:#31b0d5}.badge-warning{background-color:#f0ad4e}.badge-warning[href]:focus,.badge-warning[href]:hover{background-color:#ec971f}.badge-danger{background-color:#d9534f}.badge-danger[href]:focus,.badge-danger[href]:hover{background-color:#c9302c}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eceeef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-hr{border-top-color:#d0d5d8}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:relative;top:-.75rem;right:-1.25rem;padding:.75rem 1.25rem;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d0e9c6;color:#3c763d}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bcdff1;color:#31708f}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faf2cc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebcccc;color:#a94442}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;font-size:.75rem;line-height:1rem;text-align:center;background-color:#eceeef;border-radius:.25rem}.progress-bar{height:1rem;color:#fff;background-color:#0275d8}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;-o-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%}.list-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#464a4c;text-align:inherit}.list-group-item-action .list-group-item-heading{color:#292b2c}.list-group-item-action:focus,.list-group-item-action:hover{color:#464a4c;text-decoration:none;background-color:#f7f7f9}.list-group-item-action:active{color:#292b2c;background-color:#eceeef}.list-group-item{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#636c72;cursor:not-allowed;background-color:#fff}.list-group-item.disabled .list-group-item-heading,.list-group-item:disabled .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item:disabled .list-group-item-text{color:#636c72}.list-group-item.active{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text{color:#daeeff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active{color:#fff;background-color:#a94442;border-color:#a94442}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.75}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out;-webkit-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.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.show{opacity:.5}.modal-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #eceeef}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #eceeef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip.bs-tether-element-attached-bottom,.tooltip.tooltip-top{padding:5px 0;margin-top:-3px}.tooltip.bs-tether-element-attached-bottom .tooltip-inner::before,.tooltip.tooltip-top .tooltip-inner::before{bottom:0;left:50%;margin-left:-5px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tether-element-attached-left,.tooltip.tooltip-right{padding:0 5px;margin-left:3px}.tooltip.bs-tether-element-attached-left .tooltip-inner::before,.tooltip.tooltip-right .tooltip-inner::before{top:50%;left:0;margin-top:-5px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tether-element-attached-top,.tooltip.tooltip-bottom{padding:5px 0;margin-top:3px}.tooltip.bs-tether-element-attached-top .tooltip-inner::before,.tooltip.tooltip-bottom .tooltip-inner::before{top:0;left:50%;margin-left:-5px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tether-element-attached-right,.tooltip.tooltip-left{padding:0 5px;margin-left:-3px}.tooltip.bs-tether-element-attached-right .tooltip-inner::before,.tooltip.tooltip-left .tooltip-inner::before{top:50%;right:0;margin-top:-5px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.tooltip-inner::before{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;font-size:.875rem;word-wrap:break-word;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.bs-tether-element-attached-bottom,.popover.popover-top{margin-top:-10px}.popover.bs-tether-element-attached-bottom::after,.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::after,.popover.popover-top::before{left:50%;border-bottom-width:0}.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::before{bottom:-11px;margin-left:-11px;border-top-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-bottom::after,.popover.popover-top::after{bottom:-10px;margin-left:-10px;border-top-color:#fff}.popover.bs-tether-element-attached-left,.popover.popover-right{margin-left:10px}.popover.bs-tether-element-attached-left::after,.popover.bs-tether-element-attached-left::before,.popover.popover-right::after,.popover.popover-right::before{top:50%;border-left-width:0}.popover.bs-tether-element-attached-left::before,.popover.popover-right::before{left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-left::after,.popover.popover-right::after{left:-10px;margin-top:-10px;border-right-color:#fff}.popover.bs-tether-element-attached-top,.popover.popover-bottom{margin-top:10px}.popover.bs-tether-element-attached-top::after,.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::after,.popover.popover-bottom::before{left:50%;border-top-width:0}.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::before{top:-11px;margin-left:-11px;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-top::after,.popover.popover-bottom::after{top:-10px;margin-left:-10px;border-bottom-color:#f7f7f7}.popover.bs-tether-element-attached-top .popover-title::before,.popover.popover-bottom .popover-title::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-tether-element-attached-right,.popover.popover-left{margin-left:-10px}.popover.bs-tether-element-attached-right::after,.popover.bs-tether-element-attached-right::before,.popover.popover-left::after,.popover.popover-left::before{top:50%;border-right-width:0}.popover.bs-tether-element-attached-right::before,.popover.popover-left::before{right:-11px;margin-top:-11px;border-left-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-right::after,.popover.popover-left::after{right:-10px;margin-top:-10px;border-left-color:#fff}.popover-title{padding:8px 14px;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-right-radius:calc(.3rem - 1px);border-top-left-radius:calc(.3rem - 1px)}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover::after,.popover::before{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover::before{content:"";border-width:11px}.popover::after{content:"";border-width:10px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;width:100%}@media (-webkit-transform-3d){.carousel-item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}}@supports ((-webkit-transform:translate3d(0,0,0)) or (transform:translate3d(0,0,0))){.carousel-item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}@media (-webkit-transform-3d){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@supports ((-webkit-transform:translate3d(0,0,0)) or (transform:translate3d(0,0,0))){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;-webkit-background-size:100% 100%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;max-width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-faded{background-color:#f7f7f7}.bg-primary{background-color:#0275d8!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#025aa5!important}.bg-success{background-color:#5cb85c!important}a.bg-success:focus,a.bg-success:hover{background-color:#449d44!important}.bg-info{background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{background-color:#31b0d5!important}.bg-warning{background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f!important}.bg-danger{background-color:#d9534f!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#c9302c!important}.bg-inverse{background-color:#292b2c!important}a.bg-inverse:focus,a.bg-inverse:hover{background-color:#101112!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.rounded{border-radius:.25rem}.rounded-top{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.rounded-right{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.rounded-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-left{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.rounded-circle{border-radius:50%}.rounded-0{border-radius:0}.clearfix::after{display:block;content:"";clear:both}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.flex-unordered{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-sm-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.flex-sm-unordered{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-md-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.flex-md-unordered{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-lg-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.flex-lg-unordered{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-xl-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.flex-xl-unordered{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1030}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0 0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem .25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem .5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:1rem 1rem!important}.mt-3{margin-top:1rem!important}.mr-3{margin-right:1rem!important}.mb-3{margin-bottom:1rem!important}.ml-3{margin-left:1rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-4{margin:1.5rem 1.5rem!important}.mt-4{margin-top:1.5rem!important}.mr-4{margin-right:1.5rem!important}.mb-4{margin-bottom:1.5rem!important}.ml-4{margin-left:1.5rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-5{margin:3rem 3rem!important}.mt-5{margin-top:3rem!important}.mr-5{margin-right:3rem!important}.mb-5{margin-bottom:3rem!important}.ml-5{margin-left:3rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0 0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem .25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem .5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:1rem 1rem!important}.pt-3{padding-top:1rem!important}.pr-3{padding-right:1rem!important}.pb-3{padding-bottom:1rem!important}.pl-3{padding-left:1rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-4{padding:1.5rem 1.5rem!important}.pt-4{padding-top:1.5rem!important}.pr-4{padding-right:1.5rem!important}.pb-4{padding-bottom:1.5rem!important}.pl-4{padding-left:1.5rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-5{padding:3rem 3rem!important}.pt-5{padding-top:3rem!important}.pr-5{padding-right:3rem!important}.pb-5{padding-bottom:3rem!important}.pl-5{padding-left:3rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}@media (min-width:576px){.m-sm-0{margin:0 0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.m-sm-1{margin:.25rem .25rem!important}.mt-sm-1{margin-top:.25rem!important}.mr-sm-1{margin-right:.25rem!important}.mb-sm-1{margin-bottom:.25rem!important}.ml-sm-1{margin-left:.25rem!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-sm-2{margin:.5rem .5rem!important}.mt-sm-2{margin-top:.5rem!important}.mr-sm-2{margin-right:.5rem!important}.mb-sm-2{margin-bottom:.5rem!important}.ml-sm-2{margin-left:.5rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-sm-3{margin:1rem 1rem!important}.mt-sm-3{margin-top:1rem!important}.mr-sm-3{margin-right:1rem!important}.mb-sm-3{margin-bottom:1rem!important}.ml-sm-3{margin-left:1rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-sm-4{margin:1.5rem 1.5rem!important}.mt-sm-4{margin-top:1.5rem!important}.mr-sm-4{margin-right:1.5rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.ml-sm-4{margin-left:1.5rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-sm-5{margin:3rem 3rem!important}.mt-sm-5{margin-top:3rem!important}.mr-sm-5{margin-right:3rem!important}.mb-sm-5{margin-bottom:3rem!important}.ml-sm-5{margin-left:3rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-sm-0{padding:0 0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.p-sm-1{padding:.25rem .25rem!important}.pt-sm-1{padding-top:.25rem!important}.pr-sm-1{padding-right:.25rem!important}.pb-sm-1{padding-bottom:.25rem!important}.pl-sm-1{padding-left:.25rem!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-sm-2{padding:.5rem .5rem!important}.pt-sm-2{padding-top:.5rem!important}.pr-sm-2{padding-right:.5rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pl-sm-2{padding-left:.5rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-sm-3{padding:1rem 1rem!important}.pt-sm-3{padding-top:1rem!important}.pr-sm-3{padding-right:1rem!important}.pb-sm-3{padding-bottom:1rem!important}.pl-sm-3{padding-left:1rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-sm-4{padding:1.5rem 1.5rem!important}.pt-sm-4{padding-top:1.5rem!important}.pr-sm-4{padding-right:1.5rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pl-sm-4{padding-left:1.5rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-sm-5{padding:3rem 3rem!important}.pt-sm-5{padding-top:3rem!important}.pr-sm-5{padding-right:3rem!important}.pb-sm-5{padding-bottom:3rem!important}.pl-sm-5{padding-left:3rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto{margin-top:auto!important}.mr-sm-auto{margin-right:auto!important}.mb-sm-auto{margin-bottom:auto!important}.ml-sm-auto{margin-left:auto!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:768px){.m-md-0{margin:0 0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.m-md-1{margin:.25rem .25rem!important}.mt-md-1{margin-top:.25rem!important}.mr-md-1{margin-right:.25rem!important}.mb-md-1{margin-bottom:.25rem!important}.ml-md-1{margin-left:.25rem!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-md-2{margin:.5rem .5rem!important}.mt-md-2{margin-top:.5rem!important}.mr-md-2{margin-right:.5rem!important}.mb-md-2{margin-bottom:.5rem!important}.ml-md-2{margin-left:.5rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-md-3{margin:1rem 1rem!important}.mt-md-3{margin-top:1rem!important}.mr-md-3{margin-right:1rem!important}.mb-md-3{margin-bottom:1rem!important}.ml-md-3{margin-left:1rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-md-4{margin:1.5rem 1.5rem!important}.mt-md-4{margin-top:1.5rem!important}.mr-md-4{margin-right:1.5rem!important}.mb-md-4{margin-bottom:1.5rem!important}.ml-md-4{margin-left:1.5rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-md-5{margin:3rem 3rem!important}.mt-md-5{margin-top:3rem!important}.mr-md-5{margin-right:3rem!important}.mb-md-5{margin-bottom:3rem!important}.ml-md-5{margin-left:3rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-md-0{padding:0 0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.p-md-1{padding:.25rem .25rem!important}.pt-md-1{padding-top:.25rem!important}.pr-md-1{padding-right:.25rem!important}.pb-md-1{padding-bottom:.25rem!important}.pl-md-1{padding-left:.25rem!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-md-2{padding:.5rem .5rem!important}.pt-md-2{padding-top:.5rem!important}.pr-md-2{padding-right:.5rem!important}.pb-md-2{padding-bottom:.5rem!important}.pl-md-2{padding-left:.5rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-md-3{padding:1rem 1rem!important}.pt-md-3{padding-top:1rem!important}.pr-md-3{padding-right:1rem!important}.pb-md-3{padding-bottom:1rem!important}.pl-md-3{padding-left:1rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-md-4{padding:1.5rem 1.5rem!important}.pt-md-4{padding-top:1.5rem!important}.pr-md-4{padding-right:1.5rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pl-md-4{padding-left:1.5rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-md-5{padding:3rem 3rem!important}.pt-md-5{padding-top:3rem!important}.pr-md-5{padding-right:3rem!important}.pb-md-5{padding-bottom:3rem!important}.pl-md-5{padding-left:3rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto{margin-top:auto!important}.mr-md-auto{margin-right:auto!important}.mb-md-auto{margin-bottom:auto!important}.ml-md-auto{margin-left:auto!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:992px){.m-lg-0{margin:0 0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.m-lg-1{margin:.25rem .25rem!important}.mt-lg-1{margin-top:.25rem!important}.mr-lg-1{margin-right:.25rem!important}.mb-lg-1{margin-bottom:.25rem!important}.ml-lg-1{margin-left:.25rem!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-lg-2{margin:.5rem .5rem!important}.mt-lg-2{margin-top:.5rem!important}.mr-lg-2{margin-right:.5rem!important}.mb-lg-2{margin-bottom:.5rem!important}.ml-lg-2{margin-left:.5rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-lg-3{margin:1rem 1rem!important}.mt-lg-3{margin-top:1rem!important}.mr-lg-3{margin-right:1rem!important}.mb-lg-3{margin-bottom:1rem!important}.ml-lg-3{margin-left:1rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-lg-4{margin:1.5rem 1.5rem!important}.mt-lg-4{margin-top:1.5rem!important}.mr-lg-4{margin-right:1.5rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.ml-lg-4{margin-left:1.5rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-lg-5{margin:3rem 3rem!important}.mt-lg-5{margin-top:3rem!important}.mr-lg-5{margin-right:3rem!important}.mb-lg-5{margin-bottom:3rem!important}.ml-lg-5{margin-left:3rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-lg-0{padding:0 0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.p-lg-1{padding:.25rem .25rem!important}.pt-lg-1{padding-top:.25rem!important}.pr-lg-1{padding-right:.25rem!important}.pb-lg-1{padding-bottom:.25rem!important}.pl-lg-1{padding-left:.25rem!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-lg-2{padding:.5rem .5rem!important}.pt-lg-2{padding-top:.5rem!important}.pr-lg-2{padding-right:.5rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pl-lg-2{padding-left:.5rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-lg-3{padding:1rem 1rem!important}.pt-lg-3{padding-top:1rem!important}.pr-lg-3{padding-right:1rem!important}.pb-lg-3{padding-bottom:1rem!important}.pl-lg-3{padding-left:1rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-lg-4{padding:1.5rem 1.5rem!important}.pt-lg-4{padding-top:1.5rem!important}.pr-lg-4{padding-right:1.5rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pl-lg-4{padding-left:1.5rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-lg-5{padding:3rem 3rem!important}.pt-lg-5{padding-top:3rem!important}.pr-lg-5{padding-right:3rem!important}.pb-lg-5{padding-bottom:3rem!important}.pl-lg-5{padding-left:3rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto{margin-top:auto!important}.mr-lg-auto{margin-right:auto!important}.mb-lg-auto{margin-bottom:auto!important}.ml-lg-auto{margin-left:auto!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0 0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.m-xl-1{margin:.25rem .25rem!important}.mt-xl-1{margin-top:.25rem!important}.mr-xl-1{margin-right:.25rem!important}.mb-xl-1{margin-bottom:.25rem!important}.ml-xl-1{margin-left:.25rem!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-xl-2{margin:.5rem .5rem!important}.mt-xl-2{margin-top:.5rem!important}.mr-xl-2{margin-right:.5rem!important}.mb-xl-2{margin-bottom:.5rem!important}.ml-xl-2{margin-left:.5rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-xl-3{margin:1rem 1rem!important}.mt-xl-3{margin-top:1rem!important}.mr-xl-3{margin-right:1rem!important}.mb-xl-3{margin-bottom:1rem!important}.ml-xl-3{margin-left:1rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-xl-4{margin:1.5rem 1.5rem!important}.mt-xl-4{margin-top:1.5rem!important}.mr-xl-4{margin-right:1.5rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.ml-xl-4{margin-left:1.5rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-xl-5{margin:3rem 3rem!important}.mt-xl-5{margin-top:3rem!important}.mr-xl-5{margin-right:3rem!important}.mb-xl-5{margin-bottom:3rem!important}.ml-xl-5{margin-left:3rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-xl-0{padding:0 0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.p-xl-1{padding:.25rem .25rem!important}.pt-xl-1{padding-top:.25rem!important}.pr-xl-1{padding-right:.25rem!important}.pb-xl-1{padding-bottom:.25rem!important}.pl-xl-1{padding-left:.25rem!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-xl-2{padding:.5rem .5rem!important}.pt-xl-2{padding-top:.5rem!important}.pr-xl-2{padding-right:.5rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pl-xl-2{padding-left:.5rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-xl-3{padding:1rem 1rem!important}.pt-xl-3{padding-top:1rem!important}.pr-xl-3{padding-right:1rem!important}.pb-xl-3{padding-bottom:1rem!important}.pl-xl-3{padding-left:1rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-xl-4{padding:1.5rem 1.5rem!important}.pt-xl-4{padding-top:1.5rem!important}.pr-xl-4{padding-right:1.5rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pl-xl-4{padding-left:1.5rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-xl-5{padding:3rem 3rem!important}.pt-xl-5{padding-top:3rem!important}.pr-xl-5{padding-right:3rem!important}.pb-xl-5{padding-bottom:3rem!important}.pl-xl-5{padding-left:3rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto{margin-top:auto!important}.mr-xl-auto{margin-right:auto!important}.mb-xl-auto{margin-bottom:auto!important}.ml-xl-auto{margin-left:auto!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-white{color:#fff!important}.text-muted{color:#636c72!important}a.text-muted:focus,a.text-muted:hover{color:#4b5257!important}.text-primary{color:#0275d8!important}a.text-primary:focus,a.text-primary:hover{color:#025aa5!important}.text-success{color:#5cb85c!important}a.text-success:focus,a.text-success:hover{color:#449d44!important}.text-info{color:#5bc0de!important}a.text-info:focus,a.text-info:hover{color:#31b0d5!important}.text-warning{color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{color:#ec971f!important}.text-danger{color:#d9534f!important}a.text-danger:focus,a.text-danger:hover{color:#c9302c!important}.text-gray-dark{color:#292b2c!important}a.text-gray-dark:focus,a.text-gray-dark:hover{color:#101112!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.invisible{visibility:hidden!important}.hidden-xs-up{display:none!important}@media (max-width:575px){.hidden-xs-down{display:none!important}}@media (min-width:576px){.hidden-sm-up{display:none!important}}@media (max-width:767px){.hidden-sm-down{display:none!important}}@media (min-width:768px){.hidden-md-up{display:none!important}}@media (max-width:991px){.hidden-md-down{display:none!important}}@media (min-width:992px){.hidden-lg-up{display:none!important}}@media (max-width:1199px){.hidden-lg-down{display:none!important}}@media (min-width:1200px){.hidden-xl-up{display:none!important}}.hidden-xl-down{display:none!important}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
diff --git a/ihatemoney/static/css/main.css b/ihatemoney/static/css/main.css
new file mode 100644
index 0000000..54a0008
--- /dev/null
+++ b/ihatemoney/static/css/main.css
@@ -0,0 +1,254 @@
+@import "bootstrap.min.css";
+@import "bootstrap-datepicker3.standalone.css";
+@import "../fonts/fontfaces.css";
+
+/* General */
+
+body {
+ /* For fixed navbar */
+ padding-top: 3.5rem;
+ padding-bottom: 2rem;
+}
+
+/* Navbar */
+
+.navbar h1 {
+ font-size: 1rem;
+ margin: 0;
+ padding: 0;
+}
+.navbar .primary-nav { padding-left: 75px; }
+.navbar .secondary-nav {
+ text-align: right;
+ flex-direction: row-reverse;
+
+}
+.navbar-brand{ font-family: 'Lobster', arial, serif; }
+
+/* Header */
+
+#header {
+ padding-bottom: 2em;
+ margin-bottom: 1em;
+ background-color: #ABE128;
+ background-image: url("../images/gradient.png");
+ background-position: center top;
+ background-repeat: no-repeat;
+}
+
+#header h2 {
+ font-family: 'Comfortaa', arial, serif;
+ margin-top: 1em;
+ margin-bottom: 0.5em;
+ color: #000;
+ font-size: 2.4em;
+}
+
+#header .tryout {
+ margin-right: 10em;
+ color: #fff;
+ background-color: #414141;
+ border-color: #414141;
+}
+
+#header .tryout:hover {
+ background-color: #606060;
+ border-color: #606060;
+}
+
+#header .additional-content {
+ margin-top: 5em;
+ font-family: 'Comfortaa', arial, serif;
+ color: #000;
+}
+
+/* Sidebar */
+
+.balance tr td { font-weight: bold; }
+.positive { color: green; }
+.negative { color: red; }
+
+.sidebar {
+ background-color: #ABE128;
+ background-position: center bottom;
+ background-repeat: no-repeat;
+ height: 100%;
+ color: black;
+}
+
+@media (min-width: 768px) {
+ .sidebar {
+ position: fixed;
+ }
+}
+
+#add-member-form { padding-top: 1em; padding-bottom: 1em; }
+#add-member-form input[type="text"] { width: 60%; }
+
+#table_overflow { overflow-y: auto; overflow-x: hidden;}
+
+
+/* Content */
+
+.content {
+ margin-top: 1rem;
+}
+
+/* Home */
+
+#authentication-form legend {
+ text-align: right;
+}
+
+/* Other */
+
+#bills { color: black; }
+
+.invites textarea{
+ width: 800px;
+ height: 100px;
+}
+
+footer{
+ margin-left: -15px;
+ margin-right: -15px;
+ margin-top: 30px;
+ position: fixed;
+ bottom: 0px;
+ height: 20px;
+ width: 100%;
+ text-align: center;
+ background-color: #fff;
+ opacity: 0.8;
+}
+
+.identifier{
+ float: right;
+}
+
+#new-bill, .identifier {
+ margin-top: 16px;
+ margin-bottom: 16px;
+}
+
+/* Avoid text color flickering when it loose focus as the modal appears */
+.btn-primary[data-toggle="modal"] {
+ color: #fff;
+}
+
+.password-reminder{
+ float: right;
+ margin-right: 20px;
+ margin-top: 5px;
+}
+
+.confirm, .confirm:hover {
+ color: red;
+}
+
+.bill-actions {
+ padding-top: 10px;
+ text-align: center;
+}
+
+.bill-actions > .delete, .bill-actions > .edit {
+ font-size: 0px;
+ display: block;
+ width: 16px;
+ height: 16px;
+ margin: 2px;
+ margin-left: 5px;
+ float: left;
+}
+
+.bill-actions > .delete{
+ background: url('../images/delete.png') no-repeat right;
+}
+
+.bill-actions > .edit{
+ background: url('../images/edit.png') no-repeat right;
+}
+
+.balance .balance-value{
+ text-align:right;
+}
+
+#sidebar .balance tr:hover td {
+ background-color: #9BD118;
+}
+
+tr.ower_line {
+ background-color: #CBEF68;
+}
+
+tr.payer_line .balance-name{
+ color:green;
+ text-indent:5px;
+}
+
+.action {
+ margin: 0;
+ padding: 0;
+}
+
+.action button, .action button:hover {
+ border-width: 0;
+ width: auto;
+ margin: 0;
+ padding: 0 0 0 20px;
+}
+
+.delete button, .delete button:hover {
+ background: url('../images/deleter.png') left no-repeat;
+ color: red;
+}
+
+.edit button, .edit button:hover {
+ background: url('../images/edit.png') left no-repeat;
+
+}
+
+.reactivate button, .reactivate button:hover {
+ background: url('../images/reactivate.png') left no-repeat;
+ color: white;
+}
+
+.balance.table {
+ table-layout: fixed;
+}
+
+#bill-form > fieldset {
+ margin-top: 10px;
+}
+
+.flash {
+ position: absolute;
+}
+
+.light {
+ opacity: 0.3;
+}
+
+.extra-info {
+ display: none;
+}
+
+tr:hover .extra-info {
+ display: inline;
+}
+
+/* Fluid Offsets for Boostrap */
+
+.row-fluid > [class*="span"]:not([class*="offset"]):first-child{margin-left:0;}
+.row-fluid > .offset12{margin-left:100%;}
+.row-fluid > .offset11{margin-left:93.5%;}
+.row-fluid > .offset10{margin-left:85%;}
+.row-fluid > .offset9{margin-left:76.5%;}
+.row-fluid > .offset8{margin-left:68%;}
+.row-fluid > .offset7{margin-left:59.5%;}
+.row-fluid > .offset6{margin-left:51%;}
+.row-fluid > .offset5{margin-left:42.5%;}
+.row-fluid > .offset4{margin-left:34%;}
+.row-fluid > .offset3{margin-left:25.5%;}
+.row-fluid > .offset2{margin-left:17%;}
+.row-fluid > .offset1{margin-left:8.5%;}
diff --git a/ihatemoney/static/fonts/OFL.txt b/ihatemoney/static/fonts/OFL.txt
new file mode 100644
index 0000000..6e1e20d
--- /dev/null
+++ b/ihatemoney/static/fonts/OFL.txt
@@ -0,0 +1,95 @@
+Copyright (c) 2010, Pablo Impallari (www.impallari.com|impallari@gmail.com),
+Copyright (c) 2010, 2011, Alexei Vanyashin (www.cyreal.org|a@cyreal.org),
+with Reserved Font Name Lobster.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/ihatemoney/static/fonts/comfortaa-regular-webfont.eot b/ihatemoney/static/fonts/comfortaa-regular-webfont.eot
new file mode 100644
index 0000000..41f9d83
--- /dev/null
+++ b/ihatemoney/static/fonts/comfortaa-regular-webfont.eot
Binary files differ
diff --git a/ihatemoney/static/fonts/comfortaa-regular-webfont.svg b/ihatemoney/static/fonts/comfortaa-regular-webfont.svg
new file mode 100644
index 0000000..518873c
--- /dev/null
+++ b/ihatemoney/static/fonts/comfortaa-regular-webfont.svg
@@ -0,0 +1,253 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG webfont generated by Font Squirrel.
+Copyright : Copyright c 20072010 Johan Aakerlund aajohangmailcom with Reserved Font Name Comfortaa This Font Software is licensed under the SIL Open Font License Version 11 httpscriptssilorgOFL
+Designer : Johan Aakerlund aajohan
+Foundry : Johan Aakerlund
+</metadata>
+<defs>
+<font id="ComfortaaRegular" horiz-adv-x="1280" >
+<font-face units-per-em="2048" ascent="1638" descent="-410" />
+<missing-glyph horiz-adv-x="560" />
+<glyph unicode=" " horiz-adv-x="560" />
+<glyph unicode="&#x09;" horiz-adv-x="560" />
+<glyph unicode="&#xa0;" horiz-adv-x="560" />
+<glyph unicode="!" horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85zM120 399v1121q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1121q0 -32 -23 -55q-24 -24 -57 -24t-56 24q-24 23 -24 55z" />
+<glyph unicode="&#x22;" horiz-adv-x="560" d="M80 1512v8q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-8l-20 -292q0 -25 -17.5 -42.5t-42.5 -17.5t-42.5 17.5t-17.5 42.5zM320 1512v8q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-8l-20 -292q0 -25 -17.5 -42.5t-42.5 -17.5t-42.5 17.5t-17.5 42.5z" />
+<glyph unicode="#" d="M73 545q0 7 1 15q6 33 33.5 56.5t60.5 23.5h160l56 320h-160q-33 0 -52 23.5t-14 56.5q6 33 34 56.5t61 23.5h160l70 400q6 33 33.5 56.5t60.5 23.5t52.5 -23.5t13.5 -56.5l-70 -400h240l70 400q6 33 33.5 56.5t60.5 23.5t52.5 -23.5t13.5 -56.5l-70 -400h160 q33 0 52 -23q14 -18 14 -42q0 -7 -1 -15q-5 -33 -33 -56.5t-61 -23.5h-160l-56 -320h160q33 0 52.5 -23.5t13.5 -56.5t-33.5 -56.5t-60.5 -23.5h-160l-71 -400q-6 -33 -33.5 -56.5t-60.5 -23.5t-52.5 23.5t-13.5 56.5l71 400h-240l-71 -400q-6 -33 -33.5 -56.5t-60.5 -23.5 t-52.5 23.5t-13.5 56.5l71 400h-160q-33 0 -52 24q-15 17 -15 41zM488 640h240l56 320h-240z" />
+<glyph unicode="$" horiz-adv-x="1060" d="M80 267q0 33 23.5 56.5t56.5 23.5q43 0 68 -37q12 -19 28 -36q85 -102 224 -113v644q-134 26 -226 134q-107 126 -94 292q14 165 140 272q82 69 180 88v89q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-90q133 -26 224 -133q22 -26 39 -54q12 -19 12 -43 q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24q-9 8 -14 17q-10 16 -23 32q-44 51 -102 71v-484q132 -38 227 -149q113 -134 113 -304q0 -23 -2 -46q-16 -198 -167 -326q-79 -67 -171 -95v-100q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v81q-10 0 -20 1 q-198 16 -326 168q-21 23 -38 49q-16 21 -16 48zM320 1218q-8 -99 57 -175q43 -52 103 -72v454q-41 -14 -76 -44q-76 -65 -84 -163zM640 192q35 17 67 45q101 85 112 217q11 133 -74 234q-46 53 -105 81v-577z" />
+<glyph unicode="%" horiz-adv-x="1760" d="M80 1200q0 166 117 283t283 117t283 -117t117 -283t-117 -283t-283 -117t-283 117t-117 283zM240 80q0 31 20 54l1115 1433q28 33 65 33q33 0 56.5 -23.5t23.5 -56.5q0 -27 -16 -48l-1123 -1445q-28 -27 -61 -27t-56.5 23.5t-23.5 56.5zM240 1200q0 -99 70.5 -169.5 t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5t-70.5 -169.5zM880 400q0 166 117 283t283 117t283 -117t117 -283t-117 -283t-283 -117t-283 117t-117 283zM1040 400q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5 t-169.5 70.5t-169.5 -70.5t-70.5 -169.5z" />
+<glyph unicode="&#x26;" horiz-adv-x="1440" d="M80 460q0 182 189 331l106 83l-110 111q-105 106 -105 255t105.5 254.5t254.5 105.5t254.5 -105.5t105.5 -254.5q0 -159 -146 -285l-121 -92l354 -355l177 189q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -31 -20 -54l-180 -191l258 -261q22 -22 22 -54q0 -33 -23.5 -56.5 t-56.5 -23.5q-32 0 -56 22l-254 255l-139 -148q-129 -129 -311 -129t-311 129t-129 331zM240 460q0 -136 82 -218t198 -82t198 82l139 149l-372 373l-113 -86q-132 -102 -132 -218zM320 1240q0 -83 58 -141l124 -125l119 94q99 79 99 172q0 83 -58.5 141.5t-141.5 58.5 t-141.5 -58.5t-58.5 -141.5z" />
+<glyph unicode="'" horiz-adv-x="320" d="M80 1512v8q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-8l-20 -292q0 -25 -17.5 -42.5t-42.5 -17.5t-42.5 17.5t-17.5 42.5z" />
+<glyph unicode="(" horiz-adv-x="560" d="M80 562q0 493 243 985q6 16 19 30q24 23 57 23t56.5 -23.5t23.5 -56.5q-2 -24 -13 -43q-228 -458 -228 -916q0 -460 230 -920q11 -18 11 -41q0 -33 -23.5 -56.5t-56.5 -23.5t-57 24q-12 14 -19 30q-243 495 -243 988z" />
+<glyph unicode=")" horiz-adv-x="560" d="M80 -400q0 23 11 41q230 460 230 920q0 458 -228 916q-11 19 -13 43q0 33 23.5 56.5t56.5 23.5t57 -23q13 -14 19 -30q244 -492 244 -985t-244 -988q-8 -16 -19 -30q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="*" horiz-adv-x="780" d="M85 1360q0 13 5 26q11 32 41 46t61 3q14 -5 24 -13l157 -117l-58 188q-4 13 -4 27q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -14 -4 -27l-58 -189l158 118q11 8 24 13q31 11 61 -3t41 -46q5 -14 5 -27q0 -17 -8 -34q-14 -30 -45 -41q-14 -4 -27 -5l-196 -8 l161 -112q11 -7 20 -19q20 -26 16 -59t-30 -53q-22 -17 -59 -16q-33 4 -53 30q-9 11 -13 24l-72 181l-73 -181q-4 -13 -13 -24q-20 -31 -64 -31q-26 0 -48 17q-26 20 -30 53t16 59q9 12 20 19l161 112l-195 8q-14 1 -27 5q-31 11 -45 41q-9 17 -9 35z" />
+<glyph unicode="+" horiz-adv-x="1120" d="M80 800q0 33 23.5 56.5t56.5 23.5h320v320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-320h320q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-320v-320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v320h-320q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="," horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85q0 -196 -87 -328q-18 -32 -53 -32q-25 0 -42.5 17.5t-17.5 42.5t17 42q70 78 -22 173q-35 35 -35 85z" />
+<glyph unicode="-" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-480q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="." horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
+<glyph unicode="/" horiz-adv-x="960" d="M80 -80q0 18 7 34l640 1600q6 12 17 23q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -18 -7 -34l-640 -1600q-6 -12 -16 -22q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="0" horiz-adv-x="1120" d="M80 800q0 480 197 683q117 117 283 117t283 -117q197 -203 197 -683t-197 -683q-117 -117 -283 -117t-283 117q-197 203 -197 683zM240 800q0 -400 150 -569q71 -71 170 -71t170 71q150 169 150 569t-150 569q-71 71 -170 71t-170 -71q-150 -169 -150 -569z" />
+<glyph unicode="1" horiz-adv-x="560" d="M80 1440q0 33 24 57q12 12 27 18l240 80q13 5 29 5q33 0 56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v1329l-129 -43q-15 -6 -31 -6q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="2" horiz-adv-x="1120" d="M80 80q0 33 23 57l683 756q94 94 94 227t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5q0 199 140.5 339.5t339.5 140.5t339.5 -140.5t140.5 -339.5t-141 -340l-558 -620h619q33 0 56.5 -23.5t23.5 -56.5 t-23.5 -56.5t-56.5 -23.5h-800q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="3" horiz-adv-x="1120" d="M80 480q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5q99 0 169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5 t-70.5 -169.5q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5q0 166 117 283t283 117t283 -117t117 -283q0 -176 -147 -311q46 -29 87 -69q140 -141 140 -340t-140.5 -339.5t-339.5 -140.5t-339.5 140.5t-140.5 339.5z" />
+<glyph unicode="4" d="M80 480q0 26 15 47l720 1040q22 33 65 33q33 0 56.5 -23.5t23.5 -56.5v-960h160q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-160v-320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v320h-640q-33 0 -56.5 23.5t-23.5 56.5zM313 560h487v704z" />
+<glyph unicode="5" horiz-adv-x="1200" d="M80 520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5t-105.5 254.5t-254.5 105.5h-360q-33 0 -56.5 23.5t-23.5 56.5v560q0 33 23.5 56.5t56.5 23.5h720q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5 t-56.5 -23.5h-640v-400h280q215 0 367.5 -152.5t152.5 -367.5t-152.5 -367.5t-367.5 -152.5t-367.5 152.5t-152.5 367.5z" />
+<glyph unicode="6" horiz-adv-x="1120" d="M80 480q0 147 77 262l491 814q6 11 16 21q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -23 -11 -41l-318 -527q43 8 89 8q199 0 339.5 -140.5t140.5 -339.5t-140.5 -339.5t-339.5 -140.5t-339.5 140.5t-140.5 339.5zM240 480q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 t93.5 226.5t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5z" />
+<glyph unicode="7" horiz-adv-x="1120" d="M80 80q0 24 16 48l729 1312h-665q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5q0 -24 -12 -43l-796 -1432q-7 -13 -15 -21q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="8" horiz-adv-x="1120" d="M80 480q0 199 141 340q40 40 86 69q-15 13 -30 28q-117 117 -117 283t117 283t283 117t283 -117t117 -283t-117 -283q-15 -15 -30 -28q46 -29 87 -69q140 -141 140 -340t-140.5 -339.5t-339.5 -140.5t-339.5 140.5t-140.5 339.5zM240 480q0 -133 93.5 -226.5t226.5 -93.5 t226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5zM320 1200q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5t-70.5 -169.5z" />
+<glyph unicode="9" horiz-adv-x="1120" d="M80 1120q0 199 140.5 339.5t339.5 140.5t339.5 -140.5t140.5 -339.5q0 -147 -77 -262l-491 -814q-6 -11 -15 -20q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5q0 23 11 41l318 527q-43 -8 -89 -8q-199 0 -339.5 140.5t-140.5 339.5zM240 1120q0 -133 93.5 -226.5t226.5 -93.5 t226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5z" />
+<glyph unicode=":" horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85zM80 1001q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
+<glyph unicode=";" horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85q0 -196 -87 -328q-22 -32 -53 -32q-25 0 -42.5 17.5t-17.5 42.5t17 42q70 78 -22 173q-35 35 -35 85zM80 1001q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
+<glyph unicode="&#x37e;" horiz-adv-x="400" d="M80 120q0 50 35 85t85 35t85 -35t35 -85q0 -196 -87 -328q-22 -32 -53 -32q-25 0 -42.5 17.5t-17.5 42.5t17 42q70 78 -22 173q-35 35 -35 85zM80 1001q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
+<glyph unicode="&#x3c;" horiz-adv-x="1120" d="M80 720q0 44 44 72l796 478q18 10 40 10q33 0 56.5 -23.5t23.5 -56.5q0 -43 -41 -70l-684 -410l684 -410q41 -27 41 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-22 0 -40 10l-796 478q-44 28 -44 72z" />
+<glyph unicode="=" horiz-adv-x="1040" d="M80 480q0 33 23.5 56.5t56.5 23.5h720q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -24.5h-720q-33 1 -56.5 24.5t-23.5 56.5zM80 960q0 33 23.5 56.5t56.5 23.5h720q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-720q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#x3e;" horiz-adv-x="1120" d="M80 240q0 43 41 70l684 410l-684 410q-41 27 -41 70q0 33 23.5 56.5t56.5 23.5q22 0 40 -10l796 -478q44 -28 44 -72t-44 -72l-796 -478q-18 -10 -40 -10q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="?" horiz-adv-x="1120" d="M80 1120q0 199 140.5 339.5t339.5 140.5t339.5 -140.5t140.5 -339.5t-141 -340l-165 -153q-94 -94 -94 -227q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5q0 199 141 340l165 153q94 94 94 227t-93.5 226.5t-226.5 93.5t-226.5 -93.5t-93.5 -226.5 q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM440 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
+<glyph unicode="@" horiz-adv-x="2240" d="M80 560q0 431 304.5 735.5t735.5 304.5t735.5 -304.5t304.5 -735.5q0 -640 -400 -640q-240 0 -240 247q-168 -167 -400 -167t-396 164t-164 396t164 396t396 164t396 -164t164 -396v-400q0 -80 80 -80q240 0 240 480q0 365 -257.5 622.5t-622.5 257.5t-622.5 -257.5 t-257.5 -622.5t257.5 -622.5t622.5 -257.5q196 0 362 74q18 11 40 11q33 0 56.5 -23.5t23.5 -56.5t-23 -56q-13 -13 -28 -19q-197 -90 -431 -90q-431 0 -735.5 304.5t-304.5 735.5zM720 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117 t-117 -283z" />
+<glyph unicode="A" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579z" />
+<glyph unicode="B" horiz-adv-x="1120" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h320q166 0 283 -117t117 -283t-117 -283q74 -35 137 -97q140 -141 140 -340t-140.5 -339.5t-339.5 -140.5h-400q-33 0 -56.5 23.5t-23.5 56.5zM240 160h320q133 0 226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5h-320v-640z M240 960h240q99 0 169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5h-240v-480z" />
+<glyph unicode="C" horiz-adv-x="1480" d="M80 800q0 331 234.5 565.5t565.5 234.5q286 0 509 -183q23 -24 23 -57t-23.5 -56.5t-56.5 -23.5t-57 24q-169 136 -395 136q-265 0 -452.5 -187.5t-187.5 -452.5t187.5 -452.5t452.5 -187.5q229 0 400 140q20 14 46 14q33 0 56.5 -23.5t23.5 -56.5t-23 -56 q-223 -178 -503 -178q-331 0 -565.5 234.5t-234.5 565.5z" />
+<glyph unicode="D" horiz-adv-x="1360" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h320q331 0 565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5h-320q-33 0 -56.5 23.5t-23.5 56.5zM240 160h240q265 0 452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5h-240v-1280z" />
+<glyph unicode="E" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-560h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5 t-23.5 56.5z" />
+<glyph unicode="F" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-640q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="G" horiz-adv-x="1500" d="M80 800q0 331 234.5 565.5t565.5 234.5q286 0 509 -183q23 -24 23 -57t-23.5 -56.5t-56.5 -23.5t-57 24q-169 136 -395 136q-265 0 -452.5 -187.5t-187.5 -452.5t187.5 -452.5t452.5 -187.5q207 0 366 114v366h-316q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h397 q32 0 56 -23q23 -24 23 -57v-486q0 -33 -23 -56q-223 -178 -503 -178q-331 0 -565.5 234.5t-234.5 565.5z" />
+<glyph unicode="H" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-640h800v640q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v640h-800v-640q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="I" horiz-adv-x="480" d="M160 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="J" horiz-adv-x="1120" d="M80 480q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5v1040q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1040q0 -199 -140.5 -339.5t-339.5 -140.5t-339.5 140.5t-140.5 339.5z" />
+<glyph unicode="K" horiz-adv-x="1200" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-686l741 741q26 25 59 25t56.5 -23.5t23.5 -56.5t-23 -57l-562 -562l570 -773q15 -21 15 -45q0 -42 -32 -67q-22 -16 -46 -16q-44 0 -68 34l-554 752l-180 -180v-526q0 -33 -23.5 -56.5t-56.5 -23.5 t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="L" horiz-adv-x="1200" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1360h800q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="M" horiz-adv-x="1760" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5q48 0 71 -42l649 -1299l649 1299q23 42 71 42q33 0 56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v1101l-571 -1142q-21 -39 -69 -39q-50 0 -74 49l-566 1132v-1101q0 -33 -23.5 -56.5 t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="N" horiz-adv-x="1440" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5q36 0 62 -29l978 -1258v1207q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5q-35 0 -60 26l-980 1260v-1206q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="O" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5z" />
+<glyph unicode="P" horiz-adv-x="1080" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h320q215 0 367.5 -152.5t152.5 -367.5t-152.5 -367.5t-367.5 -152.5h-240v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM240 720h240q149 0 254.5 105.5t105.5 254.5t-105.5 254.5t-254.5 105.5h-240v-720z" />
+<glyph unicode="Q" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5q0 -290 -180 -506l158 -158q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5t-58 24l-156 156q-216 -180 -506 -180q-331 0 -565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5 q224 0 392 134l-169 169q-23 24 -23 57t23.5 56.5t56.5 23.5t57 -23l169 -169q134 168 134 392q0 265 -187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5z" />
+<glyph unicode="R" horiz-adv-x="1200" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5h400q199 0 339.5 -140.5t140.5 -339.5t-140 -339q-65 -65 -141 -99l348 -558q13 -19 13 -44q0 -33 -23.5 -56.5t-56.5 -23.5q-43 0 -70 41l-375 600q-17 -1 -35 -1h-320v-560q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z M240 800h320q133 0 226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5h-320v-640z" />
+<glyph unicode="S" horiz-adv-x="1060" d="M80 267q0 33 23.5 56.5t56.5 23.5q43 0 68 -37q12 -19 28 -36q85 -102 218 -113q14 -1 27 -1q115 0 206 76q101 86 112 218q1 15 1 30q0 116 -76 204q-86 100 -218 111q-165 14 -272 140q-95 112 -95 257q0 18 1 35q14 165 140 272q113 97 260 97q174 0 304 -143 q22 -26 39 -54q12 -19 12 -43q0 -33 -23.5 -56.5t-56.5 -23.5q-38 0 -56 24t-37 49q-65 76 -163 84q-11 1 -22 1q-86 0 -153 -58q-76 -64 -84 -162q-1 -11 0 -22q0 -86 56 -153q64 -76 163 -84q199 -17 328 -168q113 -134 113 -304q0 -23 -2 -46q-16 -198 -167 -326 q-135 -115 -307 -115q-215 0 -370 170q-21 23 -38 49q-16 21 -16 48z" />
+<glyph unicode="T" horiz-adv-x="1360" d="M80 1520q0 33 23.5 56.5t56.5 23.5h1040q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-440v-1360q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v1360h-440q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="U" d="M80 560v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -166 117 -283t283 -117t283 117t117 283v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -232 -164 -396t-396 -164t-396 164t-164 396z" />
+<glyph unicode="V" horiz-adv-x="1440" d="M80 1520q0 33 23.5 56.5t56.5 23.5q53 0 73 -46l487 -1253l487 1253q20 46 73 46q33 0 56.5 -23.5t23.5 -56.5q0 -22 -10 -45l-557 -1425q-6 -16 -16 -26q-24 -24 -57 -24t-56 24q-11 10 -17 26l-557 1425q-10 23 -10 45z" />
+<glyph unicode="W" horiz-adv-x="1920" d="M80 1520q0 33 23.5 56.5t56.5 23.5t57 -23q13 -14 19 -30l324 -1168l324 1168q4 15 20 30q23 23 56 23t57 -23q13 -14 19 -30l324 -1168l324 1168q6 16 20 30q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -17 -6 -35l-392 -1418q-8 -25 -25 -43q-24 -24 -57 -24t-56 24 q-18 18 -25 42l-319 1152l-318 -1151q-8 -25 -25 -43q-24 -24 -57 -24t-56 24q-18 18 -25 42l-393 1419q-6 18 -6 35z" />
+<glyph unicode="X" horiz-adv-x="1440" d="M80 80q0 28 17 50l521 670l-524 674q-14 20 -14 46q0 33 23.5 56.5t56.5 23.5q38 0 66 -34l494 -635l494 635q28 34 66 34q33 0 56.5 -23.5t23.5 -56.5q0 -26 -14 -46l-524 -674l521 -670q17 -22 17 -50q0 -33 -23.5 -56.5t-56.5 -23.5q-38 0 -61 28l-499 641l-499 -641 q-23 -28 -61 -28q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="Y" d="M80 1520q0 33 23.5 56.5t56.5 23.5q41 0 65 -33l415 -622l415 622q24 33 65 33q33 0 56.5 -23.5t23.5 -56.5q0 -25 -13 -45l-467 -699v-696q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v696l-467 699q-13 20 -13 45z" />
+<glyph unicode="Z" horiz-adv-x="1440" d="M80 80q0 28 17 50l1019 1310h-956q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h1120q33 0 56.5 -23.5t23.5 -56.5q0 -26 -14 -46l-1022 -1314h956q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-1120q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="[" horiz-adv-x="640" d="M80 -400v1920q0 33 23.5 56.5t56.5 23.5h320q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-240v-1760h240q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-320q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="\" horiz-adv-x="960" d="M80 1520q0 33 23.5 56.5t56.5 23.5t57 -23q10 -11 16 -23l640 -1600q7 -16 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-57 24q-10 10 -16 22l-640 1600q-7 16 -7 34z" />
+<glyph unicode="]" horiz-adv-x="640" d="M80 -400q0 33 23.5 56.5t56.5 23.5h240v1760h-240q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h320q33 0 56.5 -23.5t23.5 -56.5v-1920q0 -33 -23.5 -56.5t-56.5 -23.5h-320q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="^" horiz-adv-x="960" d="M80 1040q0 23 11 41l324 486q22 33 65 33t65 -33l324 -486q11 -18 11 -41q0 -33 -23.5 -56.5t-56.5 -23.5q-40 0 -64 31l-256 384l-256 -384q-24 -31 -64 -31q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="_" horiz-adv-x="960" d="M-80 -80q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="`" horiz-adv-x="560" d="M80 1520q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
+<glyph unicode="a" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
+<glyph unicode="b" d="M80 560v962q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-570l4 4q164 164 396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
+<glyph unicode="c" horiz-adv-x="1120" d="M80 560q0 232 164 396t396 164q210 0 365 -135q28 -25 28 -62q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -51 18q-112 99 -262 99q-166 0 -283 -117t-117 -283t117 -283t283 -117q150 0 261 98q21 16 49 16q33 0 56.5 -23.5t23.5 -56.5t-25 -59q-155 -135 -365 -135 q-232 0 -396 164t-164 396z" />
+<glyph unicode="d" d="M80 560q0 232 164 396t396 164t396 -164l4 -4v570q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-962q0 -232 -164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
+<glyph unicode="e" d="M80 560q0 232 164 396t396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135q-232 0 -396 164t-164 396zM247 640h786 q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203z" />
+<glyph unicode="f" horiz-adv-x="800" d="M80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80 q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="g" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-560q0 -175 -126 -304q-176 -176 -425 -176t-424 176q-65 64 -106 139q-12 18 -12 42q0 33 23.5 56.5t56.5 23.5t57 -23q10 -11 17 -24q30 -54 77 -101q129 -129 311 -129t311 129q80 96 80 191v168l-4 -4 q-164 -164 -396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
+<glyph unicode="h" horiz-adv-x="1200" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-545q150 145 360 145q215 0 367.5 -152.5t152.5 -367.5v-520q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v520q0 149 -105.5 254.5t-254.5 105.5t-254.5 -105.5t-105.5 -254.5v-520 q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="i" horiz-adv-x="480" d="M140 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM160 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="j" horiz-adv-x="656" d="M0 -400q0 33 23.5 56.5t56.5 23.5q133 0 226.5 93.5t93.5 226.5v1040q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1040q0 -199 -140.5 -339.5t-339.5 -140.5q-33 0 -56.5 23.5t-23.5 56.5zM380 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5 t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="k" horiz-adv-x="1120" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-852l677 440q19 12 43 12q33 0 56.5 -23.5t23.5 -56.5t-23 -56q-6 -6 -11 -10l-464 -302l476 -536q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5t-58 24l-497 560l-165 -107v-397q0 -33 -23.5 -56.5 t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="l" horiz-adv-x="480" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1360h80q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-160q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="m" horiz-adv-x="1760" d="M80 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-21q119 101 280 101q182 0 311 -129q27 -27 49 -57q22 30 49 57q129 129 311 129t311 -129t129 -311v-600q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v600q0 116 -82 198t-198 82t-198 -82 t-82 -198v-600q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v600q0 116 -82 198t-198 82t-198 -82t-82 -198v-600q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="n" horiz-adv-x="1200" d="M80 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-65q150 145 360 145q215 0 367.5 -152.5t152.5 -367.5v-520q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v520q0 149 -105.5 254.5t-254.5 105.5t-254.5 -105.5t-105.5 -254.5v-520 q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="o" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
+<glyph unicode="p" d="M80 -400v960q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164l-4 4v-568q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
+<glyph unicode="q" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v568l-4 -4q-164 -164 -396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
+<glyph unicode="r" horiz-adv-x="960" d="M80 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-88q168 168 400 168q117 0 215 -40q18 -7 33 -21q23 -24 23 -57t-23.5 -56.5t-56.5 -23.5q-19 0 -35 8q-71 30 -156 30q-166 0 -283 -117t-117 -283v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5 t-23.5 56.5z" />
+<glyph unicode="s" horiz-adv-x="1060" d="M80 800q0 99 74 173q144 147 376 147q251 0 430 -201q16 -19 15 -47q0 -33 -23.5 -56.5t-56.5 -23.5t-53 21t-29 30q-117 117 -283 117t-265 -104q-24 -29 -24 -69q3 -47 49 -64l492 -163q91 -34 127 -71q71 -70 71 -169t-74 -173q-144 -147 -376 -147q-252 0 -430 201 q-15 21 -15 47q0 33 23.5 56.5t56.5 23.5t53 -21t29 -30q117 -117 283 -117t265 104q24 29 24 69q-3 47 -49 64l-492 163q-91 34 -127 71q-71 70 -71 169z" />
+<glyph unicode="t" horiz-adv-x="800" d="M80 1040q0 33 23.5 56.5t56.5 23.5h80v400q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-400h161q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-161v-560q0 -240 240 -240q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-400 0 -400 400v560h-80 q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="u" horiz-adv-x="1200" d="M80 520v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65q-150 -145 -360 -145 q-215 0 -367.5 152.5t-152.5 367.5z" />
+<glyph unicode="v" horiz-adv-x="1200" d="M80 1040q0 33 23.5 56.5t56.5 23.5t57 -23q8 -8 15 -21l368 -804l368 804q7 13 16 21q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -17 -6 -31l-444 -967q-6 -13 -13 -20q-22 -22 -57 -22t-57 23q-7 6 -13 19l-444 967q-6 14 -6 31z" />
+<glyph unicode="w" horiz-adv-x="1600" d="M80 1040q0 33 23.5 56.5t56.5 23.5t57 -23q10 -11 16 -23l247 -741l242 727q7 21 22 37q23 23 56 23t57 -23q15 -16 21 -37l242 -727l247 741q6 12 17 23q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -16 -6 -31l-319 -958q-6 -15 -18 -29q-24 -22 -57 -22t-56 22 q-13 14 -19 29l-245 736l-245 -736q-6 -15 -18 -29q-24 -22 -57 -22t-56 22q-13 14 -19 29l-319 958q-6 15 -6 31z" />
+<glyph unicode="x" horiz-adv-x="1120" d="M80 80q0 28 16 49l360 432l-357 427q-19 22 -19 52q0 33 23.5 56.5t56.5 23.5t59 -25l341 -409l341 409q26 25 59 25t56.5 -23.5t23.5 -56.5q0 -30 -19 -52l-357 -427l360 -432q16 -21 16 -49q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24l-344 412l-344 -412q-23 -24 -56 -24 t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="y" horiz-adv-x="1120" d="M80 1040q0 33 23.5 56.5t56.5 23.5t57 -23q13 -14 19 -30l324 -777l324 777q6 16 20 30q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -20 -9 -37l-596 -1430q-6 -16 -19 -29q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5q0 20 9 37l185 444l-384 922q-9 17 -9 37z" />
+<glyph unicode="z" horiz-adv-x="1120" d="M80 80q0 28 16 49l693 831h-629q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5q0 -30 -19 -52l-691 -828h630q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-800q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="{" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5q160 0 160 160v480q0 320 320 320q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-160 0 -160 -160v-480q0 -160 -80 -240q80 -80 80 -240v-480q0 -160 160 -160q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5 q-320 0 -320 320v480q0 160 -160 160q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="|" horiz-adv-x="800" d="M320 -400v1920q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1920q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="}" horiz-adv-x="800" d="M80 -400q0 33 23.5 56.5t56.5 23.5q160 0 160 160v480q0 160 80 240q-80 80 -80 240v480q0 160 -160 160q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5q320 0 320 -320v-480q0 -160 160 -160q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-160 0 -160 -160 v-480q0 -320 -320 -320q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="~" horiz-adv-x="960" d="M71 757q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
+<glyph unicode="&#xa1;" horiz-adv-x="400" d="M80 999q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85zM120 -400v1120q0 32 24 55q23 24 56 24t57 -24q23 -23 23 -55v-1120q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xa2;" horiz-adv-x="1120" d="M87 560q0 232 164 396t396 164q25 0 49 -2l109 272q13 31 44 44q13 6 31 6q15 0 29 -5q31 -12 44 -42.5t1 -61.5l-99 -249q84 -34 157 -97q28 -25 28 -62q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -51 18q-53 47 -114 71l-298 -744q69 -28 150 -28q150 0 261 98q21 16 49 16 q33 0 56.5 -23.5t23.5 -56.5t-25 -59q-155 -135 -365 -135q-113 0 -209 39l-123 -308q-12 -31 -42 -44q-16 -7 -32 -7q-15 0 -30 6q-31 12 -44 42.5t-1 61.5l132 331q-24 20 -47 43q-164 164 -164 396zM247 560q0 -164 114 -280l272 680q-157 -5 -269 -117 q-117 -117 -117 -283z" />
+<glyph unicode="&#xa3;" horiz-adv-x="1040" d="M80 720q0 33 23.5 56.5t56.5 23.5h105q-22 127 -75 250h1q-31 75 -31 150q0 166 117 283t283 117t283 -117q29 -29 51 -61q16 -22 16 -50q0 -33 -23.5 -56.5t-56.5 -23.5q-37 0 -56 24q-17 25 -44 54q-71 70 -170 70t-169.5 -70.5t-70.5 -169.5q0 -45 19 -90 q65 -151 88 -310h293q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-281q2 -232 -83 -480h394l60 120q21 40 70 40q33 0 56.5 -23.5t23.5 -56.5q0 -21 -9 -38l-77 -154q-6 -13 -17 -24q-24 -24 -57 -24h-560q-33 0 -56.5 23.5t-23.5 56.5q0 17 6 32q117 273 113 528 h-119q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xa4;" horiz-adv-x="960" d="M110 460q0 33 24 57l72 67q-46 73 -46 166q0 89 42 161l-68 73q-24 23 -24 56t23.5 56.5t56.5 23.5q32 0 55 -21l69 -74q74 45 166 45q89 0 161 -42l73 69q23 23 56 23t56.5 -23.5t23.5 -56.5t-24 -58l-71 -66q45 -74 45 -166q0 -89 -42 -161l69 -72q23 -24 23 -57 t-23.5 -56.5t-56.5 -23.5q-32 0 -54 22l-1 -1l-69 74q-74 -45 -166 -45q-89 0 -160 42l-77 -72q-22 -20 -53 -20q-33 0 -56.5 23.5t-23.5 56.5zM320 750q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113z" />
+<glyph unicode="&#xa5;" d="M80 560q0 33 23.5 56.5t56.5 23.5h400v136l-69 104h-331q-33 0 -56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5h224l-291 435q-13 20 -13 45q0 33 23.5 56.5t56.5 23.5q41 0 65 -33l415 -622l415 622q24 33 65 33q33 0 56.5 -23.5t23.5 -56.5q0 -25 -13 -45l-291 -435h225 q32 0 56 -23q23 -24 23 -57t-23 -56q-24 -24 -56 -24h-332l-69 -104v-136h400q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-400v-400q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v400h-400q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xa6;" horiz-adv-x="480" d="M160 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-720q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v720zM160 960v720q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-720q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xa7;" horiz-adv-x="960" d="M80 -80q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5q-166 0 -283 117t-117 283t117 283q20 20 42 37q-22 17 -42 37q-117 117 -117 283t117 283t283 117t283 -117t117 -283 q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5q0 99 -70.5 169.5t-169.5 70.5t-169.5 -70.5t-70.5 -169.5t70.5 -169.5t169.5 -70.5q166 0 283 -117t117 -283t-117 -283q-20 -20 -42 -37q22 -17 42 -37q117 -117 117 -283t-117 -283t-283 -117t-283 117t-117 283z M240 560q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5t-70.5 -169.5z" />
+<glyph unicode="&#xa8;" horiz-adv-x="960" d="M139 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM619 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xa9;" horiz-adv-x="1760" d="M80 798q0 330 233.5 563.5t564.5 233.5q330 0 563.5 -233.5t233.5 -563.5q0 -331 -233.5 -564.5t-563.5 -233.5q-331 0 -564.5 233.5t-233.5 564.5zM203 798q0 -280 197.5 -477.5t477.5 -197.5q279 0 476.5 197.5t197.5 477.5q0 279 -197.5 476.5t-476.5 197.5 q-280 0 -477.5 -197.5t-197.5 -476.5zM320 800q0 232 164 396t396 164q210 0 365 -135q28 -25 28 -62q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -51 18q-112 99 -262 99q-166 0 -283 -117t-117 -283t117 -283t283 -117q150 0 261 98q21 16 49 16q33 0 56.5 -23.5t23.5 -56.5 t-25 -59q-155 -135 -365 -135q-232 0 -396 164t-164 396z" />
+<glyph unicode="&#xaa;" horiz-adv-x="960" d="M80 1200q0 166 117 283t283 117t283 -117t117 -283v-320q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24q-24 23 -24 55q-103 -79 -240 -79q-166 0 -283 117t-117 283zM240 1200q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5 t-70.5 -169.5z" />
+<glyph unicode="&#xab;" horiz-adv-x="960" d="M80 559q0 20 10 39l236 472q6 14 18 26q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -18 -7 -34l-223 -445l223 -446q7 -16 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24q-12 11 -18 25l-234 467q-12 22 -12 43zM480 559q0 20 10 39l236 472q6 14 18 26q23 23 56 23t56.5 -23.5 t23.5 -56.5q0 -18 -7 -34l-223 -445l223 -446q7 -16 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24q-12 11 -18 25l-234 467q-12 22 -12 43z" />
+<glyph unicode="&#xac;" horiz-adv-x="1120" d="M80 1040q0 33 23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5v-320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v240h-720q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xad;" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-480q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xae;" horiz-adv-x="1760" d="M80 798q0 330 233.5 563.5t564.5 233.5q330 0 563.5 -233.5t233.5 -563.5q0 -331 -233.5 -564.5t-563.5 -233.5q-331 0 -564.5 233.5t-233.5 564.5zM203 798q0 -280 197.5 -477.5t477.5 -197.5q279 0 476.5 197.5t197.5 477.5q0 279 -197.5 476.5t-476.5 197.5 q-280 0 -477.5 -197.5t-197.5 -476.5zM560 326v944q0 22 15.5 37t36.5 15h263q130 0 222.5 -92t92.5 -222q0 -131 -93 -223q-42 -42 -92 -65l228 -366q9 -12 9 -28q0 -22 -15.5 -37.5t-36.5 -15.5q-29 0 -46 27l-246 394q-12 -1 -23 -1h-210v-367q0 -22 -15.5 -37.5 t-37.5 -15.5q-21 0 -36.5 15.5t-15.5 37.5zM665 798h210q87 0 148.5 61t61.5 149q0 87 -61.5 148t-148.5 61h-210v-419z" />
+<glyph unicode="&#xaf;" horiz-adv-x="1120" d="M80 1840q0 33 23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-800q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xb0;" horiz-adv-x="960" d="M80 1200q0 166 117 283t283 117t283 -117t117 -283t-117 -283t-283 -117t-283 117t-117 283zM240 1200q0 -99 70.5 -169.5t169.5 -70.5t169.5 70.5t70.5 169.5t-70.5 169.5t-169.5 70.5t-169.5 -70.5t-70.5 -169.5z" />
+<glyph unicode="&#xb1;" horiz-adv-x="1120" d="M80 80q0 33 23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-800q-33 0 -56.5 23.5t-23.5 56.5zM80 800q0 33 23.5 56.5t56.5 23.5h320v320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-320h320q33 0 56.5 -23.5t23.5 -56.5 t-23.5 -56.5t-56.5 -23.5h-320v-320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v320h-320q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xb2;" horiz-adv-x="640" d="M80 848q0 16 11 28l338 374q47 47 47 112q0 66 -46.5 112.5t-111.5 46.5q-66 0 -112.5 -46.5t-46.5 -112.5q0 -16 -11.5 -27.5t-27.5 -11.5q-17 0 -28.5 11.5t-11.5 27.5q0 99 69.5 168.5t168.5 69.5q98 0 167.5 -69.5t69.5 -168.5q0 -98 -70 -168l-276 -307h307 q16 0 27.5 -11.5t11.5 -27.5q0 -17 -11.5 -28.5t-27.5 -11.5h-396q-17 0 -28.5 11.5t-11.5 28.5z" />
+<glyph unicode="&#xb3;" horiz-adv-x="640" d="M80 1041q0 17 11.5 28.5t28.5 11.5q16 0 28 -11.5t12 -28.5q0 -66 46.5 -112.5t113.5 -46.5q66 0 112.5 46.5t46.5 112.5q0 67 -46.5 113.5t-112.5 46.5q-17 0 -28.5 11.5t-11.5 28.5q0 16 11.5 28t28.5 12q49 0 84 35t35 84q0 50 -35 85t-84 35q-50 0 -85 -35t-35 -85 q0 -16 -12 -27.5t-28 -11.5q-17 0 -28.5 11.5t-11.5 27.5q0 83 58.5 141.5t141.5 58.5q82 0 140.5 -58.5t58.5 -141.5q0 -92 -73 -155q23 -14 43 -34q70 -71 70 -170t-70 -169t-169 -70q-100 0 -170 70t-70 169z" />
+<glyph unicode="&#xb4;" horiz-adv-x="560" d="M80 1280q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xb5;" horiz-adv-x="1200" d="M80 -400v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65 q-150 -145 -360 -145t-360 145v-545q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xb6;" horiz-adv-x="1120" d="M80 1200q0 166 117 283t283 117h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5v-1360q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v1360h-160v-1360q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v720q-166 0 -283 117t-117 283z" />
+<glyph unicode="&#xb7;" horiz-adv-x="400" d="M80 760q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
+<glyph unicode="&#x2219;" horiz-adv-x="400" d="M80 760q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
+<glyph unicode="&#xb8;" horiz-adv-x="640" d="M80 -330q0 33 23.5 56.5t56.5 23.5q24 0 43 -12l78 -48q19 -10 39 -10q33 0 56.5 13.5t23.5 36.5t-23.5 36.5t-56.5 13.5t-56.5 23.5t-23.5 56.5q0 14 4 26l39 137q6 19 21 34q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -10 -2 -19l-17 -60q37 -15 69 -41q70 -61 70 -150 t-70.5 -149.5t-169.5 -60.5q-59 0 -114 29l-91 54q-35 29 -35 67z" />
+<glyph unicode="&#xb9;" horiz-adv-x="480" d="M120 1521q0 16 12 28q6 6 13 9l120 40q6 2 14 2q16 0 28 -11.5t12 -28.5v-715q0 -17 -12 -28.5t-28 -11.5t-28 11.5t-12 28.5v660l-64 -21q-7 -3 -15 -3q-17 0 -28.5 11.5t-11.5 28.5z" />
+<glyph unicode="&#xba;" horiz-adv-x="640" d="M80 1203q0 238 98 339q58 58 141 58q82 0 140 -58q98 -101 98 -339q0 -239 -98 -340q-58 -58 -140 -58q-83 0 -141 58q-98 101 -98 340zM160 1203q0 -199 74 -283q35 -35 85 -35q49 0 84 35q75 84 75 283q0 198 -75 282q-35 36 -84 36q-50 0 -85 -36q-74 -84 -74 -282z " />
+<glyph unicode="&#xbb;" horiz-adv-x="960" d="M80 80q0 18 7 34l223 446l-223 445q-7 16 -7 34q0 33 23.5 56.5t56.5 23.5t56 -23q12 -12 18 -26l236 -472q10 -19 10 -39q0 -21 -12 -43l-234 -467q-6 -14 -18 -25q-23 -24 -56 -24t-56.5 23.5t-23.5 56.5zM480 80q0 18 7 34l223 446l-223 445q-7 16 -7 34 q0 33 23.5 56.5t56.5 23.5t56 -23q12 -12 18 -26l236 -472q10 -19 10 -39q0 -21 -12 -43l-234 -467q-6 -14 -18 -25q-23 -24 -56 -24t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xbc;" horiz-adv-x="1440" d="M80 1505q0 20 14 34q8 7 17 11l144 48q8 3 17 3q20 0 34 -14t14 -34v-865q0 -20 -14 -34t-34 -14t-34 14t-14 34v798l-77 -26q-9 -3 -19 -3q-20 0 -34 14t-14 34zM160 80q0 24 12 43l964 1446q21 31 64 31q33 0 56.5 -23.5t23.5 -56.5q0 -24 -12 -43l-958 -1436 q-27 -41 -70 -41q-33 0 -56.5 23.5t-23.5 56.5zM688 288q0 16 9 28l432 624q2 3 5 6q14 14 34 14t34 -14t14 -34v-576h96q20 0 34 -14t14 -34t-14 -34t-34 -14h-96v-192q0 -20 -14 -34t-34 -14t-34 14t-14 34v192h-384q-20 0 -34 14t-14 34zM828 336h292v422z" />
+<glyph unicode="&#xbd;" horiz-adv-x="1600" d="M80 1505q0 20 14 34q8 7 17 11l144 48q8 3 17 3q20 0 34 -14t14 -34v-865q0 -20 -14 -34t-34 -14t-34 14t-14 34v798l-77 -26q-9 -3 -19 -3q-20 0 -34 14t-14 34zM160 80q0 24 12 43l964 1446q21 31 64 31q33 0 56.5 -23.5t23.5 -56.5q0 -24 -12 -43l-958 -1436 q-27 -41 -70 -41q-33 0 -56.5 23.5t-23.5 56.5zM943 48q0 20 14 34l410 454q57 57 57 137t-56.5 136t-136.5 56t-136 -56t-56 -136q0 -20 -14 -34t-34 -14t-34 14t-14 34q0 119 84.5 203.5t203.5 84.5q120 0 204.5 -84.5t84.5 -203.5q0 -120 -85 -205l-335 -372h372 q19 0 33.5 -14t14.5 -34t-14.5 -34t-33.5 -14h-481q-20 0 -34 14t-14 34z" />
+<glyph unicode="&#xbe;" horiz-adv-x="1600" d="M80 927q0 20 14 34t34 14t34 -14t14 -34q0 -79 55.5 -135t135.5 -56t135.5 56t55.5 135q0 80 -55.5 136t-135.5 56q-20 0 -34 14t-14 34q0 19 14 33t34 14q59 0 101.5 42.5t42.5 101.5t-42.5 101t-101.5 42t-101 -42t-42 -101q0 -20 -14.5 -34t-33.5 -14q-20 0 -34 14 t-14 34q0 99 70 169t169 70t169 -70t70 -169t-70 -169q-9 -9 -18 -17q28 -17 52 -41q84 -85 84 -204t-84 -203t-203 -84t-203 84t-84 203zM320 80q0 24 12 43l964 1446q21 31 64 31q33 0 56.5 -23.5t23.5 -56.5q0 -24 -12 -43l-958 -1436q-27 -41 -70 -41q-33 0 -56.5 23.5 t-23.5 56.5zM848 288q0 16 9 28l432 624q2 3 5 6q14 14 34 14t34 -14t14 -34v-576h96q20 0 34 -14t14 -34t-14 -34t-34 -14h-96v-192q0 -20 -14 -34t-34 -14t-34 14t-14 34v192h-384q-20 0 -34 14t-14 34zM988 336h292v422z" />
+<glyph unicode="&#xbf;" horiz-adv-x="1120" d="M80 0q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5t-94 227l-165 153q-141 141 -141 340q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5q0 -133 94 -227l165 -153q141 -141 141 -340t-140.5 -339.5 t-339.5 -140.5t-339.5 140.5t-140.5 339.5zM440 999q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
+<glyph unicode="&#xc0;" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM453 2000 q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
+<glyph unicode="&#xc1;" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM587 1760 q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xc2;" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM400 1800 q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xc3;" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM308 1871 q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
+<glyph unicode="&#xc4;" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM380 1840 q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM860 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xc5;" horiz-adv-x="1440" d="M80 80q0 19 7 34l556 1430q6 18 21 33q23 23 56 23t57 -23q14 -15 20 -33l556 -1430q7 -15 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 23q-12 12 -18 26l-199 511h-574l-199 -511q-6 -14 -17 -26q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5zM495 720h450l-225 579zM518 1879 q0 83 59 142t143 59q83 0 142 -59t59 -142q0 -84 -59 -143t-142 -59q-84 0 -143 59t-59 143zM619 1879q0 -42 29.5 -71.5t71.5 -29.5q41 0 70.5 29.5t29.5 71.5q0 41 -29.5 70.5t-70.5 29.5q-42 0 -71.5 -29.5t-29.5 -70.5z" />
+<glyph unicode="&#xc6;" horiz-adv-x="1760" d="M80 80q0 22 10 39l802 1444q23 37 68 37h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-560v-640h400q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-400v-480h560q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640q-33 0 -56.5 23.5 t-23.5 56.5v560h-317l-335 -603q-25 -37 -68 -37q-33 0 -56.5 23.5t-23.5 56.5zM652 800h228v410z" />
+<glyph unicode="&#xc7;" horiz-adv-x="1480" d="M80 800q0 331 234.5 565.5t565.5 234.5q286 0 509 -183q23 -24 23 -57t-23.5 -56.5t-56.5 -23.5t-57 24q-169 136 -395 136q-265 0 -452.5 -187.5t-187.5 -452.5t187.5 -452.5t452.5 -187.5q229 0 400 140q20 14 46 14q33 0 56.5 -23.5t23.5 -56.5t-23 -56 q-223 -178 -503 -178q-331 0 -565.5 234.5t-234.5 565.5zM506 -330q0 33 23.5 56.5t56.5 23.5q24 0 43 -12l78 -48q19 -10 39 -10q33 0 56.5 13.5t23.5 36.5t-23.5 36.5t-56.5 13.5t-56.5 23.5t-23.5 56.5q0 14 4 26l39 137q6 19 21 34q23 23 56 23t56.5 -23.5t23.5 -56.5 q0 -10 -2 -19l-17 -60q37 -15 69 -41q70 -61 70 -150t-70.5 -149.5t-169.5 -60.5q-59 0 -114 29l-91 54q-35 29 -35 67z" />
+<glyph unicode="&#xc8;" d="M81 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-560h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5 t-23.5 56.5zM375 2000q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
+<glyph unicode="&#xc9;" d="M81 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-560h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5 t-23.5 56.5zM509 1760q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xca;" d="M81 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-560h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5 t-23.5 56.5zM320 1800q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xcb;" d="M81 80v1440q0 33 23.5 56.5t56.5 23.5h960q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-880v-560h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640v-560h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-960q-33 0 -56.5 23.5 t-23.5 56.5zM302 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM782 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xcc;" horiz-adv-x="480" d="M160 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM-27 2000q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z " />
+<glyph unicode="&#xcd;" horiz-adv-x="480" d="M160 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM107 1760q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z " />
+<glyph unicode="&#xce;" horiz-adv-x="480" d="M160 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM-80 1800q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126 q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xcf;" horiz-adv-x="480" d="M160 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM-100 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM380 1840q0 41 29.5 70.5 t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xd0;" horiz-adv-x="1520" d="M0 800q0 33 23.5 56.5t56.5 23.5h159v640q0 33 23.5 56.5t56.5 23.5h320q331 0 565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5h-320q-33 0 -56.5 23.5t-23.5 56.5v640h-159q-33 0 -56.5 23.5t-23.5 56.5zM399 160h240q265 0 452.5 187.5t187.5 452.5 t-187.5 452.5t-452.5 187.5h-240v-560h320q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-320v-560z" />
+<glyph unicode="&#xd1;" horiz-adv-x="1440" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5q36 0 62 -29l978 -1258v1207q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1440q0 -33 -23.5 -56.5t-56.5 -23.5q-35 0 -60 26l-980 1260v-1206q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM308 1871 q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
+<glyph unicode="&#xd2;" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5zM693 2000 q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
+<glyph unicode="&#xd3;" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5zM677 1760 q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xd4;" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5zM560 1800 q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xd5;" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5zM468 1871 q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
+<glyph unicode="&#xd6;" horiz-adv-x="1760" d="M80 800q0 331 234.5 565.5t565.5 234.5t565.5 -234.5t234.5 -565.5t-234.5 -565.5t-565.5 -234.5t-565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5t452.5 187.5t187.5 452.5t-187.5 452.5t-452.5 187.5t-452.5 -187.5t-187.5 -452.5zM540 1840 q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM1020 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xd7;" horiz-adv-x="960" d="M80 400q0 32 22 56l264 264l-264 264q-22 24 -22 56q0 33 23.5 56.5t56.5 23.5t58 -24l262 -262l262 262q25 24 58 24t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-264 -264l264 -264q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-265 265l-265 -265 q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xd8;" horiz-adv-x="1760" d="M80 80q0 32 21 55l159 159q-180 216 -180 506q0 331 234.5 565.5t565.5 234.5q290 0 506 -180l157 157q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -29 -18 -51l-162 -163q180 -216 180 -506q0 -331 -234.5 -565.5t-565.5 -234.5q-290 0 -506 180l-157 -157q-24 -23 -57 -23 t-56.5 23.5t-23.5 56.5zM240 800q0 -224 134 -392l898 898q-168 134 -392 134q-265 0 -452.5 -187.5t-187.5 -452.5zM488 294q168 -134 392 -134q265 0 452.5 187.5t187.5 452.5q0 224 -134 393z" />
+<glyph unicode="&#xd9;" d="M80 560v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -166 117 -283t283 -117t283 117t117 283v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -232 -164 -396t-396 -164t-396 164t-164 396zM373 2000q0 33 23.5 56.5t56.5 23.5t57 -23 l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
+<glyph unicode="&#xda;" d="M80 560v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -166 117 -283t283 -117t283 117t117 283v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -232 -164 -396t-396 -164t-396 164t-164 396zM507 1760q0 31 20 54l243 243q24 23 57 23 t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xdb;" d="M80 560v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -166 117 -283t283 -117t283 117t117 283v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -232 -164 -396t-396 -164t-396 164t-164 396zM320 1800q0 40 40 70l239 159q18 11 41 11 t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xdc;" d="M80 560v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -166 117 -283t283 -117t283 117t117 283v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -232 -164 -396t-396 -164t-396 164t-164 396zM300 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5 t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM780 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xdd;" d="M80 1520q0 33 23.5 56.5t56.5 23.5q41 0 65 -33l415 -622l415 622q24 33 65 33q33 0 56.5 -23.5t23.5 -56.5q0 -25 -13 -45l-467 -699v-696q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v696l-467 699q-13 20 -13 45zM507 1760q0 31 20 54l243 243q24 23 57 23 t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xde;" d="M80 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-240h480q199 0 339.5 -140.5t140.5 -339.5t-140.5 -339.5t-339.5 -140.5h-480v-240q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM240 480h480q133 0 226.5 93.5t93.5 226.5t-93.5 226.5 t-226.5 93.5h-480v-640z" />
+<glyph unicode="&#xdf;" horiz-adv-x="1120" d="M80 80v1120q0 166 117 283t283 117t283 -117t117 -283q0 -147 -92 -255q-25 -34 -25 -78q0 -77 56 -108q56 -28 104 -76q117 -117 117 -283t-117 -283t-283 -117t-283 117q-26 26 -26 59t23.5 56.5t56.5 23.5t60 -25q70 -71 169 -71t169.5 70.5t70.5 169.5t-70 170 q-29 28 -62.5 47t-63.5 50q-84 83 -84 201q0 107 72 188q48 62 48 144q0 99 -70.5 169.5t-169.5 70.5t-169 -70q-71 -71 -71 -170v-1120q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xe0;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM400 1520 q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
+<glyph unicode="&#xe1;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM480 1280 q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xe2;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM320 1320 q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xe3;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM235 1391 q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
+<glyph unicode="&#xe4;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM300 1360 q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM780 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xe5;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396v-480q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM439 1399 q0 83 59 142t143 59q83 0 142 -59t59 -142q0 -84 -59 -143t-142 -59q-84 0 -143 59t-59 143zM540 1399q0 -42 29.5 -71.5t71.5 -29.5q41 0 70.5 29.5t29.5 71.5q0 41 -29.5 70.5t-70.5 29.5q-42 0 -71.5 -29.5t-29.5 -70.5z" />
+<glyph unicode="&#xe6;" horiz-adv-x="2240" d="M80 560q0 232 164 396t396 164t396 -164q49 -49 84 -105q35 56 84 105q164 164 396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135 q-232 0 -400 168v-88q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v88q-168 -168 -400 -168t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM1207 640h786q-22 115 -110 203q-117 117 -283 117 t-283 -117q-88 -88 -110 -203z" />
+<glyph unicode="&#xe7;" horiz-adv-x="1120" d="M80 560q0 232 164 396t396 164q210 0 365 -135q28 -25 28 -62q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -51 18q-112 99 -262 99q-166 0 -283 -117t-117 -283t117 -283t283 -117q150 0 261 98q21 16 49 16q33 0 56.5 -23.5t23.5 -56.5t-25 -59q-155 -135 -365 -135 q-232 0 -396 164t-164 396zM317 -330q0 33 23.5 56.5t56.5 23.5q24 0 43 -12l78 -48q19 -10 39 -10q33 0 56.5 13.5t23.5 36.5t-23.5 36.5t-56.5 13.5t-56.5 23.5t-23.5 56.5q0 14 4 26l39 137q6 19 21 34q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -10 -2 -19l-17 -60 q37 -15 69 -41q70 -61 70 -150t-70.5 -149.5t-169.5 -60.5q-59 0 -114 29l-91 54q-35 29 -35 67z" />
+<glyph unicode="&#xe8;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135q-232 0 -396 164t-164 396zM247 640h786 q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203zM400 1520q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
+<glyph unicode="&#xe9;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135q-232 0 -396 164t-164 396zM247 640h786 q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203zM480 1280q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xea;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135q-232 0 -396 164t-164 396zM247 640h786 q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203zM320 1320q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xeb;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135q-232 0 -396 164t-164 396zM247 640h786 q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203zM300 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM780 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5 t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xec;" horiz-adv-x="480" d="M160 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM0 1520q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
+<glyph unicode="&#xed;" horiz-adv-x="480" d="M160 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM82 1280q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xee;" horiz-adv-x="560" d="M201 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM-40 1320q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126 q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xef;" horiz-adv-x="600" d="M220 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM-39 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM441 1360q0 41 29.5 70.5 t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xf0;" d="M80 560q0 232 164 396t396 164q79 0 150 -19l-104 179l-139 -81q-28 -17 -60.5 -8.5t-48.5 36.5q-17 29 -8.5 61t36.5 49l140 81l-34 58q-12 22 -12 44q0 33 23.5 56.5t56.5 23.5q46 0 68 -37l37 -63l136 79q28 17 60.5 8.5t48.5 -36.5q17 -29 8.5 -61t-36.5 -49 l-137 -80l308 -532q67 -121 67 -269q0 -232 -164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283z" />
+<glyph unicode="&#xf1;" horiz-adv-x="1200" d="M80 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-65q150 145 360 145q215 0 367.5 -152.5t152.5 -367.5v-520q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v520q0 149 -105.5 254.5t-254.5 105.5t-254.5 -105.5t-105.5 -254.5v-520 q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM200 1391q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35 q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
+<glyph unicode="&#xf2;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM400 1520q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54 q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
+<glyph unicode="&#xf3;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM480 1280q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56 l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xf4;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM320 1320q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70 q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xf5;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM235 1391q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35 q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
+<glyph unicode="&#xf6;" d="M80 560q0 232 164 396t396 164t396 -164t164 -396t-164 -396t-396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM300 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5 t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM780 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xf7;" horiz-adv-x="960" d="M80 720q0 33 23.5 56.5t56.5 23.5h640q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-640q-33 0 -56.5 23.5t-23.5 56.5zM380 420q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM380 1020q0 41 29.5 70.5 t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xf8;" d="M80 80q0 32 22 56l89 89q-111 144 -111 335q0 232 164 396t396 164q191 0 336 -111l85 85q26 26 59 26t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-89 -89q111 -144 111 -335q0 -232 -164 -396t-396 -164q-191 0 -335 111l-88 -88q-24 -23 -57 -23t-56.5 23.5t-23.5 56.5z M240 560q0 -124 65 -221l556 555q-97 66 -221 66q-166 0 -283 -117t-117 -283zM419 225q97 -65 221 -65q166 0 283 117t117 283q0 124 -65 221z" />
+<glyph unicode="&#xf9;" horiz-adv-x="1200" d="M80 520v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65q-150 -145 -360 -145 q-215 0 -367.5 152.5t-152.5 367.5zM400 1520q0 33 23.5 56.5t56.5 23.5t57 -23l243 -243q20 -23 20 -54q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -55 21l-243 243q-22 24 -22 56z" />
+<glyph unicode="&#xfa;" horiz-adv-x="1200" d="M80 520v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65q-150 -145 -360 -145 q-215 0 -367.5 152.5t-152.5 367.5zM400 1280q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xfb;" horiz-adv-x="1200" d="M80 520v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65q-150 -145 -360 -145 q-215 0 -367.5 152.5t-152.5 367.5zM280 1320q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xfc;" horiz-adv-x="1200" d="M80 520v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-520q0 -149 105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5v520q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v65q-150 -145 -360 -145 q-215 0 -367.5 152.5t-152.5 367.5zM260 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM740 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xfd;" horiz-adv-x="1120" d="M80 1040q0 33 23.5 56.5t56.5 23.5t57 -23q13 -14 19 -30l324 -777l324 777q6 16 20 30q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -20 -9 -37l-596 -1430q-6 -16 -19 -29q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5q0 20 9 37l185 444l-384 922q-9 17 -9 37zM427 1280 q0 31 20 54l243 243q24 23 57 23t56.5 -23.5t23.5 -56.5q0 -32 -22 -56l-243 -243q-23 -21 -55 -21q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xfe;" d="M80 -400v1922q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-568q168 168 400 168t396 -164t164 -396t-164 -396t-396 -164t-400 168v-570q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM240 562q0 -166 117 -283t283 -117t283 117t117 283t-117 283 t-283 117t-283 -117t-117 -283z" />
+<glyph unicode="&#xff;" horiz-adv-x="1120" d="M80 1040q0 33 23.5 56.5t56.5 23.5t57 -23q13 -14 19 -30l324 -777l324 777q6 16 20 30q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -20 -9 -37l-596 -1430q-6 -16 -19 -29q-24 -24 -57 -24t-56.5 23.5t-23.5 56.5q0 20 9 37l185 444l-384 922q-9 17 -9 37zM220 1360 q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM700 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#x131;" horiz-adv-x="480" d="M160 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#x152;" horiz-adv-x="2160" d="M80 800q0 331 234.5 565.5t565.5 234.5h1121q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-881v-560h641q33 0 56.5 -23.5t23.5 -56.5q0 -34 -23.5 -57.5t-56.5 -23.5h-641v-559h880q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-1120 q-331 0 -565.5 234.5t-234.5 565.5zM240 800q0 -265 187.5 -452.5t452.5 -187.5h80v1280h-80q-265 0 -452.5 -187.5t-187.5 -452.5z" />
+<glyph unicode="&#x153;" horiz-adv-x="2240" d="M80 560q0 232 164 396t396 164t396 -164q49 -49 84 -105q35 56 84 105q164 164 396 164t396 -164t164 -396q0 -33 -23.5 -56.5t-56.5 -23.5h-873q22 -115 110 -203q117 -117 283 -117q150 0 258 95q22 17 50 17q33 0 56.5 -23.5t23.5 -56.5t-23 -57q-155 -135 -365 -135 q-232 0 -396 164q-49 49 -84 105q-35 -56 -84 -105q-164 -164 -396 -164t-396 164t-164 396zM240 560q0 -166 117 -283t283 -117t283 117t117 283t-117 283t-283 117t-283 -117t-117 -283zM1207 640h786q-22 115 -110 203q-117 117 -283 117t-283 -117q-88 -88 -110 -203z " />
+<glyph unicode="&#x178;" d="M80 1520q0 33 23.5 56.5t56.5 23.5q41 0 65 -33l415 -622l415 622q24 33 65 33q33 0 56.5 -23.5t23.5 -56.5q0 -25 -13 -45l-467 -699v-696q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v696l-467 699q-13 20 -13 45zM300 1840q0 41 29.5 70.5t70.5 29.5 t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM780 1840q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="800" d="M80 1320q0 40 40 70l239 159q18 11 41 11t41 -11l239 -159q40 -30 40 -70q0 -33 -23.5 -56.5t-56.5 -23.5q-29 0 -50 17l-190 126l-190 -126q-21 -17 -50 -17q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#x2da;" horiz-adv-x="560" d="M80 1399q0 83 59 142t143 59q83 0 142 -59t59 -142q0 -84 -59 -143t-142 -59q-84 0 -143 59t-59 143zM181 1399q0 -42 29.5 -71.5t71.5 -29.5q41 0 70.5 29.5t29.5 71.5q0 41 -29.5 70.5t-70.5 29.5q-42 0 -71.5 -29.5t-29.5 -70.5z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="960" d="M71 1391q0 33 23.5 56.5t56.5 23.5q32 0 56 -22q47 -48 113 -48q56 0 100 35q89 80 212 80q133 0 227 -94q22 -24 22 -56q0 -33 -23.5 -56.5t-56.5 -23.5q-32 0 -56 22q-47 48 -113 48q-57 0 -100 -35q-90 -80 -212 -80q-133 0 -227 94q-22 24 -22 56z" />
+<glyph unicode="&#x2000;" horiz-adv-x="1040" />
+<glyph unicode="&#x2001;" horiz-adv-x="2080" />
+<glyph unicode="&#x2002;" horiz-adv-x="1040" />
+<glyph unicode="&#x2003;" horiz-adv-x="2080" />
+<glyph unicode="&#x2004;" horiz-adv-x="693" />
+<glyph unicode="&#x2005;" horiz-adv-x="520" />
+<glyph unicode="&#x2006;" horiz-adv-x="346" />
+<glyph unicode="&#x2007;" horiz-adv-x="346" />
+<glyph unicode="&#x2008;" horiz-adv-x="260" />
+<glyph unicode="&#x2009;" horiz-adv-x="416" />
+<glyph unicode="&#x200a;" horiz-adv-x="115" />
+<glyph unicode="&#x2010;" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-480q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#x2011;" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-480q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#x2012;" horiz-adv-x="800" d="M80 560q0 33 23.5 56.5t56.5 23.5h480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-480q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#x2013;" horiz-adv-x="800" d="M-80 560q0 33 23.5 56.5t56.5 23.5h800q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-800q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1920" d="M-80 560q0 33 23.5 56.5t56.5 23.5h1920q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-1920q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#x2018;" horiz-adv-x="480" d="M120 1225q0 175 152 358q17 17 42 17q24 0 41.5 -17.5t17.5 -41.5q0 -14 -5 -26q-98 -237 -3 -435q8 -18 8 -40q0 -41 -29.5 -70.5t-70.5 -29.5q-62 0 -90 58q-63 112 -63 227z" />
+<glyph unicode="&#x2019;" horiz-adv-x="480" d="M120 999q0 14 5 26q98 237 3 435q-8 18 -8 40q0 41 29.5 70.5t70.5 29.5q62 0 90 -58q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17q-24 0 -41.5 17.5t-17.5 41.5z" />
+<glyph unicode="&#x201a;" horiz-adv-x="480" d="M120 219q0 41 29.5 70.5t70.5 29.5q62 0 90 -58q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17q-24 0 -41.5 17.5t-17.5 41.5q0 14 5 26q98 237 3 435q-8 18 -8 40z" />
+<glyph unicode="&#x201c;" horiz-adv-x="760" d="M80 1227q0 175 152 358q17 17 42 17q24 0 41.5 -17.5t17.5 -41.5q0 -14 -5 -26q-98 -237 -3 -435q8 -18 8 -40q0 -41 -29.5 -70.5t-70.5 -29.5q-62 0 -90 58q-63 112 -63 227zM427 1227q0 175 152 358q17 17 42 17q24 0 41.5 -17.5t17.5 -41.5q0 -14 -5 -26 q-98 -237 -3 -435q8 -18 8 -40q0 -41 -29.5 -70.5t-70.5 -29.5q-62 0 -90 58q-63 112 -63 227z" />
+<glyph unicode="&#x201d;" horiz-adv-x="760" d="M80 1001q0 14 5 26q98 237 3 435q-8 18 -8 40q0 41 29.5 70.5t70.5 29.5q62 0 90 -58q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17q-24 0 -41.5 17.5t-17.5 41.5zM427 1001q0 14 5 26q98 237 3 435q-8 18 -8 40q0 41 29.5 70.5t70.5 29.5q62 0 90 -58 q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17q-24 0 -41.5 17.5t-17.5 41.5z" />
+<glyph unicode="&#x201e;" horiz-adv-x="760" d="M80 220q0 41 29.5 70.5t70.5 29.5q62 0 90 -58q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17q-24 0 -41.5 17.5t-17.5 41.5q0 14 5 26q98 237 3 435q-8 18 -8 40zM427 220q0 41 29.5 70.5t70.5 29.5q62 0 90 -58q63 -112 63 -227q0 -175 -152 -358q-17 -17 -42 -17 q-24 0 -41.5 17.5t-17.5 41.5q0 14 5 26q98 237 3 435q-8 18 -8 40z" />
+<glyph unicode="&#x2022;" horiz-adv-x="800" d="M160 800q0 99 70.5 169.5t169.5 70.5t169.5 -70.5t70.5 -169.5t-70.5 -169.5t-169.5 -70.5t-169.5 70.5t-70.5 169.5z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1440" d="M80 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85zM560 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85zM1040 120q0 50 35 85t85 35t85 -35t35 -85t-35 -85t-85 -35t-85 35t-35 85z" />
+<glyph unicode="&#x202f;" horiz-adv-x="416" />
+<glyph unicode="&#x2039;" horiz-adv-x="560" d="M80 559q0 20 10 39l236 472q6 14 18 26q23 23 56 23t56.5 -23.5t23.5 -56.5q0 -18 -7 -34l-223 -445l223 -446q7 -16 7 -34q0 -33 -23.5 -56.5t-56.5 -23.5t-56 24q-12 11 -18 25l-234 467q-12 22 -12 43z" />
+<glyph unicode="&#x203a;" horiz-adv-x="560" d="M80 80q0 18 7 34l223 446l-223 445q-7 16 -7 34q0 33 23.5 56.5t56.5 23.5t56 -23q12 -12 18 -26l236 -472q10 -19 10 -39q0 -21 -12 -43l-234 -467q-6 -14 -18 -25q-23 -24 -56 -24t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#x205f;" horiz-adv-x="520" />
+<glyph unicode="&#x20ac;" horiz-adv-x="1480" d="M80 800q0 331 234.5 565.5t565.5 234.5q286 0 509 -183q23 -24 23 -57t-23.5 -56.5t-56.5 -23.5t-57 24q-169 136 -395 136q-265 0 -452 -187q-97 -97 -143 -213h915q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-956q-4 -39 -4 -80t4 -80h956q33 0 56.5 -23.5 t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-915q46 -116 143 -212q187 -188 452 -188q229 0 400 140q20 14 46 14q33 0 56.5 -23.5t23.5 -56.5t-23 -56q-223 -178 -503 -178q-331 0 -565.5 234.5t-234.5 565.5z" />
+<glyph unicode="&#x2122;" horiz-adv-x="1500" d="M80.001 1568.04q0 13.2012 10.5752 22.6016t25.4258 9.40039h468.013q14.8506 0 25.4258 -9.40039t10.5752 -22.6016t-10.5752 -22.6016t-25.4258 -9.40039h-198.005v-544.033q0 -13.2012 -10.5762 -22.6016q-10.5752 -9.40039 -25.4258 -9.40039 q-14.8496 0 -25.4248 9.40039t-10.5752 22.6016v544.033h-198.006q-14.8506 0 -25.4258 9.40039t-10.5752 22.6016zM680.001 992.002v576.035q0 13.2012 10.5752 22.6016t25.4258 9.40039q21.6006 0 31.9512 -16.8008l292.058 -519.632l292.058 519.632 q10.3506 16.8008 31.9512 16.8008q14.8506 0 25.4258 -9.40039t10.5752 -22.6016v-576.035q0 -13.2012 -10.5752 -22.6016t-25.4258 -9.40039t-25.4258 9.40039t-10.5752 22.6016v440.427l-256.957 -456.828q-9.4502 -15.6006 -31.0508 -15.6006q-22.501 0 -33.3008 19.6016 l-254.707 452.827v-440.427q0 -13.2012 -10.5752 -22.6016t-25.4258 -9.40039t-25.4258 9.40039t-10.5752 22.6016z" />
+<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" />
+<glyph unicode="&#xf001;" horiz-adv-x="1120" d="M80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 440 480q380 0 380 -240q0 -41 -29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5q0 80 -180 80q-280 0 -280 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5 t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5zM880 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xfb01;" horiz-adv-x="1120" d="M80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 440 480q380 0 380 -240q0 -41 -29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5q0 80 -180 80q-280 0 -280 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5 t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5zM880 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1200" d="M80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480q240 0 240 -240v-1200h80q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-160q-33 0 -56.5 23.5t-23.5 56.5v1280q0 80 -80 80q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5 t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xfb02;" horiz-adv-x="1200" d="M80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480q240 0 240 -240v-1200h80q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-160q-33 0 -56.5 23.5t-23.5 56.5v1280q0 80 -80 80q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5 t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xfb03;" horiz-adv-x="2080" d="M1740 1360q0 41 29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5t-29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5zM1760 80v960q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-960q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM880 980q0 33 23.5 56.5 t56.5 23.5h80v60q0 480 480 480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5 t-23.5 56.5zM80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5 v820h-80q-33 0 -56.5 23.5t-23.5 56.5z" />
+<glyph unicode="&#xfb04;" horiz-adv-x="2080" d="M1680 80v1440q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5v-1360h80q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-160q-33 0 -56.5 23.5t-23.5 56.5zM880 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5 t-56.5 -23.5q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5zM80 980q0 33 23.5 56.5t56.5 23.5h80v60q0 480 480 480 q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5q-320 0 -320 -320v-60h241q33 0 56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5h-241v-820q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5v820h-80q-33 0 -56.5 23.5t-23.5 56.5z" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/ihatemoney/static/fonts/comfortaa-regular-webfont.woff b/ihatemoney/static/fonts/comfortaa-regular-webfont.woff
new file mode 100644
index 0000000..10f74d0
--- /dev/null
+++ b/ihatemoney/static/fonts/comfortaa-regular-webfont.woff
Binary files differ
diff --git a/ihatemoney/static/fonts/fontfaces.css b/ihatemoney/static/fonts/fontfaces.css
new file mode 100644
index 0000000..c872f38
--- /dev/null
+++ b/ihatemoney/static/fonts/fontfaces.css
@@ -0,0 +1,26 @@
+/* Generated by Font Squirrel (http://www.fontsquirrel.com) on February 9, 2012 */
+
+
+
+@font-face {
+ font-family: 'Comfortaa';
+ src: url('comfortaa-regular-webfont.eot');
+ src: url('comfortaa-regular-webfont.eot?#iefix') format('embedded-opentype'),
+ url('comfortaa-regular-webfont.woff') format('woff'),
+ url('comfortaa-regular-webfont.svg#ComfortaaRegular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+@font-face {
+ font-family: 'Lobster';
+ src: url('lobster-webfont.eot');
+ src: url('lobster-webfont.eot?#iefix') format('embedded-opentype'),
+ url('lobster-webfont.woff') format('woff'),
+ url('lobster-webfont.svg#Lobster1.4Regular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
diff --git a/ihatemoney/static/fonts/lobster-webfont.eot b/ihatemoney/static/fonts/lobster-webfont.eot
new file mode 100644
index 0000000..d2257df
--- /dev/null
+++ b/ihatemoney/static/fonts/lobster-webfont.eot
Binary files differ
diff --git a/ihatemoney/static/fonts/lobster-webfont.svg b/ihatemoney/static/fonts/lobster-webfont.svg
new file mode 100644
index 0000000..a9f510f
--- /dev/null
+++ b/ihatemoney/static/fonts/lobster-webfont.svg
@@ -0,0 +1,247 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG webfont generated by Font Squirrel.
+Copyright : Copyright c 2010 by Pablo Impallari wwwimpallaricom All rights reserved
+Designer : Pablo Impallari
+Foundry : Pablo Impallari wwwimpallaricom
+Foundry URL : wwwimpallaricom
+</metadata>
+<defs>
+<font id="Lobster1.4Regular" horiz-adv-x="1034" >
+<font-face units-per-em="2048" ascent="1638" descent="-410" />
+<missing-glyph horiz-adv-x="444" />
+<glyph unicode=" " horiz-adv-x="444" />
+<glyph unicode="&#x09;" horiz-adv-x="444" />
+<glyph unicode="&#xa0;" horiz-adv-x="444" />
+<glyph unicode="!" horiz-adv-x="526" d="M70 163.5q0 67.5 48 115t115.5 47.5t114.5 -47.5t47 -114.5t-47 -115.5t-114.5 -48.5t-115.5 48t-48 115.5zM201 473l145 961h295l-266 -961h-174z" />
+<glyph unicode="&#x22;" horiz-adv-x="860" d="M127 1149l125 387h215l-186 -387h-154zM449 1149l124 387h215l-186 -387h-153z" />
+<glyph unicode="#" horiz-adv-x="1350" d="M92 227l43 209h213l43 232h-209l43 209h203l107 593h180l-133 -593h215l106 593h180l-133 -593h213l-41 -209h-217l-51 -232h219l-41 -209h-225l-62 -282h-116l51 282h-242l-61 -282h-117l51 282h-219zM485 436h232l43 232h-223z" />
+<glyph unicode="$" horiz-adv-x="825" d="M49 455q0 79 43.5 127.5t95.5 48.5t74.5 -15.5t22.5 -35.5q-82 -17 -82 -152q0 -45 25.5 -77t60.5 -48l73 402l-76 59q-87 67 -114 119.5t-27 105.5q0 104 98 182t218 82l39 217h118l-51 -223q80 -14 113 -41q65 -50 65 -126q0 -158 -98 -158q-41 0 -80 47q49 29 49 106 q0 23 -15 49.5t-50 40.5l-74 -329l80 -58q152 -105 152 -251.5t-101.5 -225t-267.5 -82.5l-59 -274h-56l49 276q-94 7 -160 60q-65 53 -65 174zM340 1013.5q0 -55.5 57 -114.5l49 277q-60 -14 -83 -60.5t-23 -102zM358 295q73 10 105 63q31 53 31 128.5t-60 148.5z" />
+<glyph unicode="%" horiz-adv-x="1319" d="M219 986q0 200 90 326t242 126q90 0 129 -59.5t39 -189t-83 -276.5t-226 -147q-109 0 -150 58t-41 162zM248 0l790 1536h148l-791 -1536h-147zM367 1016q0 -92 10 -133t47 -41q76 0 124 117.5t48 277.5q0 53 -9 91t-42 38q-51 0 -103 -78q-75 -114 -75 -272zM727 218 q0 202 90 328t242 126q91 0 139.5 -59t48.5 -194.5t-73 -263.5q-87 -155 -251 -155q-114 0 -155 57t-41 161zM864 209q0 -51 10 -92t48 -41q74 0 119.5 109t45.5 260t-57 151q-49 0 -96 -76q-70 -110 -70 -311z" />
+<glyph unicode="&#x26;" horiz-adv-x="1397" d="M23 394q0 164 97 294t273 166q-203 109 -203 311q0 148 124 259.5t331 111.5q157 0 267 -68.5t110 -205.5q0 -189 -143 -189q-72 0 -117 53q34 11 62 68.5t28 85.5q0 166 -135 166q-109 0 -179.5 -74t-70.5 -170.5t62 -188.5q63 -91 208 -157q-184 -77 -270 -185.5 t-86 -223.5t70.5 -195t169.5 -80q195 0 305 199q41 74 65 186l-75 8q-35 4 -70 4q-134 0 -193 -92l-14 2q31 127 133 208t262 81l156 -10q55 0 111.5 20.5t82.5 67.5h13q0 -89 -94 -177.5t-218 -107.5q-123 -443 -389 -542q-83 -31 -219.5 -31t-215.5 35t-132 93 q-106 114 -106 278z" />
+<glyph unicode="'" horiz-adv-x="549" d="M209 1149l125 387h215l-187 -387h-153z" />
+<glyph unicode="(" horiz-adv-x="895" d="M283 205q0 196 47 403q97 432 345 713q127 143 275 215l27 -82q-225 -111 -387 -510q-99 -240 -138 -523q-20 -138 -20 -271q0 -376 150 -603l-68 -59q-231 254 -231 717z" />
+<glyph unicode=")" horiz-adv-x="846" d="M-59 -430q115 57 213 193q202 270 289 703q42 208 42 408q0 378 -149 603l67 59q120 -132 176 -320t56 -392q0 -423 -181 -799q-87 -182 -211.5 -323t-275.5 -214z" />
+<glyph unicode="*" horiz-adv-x="1055" d="M176 1026l223 129l-223 129l62 107l219 -127v276h131v-276l219 127l61 -107l-223 -129l223 -129l-61 -106l-219 127v-277h-131v277l-219 -127z" />
+<glyph unicode="+" horiz-adv-x="1055" d="M109 420l49 229h262l55 250h232l-56 -250h260l-47 -229h-262l-55 -252h-232l56 252h-262z" />
+<glyph unicode="," horiz-adv-x="442" d="M49 143q0 77 46.5 125.5t115.5 48.5q100 0 130 -93q9 -29 9 -68q0 -91 -72.5 -211.5t-193.5 -202.5q-18 12 -18 37q0 33 53 89t53 87t-34 53q-89 58 -89 135z" />
+<glyph unicode="-" horiz-adv-x="594" d="M39 455l37 161h409l-34 -161h-412z" />
+<glyph unicode="." horiz-adv-x="539" d="M63 153q0 67 47 116q48 48 115.5 48t115.5 -48t48 -116t-48.5 -114.5t-115 -46.5t-115.5 47q-47 47 -47 114z" />
+<glyph unicode="/" horiz-adv-x="637" d="M23 -512l434 2048h147l-434 -2048h-147z" />
+<glyph unicode="0" horiz-adv-x="1118" d="M61 486q0 588 293 876q177 174 418 174q365 0 365 -521q0 -360 -169 -676q-190 -357 -496 -357q-236 0 -332 141q-79 118 -79 363zM375 463q0 -309 121 -309q88 0 156 86q135 168 190 539q26 176 26 297q0 204 -18 268q-25 86 -90.5 86t-145.5 -96q-134 -162 -198 -452 q-41 -180 -41 -419z" />
+<glyph unicode="1" horiz-adv-x="649" d="M43 0l270 1278h-194l24 94q115 0 194 20q166 43 327 140l-326 -1532h-295z" />
+<glyph unicode="2" horiz-adv-x="1008" d="M-23 27v34q0 112 49 204q81 152 284 353.5t291 389.5q50 111 50 247q0 76 -40 122t-88 46q-94 0 -128.5 -40t-34.5 -119t42 -124q15 -16 36 -22q-78 -69 -148.5 -69t-112.5 47t-42 118q0 138 104 229t318 91q389 0 389 -330q0 -281 -300 -534l-164 -136 q-81 -65 -151.5 -129.5t-113.5 -134.5h10q92 0 184.5 -18.5t176 -18.5t119.5 9q64 17 123 72l63 61q2 -25 2 -47v-43q0 -163 -49.5 -235.5t-179.5 -72.5t-229.5 25.5t-157 37t-105.5 11.5q-63 0 -114 -23l-78 -34q-5 16 -5 33z" />
+<glyph unicode="3" horiz-adv-x="1053" d="M12 343q0 123 62 206q63 82 194 82t152 -105q-180 -12 -180 -221q0 -152 98 -175q28 -7 75.5 -7t100.5 28.5t90 76.5q76 99 76 241q0 198 -150 320q-51 42 -122 67q162 47 256 164.5t94 234.5q0 168 -174 168q-57 0 -100.5 -43.5t-43.5 -99.5q0 -140 78 -162 q-77 -69 -156 -69q-100 0 -136 99q-11 33 -11 88.5t33 113t90 98.5q120 86 300.5 86t281 -87t100.5 -201t-69.5 -217t-211.5 -175q135 -45 196.5 -136.5t61.5 -201.5q0 -197 -157 -356q-167 -169 -412 -169q-58 0 -122 9q-161 26 -247 150q-47 70 -47 193z" />
+<glyph unicode="4" horiz-adv-x="975" d="M16 563q18 56 47 120l129 277q123 271 123 453q0 64 -14 123q152 0 209 -110q18 -37 18 -109.5t-31.5 -155t-78 -157.5t-98 -145.5t-91.5 -143.5h320l166 780l303 41l-176 -821h131l-41 -152h-123l-119 -563h-295l121 563h-500z" />
+<glyph unicode="5" horiz-adv-x="1059" d="M31 285q0 147 79 218.5t195.5 71.5t136.5 -104q-80 -11 -132 -57t-52 -133.5t56 -124.5q42 -29 109 -29q122 0 192.5 115t70.5 262.5t-60 222t-154.5 74.5t-155.5 -29q-113 -55 -160 -86l168 817q54 -6 102 -12l93 -11q94 -12 173 -12q164 0 332 66q4 -32 4 -74 q0 -98 -55.5 -164.5t-179.5 -66.5q-80 0 -196 23.5t-146 27.5l-82 -371q132 64 241 64q191 0 283 -121t92 -303q0 -234 -140 -386q-160 -173 -454 -173q-360 0 -360 295z" />
+<glyph unicode="6" horiz-adv-x="1018" d="M33 395v37q0 137 32 304t75 286q90 242 248 378t378 136q108 0 171.5 -51t63.5 -110.5t-44 -100.5t-138 -45q33 31 33 72.5t-29 76.5t-73 35q-100 0 -202 -121.5t-172 -401.5q-38 -149 -54.5 -308.5t-16.5 -221.5q0 -126 40 -168t107 -42q118 0 206 134q92 136 92 282 q0 214 -107 214t-182 -155q-41 59 -41 111q0 96 85 154t181 58t148.5 -30.5t85.5 -78.5q65 -92 65 -227q0 -265 -165 -443.5t-388 -178.5q-326 0 -382 250q-17 73 -17 155z" />
+<glyph unicode="7" horiz-adv-x="950" d="M68 246q0 136 52 266q98 240 347 542l246 292q-90 12 -174 12q-295 0 -424 -146q-17 74 -17 122q0 101 65 151.5t214 50.5h672l-195 -298l-260 -414q-143 -239 -162 -281q-65 -151 -65 -264q0 -62 22.5 -107t77.5 -92q-30 -80 -179 -80q-113 0 -166.5 55t-53.5 191z" />
+<glyph unicode="8" horiz-adv-x="1022" d="M-16 392.5q0 159.5 95.5 284.5t272.5 177q-174 101 -174 279q0 153 130.5 277t320.5 124t291.5 -85t101.5 -200.5t-71 -219.5t-216 -175q130 -40 189 -128t59 -170.5t-19 -147.5t-54 -126q-77 -130 -206.5 -211t-287.5 -81q-202 0 -317 121.5t-115 281zM281 340 q0 -95 37.5 -149t98.5 -54q108 0 176.5 103.5t68.5 240.5q0 190 -130 303q-183 -125 -236 -334q-15 -61 -15 -110zM446 1188q0 -169 109 -264q145 94 193 274q14 50 14 103.5t-25.5 94t-76.5 40.5q-96 0 -155 -80.5t-59 -167.5z" />
+<glyph unicode="9" horiz-adv-x="1001" d="M59 184q0 152 177 152q-29 -29 -29 -72t31.5 -77.5t64.5 -34.5t51.5 2t59.5 19t74 47q88 78 157.5 261t93.5 516q4 78 4 107q0 176 -44 236.5t-139 60.5t-176 -141.5t-81 -303.5q0 -84 25.5 -147.5t89.5 -63.5q125 0 172 123q43 -51 43 -102q0 -78 -81 -133t-208 -55 t-200.5 108.5t-73.5 249.5q0 254 153.5 427t376.5 173q395 0 395 -481q0 -310 -83 -549.5t-241.5 -377.5t-369.5 -138q-111 0 -176.5 59.5t-65.5 134.5z" />
+<glyph unicode=":" horiz-adv-x="547" d="M84 276q0 67 46.5 115.5t114.5 48.5t116.5 -48t48.5 -116t-49 -114.5t-116 -46.5t-114 47t-47 114zM186 767.5q0 67.5 47 116.5q48 48 115.5 48t115.5 -48t48 -116.5t-48.5 -115t-115 -46.5t-115.5 47q-47 47 -47 114.5z" />
+<glyph unicode=";" horiz-adv-x="565" d="M94 176q0 77 46.5 125.5t115.5 48.5q100 0 130 -94q9 -28 9 -68q0 -91 -73 -212t-193 -201q-18 12 -18 37q0 33 53 89t53 86t-27 50q-96 62 -96 139zM193 677q0 67 46.5 116t114.5 49t116 -48.5t48 -116.5t-48.5 -114.5t-115.5 -46.5t-114 47t-47 114z" />
+<glyph unicode="&#x3c;" horiz-adv-x="735" d="M41 487l18 84l629 308l-20 -113l-494 -246l397 -196l-24 -117z" />
+<glyph unicode="=" horiz-adv-x="1055" d="M66 207l49 229h753l-47 -229h-755zM156 647l49 230h753l-47 -230h-755z" />
+<glyph unicode="&#x3e;" horiz-adv-x="705" d="M31 207l28 117l492 196l-397 246l18 113l504 -308l-23 -110z" />
+<glyph unicode="?" horiz-adv-x="903" d="M98 163.5q0 67.5 48.5 115t116 47.5t114.5 -47.5t47 -114.5t-47 -115.5t-114.5 -48.5t-116.5 48q-48 48 -48 115.5zM113 1087q0 141 99 234q118 113 331 113q275 0 316 -152q12 -43 12 -80t-1 -40q0 -207 -208 -364l-111 -90q-132 -111 -172 -233h-135q0 120 96 243 q42 52 90 102t90 104q96 127 96 246q0 153 -116 153q-57 0 -108.5 -49t-51.5 -120.5t41 -113.5q15 -16 37 -22q-54 -86 -150 -86q-60 0 -107.5 43t-47.5 112z" />
+<glyph unicode="@" horiz-adv-x="1151" d="M-16 336q0 335 206 570q130 149 308 206q90 28 162 28t126 -10q126 -23 187 -141q33 -64 33 -167t-30 -199.5t-79 -173t-111.5 -123.5t-127 -47t-91.5 47q-53 -80 -121 -80q-131 0 -131 136.5t60 279t131 195.5q37 27 83 27l1 1q45 0 74 -37l8 33l112 -13l-92 -393 q-8 -26 -8 -56t29 -30q80 0 142 339q13 74 13 110q0 79 -34 118q-44 54 -132.5 54t-153.5 -27.5t-118 -74.5q-104 -94 -162.5 -247t-58.5 -297t53 -201t180.5 -57t198.5 32.5t125 103.5q47 -19 47 -80q0 -112 -111 -174q-114 -66 -310.5 -66t-302 94.5t-105.5 319.5z M449 434q0 -63 36 -63q26 0 68 28q0 20 6 43l88 340q-14 17 -48 17t-65 -46q-67 -99 -83 -281q-2 -22 -2 -38z" />
+<glyph unicode="A" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486z" />
+<glyph unicode="B" horiz-adv-x="1313" d="M25 993q0 108 61 204.5t164 172.5q229 166 518 166q214 0 325 -94.5t111 -231.5q0 -92 -52 -180t-153 -145q124 -25 183 -115t59 -215q0 -73 -21 -175q-48 -226 -212 -351q-85 -64 -217.5 -64t-180.5 75q-20 30 -20 78.5t26 117.5q69 -74 132 -74q108 0 163 126 q45 102 45 242q0 261 -194 261q-45 0 -94 -7l-168 -784h-295l278 1303l303 40l-96 -454h12q118 0 206.5 106t88.5 226q0 150 -145 203q-52 18 -118.5 18t-128 -13.5t-117.5 -40.5q-125 -61 -199 -173.5t-74 -270.5q0 -81 25 -125q4 -8 4 -14q-162 0 -204 100q-15 36 -15 88z " />
+<glyph unicode="C" horiz-adv-x="1018" d="M39 457q0 257 85 513q99 302 292 452q148 114 338 114q238 0 315 -149q27 -52 27 -125q0 -189 -144 -189q-72 0 -116 53q37 20 65.5 75t28.5 109.5t-28.5 92t-91 37.5t-116 -42t-100.5 -114q-95 -144 -155 -368t-60 -406.5t53.5 -264t183.5 -81.5q256 0 408 205l47 -21 q-98 -248 -373 -344q-108 -38 -212 -38h-6q-227 2 -334 118t-107 373z" />
+<glyph unicode="D" horiz-adv-x="1358" d="M12 1004q0 61 27.5 128.5t77.5 127.5q102 123 278 199.5t379 76.5q369 0 494 -298q53 -127 53 -298.5t-47 -345.5q-97 -363 -305 -535q-104 -86 -221.5 -86t-243.5 109l-17 -82h-294l278 1303l303 40l-246 -1148q56 -41 117 -41q92 0 165 82q141 159 200 503 q28 158 28 316q0 387 -299 387q-234 0 -385 -135t-151 -363q0 -83 23 -125q5 -8 5 -14q-162 0 -204 101q-15 37 -15 98z" />
+<glyph unicode="E" horiz-adv-x="940" d="M14 332q0 162 105 321t274 201q-125 91 -125 251t130 297.5t319 137.5q127 0 210 -66.5t83 -174t-45 -168t-104 -60.5t-99 55q36 14 63 68t27 113.5t-36 85.5q-37 26 -80 26q-86 0 -146 -88.5t-60 -200.5q0 -154 112 -232q40 -28 95 -42q-156 -34 -261 -187t-105 -302 q0 -86 45 -146.5t148 -60.5t213.5 55t166.5 154l47 -21q-81 -178 -246.5 -281.5t-353 -103.5t-282.5 103.5t-95 265.5z" />
+<glyph unicode="F" horiz-adv-x="940" d="M18 1027q0 79 38 175t122 170q185 164 539 164q67 0 154 -12.5t190 -12.5t180 25l-19 -69q-37 -147 -175 -177q-111 0 -287 39l-86 -407h299l-33 -152h-299l-166 -770h-295l295 1368q-130 -4 -198 -98q-68 -93 -68 -326q0 -81 25 -125q4 -8 4 -14q-165 0 -206 105 q-14 38 -14 117z" />
+<glyph unicode="G" horiz-adv-x="1184" d="M39 748q0 148 49 290q75 213 251.5 355.5t428 142.5t344.5 -149q33 -52 33 -125q0 -189 -144 -189q-95 0 -141 53q34 13 62 69t28 84q0 161 -141 161q-83 0 -166.5 -65t-147 -166t-102.5 -228t-39 -222q0 -174 59 -270t177 -96t176 76l88 389l264 -2l-168 -770 q-52 -253 -169 -381.5t-355 -128.5q-136 0 -210.5 83t-74.5 197t67.5 198.5t169 84.5t137.5 -17q77 -34 77 -120q0 -37 -12 -82q-63 53 -129 53t-102 -49.5t-36 -104t31.5 -98t82.5 -43.5t81 10q92 29 139 242l82 367q-136 -74 -256 -74q-229 0 -340 156q-94 133 -94 369z " />
+<glyph unicode="H" horiz-adv-x="1362" d="M25 1004q0 103 65 198q131 195 396 289q127 45 257 45q42 0 82 -4l-131 -610h301l131 610h295l-325 -1532h-295l164 770h-301l-164 -770h-295l297 1393q-136 -58 -211.5 -171t-75.5 -278q0 -81 25 -125q4 -8 4 -14q-166 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="I" horiz-adv-x="768" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-326 -1532h-294l296 1391q-286 -120 -286 -447q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="J" horiz-adv-x="1098" d="M35 -144.5q0 119.5 67 201.5t168.5 82t137.5 -17q77 -34 77 -120q0 -37 -12 -82q-57 46 -82.5 49.5t-40.5 3.5q-71 0 -107 -47t-36 -96q0 -82 42.5 -117t86.5 -35q83 0 126 49.5t79 202.5l321 1463q-135 -56 -212 -169.5t-77 -279.5q0 -81 25 -125q4 -8 4 -14 q-164 0 -204 105q-15 38 -15 94q0 103 64.5 198.5t166.5 169.5q233 164 488 164h82l-307 -1454q-54 -250 -176.5 -378t-362.5 -128q-148 0 -226 80q-77 80 -77 199.5z" />
+<glyph unicode="K" horiz-adv-x="1231" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-133 -627l450 603l15 18h215l-569 -656l71 2q205 0 242 -132q12 -40 12 -95q0 -83 -50 -265t-50 -237q0 -113 80 -143q-128 -35 -203 -35q-160 0 -160 137q1 72 54.5 262.5t54.5 276.5q0 139 -123 139 q-28 0 -68 -8l-164 -772h-294l296 1393q-136 -58 -211 -171t-75 -278q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="L" horiz-adv-x="776" d="M12 983q0 200 231 368q234 165 488 165q32 0 82 -5l-315 -1470q84 -19 177 -69l149 -81q207 -114 362 -114q94 0 172 33q-16 -146 -72.5 -234t-140.5 -88q-132 0 -313 140l-234 180q-198 145 -367 145h-23q-11 0 -24 -2l305 1419q-136 -55 -211 -167t-75 -279 q0 -83 23 -125q5 -8 5 -15q-164 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="M" horiz-adv-x="1612" d="M137 0l520 1407q-153 -51 -239 -168t-86 -293q0 -88 24 -128q4 -7 4 -13q-219 0 -219 186q0 194 209 371q91 78 208.5 126t214.5 48t175 -29l-47 -1079l451 1079h295l-215 -1507h-295l131 920l-385 -920h-281l41 924l-342 -924h-164z" />
+<glyph unicode="N" horiz-adv-x="1368" d="M12 1005.5q0 57.5 18.5 119.5t53.5 121q76 129 208 209.5t300 80.5q48 0 96.5 -3t93.5 -26l162 -1085l223 1110h295l-325 -1532h-248l-174 1071l-228 -1071h-294l294 1391q-136 -57 -210 -169.5t-74 -277.5q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 95.5z " />
+<glyph unicode="O" horiz-adv-x="1362" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139z" />
+<glyph unicode="P" horiz-adv-x="1174" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 479 164t369 -116t123 -287q0 -98 -40.5 -196t-117.5 -177q-172 -176 -433 -176h-11l-125 -584h-294l278 1303l303 40l-145 -684q150 14 254 172t104 342t-139 247q-48 22 -115 22q-250 0 -390 -131t-140 -367 q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="Q" horiz-adv-x="1362" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -240 -98.5 -502t-292.5 -404q55 -79 94 -109q73 -56 162 -56q21 0 45 4q-41 -107 -93.5 -141.5t-119.5 -34.5q-120 0 -184 79q-38 47 -78 168q-88 -28 -180 -28q-180 0 -278.5 98.5t-98.5 311 t79 450.5q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552q-14 -94 -14 -173v-46q0 -21 4 -42q72 19 144.5 19t146.5 -56q106 132 179 364.5t73 441.5v11q0 191 -54 275t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5 t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM545 238q28 -84 98 -84q43 0 78 22q-43 70 -117 70q-27 0 -59 -8z" />
+<glyph unicode="R" horiz-adv-x="1231" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 474.5 164t360 -94.5t118.5 -233.5q0 -95 -57.5 -190.5t-163.5 -159.5q141 -40 141 -201q0 -95 -50 -277t-50 -237q0 -113 80 -143q-128 -35 -203 -35q-160 0 -160 137q1 72 54.5 262.5t54.5 276.5q0 139 -123 139 q-26 0 -68 -8l-164 -772h-294l278 1303l303 40l-100 -473h16q122 0 206.5 115.5t84.5 252t-123 186.5q-42 18 -134 18t-194 -34t-174 -98q-153 -136 -153 -366q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="S" horiz-adv-x="1167" d="M55 304q0 161 92 251t206 90t163 -69q19 -26 21 -66q-157 0 -218 -103q-22 -37 -22 -83q0 -87 51.5 -145t150.5 -58t165.5 71t66.5 180t-31 179.5t-78 131.5t-101 116.5t-101 112.5q-109 132 -109 257q0 158 136.5 262.5t336.5 104.5q247 0 312 -150q18 -40 18 -113.5 t-45 -131.5t-112.5 -58t-104.5 43q92 53 92 190q0 40 -32.5 82t-119 42t-137.5 -46.5t-51 -121.5t20 -120q36 -83 126 -162l84 -76q112 -100 152 -166q79 -133 79 -270q0 -255 -176 -394q-159 -127 -400 -127q-298 0 -399 191q-35 67 -35 156z" />
+<glyph unicode="T" horiz-adv-x="985" d="M12 1025q0 79 38 175t122 170q185 164 539 164q145 0 230.5 -15t148.5 -23q64 -9 170.5 -9t212.5 43q-10 -260 -256 -260q-93 0 -318 45l-283 -1315h-294l290 1356h-24q-181 0 -274 -84q-111 -100 -111 -330q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 117z " />
+<glyph unicode="U" horiz-adv-x="1466" d="M0 993q0 109 65 207q137 203 420 292q141 44 289 44q45 0 98 -10l-209 -778q-67 -259 -67 -362t31.5 -151.5t120.5 -48.5t129 30q73 55 127 199.5t129 483.5l137 633h289l-136 -639q-78 -381 -160 -561q-98 -215 -263 -292q-118 -54 -258 -54t-215.5 21.5t-122.5 62.5 q-87 79 -87 237t51 368l185 742q-169 -45 -266 -164t-97 -307q0 -87 24 -128q5 -7 5 -13q-162 0 -204 100q-15 36 -15 88z" />
+<glyph unicode="V" horiz-adv-x="1260" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l18 -1260l431 1254h143l-569 -1526h-295l-33 1399q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="W" horiz-adv-x="1970" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l18 -1260l431 1254h260l18 -1254l430 1254h144l-570 -1526h-295l-24 1042l-389 -1042h-295l-33 1399q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="X" horiz-adv-x="1270" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l88 -426l238 420h143l-344 -596l192 -930h-325l-109 512l-297 -512h-125l385 680l-151 719q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="Y" horiz-adv-x="1270" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l178 -733l303 727h136l-398 -895l-135 -631h-328l136 631l-197 768q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="Z" horiz-adv-x="1110" d="M23 0l716 1425l-184 5q-188 0 -188 -46q10 0 22 -14t12 -50q0 -61 -37.5 -89.5t-90.5 -28.5t-75 38.5t-22 79.5q0 86 67 151t185 65h702l-706 -1403l197 -4q71 0 131 7.5t82 37.5q-11 0 -24 13.5t-13 48.5q0 61 37 90.5t90 29.5t76.5 -38t23.5 -78q0 -88 -74 -164 t-188 -76h-739z" />
+<glyph unicode="[" horiz-adv-x="819" d="M-49 -512l434 2048h395l-26 -127h-248l-381 -1794h248l-27 -127h-395z" />
+<glyph unicode="\" horiz-adv-x="741" d="M86 1536h147l435 -2048h-148z" />
+<glyph unicode="]" horiz-adv-x="819" d="M-49 -512l26 127h248l381 1794h-248l27 127h395l-434 -2048h-395z" />
+<glyph unicode="^" horiz-adv-x="862" d="M102 1149l435 387h43l122 -387h-65l-123 164l-321 -164h-91z" />
+<glyph unicode="_" horiz-adv-x="909" d="M74 0l37 162h716l-34 -162h-719z" />
+<glyph unicode="`" horiz-adv-x="412" d="M49 1536h215l60 -387h-154z" />
+<glyph unicode="a" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89z" />
+<glyph unicode="b" horiz-adv-x="909" d="M-14 250q0 55 14 117l219 1026l303 41l-98 -461q92 57 168 57q242 0 242 -350q0 -236 -118 -436q-92 -156 -251 -222q-84 -34 -209.5 -34t-197.5 69t-72 193zM279 281q0 -95 108 -95q90 0 170 170q70 159 70 311t-61 201q-21 17 -40 17q-39 0 -76 -9.5t-53 -27.5 l-112 -520q-6 -26 -6 -47z" />
+<glyph unicode="c" horiz-adv-x="786" d="M-27 313q0 235 119 454q90 165 247 237q81 38 167 38q246 0 246 -186q0 -78 -32 -114.5t-72 -36.5t-77 24q25 66 25 121q0 84 -58.5 84t-123.5 -106q-93 -150 -128 -373q-10 -67 -10 -147q0 -148 141 -148q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379 q-146 0 -233 75.5t-87 249.5z" />
+<glyph unicode="d" horiz-adv-x="1075" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-8l100 471l303 41l-235 -1106q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-128 -367 -411 -367q-177 0 -201 176q-124 -188 -306.5 -188t-246.5 175q-23 63 -23 143.5zM276 335 q0 -149 102 -149q43 0 95.5 41.5t73.5 128.5v11l100 469q-19 71 -84 71t-119 -61q-130 -147 -163 -422q-5 -42 -5 -89z" />
+<glyph unicode="e" horiz-adv-x="786" d="M-27 313q0 234 119 453q91 167 248 238q81 38 168 38q142 0 193 -53.5t51 -142.5q0 -175 -141 -297.5t-330 -134.5q-5 -58 -5 -82q0 -105 37 -138.5t104 -33.5q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379q-146 0 -233 75.5t-87 249.5zM297 512 q118 8 207.5 110t89.5 238q0 74 -51 74q-75 -2 -145 -132.5t-101 -289.5z" />
+<glyph unicode="f" horiz-adv-x="547" d="M-426 -304q0 83 28 132t76 84q70 49 248 104l248 1170q73 348 373 348q95 0 168 -62t73 -159q0 -47 -6 -84h-96q4 32 4 61t-23.5 46.5t-46.5 17.5q-50 0 -91.5 -38.5t-59.5 -129.5l-35 -162h150l-15 -82h-151l-236 -1106q-70 -348 -366 -348q-95 0 -168.5 62.5 t-73.5 145.5zM-313 -262q0 -40 49 -62q15 -6 40.5 -6t57.5 35t51 125l27 119q-109 -38 -150 -71q-75 -62 -75 -140z" />
+<glyph unicode="g" horiz-adv-x="1038" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-12l22 106h295l-203 -950q93 31 153.5 94.5t104.5 198.5h86q-78 -264 -264 -348q-51 -23 -98 -35l-31 -148q-39 -197 -156 -284q-86 -64 -197 -64t-178 49t-67 157q0 187 334 298 l25 108q-107 -112 -246 -112q-186 0 -250 175q-23 63 -23 143.5zM246 -285q0 -41 39 -61q13 -6 38 -6t58 44.5t53 137.5l12 59q-200 -72 -200 -174zM276 335q0 -91 38 -127q22 -22 54 -22q57 0 106 43.5t69 116.5l104 485q0 46 -43 67q-16 9 -41 9q-65 0 -119 -61 q-130 -147 -163 -422q-5 -42 -5 -89z" />
+<glyph unicode="h" d="M-78 0l297 1393l303 41l-110 -516q100 114 239 114q98 0 163 -54t65 -160t-34 -240l-49 -198q-16 -65 -16 -106q0 -88 75 -88q69 0 106 44t73 137h86q-119 -345 -322 -375q-32 -4 -79 -4t-93 20q-128 54 -128 211q0 84 46 268t46 254q0 105 -74 105t-132 -117 q-17 -33 -28 -72l-139 -657h-295z" />
+<glyph unicode="i" horiz-adv-x="547" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187zM180 1296q0 67 46.5 115.5t115 48.5t116.5 -48t48 -116t-48.5 -114.5t-116 -46.5t-114.5 47t-47 114z" />
+<glyph unicode="j" horiz-adv-x="492" d="M-414 -313q0 166 218 260q60 26 118 45l219 1032h295l-203 -950q95 32 155 95t104 198h86q-80 -263 -264 -347q-51 -24 -99 -36l-31 -148q-39 -197 -156 -284q-86 -64 -196.5 -64t-178 49.5t-67.5 149.5zM-301 -285q0 -41 39 -61q13 -6 38 -6t58 44.5t53 137.5l13 59 q-201 -70 -201 -174zM164 1298q0 67 46.5 115.5t114.5 48.5t116 -48t48 -116t-48.5 -114.5t-115.5 -46.5t-114 47t-47 114z" />
+<glyph unicode="k" horiz-adv-x="1061" d="M-78 0l297 1393l303 41l-153 -721l395 311h203l-410 -285q36 9 68 9q113 0 169 -71t56 -169q0 -36 -8 -78l-23 -102q-10 -42 -10 -66q0 -76 83 -76t136 108q16 33 33 73h86q-128 -379 -377 -379q-128 0 -193 60.5t-65 172.5q0 47 12 107l17 80q8 43 8 75q0 99 -74 99 q-58 0 -151 -76l-107 -506h-295z" />
+<glyph unicode="l" horiz-adv-x="547" d="M-16 233q0 58 16 134l219 1026l303 41l-235 -1106q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187z" />
+<glyph unicode="m" horiz-adv-x="1540" d="M-78 0l217 1024h295l-22 -106q102 116 250 116q181 0 210 -176q113 174 285 174q97 0 162 -54t65 -158t-34 -240l-48 -200q-16 -65 -16 -106q0 -88 75 -88q69 0 106 44t73 137h86q-76 -226 -192 -317q-80 -62 -168 -62q-262 0 -262 231q0 84 46 268t46 254q0 105 -74 105 t-132 -117q-17 -33 -28 -72l-139 -657h-295l150 707q6 24 6 51q0 90 -60.5 90t-103 -56.5t-64.5 -134.5l-139 -657h-295z" />
+<glyph unicode="n" d="M-78 0l217 1024h295l-22 -106q100 114 239 114q98 0 163 -54t65 -160t-34 -240l-49 -198q-16 -65 -16 -106q0 -88 75 -88q69 0 106 44t73 137h86q-119 -345 -322 -375q-32 -4 -79 -4t-93 20q-128 54 -128 211q0 84 46 268t46 254q0 105 -74 105t-132 -117 q-17 -33 -28 -72l-139 -657h-295z" />
+<glyph unicode="o" horiz-adv-x="899" d="M-29 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM276 342q0 -99 18 -125.5t38 -33.5t54 -7 q70 0 139 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5z" />
+<glyph unicode="p" horiz-adv-x="958" d="M-186 -512l342 1612h295l-33 -154q102 88 239 88q177 0 231 -170q19 -62 19 -142.5t-9.5 -161t-32.5 -161t-60.5 -154.5t-93.5 -131.5t-132.5 -91.5t-191 -34t-158.5 73l-106 -499zM262 213q18 -47 87.5 -47t124.5 58q107 114 138 326q15 94 15 167q0 170 -103 170 q-35 0 -73.5 -25t-67.5 -76z" />
+<glyph unicode="q" horiz-adv-x="995" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-4l20 98h295l-311 -1462l-310 -74l129 612q-105 -112 -243 -112q-186 0 -250 175q-23 63 -23 143.5zM276 335q0 -149 102 -149q43 0 89.5 37.5t71.5 108.5l108 506q-5 18 -22 43.5 t-72 25.5t-109 -61q-130 -147 -163 -422q-5 -42 -5 -89z" />
+<glyph unicode="r" horiz-adv-x="770" d="M-78 0l217 1024h295l-26 -127q51 45 112.5 86t133 41t107.5 -47t36 -90q0 -74 -39.5 -120t-95.5 -46t-74 25.5t-22 52t-10.5 42t-27.5 15.5q-42 0 -74 -19.5t-73 -58.5l-164 -778h-295z" />
+<glyph unicode="s" horiz-adv-x="782" d="M-66 233.5q0 88.5 34 137.5t75 69q144 258 252 607l303 40q8 -192 16 -321l25 -325q4 -48 4 -95t-8 -82q90 52 147 103h86q-127 -148 -313 -256q-116 -123 -322 -123q-144 0 -221.5 78.5t-77.5 167zM43 293q0 -143 107 -143q196 0 196 190q0 53 -8 125l-12 117 q-11 112 -19 243q-52 -168 -166 -387q47 -22 47 -65.5t-24.5 -75t-66 -31.5t-54.5 27z" />
+<glyph unicode="t" horiz-adv-x="547" d="M-16 233q0 58 16 134l123 575h-68l17 82h67l62 283l303 41l-70 -324h123l-16 -82h-123l-131 -614q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187z" />
+<glyph unicode="u" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -32 -6 -58q0 -84 61 -84q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-130 -379 -411 -379q-183 0 -203 194q-120 -194 -303 -194q-92 0 -156 58q-63 58 -63 187z" />
+<glyph unicode="v" horiz-adv-x="848" d="M-18 229q0 51 10 99l147 696h295l-147 -696q-11 -49 -11 -74q0 -68 70 -68q95 0 181 128q116 171 161 428q12 72 12 128q-5 -11 -29 -15l-21 -4q-9 -1 -15 -1q-36 0 -55 34.5t-19 75.5t31 73t82 32q81 0 112 -51.5t31 -130t-14 -177t-44 -198.5q-67 -225 -199.5 -372.5 t-326.5 -147.5q-116 0 -183.5 59t-67.5 182z" />
+<glyph unicode="w" horiz-adv-x="1354" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -26 -6 -52q0 -90 61 -90q108 0 164 181l139 657h295l-147 -696q-11 -49 -11 -74q0 -68 70 -68q95 0 181 128q116 171 161 428q12 72 12 128q-5 -11 -29 -15l-21 -4q-9 -1 -15 -1q-36 0 -55 34.5t-19 76t30.5 73t82.5 31.5 q81 0 112 -51.5t31 -130t-14 -177t-44 -198.5q-67 -225 -188 -360q-144 -160 -345.5 -160t-237.5 172q-114 -172 -291 -172q-92 0 -156 58q-63 58 -63 187z" />
+<glyph unicode="x" horiz-adv-x="1069" d="M0 367q49 214 91 306t71 141q64 103 143 161.5t160 58.5t121.5 -23.5t73 -71t45.5 -148.5l18 -156q171 191 178 295q-17 -4 -35 -4q-96 0 -96 114q0 54 42 77.5t84 23.5q66 0 97 -56t31 -117.5t-18 -107.5q-33 -88 -142 -212l-125 -140l19 -143q12 -98 35 -129.5 t44 -40.5t48 -9q59 0 110 51t74 130h86q-76 -214 -205 -309q-95 -70 -205 -70h-8q-193 0 -250 356l-282 -344h-148l414 467l-33 229q-17 104 -33.5 137t-45.5 33q-65 0 -143.5 -130.5t-129.5 -368.5h-86z" />
+<glyph unicode="y" horiz-adv-x="995" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -26 -6 -52q0 -90 58.5 -90t99.5 48q40 49 63 120l143 670h295l-203 -950q93 31 153.5 94.5t104.5 198.5h86q-78 -264 -264 -348q-51 -23 -98 -35l-31 -148q-39 -197 -156 -284q-86 -64 -197 -64t-178 49t-67 157 q0 187 334 298l25 110q-106 -114 -246 -114q-92 0 -156 58q-63 58 -63 187zM203 -285q0 -41 39 -61q13 -6 38 -6t58 44.5t53 137.5l12 59q-200 -72 -200 -174z" />
+<glyph unicode="z" horiz-adv-x="877" d="M0 0l522 913h-114q-48 0 -80.5 -5t-32.5 -27q0 -5 3.5 -6t11 -6.5t7.5 -48t-34.5 -68t-64.5 -25.5q-49 0 -77 24t-28 61q0 79 68 145.5t169 66.5h527l-502 -866q13 -1 31 -3l39 -5q46 -5 84 -5q91 0 98 41q-39 4 -39 43q0 30 28 59t86 29q91 0 91 -98q0 -79 -70 -149 t-180 -70h-543z" />
+<glyph unicode="{" horiz-adv-x="721" d="M61 -290.5q0 75.5 30 152.5t70 158l80 166q66 140 66 217q0 64 -84 64q-26 0 -65 -6l24 117q35 -7 74 -7q75 0 108 77q19 49 19 151l-14 325q0 142 72 264q87 148 255 148h88l-18 -102q-107 0 -138 -18t-48 -36q-56 -61 -74.5 -129.5t-20.5 -152.5l13 -350 q-7 -165 -82 -228q24 -29 24 -84.5t-28 -123.5l-101 -220q-114 -234 -114 -346q0 -164 174 -164l-19 -92h-18q-103 0 -149 14.5t-85 72t-39 133z" />
+<glyph unicode="|" horiz-adv-x="1090" d="M449 -512v2050h190v-2050h-190z" />
+<glyph unicode="}" horiz-adv-x="721" d="M61 -510l19 102q104 0 136 18q138 78 144 318l-12 351q7 164 82 227q-24 28 -24 85.5t43 156.5t83.5 183.5t78.5 178t38 170.5q0 164 -174 164l19 92h18q101 0 148 -13.5t85.5 -71t38.5 -122t-14 -115.5q-25 -91 -86 -208l-54 -110q-91 -192 -91 -273q0 -64 84 -64 q24 0 65 6l-24 -116q-38 6 -76 6q-73 0 -106 -77q-19 -49 -19 -151l14 -325q0 -142 -72 -264q-87 -148 -255 -148h-89z" />
+<glyph unicode="~" horiz-adv-x="883" d="M100 1192q104 201 342 201q82 0 150.5 -23.5t106 -34t81.5 -10.5q82 0 129 47l13 -2q-19 -76 -118 -140q-100 -65 -190 -65q-91 0 -167 26t-116 38t-83 12q-77 0 -135 -53z" />
+<glyph unicode="&#xa1;" horiz-adv-x="449" d="M-125 -508l266 961h174l-145 -961h-295zM121 761q0 67 46.5 116t114.5 49t116 -48.5t48 -116.5t-48.5 -114.5t-115.5 -46.5t-114 47t-47 114z" />
+<glyph unicode="&#xa2;" horiz-adv-x="825" d="M63 647q0 218 113.5 380.5t312.5 191.5l46 251h118l-55 -249q126 -7 168 -77q16 -26 16 -61.5t-10 -68.5h-117q11 39 11 57q0 70 -76 70h-10l-156 -703q10 -2 31 -2q82 0 130 32q87 59 140 107q-23 -129 -101.5 -200.5t-230.5 -77.5l-78 -352h-55l64 354 q-114 17 -187.5 107t-73.5 241zM279 672q0 -148 75 -203l113 625q-128 -103 -174 -314q-14 -64 -14 -108z" />
+<glyph unicode="&#xa3;" horiz-adv-x="952" d="M51 686q70 138 215 182l148 605l307 63l-164 -678l84 -26q41 -13 106.5 -13t112.5 47l12 -2q-17 -75 -116 -140t-213 -65h-33l-115 -473q36 5 70.5 6t69.5 2q85 4 161.5 29.5t177.5 100.5q-16 -148 -72 -236t-140 -88h-605l176 733l-34 2q-77 0 -136 -53z" />
+<glyph unicode="&#xa4;" horiz-adv-x="1024" d="M139 1008l78 73l115 -114q83 61 185.5 61t182.5 -59l115 114l74 -73l-113 -113q62 -85 62 -187.5t-62 -187.5l113 -112l-74 -74l-113 113q-78 -60 -182.5 -60t-189.5 62l-115 -115l-74 74l115 114q-59 79 -59 183.5t59 183.5zM313 709.5q0 -85.5 59 -146.5 q61 -59 146.5 -59t145 59.5t59.5 145.5t-59.5 145t-145 59t-145.5 -59t-60 -144.5z" />
+<glyph unicode="&#xa5;" horiz-adv-x="971" d="M39 291l29 102h196l29 133h-203l29 103h196v2l-229 905h336l180 -739l307 739h135l-401 -905v-2h268l-28 -103h-262l-29 -133h268l-29 -102h-262l-61 -291h-328l62 291h-203z" />
+<glyph unicode="&#xa6;" horiz-adv-x="1090" d="M449 455h190v-967h-190v967zM449 616v922h190v-922h-190z" />
+<glyph unicode="&#xa7;" horiz-adv-x="1110" d="M16 158q0 111 56 182q57 70 129.5 70t109 -33.5t64.5 -69.5q-134 -12 -157 -89q-9 -27 -9 -86.5t38 -99.5t122 -40q172 0 172 198q-3 158 -118 276l-134 124q-117 104 -117 213.5t61.5 184t151.5 108.5q-11 47 -11 110.5t40 133.5q74 129 238 174q87 23 167.5 23 t151.5 -31q104 -44 104 -161t-78 -157q-25 -12 -64 -12t-69 32q35 21 54.5 60.5t19.5 71.5q0 58 -29.5 89t-78.5 31q-89 0 -144 -66t-55 -153q0 -117 127 -221q36 -30 75 -59q93 -69 148 -147t55 -197.5t-63 -217t-174 -120.5v-7q0 -176 -117.5 -279.5t-327.5 -103.5 q-256 0 -321 165q-17 44 -17 104zM389 926q0 -45 25 -82.5t63.5 -74.5t86.5 -77q185 -154 222 -317q39 49 39 133q0 136 -138 248l-147 117q-66 51 -112 122q-39 -24 -39 -69z" />
+<glyph unicode="&#xa8;" horiz-adv-x="803" d="M115 1297q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-66 0 -101.5 35.5t-35.5 87.5zM483 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
+<glyph unicode="&#xa9;" horiz-adv-x="1202" d="M104 678q0 220 146 372t350 152t350 -152.5t146 -369.5t-146 -370.5t-350.5 -153.5t-350 152t-145.5 370zM199 678q0 -183 117.5 -309.5t286.5 -126.5t287 126t118 310t-118.5 310t-287 126t-286 -126.5t-117.5 -309.5zM311 689q0 129 88.5 215.5t214.5 86.5 q98 -5 166.5 -59t87.5 -135l-96 -37l-14 40q-31 85 -140 85q-78 0 -136 -46t-58 -140.5t57 -157t137 -62.5q48 0 90 24.5t64 67.5l90 -59q-43 -66 -109.5 -102.5t-135.5 -36.5q-129 0 -217.5 93.5t-88.5 222.5z" />
+<glyph unicode="&#xaa;" horiz-adv-x="707" d="M88 1120q0 47 15 121t51 134.5t96 99t126 38.5t103 -28l6 31h170l-86 -377q-2 -11 -4 -19t-2 -18q0 -41 43 -41h14q9 0 17 4q-26 -73 -59 -87.5t-64 -14.5q-94 0 -119 81q-72 -88 -173 -88q-134 0 -134 164zM248 1126q0 -49 24 -63t45 -14q37 0 74 53l76 330 q-23 20 -58 20q-67 0 -114 -103t-47 -223z" />
+<glyph unicode="&#xab;" horiz-adv-x="1206" d="M41 487l18 84l629 308l-20 -113l-494 -246l397 -196l-24 -117zM471 487l18 84l629 308l-20 -113l-494 -246l397 -196l-24 -117z" />
+<glyph unicode="&#xac;" horiz-adv-x="909" d="M39 455l37 161h741l-104 -512h-232l72 351h-514z" />
+<glyph unicode="&#xad;" horiz-adv-x="594" d="M39 455l37 161h409l-34 -161h-412z" />
+<glyph unicode="&#xae;" horiz-adv-x="1133" d="M70 684.5q0 217.5 144 370.5t349.5 153t351.5 -152.5t146 -369.5t-146 -370.5t-350.5 -153.5t-349.5 152q-145 153 -145 370.5zM164 684q0 -183 117.5 -309.5t286.5 -126.5t287 126t118 310t-118.5 310t-287 126t-286 -126.5t-117.5 -309.5zM360 393l2 596h193 q109 0 177.5 -44t68.5 -128q0 -57 -33.5 -99t-87.5 -59l133 -256l-96 -14l-127 256h-135v-252h-95zM455 723h106q146 0 146 90q0 71 -99 87q-26 5 -51 5h-102v-182z" />
+<glyph unicode="&#xb0;" horiz-adv-x="643" d="M76 984q0 202 90 328t242 126q90 0 128.5 -59.5t38.5 -190t-82.5 -276.5t-226.5 -146q-107 0 -148.5 57t-41.5 161zM223 1016.5q0 -92.5 10 -133.5t48 -41q75 0 123.5 117.5t48.5 277.5q0 55 -9.5 92t-42.5 37q-50 0 -102 -78q-26 -38 -51 -108.5t-25 -163z" />
+<glyph unicode="&#xb1;" horiz-adv-x="1092" d="M63 139l37 162h752l-35 -162h-754zM170 633l49 229h262l56 250h231l-55 -250h260l-47 -229h-262l-56 -252h-231l55 252h-262z" />
+<glyph unicode="&#xb2;" horiz-adv-x="614" d="M6 760.5q0 38.5 29 89t72.5 98t94 94t94.5 98.5q101 120 101 244q0 62 -45 84q-13 7 -34 7q-49 0 -69 -22t-20 -49q0 -82 45 -93q-45 -39 -86 -39t-65.5 25.5t-24.5 64.5q0 74 60 123t186 49q225 0 225 -176q0 -92 -51 -161t-124 -129l-141 -110q-71 -51 -108 -106h9 q57 0 114.5 -10.5t115 -10.5t78.5 15q45 33 77 63q0 -123 -16 -155q-30 -60 -126 -60q-64 0 -149 20.5t-120 20.5t-48 -4t-25.5 -9t-24 -11t-20.5 -9q-4 20 -4 58.5z" />
+<glyph unicode="&#xb3;" horiz-adv-x="647" d="M27 888q0 69 35.5 114t111.5 45t90 -56q-93 -10 -102 -87q-2 -22 -2 -46q0 -88 95 -88q71 0 113 57.5t42 127.5t-36.5 129.5t-117.5 84.5q94 24 148.5 89t54.5 116q0 101 -76 101q-107 0 -107 -89q0 -40 17 -56t29 -19q-47 -39 -87 -39t-65 25.5t-25 64.5q0 73 66 122.5 t180 49.5t166.5 -48t52.5 -108q0 -135 -161 -211q78 -22 112.5 -71t34.5 -104q0 -108 -89.5 -200t-215.5 -92q-172 0 -237 84q-27 35 -27 104z" />
+<glyph unicode="&#xb4;" horiz-adv-x="647" d="M246 1149l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xb5;" d="M-150 -340l289 1364h295l-147 -696q-6 -26 -6 -52q0 -90 61 -90q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-128 -367 -411 -367q-181 0 -201 184q-114 -184 -293 -184l-55 -266z" />
+<glyph unicode="&#xb6;" horiz-adv-x="1110" d="M147 1006q0 205 136 366q136 162 387 162t338 -182q30 -64 30 -142q0 -77 -16 -161l-260 -1215h-193l166 778q-35 -13 -88 -22l-158 -756h-192l158 756q-149 27 -229 146q-79 118 -79 270zM670 694h12q38 0 72 8l98 465q12 58 12 103q0 84 -47 127z" />
+<glyph unicode="&#xb7;" horiz-adv-x="889" d="M246 546q0 82 57 140q57 59 139 59t140 -59q59 -58 59 -139q0 -82 -59 -139q-59 -58 -140.5 -58t-138.5 58q-57 57 -57 138z" />
+<glyph unicode="&#xb8;" horiz-adv-x="465" d="M0 -389q38 65 76 65q53 0 91.5 -27.5t65.5 -27.5t44.5 26.5t17.5 57.5t-18.5 53.5t-68 22.5t-99.5 -25l108 303l72 -47l-60 -147q64 16 109 16q127 0 127 -103t-74.5 -163.5t-161.5 -60.5t-123.5 12.5t-59.5 23.5z" />
+<glyph unicode="&#xb9;" horiz-adv-x="444" d="M45 707l158 690h-113l14 51q108 0 177.5 28.5t124.5 57.5l-189 -827h-172z" />
+<glyph unicode="&#xba;" horiz-adv-x="674" d="M86 1138q0 189 89 288.5t222 99.5q42 0 77.5 -14t35.5 -37t-17.5 -34t-35.5 -18q-17 39 -50 39t-56 -17t-41 -45q-33 -54 -49.5 -126t-16.5 -127q0 -84 84 -84q92 0 121 221q-31 7 -31 41t25 61t51 27t34.5 -8t8.5 -31q28 18 49 45l18 21l12 -23q-32 -89 -79 -117 q-9 -159 -90.5 -252.5t-176 -93.5t-139.5 42t-45 142z" />
+<glyph unicode="&#xbb;" horiz-adv-x="1200" d="M31 207l28 117l492 196l-397 246l18 113l504 -308l-23 -110zM485 207l29 117l492 196l-398 246l19 113l503 -308l-22 -110z" />
+<glyph unicode="&#xbc;" horiz-adv-x="1411" d="M143 461l158 690h-113l14 51q108 0 177.5 28.5t124.5 57.5l-189 -827h-172zM285 -338l540 1874h148l-541 -1874h-147zM766 307q15 45 44 99q128 241 128 358q0 35 -8 67q52 0 92.5 -25.5t40.5 -78.5q0 -108 -122 -263q-30 -38 -52 -77h184l96 422l177 22l-103 -444h78 l-25 -80h-71l-70 -305h-170l70 305h-289z" />
+<glyph unicode="&#xbd;" horiz-adv-x="1382" d="M143 461l158 690h-113l14 51q108 0 177.5 28.5t124.5 57.5l-189 -827h-172zM274 -338l541 1874h148l-541 -1874h-148zM749 64.5q0 38.5 29 89t72.5 98t93.5 94.5q196 180 196 342q0 62 -45 84q-13 7 -35 7q-47 0 -67.5 -22t-20.5 -49q0 -82 45 -93q-45 -39 -86 -39 t-65.5 25.5t-24.5 64.5q0 74 60 123t186 49q225 0 225 -176q0 -92 -51 -161t-124 -129l-141 -110q-71 -51 -108 -106h9q57 0 114.5 -10.5t115 -10.5t79.5 15q44 33 76 63q0 -123 -16 -155q-30 -60 -126 -60q-64 0 -148 20.5t-120.5 20.5t-56 -6t-36.5 -15t-26 -12 q-4 20 -4 58.5z" />
+<glyph unicode="&#xbe;" horiz-adv-x="1677" d="M125 642q0 69 35.5 114t111.5 45t90 -56q-93 -10 -102 -87q-2 -22 -2 -46q0 -88 95 -88q71 0 113 57.5t42 127.5t-36.5 129.5t-117.5 84.5q94 24 148.5 89t54.5 116q0 101 -76 101q-107 0 -107 -89q0 -40 17 -56t29 -19q-47 -39 -87 -39t-65 25.5t-25 64.5q0 73 66 122.5 t180 49.5t166.5 -48t52.5 -108q0 -135 -161 -211q78 -22 112.5 -71t34.5 -104q0 -108 -89.5 -200t-215.5 -92q-172 0 -237 84q-27 35 -27 104zM522 -338l541 1874h147l-540 -1874h-148zM1010 307q15 45 44 99l56 114q72 148 72 244q0 35 -8 67q52 0 92.5 -25.5t40.5 -78.5 q0 -108 -122 -263q-30 -38 -52 -77h184l96 422l176 22l-102 -444h78l-25 -80h-72l-69 -305h-170l69 305h-288z" />
+<glyph unicode="&#xbf;" horiz-adv-x="899" d="M25 -238.5q0 70.5 27 138.5q48 120 170 221l110 93q135 117 186 239h135q0 -120 -97 -243q-41 -53 -89 -103t-89 -104q-97 -126 -97 -244q0 -154 115 -154q61 0 111 48.5t50 120t-42 114.5q-15 16 -36 22q54 86 150 86q60 0 107.5 -43.5t47.5 -112.5q0 -139 -98 -233 q-119 -113 -332 -113q-262 0 -314 153q-15 44 -15 114.5zM473 762v2q0 66 46.5 115t114.5 49t116.5 -48.5t48.5 -115.5v-2q0 -69 -49 -115.5t-116 -46.5t-114 47t-47 115z" />
+<glyph unicode="&#xc0;" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM895 2048h215l60 -387h-154z" />
+<glyph unicode="&#xc1;" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM996 1661l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xc2;" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM834 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
+<glyph unicode="&#xc3;" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM838 1704q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2 q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53z" />
+<glyph unicode="&#xc4;" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM881 1809q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35 q-66 0 -101.5 35.5t-35.5 87.5zM1249 1809q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
+<glyph unicode="&#xc5;" horiz-adv-x="1368" d="M18 684q0 106 119 180q121 74 299 74q41 0 107 -6q166 261 352.5 432.5t359.5 171.5q104 0 162 -29l-321 -1507h-295l157 743q-136 62 -274 74q-184 -407 -246 -747q-20 -109 -20 -186.5t28 -116.5q-121 0 -170 25q-104 52 -104 192q0 212 178 596q56 120 123 237 q-96 -6 -157.5 -29.5t-82.5 -76.5q9 0 18 -20.5t9 -50.5t-33.5 -51.5t-70.5 -21.5q-67 0 -102.5 31.5t-35.5 85.5zM727 905q143 -28 250 -71l119 557q-176 -96 -369 -486zM993 1770q0 129 94 183q33 19 94.5 19t97.5 -46.5t36 -112.5t-40.5 -118.5t-122 -52.5t-120.5 42 t-39 86zM1075 1790q0 -76 70 -76q94 0 94 94q0 67 -30 88q-14 9 -38 9q-52 0 -74 -38t-22 -77z" />
+<glyph unicode="&#xc6;" horiz-adv-x="1565" d="M18 685q0 105 121 176t279 71q53 0 121 -6q258 421 530 563q94 49 184 49q42 0 85 -6l88 -14q124 -21 196 -21q123 0 240 39l-23 -74q-46 -151 -197 -151q-78 0 -136 21l-117 44l-111 -518h317l-41 -151h-309l-104 -490h458l-43 -217h-755l157 743q-148 66 -276 74 q-180 -394 -244 -744q-20 -109 -20 -169t4.5 -80.5t9.5 -30.5t9.5 -14t4.5 -10q-139 5 -183 31q-91 53 -91 198q0 204 178 584q56 118 123 235q-92 -6 -154.5 -28.5t-85.5 -77.5q9 0 18 -20.5t9 -48.5t-29.5 -51.5t-85 -23.5t-91.5 30t-36 88zM723 903q131 -24 254 -69 l119 557q-184 -102 -373 -488z" />
+<glyph unicode="&#xc7;" horiz-adv-x="1018" d="M39 457q0 257 85 513q99 302 292 452q148 114 338 114q238 0 315 -149q27 -52 27 -125q0 -189 -144 -189q-72 0 -116 53q37 20 65.5 75t28.5 109.5t-28.5 92t-91 37.5t-116 -42t-100.5 -114q-95 -144 -155 -368t-60 -406.5t53.5 -264t183.5 -81.5q256 0 408 205l47 -21 q-98 -248 -373 -344q-74 -26 -151 -34l-42 -105q64 16 109 16q127 0 127 -103t-74.5 -163.5t-161.5 -60.5t-123.5 12.5t-59.5 23.5l-46 21q38 65 76 65q53 0 91.5 -27.5t65.5 -27.5t44.5 26.5t17.5 57.5t-18.5 53.5t-68 22.5t-99.5 -25l75 212q-210 4 -315.5 118t-105.5 371 z" />
+<glyph unicode="&#xc8;" horiz-adv-x="940" d="M14 332q0 162 105 321t274 201q-125 91 -125 251t130 297.5t319 137.5q127 0 210 -66.5t83 -174t-45 -168t-104 -60.5t-99 55q36 14 63 68t27 113.5t-36 85.5q-37 26 -80 26q-86 0 -146 -88.5t-60 -200.5q0 -154 112 -232q40 -28 95 -42q-156 -34 -261 -187t-105 -302 q0 -86 45 -146.5t148 -60.5t213.5 55t166.5 154l47 -21q-81 -178 -246.5 -281.5t-353 -103.5t-282.5 103.5t-95 265.5zM516 2048h215l60 -387h-154z" />
+<glyph unicode="&#xc9;" horiz-adv-x="940" d="M14 332q0 162 105 321t274 201q-125 91 -125 251t130 297.5t319 137.5q127 0 210 -66.5t83 -174t-45 -168t-104 -60.5t-99 55q36 14 63 68t27 113.5t-36 85.5q-37 26 -80 26q-86 0 -146 -88.5t-60 -200.5q0 -154 112 -232q40 -28 95 -42q-156 -34 -261 -187t-105 -302 q0 -86 45 -146.5t148 -60.5t213.5 55t166.5 154l47 -21q-81 -178 -246.5 -281.5t-353 -103.5t-282.5 103.5t-95 265.5zM676 1661l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xca;" horiz-adv-x="940" d="M14 332q0 162 105 321t274 201q-125 91 -125 251t130 297.5t319 137.5q127 0 210 -66.5t83 -174t-45 -168t-104 -60.5t-99 55q36 14 63 68t27 113.5t-36 85.5q-37 26 -80 26q-86 0 -146 -88.5t-60 -200.5q0 -154 112 -232q40 -28 95 -42q-156 -34 -261 -187t-105 -302 q0 -86 45 -146.5t148 -60.5t213.5 55t166.5 154l47 -21q-81 -178 -246.5 -281.5t-353 -103.5t-282.5 103.5t-95 265.5zM414 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
+<glyph unicode="&#xcb;" horiz-adv-x="940" d="M14 332q0 162 105 321t274 201q-125 91 -125 251t130 297.5t319 137.5q127 0 210 -66.5t83 -174t-45 -168t-104 -60.5t-99 55q36 14 63 68t27 113.5t-36 85.5q-37 26 -80 26q-86 0 -146 -88.5t-60 -200.5q0 -154 112 -232q40 -28 95 -42q-156 -34 -261 -187t-105 -302 q0 -86 45 -146.5t148 -60.5t213.5 55t166.5 154l47 -21q-81 -178 -246.5 -281.5t-353 -103.5t-282.5 103.5t-95 265.5zM488 1809q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-66 0 -101 35.5t-35 87.5zM856 1809q0 53 36 89.5t88 36.5t89 -36.5 t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
+<glyph unicode="&#xcc;" horiz-adv-x="768" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-326 -1532h-294l296 1391q-286 -120 -286 -447q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM350 2048h215l60 -387h-154z" />
+<glyph unicode="&#xcd;" horiz-adv-x="768" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-326 -1532h-294l296 1391q-286 -120 -286 -447q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM551 1661l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xce;" horiz-adv-x="768" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-326 -1532h-294l296 1391q-286 -120 -286 -447q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM309 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
+<glyph unicode="&#xcf;" horiz-adv-x="768" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l-326 -1532h-294l296 1391q-286 -120 -286 -447q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM342 1809q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35 q-66 0 -101 35.5t-35 87.5zM710 1809q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
+<glyph unicode="&#xd0;" horiz-adv-x="1358" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q590 0 590 -553q0 -201 -46 -381q-97 -379 -307 -546q-103 -83 -220.5 -83t-243.5 109l-17 -82h-294l151 707h-80l41 151h72l94 445l303 40l-104 -485h161l-40 -151h-154l-109 -512q56 -41 117 -41q92 0 165 82 q140 157 200 500q28 155 28 278t-11 198t-42 126q-63 104 -229 104q-252 0 -402 -134q-151 -134 -151 -364q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94z" />
+<glyph unicode="&#xd1;" horiz-adv-x="1405" d="M12 1005.5q0 57.5 18.5 119.5t53.5 121q76 129 208 209.5t300 80.5q48 0 96.5 -3t93.5 -26l162 -1085l223 1110h295l-325 -1532h-248l-174 1071l-228 -1071h-294l294 1391q-136 -57 -210 -169.5t-74 -277.5q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 95.5z M631 1704q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53z" />
+<glyph unicode="&#xd2;" horiz-adv-x="1348" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM598 2048h215l60 -387h-154z" />
+<glyph unicode="&#xd3;" horiz-adv-x="1348" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM813 1661l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xd4;" horiz-adv-x="1348" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM557 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
+<glyph unicode="&#xd5;" horiz-adv-x="1348" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM561 1704q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2 q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53z" />
+<glyph unicode="&#xd6;" horiz-adv-x="1348" d="M33 983q0 100 68 201q145 212 447 306q150 46 310 46q485 0 485 -524q0 -353 -177 -660q-126 -221 -336 -316q-108 -48 -215.5 -48t-174.5 22q-219 74 -219 389q0 211 79 449q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552 q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139zM590 1809q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35 q-66 0 -101 35.5t-35 87.5zM958 1809q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
+<glyph unicode="&#xd7;" horiz-adv-x="1055" d="M201 338l194 194l-194 195l133 131l192 -194l197 196l131 -133l-195 -195l195 -194l-131 -133l-197 194l-192 -192z" />
+<glyph unicode="&#xd8;" horiz-adv-x="1348" d="M31 913q0 101 65 196q137 196 432 285q146 44 299 44h25q12 0 25 -2l22 100h107l-25 -115q313 -73 313 -475q0 -120 -35 -278q-74 -333 -301 -537q-117 -105 -278 -133l-31 -143h-106l28 133h-4q-254 0 -328 208q-26 74 -26 165t15 188t44 197q67 224 180 364 q131 164 296 164q47 0 92 -14l18 83q-32 7 -112 7t-183 -34.5t-181 -98.5q-171 -140 -171 -361q0 -55 10 -73t10 -29q-97 0 -135 27t-51.5 57.5t-13.5 74.5zM506 374q0 -211 98 -231l234 1106q-66 -44 -110 -121q-138 -239 -195 -518q-27 -135 -27 -236zM719 180 q126 94 219.5 344t93.5 490q0 102 -15.5 172.5t-62.5 111.5z" />
+<glyph unicode="&#xd9;" horiz-adv-x="1473" d="M0 993q0 109 65 207q137 203 420 292q141 44 289 44q45 0 98 -10l-209 -778q-67 -259 -67 -362t31.5 -151.5t120.5 -48.5t129 30q73 55 127 199.5t129 483.5l137 633h289l-136 -639q-78 -381 -160 -561q-98 -215 -263 -292q-118 -54 -258 -54t-215.5 21.5t-122.5 62.5 q-87 79 -87 237t51 368l185 742q-169 -45 -266 -164t-97 -307q0 -87 24 -128q5 -7 5 -13q-162 0 -204 100q-15 36 -15 88zM840 2048h215l60 -387h-154z" />
+<glyph unicode="&#xda;" horiz-adv-x="1473" d="M0 993q0 109 65 207q137 203 420 292q141 44 289 44q45 0 98 -10l-209 -778q-67 -259 -67 -362t31.5 -151.5t120.5 -48.5t129 30q73 55 127 199.5t129 483.5l137 633h289l-136 -639q-78 -381 -160 -561q-98 -215 -263 -292q-118 -54 -258 -54t-215.5 21.5t-122.5 62.5 q-87 79 -87 237t51 368l185 742q-169 -45 -266 -164t-97 -307q0 -87 24 -128q5 -7 5 -13q-162 0 -204 100q-15 36 -15 88zM924 1661l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xdb;" horiz-adv-x="1473" d="M0 993q0 109 65 207q137 203 420 292q141 44 289 44q45 0 98 -10l-209 -778q-67 -259 -67 -362t31.5 -151.5t120.5 -48.5t129 30q73 55 127 199.5t129 483.5l137 633h289l-136 -639q-78 -381 -160 -561q-98 -215 -263 -292q-118 -54 -258 -54t-215.5 21.5t-122.5 62.5 q-87 79 -87 237t51 368l185 742q-169 -45 -266 -164t-97 -307q0 -87 24 -128q5 -7 5 -13q-162 0 -204 100q-15 36 -15 88zM743 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
+<glyph unicode="&#xdc;" horiz-adv-x="1473" d="M0 993q0 109 65 207q137 203 420 292q141 44 289 44q45 0 98 -10l-209 -778q-67 -259 -67 -362t31.5 -151.5t120.5 -48.5t129 30q73 55 127 199.5t129 483.5l137 633h289l-136 -639q-78 -381 -160 -561q-98 -215 -263 -292q-118 -54 -258 -54t-215.5 21.5t-122.5 62.5 q-87 79 -87 237t51 368l185 742q-169 -45 -266 -164t-97 -307q0 -87 24 -128q5 -7 5 -13q-162 0 -204 100q-15 36 -15 88zM764 1809q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-66 0 -101 35.5t-35 87.5zM1132 1809q0 53 36 89.5t88 36.5 t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
+<glyph unicode="&#xdd;" horiz-adv-x="1270" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l178 -733l303 727h136l-398 -895l-135 -631h-328l136 631l-197 768q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM928 1661l186 387h215l-248 -387h-153 z" />
+<glyph unicode="&#xde;" horiz-adv-x="1194" d="M12 788q0 65 36 138t98 136q127 132 315 200l51 233l303 41l-49 -225q222 -11 335 -125t113 -279q0 -208 -164 -378.5t-427 -170.5h-60l-76 -358h-294l245 1151q-235 -123 -235 -432q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 103zM580 434h28q102 0 194 81 q129 114 172 308q13 59 13 115q0 119 -59.5 196t-179.5 83z" />
+<glyph unicode="&#xdf;" horiz-adv-x="922" d="M-174 -512l340 1597q39 197 158 284q89 65 219.5 65t203 -76t72.5 -174.5t-48.5 -182.5t-139.5 -127q108 -36 153 -117t45 -179.5t-18.5 -182.5t-48.5 -149q-57 -118 -146.5 -181t-175.5 -65q-35 0 -67 4l26 121q137 0 197 260q27 111 27 241q0 68 -32 112t-116 67 l37 119q64 26 117 81t53 130t-18.5 96.5t-47.5 21.5q-54 0 -95.5 -38t-59.5 -130l-326 -1523z" />
+<glyph unicode="&#xe0;" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89zM442 1536h215l60 -387h-154z" />
+<glyph unicode="&#xe1;" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89zM502 1149l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xe2;" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89zM299 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
+<glyph unicode="&#xe3;" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM209 1192 q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53zM276 335q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61 q-130 -147 -163 -422q-5 -42 -5 -89z" />
+<glyph unicode="&#xe4;" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89zM369 1297q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-66 0 -101.5 35.5t-35.5 87.5zM737 1297 q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
+<glyph unicode="&#xe5;" horiz-adv-x="1077" d="M-27 306.5q0 80.5 14 161t43 160.5q64 176 183 291t287 115q88 0 127 -29.5t39 -74.5v-15l22 109h295l-147 -696q-9 -35 -9 -66q0 -88 84 -88q109 0 166 193h86q-130 -379 -411 -379q-181 0 -201 188q-134 -188 -312.5 -188t-242.5 175q-23 63 -23 143.5zM276 335 q0 -91 38 -127q22 -22 55 -22q61 0 111 48.5t69 132.5l98 462q0 19 -17.5 48.5t-74.5 29.5t-111 -61q-130 -147 -163 -422q-5 -42 -5 -89zM479 1258q0 129 94 183q33 19 94.5 19t97.5 -46.5t36 -112.5t-40.5 -118.5t-122 -52.5t-120.5 42t-39 86zM561 1278q0 -76 70 -76 q94 0 94 94q0 67 -30 88q-14 9 -38 9q-52 0 -74 -38t-22 -77z" />
+<glyph unicode="&#xe6;" horiz-adv-x="1331" d="M-16 261q0 172 122.5 252.5t331.5 80.5q69 0 107 -8q43 92 43 186t-68 128q-24 11 -87 11q-111 0 -218 -96l-57 59q144 147 287 157q42 3 85 3q164 0 267 -82q118 90 288.5 90t201.5 -124q9 -37 9 -100.5t-39 -138.5t-104 -132q-138 -121 -328 -133q-4 -34 -4 -66 q0 -115 34 -151.5t99 -36.5q126 0 201 47t176 160h70q-228 -375 -565 -375q-248 0 -301 192q-50 -92 -95 -128q-85 -68 -196 -68q-176 0 -236 134q-24 51 -24 139zM272 300q0 -71 31.5 -92.5t60.5 -21.5q58 0 97 61t69 220q-10 2 -17 2h-17q-102 0 -163 -49t-61 -120z M840 512q117 8 208 108.5t91 207t-49 106.5q-75 0 -144 -126.5t-106 -295.5z" />
+<glyph unicode="&#xe7;" horiz-adv-x="786" d="M-27 313q0 235 119 454q90 165 247 237q81 38 167 38q246 0 246 -186q0 -78 -32 -114.5t-72 -36.5t-77 24q25 66 25 121q0 84 -58.5 84t-123.5 -106q-93 -150 -128 -373q-10 -67 -10 -147q0 -148 141 -148q118 0 198.5 52.5t170.5 154.5h70q-159 -262 -378 -347 q-15 -6 -30 -10l-59 -145q64 16 109 16q127 0 127 -103t-74.5 -163.5t-161.5 -60.5t-123.5 12.5t-59.5 23.5l-46 21q38 65 76 65q53 0 91.5 -27.5t65.5 -27.5t44.5 26.5t17.5 57.5t-18.5 53.5t-68 22.5t-99.5 -25l84 235q-29 -3 -60 -3q-146 0 -233 75.5t-87 249.5z" />
+<glyph unicode="&#xe8;" horiz-adv-x="786" d="M-27 313q0 234 119 453q91 167 248 238q81 38 168 38q142 0 193 -53.5t51 -142.5q0 -175 -141 -297.5t-330 -134.5q-5 -58 -5 -82q0 -105 37 -138.5t104 -33.5q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379q-146 0 -233 75.5t-87 249.5zM297 512 q118 8 207.5 110t89.5 238q0 74 -51 74q-75 -2 -145 -132.5t-101 -289.5zM354 1536h215l60 -387h-154z" />
+<glyph unicode="&#xe9;" horiz-adv-x="786" d="M-27 313q0 234 119 453q91 167 248 238q81 38 168 38q142 0 193 -53.5t51 -142.5q0 -175 -141 -297.5t-330 -134.5q-5 -58 -5 -82q0 -105 37 -138.5t104 -33.5q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379q-146 0 -233 75.5t-87 249.5zM297 512 q118 8 207.5 110t89.5 238q0 74 -51 74q-75 -2 -145 -132.5t-101 -289.5zM398 1149l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xea;" horiz-adv-x="786" d="M-27 313q0 234 119 453q91 167 248 238q81 38 168 38q142 0 193 -53.5t51 -142.5q0 -175 -141 -297.5t-330 -134.5q-5 -58 -5 -82q0 -105 37 -138.5t104 -33.5q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379q-146 0 -233 75.5t-87 249.5zM215 1149l434 387h43 l123 -387h-65l-123 164l-322 -164h-90zM297 512q118 8 207.5 110t89.5 238q0 74 -51 74q-75 -2 -145 -132.5t-101 -289.5z" />
+<glyph unicode="&#xeb;" horiz-adv-x="786" d="M-27 313q0 234 119 453q91 167 248 238q81 38 168 38q142 0 193 -53.5t51 -142.5q0 -175 -141 -297.5t-330 -134.5q-5 -58 -5 -82q0 -105 37 -138.5t104 -33.5q118 0 198.5 52.5t170.5 154.5h70q-230 -379 -563 -379q-146 0 -233 75.5t-87 249.5zM244 1297q0 52 35 89 q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-66 0 -101 35.5t-35 87.5zM297 512q118 8 207.5 110t89.5 238q0 74 -51 74q-75 -2 -145 -132.5t-101 -289.5zM612 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88 z" />
+<glyph unicode="&#xec;" horiz-adv-x="547" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187zM135 1536h215l60 -387h-154z" />
+<glyph unicode="&#xed;" horiz-adv-x="547" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187zM248 1149l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xee;" horiz-adv-x="547" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187zM12 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
+<glyph unicode="&#xef;" horiz-adv-x="547" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187zM36 1297q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-66 0 -101 35.5t-35 87.5z M404 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
+<glyph unicode="&#xf0;" horiz-adv-x="1102" d="M-2 306.5q0 80.5 14.5 161t43.5 160.5q63 177 174 282q127 124 294 124q88 0 127 -29.5t39 -74.5v-12l17 75q17 75 22 156h-158l17 82h141q-12 103 -86 203h92q74 -43 129 -86t90 -117h129l-16 -82h-86q12 -50 12 -117.5t-22 -181.5l-111 -522q-8 -37 -8 -73 q0 -69 84 -69q110 0 166 181h86q-128 -367 -412 -367q-175 0 -201 178q-121 -190 -305.5 -190t-248.5 175q-23 63 -23 143.5zM301 335q0 -90 29.5 -119.5t62.5 -29.5q61 0 111 48t69 133l99 462q0 45 -44 69q-16 9 -40 9q-67 0 -120 -61q-130 -149 -162 -422q-5 -42 -5 -89z " />
+<glyph unicode="&#xf1;" d="M-78 0l217 1024h295l-22 -106q100 114 239 114q98 0 163 -54t65 -160t-34 -240l-49 -198q-16 -65 -16 -106q0 -88 75 -88q69 0 106 44t73 137h86q-119 -345 -322 -375q-32 -4 -79 -4t-93 20q-128 54 -128 211q0 84 46 268t46 254q0 105 -74 105t-132 -117 q-17 -33 -28 -72l-139 -657h-295zM180 1192q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53z" />
+<glyph unicode="&#xf2;" horiz-adv-x="887" d="M-40 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM265 342q0 -99 18 -125.5t38 -33.5t53 -7 q71 0 140 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5zM366 1536h215l60 -387h-154z" />
+<glyph unicode="&#xf3;" horiz-adv-x="887" d="M-40 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM265 342q0 -99 18 -125.5t38 -33.5t53 -7 q71 0 140 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5zM449 1149l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xf4;" horiz-adv-x="887" d="M-40 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM195 1149l434 387h43l123 -387h-65l-123 164 l-322 -164h-90zM265 342q0 -99 18 -125.5t38 -33.5t53 -7q71 0 140 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5z" />
+<glyph unicode="&#xf5;" horiz-adv-x="887" d="M-40 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM82 1192q99 201 342 201q79 0 148.5 -23.5 t107.5 -34t100 -10.5t111 47l12 -2q-17 -74 -117.5 -139.5t-212.5 -65.5q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53zM265 342q0 -99 18 -125.5t38 -33.5t53 -7q71 0 140 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5z" />
+<glyph unicode="&#xf6;" horiz-adv-x="887" d="M-40 301q0 74 12.5 150.5t39.5 157.5q61 183 177 297q138 136 332 136q263 0 263 -327v-2q10 -2 34 -2q55 0 141.5 35t162.5 88l18 -56q-124 -130 -363 -170q-24 -280 -161 -448t-328 -168q-236 0 -304 174q-24 61 -24 135zM215 1297q0 52 35 89q36 37 88.5 37 t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-66 0 -101.5 35.5t-35.5 87.5zM265 342q0 -99 18 -125.5t38 -33.5t53 -7q71 0 140 123t93 303q-55 14 -55 91t64 106q-4 65 -20.5 92t-64.5 27q-94 0 -180 -207.5t-86 -368.5zM583 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89 t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
+<glyph unicode="&#xf7;" horiz-adv-x="967" d="M105 422l37 161h717l-35 -161h-719zM301 163q0 67 46.5 116t114.5 49t116.5 -48.5t48.5 -116.5t-49 -114.5t-116 -46.5t-114 47t-47 114zM424 849.5q0 67.5 46.5 116t114.5 48.5t116.5 -48t48.5 -116.5t-49 -115t-116 -46.5t-114 47t-47 114.5z" />
+<glyph unicode="&#xf8;" horiz-adv-x="877" d="M-29 301q0 72 11.5 147.5t37.5 154.5q60 182 180.5 306t307.5 131l41 199h106l-43 -209q170 -45 176 -299q143 7 304 123h65q-42 -64 -149.5 -131.5t-223.5 -95.5q-16 -251 -122 -415.5t-269 -207.5l-45 -215h-106l43 203q-226 7 -291 177q-23 60 -23 132zM276 354 q0 -111 22.5 -144.5t71.5 -33.5q86 0 153 123t91 309q-57 16 -57 98.5t64 104.5q-5 60 -23 83.5t-64.5 23.5t-94.5 -62q-94 -122 -142 -339q-21 -99 -21 -163z" />
+<glyph unicode="&#xf9;" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -32 -6 -58q0 -84 61 -84q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-130 -379 -411 -379q-183 0 -203 194q-120 -194 -303 -194q-92 0 -156 58q-63 58 -63 187zM379 1536h215 l60 -387h-154z" />
+<glyph unicode="&#xfa;" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -32 -6 -58q0 -84 61 -84q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-130 -379 -411 -379q-183 0 -203 194q-120 -194 -303 -194q-92 0 -156 58q-63 58 -63 187zM490 1149 l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xfb;" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -32 -6 -58q0 -84 61 -84q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-130 -379 -411 -379q-183 0 -203 194q-120 -194 -303 -194q-92 0 -156 58q-63 58 -63 187zM258 1149 l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
+<glyph unicode="&#xfc;" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -32 -6 -58q0 -84 61 -84q108 0 164 181l139 657h295l-147 -696q-9 -35 -9 -72q0 -70 84 -70q115 0 166 181h86q-130 -379 -411 -379q-183 0 -203 194q-120 -194 -303 -194q-92 0 -156 58q-63 58 -63 187zM279 1297 q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-66 0 -101.5 35.5t-35.5 87.5zM647 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
+<glyph unicode="&#xfd;" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -26 -6 -52q0 -90 58.5 -90t99.5 48q40 49 63 120l143 670h295l-203 -950q93 31 153.5 94.5t104.5 198.5h86q-78 -264 -264 -348q-51 -23 -98 -35l-31 -148q-39 -197 -156 -284q-86 -64 -197 -64t-178 49t-67 157 q0 187 334 298l25 110q-106 -114 -246 -114q-92 0 -156 58q-63 58 -63 187zM203 -285q0 -41 39 -61q13 -6 38 -6t58 44.5t53 137.5l12 59q-200 -72 -200 -174zM488 1149l186 387h215l-248 -387h-153z" />
+<glyph unicode="&#xfe;" horiz-adv-x="969" d="M-188 -512l319 1505q25 109 25 191q0 134 -88 250h92q127 -75 170 -129q88 -108 88 -265q0 -42 -8 -100q101 94 247 94q177 0 231 -170q19 -62 19 -142.5t-9.5 -161t-32.5 -161t-60.5 -154.5t-93.5 -131.5t-132.5 -91.5t-192.5 -34t-159 75l-106 -501zM260 217 q17 -51 88 -51t126 58q107 114 138 326q15 94 15 167q0 170 -103 170q-35 0 -74.5 -26.5t-68.5 -80.5z" />
+<glyph unicode="&#xff;" d="M-16 233q0 58 16 134l139 657h295l-147 -696q-6 -26 -6 -52q0 -90 58.5 -90t99.5 48q40 49 63 120l143 670h295l-203 -950q93 31 153.5 94.5t104.5 198.5h86q-78 -264 -264 -348q-51 -23 -98 -35l-31 -148q-39 -197 -156 -284q-86 -64 -197 -64t-178 49t-67 157 q0 187 334 298l25 110q-106 -114 -246 -114q-92 0 -156 58q-63 58 -63 187zM203 -285q0 -41 39 -61q13 -6 38 -6t58 44.5t53 137.5l12 59q-200 -72 -200 -174zM252 1297q0 52 35 89q36 37 88.5 37t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-66 0 -101 35.5t-35 87.5z M620 1297q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -77 -35q-64 0 -100 35t-36 88z" />
+<glyph unicode="&#x152;" horiz-adv-x="1733" d="M33 983q0 100 68 201q145 212 447 306q150 46 296.5 46t238.5 -38q118 38 225 38t194 -12.5t190 -12.5t180 25l-19 -70q-39 -146 -176 -176q-98 0 -232 34t-192 40q90 -128 90 -352q0 -73 -10 -154h273l-41 -151h-259q-44 -189 -140 -356q-42 -73 -95 -134h498l-43 -217 h-793q-67 -12 -147 -12q-168 0 -266.5 98.5t-98.5 311t79 450.5q126 384 346 484q61 28 126.5 28t110.5 -17q-89 -53 -176 -227q-126 -249 -169 -552q-14 -94 -14 -173q0 -237 119 -237h2q99 0 198 144t163.5 363.5t64.5 416t-54 280.5t-208 84q-246 0 -418 -145.5 t-172 -381.5q0 -60 10.5 -79.5t10.5 -30.5q-100 0 -153.5 39t-53.5 139z" />
+<glyph unicode="&#x153;" horiz-adv-x="1358" d="M-14 326q0 353 162 546q146 172 376 172q104 0 156 -49t74 -125q126 172 327 172q262 0 262 -213q0 -175 -159 -294q-140 -106 -303 -123q-7 -44 -7 -92q0 -91 49 -132t103 -41q95 0 202.5 79.5t157.5 191.5h93q-157 -285 -393 -382q-86 -35 -188 -36h-2 q-100 0 -169.5 50t-101.5 128q-135 -190 -326 -190q-164 0 -239 76q-74 77 -74 262zM258 326q0 -77 39.5 -108.5t92.5 -31.5q94 0 152 124q49 101 72 272q-45 0 -65.5 27.5t-20.5 56.5q0 54 25.5 94.5t64.5 56.5q-8 107 -86 107q-71 0 -124 -68q-96 -126 -135 -355 q-15 -98 -15 -175zM897 510q133 0 228.5 97.5t95.5 211.5q0 72 -36 103q-14 12 -46.5 12t-70.5 -39q-110 -111 -171 -385z" />
+<glyph unicode="&#x178;" horiz-adv-x="1270" d="M12 1004q0 103 64.5 198.5t166.5 169.5q233 164 488 164q42 0 82 -4l178 -733l303 727h136l-398 -895l-135 -631h-328l136 631l-197 768q-144 -54 -224.5 -169t-80.5 -286q0 -83 23 -125q5 -8 5 -14q-164 0 -205 105q-14 38 -14 94zM777 1809q0 52 35 89q36 37 88.5 37 t89.5 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-66 0 -101.5 35.5t-35.5 87.5zM1145 1809q0 53 36 89.5t88 36.5t89 -36.5t37 -89t-37 -88.5q-38 -35 -76 -35q-65 0 -101 35t-36 88z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="600" d="M0 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="825" d="M78 1192q99 201 342 201q79 0 148.5 -23.5t107.5 -34t100 -10.5t111 47l12 -2q-17 -74 -117 -140q-101 -65 -213 -65q-69 0 -145 26t-116 38t-83 12q-77 0 -135 -53z" />
+<glyph unicode="&#x2000;" horiz-adv-x="1024" />
+<glyph unicode="&#x2001;" horiz-adv-x="2048" />
+<glyph unicode="&#x2002;" horiz-adv-x="1024" />
+<glyph unicode="&#x2003;" horiz-adv-x="2048" />
+<glyph unicode="&#x2004;" horiz-adv-x="682" />
+<glyph unicode="&#x2005;" horiz-adv-x="512" />
+<glyph unicode="&#x2006;" horiz-adv-x="341" />
+<glyph unicode="&#x2007;" horiz-adv-x="341" />
+<glyph unicode="&#x2008;" horiz-adv-x="256" />
+<glyph unicode="&#x2009;" horiz-adv-x="409" />
+<glyph unicode="&#x200a;" horiz-adv-x="113" />
+<glyph unicode="&#x2010;" horiz-adv-x="594" d="M39 455l37 161h409l-34 -161h-412z" />
+<glyph unicode="&#x2011;" horiz-adv-x="594" d="M39 455l37 161h409l-34 -161h-412z" />
+<glyph unicode="&#x2012;" horiz-adv-x="594" d="M39 455l37 161h409l-34 -161h-412z" />
+<glyph unicode="&#x2013;" horiz-adv-x="721" d="M39 455l37 161h532l-35 -161h-534z" />
+<glyph unicode="&#x2014;" horiz-adv-x="909" d="M39 455l37 161h717l-35 -161h-719z" />
+<glyph unicode="&#x2018;" horiz-adv-x="625" d="M172 1387q0 70 34 107.5t97 37.5t106.5 -42t43.5 -93q0 -86 -91 -137q-24 -17 -24 -35l100 -144q0 -18 -18 -28q-118 75 -183 169.5t-65 164.5z" />
+<glyph unicode="&#x2019;" horiz-adv-x="625" d="M172 1379.5q0 68.5 43 110.5t106.5 42t97.5 -37.5t34 -108t-65 -164t-183 -169.5q-19 10 -19 28l101 144q0 19 -25 35q-90 51 -90 119.5z" />
+<glyph unicode="&#x201a;" horiz-adv-x="580" d="M156 146.5q0 68.5 43 110.5t106.5 42t97 -37.5t33.5 -107.5t-64 -163t-184 -171q-18 10 -18 28l100 144q0 18 -24 35q-90 51 -90 119.5z" />
+<glyph unicode="&#x201c;" horiz-adv-x="1042" d="M156 1198q0 70 65 164t182 170q19 -10 19 -28l-100 -144q0 -18 24 -35q90 -51 90 -137q0 -51 -43.5 -93t-105.5 -42q-131 0 -131 145zM606 1198q0 70 65 164.5t183 169.5q18 -10 18 -28l-100 -144q0 -19 25 -35q90 -51 90 -137q0 -51 -43.5 -93t-106.5 -42t-97 37.5 t-34 107.5z" />
+<glyph unicode="&#x201d;" horiz-adv-x="1042" d="M156 1379.5q0 68.5 43 110.5t106.5 42t97 -37.5t33.5 -108t-65 -164t-183 -169.5q-18 10 -18 28l100 144q0 18 -24 35q-90 51 -90 119.5zM606 1379.5q0 68.5 43 110.5t106.5 42t97.5 -37.5t34 -108t-65 -164t-183 -169.5q-18 10 -18 28l100 144q0 19 -25 35 q-90 51 -90 119.5z" />
+<glyph unicode="&#x201e;" horiz-adv-x="1042" d="M156 146.5q0 68.5 43 110.5t106.5 42t97 -37.5t33.5 -107.5t-64 -163t-184 -171q-18 10 -18 28l100 144q0 18 -24 35q-90 51 -90 119.5zM606 146.5q0 68.5 43 110.5t106.5 42t97.5 -37.5t34 -107.5t-64 -163t-184 -171q-18 10 -18 28l100 144q0 19 -25 35 q-90 51 -90 119.5z" />
+<glyph unicode="&#x2022;" horiz-adv-x="889" d="M246 546q0 82 57 140q57 59 139 59t140 -59q59 -58 59 -139q0 -82 -59 -139q-59 -58 -140.5 -58t-138.5 58q-57 57 -57 138z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1438" d="M63 153q0 67 47 116q48 48 115.5 48t115.5 -48t48 -116t-48.5 -114.5t-115 -46.5t-115.5 47q-47 47 -47 114zM545 153q0 67 46.5 115.5t114.5 48.5t116 -48t48 -116t-48.5 -114.5t-115.5 -46.5t-114 47t-47 114zM1047 153q0 67 46.5 115.5t114.5 48.5t116 -48t48 -116 t-48.5 -114.5t-115.5 -46.5t-114 47t-47 114z" />
+<glyph unicode="&#x202f;" horiz-adv-x="409" />
+<glyph unicode="&#x2039;" horiz-adv-x="735" d="M41 487l18 84l629 349l-20 -113l-494 -287l397 -237l-24 -117z" />
+<glyph unicode="&#x203a;" horiz-adv-x="705" d="M31 166l28 117l492 237l-397 287l18 113l504 -349l-23 -110z" />
+<glyph unicode="&#x205f;" horiz-adv-x="512" />
+<glyph unicode="&#x20ac;" horiz-adv-x="1174" d="M-6 582l29 102h151q12 102 16 133h-145l29 103h137q101 429 394 566q108 50 253 50q246 0 328 -149q28 -52 28 -125q0 -189 -143 -189q-72 0 -117 53q55 20 83 123q7 26 7 42q0 53 -21 89q-35 60 -110 60q-132 0 -228.5 -148.5t-149.5 -371.5h413l-28 -103h-408 q-6 -35 -9 -67.5t-7 -65.5h401l-29 -102h-379v-27q0 -211 55 -297t222 -86t248 42q31 16 61 40l4 -59q-90 -120 -203.5 -163.5t-278 -43.5t-282.5 104q-147 128 -147 418v72h-174z" />
+<glyph unicode="&#x2122;" horiz-adv-x="776" d="M-47 1188q0 109 111 146q40 14 98 14l153 -11q54 0 76 11q-16 -80 -51 -80q-25 0 -55.5 7t-65.5 11l-86 -399h-88l88 407q-123 -2 -123 -125q0 -21 8 -41q-65 0 -65 60zM305 887l139 430l84 12v-346l136 356h96l-78 -452h-88l55 319l-129 -319h-84v268l-82 -268h-49z" />
+<glyph unicode="&#xe000;" horiz-adv-x="1140" d="M0 1140h1140v-1140h-1140v1140z" />
+<glyph unicode="&#xfb01;" horiz-adv-x="1094" d="M-424 -283q0 172 226 255q63 24 128 44l228 1078q94 440 479 440q286 0 351 -150q16 -37 16 -86q0 -91 -50 -128t-112 -37q-123 0 -123 110q0 35 18.5 67.5t50.5 32.5h10q5 0 7 -2q-4 82 -113 82q-135 0 -192 -145q-17 -42 -25 -86l-35 -168h164l-16 -82h-164l-234 -1106 q-40 -192 -154 -280q-88 -68 -203 -68t-186 62t-71 167zM-311 -248q0 -45 28 -63.5t57 -18.5t64 36.5t53 123.5l25 119q-227 -74 -227 -197zM531 233q0 58 16 134l139 657h295l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -442 -379 q-80 0 -144 58q-63 58 -63 187z" />
+<glyph unicode="&#xfb02;" horiz-adv-x="1122" d="M-428 -304q0 83 27.5 131.5t88 92t238.5 96.5l246 1170q72 348 381 348q133 0 231 -32l166 -57q67 -24 137 -52l-225 -1065q-8 -37 -8 -73q0 -69 84 -69q59 0 110 51t74 130h86q-133 -379 -441 -379q-81 0 -145 58q-63 58 -63 187q0 58 16 134l213 1005q-82 33 -167 33 q-105 0 -140 -162l-45 -219h191l-17 -82h-190l-234 -1106q-70 -348 -372 -348q-95 0 -168.5 62.5t-73.5 145.5zM-315 -262q0 -40 49 -62q15 -6 39.5 -6t60 34t53.5 126l25 119q-110 -39 -151 -72q-76 -61 -76 -139z" />
+<glyph unicode="&#xfb03;" horiz-adv-x="1565" d="M-428 -304q0 83 27.5 131.5t88 92t238.5 96.5l246 1170q73 348 373 348q169 0 252 -107q113 107 309 107q286 0 351 -150q16 -37 16 -86q0 -91 -50 -128t-112 -37q-123 0 -123 110q0 35 18.5 67.5t50.5 32.5h10q5 0 7 -2q-4 82 -113 82q-175 0 -217 -231l-35 -168h543 l-147 -696q-8 -37 -8 -73q0 -69 83 -69q60 0 111.5 52t73.5 129h86q-132 -379 -441 -379q-81 0 -145 58q-63 58 -63 187q0 58 16 134l121 575h-246l-234 -1106q-40 -192 -154 -280q-88 -68 -206 -68q-160 0 -223 109q-99 -109 -262 -109q-95 0 -168.5 62.5t-73.5 145.5z M-303 -262q0 -40 49 -62q15 -6 40 -6t60 34q34 34 54 126l24 119q-110 -39 -151 -72q-76 -61 -76 -139zM145 -293q13 -65 79 -65q42 0 78.5 45t57.5 143l48 223l-183 -37l-39 -180q-13 -67 -41 -129zM238 74l180 30l176 838h-172zM438 1024h174l15 70q28 148 102 256 q-30 34 -77 34q-148 0 -181 -192z" />
+<glyph unicode="&#xfb04;" horiz-adv-x="1597" d="M-428 -304q0 83 27.5 131.5t88 92t238.5 96.5l246 1170q42 199 158 284q89 64 227.5 64t222.5 -86q96 86 238.5 86t240.5 -32l166 -57q68 -24 138 -52l-226 -1065q-8 -37 -8 -73q0 -69 84 -69q60 0 111 51q50 52 73 130h86q-133 -379 -441 -379q-81 0 -145 58 q-63 58 -63 187q0 54 17 134l213 1005q-82 33 -168 33q-105 0 -140 -162l-45 -219h191l-17 -82h-190l-236 -1106q-40 -192 -154 -280q-88 -68 -206 -68q-161 0 -223 111q-101 -111 -262 -111q-95 0 -168.5 62.5t-73.5 145.5zM-303 -262q0 -40 49 -62q15 -6 40 -6t60 34 q34 34 54 126l24 119q-110 -39 -151 -72q-76 -61 -76 -139zM145 -291q6 -67 76 -67q99 0 139 188l48 223l-183 -37l-39 -180q-13 -65 -41 -127zM238 74l180 30l178 838h-174zM438 1024h174l35 162q18 98 66 178q-28 20 -69 20q-74 0 -116.5 -55t-56.5 -137z" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/ihatemoney/static/fonts/lobster-webfont.woff b/ihatemoney/static/fonts/lobster-webfont.woff
new file mode 100644
index 0000000..bf39d59
--- /dev/null
+++ b/ihatemoney/static/fonts/lobster-webfont.woff
Binary files differ
diff --git a/ihatemoney/static/images/delete.png b/ihatemoney/static/images/delete.png
new file mode 100644
index 0000000..aa786a3
--- /dev/null
+++ b/ihatemoney/static/images/delete.png
Binary files differ
diff --git a/ihatemoney/static/images/deleter.png b/ihatemoney/static/images/deleter.png
new file mode 100644
index 0000000..04a23f3
--- /dev/null
+++ b/ihatemoney/static/images/deleter.png
Binary files differ
diff --git a/ihatemoney/static/images/edit.png b/ihatemoney/static/images/edit.png
new file mode 100644
index 0000000..02662fc
--- /dev/null
+++ b/ihatemoney/static/images/edit.png
Binary files differ
diff --git a/ihatemoney/static/images/glyphicons-halflings-white.png b/ihatemoney/static/images/glyphicons-halflings-white.png
new file mode 100644
index 0000000..a20760b
--- /dev/null
+++ b/ihatemoney/static/images/glyphicons-halflings-white.png
Binary files differ
diff --git a/ihatemoney/static/images/glyphicons-halflings.png b/ihatemoney/static/images/glyphicons-halflings.png
new file mode 100644
index 0000000..92d4445
--- /dev/null
+++ b/ihatemoney/static/images/glyphicons-halflings.png
Binary files differ
diff --git a/ihatemoney/static/images/gradient.png b/ihatemoney/static/images/gradient.png
new file mode 100644
index 0000000..ad148bf
--- /dev/null
+++ b/ihatemoney/static/images/gradient.png
Binary files differ
diff --git a/ihatemoney/static/images/reactivate.png b/ihatemoney/static/images/reactivate.png
new file mode 100644
index 0000000..54c60c0
--- /dev/null
+++ b/ihatemoney/static/images/reactivate.png
Binary files differ
diff --git a/ihatemoney/static/js/bootstrap-datepicker.js b/ihatemoney/static/js/bootstrap-datepicker.js
new file mode 100644
index 0000000..76a99fc
--- /dev/null
+++ b/ihatemoney/static/js/bootstrap-datepicker.js
@@ -0,0 +1,2096 @@
+/*!
+ * Datepicker for Bootstrap v1.6.4 (https://github.com/eternicode/bootstrap-datepicker)
+ *
+ * Copyright 2012 Stefan Petre
+ * Improvements by Andrew Rowls
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */(function(factory){
+ if (typeof define === "function" && define.amd) {
+ define(["jquery"], factory);
+ } else if (typeof exports === 'object') {
+ factory(require('jquery'));
+ } else {
+ factory(jQuery);
+ }
+}(function($, undefined){
+
+ function UTCDate(){
+ return new Date(Date.UTC.apply(Date, arguments));
+ }
+ function UTCToday(){
+ var today = new Date();
+ return UTCDate(today.getFullYear(), today.getMonth(), today.getDate());
+ }
+ function isUTCEquals(date1, date2) {
+ return (
+ date1.getUTCFullYear() === date2.getUTCFullYear() &&
+ date1.getUTCMonth() === date2.getUTCMonth() &&
+ date1.getUTCDate() === date2.getUTCDate()
+ );
+ }
+ function alias(method){
+ return function(){
+ return this[method].apply(this, arguments);
+ };
+ }
+ function isValidDate(d) {
+ return d && !isNaN(d.getTime());
+ }
+
+ var DateArray = (function(){
+ var extras = {
+ get: function(i){
+ return this.slice(i)[0];
+ },
+ contains: function(d){
+ // Array.indexOf is not cross-browser;
+ // $.inArray doesn't work with Dates
+ var val = d && d.valueOf();
+ for (var i=0, l=this.length; i < l; i++)
+ if (this[i].valueOf() === val)
+ return i;
+ return -1;
+ },
+ remove: function(i){
+ this.splice(i,1);
+ },
+ replace: function(new_array){
+ if (!new_array)
+ return;
+ if (!$.isArray(new_array))
+ new_array = [new_array];
+ this.clear();
+ this.push.apply(this, new_array);
+ },
+ clear: function(){
+ this.length = 0;
+ },
+ copy: function(){
+ var a = new DateArray();
+ a.replace(this);
+ return a;
+ }
+ };
+
+ return function(){
+ var a = [];
+ a.push.apply(a, arguments);
+ $.extend(a, extras);
+ return a;
+ };
+ })();
+
+
+ // Picker object
+
+ var Datepicker = function(element, options){
+ $(element).data('datepicker', this);
+ this._process_options(options);
+
+ this.dates = new DateArray();
+ this.viewDate = this.o.defaultViewDate;
+ this.focusDate = null;
+
+ this.element = $(element);
+ this.isInput = this.element.is('input');
+ this.inputField = this.isInput ? this.element : this.element.find('input');
+ this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .btn') : false;
+ this.hasInput = this.component && this.inputField.length;
+ if (this.component && this.component.length === 0)
+ this.component = false;
+ this.isInline = !this.component && this.element.is('div');
+
+ this.picker = $(DPGlobal.template);
+
+ // Checking templates and inserting
+ if (this._check_template(this.o.templates.leftArrow)) {
+ this.picker.find('.prev').html(this.o.templates.leftArrow);
+ }
+ if (this._check_template(this.o.templates.rightArrow)) {
+ this.picker.find('.next').html(this.o.templates.rightArrow);
+ }
+
+ this._buildEvents();
+ this._attachEvents();
+
+ if (this.isInline){
+ this.picker.addClass('datepicker-inline').appendTo(this.element);
+ }
+ else {
+ this.picker.addClass('datepicker-dropdown dropdown-menu');
+ }
+
+ if (this.o.rtl){
+ this.picker.addClass('datepicker-rtl');
+ }
+
+ this.viewMode = this.o.startView;
+
+ if (this.o.calendarWeeks)
+ this.picker.find('thead .datepicker-title, tfoot .today, tfoot .clear')
+ .attr('colspan', function(i, val){
+ return parseInt(val) + 1;
+ });
+
+ this._allow_update = false;
+
+ this.setStartDate(this._o.startDate);
+ this.setEndDate(this._o.endDate);
+ this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled);
+ this.setDaysOfWeekHighlighted(this.o.daysOfWeekHighlighted);
+ this.setDatesDisabled(this.o.datesDisabled);
+
+ this.fillDow();
+ this.fillMonths();
+
+ this._allow_update = true;
+
+ this.update();
+ this.showMode();
+
+ if (this.isInline){
+ this.show();
+ }
+ };
+
+ Datepicker.prototype = {
+ constructor: Datepicker,
+
+ _resolveViewName: function(view, default_value){
+ if (view === 0 || view === 'days' || view === 'month') {
+ return 0;
+ }
+ if (view === 1 || view === 'months' || view === 'year') {
+ return 1;
+ }
+ if (view === 2 || view === 'years' || view === 'decade') {
+ return 2;
+ }
+ if (view === 3 || view === 'decades' || view === 'century') {
+ return 3;
+ }
+ if (view === 4 || view === 'centuries' || view === 'millennium') {
+ return 4;
+ }
+ return default_value === undefined ? false : default_value;
+ },
+
+ _check_template: function(tmp){
+ try {
+ // If empty
+ if (tmp === undefined || tmp === "") {
+ return false;
+ }
+ // If no html, everything ok
+ if ((tmp.match(/[<>]/g) || []).length <= 0) {
+ return true;
+ }
+ // Checking if html is fine
+ var jDom = $(tmp);
+ return jDom.length > 0;
+ }
+ catch (ex) {
+ return false;
+ }
+ },
+
+ _process_options: function(opts){
+ // Store raw options for reference
+ this._o = $.extend({}, this._o, opts);
+ // Processed options
+ var o = this.o = $.extend({}, this._o);
+
+ // Check if "de-DE" style date is available, if not language should
+ // fallback to 2 letter code eg "de"
+ var lang = o.language;
+ if (!dates[lang]){
+ lang = lang.split('-')[0];
+ if (!dates[lang])
+ lang = defaults.language;
+ }
+ o.language = lang;
+
+ // Retrieve view index from any aliases
+ o.startView = this._resolveViewName(o.startView, 0);
+ o.minViewMode = this._resolveViewName(o.minViewMode, 0);
+ o.maxViewMode = this._resolveViewName(o.maxViewMode, 4);
+
+ // Check that the start view is between min and max
+ o.startView = Math.min(o.startView, o.maxViewMode);
+ o.startView = Math.max(o.startView, o.minViewMode);
+
+ // true, false, or Number > 0
+ if (o.multidate !== true){
+ o.multidate = Number(o.multidate) || false;
+ if (o.multidate !== false)
+ o.multidate = Math.max(0, o.multidate);
+ }
+ o.multidateSeparator = String(o.multidateSeparator);
+
+ o.weekStart %= 7;
+ o.weekEnd = (o.weekStart + 6) % 7;
+
+ var format = DPGlobal.parseFormat(o.format);
+ if (o.startDate !== -Infinity){
+ if (!!o.startDate){
+ if (o.startDate instanceof Date)
+ o.startDate = this._local_to_utc(this._zero_time(o.startDate));
+ else
+ o.startDate = DPGlobal.parseDate(o.startDate, format, o.language, o.assumeNearbyYear);
+ }
+ else {
+ o.startDate = -Infinity;
+ }
+ }
+ if (o.endDate !== Infinity){
+ if (!!o.endDate){
+ if (o.endDate instanceof Date)
+ o.endDate = this._local_to_utc(this._zero_time(o.endDate));
+ else
+ o.endDate = DPGlobal.parseDate(o.endDate, format, o.language, o.assumeNearbyYear);
+ }
+ else {
+ o.endDate = Infinity;
+ }
+ }
+
+ o.daysOfWeekDisabled = o.daysOfWeekDisabled||[];
+ if (!$.isArray(o.daysOfWeekDisabled))
+ o.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\s]*/);
+ o.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){
+ return parseInt(d, 10);
+ });
+
+ o.daysOfWeekHighlighted = o.daysOfWeekHighlighted||[];
+ if (!$.isArray(o.daysOfWeekHighlighted))
+ o.daysOfWeekHighlighted = o.daysOfWeekHighlighted.split(/[,\s]*/);
+ o.daysOfWeekHighlighted = $.map(o.daysOfWeekHighlighted, function(d){
+ return parseInt(d, 10);
+ });
+
+ o.datesDisabled = o.datesDisabled||[];
+ if (!$.isArray(o.datesDisabled)) {
+ o.datesDisabled = [
+ o.datesDisabled
+ ];
+ }
+ o.datesDisabled = $.map(o.datesDisabled,function(d){
+ return DPGlobal.parseDate(d, format, o.language, o.assumeNearbyYear);
+ });
+
+ var plc = String(o.orientation).toLowerCase().split(/\s+/g),
+ _plc = o.orientation.toLowerCase();
+ plc = $.grep(plc, function(word){
+ return /^auto|left|right|top|bottom$/.test(word);
+ });
+ o.orientation = {x: 'auto', y: 'auto'};
+ if (!_plc || _plc === 'auto')
+ ; // no action
+ else if (plc.length === 1){
+ switch (plc[0]){
+ case 'top':
+ case 'bottom':
+ o.orientation.y = plc[0];
+ break;
+ case 'left':
+ case 'right':
+ o.orientation.x = plc[0];
+ break;
+ }
+ }
+ else {
+ _plc = $.grep(plc, function(word){
+ return /^left|right$/.test(word);
+ });
+ o.orientation.x = _plc[0] || 'auto';
+
+ _plc = $.grep(plc, function(word){
+ return /^top|bottom$/.test(word);
+ });
+ o.orientation.y = _plc[0] || 'auto';
+ }
+ if (o.defaultViewDate) {
+ var year = o.defaultViewDate.year || new Date().getFullYear();
+ var month = o.defaultViewDate.month || 0;
+ var day = o.defaultViewDate.day || 1;
+ o.defaultViewDate = UTCDate(year, month, day);
+ } else {
+ o.defaultViewDate = UTCToday();
+ }
+ },
+ _events: [],
+ _secondaryEvents: [],
+ _applyEvents: function(evs){
+ for (var i=0, el, ch, ev; i < evs.length; i++){
+ el = evs[i][0];
+ if (evs[i].length === 2){
+ ch = undefined;
+ ev = evs[i][1];
+ }
+ else if (evs[i].length === 3){
+ ch = evs[i][1];
+ ev = evs[i][2];
+ }
+ el.on(ev, ch);
+ }
+ },
+ _unapplyEvents: function(evs){
+ for (var i=0, el, ev, ch; i < evs.length; i++){
+ el = evs[i][0];
+ if (evs[i].length === 2){
+ ch = undefined;
+ ev = evs[i][1];
+ }
+ else if (evs[i].length === 3){
+ ch = evs[i][1];
+ ev = evs[i][2];
+ }
+ el.off(ev, ch);
+ }
+ },
+ _buildEvents: function(){
+ var events = {
+ keyup: $.proxy(function(e){
+ if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1)
+ this.update();
+ }, this),
+ keydown: $.proxy(this.keydown, this),
+ paste: $.proxy(this.paste, this)
+ };
+
+ if (this.o.showOnFocus === true) {
+ events.focus = $.proxy(this.show, this);
+ }
+
+ if (this.isInput) { // single input
+ this._events = [
+ [this.element, events]
+ ];
+ }
+ else if (this.component && this.hasInput) { // component: input + button
+ this._events = [
+ // For components that are not readonly, allow keyboard nav
+ [this.inputField, events],
+ [this.component, {
+ click: $.proxy(this.show, this)
+ }]
+ ];
+ }
+ else {
+ this._events = [
+ [this.element, {
+ click: $.proxy(this.show, this),
+ keydown: $.proxy(this.keydown, this)
+ }]
+ ];
+ }
+ this._events.push(
+ // Component: listen for blur on element descendants
+ [this.element, '*', {
+ blur: $.proxy(function(e){
+ this._focused_from = e.target;
+ }, this)
+ }],
+ // Input: listen for blur on element
+ [this.element, {
+ blur: $.proxy(function(e){
+ this._focused_from = e.target;
+ }, this)
+ }]
+ );
+
+ if (this.o.immediateUpdates) {
+ // Trigger input updates immediately on changed year/month
+ this._events.push([this.element, {
+ 'changeYear changeMonth': $.proxy(function(e){
+ this.update(e.date);
+ }, this)
+ }]);
+ }
+
+ this._secondaryEvents = [
+ [this.picker, {
+ click: $.proxy(this.click, this)
+ }],
+ [$(window), {
+ resize: $.proxy(this.place, this)
+ }],
+ [$(document), {
+ mousedown: $.proxy(function(e){
+ // Clicked outside the datepicker, hide it
+ if (!(
+ this.element.is(e.target) ||
+ this.element.find(e.target).length ||
+ this.picker.is(e.target) ||
+ this.picker.find(e.target).length ||
+ this.isInline
+ )){
+ this.hide();
+ }
+ }, this)
+ }]
+ ];
+ },
+ _attachEvents: function(){
+ this._detachEvents();
+ this._applyEvents(this._events);
+ },
+ _detachEvents: function(){
+ this._unapplyEvents(this._events);
+ },
+ _attachSecondaryEvents: function(){
+ this._detachSecondaryEvents();
+ this._applyEvents(this._secondaryEvents);
+ },
+ _detachSecondaryEvents: function(){
+ this._unapplyEvents(this._secondaryEvents);
+ },
+ _trigger: function(event, altdate){
+ var date = altdate || this.dates.get(-1),
+ local_date = this._utc_to_local(date);
+
+ this.element.trigger({
+ type: event,
+ date: local_date,
+ dates: $.map(this.dates, this._utc_to_local),
+ format: $.proxy(function(ix, format){
+ if (arguments.length === 0){
+ ix = this.dates.length - 1;
+ format = this.o.format;
+ }
+ else if (typeof ix === 'string'){
+ format = ix;
+ ix = this.dates.length - 1;
+ }
+ format = format || this.o.format;
+ var date = this.dates.get(ix);
+ return DPGlobal.formatDate(date, format, this.o.language);
+ }, this)
+ });
+ },
+
+ show: function(){
+ if (this.inputField.prop('disabled') || (this.inputField.prop('readonly') && this.o.enableOnReadonly === false))
+ return;
+ if (!this.isInline)
+ this.picker.appendTo(this.o.container);
+ this.place();
+ this.picker.show();
+ this._attachSecondaryEvents();
+ this._trigger('show');
+ if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) {
+ $(this.element).blur();
+ }
+ return this;
+ },
+
+ hide: function(){
+ if (this.isInline || !this.picker.is(':visible'))
+ return this;
+ this.focusDate = null;
+ this.picker.hide().detach();
+ this._detachSecondaryEvents();
+ this.viewMode = this.o.startView;
+ this.showMode();
+
+ if (this.o.forceParse && this.inputField.val())
+ this.setValue();
+ this._trigger('hide');
+ return this;
+ },
+
+ destroy: function(){
+ this.hide();
+ this._detachEvents();
+ this._detachSecondaryEvents();
+ this.picker.remove();
+ delete this.element.data().datepicker;
+ if (!this.isInput){
+ delete this.element.data().date;
+ }
+ return this;
+ },
+
+ paste: function(evt){
+ var dateString;
+ if (evt.originalEvent.clipboardData && evt.originalEvent.clipboardData.types
+ && $.inArray('text/plain', evt.originalEvent.clipboardData.types) !== -1) {
+ dateString = evt.originalEvent.clipboardData.getData('text/plain');
+ }
+ else if (window.clipboardData) {
+ dateString = window.clipboardData.getData('Text');
+ }
+ else {
+ return;
+ }
+ this.setDate(dateString);
+ this.update();
+ evt.preventDefault();
+ },
+
+ _utc_to_local: function(utc){
+ return utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000));
+ },
+ _local_to_utc: function(local){
+ return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000));
+ },
+ _zero_time: function(local){
+ return local && new Date(local.getFullYear(), local.getMonth(), local.getDate());
+ },
+ _zero_utc_time: function(utc){
+ return utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate()));
+ },
+
+ getDates: function(){
+ return $.map(this.dates, this._utc_to_local);
+ },
+
+ getUTCDates: function(){
+ return $.map(this.dates, function(d){
+ return new Date(d);
+ });
+ },
+
+ getDate: function(){
+ return this._utc_to_local(this.getUTCDate());
+ },
+
+ getUTCDate: function(){
+ var selected_date = this.dates.get(-1);
+ if (typeof selected_date !== 'undefined') {
+ return new Date(selected_date);
+ } else {
+ return null;
+ }
+ },
+
+ clearDates: function(){
+ if (this.inputField) {
+ this.inputField.val('');
+ }
+
+ this.update();
+ this._trigger('changeDate');
+
+ if (this.o.autoclose) {
+ this.hide();
+ }
+ },
+ setDates: function(){
+ var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
+ this.update.apply(this, args);
+ this._trigger('changeDate');
+ this.setValue();
+ return this;
+ },
+
+ setUTCDates: function(){
+ var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
+ this.update.apply(this, $.map(args, this._utc_to_local));
+ this._trigger('changeDate');
+ this.setValue();
+ return this;
+ },
+
+ setDate: alias('setDates'),
+ setUTCDate: alias('setUTCDates'),
+ remove: alias('destroy'),
+
+ setValue: function(){
+ var formatted = this.getFormattedDate();
+ this.inputField.val(formatted);
+ return this;
+ },
+
+ getFormattedDate: function(format){
+ if (format === undefined)
+ format = this.o.format;
+
+ var lang = this.o.language;
+ return $.map(this.dates, function(d){
+ return DPGlobal.formatDate(d, format, lang);
+ }).join(this.o.multidateSeparator);
+ },
+
+ getStartDate: function(){
+ return this.o.startDate;
+ },
+
+ setStartDate: function(startDate){
+ this._process_options({startDate: startDate});
+ this.update();
+ this.updateNavArrows();
+ return this;
+ },
+
+ getEndDate: function(){
+ return this.o.endDate;
+ },
+
+ setEndDate: function(endDate){
+ this._process_options({endDate: endDate});
+ this.update();
+ this.updateNavArrows();
+ return this;
+ },
+
+ setDaysOfWeekDisabled: function(daysOfWeekDisabled){
+ this._process_options({daysOfWeekDisabled: daysOfWeekDisabled});
+ this.update();
+ this.updateNavArrows();
+ return this;
+ },
+
+ setDaysOfWeekHighlighted: function(daysOfWeekHighlighted){
+ this._process_options({daysOfWeekHighlighted: daysOfWeekHighlighted});
+ this.update();
+ return this;
+ },
+
+ setDatesDisabled: function(datesDisabled){
+ this._process_options({datesDisabled: datesDisabled});
+ this.update();
+ this.updateNavArrows();
+ },
+
+ place: function(){
+ if (this.isInline)
+ return this;
+ var calendarWidth = this.picker.outerWidth(),
+ calendarHeight = this.picker.outerHeight(),
+ visualPadding = 10,
+ container = $(this.o.container),
+ windowWidth = container.width(),
+ scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(),
+ appendOffset = container.offset();
+
+ var parentsZindex = [];
+ this.element.parents().each(function(){
+ var itemZIndex = $(this).css('z-index');
+ if (itemZIndex !== 'auto' && itemZIndex !== 0) parentsZindex.push(parseInt(itemZIndex));
+ });
+ var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset;
+ var offset = this.component ? this.component.parent().offset() : this.element.offset();
+ var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false);
+ var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false);
+ var left = offset.left - appendOffset.left,
+ top = offset.top - appendOffset.top;
+
+ if (this.o.container !== 'body') {
+ top += scrollTop;
+ }
+
+ this.picker.removeClass(
+ 'datepicker-orient-top datepicker-orient-bottom '+
+ 'datepicker-orient-right datepicker-orient-left'
+ );
+
+ if (this.o.orientation.x !== 'auto'){
+ this.picker.addClass('datepicker-orient-' + this.o.orientation.x);
+ if (this.o.orientation.x === 'right')
+ left -= calendarWidth - width;
+ }
+ // auto x orientation is best-placement: if it crosses a window
+ // edge, fudge it sideways
+ else {
+ if (offset.left < 0) {
+ // component is outside the window on the left side. Move it into visible range
+ this.picker.addClass('datepicker-orient-left');
+ left -= offset.left - visualPadding;
+ } else if (left + calendarWidth > windowWidth) {
+ // the calendar passes the widow right edge. Align it to component right side
+ this.picker.addClass('datepicker-orient-right');
+ left += width - calendarWidth;
+ } else {
+ // Default to left
+ this.picker.addClass('datepicker-orient-left');
+ }
+ }
+
+ // auto y orientation is best-situation: top or bottom, no fudging,
+ // decision based on which shows more of the calendar
+ var yorient = this.o.orientation.y,
+ top_overflow;
+ if (yorient === 'auto'){
+ top_overflow = -scrollTop + top - calendarHeight;
+ yorient = top_overflow < 0 ? 'bottom' : 'top';
+ }
+
+ this.picker.addClass('datepicker-orient-' + yorient);
+ if (yorient === 'top')
+ top -= calendarHeight + parseInt(this.picker.css('padding-top'));
+ else
+ top += height;
+
+ if (this.o.rtl) {
+ var right = windowWidth - (left + width);
+ this.picker.css({
+ top: top,
+ right: right,
+ zIndex: zIndex
+ });
+ } else {
+ this.picker.css({
+ top: top,
+ left: left,
+ zIndex: zIndex
+ });
+ }
+ return this;
+ },
+
+ _allow_update: true,
+ update: function(){
+ if (!this._allow_update)
+ return this;
+
+ var oldDates = this.dates.copy(),
+ dates = [],
+ fromArgs = false;
+ if (arguments.length){
+ $.each(arguments, $.proxy(function(i, date){
+ if (date instanceof Date)
+ date = this._local_to_utc(date);
+ dates.push(date);
+ }, this));
+ fromArgs = true;
+ }
+ else {
+ dates = this.isInput
+ ? this.element.val()
+ : this.element.data('date') || this.inputField.val();
+ if (dates && this.o.multidate)
+ dates = dates.split(this.o.multidateSeparator);
+ else
+ dates = [dates];
+ delete this.element.data().date;
+ }
+
+ dates = $.map(dates, $.proxy(function(date){
+ return DPGlobal.parseDate(date, this.o.format, this.o.language, this.o.assumeNearbyYear);
+ }, this));
+ dates = $.grep(dates, $.proxy(function(date){
+ return (
+ !this.dateWithinRange(date) ||
+ !date
+ );
+ }, this), true);
+ this.dates.replace(dates);
+
+ if (this.dates.length)
+ this.viewDate = new Date(this.dates.get(-1));
+ else if (this.viewDate < this.o.startDate)
+ this.viewDate = new Date(this.o.startDate);
+ else if (this.viewDate > this.o.endDate)
+ this.viewDate = new Date(this.o.endDate);
+ else
+ this.viewDate = this.o.defaultViewDate;
+
+ if (fromArgs){
+ // setting date by clicking
+ this.setValue();
+ }
+ else if (dates.length){
+ // setting date by typing
+ if (String(oldDates) !== String(this.dates))
+ this._trigger('changeDate');
+ }
+ if (!this.dates.length && oldDates.length)
+ this._trigger('clearDate');
+
+ this.fill();
+ this.element.change();
+ return this;
+ },
+
+ fillDow: function(){
+ var dowCnt = this.o.weekStart,
+ html = '<tr>';
+ if (this.o.calendarWeeks){
+ this.picker.find('.datepicker-days .datepicker-switch')
+ .attr('colspan', function(i, val){
+ return parseInt(val) + 1;
+ });
+ html += '<th class="cw">&#160;</th>';
+ }
+ while (dowCnt < this.o.weekStart + 7){
+ html += '<th class="dow';
+ if ($.inArray(dowCnt, this.o.daysOfWeekDisabled) > -1)
+ html += ' disabled';
+ html += '">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>';
+ }
+ html += '</tr>';
+ this.picker.find('.datepicker-days thead').append(html);
+ },
+
+ fillMonths: function(){
+ var localDate = this._utc_to_local(this.viewDate);
+ var html = '',
+ i = 0;
+ while (i < 12){
+ var focused = localDate && localDate.getMonth() === i ? ' focused' : '';
+ html += '<span class="month' + focused + '">' + dates[this.o.language].monthsShort[i++]+'</span>';
+ }
+ this.picker.find('.datepicker-months td').html(html);
+ },
+
+ setRange: function(range){
+ if (!range || !range.length)
+ delete this.range;
+ else
+ this.range = $.map(range, function(d){
+ return d.valueOf();
+ });
+ this.fill();
+ },
+
+ getClassNames: function(date){
+ var cls = [],
+ year = this.viewDate.getUTCFullYear(),
+ month = this.viewDate.getUTCMonth(),
+ today = new Date();
+ if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){
+ cls.push('old');
+ }
+ else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){
+ cls.push('new');
+ }
+ if (this.focusDate && date.valueOf() === this.focusDate.valueOf())
+ cls.push('focused');
+ // Compare internal UTC date with local today, not UTC today
+ if (this.o.todayHighlight &&
+ date.getUTCFullYear() === today.getFullYear() &&
+ date.getUTCMonth() === today.getMonth() &&
+ date.getUTCDate() === today.getDate()){
+ cls.push('today');
+ }
+ if (this.dates.contains(date) !== -1)
+ cls.push('active');
+ if (!this.dateWithinRange(date)){
+ cls.push('disabled');
+ }
+ if (this.dateIsDisabled(date)){
+ cls.push('disabled', 'disabled-date');
+ }
+ if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){
+ cls.push('highlighted');
+ }
+
+ if (this.range){
+ if (date > this.range[0] && date < this.range[this.range.length-1]){
+ cls.push('range');
+ }
+ if ($.inArray(date.valueOf(), this.range) !== -1){
+ cls.push('selected');
+ }
+ if (date.valueOf() === this.range[0]){
+ cls.push('range-start');
+ }
+ if (date.valueOf() === this.range[this.range.length-1]){
+ cls.push('range-end');
+ }
+ }
+ return cls;
+ },
+
+ _fill_yearsView: function(selector, cssClass, factor, step, currentYear, startYear, endYear, callback){
+ var html, view, year, steps, startStep, endStep, thisYear, i, classes, tooltip, before;
+
+ html = '';
+ view = this.picker.find(selector);
+ year = parseInt(currentYear / factor, 10) * factor;
+ startStep = parseInt(startYear / step, 10) * step;
+ endStep = parseInt(endYear / step, 10) * step;
+ steps = $.map(this.dates, function(d){
+ return parseInt(d.getUTCFullYear() / step, 10) * step;
+ });
+
+ view.find('.datepicker-switch').text(year + '-' + (year + step * 9));
+
+ thisYear = year - step;
+ for (i = -1; i < 11; i += 1) {
+ classes = [cssClass];
+ tooltip = null;
+
+ if (i === -1) {
+ classes.push('old');
+ } else if (i === 10) {
+ classes.push('new');
+ }
+ if ($.inArray(thisYear, steps) !== -1) {
+ classes.push('active');
+ }
+ if (thisYear < startStep || thisYear > endStep) {
+ classes.push('disabled');
+ }
+ if (thisYear === this.viewDate.getFullYear()) {
+ classes.push('focused');
+ }
+
+ if (callback !== $.noop) {
+ before = callback(new Date(thisYear, 0, 1));
+ if (before === undefined) {
+ before = {};
+ } else if (typeof(before) === 'boolean') {
+ before = {enabled: before};
+ } else if (typeof(before) === 'string') {
+ before = {classes: before};
+ }
+ if (before.enabled === false) {
+ classes.push('disabled');
+ }
+ if (before.classes) {
+ classes = classes.concat(before.classes.split(/\s+/));
+ }
+ if (before.tooltip) {
+ tooltip = before.tooltip;
+ }
+ }
+
+ html += '<span class="' + classes.join(' ') + '"' + (tooltip ? ' title="' + tooltip + '"' : '') + '>' + thisYear + '</span>';
+ thisYear += step;
+ }
+ view.find('td').html(html);
+ },
+
+ fill: function(){
+ var d = new Date(this.viewDate),
+ year = d.getUTCFullYear(),
+ month = d.getUTCMonth(),
+ startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,
+ startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,
+ endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,
+ endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,
+ todaytxt = dates[this.o.language].today || dates['en'].today || '',
+ cleartxt = dates[this.o.language].clear || dates['en'].clear || '',
+ titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat,
+ tooltip,
+ before;
+ if (isNaN(year) || isNaN(month))
+ return;
+ this.picker.find('.datepicker-days .datepicker-switch')
+ .text(DPGlobal.formatDate(d, titleFormat, this.o.language));
+ this.picker.find('tfoot .today')
+ .text(todaytxt)
+ .toggle(this.o.todayBtn !== false);
+ this.picker.find('tfoot .clear')
+ .text(cleartxt)
+ .toggle(this.o.clearBtn !== false);
+ this.picker.find('thead .datepicker-title')
+ .text(this.o.title)
+ .toggle(this.o.title !== '');
+ this.updateNavArrows();
+ this.fillMonths();
+ var prevMonth = UTCDate(year, month-1, 28),
+ day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());
+ prevMonth.setUTCDate(day);
+ prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);
+ var nextMonth = new Date(prevMonth);
+ if (prevMonth.getUTCFullYear() < 100){
+ nextMonth.setUTCFullYear(prevMonth.getUTCFullYear());
+ }
+ nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
+ nextMonth = nextMonth.valueOf();
+ var html = [];
+ var clsName;
+ while (prevMonth.valueOf() < nextMonth){
+ if (prevMonth.getUTCDay() === this.o.weekStart){
+ html.push('<tr>');
+ if (this.o.calendarWeeks){
+ // ISO 8601: First week contains first thursday.
+ // ISO also states week starts on Monday, but we can be more abstract here.
+ var
+ // Start of current week: based on weekstart/current date
+ ws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5),
+ // Thursday of this week
+ th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),
+ // First Thursday of year, year from thursday
+ yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5),
+ // Calendar week: ms between thursdays, div ms per day, div 7 days
+ calWeek = (th - yth) / 864e5 / 7 + 1;
+ html.push('<td class="cw">'+ calWeek +'</td>');
+ }
+ }
+ clsName = this.getClassNames(prevMonth);
+ clsName.push('day');
+
+ if (this.o.beforeShowDay !== $.noop){
+ before = this.o.beforeShowDay(this._utc_to_local(prevMonth));
+ if (before === undefined)
+ before = {};
+ else if (typeof(before) === 'boolean')
+ before = {enabled: before};
+ else if (typeof(before) === 'string')
+ before = {classes: before};
+ if (before.enabled === false)
+ clsName.push('disabled');
+ if (before.classes)
+ clsName = clsName.concat(before.classes.split(/\s+/));
+ if (before.tooltip)
+ tooltip = before.tooltip;
+ }
+
+ //Check if uniqueSort exists (supported by jquery >=1.12 and >=2.2)
+ //Fallback to unique function for older jquery versions
+ if ($.isFunction($.uniqueSort)) {
+ clsName = $.uniqueSort(clsName);
+ } else {
+ clsName = $.unique(clsName);
+ }
+
+ html.push('<td class="'+clsName.join(' ')+'"' + (tooltip ? ' title="'+tooltip+'"' : '') + '>'+prevMonth.getUTCDate() + '</td>');
+ tooltip = null;
+ if (prevMonth.getUTCDay() === this.o.weekEnd){
+ html.push('</tr>');
+ }
+ prevMonth.setUTCDate(prevMonth.getUTCDate()+1);
+ }
+ this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
+
+ var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months';
+ var months = this.picker.find('.datepicker-months')
+ .find('.datepicker-switch')
+ .text(this.o.maxViewMode < 2 ? monthsTitle : year)
+ .end()
+ .find('span').removeClass('active');
+
+ $.each(this.dates, function(i, d){
+ if (d.getUTCFullYear() === year)
+ months.eq(d.getUTCMonth()).addClass('active');
+ });
+
+ if (year < startYear || year > endYear){
+ months.addClass('disabled');
+ }
+ if (year === startYear){
+ months.slice(0, startMonth).addClass('disabled');
+ }
+ if (year === endYear){
+ months.slice(endMonth+1).addClass('disabled');
+ }
+
+ if (this.o.beforeShowMonth !== $.noop){
+ var that = this;
+ $.each(months, function(i, month){
+ var moDate = new Date(year, i, 1);
+ var before = that.o.beforeShowMonth(moDate);
+ if (before === undefined)
+ before = {};
+ else if (typeof(before) === 'boolean')
+ before = {enabled: before};
+ else if (typeof(before) === 'string')
+ before = {classes: before};
+ if (before.enabled === false && !$(month).hasClass('disabled'))
+ $(month).addClass('disabled');
+ if (before.classes)
+ $(month).addClass(before.classes);
+ if (before.tooltip)
+ $(month).prop('title', before.tooltip);
+ });
+ }
+
+ // Generating decade/years picker
+ this._fill_yearsView(
+ '.datepicker-years',
+ 'year',
+ 10,
+ 1,
+ year,
+ startYear,
+ endYear,
+ this.o.beforeShowYear
+ );
+
+ // Generating century/decades picker
+ this._fill_yearsView(
+ '.datepicker-decades',
+ 'decade',
+ 100,
+ 10,
+ year,
+ startYear,
+ endYear,
+ this.o.beforeShowDecade
+ );
+
+ // Generating millennium/centuries picker
+ this._fill_yearsView(
+ '.datepicker-centuries',
+ 'century',
+ 1000,
+ 100,
+ year,
+ startYear,
+ endYear,
+ this.o.beforeShowCentury
+ );
+ },
+
+ updateNavArrows: function(){
+ if (!this._allow_update)
+ return;
+
+ var d = new Date(this.viewDate),
+ year = d.getUTCFullYear(),
+ month = d.getUTCMonth();
+ switch (this.viewMode){
+ case 0:
+ if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){
+ this.picker.find('.prev').css({visibility: 'hidden'});
+ }
+ else {
+ this.picker.find('.prev').css({visibility: 'visible'});
+ }
+ if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){
+ this.picker.find('.next').css({visibility: 'hidden'});
+ }
+ else {
+ this.picker.find('.next').css({visibility: 'visible'});
+ }
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() || this.o.maxViewMode < 2){
+ this.picker.find('.prev').css({visibility: 'hidden'});
+ }
+ else {
+ this.picker.find('.prev').css({visibility: 'visible'});
+ }
+ if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() || this.o.maxViewMode < 2){
+ this.picker.find('.next').css({visibility: 'hidden'});
+ }
+ else {
+ this.picker.find('.next').css({visibility: 'visible'});
+ }
+ break;
+ }
+ },
+
+ click: function(e){
+ e.preventDefault();
+ e.stopPropagation();
+
+ var target, dir, day, year, month, monthChanged, yearChanged;
+ target = $(e.target);
+
+ // Clicked on the switch
+ if (target.hasClass('datepicker-switch')){
+ this.showMode(1);
+ }
+
+ // Clicked on prev or next
+ var navArrow = target.closest('.prev, .next');
+ if (navArrow.length > 0) {
+ dir = DPGlobal.modes[this.viewMode].navStep * (navArrow.hasClass('prev') ? -1 : 1);
+ if (this.viewMode === 0){
+ this.viewDate = this.moveMonth(this.viewDate, dir);
+ this._trigger('changeMonth', this.viewDate);
+ } else {
+ this.viewDate = this.moveYear(this.viewDate, dir);
+ if (this.viewMode === 1){
+ this._trigger('changeYear', this.viewDate);
+ }
+ }
+ this.fill();
+ }
+
+ // Clicked on today button
+ if (target.hasClass('today') && !target.hasClass('day')){
+ this.showMode(-2);
+ this._setDate(UTCToday(), this.o.todayBtn === 'linked' ? null : 'view');
+ }
+
+ // Clicked on clear button
+ if (target.hasClass('clear')){
+ this.clearDates();
+ }
+
+ if (!target.hasClass('disabled')){
+ // Clicked on a day
+ if (target.hasClass('day')){
+ day = parseInt(target.text(), 10) || 1;
+ year = this.viewDate.getUTCFullYear();
+ month = this.viewDate.getUTCMonth();
+
+ // From last month
+ if (target.hasClass('old')){
+ if (month === 0) {
+ month = 11;
+ year = year - 1;
+ monthChanged = true;
+ yearChanged = true;
+ } else {
+ month = month - 1;
+ monthChanged = true;
+ }
+ }
+
+ // From next month
+ if (target.hasClass('new')) {
+ if (month === 11){
+ month = 0;
+ year = year + 1;
+ monthChanged = true;
+ yearChanged = true;
+ } else {
+ month = month + 1;
+ monthChanged = true;
+ }
+ }
+ this._setDate(UTCDate(year, month, day));
+ if (yearChanged) {
+ this._trigger('changeYear', this.viewDate);
+ }
+ if (monthChanged) {
+ this._trigger('changeMonth', this.viewDate);
+ }
+ }
+
+ // Clicked on a month
+ if (target.hasClass('month')) {
+ this.viewDate.setUTCDate(1);
+ day = 1;
+ month = target.parent().find('span').index(target);
+ year = this.viewDate.getUTCFullYear();
+ this.viewDate.setUTCMonth(month);
+ this._trigger('changeMonth', this.viewDate);
+ if (this.o.minViewMode === 1){
+ this._setDate(UTCDate(year, month, day));
+ this.showMode();
+ } else {
+ this.showMode(-1);
+ }
+ this.fill();
+ }
+
+ // Clicked on a year
+ if (target.hasClass('year')
+ || target.hasClass('decade')
+ || target.hasClass('century')) {
+ this.viewDate.setUTCDate(1);
+
+ day = 1;
+ month = 0;
+ year = parseInt(target.text(), 10)||0;
+ this.viewDate.setUTCFullYear(year);
+
+ if (target.hasClass('year')){
+ this._trigger('changeYear', this.viewDate);
+ if (this.o.minViewMode === 2){
+ this._setDate(UTCDate(year, month, day));
+ }
+ }
+ if (target.hasClass('decade')){
+ this._trigger('changeDecade', this.viewDate);
+ if (this.o.minViewMode === 3){
+ this._setDate(UTCDate(year, month, day));
+ }
+ }
+ if (target.hasClass('century')){
+ this._trigger('changeCentury', this.viewDate);
+ if (this.o.minViewMode === 4){
+ this._setDate(UTCDate(year, month, day));
+ }
+ }
+
+ this.showMode(-1);
+ this.fill();
+ }
+ }
+
+ if (this.picker.is(':visible') && this._focused_from){
+ $(this._focused_from).focus();
+ }
+ delete this._focused_from;
+ },
+
+ _toggle_multidate: function(date){
+ var ix = this.dates.contains(date);
+ if (!date){
+ this.dates.clear();
+ }
+
+ if (ix !== -1){
+ if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){
+ this.dates.remove(ix);
+ }
+ } else if (this.o.multidate === false) {
+ this.dates.clear();
+ this.dates.push(date);
+ }
+ else {
+ this.dates.push(date);
+ }
+
+ if (typeof this.o.multidate === 'number')
+ while (this.dates.length > this.o.multidate)
+ this.dates.remove(0);
+ },
+
+ _setDate: function(date, which){
+ if (!which || which === 'date')
+ this._toggle_multidate(date && new Date(date));
+ if (!which || which === 'view')
+ this.viewDate = date && new Date(date);
+
+ this.fill();
+ this.setValue();
+ if (!which || which !== 'view') {
+ this._trigger('changeDate');
+ }
+ if (this.inputField){
+ this.inputField.change();
+ }
+ if (this.o.autoclose && (!which || which === 'date')){
+ this.hide();
+ }
+ },
+
+ moveDay: function(date, dir){
+ var newDate = new Date(date);
+ newDate.setUTCDate(date.getUTCDate() + dir);
+
+ return newDate;
+ },
+
+ moveWeek: function(date, dir){
+ return this.moveDay(date, dir * 7);
+ },
+
+ moveMonth: function(date, dir){
+ if (!isValidDate(date))
+ return this.o.defaultViewDate;
+ if (!dir)
+ return date;
+ var new_date = new Date(date.valueOf()),
+ day = new_date.getUTCDate(),
+ month = new_date.getUTCMonth(),
+ mag = Math.abs(dir),
+ new_month, test;
+ dir = dir > 0 ? 1 : -1;
+ if (mag === 1){
+ test = dir === -1
+ // If going back one month, make sure month is not current month
+ // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
+ ? function(){
+ return new_date.getUTCMonth() === month;
+ }
+ // If going forward one month, make sure month is as expected
+ // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
+ : function(){
+ return new_date.getUTCMonth() !== new_month;
+ };
+ new_month = month + dir;
+ new_date.setUTCMonth(new_month);
+ // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
+ if (new_month < 0 || new_month > 11)
+ new_month = (new_month + 12) % 12;
+ }
+ else {
+ // For magnitudes >1, move one month at a time...
+ for (var i=0; i < mag; i++)
+ // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
+ new_date = this.moveMonth(new_date, dir);
+ // ...then reset the day, keeping it in the new month
+ new_month = new_date.getUTCMonth();
+ new_date.setUTCDate(day);
+ test = function(){
+ return new_month !== new_date.getUTCMonth();
+ };
+ }
+ // Common date-resetting loop -- if date is beyond end of month, make it
+ // end of month
+ while (test()){
+ new_date.setUTCDate(--day);
+ new_date.setUTCMonth(new_month);
+ }
+ return new_date;
+ },
+
+ moveYear: function(date, dir){
+ return this.moveMonth(date, dir*12);
+ },
+
+ moveAvailableDate: function(date, dir, fn){
+ do {
+ date = this[fn](date, dir);
+
+ if (!this.dateWithinRange(date))
+ return false;
+
+ fn = 'moveDay';
+ }
+ while (this.dateIsDisabled(date));
+
+ return date;
+ },
+
+ weekOfDateIsDisabled: function(date){
+ return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1;
+ },
+
+ dateIsDisabled: function(date){
+ return (
+ this.weekOfDateIsDisabled(date) ||
+ $.grep(this.o.datesDisabled, function(d){
+ return isUTCEquals(date, d);
+ }).length > 0
+ );
+ },
+
+ dateWithinRange: function(date){
+ return date >= this.o.startDate && date <= this.o.endDate;
+ },
+
+ keydown: function(e){
+ if (!this.picker.is(':visible')){
+ if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker
+ this.show();
+ e.stopPropagation();
+ }
+ return;
+ }
+ var dateChanged = false,
+ dir, newViewDate,
+ focusDate = this.focusDate || this.viewDate;
+ switch (e.keyCode){
+ case 27: // escape
+ if (this.focusDate){
+ this.focusDate = null;
+ this.viewDate = this.dates.get(-1) || this.viewDate;
+ this.fill();
+ }
+ else
+ this.hide();
+ e.preventDefault();
+ e.stopPropagation();
+ break;
+ case 37: // left
+ case 38: // up
+ case 39: // right
+ case 40: // down
+ if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7)
+ break;
+ dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1;
+ if (this.viewMode === 0) {
+ if (e.ctrlKey){
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
+
+ if (newViewDate)
+ this._trigger('changeYear', this.viewDate);
+ }
+ else if (e.shiftKey){
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
+
+ if (newViewDate)
+ this._trigger('changeMonth', this.viewDate);
+ }
+ else if (e.keyCode === 37 || e.keyCode === 39){
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay');
+ }
+ else if (!this.weekOfDateIsDisabled(focusDate)){
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek');
+ }
+ } else if (this.viewMode === 1) {
+ if (e.keyCode === 38 || e.keyCode === 40) {
+ dir = dir * 4;
+ }
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
+ } else if (this.viewMode === 2) {
+ if (e.keyCode === 38 || e.keyCode === 40) {
+ dir = dir * 4;
+ }
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
+ }
+ if (newViewDate){
+ this.focusDate = this.viewDate = newViewDate;
+ this.setValue();
+ this.fill();
+ e.preventDefault();
+ }
+ break;
+ case 13: // enter
+ if (!this.o.forceParse)
+ break;
+ focusDate = this.focusDate || this.dates.get(-1) || this.viewDate;
+ if (this.o.keyboardNavigation) {
+ this._toggle_multidate(focusDate);
+ dateChanged = true;
+ }
+ this.focusDate = null;
+ this.viewDate = this.dates.get(-1) || this.viewDate;
+ this.setValue();
+ this.fill();
+ if (this.picker.is(':visible')){
+ e.preventDefault();
+ e.stopPropagation();
+ if (this.o.autoclose)
+ this.hide();
+ }
+ break;
+ case 9: // tab
+ this.focusDate = null;
+ this.viewDate = this.dates.get(-1) || this.viewDate;
+ this.fill();
+ this.hide();
+ break;
+ }
+ if (dateChanged){
+ if (this.dates.length)
+ this._trigger('changeDate');
+ else
+ this._trigger('clearDate');
+ if (this.inputField){
+ this.inputField.change();
+ }
+ }
+ },
+
+ showMode: function(dir){
+ if (dir){
+ this.viewMode = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, this.viewMode + dir));
+ }
+ this.picker
+ .children('div')
+ .hide()
+ .filter('.datepicker-' + DPGlobal.modes[this.viewMode].clsName)
+ .show();
+ this.updateNavArrows();
+ }
+ };
+
+ var DateRangePicker = function(element, options){
+ $(element).data('datepicker', this);
+ this.element = $(element);
+ this.inputs = $.map(options.inputs, function(i){
+ return i.jquery ? i[0] : i;
+ });
+ delete options.inputs;
+
+ datepickerPlugin.call($(this.inputs), options)
+ .on('changeDate', $.proxy(this.dateUpdated, this));
+
+ this.pickers = $.map(this.inputs, function(i){
+ return $(i).data('datepicker');
+ });
+ this.updateDates();
+ };
+ DateRangePicker.prototype = {
+ updateDates: function(){
+ this.dates = $.map(this.pickers, function(i){
+ return i.getUTCDate();
+ });
+ this.updateRanges();
+ },
+ updateRanges: function(){
+ var range = $.map(this.dates, function(d){
+ return d.valueOf();
+ });
+ $.each(this.pickers, function(i, p){
+ p.setRange(range);
+ });
+ },
+ dateUpdated: function(e){
+ // `this.updating` is a workaround for preventing infinite recursion
+ // between `changeDate` triggering and `setUTCDate` calling. Until
+ // there is a better mechanism.
+ if (this.updating)
+ return;
+ this.updating = true;
+
+ var dp = $(e.target).data('datepicker');
+
+ if (typeof(dp) === "undefined") {
+ return;
+ }
+
+ var new_date = dp.getUTCDate(),
+ i = $.inArray(e.target, this.inputs),
+ j = i - 1,
+ k = i + 1,
+ l = this.inputs.length;
+ if (i === -1)
+ return;
+
+ $.each(this.pickers, function(i, p){
+ if (!p.getUTCDate())
+ p.setUTCDate(new_date);
+ });
+
+ if (new_date < this.dates[j]){
+ // Date being moved earlier/left
+ while (j >= 0 && new_date < this.dates[j]){
+ this.pickers[j--].setUTCDate(new_date);
+ }
+ }
+ else if (new_date > this.dates[k]){
+ // Date being moved later/right
+ while (k < l && new_date > this.dates[k]){
+ this.pickers[k++].setUTCDate(new_date);
+ }
+ }
+ this.updateDates();
+
+ delete this.updating;
+ },
+ remove: function(){
+ $.map(this.pickers, function(p){ p.remove(); });
+ delete this.element.data().datepicker;
+ }
+ };
+
+ function opts_from_el(el, prefix){
+ // Derive options from element data-attrs
+ var data = $(el).data(),
+ out = {}, inkey,
+ replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');
+ prefix = new RegExp('^' + prefix.toLowerCase());
+ function re_lower(_,a){
+ return a.toLowerCase();
+ }
+ for (var key in data)
+ if (prefix.test(key)){
+ inkey = key.replace(replace, re_lower);
+ out[inkey] = data[key];
+ }
+ return out;
+ }
+
+ function opts_from_locale(lang){
+ // Derive options from locale plugins
+ var out = {};
+ // Check if "de-DE" style date is available, if not language should
+ // fallback to 2 letter code eg "de"
+ if (!dates[lang]){
+ lang = lang.split('-')[0];
+ if (!dates[lang])
+ return;
+ }
+ var d = dates[lang];
+ $.each(locale_opts, function(i,k){
+ if (k in d)
+ out[k] = d[k];
+ });
+ return out;
+ }
+
+ var old = $.fn.datepicker;
+ var datepickerPlugin = function(option){
+ var args = Array.apply(null, arguments);
+ args.shift();
+ var internal_return;
+ this.each(function(){
+ var $this = $(this),
+ data = $this.data('datepicker'),
+ options = typeof option === 'object' && option;
+ if (!data){
+ var elopts = opts_from_el(this, 'date'),
+ // Preliminary otions
+ xopts = $.extend({}, defaults, elopts, options),
+ locopts = opts_from_locale(xopts.language),
+ // Options priority: js args, data-attrs, locales, defaults
+ opts = $.extend({}, defaults, locopts, elopts, options);
+ if ($this.hasClass('input-daterange') || opts.inputs){
+ $.extend(opts, {
+ inputs: opts.inputs || $this.find('input').toArray()
+ });
+ data = new DateRangePicker(this, opts);
+ }
+ else {
+ data = new Datepicker(this, opts);
+ }
+ $this.data('datepicker', data);
+ }
+ if (typeof option === 'string' && typeof data[option] === 'function'){
+ internal_return = data[option].apply(data, args);
+ }
+ });
+
+ if (
+ internal_return === undefined ||
+ internal_return instanceof Datepicker ||
+ internal_return instanceof DateRangePicker
+ )
+ return this;
+
+ if (this.length > 1)
+ throw new Error('Using only allowed for the collection of a single element (' + option + ' function)');
+ else
+ return internal_return;
+ };
+ $.fn.datepicker = datepickerPlugin;
+
+ var defaults = $.fn.datepicker.defaults = {
+ assumeNearbyYear: false,
+ autoclose: false,
+ beforeShowDay: $.noop,
+ beforeShowMonth: $.noop,
+ beforeShowYear: $.noop,
+ beforeShowDecade: $.noop,
+ beforeShowCentury: $.noop,
+ calendarWeeks: false,
+ clearBtn: false,
+ toggleActive: false,
+ daysOfWeekDisabled: [],
+ daysOfWeekHighlighted: [],
+ datesDisabled: [],
+ endDate: Infinity,
+ forceParse: true,
+ format: 'mm/dd/yyyy',
+ keyboardNavigation: true,
+ language: 'en',
+ minViewMode: 0,
+ maxViewMode: 4,
+ multidate: false,
+ multidateSeparator: ',',
+ orientation: "auto",
+ rtl: false,
+ startDate: -Infinity,
+ startView: 0,
+ todayBtn: false,
+ todayHighlight: false,
+ weekStart: 0,
+ disableTouchKeyboard: false,
+ enableOnReadonly: true,
+ showOnFocus: true,
+ zIndexOffset: 10,
+ container: 'body',
+ immediateUpdates: false,
+ title: '',
+ templates: {
+ leftArrow: '&laquo;',
+ rightArrow: '&raquo;'
+ }
+ };
+ var locale_opts = $.fn.datepicker.locale_opts = [
+ 'format',
+ 'rtl',
+ 'weekStart'
+ ];
+ $.fn.datepicker.Constructor = Datepicker;
+ var dates = $.fn.datepicker.dates = {
+ en: {
+ days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+ daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
+ daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
+ months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+ monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+ today: "Today",
+ clear: "Clear",
+ titleFormat: "MM yyyy"
+ }
+ };
+
+ var DPGlobal = {
+ modes: [
+ {
+ clsName: 'days',
+ navFnc: 'Month',
+ navStep: 1
+ },
+ {
+ clsName: 'months',
+ navFnc: 'FullYear',
+ navStep: 1
+ },
+ {
+ clsName: 'years',
+ navFnc: 'FullYear',
+ navStep: 10
+ },
+ {
+ clsName: 'decades',
+ navFnc: 'FullDecade',
+ navStep: 100
+ },
+ {
+ clsName: 'centuries',
+ navFnc: 'FullCentury',
+ navStep: 1000
+ }],
+ isLeapYear: function(year){
+ return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));
+ },
+ getDaysInMonth: function(year, month){
+ return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
+ },
+ validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
+ nonpunctuation: /[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g,
+ parseFormat: function(format){
+ if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function')
+ return format;
+ // IE treats \0 as a string end in inputs (truncating the value),
+ // so it's a bad format delimiter, anyway
+ var separators = format.replace(this.validParts, '\0').split('\0'),
+ parts = format.match(this.validParts);
+ if (!separators || !separators.length || !parts || parts.length === 0){
+ throw new Error("Invalid date format.");
+ }
+ return {separators: separators, parts: parts};
+ },
+ parseDate: function(date, format, language, assumeNearby){
+ if (!date)
+ return undefined;
+ if (date instanceof Date)
+ return date;
+ if (typeof format === 'string')
+ format = DPGlobal.parseFormat(format);
+ if (format.toValue)
+ return format.toValue(date, format, language);
+ var part_re = /([\-+]\d+)([dmwy])/,
+ parts = date.match(/([\-+]\d+)([dmwy])/g),
+ fn_map = {
+ d: 'moveDay',
+ m: 'moveMonth',
+ w: 'moveWeek',
+ y: 'moveYear'
+ },
+ dateAliases = {
+ yesterday: '-1d',
+ today: '+0d',
+ tomorrow: '+1d'
+ },
+ part, dir, i, fn;
+ if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){
+ date = new Date();
+ for (i=0; i < parts.length; i++){
+ part = part_re.exec(parts[i]);
+ dir = parseInt(part[1]);
+ fn = fn_map[part[2]];
+ date = Datepicker.prototype[fn](date, dir);
+ }
+ return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
+ }
+
+ if (typeof dateAliases[date] !== 'undefined') {
+ date = dateAliases[date];
+ parts = date.match(/([\-+]\d+)([dmwy])/g);
+
+ if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){
+ date = new Date();
+ for (i=0; i < parts.length; i++){
+ part = part_re.exec(parts[i]);
+ dir = parseInt(part[1]);
+ fn = fn_map[part[2]];
+ date = Datepicker.prototype[fn](date, dir);
+ }
+
+ return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
+ }
+ }
+
+ parts = date && date.match(this.nonpunctuation) || [];
+ date = new Date();
+
+ function applyNearbyYear(year, threshold){
+ if (threshold === true)
+ threshold = 10;
+
+ // if year is 2 digits or less, than the user most likely is trying to get a recent century
+ if (year < 100){
+ year += 2000;
+ // if the new year is more than threshold years in advance, use last century
+ if (year > ((new Date()).getFullYear()+threshold)){
+ year -= 100;
+ }
+ }
+
+ return year;
+ }
+
+ var parsed = {},
+ setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
+ setters_map = {
+ yyyy: function(d,v){
+ return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v);
+ },
+ yy: function(d,v){
+ return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v);
+ },
+ m: function(d,v){
+ if (isNaN(d))
+ return d;
+ v -= 1;
+ while (v < 0) v += 12;
+ v %= 12;
+ d.setUTCMonth(v);
+ while (d.getUTCMonth() !== v)
+ d.setUTCDate(d.getUTCDate()-1);
+ return d;
+ },
+ d: function(d,v){
+ return d.setUTCDate(v);
+ }
+ },
+ val, filtered;
+ setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
+ setters_map['dd'] = setters_map['d'];
+ date = UTCToday();
+ var fparts = format.parts.slice();
+ // Remove noop parts
+ if (parts.length !== fparts.length){
+ fparts = $(fparts).filter(function(i,p){
+ return $.inArray(p, setters_order) !== -1;
+ }).toArray();
+ }
+ // Process remainder
+ function match_part(){
+ var m = this.slice(0, parts[i].length),
+ p = parts[i].slice(0, m.length);
+ return m.toLowerCase() === p.toLowerCase();
+ }
+ if (parts.length === fparts.length){
+ var cnt;
+ for (i=0, cnt = fparts.length; i < cnt; i++){
+ val = parseInt(parts[i], 10);
+ part = fparts[i];
+ if (isNaN(val)){
+ switch (part){
+ case 'MM':
+ filtered = $(dates[language].months).filter(match_part);
+ val = $.inArray(filtered[0], dates[language].months) + 1;
+ break;
+ case 'M':
+ filtered = $(dates[language].monthsShort).filter(match_part);
+ val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
+ break;
+ }
+ }
+ parsed[part] = val;
+ }
+ var _date, s;
+ for (i=0; i < setters_order.length; i++){
+ s = setters_order[i];
+ if (s in parsed && !isNaN(parsed[s])){
+ _date = new Date(date);
+ setters_map[s](_date, parsed[s]);
+ if (!isNaN(_date))
+ date = _date;
+ }
+ }
+ }
+ return date;
+ },
+ formatDate: function(date, format, language){
+ if (!date)
+ return '';
+ if (typeof format === 'string')
+ format = DPGlobal.parseFormat(format);
+ if (format.toDisplay)
+ return format.toDisplay(date, format, language);
+ var val = {
+ d: date.getUTCDate(),
+ D: dates[language].daysShort[date.getUTCDay()],
+ DD: dates[language].days[date.getUTCDay()],
+ m: date.getUTCMonth() + 1,
+ M: dates[language].monthsShort[date.getUTCMonth()],
+ MM: dates[language].months[date.getUTCMonth()],
+ yy: date.getUTCFullYear().toString().substring(2),
+ yyyy: date.getUTCFullYear()
+ };
+ val.dd = (val.d < 10 ? '0' : '') + val.d;
+ val.mm = (val.m < 10 ? '0' : '') + val.m;
+ date = [];
+ var seps = $.extend([], format.separators);
+ for (var i=0, cnt = format.parts.length; i <= cnt; i++){
+ if (seps.length)
+ date.push(seps.shift());
+ date.push(val[format.parts[i]]);
+ }
+ return date.join('');
+ },
+ headTemplate: '<thead>'+
+ '<tr>'+
+ '<th colspan="7" class="datepicker-title"></th>'+
+ '</tr>'+
+ '<tr>'+
+ '<th class="prev">&laquo;</th>'+
+ '<th colspan="5" class="datepicker-switch"></th>'+
+ '<th class="next">&raquo;</th>'+
+ '</tr>'+
+ '</thead>',
+ contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>',
+ footTemplate: '<tfoot>'+
+ '<tr>'+
+ '<th colspan="7" class="today"></th>'+
+ '</tr>'+
+ '<tr>'+
+ '<th colspan="7" class="clear"></th>'+
+ '</tr>'+
+ '</tfoot>'
+ };
+ DPGlobal.template = '<div class="datepicker">'+
+ '<div class="datepicker-days">'+
+ '<table class="table-condensed">'+
+ DPGlobal.headTemplate+
+ '<tbody></tbody>'+
+ DPGlobal.footTemplate+
+ '</table>'+
+ '</div>'+
+ '<div class="datepicker-months">'+
+ '<table class="table-condensed">'+
+ DPGlobal.headTemplate+
+ DPGlobal.contTemplate+
+ DPGlobal.footTemplate+
+ '</table>'+
+ '</div>'+
+ '<div class="datepicker-years">'+
+ '<table class="table-condensed">'+
+ DPGlobal.headTemplate+
+ DPGlobal.contTemplate+
+ DPGlobal.footTemplate+
+ '</table>'+
+ '</div>'+
+ '<div class="datepicker-decades">'+
+ '<table class="table-condensed">'+
+ DPGlobal.headTemplate+
+ DPGlobal.contTemplate+
+ DPGlobal.footTemplate+
+ '</table>'+
+ '</div>'+
+ '<div class="datepicker-centuries">'+
+ '<table class="table-condensed">'+
+ DPGlobal.headTemplate+
+ DPGlobal.contTemplate+
+ DPGlobal.footTemplate+
+ '</table>'+
+ '</div>'+
+ '</div>';
+
+ $.fn.datepicker.DPGlobal = DPGlobal;
+
+
+ /* DATEPICKER NO CONFLICT
+ * =================== */
+
+ $.fn.datepicker.noConflict = function(){
+ $.fn.datepicker = old;
+ return this;
+ };
+
+ /* DATEPICKER VERSION
+ * =================== */
+ $.fn.datepicker.version = '1.6.4';
+
+ /* DATEPICKER DATA-API
+ * ================== */
+
+ $(document).on(
+ 'focus.datepicker.data-api click.datepicker.data-api',
+ '[data-provide="datepicker"]',
+ function(e){
+ var $this = $(this);
+ if ($this.data('datepicker'))
+ return;
+ e.preventDefault();
+ // component click requires us to explicitly show it
+ datepickerPlugin.call($this, 'show');
+ }
+ );
+ $(function(){
+ datepickerPlugin.call($('[data-provide="datepicker-inline"]'));
+ });
+
+}));
diff --git a/ihatemoney/static/js/bootstrap.min.js b/ihatemoney/static/js/bootstrap.min.js
new file mode 100644
index 0000000..d9c72df
--- /dev/null
+++ b/ihatemoney/static/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");+function(t){var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(jQuery),+function(){function t(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function e(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),r=function(t){function e(t){return{}.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function n(t){return(t[0]||t).nodeType}function i(){return{bindType:a.end,delegateType:a.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}}function o(){if(window.QUnit)return!1;var t=document.createElement("bootstrap");for(var e in h)if(void 0!==t.style[e])return{end:h[e]};return!1}function r(e){var n=this,i=!1;return t(this).one(c.TRANSITION_END,function(){i=!0}),setTimeout(function(){i||c.triggerTransitionEnd(n)},e),this}function s(){a=o(),t.fn.emulateTransitionEnd=r,c.supportsTransitionEnd()&&(t.event.special[c.TRANSITION_END]=i())}var a=!1,l=1e6,h={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do t+=~~(Math.random()*l);while(document.getElementById(t));return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");return e||(e=t.getAttribute("href")||"",e=/^#[a-z]/i.test(e)?e:null),e},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(a.end)},supportsTransitionEnd:function(){return Boolean(a)},typeCheckConfig:function(t,i,o){for(var r in o)if(o.hasOwnProperty(r)){var s=o[r],a=i[r],l=a&&n(a)?"element":e(a);if(!new RegExp(s).test(l))throw new Error(t.toUpperCase()+": "+('Option "'+r+'" provided type "'+l+'" ')+('but expected type "'+s+'".'))}}};return s(),c}(jQuery),s=(function(t){var e="alert",i="4.0.0-alpha.6",s="bs.alert",a="."+s,l=".data-api",h=t.fn[e],c=150,u={DISMISS:'[data-dismiss="alert"]'},d={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+l},f={ALERT:"alert",FADE:"fade",SHOW:"show"},_=function(){function e(t){n(this,e),this._element=t}return e.prototype.close=function(t){t=t||this._element;var e=this._getRootElement(t),n=this._triggerCloseEvent(e);n.isDefaultPrevented()||this._removeElement(e)},e.prototype.dispose=function(){t.removeData(this._element,s),this._element=null},e.prototype._getRootElement=function(e){var n=r.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+f.ALERT)[0]),i},e.prototype._triggerCloseEvent=function(e){var n=t.Event(d.CLOSE);return t(e).trigger(n),n},e.prototype._removeElement=function(e){var n=this;return t(e).removeClass(f.SHOW),r.supportsTransitionEnd()&&t(e).hasClass(f.FADE)?void t(e).one(r.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(c):void this._destroyElement(e)},e.prototype._destroyElement=function(e){t(e).detach().trigger(d.CLOSED).remove()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data(s);o||(o=new e(this),i.data(s,o)),"close"===n&&o[n](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(e,null,[{key:"VERSION",get:function(){return i}}]),e}();return t(document).on(d.CLICK_DATA_API,u.DISMISS,_._handleDismiss(new _)),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=h,_._jQueryInterface},_}(jQuery),function(t){var e="button",i="4.0.0-alpha.6",r="bs.button",s="."+r,a=".data-api",l=t.fn[e],h={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},c={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},u={CLICK_DATA_API:"click"+s+a,FOCUS_BLUR_DATA_API:"focus"+s+a+" "+("blur"+s+a)},d=function(){function e(t){n(this,e),this._element=t}return e.prototype.toggle=function(){var e=!0,n=t(this._element).closest(c.DATA_TOGGLE)[0];if(n){var i=t(this._element).find(c.INPUT)[0];if(i){if("radio"===i.type)if(i.checked&&t(this._element).hasClass(h.ACTIVE))e=!1;else{var o=t(n).find(c.ACTIVE)[0];o&&t(o).removeClass(h.ACTIVE)}e&&(i.checked=!t(this._element).hasClass(h.ACTIVE),t(i).trigger("change")),i.focus()}}this._element.setAttribute("aria-pressed",!t(this._element).hasClass(h.ACTIVE)),e&&t(this._element).toggleClass(h.ACTIVE)},e.prototype.dispose=function(){t.removeData(this._element,r),this._element=null},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data(r);i||(i=new e(this),t(this).data(r,i)),"toggle"===n&&i[n]()})},o(e,null,[{key:"VERSION",get:function(){return i}}]),e}();return t(document).on(u.CLICK_DATA_API,c.DATA_TOGGLE_CARROT,function(e){e.preventDefault();var n=e.target;t(n).hasClass(h.BUTTON)||(n=t(n).closest(c.BUTTON)),d._jQueryInterface.call(t(n),"toggle")}).on(u.FOCUS_BLUR_DATA_API,c.DATA_TOGGLE_CARROT,function(e){var n=t(e.target).closest(c.BUTTON)[0];t(n).toggleClass(h.FOCUS,/^focus(in)?$/.test(e.type))}),t.fn[e]=d._jQueryInterface,t.fn[e].Constructor=d,t.fn[e].noConflict=function(){return t.fn[e]=l,d._jQueryInterface},d}(jQuery),function(t){var e="carousel",s="4.0.0-alpha.6",a="bs.carousel",l="."+a,h=".data-api",c=t.fn[e],u=600,d=37,f=39,_={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},g={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},p={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},m={SLIDE:"slide"+l,SLID:"slid"+l,KEYDOWN:"keydown"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l,LOAD_DATA_API:"load"+l+h,CLICK_DATA_API:"click"+l+h},E={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},v={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},T=function(){function h(e,i){n(this,h),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this._config=this._getConfig(i),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(v.INDICATORS)[0],this._addEventListeners()}return h.prototype.next=function(){if(this._isSliding)throw new Error("Carousel is sliding");this._slide(p.NEXT)},h.prototype.nextWhenVisible=function(){document.hidden||this.next()},h.prototype.prev=function(){if(this._isSliding)throw new Error("Carousel is sliding");this._slide(p.PREVIOUS)},h.prototype.pause=function(e){e||(this._isPaused=!0),t(this._element).find(v.NEXT_PREV)[0]&&r.supportsTransitionEnd()&&(r.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},h.prototype.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},h.prototype.to=function(e){var n=this;this._activeElement=t(this._element).find(v.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0)){if(this._isSliding)return void t(this._element).one(m.SLID,function(){return n.to(e)});if(i===e)return this.pause(),void this.cycle();var o=e>i?p.NEXT:p.PREVIOUS;this._slide(o,this._items[e])}},h.prototype.dispose=function(){t(this._element).off(l),t.removeData(this._element,a),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},h.prototype._getConfig=function(n){return n=t.extend({},_,n),r.typeCheckConfig(e,n,g),n},h.prototype._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(m.KEYDOWN,function(t){return e._keydown(t)}),"hover"!==this._config.pause||"ontouchstart"in document.documentElement||t(this._element).on(m.MOUSEENTER,function(t){return e.pause(t)}).on(m.MOUSELEAVE,function(t){return e.cycle(t)})},h.prototype._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case d:t.preventDefault(),this.prev();break;case f:t.preventDefault(),this.next();break;default:return}},h.prototype._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(v.ITEM)),this._items.indexOf(e)},h.prototype._getItemByDirection=function(t,e){var n=t===p.NEXT,i=t===p.PREVIOUS,o=this._getItemIndex(e),r=this._items.length-1,s=i&&0===o||n&&o===r;if(s&&!this._config.wrap)return e;var a=t===p.PREVIOUS?-1:1,l=(o+a)%this._items.length;return l===-1?this._items[this._items.length-1]:this._items[l]},h.prototype._triggerSlideEvent=function(e,n){var i=t.Event(m.SLIDE,{relatedTarget:e,direction:n});return t(this._element).trigger(i),i},h.prototype._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(v.ACTIVE).removeClass(E.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(E.ACTIVE)}},h.prototype._slide=function(e,n){var i=this,o=t(this._element).find(v.ACTIVE_ITEM)[0],s=n||o&&this._getItemByDirection(e,o),a=Boolean(this._interval),l=void 0,h=void 0,c=void 0;if(e===p.NEXT?(l=E.LEFT,h=E.NEXT,c=p.LEFT):(l=E.RIGHT,h=E.PREV,c=p.RIGHT),s&&t(s).hasClass(E.ACTIVE))return void(this._isSliding=!1);var d=this._triggerSlideEvent(s,c);if(!d.isDefaultPrevented()&&o&&s){this._isSliding=!0,a&&this.pause(),this._setActiveIndicatorElement(s);var f=t.Event(m.SLID,{relatedTarget:s,direction:c});r.supportsTransitionEnd()&&t(this._element).hasClass(E.SLIDE)?(t(s).addClass(h),r.reflow(s),t(o).addClass(l),t(s).addClass(l),t(o).one(r.TRANSITION_END,function(){t(s).removeClass(l+" "+h).addClass(E.ACTIVE),t(o).removeClass(E.ACTIVE+" "+h+" "+l),i._isSliding=!1,setTimeout(function(){return t(i._element).trigger(f)},0)}).emulateTransitionEnd(u)):(t(o).removeClass(E.ACTIVE),t(s).addClass(E.ACTIVE),this._isSliding=!1,t(this._element).trigger(f)),a&&this.cycle()}},h._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(a),o=t.extend({},_,t(this).data());"object"===("undefined"==typeof e?"undefined":i(e))&&t.extend(o,e);var r="string"==typeof e?e:o.slide;if(n||(n=new h(this,o),t(this).data(a,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new Error('No method named "'+r+'"');n[r]()}else o.interval&&(n.pause(),n.cycle())})},h._dataApiClickHandler=function(e){var n=r.getSelectorFromElement(this);if(n){var i=t(n)[0];if(i&&t(i).hasClass(E.CAROUSEL)){var o=t.extend({},t(i).data(),t(this).data()),s=this.getAttribute("data-slide-to");s&&(o.interval=!1),h._jQueryInterface.call(t(i),o),s&&t(i).data(a).to(s),e.preventDefault()}}},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return _}}]),h}();return t(document).on(m.CLICK_DATA_API,v.DATA_SLIDE,T._dataApiClickHandler),t(window).on(m.LOAD_DATA_API,function(){t(v.DATA_RIDE).each(function(){var e=t(this);T._jQueryInterface.call(e,e.data())})}),t.fn[e]=T._jQueryInterface,t.fn[e].Constructor=T,t.fn[e].noConflict=function(){return t.fn[e]=c,T._jQueryInterface},T}(jQuery),function(t){var e="collapse",s="4.0.0-alpha.6",a="bs.collapse",l="."+a,h=".data-api",c=t.fn[e],u=600,d={toggle:!0,parent:""},f={toggle:"boolean",parent:"string"},_={SHOW:"show"+l,SHOWN:"shown"+l,HIDE:"hide"+l,HIDDEN:"hidden"+l,CLICK_DATA_API:"click"+l+h},g={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},p={WIDTH:"width",HEIGHT:"height"},m={ACTIVES:".card > .show, .card > .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},E=function(){function l(e,i){n(this,l),this._isTransitioning=!1,this._element=e,this._config=this._getConfig(i),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],'+('[data-toggle="collapse"][data-target="#'+e.id+'"]'))),this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}return l.prototype.toggle=function(){t(this._element).hasClass(g.SHOW)?this.hide():this.show()},l.prototype.show=function(){var e=this;if(this._isTransitioning)throw new Error("Collapse is transitioning");if(!t(this._element).hasClass(g.SHOW)){var n=void 0,i=void 0;if(this._parent&&(n=t.makeArray(t(this._parent).find(m.ACTIVES)),n.length||(n=null)),!(n&&(i=t(n).data(a),i&&i._isTransitioning))){var o=t.Event(_.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(l._jQueryInterface.call(t(n),"hide"),i||t(n).data(a,null));var s=this._getDimension();t(this._element).removeClass(g.COLLAPSE).addClass(g.COLLAPSING),this._element.style[s]=0,this._element.setAttribute("aria-expanded",!0),this._triggerArray.length&&t(this._triggerArray).removeClass(g.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(g.COLLAPSING).addClass(g.COLLAPSE).addClass(g.SHOW),e._element.style[s]="",e.setTransitioning(!1),t(e._element).trigger(_.SHOWN)};if(!r.supportsTransitionEnd())return void h();var c=s[0].toUpperCase()+s.slice(1),d="scroll"+c;t(this._element).one(r.TRANSITION_END,h).emulateTransitionEnd(u),this._element.style[s]=this._element[d]+"px"}}}},l.prototype.hide=function(){var e=this;if(this._isTransitioning)throw new Error("Collapse is transitioning");if(t(this._element).hasClass(g.SHOW)){var n=t.Event(_.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension(),o=i===p.WIDTH?"offsetWidth":"offsetHeight";this._element.style[i]=this._element[o]+"px",r.reflow(this._element),t(this._element).addClass(g.COLLAPSING).removeClass(g.COLLAPSE).removeClass(g.SHOW),this._element.setAttribute("aria-expanded",!1),this._triggerArray.length&&t(this._triggerArray).addClass(g.COLLAPSED).attr("aria-expanded",!1),this.setTransitioning(!0);var s=function(){e.setTransitioning(!1),t(e._element).removeClass(g.COLLAPSING).addClass(g.COLLAPSE).trigger(_.HIDDEN)};return this._element.style[i]="",r.supportsTransitionEnd()?void t(this._element).one(r.TRANSITION_END,s).emulateTransitionEnd(u):void s()}}},l.prototype.setTransitioning=function(t){this._isTransitioning=t},l.prototype.dispose=function(){t.removeData(this._element,a),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},l.prototype._getConfig=function(n){return n=t.extend({},d,n),n.toggle=Boolean(n.toggle),r.typeCheckConfig(e,n,f),n},l.prototype._getDimension=function(){var e=t(this._element).hasClass(p.WIDTH);return e?p.WIDTH:p.HEIGHT},l.prototype._getParent=function(){var e=this,n=t(this._config.parent)[0],i='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(i).each(function(t,n){e._addAriaAndCollapsedClass(l._getTargetFromElement(n),[n])}),n},l.prototype._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(g.SHOW);e.setAttribute("aria-expanded",i),n.length&&t(n).toggleClass(g.COLLAPSED,!i).attr("aria-expanded",i)}},l._getTargetFromElement=function(e){var n=r.getSelectorFromElement(e);return n?t(n)[0]:null},l._jQueryInterface=function(e){return this.each(function(){var n=t(this),o=n.data(a),r=t.extend({},d,n.data(),"object"===("undefined"==typeof e?"undefined":i(e))&&e);if(!o&&r.toggle&&/show|hide/.test(e)&&(r.toggle=!1),o||(o=new l(this,r),n.data(a,o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e]()}})},o(l,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return d}}]),l}();return t(document).on(_.CLICK_DATA_API,m.DATA_TOGGLE,function(e){e.preventDefault();var n=E._getTargetFromElement(this),i=t(n).data(a),o=i?"toggle":t(this).data();E._jQueryInterface.call(t(n),o)}),t.fn[e]=E._jQueryInterface,t.fn[e].Constructor=E,t.fn[e].noConflict=function(){return t.fn[e]=c,E._jQueryInterface},E}(jQuery),function(t){var e="dropdown",i="4.0.0-alpha.6",s="bs.dropdown",a="."+s,l=".data-api",h=t.fn[e],c=27,u=38,d=40,f=3,_={HIDE:"hide"+a,HIDDEN:"hidden"+a,SHOW:"show"+a,SHOWN:"shown"+a,CLICK:"click"+a,CLICK_DATA_API:"click"+a+l,FOCUSIN_DATA_API:"focusin"+a+l,KEYDOWN_DATA_API:"keydown"+a+l},g={BACKDROP:"dropdown-backdrop",DISABLED:"disabled",SHOW:"show"},p={BACKDROP:".dropdown-backdrop",DATA_TOGGLE:'[data-toggle="dropdown"]',FORM_CHILD:".dropdown form",ROLE_MENU:'[role="menu"]',ROLE_LISTBOX:'[role="listbox"]',NAVBAR_NAV:".navbar-nav",VISIBLE_ITEMS:'[role="menu"] li:not(.disabled) a, [role="listbox"] li:not(.disabled) a'},m=function(){function e(t){n(this,e),this._element=t,this._addEventListeners()}return e.prototype.toggle=function(){if(this.disabled||t(this).hasClass(g.DISABLED))return!1;var n=e._getParentFromElement(this),i=t(n).hasClass(g.SHOW);if(e._clearMenus(),i)return!1;if("ontouchstart"in document.documentElement&&!t(n).closest(p.NAVBAR_NAV).length){var o=document.createElement("div");o.className=g.BACKDROP,t(o).insertBefore(this),t(o).on("click",e._clearMenus)}var r={relatedTarget:this},s=t.Event(_.SHOW,r);return t(n).trigger(s),!s.isDefaultPrevented()&&(this.focus(),this.setAttribute("aria-expanded",!0),t(n).toggleClass(g.SHOW),t(n).trigger(t.Event(_.SHOWN,r)),!1)},e.prototype.dispose=function(){t.removeData(this._element,s),t(this._element).off(a),this._element=null},e.prototype._addEventListeners=function(){t(this._element).on(_.CLICK,this.toggle)},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data(s);if(i||(i=new e(this),t(this).data(s,i)),"string"==typeof n){if(void 0===i[n])throw new Error('No method named "'+n+'"');i[n].call(this)}})},e._clearMenus=function(n){if(!n||n.which!==f){var i=t(p.BACKDROP)[0];i&&i.parentNode.removeChild(i);for(var o=t.makeArray(t(p.DATA_TOGGLE)),r=0;r<o.length;r++){var s=e._getParentFromElement(o[r]),a={relatedTarget:o[r]};if(t(s).hasClass(g.SHOW)&&!(n&&("click"===n.type&&/input|textarea/i.test(n.target.tagName)||"focusin"===n.type)&&t.contains(s,n.target))){var l=t.Event(_.HIDE,a);t(s).trigger(l),l.isDefaultPrevented()||(o[r].setAttribute("aria-expanded","false"),t(s).removeClass(g.SHOW).trigger(t.Event(_.HIDDEN,a)))}}}},e._getParentFromElement=function(e){var n=void 0,i=r.getSelectorFromElement(e);return i&&(n=t(i)[0]),n||e.parentNode},e._dataApiKeydownHandler=function(n){if(/(38|40|27|32)/.test(n.which)&&!/input|textarea/i.test(n.target.tagName)&&(n.preventDefault(),n.stopPropagation(),!this.disabled&&!t(this).hasClass(g.DISABLED))){var i=e._getParentFromElement(this),o=t(i).hasClass(g.SHOW);if(!o&&n.which!==c||o&&n.which===c){if(n.which===c){var r=t(i).find(p.DATA_TOGGLE)[0];t(r).trigger("focus")}return void t(this).trigger("click")}var s=t(i).find(p.VISIBLE_ITEMS).get();if(s.length){var a=s.indexOf(n.target);n.which===u&&a>0&&a--,n.which===d&&a<s.length-1&&a++,a<0&&(a=0),s[a].focus()}}},o(e,null,[{key:"VERSION",get:function(){return i}}]),e}();return t(document).on(_.KEYDOWN_DATA_API,p.DATA_TOGGLE,m._dataApiKeydownHandler).on(_.KEYDOWN_DATA_API,p.ROLE_MENU,m._dataApiKeydownHandler).on(_.KEYDOWN_DATA_API,p.ROLE_LISTBOX,m._dataApiKeydownHandler).on(_.CLICK_DATA_API+" "+_.FOCUSIN_DATA_API,m._clearMenus).on(_.CLICK_DATA_API,p.DATA_TOGGLE,m.prototype.toggle).on(_.CLICK_DATA_API,p.FORM_CHILD,function(t){t.stopPropagation()}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=h,m._jQueryInterface},m}(jQuery),function(t){var e="modal",s="4.0.0-alpha.6",a="bs.modal",l="."+a,h=".data-api",c=t.fn[e],u=300,d=150,f=27,_={backdrop:!0,keyboard:!0,focus:!0,show:!0},g={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},p={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,FOCUSIN:"focusin"+l,RESIZE:"resize"+l,CLICK_DISMISS:"click.dismiss"+l,KEYDOWN_DISMISS:"keydown.dismiss"+l,MOUSEUP_DISMISS:"mouseup.dismiss"+l,MOUSEDOWN_DISMISS:"mousedown.dismiss"+l,CLICK_DATA_API:"click"+l+h},m={SCROLLBAR_MEASURER:"modal-scrollbar-measure",BACKDROP:"modal-backdrop",OPEN:"modal-open",FADE:"fade",SHOW:"show"},E={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top"},v=function(){function h(e,i){n(this,h),this._config=this._getConfig(i),this._element=e,this._dialog=t(e).find(E.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}return h.prototype.toggle=function(t){return this._isShown?this.hide():this.show(t)},h.prototype.show=function(e){var n=this;if(this._isTransitioning)throw new Error("Modal is transitioning");r.supportsTransitionEnd()&&t(this._element).hasClass(m.FADE)&&(this._isTransitioning=!0);var i=t.Event(p.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),t(document.body).addClass(m.OPEN),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(p.CLICK_DISMISS,E.DATA_DISMISS,function(t){return n.hide(t)}),t(this._dialog).on(p.MOUSEDOWN_DISMISS,function(){t(n._element).one(p.MOUSEUP_DISMISS,function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return n._showElement(e)}))},h.prototype.hide=function(e){var n=this;if(e&&e.preventDefault(),this._isTransitioning)throw new Error("Modal is transitioning");var i=r.supportsTransitionEnd()&&t(this._element).hasClass(m.FADE);i&&(this._isTransitioning=!0);var o=t.Event(p.HIDE);t(this._element).trigger(o),this._isShown&&!o.isDefaultPrevented()&&(this._isShown=!1,this._setEscapeEvent(),this._setResizeEvent(),t(document).off(p.FOCUSIN),t(this._element).removeClass(m.SHOW),t(this._element).off(p.CLICK_DISMISS),t(this._dialog).off(p.MOUSEDOWN_DISMISS),i?t(this._element).one(r.TRANSITION_END,function(t){return n._hideModal(t)}).emulateTransitionEnd(u):this._hideModal())},h.prototype.dispose=function(){t.removeData(this._element,a),t(window,document,this._element,this._backdrop).off(l),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._originalBodyPadding=null,this._scrollbarWidth=null},h.prototype._getConfig=function(n){return n=t.extend({},_,n),r.typeCheckConfig(e,n,g),n},h.prototype._showElement=function(e){var n=this,i=r.supportsTransitionEnd()&&t(this._element).hasClass(m.FADE);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,i&&r.reflow(this._element),t(this._element).addClass(m.SHOW),this._config.focus&&this._enforceFocus();var o=t.Event(p.SHOWN,{relatedTarget:e}),s=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(o)};i?t(this._dialog).one(r.TRANSITION_END,s).emulateTransitionEnd(u):s()},h.prototype._enforceFocus=function(){var e=this;t(document).off(p.FOCUSIN).on(p.FOCUSIN,function(n){document===n.target||e._element===n.target||t(e._element).has(n.target).length||e._element.focus()})},h.prototype._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(p.KEYDOWN_DISMISS,function(t){t.which===f&&e.hide()}):this._isShown||t(this._element).off(p.KEYDOWN_DISMISS)},h.prototype._setResizeEvent=function(){var e=this;this._isShown?t(window).on(p.RESIZE,function(t){return e._handleUpdate(t)}):t(window).off(p.RESIZE)},h.prototype._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden","true"),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(m.OPEN),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(p.HIDDEN)})},h.prototype._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},h.prototype._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(m.FADE)?m.FADE:"";if(this._isShown&&this._config.backdrop){var o=r.supportsTransitionEnd()&&i;if(this._backdrop=document.createElement("div"),this._backdrop.className=m.BACKDROP,i&&t(this._backdrop).addClass(i),t(this._backdrop).appendTo(document.body),t(this._element).on(p.CLICK_DISMISS,function(t){return n._ignoreBackdropClick?void(n._ignoreBackdropClick=!1):void(t.target===t.currentTarget&&("static"===n._config.backdrop?n._element.focus():n.hide()))}),o&&r.reflow(this._backdrop),t(this._backdrop).addClass(m.SHOW),!e)return;if(!o)return void e();t(this._backdrop).one(r.TRANSITION_END,e).emulateTransitionEnd(d)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(m.SHOW);var s=function(){n._removeBackdrop(),e&&e()};r.supportsTransitionEnd()&&t(this._element).hasClass(m.FADE)?t(this._backdrop).one(r.TRANSITION_END,s).emulateTransitionEnd(d):s()}else e&&e()},h.prototype._handleUpdate=function(){this._adjustDialog()},h.prototype._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},h.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},h.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},h.prototype._setScrollbar=function(){var e=parseInt(t(E.FIXED_CONTENT).css("padding-right")||0,10);this._originalBodyPadding=document.body.style.paddingRight||"",this._isBodyOverflowing&&(document.body.style.paddingRight=e+this._scrollbarWidth+"px")},h.prototype._resetScrollbar=function(){document.body.style.paddingRight=this._originalBodyPadding},h.prototype._getScrollbarWidth=function(){var t=document.createElement("div");t.className=m.SCROLLBAR_MEASURER,document.body.appendChild(t);var e=t.offsetWidth-t.clientWidth;return document.body.removeChild(t),e},h._jQueryInterface=function(e,n){return this.each(function(){var o=t(this).data(a),r=t.extend({},h.Default,t(this).data(),"object"===("undefined"==typeof e?"undefined":i(e))&&e);if(o||(o=new h(this,r),t(this).data(a,o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e](n)}else r.show&&o.show(n)})},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return _}}]),h}();return t(document).on(p.CLICK_DATA_API,E.DATA_TOGGLE,function(e){var n=this,i=void 0,o=r.getSelectorFromElement(this);o&&(i=t(o)[0]);var s=t(i).data(a)?"toggle":t.extend({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var l=t(i).one(p.SHOW,function(e){e.isDefaultPrevented()||l.one(p.HIDDEN,function(){t(n).is(":visible")&&n.focus()})});v._jQueryInterface.call(t(i),s,this)}),t.fn[e]=v._jQueryInterface,t.fn[e].Constructor=v,t.fn[e].noConflict=function(){return t.fn[e]=c,v._jQueryInterface},v}(jQuery),function(t){var e="scrollspy",s="4.0.0-alpha.6",a="bs.scrollspy",l="."+a,h=".data-api",c=t.fn[e],u={offset:10,method:"auto",target:""},d={offset:"number",method:"string",target:"(string|element)"},f={ACTIVATE:"activate"+l,SCROLL:"scroll"+l,LOAD_DATA_API:"load"+l+h},_={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",NAV_LINK:"nav-link",NAV:"nav",ACTIVE:"active"},g={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",LIST_ITEM:".list-item",LI:"li",LI_DROPDOWN:"li.dropdown",NAV_LINKS:".nav-link",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},p={OFFSET:"offset",POSITION:"position"},m=function(){function h(e,i){var o=this;n(this,h),this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(i),this._selector=this._config.target+" "+g.NAV_LINKS+","+(this._config.target+" "+g.DROPDOWN_ITEMS),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(f.SCROLL,function(t){return o._process(t)}),this.refresh(),this._process()}return h.prototype.refresh=function(){var e=this,n=this._scrollElement!==this._scrollElement.window?p.POSITION:p.OFFSET,i="auto"===this._config.method?n:this._config.method,o=i===p.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight();var s=t.makeArray(t(this._selector));s.map(function(e){var n=void 0,s=r.getSelectorFromElement(e);return s&&(n=t(s)[0]),n&&(n.offsetWidth||n.offsetHeight)?[t(n)[i]().top+o,s]:null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},h.prototype.dispose=function(){t.removeData(this._element,a),t(this._scrollElement).off(l),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},h.prototype._getConfig=function(n){if(n=t.extend({},u,n),"string"!=typeof n.target){var i=t(n.target).attr("id");i||(i=r.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return r.typeCheckConfig(e,n,d),n},h.prototype._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},h.prototype._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},h.prototype._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.offsetHeight},h.prototype._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];return void(this._activeTarget!==i&&this._activate(i))}if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){var r=this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t<this._offsets[o+1]);r&&this._activate(this._targets[o])}},h.prototype._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",");n=n.map(function(t){return t+'[data-target="'+e+'"],'+(t+'[href="'+e+'"]')});var i=t(n.join(","));i.hasClass(_.DROPDOWN_ITEM)?(i.closest(g.DROPDOWN).find(g.DROPDOWN_TOGGLE).addClass(_.ACTIVE),i.addClass(_.ACTIVE)):i.parents(g.LI).find("> "+g.NAV_LINKS).addClass(_.ACTIVE),t(this._scrollElement).trigger(f.ACTIVATE,{relatedTarget:e})},h.prototype._clear=function(){t(this._selector).filter(g.ACTIVE).removeClass(_.ACTIVE)},h._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(a),o="object"===("undefined"==typeof e?"undefined":i(e))&&e;
+if(n||(n=new h(this,o),t(this).data(a,n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return u}}]),h}();return t(window).on(f.LOAD_DATA_API,function(){for(var e=t.makeArray(t(g.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);m._jQueryInterface.call(i,i.data())}}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=c,m._jQueryInterface},m}(jQuery),function(t){var e="tab",i="4.0.0-alpha.6",s="bs.tab",a="."+s,l=".data-api",h=t.fn[e],c=150,u={HIDE:"hide"+a,HIDDEN:"hidden"+a,SHOW:"show"+a,SHOWN:"shown"+a,CLICK_DATA_API:"click"+a+l},d={DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active",DISABLED:"disabled",FADE:"fade",SHOW:"show"},f={A:"a",LI:"li",DROPDOWN:".dropdown",LIST:"ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu)",FADE_CHILD:"> .nav-item .fade, > .fade",ACTIVE:".active",ACTIVE_CHILD:"> .nav-item > .active, > .active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},_=function(){function e(t){n(this,e),this._element=t}return e.prototype.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(d.ACTIVE)||t(this._element).hasClass(d.DISABLED))){var n=void 0,i=void 0,o=t(this._element).closest(f.LIST)[0],s=r.getSelectorFromElement(this._element);o&&(i=t.makeArray(t(o).find(f.ACTIVE)),i=i[i.length-1]);var a=t.Event(u.HIDE,{relatedTarget:this._element}),l=t.Event(u.SHOW,{relatedTarget:i});if(i&&t(i).trigger(a),t(this._element).trigger(l),!l.isDefaultPrevented()&&!a.isDefaultPrevented()){s&&(n=t(s)[0]),this._activate(this._element,o);var h=function(){var n=t.Event(u.HIDDEN,{relatedTarget:e._element}),o=t.Event(u.SHOWN,{relatedTarget:i});t(i).trigger(n),t(e._element).trigger(o)};n?this._activate(n,n.parentNode,h):h()}}},e.prototype.dispose=function(){t.removeClass(this._element,s),this._element=null},e.prototype._activate=function(e,n,i){var o=this,s=t(n).find(f.ACTIVE_CHILD)[0],a=i&&r.supportsTransitionEnd()&&(s&&t(s).hasClass(d.FADE)||Boolean(t(n).find(f.FADE_CHILD)[0])),l=function(){return o._transitionComplete(e,s,a,i)};s&&a?t(s).one(r.TRANSITION_END,l).emulateTransitionEnd(c):l(),s&&t(s).removeClass(d.SHOW)},e.prototype._transitionComplete=function(e,n,i,o){if(n){t(n).removeClass(d.ACTIVE);var s=t(n.parentNode).find(f.DROPDOWN_ACTIVE_CHILD)[0];s&&t(s).removeClass(d.ACTIVE),n.setAttribute("aria-expanded",!1)}if(t(e).addClass(d.ACTIVE),e.setAttribute("aria-expanded",!0),i?(r.reflow(e),t(e).addClass(d.SHOW)):t(e).removeClass(d.FADE),e.parentNode&&t(e.parentNode).hasClass(d.DROPDOWN_MENU)){var a=t(e).closest(f.DROPDOWN)[0];a&&t(a).find(f.DROPDOWN_TOGGLE).addClass(d.ACTIVE),e.setAttribute("aria-expanded",!0)}o&&o()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data(s);if(o||(o=new e(this),i.data(s,o)),"string"==typeof n){if(void 0===o[n])throw new Error('No method named "'+n+'"');o[n]()}})},o(e,null,[{key:"VERSION",get:function(){return i}}]),e}();return t(document).on(u.CLICK_DATA_API,f.DATA_TOGGLE,function(e){e.preventDefault(),_._jQueryInterface.call(t(this),"show")}),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=h,_._jQueryInterface},_}(jQuery),function(t){if("undefined"==typeof Tether)throw new Error("Bootstrap tooltips require Tether (http://tether.io/)");var e="tooltip",s="4.0.0-alpha.6",a="bs.tooltip",l="."+a,h=t.fn[e],c=150,u="bs-tether",d={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:"0 0",constraints:[],container:!1},f={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"string",constraints:"array",container:"(string|element|boolean)"},_={TOP:"bottom center",RIGHT:"middle left",BOTTOM:"top center",LEFT:"middle right"},g={SHOW:"show",OUT:"out"},p={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,INSERTED:"inserted"+l,CLICK:"click"+l,FOCUSIN:"focusin"+l,FOCUSOUT:"focusout"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l},m={FADE:"fade",SHOW:"show"},E={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner"},v={element:!1,enabled:!1},T={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},I=function(){function h(t,e){n(this,h),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._isTransitioning=!1,this._tether=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return h.prototype.enable=function(){this._isEnabled=!0},h.prototype.disable=function(){this._isEnabled=!1},h.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},h.prototype.toggle=function(e){if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(m.SHOW))return void this._leave(null,this);this._enter(null,this)}},h.prototype.dispose=function(){clearTimeout(this._timeout),this.cleanupTether(),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._tether=null,this.element=null,this.config=null,this.tip=null},h.prototype.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){if(this._isTransitioning)throw new Error("Tooltip is transitioning");t(this.element).trigger(n);var i=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!i)return;var o=this.getTipElement(),s=r.getUID(this.constructor.NAME);o.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(o).addClass(m.FADE);var a="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,l=this._getAttachment(a),c=this.config.container===!1?document.body:t(this.config.container);t(o).data(this.constructor.DATA_KEY,this).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._tether=new Tether({attachment:l,element:o,target:this.element,classes:v,classPrefix:u,offset:this.config.offset,constraints:this.config.constraints,addTargetClasses:!1}),r.reflow(o),this._tether.position(),t(o).addClass(m.SHOW);var d=function(){var n=e._hoverState;e._hoverState=null,e._isTransitioning=!1,t(e.element).trigger(e.constructor.Event.SHOWN),n===g.OUT&&e._leave(null,e)};if(r.supportsTransitionEnd()&&t(this.tip).hasClass(m.FADE))return this._isTransitioning=!0,void t(this.tip).one(r.TRANSITION_END,d).emulateTransitionEnd(h._TRANSITION_DURATION);d()}},h.prototype.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE);if(this._isTransitioning)throw new Error("Tooltip is transitioning");var s=function(){n._hoverState!==g.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),n._isTransitioning=!1,n.cleanupTether(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(m.SHOW),this._activeTrigger[T.CLICK]=!1,this._activeTrigger[T.FOCUS]=!1,this._activeTrigger[T.HOVER]=!1,r.supportsTransitionEnd()&&t(this.tip).hasClass(m.FADE)?(this._isTransitioning=!0,t(i).one(r.TRANSITION_END,s).emulateTransitionEnd(c)):s(),this._hoverState="")},h.prototype.isWithContent=function(){return Boolean(this.getTitle())},h.prototype.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0]},h.prototype.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(E.TOOLTIP_INNER),this.getTitle()),e.removeClass(m.FADE+" "+m.SHOW),this.cleanupTether()},h.prototype.setElementContent=function(e,n){var o=this.config.html;"object"===("undefined"==typeof n?"undefined":i(n))&&(n.nodeType||n.jquery)?o?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[o?"html":"text"](n)},h.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},h.prototype.cleanupTether=function(){this._tether&&this._tether.destroy()},h.prototype._getAttachment=function(t){return _[t.toUpperCase()]},h.prototype._setListeners=function(){var e=this,n=this.config.trigger.split(" ");n.forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==T.MANUAL){var i=n===T.HOVER?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===T.HOVER?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=t.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},h.prototype._fixTitle=function(){var t=i(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},h.prototype._enter=function(e,n){var i=this.constructor.DATA_KEY;return n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T.FOCUS:T.HOVER]=!0),t(n.getTipElement()).hasClass(m.SHOW)||n._hoverState===g.SHOW?void(n._hoverState=g.SHOW):(clearTimeout(n._timeout),n._hoverState=g.SHOW,n.config.delay&&n.config.delay.show?void(n._timeout=setTimeout(function(){n._hoverState===g.SHOW&&n.show()},n.config.delay.show)):void n.show())},h.prototype._leave=function(e,n){var i=this.constructor.DATA_KEY;if(n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T.FOCUS:T.HOVER]=!1),!n._isWithActiveTrigger())return clearTimeout(n._timeout),n._hoverState=g.OUT,n.config.delay&&n.config.delay.hide?void(n._timeout=setTimeout(function(){n._hoverState===g.OUT&&n.hide()},n.config.delay.hide)):void n.hide()},h.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},h.prototype._getConfig=function(n){return n=t.extend({},this.constructor.Default,t(this.element).data(),n),n.delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},h.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},h._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(a),o="object"===("undefined"==typeof e?"undefined":i(e))&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new h(this,o),t(this).data(a,n)),"string"==typeof e)){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return d}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return a}},{key:"Event",get:function(){return p}},{key:"EVENT_KEY",get:function(){return l}},{key:"DefaultType",get:function(){return f}}]),h}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=h,I._jQueryInterface},I}(jQuery));(function(r){var a="popover",l="4.0.0-alpha.6",h="bs.popover",c="."+h,u=r.fn[a],d=r.extend({},s.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),f=r.extend({},s.DefaultType,{content:"(string|element|function)"}),_={FADE:"fade",SHOW:"show"},g={TITLE:".popover-title",CONTENT:".popover-content"},p={HIDE:"hide"+c,HIDDEN:"hidden"+c,SHOW:"show"+c,SHOWN:"shown"+c,INSERTED:"inserted"+c,CLICK:"click"+c,FOCUSIN:"focusin"+c,FOCUSOUT:"focusout"+c,MOUSEENTER:"mouseenter"+c,MOUSELEAVE:"mouseleave"+c},m=function(s){function u(){return n(this,u),t(this,s.apply(this,arguments))}return e(u,s),u.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},u.prototype.getTipElement=function(){return this.tip=this.tip||r(this.config.template)[0]},u.prototype.setContent=function(){var t=r(this.getTipElement());this.setElementContent(t.find(g.TITLE),this.getTitle()),this.setElementContent(t.find(g.CONTENT),this._getContent()),t.removeClass(_.FADE+" "+_.SHOW),this.cleanupTether()},u.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},u._jQueryInterface=function(t){return this.each(function(){var e=r(this).data(h),n="object"===("undefined"==typeof t?"undefined":i(t))?t:null;if((e||!/destroy|hide/.test(t))&&(e||(e=new u(this,n),r(this).data(h,e)),"string"==typeof t)){if(void 0===e[t])throw new Error('No method named "'+t+'"');e[t]()}})},o(u,null,[{key:"VERSION",get:function(){return l}},{key:"Default",get:function(){return d}},{key:"NAME",get:function(){return a}},{key:"DATA_KEY",get:function(){return h}},{key:"Event",get:function(){return p}},{key:"EVENT_KEY",get:function(){return c}},{key:"DefaultType",get:function(){return f}}]),u}(s);return r.fn[a]=m._jQueryInterface,r.fn[a].Constructor=m,r.fn[a].noConflict=function(){return r.fn[a]=u,m._jQueryInterface},m})(jQuery)}(); \ No newline at end of file
diff --git a/ihatemoney/static/js/ihatemoney.js b/ihatemoney/static/js/ihatemoney.js
new file mode 100644
index 0000000..24e82b7
--- /dev/null
+++ b/ihatemoney/static/js/ihatemoney.js
@@ -0,0 +1,18 @@
+ // Add scripts to select all or non of the checkboxes in the add_bill form
+function selectall()
+ {
+ var els = document.getElementsByName('payed_for');
+ for(var i =0;i<els.length;i++)
+ {
+ els[i].checked=true;
+ }
+ }
+function selectnone()
+ {
+ var els = document.getElementsByName('payed_for');
+ for(var i =0;i<els.length;i++)
+ {
+ els[i].checked=false;
+ }
+ }
+
diff --git a/ihatemoney/static/js/jquery-3.1.1.min.js b/ihatemoney/static/js/jquery-3.1.1.min.js
new file mode 100644
index 0000000..4c5be4c
--- /dev/null
+++ b/ihatemoney/static/js/jquery-3.1.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),
+a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:X.test(a)?JSON.parse(a):a)}function $(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=Z(c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),$(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=$(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var _=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,aa=new RegExp("^(?:([+-])=|)("+_+")([a-z%]*)$","i"),ba=["Top","Right","Bottom","Left"],ca=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function ea(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&aa.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var fa={};function ga(a){var b,c=a.ownerDocument,d=a.nodeName,e=fa[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),fa[d]=e,e)}function ha(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ca(d)&&(e[f]=ga(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ha(this,!0)},hide:function(){return ha(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ca(this)?r(this).show():r(this).hide()})}});var ia=/^(?:checkbox|radio)$/i,ja=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var oa=/<|&#?\w+;/;function pa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(oa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ja.exec(f)||["",""])[1].toLowerCase(),i=la[h]||la._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==wa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===wa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ua:va,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:va,isPropagationStopped:va,isImmediatePropagationStopped:va,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ua,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ua,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ua,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&ra.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&sa.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return xa(this,a,b,c,d)},one:function(a,b,c,d){return xa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=va),this.each(function(){r.event.remove(this,a,c,b)})}});var ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/<script|<style|<link/i,Aa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ba=/^true\/(.*)/,Ca=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ha(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ia.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ia(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,ma(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Fa),l=0;l<i;l++)j=h[l],ka.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ca,""),k))}return a}function Ja(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(ma(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&na(ma(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(ya,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);if(b)if(c)for(f=f||ma(a),g=g||ma(h),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);else Ga(a,h);return g=ma(h,"script"),g.length>0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(ma(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ia(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(ma(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ka=/^margin/,La=new RegExp("^("+_+")(?!px)[a-z%]+$","i"),Ma=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",qa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,qa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Na(a,b,c){var d,e,f,g,h=a.style;return c=c||Ma(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&La.test(g)&&Ka.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Oa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Pa=/^(none|table(?!-c[ea]).+)/,Qa={position:"absolute",visibility:"hidden",display:"block"},Ra={letterSpacing:"0",fontWeight:"400"},Sa=["Webkit","Moz","ms"],Ta=d.createElement("div").style;function Ua(a){if(a in Ta)return a;var b=a[0].toUpperCase()+a.slice(1),c=Sa.length;while(c--)if(a=Sa[c]+b,a in Ta)return a}function Va(a,b,c){var d=aa.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Wa(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ba[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ba[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ba[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ba[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ba[f]+"Width",!0,e)));return g}function Xa(a,b,c){var d,e=!0,f=Ma(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Na(a,b,f),(d<0||null==d)&&(d=a.style[b]),La.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Wa(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Na(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=aa.exec(c))&&e[1]&&(c=ea(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Na(a,b,d)),"normal"===e&&b in Ra&&(e=Ra[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Pa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Xa(a,b,d):da(a,Qa,function(){return Xa(a,b,d)})},set:function(a,c,d){var e,f=d&&Ma(a),g=d&&Wa(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=aa.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Va(a,c,g)}}}),r.cssHooks.marginLeft=Oa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Na(a,"marginLeft"))||a.getBoundingClientRect().left-da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ba[d]+b]=f[d]||f[d-2]||f[0];return e}},Ka.test(a)||(r.cssHooks[a+b].set=Va)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=Ma(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function fb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ca(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],_a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ha([a],!0),j=a.style.display||j,k=r.css(a,"display"),ha([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ha([a],!0),m.done(function(){p||ha([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=eb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function gb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function hb(a,b,c){var d,e,f=0,g=hb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Za||cb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Za||cb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(gb(k,j.opts.specialEasing);f<g;f++)if(d=hb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,eb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(hb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return ea(c.elem,a,aa.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],hb.tweeners[c]=hb.tweeners[c]||[],hb.tweeners[c].unshift(b)},prefilters:[fb],prefilter:function(a,b){b?hb.prefilters.unshift(a):hb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:"number"!=typeof e.duration&&(e.duration in r.fx.speeds?e.duration=r.fx.speeds[e.duration]:e.duration=r.fx.speeds._default),null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ca).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=hb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ab.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(db(b,!0),a,d,e)}}),r.each({slideDown:db("show"),slideUp:db("hide"),slideToggle:db("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Za=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Za=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){$a||($a=a.requestAnimationFrame?a.requestAnimationFrame(bb):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame($a):a.clearInterval($a),$a=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var ib,jb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)),
+void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=pa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=mb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||qa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Oa(o.pixelPosition,function(a,c){if(c)return c=Na(a,b),La.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
diff --git a/ihatemoney/static/js/locales/bootstrap-datepicker.fr.min.js b/ihatemoney/static/js/locales/bootstrap-datepicker.fr.min.js
new file mode 100644
index 0000000..88379c3
--- /dev/null
+++ b/ihatemoney/static/js/locales/bootstrap-datepicker.fr.min.js
@@ -0,0 +1,2 @@
+!function(a){a.fn.datepicker.dates.fr={days:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],daysShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],daysMin:["d","l","ma","me","j","v","s"],months:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthsShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],today:"Aujourd'hui",monthsTitle:"Mois",clear:"Effacer",weekStart:1,format:"dd/mm/yyyy"}}(jQuery);
+console.log("foo", jQuery.fn.datepicker.dates); \ No newline at end of file
diff --git a/ihatemoney/static/js/tether.min.js b/ihatemoney/static/js/tether.min.js
new file mode 100644
index 0000000..d16b9b1
--- /dev/null
+++ b/ihatemoney/static/js/tether.min.js
@@ -0,0 +1 @@
+!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=t.getBoundingClientRect(),o={};for(var i in e)o[i]=e[i];if(t.ownerDocument!==document){var r=t.ownerDocument.defaultView.frameElement;if(r){var s=n(r);o.top+=s.top,o.bottom+=s.top,o.left+=s.left,o.right+=s.left}}return o}function r(t){var e=getComputedStyle(t)||{},o=e.position,i=[];if("fixed"===o)return[t];for(var n=t;(n=n.parentNode)&&n&&1===n.nodeType;){var r=void 0;try{r=getComputedStyle(n)}catch(s){}if("undefined"==typeof r||null===r)return i.push(n),i;var a=r,f=a.overflow,l=a.overflowX,h=a.overflowY;/(auto|scroll)/.test(f+h+l)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&i.push(n)}return i.push(t.ownerDocument.body),t.ownerDocument!==document&&i.push(t.ownerDocument.defaultView),i}function s(){A&&document.body.removeChild(A),A=null}function a(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i=n(t),r=P();return i.top-=r.top,i.left-=r.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function f(t){return t.offsetParent||document.documentElement}function l(){if(M)return M;var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");h(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return M={width:n,height:n}}function h(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function d(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=c(t).replace(o," ");g(t,i)}}function p(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{d(t,e);var o=c(t)+(" "+e);g(t,o)}}function u(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=c(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function c(t){return t.className instanceof t.ownerDocument.defaultView.SVGAnimatedString?t.className.baseVal:t.className}function g(t,e){t.setAttribute("class",e)}function m(t,e,o){o.forEach(function(o){e.indexOf(o)===-1&&u(t,o)&&d(t,o)}),e.forEach(function(e){u(t,e)||p(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function y(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function b(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function w(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;i<e;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function C(t,e){return"string"==typeof t.left&&t.left.indexOf("%")!==-1&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&t.top.indexOf("%")!==-1&&(t.top=parseFloat(t.top,10)/100*e.height),t}function O(t,e){return"scrollParent"===e?e=t.scrollParents[0]:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=e,o=a(e),i=o,n=getComputedStyle(e);if(e=[i.left,i.top,o.width+i.left,o.height+i.top],t.ownerDocument!==document){var r=t.ownerDocument.defaultView;e[0]+=r.pageXOffset,e[1]+=r.pageYOffset,e[2]+=r.pageXOffset,e[3]+=r.pageYOffset}G.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(n["border"+t+"Width"]):e[o]-=parseFloat(n["border"+t+"Width"])})}(),e}var E=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}(),x=void 0;"undefined"==typeof x&&(x={modules:[]});var A=null,T=function(){var t=0;return function(){return++t}}(),S={},P=function(){var t=A;t&&document.body.contains(t)||(t=document.createElement("div"),t.setAttribute("data-tether-id",T()),h(t.style,{top:0,left:0,position:"absolute"}),document.body.appendChild(t),A=t);var e=t.getAttribute("data-tether-id");return"undefined"==typeof S[e]&&(S[e]=n(t),k(function(){delete S[e]})),S[e]},M=null,W=[],k=function(t){W.push(t)},_=function(){for(var t=void 0;t=W.pop();)t()},B=function(){function t(){i(this,t)}return E(t,[{key:"on",value:function(t,e,o){var i=!(arguments.length<=3||void 0===arguments[3])&&arguments[3];"undefined"==typeof this.bindings&&(this.bindings={}),"undefined"==typeof this.bindings[t]&&(this.bindings[t]=[]),this.bindings[t].push({handler:e,ctx:o,once:i})}},{key:"once",value:function(t,e,o){this.on(t,e,o,!0)}},{key:"off",value:function(t,e){if("undefined"!=typeof this.bindings&&"undefined"!=typeof this.bindings[t])if("undefined"==typeof e)delete this.bindings[t];else for(var o=0;o<this.bindings[t].length;)this.bindings[t][o].handler===e?this.bindings[t].splice(o,1):++o}},{key:"trigger",value:function(t){if("undefined"!=typeof this.bindings&&this.bindings[t]){for(var e=0,o=arguments.length,i=Array(o>1?o-1:0),n=1;n<o;n++)i[n-1]=arguments[n];for(;e<this.bindings[t].length;){var r=this.bindings[t][e],s=r.handler,a=r.ctx,f=r.once,l=a;"undefined"==typeof l&&(l=this),s.apply(l,i),f?this.bindings[t].splice(e,1):++e}}}}]),t}();x.Utils={getActualBoundingClientRect:n,getScrollParents:r,getBounds:a,getOffsetParent:f,extend:h,addClass:p,removeClass:d,hasClass:u,updateClasses:m,defer:k,flush:_,uniqueId:T,Evented:B,getScrollBarSize:l,removeUtilElements:s};var z=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),E=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}(),j=function(t,e,o){for(var i=!0;i;){var n=t,r=e,s=o;i=!1,null===n&&(n=Function.prototype);var a=Object.getOwnPropertyDescriptor(n,r);if(void 0!==a){if("value"in a)return a.value;var f=a.get;if(void 0===f)return;return f.call(s)}var l=Object.getPrototypeOf(n);if(null===l)return;t=l,e=r,o=s,i=!0,a=l=void 0}};if("undefined"==typeof x)throw new Error("You must include the utils.js file before tether.js");var Y=x.Utils,r=Y.getScrollParents,a=Y.getBounds,f=Y.getOffsetParent,h=Y.extend,p=Y.addClass,d=Y.removeClass,m=Y.updateClasses,k=Y.defer,_=Y.flush,l=Y.getScrollBarSize,s=Y.removeUtilElements,L=function(){if("undefined"==typeof document)return"";for(var t=document.createElement("div"),e=["transform","WebkitTransform","OTransform","MozTransform","msTransform"],o=0;o<e.length;++o){var i=e[o];if(void 0!==t.style[i])return i}}(),D=[],X=function(){D.forEach(function(t){t.position(!1)}),_()};!function(){var t=null,e=null,o=null,i=function n(){return"undefined"!=typeof e&&e>16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&b()-t<10||(null!=o&&(clearTimeout(o),o=null),t=b(),X(),e=b()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var F={center:"center",left:"right",right:"left"},H={middle:"middle",top:"bottom",bottom:"top"},N={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},U=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=F[e.left]),"auto"===i&&(i=H[e.top]),{left:o,top:i}},V=function(t){var e=t.left,o=t.top;return"undefined"!=typeof N[t.left]&&(e=N[t.left]),"undefined"!=typeof N[t.top]&&(o=N[t.top]),{left:e,top:o}},R=function(t){var e=t.split(" "),o=z(e,2),i=o[0],n=o[1];return{top:i,left:n}},q=R,I=function(t){function e(t){var o=this;i(this,e),j(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),D.push(this),this.history=[],this.setOptions(t,!1),x.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return v(e,t),E(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]||arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=h(i,t);var n=this.options,s=n.element,a=n.target,f=n.targetModifier;if(this.element=s,this.target=a,this.targetModifier=f,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),p(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&p(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=q(this.options.targetAttachment),this.attachment=q(this.options.attachment),this.offset=R(this.options.offset),this.targetOffset=R(this.options.targetOffset),"undefined"!=typeof this.scrollParents&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=r(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return a(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=a(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.top<pageYOffset&&(e.top=pageYOffset),e.left<pageXOffset&&(e.left=pageXOffset),e}if("scroll-handle"===this.targetModifier){var t=void 0,o=this.target;o===document.body?(o=document.documentElement,t={left:pageXOffset,top:pageYOffset,height:innerHeight,width:innerWidth}):t=a(o);var i=getComputedStyle(o),n=o.scrollWidth>o.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,r=0;n&&(r=15);var s=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-r,e={width:15,height:.975*s*(s/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;s<408&&this.target===document.body&&(f=-11e-5*Math.pow(s,2)-.00727*s+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var l=this.target.scrollTop/(o.scrollHeight-s);return e.top=l*(s-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];this.options.addTargetClasses!==!1&&p(this.target,this.getClass("enabled")),p(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==t.target.ownerDocument&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;d(this.target,this.getClass("enabled")),d(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),D.forEach(function(e,o){e===t&&D.splice(o,1)}),0===D.length&&s()}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),k(function(){"undefined"!=typeof o._addAttachClasses&&(m(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&m(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];if(this.enabled){this.clearCache();var o=U(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return a(t.element)}),n=i.width,r=i.height;if(0===n&&0===r&&"undefined"!=typeof this.lastSize){var s=this.lastSize;n=s.width,r=s.height}else this.lastSize={width:n,height:r};var h=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=h,p=C(V(this.attachment),{width:n,height:r}),u=C(V(o),d),c=C(this.offset,{width:n,height:r}),g=C(this.targetOffset,d);p=w(p,c),u=w(u,g);for(var m=h.left+u.left-p.left,v=h.top+u.top-p.top,y=0;y<x.modules.length;++y){var b=x.modules[y],O=b.position.call(this,{left:m,top:v,targetAttachment:o,targetPos:h,elementPos:i,offset:p,targetOffset:u,manualOffset:c,manualTargetOffset:g,scrollbarSize:S,attachment:this.attachment});if(O===!1)return!1;"undefined"!=typeof O&&"object"==typeof O&&(v=O.top,m=O.left)}var E={page:{top:v,left:m},viewport:{top:v-pageYOffset,bottom:pageYOffset-v-r+innerHeight,left:m-pageXOffset,right:pageXOffset-m-n+innerWidth}},A=this.target.ownerDocument,T=A.defaultView,S=void 0;return T.innerHeight>A.documentElement.clientHeight&&(S=this.cache("scrollbar-size",l),E.viewport.bottom-=S.height),T.innerWidth>A.documentElement.clientWidth&&(S=this.cache("scrollbar-size",l),E.viewport.right-=S.width),["","static"].indexOf(A.body.style.position)!==-1&&["","static"].indexOf(A.body.parentElement.style.position)!==-1||(E.page.bottom=A.body.scrollHeight-v-r,E.page.right=A.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return f(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return a(e)}),i=getComputedStyle(e),n=o,r={};if(["Top","Left","Bottom","Right"].forEach(function(t){r[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=A.body.scrollWidth-o.left-n.width+r.right,o.bottom=A.body.scrollHeight-o.top-n.height+r.bottom,E.page.top>=o.top+r.top&&E.page.bottom>=o.bottom&&E.page.left>=o.left+r.left&&E.page.right>=o.right){var s=e.scrollTop,l=e.scrollLeft;E.offset={top:E.page.top-o.top+s-r.top,left:E.page.left-o.left+l-r.left}}}(),this.move(E),this.history.unshift(E),this.history.length>3&&this.history.pop(),e&&_(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,s=0;s<this.history.length;++s){var a=this.history[s];if("undefined"!=typeof a[i]&&!y(a[i][n],t[i][n])){r=!0;break}}r||(o[i][n]=!0)}}var l={top:"",left:"",right:"",bottom:""},d=function(t,o){var i="undefined"!=typeof e.options.optimizations,n=i?e.options.optimizations.gpu:null;if(n!==!1){var r=void 0,s=void 0;if(t.top?(l.top=0,r=o.top):(l.bottom=0,r=-o.bottom),t.left?(l.left=0,s=o.left):(l.right=0,s=-o.right),window.matchMedia){var a=window.matchMedia("only screen and (min-resolution: 1.3dppx)").matches||window.matchMedia("only screen and (-webkit-min-device-pixel-ratio: 1.3)").matches;a||(s=Math.round(s),r=Math.round(r))}l[L]="translateX("+s+"px) translateY("+r+"px)","msTransform"!==L&&(l[L]+=" translateZ(0)")}else t.top?l.top=o.top+"px":l.bottom=o.bottom+"px",t.left?l.left=o.left+"px":l.right=o.right+"px"},p=!1;if((o.page.top||o.page.bottom)&&(o.page.left||o.page.right)?(l.position="absolute",d(o.page,t.page)):(o.viewport.top||o.viewport.bottom)&&(o.viewport.left||o.viewport.right)?(l.position="fixed",d(o.viewport,t.viewport)):"undefined"!=typeof o.offset&&o.offset.top&&o.offset.left?!function(){l.position="absolute";var i=e.cache("target-offsetparent",function(){return f(e.target)});f(e.element)!==i&&k(function(){e.element.parentNode.removeChild(e.element),i.appendChild(e.element)}),d(o.offset,t.offset),p=!0}():(l.position="absolute",d({top:!0,left:!0},t.page)),!p)if(this.options.bodyElement)this.options.bodyElement.appendChild(this.element);else{for(var u=!0,c=this.element.parentNode;c&&1===c.nodeType&&"BODY"!==c.tagName;){if("static"!==getComputedStyle(c).position){u=!1;break}c=c.parentNode}u||(this.element.parentNode.removeChild(this.element),this.element.ownerDocument.body.appendChild(this.element))}var g={},m=!1;for(var n in l){var v=l[n],b=this.element.style[n];b!==v&&(m=!0,g[n]=v)}m&&k(function(){h(e.element.style,g),e.trigger("repositioned")})}}}]),e}(B);I.modules=[],x.position=X;var $=h(I,x),z=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),Y=x.Utils,a=Y.getBounds,h=Y.extend,m=Y.updateClasses,k=Y.defer,G=["left","top","right","bottom"];x.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=t.targetAttachment;if(!this.options.constraints)return!0;var r=this.cache("element-bounds",function(){return a(e.element)}),s=r.height,f=r.width;if(0===f&&0===s&&"undefined"!=typeof this.lastSize){var l=this.lastSize;f=l.width,s=l.height}var d=this.cache("target-bounds",function(){return e.getTargetBounds()}),p=d.height,u=d.width,c=[this.getClass("pinned"),this.getClass("out-of-bounds")];this.options.constraints.forEach(function(t){var e=t.outOfBoundsClass,o=t.pinnedClass;e&&c.push(e),o&&c.push(o)}),c.forEach(function(t){["left","top","right","bottom"].forEach(function(e){c.push(t+"-"+e)})});var g=[],v=h({},n),y=h({},this.attachment);return this.options.constraints.forEach(function(t){var r=t.to,a=t.attachment,l=t.pin;"undefined"==typeof a&&(a="");var h=void 0,d=void 0;if(a.indexOf(" ")>=0){var c=a.split(" "),m=z(c,2);d=m[0],h=m[1]}else h=d=a;var b=O(e,r);"target"!==d&&"both"!==d||(o<b[1]&&"top"===v.top&&(o+=p,v.top="bottom"),o+s>b[3]&&"bottom"===v.top&&(o-=p,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&o<b[1]?(o+=p,v.top="bottom",o+=s,y.top="top"):"top"===y.top&&o+s>b[3]&&o-(s-p)>=b[1]&&(o-=s-p,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+s>b[3]?(o-=p,v.top="top",o-=s,y.top="bottom"):"bottom"===y.top&&o<b[1]&&o+(2*s-p)<=b[3]&&(o+=s-p,v.top="top",y.top="top")),"middle"===v.top&&(o+s>b[3]&&"top"===y.top?(o-=s,y.top="bottom"):o<b[1]&&"bottom"===y.top&&(o+=s,y.top="top"))),"target"!==h&&"both"!==h||(i<b[0]&&"left"===v.left&&(i+=u,v.left="right"),i+f>b[2]&&"right"===v.left&&(i-=u,v.left="left")),"together"===h&&(i<b[0]&&"left"===v.left?"right"===y.left?(i+=u,v.left="right",i+=f,y.left="left"):"left"===y.left&&(i+=u,v.left="right",i-=f,y.left="right"):i+f>b[2]&&"right"===v.left?"left"===y.left?(i-=u,v.left="left",i-=f,y.left="right"):"right"===y.left&&(i-=u,v.left="left",i+=f,y.left="left"):"center"===v.left&&(i+f>b[2]&&"left"===y.left?(i-=f,y.left="right"):i<b[0]&&"right"===y.left&&(i+=f,y.left="left"))),"element"!==d&&"both"!==d||(o<b[1]&&"bottom"===y.top&&(o+=s,y.top="top"),o+s>b[3]&&"top"===y.top&&(o-=s,y.top="bottom")),"element"!==h&&"both"!==h||(i<b[0]&&("right"===y.left?(i+=f,y.left="left"):"center"===y.left&&(i+=f/2,y.left="left")),i+f>b[2]&&("left"===y.left?(i-=f,y.left="right"):"center"===y.left&&(i-=f/2,y.left="right"))),"string"==typeof l?l=l.split(",").map(function(t){return t.trim()}):l===!0&&(l=["top","left","right","bottom"]),l=l||[];var w=[],C=[];o<b[1]&&(l.indexOf("top")>=0?(o=b[1],w.push("top")):C.push("top")),o+s>b[3]&&(l.indexOf("bottom")>=0?(o=b[3]-s,w.push("bottom")):C.push("bottom")),i<b[0]&&(l.indexOf("left")>=0?(i=b[0],w.push("left")):C.push("left")),i+f>b[2]&&(l.indexOf("right")>=0?(i=b[2]-f,w.push("right")):C.push("right")),w.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),g.push(t),w.forEach(function(e){g.push(t+"-"+e)})}(),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),g.push(t),C.forEach(function(e){g.push(t+"-"+e)})}(),(w.indexOf("left")>=0||w.indexOf("right")>=0)&&(y.left=v.left=!1),(w.indexOf("top")>=0||w.indexOf("bottom")>=0)&&(y.top=v.top=!1),v.top===n.top&&v.left===n.left&&y.top===e.attachment.top&&y.left===e.attachment.left||(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,g,c),m(e.element,g,c)}),{top:o,left:i}}});var Y=x.Utils,a=Y.getBounds,m=Y.updateClasses,k=Y.defer;x.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return a(e.element)}),r=n.height,s=n.width,f=this.getTargetBounds(),l=o+r,h=i+s,d=[];o<=f.bottom&&l>=f.top&&["left","right"].forEach(function(t){var e=f[t];e!==i&&e!==h||d.push(t)}),i<=f.right&&h>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];e!==o&&e!==l||d.push(t)});var p=[],u=[],c=["left","top","right","bottom"];return p.push(this.getClass("abutted")),c.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),d.length&&u.push(this.getClass("abutted")),d.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,u,p),m(e.element,u,p)}),!0}});var z=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return x.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=z(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),$}); \ No newline at end of file
diff --git a/ihatemoney/templates/add_bill.html b/ihatemoney/templates/add_bill.html
new file mode 100644
index 0000000..595f363
--- /dev/null
+++ b/ihatemoney/templates/add_bill.html
@@ -0,0 +1,17 @@
+{% extends "layout.html" %}
+
+{% block js %}
+ $('#cancel-form').click(function(){location.href={{ url_for(".list_bills") }};});
+{% endblock %}
+
+
+{% block top_menu %}
+<a href="{{ url_for(".list_bills") }}">{{ _("Back to the list") }}</a>
+{% endblock %}
+
+{% block content %}
+
+<form class="form-horizontal" method="post">
+ {{ forms.add_bill(form, edit) }}
+</form>
+{% endblock %}
diff --git a/ihatemoney/templates/add_member.html b/ihatemoney/templates/add_member.html
new file mode 100644
index 0000000..8ddfd52
--- /dev/null
+++ b/ihatemoney/templates/add_member.html
@@ -0,0 +1,9 @@
+{% extends "layout.html" %}
+{% block js %}
+ auto_hide_default_text('#name');
+{% endblock %}
+{% block content %}
+ <form class="form-horizontal" action="{{ url_for(".add_member") }}" method="post">
+ {{ forms.add_member(form) }}
+ </form>
+{% endblock %}
diff --git a/ihatemoney/templates/authenticate.html b/ihatemoney/templates/authenticate.html
new file mode 100644
index 0000000..f241c48
--- /dev/null
+++ b/ihatemoney/templates/authenticate.html
@@ -0,0 +1,19 @@
+{% extends "layout.html" %}
+{% block content %}
+<h2>Authentication</h2>
+
+{% if create_project %}
+<p class="info">{{ _("The project you are trying to access do not exist, do you want
+to") }} <a href="{{ url_for(".create_project", project_id=create_project) }}">{{ _("create it") }}</a>{{ _("?") }}
+</p>
+{% endif %}
+{% if admin_auth %}
+<form class="form-horizontal" method="POST" accept-charset="utf-8">
+ {{ forms.admin(form) }}
+</form>
+{% else %}
+<form class="form-horizontal" method="POST" accept-charset="utf-8">
+ {{ forms.authenticate(form) }}
+</form>
+{% endif %}
+{% endblock %}
diff --git a/ihatemoney/templates/create_project.html b/ihatemoney/templates/create_project.html
new file mode 100644
index 0000000..9d4fde9
--- /dev/null
+++ b/ihatemoney/templates/create_project.html
@@ -0,0 +1,8 @@
+{% extends "layout.html" %}
+
+{% block content %}
+<h2>{{ _("Create a new project") }}</h2>
+<form class="form-horizontal" method="post">
+ {{ forms.create_project(form) }}
+</form>
+{% endblock %}
diff --git a/ihatemoney/templates/dashboard.html b/ihatemoney/templates/dashboard.html
new file mode 100644
index 0000000..3f50915
--- /dev/null
+++ b/ihatemoney/templates/dashboard.html
@@ -0,0 +1,21 @@
+{% extends "layout.html" %}
+{% block content %}
+
+<table id="bill_table" class="table table-striped">
+ <thead><tr><th>{{ _("Project") }}</th><th>{{ _("Number of members") }}</th><th>{{ _("Number of bills") }}</th><th>{{_("Newest bill")}}</th><th>{{_("Oldest bill")}}</th></tr></thead>
+ <tbody>{% for project in projects|sort(attribute='name') %}
+ <tr class="{{ loop.cycle("odd", "even") }}">
+ <td>{{ project.name }}</td><td>{{ project.members | count }}</td><td>{{ project.get_bills().count() }}</td>
+ {% if project.has_bills() %}
+ <td>{{ project.get_bills().all()[0].date }}</td>
+ <td>{{ project.get_bills().all()[-1].date }}</td>
+ {% else %}
+ <td></td>
+ <td></td>
+ {% endif %}
+ </tr>
+ {% endfor %}
+ </tbody>
+</table>
+{% endblock %}
+
diff --git a/ihatemoney/templates/debug.html b/ihatemoney/templates/debug.html
new file mode 100644
index 0000000..6f97667
--- /dev/null
+++ b/ihatemoney/templates/debug.html
@@ -0,0 +1 @@
+Yeah
diff --git a/ihatemoney/templates/display_errors.html b/ihatemoney/templates/display_errors.html
new file mode 100644
index 0000000..9e19605
--- /dev/null
+++ b/ihatemoney/templates/display_errors.html
@@ -0,0 +1,5 @@
+{% for field_name, field_errors in form.errors.items() if field_errors %}
+ {% for error in field_errors %}
+ <p class="alert alert-danger"><strong>{{ form[field_name].label.text }}:</strong> {{ error }}</p>
+ {% endfor %}
+{% endfor %}
diff --git a/ihatemoney/templates/edit_member.html b/ihatemoney/templates/edit_member.html
new file mode 100644
index 0000000..5f097f9
--- /dev/null
+++ b/ihatemoney/templates/edit_member.html
@@ -0,0 +1,17 @@
+{% extends "layout.html" %}
+
+{% block js %}
+ $('#cancel-form').click(function(){location.href={{ url_for(".list_bills") }};});
+{% endblock %}
+
+
+{% block top_menu %}
+<a href="{{ url_for(".list_bills") }}">{{ _("Back to the list") }}</a>
+{% endblock %}
+
+{% block content %}
+
+<form class="form-horizontal" method="post">
+ {{ forms.edit_member(form, edit) }}
+</form>
+{% endblock %}
diff --git a/ihatemoney/templates/edit_project.html b/ihatemoney/templates/edit_project.html
new file mode 100644
index 0000000..a5e85c3
--- /dev/null
+++ b/ihatemoney/templates/edit_project.html
@@ -0,0 +1,19 @@
+{% extends "layout.html" %}
+
+{% block js %}
+ $('#delete-project').click(function ()
+ {
+ $(this).html("<a style='color:red; ' href='{{ url_for('.delete_project') }}' >{{_("you sure?")}}</a>");
+ });
+{% endblock %}
+
+{% block content %}
+<h2>{{ _("Edit this project") }}</h2>
+<form class="form-horizontal" method="post">
+{{ forms.edit_project(edit_form) }}
+</form></br>
+<h2>{{ _("Download this project's data") }}</h2>
+<form class="form-horizontal" method="post">
+{{ forms.export_project(export_form) }}
+</form>
+{% endblock %}
diff --git a/ihatemoney/templates/forms.html b/ihatemoney/templates/forms.html
new file mode 100644
index 0000000..ffdd165
--- /dev/null
+++ b/ihatemoney/templates/forms.html
@@ -0,0 +1,168 @@
+{% macro input(field, multiple=False, class='form-control', inline=False) -%}
+ <div class="form-group{% if inline %} row{% endif %}">
+ {% if field.type != "SubmitField" %}
+ {% if inline %}
+ {{ field.label(class="col-3") }}
+ {% else %}
+ {{ field.label() }}
+ {% endif %}
+ {% endif %}
+ <div class="controls{% if inline %} col-9{% endif %}">
+ {% if multiple == True %}
+ {{ field(multiple=True, class=class) }}
+ {% else %}
+ {{ field(class=class) | safe }}
+ {% endif %}
+ {% if field.description %}
+ <p class="help-inline">{{ field.description }}</p>
+ {% endif %}
+ </div>
+ </div>
+{% endmacro %}
+
+{% macro submit(field, cancel=False, home=False) -%}
+ <div class="actions">
+ <button type="submit" class="btn btn-primary">{{ field.name }}</button>
+ {% if home %}
+ <a href="{{ url_for(".remind_password") }}">{{ _("Can't remember the password?") }}</a>
+ {% endif %}
+ {% if cancel %}
+ <button type="reset" class="btn">{{ _("Cancel") }}</button>
+ {% endif %}
+ </div>
+{% endmacro %}
+
+{% macro authenticate(form, home=False) %}
+
+ {% include "display_errors.html" %}
+
+ {{ form.hidden_tag() }}
+ {{ input(form.id) }}
+ {{ input(form.password) }}
+ {% if not home %}
+ {{ submit(form.submit, home=True) }}
+ {% endif %}
+
+{% endmacro %}
+
+{% macro admin(form) %}
+
+ {% include "display_errors.html" %}
+
+ {{ form.hidden_tag() }}
+ {{ input(form.admin_password) }}
+ {{ submit(form.submit) }}
+
+{% endmacro %}
+
+{% macro create_project(form, home=False) %}
+
+ {% include "display_errors.html" %}
+ {{ form.hidden_tag() }}
+ {% if not home %}
+ {{ input(form.id) }}
+ {% endif %}
+ {{ input(form.name) }}
+ {{ input(form.password) }}
+ {{ input(form.contact_email) }}
+ {% if not home %}
+ {{ submit(form.submit, home=True) }}
+ {% endif %}
+
+{% endmacro %}
+
+{% macro edit_project(form) %}
+
+ {% include "display_errors.html" %}
+ {{ form.hidden_tag() }}
+ {{ input(form.name) }}
+ {{ input(form.password) }}
+ {{ input(form.contact_email) }}
+ <div class="actions">
+ <button class="btn btn-primary">{{ _("Edit the project") }}</button>
+ <a id="delete-project" style="color:red; margin-left:10px; cursor:pointer; ">{{ _("delete") }}</a>
+ </div>
+
+{% endmacro %}
+
+{% macro add_bill(form, edit=False, title=True) %}
+
+ <fieldset>
+ {% if title %}<legend>{% if edit %}{{ _("Edit this bill") }} {% else %}{{ _("Add a bill") }} {% endif %}</legend>{% endif %}
+ {% include "display_errors.html" %}
+ {{ form.hidden_tag() }}
+ {{ input(form.date, class="form-control datepicker", inline=True) }}
+ {{ input(form.what, inline=True) }}
+ {{ input(form.payer, inline=True, class="form-control custom-select") }}
+ {{ input(form.amount, inline=True) }}
+
+ <div class="form-group row">
+ <label class="col-3" for="payed_for">{{ _("For whom?") }}</label>
+ <div class="controls col-9">
+ <ul id="payed_for" class="inputs-list">
+ <p><a href="#" id="selectall" onclick="selectall()">{{ _("Select all") }}</a> | <a href="#" id="selectnone" onclick="selectnone()">{{_("Select none")}}</a></p>
+ {% for key, value, checked in form.payed_for.iter_choices() %}
+ <p class="form-check"><label for="payed_for-{{key}}" class="form-check-label"><input name="payed_for" type="checkbox" {% if checked %}checked{% endif %} class="form-check-input" value="{{key}}" id="payed_for-{{key}}"/><span>{{value}}</span></label></p>
+ {% endfor %}
+ </ul>
+ </div>
+ </div>
+ </fieldset>
+ <div class="actions">
+ {{ form.submit(class="btn btn-primary") }}
+ {% if not edit %} {{ form.submit2(class="btn") }}{% endif %}
+ </div>
+
+{% endmacro %}
+
+{% macro add_member(form) %}
+{{ form.hidden_tag() }}
+ <div class="input-group">
+ <label class="sr-only" for="name">_("Type user name here")</label>
+ {{ form.name(placeholder=_("Type user name here"), class="form-control") }}
+ <button class=" input-group-addon btn">{{ _("Add") }}</button>
+ </div>
+{% endmacro %}
+
+{% macro edit_member(form, title=True) %}
+ <fieldset>
+ {% if title %}<legend>{{ _("Edit this member") }}</legend>{% endif %}
+ {% include "display_errors.html" %}
+ {{ form.hidden_tag() }}
+ {{ input(form.name) }}
+ {{ input(form.weight) }}
+ </fieldset>
+ <div class="actions">
+ {{ form.submit(class="btn btn-primary") }}
+ </div>
+{% endmacro %}
+
+
+{% macro invites(form) %}
+ {{ form.hidden_tag() }}
+ {{ input(form.emails) }}
+ <div class="actions">
+ <button class="btn btn-primary">{{ _("Send the invitations") }}</button>
+ <a href="{{ url_for(".list_bills") }}">{{ _("No, thanks") }}</a>
+ </div>
+{% endmacro %}
+
+{% macro export_project(form) %}
+ <fieldset>
+ {{ form.hidden_tag() }}
+ {{ input(form.export_type) }}
+ {{ input(form.export_format) }}
+ </fieldset>
+ <div class="actions">
+ <button class="btn btn-primary">{{ _("Download") }}</button>
+ </div>
+{% endmacro %}
+
+{% macro remind_password(form) %}
+
+ {% include "display_errors.html" %}
+ {{ form.hidden_tag() }}
+ {{ input(form.id) }}
+ {{ submit(form.submit) }}
+
+{% endmacro %}
diff --git a/ihatemoney/templates/home.html b/ihatemoney/templates/home.html
new file mode 100644
index 0000000..9bfe467
--- /dev/null
+++ b/ihatemoney/templates/home.html
@@ -0,0 +1,56 @@
+{% extends "layout.html" %}
+
+
+{% block body %}
+ <header id="header" class="row">
+ <div class="col-xs-12 col-sm-5 offset-md-2">
+ <h2>{{ _("Manage your shared <br>expenses, easily") }}</h2>
+ {% if is_demo_project_activated %}
+ <a href="{{ url_for(".demo") }}" class="tryout btn">{{ _("Try out the demo") }}</a>
+ {% endif %}
+ </div>
+ <div class="col-xs-12 col-sm-4">
+ <p class="additional-content">{{ _("You're sharing a house?") }}<br /> {{ _("Going on holidays with friends?") }}<br /> {{ _("Simply sharing money with others?") }} <br /><strong>{{ _("We can help!") }}</strong></p>
+ </div>
+ </header>
+
+ <main class="row home">
+ <div class="col-xs-12 col-sm-5 col-md-4 offset-md-2">
+ <form id="authentication-form" class="form-horizontal" action="{{ url_for(".authenticate") }}" method="post">
+ <fieldset class="form-group">
+ <legend>{{ _("Log to an existing project") }}...</legend>
+ {{ forms.authenticate(auth_form, home=True) }}
+ </fieldset>
+ <div class="controls">
+ <button class="btn" type="submit">{{ _("log in") }}</button>
+ <a class="password-reminder" href="{{ url_for(".remind_password") }}">{{ _("can't remember your password?") }}</a>
+ </div>
+ </form>
+ </div>
+ <div class="col-xs-12 col-sm-5 col-md-3 offset-sm-1">
+ {% if is_admin_mode_enabled %}
+ <a href="{{ url_for(".create_project") }}">...{{ _("or create a new one") }}</a>
+ {% else %}
+ <form id="creation-form" class="form-horizontal" action="{{ url_for(".create_project") }}" method="post">
+ <fieldset class="form-group">
+ <legend>...{{ _("or create a new one") }}</legend>
+ {{ forms.create_project(project_form, home=True) }}
+ </fieldset>
+ <div class="controls">
+ <button class="btn" type="submit">{{ _("let's get started") }}</button>
+ </div>
+ </form>
+ {% endif %}
+ </main>
+ </div>
+{% endblock %}
+
+{% block js %}
+
+$('#creation-form #password').tooltip({
+ title: '{{ _("This access code will be sent to your friends. It is stored as-is by the server, so don\\'t reuse a personal password!") }}',
+ trigger: 'focus',
+ placement: 'right'
+});
+
+{% endblock %}
diff --git a/ihatemoney/templates/invitation_mail.en b/ihatemoney/templates/invitation_mail.en
new file mode 100644
index 0000000..03f5141
--- /dev/null
+++ b/ihatemoney/templates/invitation_mail.en
@@ -0,0 +1,10 @@
+Hi,
+
+Someone using the email address {{ g.project.contact_email }} invited you to share your expenses for "{{ g.project.name }}".
+
+It's as simple as saying what did you paid for, for who, and how much did it cost you, we are caring about the rest.
+
+You can access it here: {{ config['SITE_URL'] }}{{ url_for(".list_bills") }} and the private code is "{{ g.project.password }}".
+
+Enjoy,
+Some weird guys (with beards)
diff --git a/ihatemoney/templates/invitation_mail.fr b/ihatemoney/templates/invitation_mail.fr
new file mode 100644
index 0000000..53698dd
--- /dev/null
+++ b/ihatemoney/templates/invitation_mail.fr
@@ -0,0 +1,9 @@
+Salut,
+
+Quelqu'un avec l'addresse email "{{ g.project.contact_email }}" vous à invité à partager vos dépenses pour "{{ g.project.name }}".
+
+C'est aussi simple que de dire qui à payé pour quoi, pour qui, et combien celà à coûté, on s'occuppe du reste.
+
+Vous pouvez accéder à la page ici: {{ config['SITE_URL'] }}{{ url_for(".list_bills") }} et le code est "{{ g.project.password }}".
+
+Have fun,
diff --git a/ihatemoney/templates/layout.html b/ihatemoney/templates/layout.html
new file mode 100644
index 0000000..6ecff41
--- /dev/null
+++ b/ihatemoney/templates/layout.html
@@ -0,0 +1,98 @@
+{% import "forms.html" as forms %}
+<!DOCTYPE html>
+<html>
+<head>
+ <title>{{ _("Account manager") }}{% block title %}{% endblock %}</title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel=stylesheet type=text/css href="{{ url_for("static", filename='css/main.css') }}">
+ <script src="{{ url_for("static", filename="js/jquery-3.1.1.min.js") }}"></script>
+ <script src="{{ url_for("static", filename="js/ihatemoney.js") }}"></script>
+ <script src="{{ url_for("static", filename="js/tether.min.js") }}"></script>
+ <script src="{{ url_for("static", filename="js/bootstrap.min.js") }}"></script>
+ {% block head %}{% endblock %}
+ <script type="text/javascript" charset="utf-8">
+ $(document).ready(function(){
+ var left = window.innerWidth/2-$('.flash').width()/2;
+ $(".flash").css({ "left": left+"px", "top":"0.6rem" });
+ setTimeout(function(){
+ $(".flash").fadeOut("slow", function () {
+ $(".flash").remove();
+ });
+ }, 4000);
+
+ $('.datepicker').datepicker({
+ format: 'yyyy-mm-dd',
+ weekStart: 1,
+ autoclose: true,
+ language: '{{ g.lang }}'
+ });
+
+ $('.dropdown-toggle').dropdown();
+
+ {% block js %}{% endblock %}
+ });
+ </script>
+</head>
+<body>
+ <div class="container">
+ <nav class="navbar navbar-toggleable-sm fixed-top navbar-inverse bg-inverse">
+ <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarToggler" aria-controls="navbarToggler" aria-expanded="false" aria-label="Toggle navigation">
+ <span class="navbar-toggler-icon"></span>
+ </button>
+ <div class="collapse navbar-collapse" id="navbarToggler">
+ <h1><a class="navbar-brand" href="{{ url_for(".home") }}">#! money?</a></h1>
+ <ul class="navbar-nav ml-auto mr-auto">
+ {% if g.project %}
+ {% block navbar %}
+ <li class="nav-item{% if current_view == 'list_bills' %} active{% endif %}"><a class="nav-link" href="{{ url_for(".list_bills") }}">{{ _("Bills") }}</a></li>
+ <li class="nav-item{% if current_view == 'settle_bill' %} active{% endif %}"><a class="nav-link" href="{{ url_for(".settle_bill") }}">{{ _("Settle") }}</a></li>
+ {% endblock %}
+ {% endif %}
+ </ul>
+ <ul class="navbar-nav secondary-nav">
+ {% if g.project %}
+ <li class="nav-item dropdown">
+ <a href="#" class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><strong>{{ g.project.name }}</strong> {{ _("options") }} <b class="caret"></b></a>
+ <ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
+ <li><a class="dropdown-item" href="{{ url_for(".edit_project") }}">{{ _("Project settings") }}</a></li>
+ <li class="dropdown-divider"></li>
+ {% for id, name in session['projects'] %}
+ {% if id != g.project.id %}
+ <li><a class="dropdown-item" href="{{ url_for(".list_bills", project_id=id) }}">{{ _("switch to") }} {{ name }}</a></li>
+ {% endif %}
+ {% endfor %}
+ <li><a class="dropdown-item" href="{{ url_for(".create_project") }}">{{ _("Start a new project") }}</a></li>
+ <li class="dropdown-divider"></li>
+ <li><a class="dropdown-item" href="{{ url_for(".exit") }}">{{ _("Logout") }}</a></li>
+ </ul>
+ </li>
+ {% endif %}
+ <li class="nav-item{% if g.lang == "fr" %} active{% endif %}"><a class="nav-link" href="{{ url_for(".change_lang", lang="fr") }}">fr</a></li>
+ <li class="nav-item{% if g.lang == "en" %} active{% endif %}"><a class="nav-link" href="{{ url_for(".change_lang", lang="en") }}">en</a></li>
+ </ul>
+ </div>
+ </nav>
+ </div>
+
+<div class="container-fluid">
+{% block body %}
+ {% block sidebar %}{% endblock %}
+ <main class="content offset-1 col-10">
+ {% block content %}{% endblock %}
+ </main>
+</div>
+{% endblock %}
+
+{% for message in get_flashed_messages() %}
+<div class="flash alert alert-success">{{ message }}</div>
+{% endfor %}
+
+{% block footer %}
+<footer>
+ <p><a href="https://github.com/spiral-project/ihatemoney">{{ _("This is a free software") }}</a>, {{ _("you can contribute and improve it!") }}</p>
+</footer>
+{% endblock %}
+
+</body>
+</html>
diff --git a/ihatemoney/templates/list_bills.html b/ihatemoney/templates/list_bills.html
new file mode 100644
index 0000000..4029bc9
--- /dev/null
+++ b/ihatemoney/templates/list_bills.html
@@ -0,0 +1,128 @@
+{% extends "sidebar_table_layout.html" %}
+
+{% block title %} - {{ g.project.name }}{% endblock %}
+{% block head %}
+ <script src="{{ url_for("static", filename="js/bootstrap-datepicker.js") }}"></script>
+ <script src="{{ url_for("static", filename="js/locales/bootstrap-datepicker.fr.min.js") }}" charset="utf-8"></script>
+{% endblock %}
+{% block js %}
+ {% if add_bill %} $('#new-bill').click(); {% endif %}
+
+ // Hide all members actions
+ $('.action').each(function(){
+ $(this).hide();
+ });
+
+ // ask for confirmation before removing an user
+ $('.action.delete').each(function(){
+ var link = $(this).find('button');
+ link.click(function(){
+ if ($(this).hasClass("confirm")){
+ return true;
+ }
+ $(this).html("{{_("you sure?")}}");
+ $(this).addClass("confirm");
+ return false;
+ });
+ });
+
+ // display the remove button on mouse over (and hide them per default)
+ $('.balance tr').hover(function(){
+ $(this).find('.action').show();
+ }, function(){
+ $(this).find('.action').hide();
+ });
+
+ var highlight_owers = function(){
+ var ower_ids = $(this).attr("owers").split(',');
+ var payer_id = $(this).attr("payer");
+ $.each(ower_ids, function(i, val){
+ $('#bal-member-'+val).addClass("ower_line");
+ });
+ $("#bal-member-"+payer_id).addClass("payer_line");
+ };
+
+ var unhighlight_owers = function(){
+ $('[id^="bal-member-"]').removeClass("ower_line payer_line");
+ };
+
+ $('#bill_table tbody tr').hover(highlight_owers, unhighlight_owers);
+
+{% endblock %}
+
+{% block sidebar %}
+ <form id="add-member-form" action="{{ url_for(".add_member") }}" method="post" class="form-inline">
+ {{ forms.add_member(member_form) }}
+ </form>
+
+ <div id="table_overflow">
+ <table class="balance table">
+ {% set balance = g.project.balance %}
+ {% for member in g.project.members | sort(attribute='name') if member.activated or balance[member.id]|round(2) != 0 %}
+ <tr id="bal-member-{{ member.id }}" action={% if member.activated %}delete{% else %}reactivate{% endif %}>
+ <td class="balance-name">{{ member.name }}
+ <span class="light{% if not g.project.uses_weights %} extra-info{% endif %}">(x{{ member.weight|minimal_round(1) }})</span>
+ </td>
+ {% if member.activated %}
+ <td>
+ <form class="action delete" action="{{ url_for(".remove_member", member_id=member.id) }}" method="POST">
+ <button type="submit">{{ _("deactivate") }}</button></form>
+ <form class="action edit" action="{{ url_for(".edit_member", member_id=member.id) }}" method="GET">
+ <button type="submit">{{ _("edit") }}</button></form>
+ </td>
+ {% else %}
+ <td>
+ <form class="action reactivate" action="{{ url_for(".reactivate", member_id=member.id) }}" method="POST">
+ <button type="submit">{{ _("reactivate") }}</button></form></td>
+ {% endif %}
+ <td class="balance-value {% if balance[member.id]|round(2) > 0 %}positive{% elif balance[member.id]|round(2) < 0 %}negative{% endif %}">
+ {% if balance[member.id]|round(2) > 0 %}+{% endif %}{{ "%.2f" | format(balance[member.id]) }}
+ </td>
+ </tr>
+ {% endfor %}
+ </table>
+ </div>
+{% endblock %}
+
+{% block content %}
+<div class="identifier">{{ _("The project identifier is") }} <a href="{{ url_for(".list_bills") }}">{{ g.project.id }}</a>, {{ _("remember it!") }}</div>
+<a id="new-bill" href="{{ url_for(".add_bill") }}" class="btn btn-primary" data-toggle="modal" data-target="#bill-form">{{ _("Add a new bill") }}</a>
+
+ <div id="bill-form" class="modal fade show" role="dialog">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h3 class="modal-title">{{ _('Add a bill') }}</h3>
+ <a href="#" class="close" data-dismiss="modal">&times;</a>
+ </div>
+ <form action="{{ url_for(".add_bill") }}" method="post" class="modal-body container">
+ {{ forms.add_bill(bill_form, title=False) }}
+ </form>
+ </div>
+ </div>
+ </div>
+
+ {% if bills.count() > 0 %}
+ <table id="bill_table" class="col table table-striped table-hover">
+ <thead><tr><th>{{ _("When?") }}</th><th>{{ _("Who paid?") }}</th><th>{{ _("For what?") }}</th><th>{{ _("For whom?") }}</th><th>{{ _("How much?") }}</th><th>{{ _("Actions") }}</th></tr></thead>
+ <tbody>
+ {% for bill in bills %}
+ <tr owers="{{bill.owers|join(',','id')}}" payer="{{bill.payer.id}}">
+ <td>{{ bill.date }}</td>
+ <td>{{ bill.payer }}</td>
+ <td>{{ bill.what }}</td>
+ <td>{{ bill.owers|join(', ', 'name') }} </td>
+ <td>{{ "%0.2f"|format(bill.amount) }} ({{ "%0.2f"|format(bill.pay_each()) }} {{ _("each") }})</td>
+ <td class="bill-actions">
+ <a class="edit" href="{{ url_for(".edit_bill", bill_id=bill.id) }}" title="{{ _("edit") }}">{{ _('edit') }}</a>
+ <a class="delete" href="{{ url_for(".delete_bill", bill_id=bill.id) }}" title="{{ _("delete") }}">{{ _('delete') }}</a>
+ </td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+
+ {% else %}
+ <p>{{ _("Nothing to list yet. You probably want to") }} <a href="{{ url_for(".add_bill") }}" data-toggle="modal" data-target="#bill-form">{{ _("add a bill") }}</a> ?</p>
+ {% endif %}
+{% endblock %}
diff --git a/ihatemoney/templates/password_reminder.en b/ihatemoney/templates/password_reminder.en
new file mode 100644
index 0000000..31210aa
--- /dev/null
+++ b/ihatemoney/templates/password_reminder.en
@@ -0,0 +1,8 @@
+Hi,
+
+You requested to be reminded about your password for "{{ project.name }}".
+
+You can access it here: {{ config['SITE_URL'] }}{{ url_for(".list_bills", project_id=project.id) }}, the private code is "{{ project.password }}".
+
+Hope this helps,
+Some weird guys (with beards)
diff --git a/ihatemoney/templates/password_reminder.fr b/ihatemoney/templates/password_reminder.fr
new file mode 100644
index 0000000..58f04e3
--- /dev/null
+++ b/ihatemoney/templates/password_reminder.fr
@@ -0,0 +1,7 @@
+Salut,
+
+Vous avez demandez des informations sur votre mot de passe pour "{{ project.name }}".
+
+Vous pouvez y accéder ici {{ config['SITE_URL'] }}{{ url_for(".list_bills", project_id=project.id) }}, le code d'accès est "{{ project.password }}".
+
+Faites en bon usage !
diff --git a/ihatemoney/templates/password_reminder.html b/ihatemoney/templates/password_reminder.html
new file mode 100644
index 0000000..8f46289
--- /dev/null
+++ b/ihatemoney/templates/password_reminder.html
@@ -0,0 +1,8 @@
+{% extends "layout.html" %}
+
+{% block content %}
+<h2>{{ _("Password reminder") }}</h2>
+<form class="form-horizontal" method="post">
+{{ forms.remind_password(form) }}
+</form>
+{% endblock %}
diff --git a/ihatemoney/templates/recent_projects.html b/ihatemoney/templates/recent_projects.html
new file mode 100644
index 0000000..df4972d
--- /dev/null
+++ b/ihatemoney/templates/recent_projects.html
@@ -0,0 +1,8 @@
+{% if 'projects' in session %}
+<h3>{{ _("Your projects") }}</h3>
+ <ul>
+ {% for id, name in session['projects'] %}
+ <li><a href="{{ url_for("list_bills", project_id=id) }}">{{ name }}</a></li>
+ {% endfor %}
+ </ul>
+{% endif %}
diff --git a/ihatemoney/templates/reminder_mail.en b/ihatemoney/templates/reminder_mail.en
new file mode 100644
index 0000000..fe57be2
--- /dev/null
+++ b/ihatemoney/templates/reminder_mail.en
@@ -0,0 +1,9 @@
+Hi,
+
+You have just (or someone else using your email address) created the project "{{ g.project.name }}" to share your expenses.
+
+You can access it here: {{ config['SITE_URL'] }}{{ url_for(".list_bills") }} (the identifier is {{ g.project.id }}),
+and the private code is "{{ g.project.password }}".
+
+Enjoy,
+Some weird guys (with beards)
diff --git a/ihatemoney/templates/reminder_mail.fr b/ihatemoney/templates/reminder_mail.fr
new file mode 100644
index 0000000..8130218
--- /dev/null
+++ b/ihatemoney/templates/reminder_mail.fr
@@ -0,0 +1,8 @@
+Hey,
+
+Vous venez de créer le projet "{{ g.project.name }}" pour partager vos dépenses.
+
+Vous pouvez y accéder ici: {{ config['SITE_URL'] }}{{ url_for(".list_bills") }} (l'identifieur est {{ g.project.id }}),
+et le code d'accès "{{ g.project.password }}".
+
+Faites en bon usage !
diff --git a/ihatemoney/templates/send_invites.html b/ihatemoney/templates/send_invites.html
new file mode 100644
index 0000000..7b3bdc5
--- /dev/null
+++ b/ihatemoney/templates/send_invites.html
@@ -0,0 +1,20 @@
+{% extends "layout.html" %}
+
+{% block sidebar %}
+<ol>
+ <li>{{ _("Create the project") }}</li>
+ <li><strong>{{ _("Invite people") }}</strong></li>
+ <li><a href="{{ url_for(".list_bills") }}">{{ _("Use it!") }}</a></li>
+</ol>
+{% endblock %}
+{% block content %}
+<h2>{{ _("Invite people to join this project") }}</h2>
+<p>{{ _("Specify a (comma separated) list of email adresses you want to notify about the
+creation of this budget management project and we will send them an email for you.") }}</p>
+<p>{{ _("If you prefer, you can") }} <a href="{{ url_for(".list_bills") }}">{{ _("skip this step") }}</a> {{ _("and notify them yourself") }}</p>
+
+{% include "display_errors.html" %}
+<form class="invites form-horizontal" method="post" accept-charset="utf-8">
+ {{ forms.invites(form) }}
+</form>
+{% endblock %}
diff --git a/ihatemoney/templates/settle_bills.html b/ihatemoney/templates/settle_bills.html
new file mode 100644
index 0000000..b67a9b8
--- /dev/null
+++ b/ihatemoney/templates/settle_bills.html
@@ -0,0 +1,34 @@
+{% extends "sidebar_table_layout.html" %}
+
+{% block sidebar %}
+ <div id="table_overflow">
+ <table class="balance table">
+ {% set balance = g.project.balance %}
+ {% for member in g.project.members | sort(attribute='name') if member.activated or balance[member.id]|round(2) != 0 %}
+ <tr id="bal-member-{{ member.id }}" action={% if member.activated %}delete{% else %}reactivate{% endif %}>
+ <td class="balance-name">{{ member.name }}</td>
+ <td class="balance-value {% if balance[member.id]|round(2) > 0 %}positive{% elif balance[member.id]|round(2) < 0 %}negative{% endif %}">
+ {% if balance[member.id]|round(2) > 0 %}+{% endif %}{{ "%.2f" | format(balance[member.id]) }}
+ </td>
+ </tr>
+ {% endfor %}
+ </table>
+ </div>
+{% endblock %}
+
+
+{% block content %}
+ <table id="bill_table" class="split_bills table table-striped">
+ <thead><tr><th>{{ _("Who pays?") }}</th><th>{{ _("To whom?") }}</th><th>{{ _("How much?") }}</th></tr></thead>
+ <tbody>
+ {% for bill in bills %}
+ <tr class="{{ loop.cycle("odd", "even") }}" receiver={{bill.receiver.id}}>
+ <td>{{ bill.ower }}</td>
+ <td>{{ bill.receiver }}</td>
+ <td>{{ "%0.2f"|format(bill.amount) }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+
+{% endblock %}
diff --git a/ihatemoney/templates/sidebar_table_layout.html b/ihatemoney/templates/sidebar_table_layout.html
new file mode 100644
index 0000000..239acb3
--- /dev/null
+++ b/ihatemoney/templates/sidebar_table_layout.html
@@ -0,0 +1,14 @@
+{% extends "layout.html" %}
+
+{% block body %}
+<div class="row" style="height: 100%">
+<aside id="sidebar" class="sidebar col-xs-12 col-md-3 " style="height: 100%">
+ {% block sidebar %}{% endblock %}
+</aside>
+
+<main class="offset-md-3 col-xs-12 col-md-9">
+ {% block content %}{% endblock %}
+</main>
+
+</div>
+{% endblock %}
diff --git a/ihatemoney/tests/__init__.py b/ihatemoney/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ihatemoney/tests/__init__.py
diff --git a/ihatemoney/tests/ihatemoney.cfg b/ihatemoney/tests/ihatemoney.cfg
new file mode 100644
index 0000000..6345fcf
--- /dev/null
+++ b/ihatemoney/tests/ihatemoney.cfg
@@ -0,0 +1,7 @@
+DEBUG = False
+SQLALCHEMY_DATABASE_URI = 'sqlite:///budget.db'
+SQLACHEMY_ECHO = DEBUG
+
+SECRET_KEY = "supersecret"
+
+MAIL_DEFAULT_SENDER = ("Budget manager", "budget@notmyidea.org")
diff --git a/ihatemoney/tests/ihatemoney_envvar.cfg b/ihatemoney/tests/ihatemoney_envvar.cfg
new file mode 100644
index 0000000..dbc078e
--- /dev/null
+++ b/ihatemoney/tests/ihatemoney_envvar.cfg
@@ -0,0 +1,7 @@
+DEBUG = False
+SQLALCHEMY_DATABASE_URI = 'sqlite:///budget.db'
+SQLACHEMY_ECHO = DEBUG
+
+SECRET_KEY = "lalatra"
+
+MAIL_DEFAULT_SENDER = ("Budget manager", "budget@notmyidea.org")
diff --git a/ihatemoney/tests/tests.py b/ihatemoney/tests/tests.py
new file mode 100644
index 0000000..271477a
--- /dev/null
+++ b/ihatemoney/tests/tests.py
@@ -0,0 +1,1179 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+try:
+ import unittest2 as unittest
+except ImportError:
+ import unittest # NOQA
+
+import os
+import json
+from collections import defaultdict
+import six
+
+from werkzeug.security import generate_password_hash
+from flask import session
+from flask_testing import TestCase
+
+from ihatemoney.run import create_app, db
+from ihatemoney import models
+from ihatemoney import utils
+
+# Unset configuration file env var if previously set
+if 'IHATEMONEY_SETTINGS_FILE_PATH' in os.environ:
+ del os.environ['IHATEMONEY_SETTINGS_FILE_PATH']
+
+__HERE__ = os.path.dirname(os.path.abspath(__file__))
+
+
+class BaseTestCase(TestCase):
+
+ SECRET_KEY = "TEST SESSION"
+
+ def create_app(self):
+ # Pass the test object as a configuration.
+ return create_app(self)
+
+ def setUp(self):
+ db.create_all()
+
+ def tearDown(self):
+ # clean after testing
+ db.session.remove()
+ db.drop_all()
+
+ def login(self, project, password=None, test_client=None):
+ password = password or project
+
+ return self.client.post('/authenticate', data=dict(
+ id=project, password=password), follow_redirects=True)
+
+ def post_project(self, name):
+ """Create a fake project"""
+ # create the project
+ self.client.post("/create", data={
+ 'name': name,
+ 'id': name,
+ 'password': name,
+ 'contact_email': '%s@notmyidea.org' % name
+ })
+
+ def create_project(self, name):
+ project = models.Project(
+ id=name,
+ name=six.text_type(name),
+ password=name,
+ contact_email="%s@notmyidea.org" % name)
+ models.db.session.add(project)
+ models.db.session.commit()
+
+
+class IhatemoneyTestCase(BaseTestCase):
+ SQLALCHEMY_DATABASE_URI = "sqlite://"
+ TESTING = True
+ WTF_CSRF_ENABLED = False # Simplifies the tests.
+
+
+class DefaultConfigurationTestCase(BaseTestCase):
+
+ def test_default_configuration(self):
+ """Test that default settings are loaded when no other configuration file is specified"""
+ self.assertFalse(self.app.config['DEBUG'])
+ self.assertEqual(self.app.config['SQLALCHEMY_DATABASE_URI'], 'sqlite://')
+ self.assertFalse(self.app.config['SQLALCHEMY_TRACK_MODIFICATIONS'])
+ self.assertEqual(self.app.config['MAIL_DEFAULT_SENDER'],
+ ("Budget manager", "budget@notmyidea.org"))
+
+
+class BudgetTestCase(IhatemoneyTestCase):
+
+ def test_notifications(self):
+ """Test that the notifications are sent, and that email adresses
+ are checked properly.
+ """
+ # sending a message to one person
+ with self.app.mail.record_messages() as outbox:
+
+ # create a project
+ self.login("raclette")
+
+ self.post_project("raclette")
+ self.client.post("/raclette/invite",
+ data={"emails": 'alexis@notmyidea.org'})
+
+ self.assertEqual(len(outbox), 2)
+ self.assertEqual(outbox[0].recipients, ["raclette@notmyidea.org"])
+ self.assertEqual(outbox[1].recipients, ["alexis@notmyidea.org"])
+
+ # sending a message to multiple persons
+ with self.app.mail.record_messages() as outbox:
+ self.client.post("/raclette/invite",
+ data={"emails": 'alexis@notmyidea.org, toto@notmyidea.org'})
+
+ # only one message is sent to multiple persons
+ self.assertEqual(len(outbox), 1)
+ self.assertEqual(outbox[0].recipients,
+ ["alexis@notmyidea.org", "toto@notmyidea.org"])
+
+ # mail address checking
+ with self.app.mail.record_messages() as outbox:
+ response = self.client.post("/raclette/invite",
+ data={"emails": "toto"})
+ self.assertEqual(len(outbox), 0) # no message sent
+ self.assertIn("The email toto is not valid", response.data.decode('utf-8'))
+
+ # mixing good and wrong adresses shouldn't send any messages
+ with self.app.mail.record_messages() as outbox:
+ self.client.post("/raclette/invite",
+ data={"emails": 'alexis@notmyidea.org, alexis'}) # not valid
+
+ # only one message is sent to multiple persons
+ self.assertEqual(len(outbox), 0)
+
+ def test_password_reminder(self):
+ # test that it is possible to have an email cotaining the password of a
+ # project in case people forget it (and it happens!)
+
+ self.create_project("raclette")
+
+ with self.app.mail.record_messages() as outbox:
+ # a nonexisting project should not send an email
+ self.client.post("/password-reminder", data={"id": "unexisting"})
+ self.assertEqual(len(outbox), 0)
+
+ # a mail should be sent when a project exists
+ self.client.post("/password-reminder", data={"id": "raclette"})
+ self.assertEqual(len(outbox), 1)
+ self.assertIn("raclette", outbox[0].body)
+ self.assertIn("raclette@notmyidea.org", outbox[0].recipients)
+
+ def test_project_creation(self):
+ with self.app.test_client() as c:
+
+ # add a valid project
+ c.post("/create", data={
+ 'name': 'The fabulous raclette party',
+ 'id': 'raclette',
+ 'password': 'party',
+ 'contact_email': 'raclette@notmyidea.org'
+ })
+
+ # session is updated
+ self.assertEqual(session['raclette'], 'party')
+
+ # project is created
+ self.assertEqual(len(models.Project.query.all()), 1)
+
+ # Add a second project with the same id
+ models.Project.query.get('raclette')
+
+ c.post("/create", data={
+ 'name': 'Another raclette party',
+ 'id': 'raclette', # already used !
+ 'password': 'party',
+ 'contact_email': 'raclette@notmyidea.org'
+ })
+
+ # no new project added
+ self.assertEqual(len(models.Project.query.all()), 1)
+
+ def test_project_deletion(self):
+
+ with self.app.test_client() as c:
+ c.post("/create", data={
+ 'name': 'raclette party',
+ 'id': 'raclette',
+ 'password': 'party',
+ 'contact_email': 'raclette@notmyidea.org'
+ })
+
+ # project added
+ self.assertEqual(len(models.Project.query.all()), 1)
+
+ c.get('/raclette/delete')
+
+ # project removed
+ self.assertEqual(len(models.Project.query.all()), 0)
+
+ def test_membership(self):
+ self.post_project("raclette")
+ self.login("raclette")
+
+ # adds a member to this project
+ self.client.post("/raclette/members/add", data={'name': 'alexis'})
+ self.assertEqual(len(models.Project.query.get("raclette").members), 1)
+
+ # adds him twice
+ result = self.client.post("/raclette/members/add",
+ data={'name': 'alexis'})
+
+ # should not accept him
+ self.assertEqual(len(models.Project.query.get("raclette").members), 1)
+
+ # add fred
+ self.client.post("/raclette/members/add", data={'name': 'fred'})
+ self.assertEqual(len(models.Project.query.get("raclette").members), 2)
+
+ # check fred is present in the bills page
+ result = self.client.get("/raclette/")
+ self.assertIn("fred", result.data.decode('utf-8'))
+
+ # remove fred
+ self.client.post("/raclette/members/%s/delete" %
+ models.Project.query.get("raclette").members[-1].id)
+
+ # as fred is not bound to any bill, he is removed
+ self.assertEqual(len(models.Project.query.get("raclette").members), 1)
+
+ # add fred again
+ self.client.post("/raclette/members/add", data={'name': 'fred'})
+ fred_id = models.Project.query.get("raclette").members[-1].id
+
+ # bound him to a bill
+ result = self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'fromage à raclette',
+ 'payer': fred_id,
+ 'payed_for': [fred_id, ],
+ 'amount': '25',
+ })
+
+ # remove fred
+ self.client.post("/raclette/members/%s/delete" % fred_id)
+
+ # he is still in the database, but is deactivated
+ self.assertEqual(len(models.Project.query.get("raclette").members), 2)
+ self.assertEqual(
+ len(models.Project.query.get("raclette").active_members), 1)
+
+ # as fred is now deactivated, check that he is not listed when adding
+ # a bill or displaying the balance
+ result = self.client.get("/raclette/")
+ self.assertNotIn(("/raclette/members/%s/delete" % fred_id), result.data.decode('utf-8'))
+
+ result = self.client.get("/raclette/add")
+ self.assertNotIn("fred", result.data.decode('utf-8'))
+
+ # adding him again should reactivate him
+ self.client.post("/raclette/members/add", data={'name': 'fred'})
+ self.assertEqual(
+ len(models.Project.query.get("raclette").active_members), 2)
+
+ # adding an user with the same name as another user from a different
+ # project should not cause any troubles
+ self.post_project("randomid")
+ self.login("randomid")
+ self.client.post("/randomid/members/add", data={'name': 'fred'})
+ self.assertEqual(
+ len(models.Project.query.get("randomid").active_members), 1)
+
+ def test_person_model(self):
+ self.post_project("raclette")
+ self.login("raclette")
+
+ # adds a member to this project
+ self.client.post("/raclette/members/add", data={'name': 'alexis'})
+ alexis = models.Project.query.get("raclette").members[-1]
+
+ # should not have any bills
+ self.assertFalse(alexis.has_bills())
+
+ # bound him to a bill
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'fromage à raclette',
+ 'payer': alexis.id,
+ 'payed_for': [alexis.id, ],
+ 'amount': '25',
+ })
+
+ # should have a bill now
+ alexis = models.Project.query.get("raclette").members[-1]
+ self.assertTrue(alexis.has_bills())
+
+ def test_member_delete_method(self):
+ self.post_project("raclette")
+ self.login("raclette")
+
+ # adds a member to this project
+ self.client.post("/raclette/members/add", data={'name': 'alexis'})
+
+ # try to remove the member using GET method
+ response = self.client.get("/raclette/members/1/delete")
+ self.assertEqual(response.status_code, 405)
+
+ # delete user using POST method
+ self.client.post("/raclette/members/1/delete")
+ self.assertEqual(
+ len(models.Project.query.get("raclette").active_members), 0)
+ # try to delete an user already deleted
+ self.client.post("/raclette/members/1/delete")
+
+ def test_demo(self):
+ # test that a demo project is created if none is defined
+ self.assertEqual([], models.Project.query.all())
+ self.client.get("/demo")
+ self.assertTrue(models.Project.query.get("demo") is not None)
+
+ def test_deactivated_demo(self):
+ self.app.config['ACTIVATE_DEMO_PROJECT'] = False
+
+ # test redirection to the create project form when demo is deactivated
+ resp = self.client.get("/demo")
+ self.assertIn('<a href="/create?project_id=demo">', resp.data.decode('utf-8'))
+
+ def test_authentication(self):
+ # try to authenticate without credentials should redirect
+ # to the authentication page
+ resp = self.client.post("/authenticate")
+ self.assertIn("Authentication", resp.data.decode('utf-8'))
+
+ # raclette that the login / logout process works
+ self.create_project("raclette")
+
+ # try to see the project while not being authenticated should redirect
+ # to the authentication page
+ resp = self.client.get("/raclette", follow_redirects=True)
+ self.assertIn("Authentication", resp.data.decode('utf-8'))
+
+ # try to connect with wrong credentials should not work
+ with self.app.test_client() as c:
+ resp = c.post("/authenticate",
+ data={'id': 'raclette', 'password': 'nope'})
+
+ self.assertIn("Authentication", resp.data.decode('utf-8'))
+ self.assertNotIn('raclette', session)
+
+ # try to connect with the right credentials should work
+ with self.app.test_client() as c:
+ resp = c.post("/authenticate",
+ data={'id': 'raclette', 'password': 'raclette'})
+
+ self.assertNotIn("Authentication", resp.data.decode('utf-8'))
+ self.assertIn('raclette', session)
+ self.assertEqual(session['raclette'], 'raclette')
+
+ # logout should wipe the session out
+ c.get("/exit")
+ self.assertNotIn('raclette', session)
+
+ def test_admin_authentication(self):
+ self.app.config['ADMIN_PASSWORD'] = generate_password_hash("pass")
+
+ # test the redirection to the authentication page when trying to access admin endpoints
+ resp = self.client.get("/create")
+ self.assertIn('<a href="/admin?goto=%2Fcreate">', resp.data.decode('utf-8'))
+
+ # test right password
+ resp = self.client.post("/admin?goto=%2Fcreate", data={'admin_password': 'pass'})
+ self.assertIn('<a href="/create">/create</a>', resp.data.decode('utf-8'))
+
+ # test wrong password
+ resp = self.client.post("/admin?goto=%2Fcreate", data={'admin_password': 'wrong'})
+ self.assertNotIn('<a href="/create">/create</a>', resp.data.decode('utf-8'))
+
+ # test empty password
+ resp = self.client.post("/admin?goto=%2Fcreate", data={'admin_password': ''})
+ self.assertNotIn('<a href="/create">/create</a>', resp.data.decode('utf-8'))
+
+ def test_manage_bills(self):
+ self.post_project("raclette")
+
+ # add two persons
+ self.client.post("/raclette/members/add", data={'name': 'alexis'})
+ self.client.post("/raclette/members/add", data={'name': 'fred'})
+
+ members_ids = [m.id for m in
+ models.Project.query.get("raclette").members]
+
+ # create a bill
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'fromage à raclette',
+ 'payer': members_ids[0],
+ 'payed_for': members_ids,
+ 'amount': '25',
+ })
+ models.Project.query.get("raclette")
+ bill = models.Bill.query.one()
+ self.assertEqual(bill.amount, 25)
+
+ # edit the bill
+ self.client.post("/raclette/edit/%s" % bill.id, data={
+ 'date': '2011-08-10',
+ 'what': 'fromage à raclette',
+ 'payer': members_ids[0],
+ 'payed_for': members_ids,
+ 'amount': '10',
+ })
+
+ bill = models.Bill.query.one()
+ self.assertEqual(bill.amount, 10, "bill edition")
+
+ # delete the bill
+ self.client.get("/raclette/delete/%s" % bill.id)
+ self.assertEqual(0, len(models.Bill.query.all()), "bill deletion")
+
+ # test balance
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'fromage à raclette',
+ 'payer': members_ids[0],
+ 'payed_for': members_ids,
+ 'amount': '19',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'fromage à raclette',
+ 'payer': members_ids[1],
+ 'payed_for': members_ids[0],
+ 'amount': '20',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'fromage à raclette',
+ 'payer': members_ids[1],
+ 'payed_for': members_ids,
+ 'amount': '17',
+ })
+
+ balance = models.Project.query.get("raclette").balance
+ self.assertEqual(set(balance.values()), set([19.0, -19.0]))
+
+ # Bill with negative amount
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-12',
+ 'what': 'fromage à raclette',
+ 'payer': members_ids[0],
+ 'payed_for': members_ids,
+ 'amount': '-25'
+ })
+ bill = models.Bill.query.filter(models.Bill.date == '2011-08-12')[0]
+ self.assertEqual(bill.amount, -25)
+
+ # add a bill with a comma
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-01',
+ 'what': 'fromage à raclette',
+ 'payer': members_ids[0],
+ 'payed_for': members_ids,
+ 'amount': '25,02',
+ })
+ bill = models.Bill.query.filter(models.Bill.date == '2011-08-01')[0]
+ self.assertEqual(bill.amount, 25.02)
+
+ def test_weighted_balance(self):
+ self.post_project("raclette")
+
+ # add two persons
+ self.client.post("/raclette/members/add", data={'name': 'alexis'})
+ self.client.post("/raclette/members/add", data={'name': 'freddy familly', 'weight': 4})
+
+ members_ids = [m.id for m in
+ models.Project.query.get("raclette").members]
+
+ # test balance
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'fromage à raclette',
+ 'payer': members_ids[0],
+ 'payed_for': members_ids,
+ 'amount': '10',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'pommes de terre',
+ 'payer': members_ids[1],
+ 'payed_for': members_ids,
+ 'amount': '10',
+ })
+
+ balance = models.Project.query.get("raclette").balance
+ self.assertEqual(set(balance.values()), set([6, -6]))
+
+ def test_weighted_members_list(self):
+ self.post_project("raclette")
+
+ # add two persons
+ self.client.post("/raclette/members/add", data={'name': 'alexis'})
+ self.client.post("/raclette/members/add", data={'name': 'tata', 'weight': 1})
+
+ resp = self.client.get("/raclette/")
+ self.assertIn('extra-info', resp.data.decode('utf-8'))
+
+ self.client.post("/raclette/members/add", data={'name': 'freddy familly', 'weight': 4})
+
+ resp = self.client.get("/raclette/")
+ self.assertNotIn('extra-info', resp.data.decode('utf-8'))
+
+ def test_rounding(self):
+ self.post_project("raclette")
+
+ # add members
+ self.client.post("/raclette/members/add", data={'name': 'alexis'})
+ self.client.post("/raclette/members/add", data={'name': 'fred'})
+ self.client.post("/raclette/members/add", data={'name': 'tata'})
+
+ # create bills
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'fromage à raclette',
+ 'payer': 1,
+ 'payed_for': [1, 2, 3],
+ 'amount': '24.36',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'red wine',
+ 'payer': 2,
+ 'payed_for': [1],
+ 'amount': '19.12',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'delicatessen',
+ 'payer': 1,
+ 'payed_for': [1, 2],
+ 'amount': '22',
+ })
+
+ balance = models.Project.query.get("raclette").balance
+ result = {}
+ result[models.Project.query.get("raclette").members[0].id] = 8.12
+ result[models.Project.query.get("raclette").members[1].id] = 0.0
+ result[models.Project.query.get("raclette").members[2].id] = -8.12
+ # Since we're using floating point to store currency, we can have some
+ # rounding issues that prevent test from working.
+ # However, we should obtain the same values as the theorical ones if we
+ # round to 2 decimals, like in the UI.
+ for key, value in six.iteritems(balance):
+ self.assertEqual(round(value, 2), result[key])
+
+ def test_edit_project(self):
+ # A project should be editable
+
+ self.post_project("raclette")
+ new_data = {
+ 'name': 'Super raclette party!',
+ 'contact_email': 'alexis@notmyidea.org',
+ 'password': 'didoudida'
+ }
+
+ resp = self.client.post("/raclette/edit", data=new_data,
+ follow_redirects=True)
+ self.assertEqual(resp.status_code, 200)
+ project = models.Project.query.get("raclette")
+
+ for key, value in new_data.items():
+ self.assertEqual(getattr(project, key), value, key)
+
+ # Editing a project with a wrong email address should fail
+ new_data['contact_email'] = 'wrong_email'
+
+ resp = self.client.post("/raclette/edit", data=new_data,
+ follow_redirects=True)
+ self.assertIn("Invalid email address", resp.data.decode('utf-8'))
+
+ def test_dashboard(self):
+ response = self.client.get("/dashboard")
+ self.assertEqual(response.status_code, 200)
+
+ def test_settle_page(self):
+ self.post_project("raclette")
+ response = self.client.get("/raclette/settle_bills")
+ self.assertEqual(response.status_code, 200)
+
+ def test_settle(self):
+ self.post_project("raclette")
+
+ # add members
+ self.client.post("/raclette/members/add", data={'name': 'alexis'})
+ self.client.post("/raclette/members/add", data={'name': 'fred'})
+ self.client.post("/raclette/members/add", data={'name': 'tata'})
+ # Add a member with a balance=0 :
+ self.client.post("/raclette/members/add", data={'name': 'toto'})
+
+ # create bills
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'fromage à raclette',
+ 'payer': 1,
+ 'payed_for': [1, 2, 3],
+ 'amount': '10.0',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'red wine',
+ 'payer': 2,
+ 'payed_for': [1],
+ 'amount': '20',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2011-08-10',
+ 'what': 'delicatessen',
+ 'payer': 1,
+ 'payed_for': [1, 2],
+ 'amount': '10',
+ })
+ project = models.Project.query.get('raclette')
+ transactions = project.get_transactions_to_settle_bill()
+ members = defaultdict(int)
+ # We should have the same values between transactions and project balances
+ for t in transactions:
+ members[t['ower']] -= t['amount']
+ members[t['receiver']] += t['amount']
+ balance = models.Project.query.get("raclette").balance
+ for m, a in members.items():
+ self.assertEqual(a, balance[m.id])
+ return
+
+ def test_settle_zero(self):
+ self.post_project("raclette")
+
+ # add members
+ self.client.post("/raclette/members/add", data={'name': 'alexis'})
+ self.client.post("/raclette/members/add", data={'name': 'fred'})
+ self.client.post("/raclette/members/add", data={'name': 'tata'})
+
+ # create bills
+ self.client.post("/raclette/add", data={
+ 'date': '2016-12-31',
+ 'what': 'fromage à raclette',
+ 'payer': 1,
+ 'payed_for': [1, 2, 3],
+ 'amount': '10.0',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2016-12-31',
+ 'what': 'red wine',
+ 'payer': 2,
+ 'payed_for': [1, 3],
+ 'amount': '20',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2017-01-01',
+ 'what': 'refund',
+ 'payer': 3,
+ 'payed_for': [2],
+ 'amount': '13.33',
+ })
+ project = models.Project.query.get('raclette')
+ transactions = project.get_transactions_to_settle_bill()
+
+ # There should not be any zero-amount transfer after rounding
+ for t in transactions:
+ rounded_amount = round(t['amount'], 2)
+ self.assertNotEqual(0.0, rounded_amount,
+ msg='%f is equal to zero after rounding' % t['amount'])
+
+ def test_export(self):
+ self.post_project("raclette")
+
+ # add members
+ self.client.post("/raclette/members/add", data={'name': 'alexis', 'weight': 2})
+ self.client.post("/raclette/members/add", data={'name': 'fred'})
+ self.client.post("/raclette/members/add", data={'name': 'tata'})
+ self.client.post("/raclette/members/add", data={'name': 'pépé'})
+
+ # create bills
+ self.client.post("/raclette/add", data={
+ 'date': '2016-12-31',
+ 'what': 'fromage à raclette',
+ 'payer': 1,
+ 'payed_for': [1, 2, 3, 4],
+ 'amount': '10.0',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2016-12-31',
+ 'what': 'red wine',
+ 'payer': 2,
+ 'payed_for': [1, 3],
+ 'amount': '200',
+ })
+
+ self.client.post("/raclette/add", data={
+ 'date': '2017-01-01',
+ 'what': 'refund',
+ 'payer': 3,
+ 'payed_for': [2],
+ 'amount': '13.33',
+ })
+
+ # generate json export of bills
+ resp = self.client.post("/raclette/edit", data={
+ 'export_format': 'json',
+ 'export_type': 'bills'
+ })
+ expected = [{
+ 'date': '2017-01-01',
+ 'what': 'refund',
+ 'amount': 13.33,
+ 'payer_name': 'tata',
+ 'payer_weight': 1.0,
+ 'owers': ['fred']
+ }, {
+ 'date': '2016-12-31',
+ 'what': 'red wine',
+ 'amount': 200.0,
+ 'payer_name': 'fred',
+ 'payer_weight': 1.0,
+ 'owers': ['alexis', 'tata']
+ }, {
+ 'date': '2016-12-31',
+ 'what': 'fromage \xe0 raclette',
+ 'amount': 10.0,
+ 'payer_name': 'alexis',
+ 'payer_weight': 2.0,
+ 'owers': ['alexis', 'fred', 'tata', 'p\xe9p\xe9']
+ }]
+ self.assertEqual(json.loads(resp.data.decode('utf-8')), expected)
+
+ # generate csv export of bills
+ resp = self.client.post("/raclette/edit", data={
+ 'export_format': 'csv',
+ 'export_type': 'bills'
+ })
+ expected = [
+ "date,what,amount,payer_name,payer_weight,owers",
+ "2017-01-01,refund,13.33,tata,1.0,fred",
+ "2016-12-31,red wine,200.0,fred,1.0,\"alexis, tata\"",
+ "2016-12-31,fromage à raclette,10.0,alexis,2.0,\"alexis, fred, tata, pépé\""]
+ received_lines = resp.data.decode('utf-8').split("\n")
+
+ for i, line in enumerate(expected):
+ self.assertEqual(
+ set(line.split(",")),
+ set(received_lines[i].strip("\r").split(","))
+ )
+
+ # generate json export of transactions
+ resp = self.client.post("/raclette/edit", data={
+ 'export_format': 'json',
+ 'export_type': 'transactions'
+ })
+ expected = [{"amount": 127.33, "receiver": "fred", "ower": "alexis"},
+ {"amount": 55.34, "receiver": "fred", "ower": "tata"},
+ {"amount": 2.00, "receiver": "fred", "ower": "p\xe9p\xe9"}]
+ self.assertEqual(json.loads(resp.data.decode('utf-8')), expected)
+
+ # generate csv export of transactions
+ resp = self.client.post("/raclette/edit", data={
+ 'export_format': 'csv',
+ 'export_type': 'transactions'
+ })
+
+ expected = ["amount,receiver,ower",
+ "127.33,fred,alexis",
+ "55.34,fred,tata",
+ "2.0,fred,pépé"]
+ received_lines = resp.data.decode('utf-8').split("\n")
+
+ for i, line in enumerate(expected):
+ self.assertEqual(
+ set(line.split(",")),
+ set(received_lines[i].strip("\r").split(","))
+ )
+
+ # wrong export_format should return a 200 and export form
+ resp = self.client.post("/raclette/edit", data={
+ 'export_format': 'wrong_export_format',
+ 'export_type': 'transactions'
+ })
+
+ self.assertEqual(resp.status_code, 200)
+ self.assertIn('id="export_format" name="export_format"', resp.data.decode('utf-8'))
+
+ # wrong export_type should return a 200 and export form
+ resp = self.client.post("/raclette/edit", data={
+ 'export_format': 'json',
+ 'export_type': 'wrong_export_type'
+ })
+
+ self.assertEqual(resp.status_code, 200)
+ self.assertIn('id="export_format" name="export_format"', resp.data.decode('utf-8'))
+
+
+class APITestCase(IhatemoneyTestCase):
+
+ """Tests the API"""
+
+ def api_create(self, name, id=None, password=None, contact=None):
+ id = id or name
+ password = password or name
+ contact = contact or "%s@notmyidea.org" % name
+
+ return self.client.post("/api/projects", data={
+ 'name': name,
+ 'id': id,
+ 'password': password,
+ 'contact_email': contact
+ })
+
+ def api_add_member(self, project, name, weight=1):
+ self.client.post("/api/projects/%s/members" % project,
+ data={"name": name, "weight": weight},
+ headers=self.get_auth(project))
+
+ def get_auth(self, username, password=None):
+ password = password or username
+ base64string = utils.base64_encode(
+ ('%s:%s' % (username, password)).encode('utf-8')).decode('utf-8').replace('\n', '')
+ return {"Authorization": "Basic %s" % base64string}
+
+ def assertStatus(self, expected, resp, url=""):
+
+ return self.assertEqual(expected, resp.status_code,
+ "%s expected %s, got %s" % (url, expected, resp.status_code))
+
+ def test_basic_auth(self):
+ # create a project
+ resp = self.api_create("raclette")
+ self.assertStatus(201, resp)
+
+ # try to do something on it being unauth should return a 401
+ resp = self.client.get("/api/projects/raclette")
+ self.assertStatus(401, resp)
+
+ # PUT / POST / DELETE / GET on the different resources
+ # should also return a 401
+ for verb in ('post',):
+ for resource in ("/raclette/members", "/raclette/bills"):
+ url = "/api/projects" + resource
+ self.assertStatus(401, getattr(self.client, verb)(url),
+ verb + resource)
+
+ for verb in ('get', 'delete', 'put'):
+ for resource in ("/raclette", "/raclette/members/1",
+ "/raclette/bills/1"):
+ url = "/api/projects" + resource
+
+ self.assertStatus(401, getattr(self.client, verb)(url),
+ verb + resource)
+
+ def test_project(self):
+ # wrong email should return an error
+ resp = self.client.post("/api/projects", data={
+ 'name': "raclette",
+ 'id': "raclette",
+ 'password': "raclette",
+ 'contact_email': "not-an-email"
+ })
+
+ self.assertTrue(400, resp.status_code)
+ self.assertEqual('{"contact_email": ["Invalid email address."]}',
+ resp.data.decode('utf-8'))
+
+ # create it
+ resp = self.api_create("raclette")
+ self.assertTrue(201, resp.status_code)
+
+ # create it twice should return a 400
+ resp = self.api_create("raclette")
+
+ self.assertTrue(400, resp.status_code)
+ self.assertIn('id', json.loads(resp.data.decode('utf-8')))
+
+ # get information about it
+ resp = self.client.get("/api/projects/raclette",
+ headers=self.get_auth("raclette"))
+
+ self.assertTrue(200, resp.status_code)
+ expected = {
+ "active_members": [],
+ "name": "raclette",
+ "contact_email": "raclette@notmyidea.org",
+ "members": [],
+ "password": "raclette",
+ "id": "raclette",
+ "balance": {},
+ }
+ self.assertDictEqual(json.loads(resp.data.decode('utf-8')), expected)
+
+ # edit should work
+ resp = self.client.put("/api/projects/raclette", data={
+ "contact_email": "yeah@notmyidea.org",
+ "password": "raclette",
+ "name": "The raclette party",
+ }, headers=self.get_auth("raclette"))
+
+ self.assertEqual(200, resp.status_code)
+
+ resp = self.client.get("/api/projects/raclette",
+ headers=self.get_auth("raclette"))
+
+ self.assertEqual(200, resp.status_code)
+ expected = {
+ "active_members": [],
+ "name": "The raclette party",
+ "contact_email": "yeah@notmyidea.org",
+ "members": [],
+ "password": "raclette",
+ "id": "raclette",
+ "balance": {},
+ }
+ self.assertDictEqual(json.loads(resp.data.decode('utf-8')), expected)
+
+ # delete should work
+ resp = self.client.delete("/api/projects/raclette",
+ headers=self.get_auth("raclette"))
+
+ self.assertEqual(200, resp.status_code)
+
+ # get should return a 401 on an unknown resource
+ resp = self.client.get("/api/projects/raclette",
+ headers=self.get_auth("raclette"))
+ self.assertEqual(401, resp.status_code)
+
+ def test_member(self):
+ # create a project
+ self.api_create("raclette")
+
+ # get the list of members (should be empty)
+ req = self.client.get("/api/projects/raclette/members",
+ headers=self.get_auth("raclette"))
+
+ self.assertStatus(200, req)
+ self.assertEqual('[]', req.data.decode('utf-8'))
+
+ # add a member
+ req = self.client.post("/api/projects/raclette/members", data={
+ "name": "Alexis"
+ }, headers=self.get_auth("raclette"))
+
+ # the id of the new member should be returned
+ self.assertStatus(201, req)
+ self.assertEqual("1", req.data.decode('utf-8'))
+
+ # the list of members should contain one member
+ req = self.client.get("/api/projects/raclette/members",
+ headers=self.get_auth("raclette"))
+
+ self.assertStatus(200, req)
+ self.assertEqual(len(json.loads(req.data.decode('utf-8'))), 1)
+
+ # edit this member
+ req = self.client.put("/api/projects/raclette/members/1", data={
+ "name": "Fred"
+ }, headers=self.get_auth("raclette"))
+
+ self.assertStatus(200, req)
+
+ # get should return the new name
+ req = self.client.get("/api/projects/raclette/members/1",
+ headers=self.get_auth("raclette"))
+
+ self.assertStatus(200, req)
+ self.assertEqual("Fred", json.loads(req.data.decode('utf-8'))["name"])
+
+ # delete a member
+
+ req = self.client.delete("/api/projects/raclette/members/1",
+ headers=self.get_auth("raclette"))
+
+ self.assertStatus(200, req)
+
+ # the list of members should be empty
+ # get the list of members (should be empty)
+ req = self.client.get("/api/projects/raclette/members",
+ headers=self.get_auth("raclette"))
+
+ self.assertStatus(200, req)
+ self.assertEqual('[]', req.data.decode('utf-8'))
+
+ def test_bills(self):
+ # create a project
+ self.api_create("raclette")
+
+ # add members
+ self.api_add_member("raclette", "alexis")
+ self.api_add_member("raclette", "fred")
+ self.api_add_member("raclette", "arnaud")
+
+ # get the list of bills (should be empty)
+ req = self.client.get("/api/projects/raclette/bills",
+ headers=self.get_auth("raclette"))
+ self.assertStatus(200, req)
+
+ self.assertEqual("[]", req.data.decode('utf-8'))
+
+ # add a bill
+ req = self.client.post("/api/projects/raclette/bills", data={
+ 'date': '2011-08-10',
+ 'what': 'fromage',
+ 'payer': "1",
+ 'payed_for': ["1", "2"],
+ 'amount': '25',
+ }, headers=self.get_auth("raclette"))
+
+ # should return the id
+ self.assertStatus(201, req)
+ self.assertEqual(req.data.decode('utf-8'), "1")
+
+ # get this bill details
+ req = self.client.get("/api/projects/raclette/bills/1",
+ headers=self.get_auth("raclette"))
+
+ # compare with the added info
+ self.assertStatus(200, req)
+ expected = {
+ "what": "fromage",
+ "payer_id": 1,
+ "owers": [
+ {"activated": True, "id": 1, "name": "alexis", "weight": 1},
+ {"activated": True, "id": 2, "name": "fred", "weight": 1}],
+ "amount": 25.0,
+ "date": "2011-08-10",
+ "id": 1}
+
+ self.assertDictEqual(expected, json.loads(req.data.decode('utf-8')))
+
+ # the list of bills should lenght 1
+ req = self.client.get("/api/projects/raclette/bills",
+ headers=self.get_auth("raclette"))
+ self.assertStatus(200, req)
+ self.assertEqual(1, len(json.loads(req.data.decode('utf-8'))))
+
+ # edit with errors should return an error
+ req = self.client.put("/api/projects/raclette/bills/1", data={
+ 'date': '201111111-08-10', # not a date
+ 'what': 'fromage',
+ 'payer': "1",
+ 'payed_for': ["1", "2"],
+ 'amount': '25',
+ }, headers=self.get_auth("raclette"))
+
+ self.assertStatus(400, req)
+ self.assertEqual('{"date": ["This field is required."]}', req.data.decode('utf-8'))
+
+ # edit a bill
+ req = self.client.put("/api/projects/raclette/bills/1", data={
+ 'date': '2011-09-10',
+ 'what': 'beer',
+ 'payer': "2",
+ 'payed_for': ["1", "2"],
+ 'amount': '25',
+ }, headers=self.get_auth("raclette"))
+
+ # check its fields
+ req = self.client.get("/api/projects/raclette/bills/1",
+ headers=self.get_auth("raclette"))
+
+ expected = {
+ "what": "beer",
+ "payer_id": 2,
+ "owers": [
+ {"activated": True, "id": 1, "name": "alexis", "weight": 1},
+ {"activated": True, "id": 2, "name": "fred", "weight": 1}],
+ "amount": 25.0,
+ "date": "2011-09-10",
+ "id": 1}
+
+ self.assertDictEqual(expected, json.loads(req.data.decode('utf-8')))
+
+ # delete a bill
+ req = self.client.delete("/api/projects/raclette/bills/1",
+ headers=self.get_auth("raclette"))
+ self.assertStatus(200, req)
+
+ # getting it should return a 404
+ req = self.client.get("/api/projects/raclette/bills/1",
+ headers=self.get_auth("raclette"))
+ self.assertStatus(404, req)
+
+ def test_username_xss(self):
+ # create a project
+ # self.api_create("raclette")
+ self.post_project("raclette")
+ self.login("raclette")
+
+ # add members
+ self.api_add_member("raclette", "<script>")
+
+ result = self.client.get('/raclette/')
+ self.assertNotIn("<script>", result.data.decode('utf-8'))
+
+ def test_weighted_bills(self):
+ # create a project
+ self.api_create("raclette")
+
+ # add members
+ self.api_add_member("raclette", "alexis")
+ self.api_add_member("raclette", "freddy familly", 4)
+ self.api_add_member("raclette", "arnaud")
+
+ # add a bill
+ req = self.client.post("/api/projects/raclette/bills", data={
+ 'date': '2011-08-10',
+ 'what': "fromage",
+ 'payer': "1",
+ 'payed_for': ["1", "2"],
+ 'amount': '25',
+ }, headers=self.get_auth("raclette"))
+
+ # get this bill details
+ req = self.client.get("/api/projects/raclette/bills/1",
+ headers=self.get_auth("raclette"))
+
+ # compare with the added info
+ self.assertStatus(200, req)
+ expected = {
+ "what": "fromage",
+ "payer_id": 1,
+ "owers": [
+ {"activated": True, "id": 1, "name": "alexis", "weight": 1},
+ {"activated": True, "id": 2, "name": "freddy familly", "weight": 4}],
+ "amount": 25.0,
+ "date": "2011-08-10",
+ "id": 1}
+ self.assertDictEqual(expected, json.loads(req.data.decode('utf-8')))
+
+ # getting it should return a 404
+ req = self.client.get("/api/projects/raclette",
+ headers=self.get_auth("raclette"))
+
+ expected = {
+ "active_members": [
+ {"activated": True, "id": 1, "name": "alexis", "weight": 1.0},
+ {"activated": True, "id": 2, "name": "freddy familly", "weight": 4.0},
+ {"activated": True, "id": 3, "name": "arnaud", "weight": 1.0}
+ ],
+ "balance": {"1": 20.0, "2": -20.0, "3": 0},
+ "contact_email": "raclette@notmyidea.org",
+ "id": "raclette",
+
+ "members": [
+ {"activated": True, "id": 1, "name": "alexis", "weight": 1.0},
+ {"activated": True, "id": 2, "name": "freddy familly", "weight": 4.0},
+ {"activated": True, "id": 3, "name": "arnaud", "weight": 1.0}
+ ],
+ "name": "raclette",
+ "password": "raclette"}
+
+ self.assertStatus(200, req)
+ self.assertEqual(expected, json.loads(req.data.decode('utf-8')))
+
+
+class ServerTestCase(APITestCase):
+
+ def test_unprefixed(self):
+ self.app.config['APPLICATION_ROOT'] = '/'
+ req = self.client.get("/foo/")
+ self.assertStatus(303, req)
+
+ def test_prefixed(self):
+ self.app.config['APPLICATION_ROOT'] = '/foo'
+ req = self.client.get("/foo/")
+ self.assertStatus(200, req)
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/ihatemoney/translations/fr/LC_MESSAGES/messages.mo b/ihatemoney/translations/fr/LC_MESSAGES/messages.mo
new file mode 100644
index 0000000..210852b
--- /dev/null
+++ b/ihatemoney/translations/fr/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/ihatemoney/translations/fr/LC_MESSAGES/messages.po b/ihatemoney/translations/fr/LC_MESSAGES/messages.po
new file mode 100644
index 0000000..0f3339e
--- /dev/null
+++ b/ihatemoney/translations/fr/LC_MESSAGES/messages.po
@@ -0,0 +1,527 @@
+# French translations for PROJECT.
+# Copyright (C) 2011 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# Alexis Métaireau <alexis@notmyidea.org>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2013-10-13 21:32+0200\n"
+"PO-Revision-Date: 2011-10-14 23:51+0200\n"
+"Last-Translator: Quentin Roy <royque@gmail.com>\n"
+"Language-Team: fr <LL@li.org>\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: forms.py:22
+msgid "Select all"
+msgstr "Tout cocher"
+
+#: forms.py:22
+msgid "Select none"
+msgstr "Tout décocher"
+
+#: forms.py:61
+msgid "Project name"
+msgstr "Nom de projet"
+
+#: forms.py:62 forms.py:86 forms.py:102
+msgid "Private code"
+msgstr "Code d'accès"
+
+#: forms.py:63
+msgid "Email"
+msgstr "Email"
+
+#: forms.py:85 forms.py:101 forms.py:107
+msgid "Project identifier"
+msgstr "Identifiant du projet"
+
+#: forms.py:87
+msgid "Admin password"
+msgstr "Mot de passe administrateur"
+
+#: forms.py:87 templates/send_invites.html:5
+msgid "Create the project"
+msgstr "Créer le projet"
+
+#: forms.py:92
+msgid ""
+"The project identifier is used to log in and for the URL of the project. "
+"We tried to generate an identifier for you but a project with this "
+"identifier already exists. Please create a new identifier that you will "
+"be able to remember."
+msgstr ""
+"L'identifiant du projet est utilisé pour se connecter."
+"Nous avons essayé de générer un identifiant mais "
+"celui ci existe déjà. Merci de créer un nouvel identifiant que vous serez"
+" capable de retenir"
+
+#: forms.py:103
+msgid "Get in"
+msgstr "Entrer"
+
+#: forms.py:108
+msgid "Send me the code by email"
+msgstr "Envoyez moi le code par email"
+
+#: forms.py:112
+msgid "This project does not exists"
+msgstr "Ce projet n'existe pas"
+
+#: forms.py:116
+msgid "Date"
+msgstr "Date"
+
+#: forms.py:117
+msgid "What?"
+msgstr "Quoi ?"
+
+#: forms.py:118
+msgid "Payer"
+msgstr "Payeur"
+
+#: forms.py:119
+msgid "Amount paid"
+msgstr "Montant"
+
+#: forms.py:120 templates/list_bills.html:103
+msgid "For whom?"
+msgstr "Pour qui ?"
+
+#: forms.py:122
+msgid "Submit"
+msgstr "Valider"
+
+#: forms.py:123
+msgid "Submit and add a new one"
+msgstr "Valider et ajouter une autre facture"
+
+#: forms.py:149
+msgid "Bills can't be null"
+msgstr "Le montant d'une facture ne peut pas être nul."
+
+#: forms.py:154
+msgid "Name"
+msgstr "Nom"
+
+#: forms.py:155
+msgid "Weight"
+msgstr "Parts"
+
+#: forms.py:155 templates/forms.html:95
+msgid "Add"
+msgstr "Ajouter"
+
+#: forms.py:163
+msgid "User name incorrect"
+msgstr "Nom d'utilisateur incorrect"
+
+#: forms.py:167
+msgid "This project already have this member"
+msgstr "Ce membre existe déjà pour ce projet"
+
+#: forms.py:178
+msgid "People to notify"
+msgstr "Personnes à prévenir"
+
+#: forms.py:179
+msgid "Send invites"
+msgstr "Envoyer les invitations"
+
+#: forms.py:185
+#, python-format
+msgid "The email %(email)s is not valid"
+msgstr "L'email %(email)s est invalide"
+
+#: forms.py:191
+msgid "Start date"
+msgstr "Date de départ"
+
+#: forms.py:192
+msgid "End date"
+msgstr "Date de fin"
+
+#: forms.py:202
+msgid "What do you want to download ?"
+msgstr "Que voulez-vous télécharger ?"
+
+#: forms.py:205
+msgid "bills"
+msgstr "factures"
+
+#: forms.py:205
+msgid "transactions"
+msgstr "remboursements"
+
+#: forms.py:206
+msgid "Export file format"
+msgstr "Format du fichier d'export"
+
+#: web.py:95
+msgid "This admin password is not the right one"
+msgstr "Le mot de passe administrateur que vous avez entré n'est pas correct"
+
+#: web.py:95
+msgid "This private code is not the right one"
+msgstr "Le code que vous avez entré n'est pas correct"
+
+#: web.py:147
+#, python-format
+msgid "You have just created '%(project)s' to share your expenses"
+msgstr "Vous venez de créer '%(project)s' pour partager vos dépenses"
+
+#: web.py:165
+#, python-format
+msgid "%(msg_compl)sThe project identifier is %(project)s"
+msgstr "L'identifiant de ce projet est '%(project)s'"
+
+#: web.py:185
+msgid "a mail has been sent to you with the password"
+msgstr "Un email vous a été envoyé avec le mot de passe"
+
+#: web.py:211
+msgid "Project successfully deleted"
+msgstr "Projet supprimé"
+
+#: web.py:254
+#, python-format
+msgid "You have been invited to share your expenses for %(project)s"
+msgstr "Vous avez été invité à partager vos dépenses pour %(project)s"
+
+#: web.py:261
+msgid "Your invitations have been sent"
+msgstr "Vos invitations ont bien été envoyées"
+
+#: web.py:290
+#, python-format
+msgid "%(member)s had been added"
+msgstr "%(member)s a bien été ajouté"
+
+#: web.py:303
+#, python-format
+msgid "%(name)s is part of this project again"
+msgstr "%(name)s a rejoint le projet"
+
+#: web.py:312
+#, python-format
+msgid "User '%(name)s' has been deactivated"
+msgstr "Le membre '%(name)s' a été désactivé"
+
+#: web.py:314
+#, python-format
+msgid "User '%(name)s' has been deactivated. It will still appear in the users list until its balance becomes zero."
+msgstr "Le membre '%(name)s' a été désactivé. Il continuera d'apparaître jusqu'à ce que sa balance devienne égale à zéro."
+
+#: web.py:331
+msgid "The bill has been added"
+msgstr "La facture a bien été ajoutée"
+
+#: web.py:351
+msgid "The bill has been deleted"
+msgstr "La facture a été supprimée"
+
+#: web.py:369
+msgid "The bill has been modified"
+msgstr "La facture a été modifiée"
+
+#: templates/add_bill.html:9
+msgid "Back to the list"
+msgstr "Retourner à la liste"
+
+#: templates/authenticate.html:6
+msgid ""
+"The project you are trying to access do not exist, do you want \n"
+"to"
+msgstr "Le projet auquel vous essayez d'acceder n'existe pas. Souhaitez vous"
+
+#: templates/authenticate.html:7
+msgid "create it"
+msgstr "le créer"
+
+#: templates/authenticate.html:7
+msgid "?"
+msgstr " ?"
+
+#: templates/create_project.html:4
+msgid "Create a new project"
+msgstr "Créer un nouveau projet"
+
+#: templates/dashboard.html:5
+msgid "Project"
+msgstr "Projets"
+
+#: templates/dashboard.html:5
+msgid "Number of members"
+msgstr "Nombre de membres"
+
+#: templates/dashboard.html:5
+msgid "Number of bills"
+msgstr "Nombre de factures"
+
+#: templates/dashboard.html:5
+msgid "Newest bill"
+msgstr "Facture la plus récente"
+
+#: templates/dashboard.html:5
+msgid "Oldest bill"
+msgstr "Facture la plus ancienne"
+
+#: templates/edit_project.html:6 templates/list_bills.html:24
+msgid "you sure?"
+msgstr "c'est sûr ?"
+
+#: templates/edit_project.html:11
+msgid "Edit this project"
+msgstr "Éditer ce projet"
+
+#: templates/forms.html:23
+msgid "Can't remember the password?"
+msgstr "Vous ne vous souvenez plus du code d'accès ?"
+
+#: templates/forms.html:26
+msgid "Cancel"
+msgstr "Annuler"
+
+#: templates/forms.html:68
+msgid "Edit the project"
+msgstr "Éditer le projet"
+
+#: templates/list_bills.html:70
+msgid "deactivate"
+msgstr "désactiver"
+
+#: templates/forms.html:69 templates/list_bills.html:70
+#: templates/list_bills.html:114
+msgid "delete"
+msgstr "supprimer"
+
+#: templates/forms.html:77
+msgid "Edit this bill"
+msgstr "Éditer cette facture"
+
+#: templates/forms.html:77 templates/list_bills.html:94
+msgid "Add a bill"
+msgstr "Ajouter une facture"
+
+#: templates/forms.html:95
+msgid "Type user name here"
+msgstr "Nouveau participant"
+
+#: templates/forms.html:100
+msgid "Edit this member"
+msgstr "Éditer ce participant"
+
+#: templates/forms.html:102
+msgid "Send the invitations"
+msgstr "Envoyer les invitations"
+
+#: templates/forms.html:103
+msgid "No, thanks"
+msgstr "Non merci"
+
+#: templates/forms.html:136
+msgid "Download this project's data"
+msgstr "Télécharger les données de ce projet"
+
+#: templates/forms.html:136
+msgid "Download"
+msgstr "Télécharger"
+
+#: templates/home.html:8
+msgid "Manage your shared <br>expenses, easily"
+msgstr "Gérez vos dépenses<br> partagées, facilement"
+
+#: templates/home.html:9
+msgid "Try out the demo"
+msgstr "Essayez la démo"
+
+#: templates/home.html:12
+msgid "You're sharing a house?"
+msgstr "Vous êtes en colocation ?"
+
+#: templates/home.html:12
+msgid "Going on holidays with friends?"
+msgstr "Partez en vacances avec des amis ?"
+
+#: templates/home.html:12
+msgid "Simply sharing money with others?"
+msgstr "Ça vous arrive de partager de l'argent avec d'autres ?"
+
+#: templates/home.html:12
+msgid "We can help!"
+msgstr "On peut vous aider !"
+
+#: templates/home.html:24
+msgid "Log to an existing project"
+msgstr "Se connecter à un projet existant"
+
+#: templates/home.html:28
+msgid "log in"
+msgstr "se connecter"
+
+#: templates/home.html:29
+msgid "can't remember your password?"
+msgstr "vous ne vous souvenez plus du code d'accès ?"
+
+#: templates/home.html:36
+msgid "or create a new one"
+msgstr "ou créez en un nouveau"
+
+#: templates/home.html:40
+msgid "let's get started"
+msgstr "c'est parti !"
+
+#: templates/home.html:51
+msgid ""
+"This access code will be sent to your friends. It is stored as-is by the "
+"server, so don\\'t reuse a personal password!"
+msgstr ""
+"Ce code d\\'accès va être envoyé à vos amis et stocké en clair sur le "
+"serveur.N\\'utilisez pas un mot de passe personnel !"
+
+#: templates/layout.html:5
+msgid "Account manager"
+msgstr "Gestion de comptes"
+
+#: templates/layout.html:45 templates/settle_bills.html:4
+msgid "Bills"
+msgstr "Factures"
+
+#: templates/layout.html:46 templates/settle_bills.html:5
+msgid "Settle"
+msgstr "Remboursements"
+
+#: templates/layout.html:53
+msgid "options"
+msgstr "options"
+
+#: templates/layout.html:55
+msgid "Project settings"
+msgstr "Options du projet"
+
+#: templates/layout.html:59
+msgid "switch to"
+msgstr "aller à"
+
+#: templates/layout.html:62
+msgid "Start a new project"
+msgstr "Nouveau projet"
+
+#: templates/layout.html:64
+msgid "Logout"
+msgstr "Se déconnecter"
+
+#: templates/layout.html:92
+msgid "This is a free software"
+msgstr "Ceci est un logiciel libre"
+
+#: templates/layout.html:92
+msgid "you can contribute and improve it!"
+msgstr "vous pouvez y contribuer et l'améliorer"
+
+#: templates/list_bills.html:74
+msgid "reactivate"
+msgstr "ré-activer"
+
+#: templates/list_bills.html:88
+msgid "The project identifier is"
+msgstr "L'identifiant de ce projet est"
+
+#: templates/list_bills.html:88
+msgid "remember it!"
+msgstr "souvenez vous en !"
+
+#: templates/list_bills.html:89
+msgid "Add a new bill"
+msgstr "Nouvelle facture"
+
+#: templates/list_bills.html:103
+msgid "When?"
+msgstr "Quand ?"
+
+#: templates/list_bills.html:103
+msgid "Who paid?"
+msgstr "Qui a payé ?"
+
+#: templates/list_bills.html:103
+msgid "For what?"
+msgstr "Pour quoi ?"
+
+#: templates/list_bills.html:103 templates/settle_bills.html:31
+msgid "How much?"
+msgstr "Combien ?"
+
+#: templates/list_bills.html:103
+msgid "Actions"
+msgstr "Actions"
+
+#: templates/list_bills.html:111
+msgid "each"
+msgstr "chacun"
+
+#: templates/list_bills.html:113
+msgid "edit"
+msgstr "éditer"
+
+#: templates/list_bills.html:122
+msgid "Nothing to list yet. You probably want to"
+msgstr "Rien à lister pour l'instant. Vous voulez surement"
+
+#: templates/list_bills.html:122
+msgid "add a bill"
+msgstr "ajouter une facture"
+
+#: templates/password_reminder.html:4
+msgid "Password reminder"
+msgstr "Rappel du code d'accès"
+
+#: templates/recent_projects.html:2
+msgid "Your projects"
+msgstr "Vos projets"
+
+#: templates/send_invites.html:6
+msgid "Invite people"
+msgstr "Invitez des gens"
+
+#: templates/send_invites.html:7
+msgid "Use it!"
+msgstr "Utilisez le !"
+
+#: templates/send_invites.html:11
+msgid "Invite people to join this project"
+msgstr "Invitez des personnes à rejoindre ce projet"
+
+#: templates/send_invites.html:12
+msgid ""
+"Specify a (comma separated) list of email adresses you want to notify "
+"about the \n"
+"creation of this budget management project and we will send them an email"
+" for you."
+msgstr ""
+"Entrez les addresses des personnes que vous souhaitez inviter, séparées "
+"par des virgules. On s'occupe de leur envoyer un email."
+
+#: templates/send_invites.html:14
+msgid "If you prefer, you can"
+msgstr "Si vous préférez vous pouvez"
+
+#: templates/send_invites.html:14
+msgid "skip this step"
+msgstr "sauter cette étape"
+
+#: templates/send_invites.html:14
+msgid "and notify them yourself"
+msgstr "et les avertir vous même"
+
+#: templates/settle_bills.html:31
+msgid "Who pays?"
+msgstr "Qui doit payer ?"
+
+#: templates/settle_bills.html:31
+msgid "To whom?"
+msgstr "Pour qui ?"
diff --git a/ihatemoney/utils.py b/ihatemoney/utils.py
new file mode 100644
index 0000000..4e79a37
--- /dev/null
+++ b/ihatemoney/utils.py
@@ -0,0 +1,133 @@
+import base64
+import re
+
+from io import BytesIO, StringIO
+from jinja2 import filters
+from json import dumps
+from flask import redirect
+from werkzeug.routing import HTTPException, RoutingException
+import six
+
+import csv
+
+
+def slugify(value):
+ """Normalizes string, converts to lowercase, removes non-alpha characters,
+ and converts spaces to hyphens.
+
+ Copy/Pasted from ametaireau/pelican/utils itself took from django sources.
+ """
+ if isinstance(value, six.text_type):
+ import unicodedata
+ value = unicodedata.normalize('NFKD', value)
+ if six.PY2:
+ value = value.encode('ascii', 'ignore')
+ value = six.text_type(re.sub('[^\w\s-]', '', value).strip().lower())
+ return re.sub('[-\s]+', '-', value)
+
+
+class Redirect303(HTTPException, RoutingException):
+
+ """Raise if the map requests a redirect. This is for example the case if
+ `strict_slashes` are activated and an url that requires a trailing slash.
+
+ The attribute `new_url` contains the absolute destination url.
+ """
+ code = 303
+
+ def __init__(self, new_url):
+ RoutingException.__init__(self, new_url)
+ self.new_url = new_url
+
+ def get_response(self, environ):
+ return redirect(self.new_url, 303)
+
+
+class PrefixedWSGI(object):
+
+ '''
+ Wrap the application in this middleware and configure the
+ front-end server to add these headers, to let you quietly bind
+ this to a URL other than / and to an HTTP scheme that is
+ different than what is used locally.
+
+ It relies on "APPLICATION_ROOT" app setting.
+
+ Inspired from http://flask.pocoo.org/snippets/35/
+
+ :param app: the WSGI application
+ '''
+
+ def __init__(self, app):
+ self.app = app
+ self.wsgi_app = app.wsgi_app
+
+ def __call__(self, environ, start_response):
+ script_name = self.app.config['APPLICATION_ROOT']
+ if script_name:
+ environ['SCRIPT_NAME'] = script_name
+ path_info = environ['PATH_INFO']
+ if path_info.startswith(script_name):
+ environ['PATH_INFO'] = path_info[len(script_name):]
+
+ scheme = environ.get('HTTP_X_SCHEME', '')
+ if scheme:
+ environ['wsgi.url_scheme'] = scheme
+ return self.wsgi_app(environ, start_response)
+
+
+def minimal_round(*args, **kw):
+ """ Jinja2 filter: rounds, but display only non-zero decimals
+
+ from http://stackoverflow.com/questions/28458524/
+ """
+ # Use the original round filter, to deal with the extra arguments
+ res = filters.do_round(*args, **kw)
+ # Test if the result is equivalent to an integer and
+ # return depending on it
+ ires = int(res)
+ return (res if res != ires else ires)
+
+
+def list_of_dicts2json(dict_to_convert):
+ """Take a list of dictionnaries and turns it into
+ a json in-memory file
+ """
+ return BytesIO(dumps(dict_to_convert).encode('utf-8'))
+
+
+def list_of_dicts2csv(dict_to_convert):
+ """Take a list of dictionnaries and turns it into
+ a csv in-memory file, assume all dict have the same keys
+ """
+ # CSV writer has a different behavior in PY2 and PY3
+ # http://stackoverflow.com/a/37974772
+ try:
+ if six.PY3:
+ csv_file = StringIO()
+ # using list() for py3.4 compat. Otherwise, writerows() fails
+ # (expecting a sequence getting a view)
+ csv_data = [list(dict_to_convert[0].keys())]
+ for dic in dict_to_convert:
+ csv_data.append([dic[h] for h in dict_to_convert[0].keys()])
+ else:
+ csv_file = BytesIO()
+ csv_data = []
+ csv_data.append([key.encode('utf-8') for key in dict_to_convert[0].keys()])
+ for dic in dict_to_convert:
+ csv_data.append(
+ [dic[h].encode('utf8')
+ if isinstance(dic[h], unicode) else str(dic[h]).encode('utf8') # NOQA
+ for h in dict_to_convert[0].keys()])
+ except (KeyError, IndexError):
+ csv_data = []
+ writer = csv.writer(csv_file)
+ writer.writerows(csv_data)
+ csv_file.seek(0)
+ if six.PY3:
+ csv_file = BytesIO(csv_file.getvalue().encode('utf-8'))
+ return csv_file
+
+
+# base64 encoding that works with both py2 and py3 and yield no warning
+base64_encode = base64.encodestring if six.PY2 else base64.encodebytes
diff --git a/ihatemoney/web.py b/ihatemoney/web.py
new file mode 100644
index 0000000..65c0ed6
--- /dev/null
+++ b/ihatemoney/web.py
@@ -0,0 +1,500 @@
+"""
+The blueprint for the web interface.
+
+Contains all the interaction logic with the end user (except forms which
+are directly handled in the forms module.
+
+Basically, this blueprint takes care of the authentication and provides
+some shortcuts to make your life better when coding (see `pull_project`
+and `add_project_id` for a quick overview)
+"""
+
+from flask import (
+ Blueprint, current_app, flash, g, redirect, render_template, request,
+ session, url_for, send_file
+)
+from flask_mail import Message
+from flask_babel import get_locale, gettext as _
+from werkzeug.security import check_password_hash
+from smtplib import SMTPRecipientsRefused
+import werkzeug
+from sqlalchemy import orm
+from functools import wraps
+
+from ihatemoney.models import db, Project, Person, Bill
+from ihatemoney.forms import (
+ AdminAuthenticationForm, AuthenticationForm, EditProjectForm,
+ InviteForm, MemberForm, PasswordReminder, ProjectForm, get_billform_for,
+ ExportForm
+)
+from ihatemoney.utils import Redirect303, list_of_dicts2json, list_of_dicts2csv
+
+main = Blueprint("main", __name__)
+
+
+def requires_admin(f):
+ """Require admin permissions for @requires_admin decorated endpoints.
+ Has no effect if ADMIN_PASSWORD is empty (default value)
+ """
+ @wraps(f)
+ def admin_auth(*args, **kws):
+ is_admin = session.get('is_admin')
+ if is_admin or not current_app.config['ADMIN_PASSWORD']:
+ return f(*args, **kws)
+ raise Redirect303(url_for('.admin', goto=request.path))
+ return admin_auth
+
+
+@main.url_defaults
+def add_project_id(endpoint, values):
+ """Add the project id to the url calls if it is expected.
+
+ This is to not carry it everywhere in the templates.
+ """
+ if 'project_id' in values or not hasattr(g, 'project'):
+ return
+ if current_app.url_map.is_endpoint_expecting(endpoint, 'project_id'):
+ values['project_id'] = g.project.id
+
+
+@main.url_value_preprocessor
+def pull_project(endpoint, values):
+ """When a request contains a project_id value, transform it directly
+ into a project by checking the credentials are stored in session.
+
+ If not, redirect the user to an authentication form
+ """
+ if endpoint == "authenticate":
+ return
+ if not values:
+ values = {}
+ project_id = values.pop('project_id', None)
+ if project_id:
+ project = Project.query.get(project_id)
+ if not project:
+ raise Redirect303(url_for(".create_project",
+ project_id=project_id))
+ if project.id in session and session[project.id] == project.password:
+ # add project into kwargs and call the original function
+ g.project = project
+ else:
+ # redirect to authentication page
+ raise Redirect303(
+ url_for(".authenticate", project_id=project_id))
+
+
+@main.route("/admin", methods=["GET", "POST"])
+def admin():
+ """Admin authentication"""
+ form = AdminAuthenticationForm()
+ goto = request.args.get('goto', url_for('.home'))
+ if request.method == "POST":
+ if form.validate():
+ if check_password_hash(current_app.config['ADMIN_PASSWORD'], form.admin_password.data):
+ session['is_admin'] = True
+ session.update()
+ return redirect(goto)
+ else:
+ msg = _("This admin password is not the right one")
+ form.errors['admin_password'] = [msg]
+ return render_template("authenticate.html", form=form, admin_auth=True)
+
+
+@main.route("/authenticate", methods=["GET", "POST"])
+def authenticate(project_id=None):
+ """Authentication form"""
+ form = AuthenticationForm()
+ if not form.id.data and request.args.get('project_id'):
+ form.id.data = request.args['project_id']
+ project_id = form.id.data
+ if project_id is None:
+ # User doesn't provide project identifier, return to authenticate form
+ msg = _("You need to enter a project identifier")
+ form.errors["id"] = [msg]
+ return render_template("authenticate.html", form=form)
+ else:
+ project = Project.query.get(project_id)
+
+ create_project = False # We don't want to create the project by default
+ if not project:
+ # But if the user try to connect to an unexisting project, we will
+ # propose him a link to the creation form.
+ if request.method == "POST":
+ form.validate()
+ else:
+ create_project = project_id
+
+ else:
+ # if credentials are already in session, redirect
+ if project_id in session and project.password == session[project_id]:
+ setattr(g, 'project', project)
+ return redirect(url_for(".list_bills"))
+
+ # else process the form
+ if request.method == "POST":
+ if form.validate():
+ if not form.password.data == project.password:
+ msg = _("This private code is not the right one")
+ form.errors['password'] = [msg]
+ else:
+ # maintain a list of visited projects
+ if "projects" not in session:
+ session["projects"] = []
+ # add the project on the top of the list
+ session["projects"].insert(0, (project_id, project.name))
+ session[project_id] = form.password.data
+ session.update()
+ setattr(g, 'project', project)
+ return redirect(url_for(".list_bills"))
+
+ return render_template("authenticate.html", form=form,
+ create_project=create_project)
+
+
+@main.route("/")
+def home():
+ project_form = ProjectForm()
+ auth_form = AuthenticationForm()
+ # If ADMIN_PASSWORD is empty we consider that admin mode is disabled
+ is_admin_mode_enabled = bool(current_app.config['ADMIN_PASSWORD'])
+ is_demo_project_activated = current_app.config['ACTIVATE_DEMO_PROJECT']
+
+ return render_template("home.html", project_form=project_form,
+ is_demo_project_activated=is_demo_project_activated,
+ is_admin_mode_enabled=is_admin_mode_enabled,
+ auth_form=auth_form, session=session)
+
+
+@main.route("/create", methods=["GET", "POST"])
+@requires_admin
+def create_project():
+ form = ProjectForm()
+ if request.method == "GET" and 'project_id' in request.values:
+ form.name.data = request.values['project_id']
+
+ if request.method == "POST":
+ # At first, we don't want the user to bother with the identifier
+ # so it will automatically be missing because not displayed into
+ # the form
+ # Thus we fill it with the same value as the filled name,
+ # the validation will take care of the slug
+ if not form.id.data:
+ form.id.data = form.name.data
+ if form.validate():
+ # save the object in the db
+ project = form.save()
+ db.session.add(project)
+ db.session.commit()
+
+ # create the session object (authenticate)
+ session[project.id] = project.password
+ session.update()
+
+ # send reminder email
+ g.project = project
+
+ message_title = _("You have just created '%(project)s' "
+ "to share your expenses", project=g.project.name)
+
+ message_body = render_template("reminder_mail.%s" %
+ get_locale().language)
+
+ msg = Message(message_title,
+ body=message_body,
+ recipients=[project.contact_email])
+ try:
+ current_app.mail.send(msg)
+ except SMTPRecipientsRefused:
+ msg_compl = 'Problem sending mail. '
+ # TODO: destroy the project and cancel instead?
+ else:
+ msg_compl = ''
+
+ # redirect the user to the next step (invite)
+ flash(_("%(msg_compl)sThe project identifier is %(project)s",
+ msg_compl=msg_compl, project=project.id))
+ return redirect(url_for(".invite", project_id=project.id))
+
+ return render_template("create_project.html", form=form)
+
+
+@main.route("/password-reminder", methods=["GET", "POST"])
+def remind_password():
+ form = PasswordReminder()
+ if request.method == "POST":
+ if form.validate():
+ # get the project
+ project = Project.query.get(form.id.data)
+
+ # send the password reminder
+ password_reminder = "password_reminder.%s" % get_locale().language
+ current_app.mail.send(Message(
+ "password recovery",
+ body=render_template(password_reminder, project=project),
+ recipients=[project.contact_email]))
+ flash(_("a mail has been sent to you with the password"))
+
+ return render_template("password_reminder.html", form=form)
+
+
+@main.route("/<project_id>/edit", methods=["GET", "POST"])
+def edit_project():
+ edit_form = EditProjectForm()
+ export_form = ExportForm()
+ if request.method == "POST":
+ if edit_form.validate():
+ project = edit_form.update(g.project)
+ db.session.commit()
+ session[project.id] = project.password
+
+ return redirect(url_for(".list_bills"))
+
+ if export_form.validate():
+ export_format = export_form.export_format.data
+ export_type = export_form.export_type.data
+
+ if export_type == 'transactions':
+ export = g.project.get_transactions_to_settle_bill(
+ pretty_output=True)
+ if export_type == "bills":
+ export = g.project.get_pretty_bills(
+ export_format=export_format)
+
+ if export_format == "json":
+ file2export = list_of_dicts2json(export)
+ if export_format == "csv":
+ file2export = list_of_dicts2csv(export)
+
+ return send_file(file2export,
+ attachment_filename="%s-%s.%s" %
+ (g.project.id, export_type, export_format),
+ as_attachment=True
+ )
+ else:
+ edit_form.name.data = g.project.name
+ edit_form.password.data = g.project.password
+ edit_form.contact_email.data = g.project.contact_email
+
+ return render_template("edit_project.html", edit_form=edit_form, export_form=export_form)
+
+
+@main.route("/<project_id>/delete")
+def delete_project():
+ g.project.remove_project()
+ flash(_('Project successfully deleted'))
+
+ return redirect(url_for(".home"))
+
+
+@main.route("/exit")
+def exit():
+ # delete the session
+ session.clear()
+ return redirect(url_for(".home"))
+
+
+@main.route("/demo")
+def demo():
+ """
+ Authenticate the user for the demonstration project and redirect him to
+ the bills list for this project.
+
+ Create a demo project if it doesnt exists yet (or has been deleted)
+ If the demo project is deactivated, one is redirected to the create project form
+ """
+ is_demo_project_activated = current_app.config['ACTIVATE_DEMO_PROJECT']
+ project = Project.query.get("demo")
+
+ if not project and not is_demo_project_activated:
+ raise Redirect303(url_for(".create_project",
+ project_id='demo'))
+ if not project and is_demo_project_activated:
+ project = Project(id="demo", name=u"demonstration", password="demo",
+ contact_email="demo@notmyidea.org")
+ db.session.add(project)
+ db.session.commit()
+ session[project.id] = project.password
+ return redirect(url_for(".list_bills", project_id=project.id))
+
+
+@main.route("/<project_id>/invite", methods=["GET", "POST"])
+def invite():
+ """Send invitations for this particular project"""
+
+ form = InviteForm()
+
+ if request.method == "POST":
+ if form.validate():
+ # send the email
+
+ message_body = render_template("invitation_mail.%s" %
+ get_locale().language)
+
+ message_title = _("You have been invited to share your "
+ "expenses for %(project)s", project=g.project.name)
+ msg = Message(message_title,
+ body=message_body,
+ recipients=[email.strip()
+ for email in form.emails.data.split(",")])
+ current_app.mail.send(msg)
+ flash(_("Your invitations have been sent"))
+ return redirect(url_for(".list_bills"))
+
+ return render_template("send_invites.html", form=form)
+
+
+@main.route("/<project_id>/")
+def list_bills():
+ bill_form = get_billform_for(g.project)
+ # set the last selected payer as default choice if exists
+ if 'last_selected_payer' in session:
+ bill_form.payer.data = session['last_selected_payer']
+ # Preload the "owers" relationship for all bills
+ bills = g.project.get_bills().options(orm.subqueryload(Bill.owers))
+
+ return render_template("list_bills.html",
+ bills=bills, member_form=MemberForm(g.project),
+ bill_form=bill_form,
+ add_bill=request.values.get('add_bill', False),
+ current_view="list_bills",
+ )
+
+
+@main.route("/<project_id>/members/add", methods=["GET", "POST"])
+def add_member():
+ # FIXME manage form errors on the list_bills page
+ form = MemberForm(g.project)
+ if request.method == "POST":
+ if form.validate():
+ member = form.save(g.project, Person())
+ db.session.commit()
+ flash(_("%(member)s had been added", member=member.name))
+ return redirect(url_for(".list_bills"))
+
+ return render_template("add_member.html", form=form)
+
+
+@main.route("/<project_id>/members/<member_id>/reactivate", methods=["POST"])
+def reactivate(member_id):
+ person = Person.query.filter(Person.id == member_id)\
+ .filter(Project.id == g.project.id).all()
+ if person:
+ person[0].activated = True
+ db.session.commit()
+ flash(_("%(name)s is part of this project again", name=person[0].name))
+ return redirect(url_for(".list_bills"))
+
+
+@main.route("/<project_id>/members/<member_id>/delete", methods=["POST"])
+def remove_member(member_id):
+ member = g.project.remove_member(member_id)
+ if member:
+ if not member.activated:
+ flash(_("User '%(name)s' has been deactivated. It will still "
+ "appear in the users list until its balance "
+ "becomes zero.", name=member.name))
+ else:
+ flash(_("User '%(name)s' has been removed", name=member.name))
+ return redirect(url_for(".list_bills"))
+
+
+@main.route("/<project_id>/members/<member_id>/edit",
+ methods=["POST", "GET"])
+def edit_member(member_id):
+ member = Person.query.get(member_id, g.project)
+ if not member:
+ raise werkzeug.exceptions.NotFound()
+ form = MemberForm(g.project, edit=True)
+
+ if request.method == 'POST' and form.validate():
+ form.save(g.project, member)
+ db.session.commit()
+ flash(_("User '%(name)s' has been edited", name=member.name))
+ return redirect(url_for(".list_bills"))
+
+ form.fill(member)
+ return render_template("edit_member.html", form=form, edit=True)
+
+
+@main.route("/<project_id>/add", methods=["GET", "POST"])
+def add_bill():
+ form = get_billform_for(g.project)
+ if request.method == 'POST':
+ if form.validate():
+ # save last selected payer in session
+ session['last_selected_payer'] = form.payer.data
+ session.update()
+
+ bill = Bill()
+ db.session.add(form.save(bill, g.project))
+ db.session.commit()
+
+ flash(_("The bill has been added"))
+
+ args = {}
+ if form.submit2.data:
+ args['add_bill'] = True
+
+ return redirect(url_for('.list_bills', **args))
+
+ return render_template("add_bill.html", form=form)
+
+
+@main.route("/<project_id>/delete/<int:bill_id>")
+def delete_bill(bill_id):
+ # fixme: everyone is able to delete a bill
+ bill = Bill.query.get(g.project, bill_id)
+ if not bill:
+ raise werkzeug.exceptions.NotFound()
+
+ db.session.delete(bill)
+ db.session.commit()
+ flash(_("The bill has been deleted"))
+
+ return redirect(url_for('.list_bills'))
+
+
+@main.route("/<project_id>/edit/<int:bill_id>", methods=["GET", "POST"])
+def edit_bill(bill_id):
+ # FIXME: Test this bill belongs to this project !
+ bill = Bill.query.get(g.project, bill_id)
+ if not bill:
+ raise werkzeug.exceptions.NotFound()
+
+ form = get_billform_for(g.project, set_default=False)
+
+ if request.method == 'POST' and form.validate():
+ form.save(bill, g.project)
+ db.session.commit()
+
+ flash(_("The bill has been modified"))
+ return redirect(url_for('.list_bills'))
+
+ if not form.errors:
+ form.fill(bill)
+
+ return render_template("add_bill.html", form=form, edit=True)
+
+
+@main.route("/lang/<lang>")
+def change_lang(lang):
+ session['lang'] = lang
+ session.update()
+
+ return redirect(request.headers.get('Referer') or url_for('.home'))
+
+
+@main.route("/<project_id>/settle_bills")
+def settle_bill():
+ """Compute the sum each one have to pay to each other and display it"""
+ bills = g.project.get_transactions_to_settle_bill()
+ return render_template(
+ "settle_bills.html",
+ bills=bills,
+ current_view='settle_bill',
+ )
+
+
+@main.route("/dashboard")
+def dashboard():
+ return render_template("dashboard.html", projects=Project.query.all())
diff --git a/ihatemoney/wsgi.py b/ihatemoney/wsgi.py
new file mode 100644
index 0000000..d537568
--- /dev/null
+++ b/ihatemoney/wsgi.py
@@ -0,0 +1,3 @@
+from ihatemoney.run import create_app
+
+application = create_app()