From c0b4ca1021b38251efb1c00829ed87f74d336048 Mon Sep 17 00:00:00 2001 From: Ana Custura Date: Tue, 17 Feb 2026 08:42:33 +0000 Subject: [PATCH] Initial commit --- app/__init__.py | 23 ++++ app/commands.py | 49 +++++++ app/forms.py | 32 +++++ app/models.py | 35 +++++ app/routes.py | 140 ++++++++++++++++++++ app/static/butter_styles.css | 21 +++ app/static/images/appstore-icon.svg | 15 +++ app/static/images/chat-icon.png | Bin 0 -> 3524 bytes app/static/images/explore-icon.svg | 5 + app/static/images/maps-icon.png | Bin 0 -> 60637 bytes app/templates/admin.html | 64 +++++++++ app/templates/base.html | 36 +++++ app/templates/bulma_wtf.html | 20 +++ app/templates/index.html | 17 +++ app/templates/login.html | 14 ++ app/translation_refs.py | 6 + app/translations/en/LC_MESSAGES/messages.po | 88 ++++++++++++ app/translations/ro/LC_MESSAGES/messages.po | 87 ++++++++++++ babel.cfg | 2 + butter-portal.py | 1 + config.py | 22 +++ 21 files changed, 677 insertions(+) create mode 100644 app/__init__.py create mode 100644 app/commands.py create mode 100644 app/forms.py create mode 100644 app/models.py create mode 100644 app/routes.py create mode 100644 app/static/butter_styles.css create mode 100644 app/static/images/appstore-icon.svg create mode 100644 app/static/images/chat-icon.png create mode 100644 app/static/images/explore-icon.svg create mode 100644 app/static/images/maps-icon.png create mode 100644 app/templates/admin.html create mode 100644 app/templates/base.html create mode 100644 app/templates/bulma_wtf.html create mode 100644 app/templates/index.html create mode 100644 app/templates/login.html create mode 100644 app/translation_refs.py create mode 100644 app/translations/en/LC_MESSAGES/messages.po create mode 100644 app/translations/ro/LC_MESSAGES/messages.po create mode 100644 babel.cfg create mode 100644 butter-portal.py create mode 100644 config.py diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..65badd7 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,23 @@ +from flask import Flask +from config import Config +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate +from flask_login import LoginManager +from flask import request +from flask_babel import Babel +from flask_babel import lazy_gettext as _l + +def get_locale(): + return request.accept_languages.best_match(app.config['LANGUAGES']) +app = Flask(__name__) +babel = Babel(app, locale_selector=get_locale) +app.config.from_object(Config) +db = SQLAlchemy(app) +migrate = Migrate(app, db) +login = LoginManager(app) +login.login_view = 'login' +login.login_message = _l('Please log in to access this page.') +from app import routes, models + +from app.commands import seed_settings_command +app.cli.add_command(seed_settings_command) \ No newline at end of file diff --git a/app/commands.py b/app/commands.py new file mode 100644 index 0000000..1e02ec2 --- /dev/null +++ b/app/commands.py @@ -0,0 +1,49 @@ +import click +from app import db +from flask import current_app +from app.models import Setting, User + + +def seed_defaults(): + defaults = { + "butterbox_name": current_app.config["BUTTERBOX_NAME"], + "butterbox_logo": current_app.config["BUTTERBOX_LOGO"], + "ssid": current_app.config["BUTTERBOX_SSID"], + "wifi_password": current_app.config["BUTTERBOX_WIFI_PASSWORD"], + "disable_access_point": current_app.config["DISABLE_ACCESS_POINT"], + "apply_changes": "false", + "onboarding_complete": "false", + "lock_root_password": "false", + "disable_file_viewer": current_app.config["DISABLE_FILE_VIEWER"], + "disable_map_viewer": current_app.config["DISABLE_MAP_VIEWER"], + "disable_chat": current_app.config["DISABLE_CHAT"], + "disable_app_store": current_app.config["DISABLE_APP_STORE"], + "ssh_password": "", + "admin_password": current_app.config["ADMIN_PASSWORD"], + } + + for key, value in defaults.items(): + exists = Setting.query.filter_by(key=key).first() + if not exists: + db.session.add(Setting(key=key, value=value)) + click.echo("Created new setting {}".format(key)) + else: + click.echo("Found existing setting {}".format(key)) + db.session.commit() + + admin_user_exists = User.query.filter_by(username='admin').first() + if not admin_user_exists: + u = User(username='admin') + u.set_password('admin') + db.session.add(u) + db.session.commit() + click.echo("Created new admin user") + else: + click.echo("Found existing admin user") + + +@click.command("seed-settings") +def seed_settings_command(): + """Seed default settings into the database (only if missing).""" + seed_defaults() + click.echo("Finished seeding default settings.") diff --git a/app/forms.py b/app/forms.py new file mode 100644 index 0000000..43548bd --- /dev/null +++ b/app/forms.py @@ -0,0 +1,32 @@ +from flask_wtf import FlaskForm +from flask_wtf.file import FileAllowed, FileRequired +from wtforms import StringField, PasswordField, SubmitField, BooleanField, FileField +from wtforms.validators import DataRequired +from flask_babel import lazy_gettext as _l + +class LoginForm(FlaskForm): + username = StringField(_l('Username'), validators=[DataRequired()]) + password = PasswordField(_l('Password'), validators=[DataRequired()]) + submit = SubmitField(_l('Sign In')) + remember_me = BooleanField('Remember Me') + + +class SettingsForm(FlaskForm): + # Access point settings + ssid = StringField('SSID', validators=[DataRequired()]) + wifi_password = PasswordField(_l('WiFi Password')) + disable_access_point = BooleanField(_l('Disable Access Point')) + # Customisation settings + butterbox_name = StringField(_l('Butterbox Name'), validators=[DataRequired()]) + butterbox_logo = FileField((_l('Butterbox Logo')), validators=[FileAllowed(['jpg', 'png', 'svg'], 'Images only!')]) + # Services settings + disable_file_viewer = BooleanField(_l('Disable File Viewer')) + disable_map_viewer = BooleanField(_l('Disable Map Viewer')) + disable_chat = BooleanField(_l('Disable Chat')) + disable_app_store = BooleanField(_l('Disable App Store')) + # Access Settings + admin_password = PasswordField(_l('Admin Password')) + ssh_password = PasswordField(_l('SSH Password')) + + submit = SubmitField(_l('Submit')) + apply_changes = SubmitField(_l('Apply Changes')) diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..c1a4d28 --- /dev/null +++ b/app/models.py @@ -0,0 +1,35 @@ +from typing import Optional +import sqlalchemy as sa +import sqlalchemy.orm as so +from app import db +from werkzeug.security import generate_password_hash, check_password_hash +from flask_login import UserMixin +from app import login + +class User(UserMixin, db.Model): + id: so.Mapped[int] = so.mapped_column(primary_key=True) + username: so.Mapped[str] = so.mapped_column(sa.String(64), index=True, + unique=True) + password_hash: so.Mapped[Optional[str]] = so.mapped_column(sa.String(256)) + + def set_password(self, password: str) -> None: + self.password_hash = generate_password_hash(password) + + def check_password(self, password: str) -> bool: + return check_password_hash(self.password_hash, password) + + def __repr__(self): + return ''.format(self.username) + +class Setting(db.Model): + id: so.Mapped[int] = so.mapped_column(primary_key=True) + key: so.Mapped[str] = so.mapped_column(sa.String(255), index=True, + unique=True, nullable=False) + value: so.Mapped[str] = so.mapped_column(sa.String(255)) + + def __repr__(self): + return ''.format(self.key) + +@login.user_loader +def load_user(user_id: str) -> User: + return db.session.get(User, int(user_id)) \ No newline at end of file diff --git a/app/routes.py b/app/routes.py new file mode 100644 index 0000000..f715551 --- /dev/null +++ b/app/routes.py @@ -0,0 +1,140 @@ +from email.mime import image + +from alembic.util import obfuscate_url_pw + +from app import app +from flask import render_template, flash, redirect, url_for, request, session +from app.forms import LoginForm, SettingsForm +from flask_login import login_user, current_user, logout_user, login_required +import sqlalchemy as sa +from app import db +from app.models import User, Setting +from werkzeug.datastructures import FileStorage +import json +from flask_babel import _ +import base64 + +def get_setting(name) -> str: + setting = db.session.scalar(sa.select(Setting).where(Setting.key == name)) + return str(setting.value) + +def set_setting(name: str, value: str): + setting = db.session.scalar(sa.select(Setting).where(Setting.key == name)) + print(f"I have changed {setting.key}") + setting.value = value + db.session.add(setting) + +def dump_settings(filename: str) -> None: + settings = db.session.execute(sa.select(Setting)).scalars().all() + settings_dict = {s.key: s.value for s in settings} + print(settings_dict) + with open(filename, "w") as f: + json.dump(settings_dict, f, indent=4) +@app.route('/') +@app.route('/index') +def index(): + disable_chat = get_setting("disable_chat") + disable_app_store = get_setting("disable_app_store") + disable_map_viewer = get_setting("disable_map_viewer") + disable_file_viewer = get_setting("disable_file_viewer") + service_array = [] + usb_inserted = False # actual test of whether USB is inserted + usb_has_maps = False # actual test of whether USB has maps folder + usb_has_appstore = False # actual test of whether USB has an appstore + if disable_chat == 'false': + service_array.append({"name": "Message Board", "image": url_for("static", filename="images/chat-icon.png"), "url": app.config["CONVENE_INSTALL_PATH"] }) + if disable_app_store == 'false' and usb_has_appstore: + service_array.append({"name": "Apps", "image": url_for("static", filename="images/appstore-icon.svg")}) + if disable_map_viewer == 'false' and usb_has_maps: + service_array.append({"name": "Offline Maps", "image": url_for("static", filename="images/maps-icon.png")}) + if disable_file_viewer == 'false': + name = "Files" + if not usb_inserted: + name = "Insert USB to browse files" + service_array.append({ + "name": name, + "image": url_for("static", filename="images/explore-icon.svg"), + "url": url_for("usb")}) + return render_template('index.html', title='Home', get_setting=get_setting, services=service_array) + +@app.route('/usb') +def usb(): + return render_template('usb-file-viewer.html', title='File Viewer') + +@app.route('/login', methods=['GET', 'POST']) +def login(): + if current_user.is_authenticated: + return redirect(url_for('admin')) + form = LoginForm() + form.remember_me.data = False + if form.validate_on_submit(): + user = db.session.scalar(sa.select(User).where(User.username == form.username.data)) + if user is None or not user.check_password(form.password.data): + flash(_('Invalid username or password')) + return redirect(url_for('login')) + login_user(user) + return redirect(url_for('admin')) + return render_template('login.html', title='Sign in', form=form, get_setting=get_setting) + + +@app.route('/logout') +def logout(): + logout_user() + return redirect(url_for('index')) +@app.route('/admin', methods=['GET', 'POST']) +@login_required +def admin(): + form = SettingsForm() + populate_settings = ['butterbox_name', 'wifi_password', 'disable_access_point', 'ssid', 'disable_file_viewer', 'disable_map_viewer', 'disable_app_store', 'disable_chat' ] + + bool_settings = ['disable_access_point','disable_file_viewer', 'disable_map_viewer', 'disable_app_store', 'disable_chat'] + + if not form.is_submitted(): + for s in populate_settings: + if s in bool_settings: + getattr(form, s).data = (get_setting(s) == "true") + else: + getattr(form, s).data = get_setting(s) + + if form.validate_on_submit(): + if form.submit.data: + for s in populate_settings: + new_value = getattr(form, s).data + if s in bool_settings: + new_value = str(new_value).lower() # all settings are str fow now + existing_value = get_setting(s) + if new_value != existing_value: + print(f"New value was changed for {s}. Existing value was {existing_value}, new value was {new_value}") + set_setting(s, new_value) + if s in ['butterbox_name', 'wifi_password', 'ssid', 'disable_access_point']: + app.config['SETTINGS_CHANGED'] = True + + new_logo = form.butterbox_logo.data + if new_logo.filename: + logo_stream = form.butterbox_logo.data.stream + b64_logo = base64.b64encode(logo_stream.read()).decode('utf-8') + file_mimetype = form.butterbox_logo.data.mimetype + new_value = f"data:{file_mimetype};base64,{b64_logo}" + existing_value = get_setting('butterbox_logo') + if new_value != existing_value: + print( f"New value was changed for logo") + set_setting('butterbox_logo', new_value) + new_admin_password = form.admin_password.data + if new_admin_password: + existing_admin_password = get_setting('admin_password') + if new_admin_password != existing_admin_password: + print( f"New value was changed for admin password") + set_setting('admin_password', new_admin_password) + print(get_setting('admin_password')) + + if app.config['SETTINGS_CHANGED']: + flash(_("⚠️ Some settings won't take effect until the Butter Box restarts. Click 'Apply Changes' to restart.")) + db.session.commit() + + if form.apply_changes.data: + set_setting('apply_changes', "true") + dump_settings("settings.txt") + flash(_("⚠️ Changes applied! Please wait for the box to restart.")) + + + return render_template('admin.html', get_setting=get_setting, form=form) diff --git a/app/static/butter_styles.css b/app/static/butter_styles.css new file mode 100644 index 0000000..c45feec --- /dev/null +++ b/app/static/butter_styles.css @@ -0,0 +1,21 @@ +.butter-title { + text-align: center; +} + +.butter-service { + border-radius: 20px; +} + +.butter-service__image { + margin: 0 auto; +} + +.butter-service__content { + display: block; +} + +@media (max-width: 960px) { + html { + padding: 10px; + } +} \ No newline at end of file diff --git a/app/static/images/appstore-icon.svg b/app/static/images/appstore-icon.svg new file mode 100644 index 0000000..df8a694 --- /dev/null +++ b/app/static/images/appstore-icon.svg @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/app/static/images/chat-icon.png b/app/static/images/chat-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b14bdd4a7f915fe2b695cbd5516460a68ac6746d GIT binary patch literal 3524 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 y?9aAA3h{q1tpm{viATBs0000 + + + + \ No newline at end of file diff --git a/app/static/images/maps-icon.png b/app/static/images/maps-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b2946418f82c105df04578a6e92e88af32e11e2e GIT binary patch literal 60637 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

NCNBf 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℞u8#ODwnV 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 WIVzAiwEFQ4!b@9SU#$vc9rk|-=i6QY literal 0 HcmV?d00001 diff --git a/app/templates/admin.html b/app/templates/admin.html new file mode 100644 index 0000000..2ed362e --- /dev/null +++ b/app/templates/admin.html @@ -0,0 +1,64 @@ +{% extends "base.html" %} + +{% block content %} +

{{ _('Application Settings') }}

+{% import "bulma_wtf.html" as wtf %} +
+ {{ form.hidden_tag() }} + {% if config['SETTINGS_CHANGED'] %} +

{{ form.apply_changes(class="button is-warning") }}

+ {% endif %} +
+ {{ wtf.form_input_field(form.ssid) }} +

This is the name of the advertised Wi-Fi network. Current SSID: {{ get_setting('ssid') }}

+
+
+ {{ wtf.form_input_field(form.wifi_password) }} +

This is the secret key needed to connect to the Wi-Fi network. By default, this is not set and everyone can join. + Current password: {{ get_setting('wifi_password') or 'Not set' }}

+
+
+ {{ wtf.form_input_field(form.butterbox_name) }} +

This is the name shown in the UI, and used to access the box locally by adding .local or .lan in your browser. + Current name: {{ get_setting('butterbox_name') }}, accessed at {{ get_setting('butterbox_name') }}.local.

+
+
+ {{ wtf.form_bool_field(form.disable_access_point) }} +

Whether this box will advertise a WiFi network.

+
+
+ {{ wtf.form_bool_field(form.disable_map_viewer) }} +

Whether map services are enabled.

+
+
+ {{ wtf.form_bool_field(form.disable_chat) }} +

Whether chat services are enabled.

+
+
+ {{ wtf.form_bool_field(form.disable_file_viewer) }} +

Whether files services via USB are enabled.

+
+
+ {{ wtf.form_bool_field(form.disable_app_store) }} +

Whether app store services are enabled.

+
+
+ {{ wtf.form_input_field(form.admin_password) }} +

Password for accessing this interface.

+
+
+ +
{{ form.butterbox_logo(class='label', style="width: 280px") }}
+ {% for error in form.butterbox_logo.errors %} +

{{ error }}

+ {% endfor %} +

This is the logo shown in the UI. Current logo:
+

+
+

{{ form.submit( class="button is-link") }}

+
+ + Logout + + +{% endblock %} \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html new file mode 100644 index 0000000..c869fc7 --- /dev/null +++ b/app/templates/base.html @@ -0,0 +1,36 @@ + + + + + + {% if title %} + {{ title }} + {% else %} + "{{ get_setting('butterbox_name') }}" + {% endif %} + + + + + +
+
+ +

{{ get_setting('butterbox_name') }}

+
+ +
{% block content %}{% endblock %}
+ {% with messages = get_flashed_messages() %} + {% if messages %} +
+
    + {% for message in messages %} +
  • {{ message }}
  • + {% endfor %} +
+
+ {% endif %} + {% endwith %} +
+ + diff --git a/app/templates/bulma_wtf.html b/app/templates/bulma_wtf.html new file mode 100644 index 0000000..42aab63 --- /dev/null +++ b/app/templates/bulma_wtf.html @@ -0,0 +1,20 @@ +{% macro form_input_field(field) %} +
+ {{ field.label(class='label')}} + {{ field(class='input' + (' is-danger' if field.errors else ' is_success'), type="text") }} + {% for error in field.errors %} +

{{ error }}

+ {% endfor %} +
+{% endmacro %} + + +{% macro form_bool_field(field) %} +
+ {{ field.label(class='label')}} + {{ field(class='checkbox', type="checkbox") }} + {% for error in field.errors %} +

{{ error }}

+ {% endfor %} +
+{% endmacro %} \ No newline at end of file diff --git a/app/templates/index.html b/app/templates/index.html new file mode 100644 index 0000000..c258b68 --- /dev/null +++ b/app/templates/index.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} + +{% block content %} +

Hi, welcome to the {{get_setting('butterbox_name')}}.

+

View and download the information you want from this offline box.

+
+ {% for service in services %} + +
{{ service.name }}
+ +
+
+ {% endfor %} + + +
+{% endblock %} \ No newline at end of file diff --git a/app/templates/login.html b/app/templates/login.html new file mode 100644 index 0000000..46b7146 --- /dev/null +++ b/app/templates/login.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block content %} +{% import "bulma_wtf.html" as wtf %} + +

Sign In

+
+ {{ form.hidden_tag() }} +
{{ wtf.form_input_field(form.username) }}
+
{{ wtf.form_input_field(form.password) }}
+ +
{{ form.submit(class="button is-link") }}
+
+{% endblock %} diff --git a/app/translation_refs.py b/app/translation_refs.py new file mode 100644 index 0000000..398006e --- /dev/null +++ b/app/translation_refs.py @@ -0,0 +1,6 @@ +from flask_babel import gettext as _ + +_('ssid_description') +_('butterbox_name_description') +_('wifi_password_description') +_('logo_description') \ No newline at end of file diff --git a/app/translations/en/LC_MESSAGES/messages.po b/app/translations/en/LC_MESSAGES/messages.po new file mode 100644 index 0000000..d1fb43c --- /dev/null +++ b/app/translations/en/LC_MESSAGES/messages.po @@ -0,0 +1,88 @@ +# English translations for PROJECT. +# Copyright (C) 2026 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2026. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2026-02-10 15:23+0000\n" +"PO-Revision-Date: 2026-02-10 15:29+0000\n" +"Last-Translator: FULL NAME \n" +"Language: en\n" +"Language-Team: en \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 2.18.0\n" + +#: app/__init__.py:19 +msgid "Please log in to access this page." +msgstr "Please log in to access this page." + +#: app/forms.py:6 +msgid "Username" +msgstr "Username" + +#: app/forms.py:7 +msgid "Password" +msgstr "Password" + +#: app/forms.py:8 +msgid "Sign In" +msgstr "Sign In" + +#: app/forms.py:14 +msgid "WiFi Password" +msgstr "WiFi Password" + +#: app/forms.py:15 +msgid "Butterbox Name" +msgstr "Butterbox Name" + +#: app/forms.py:16 +msgid "Butterbox Logo" +msgstr "Butterbox Logo" + +#: app/forms.py:18 +msgid "Submit" +msgstr "Submit" + +#: app/routes.py:39 +msgid "Invalid username or password" +msgstr "Invalid username or password" + +#: app/translation_refs.py:3 +msgid "ssid_description" +msgstr "This is the name of the advertised Wi-Fi network." + +#: app/translation_refs.py:4 +msgid "butterbox_name_description" +msgstr "This is the secret key needed to connect to the Wi-Fi network. By default, this is not set and everyone can join." + +#: app/translation_refs.py:5 +msgid "wifi_password_description" +msgstr "This is the name shown in the UI, and used to access the box locally by adding .local or .lan in your browser." + +#: app/translation_refs.py:6 +msgid "logo_description" +msgstr "An image that will be used as the logo." + +#: app/templates/admin.html:4 +msgid "Application Settings" +msgstr "Application Settings" + +#: app/templates/base.html:15 +msgid "Home" +msgstr "Home" + +#: app/templates/base.html:32 +msgid "" +"Admin settings have changed! Restart the butterbox for changes to take " +"effect." +msgstr "" +"Admin settings have changed! Restart the butterbox for changes to take " +"effect." + diff --git a/app/translations/ro/LC_MESSAGES/messages.po b/app/translations/ro/LC_MESSAGES/messages.po new file mode 100644 index 0000000..a4e0abd --- /dev/null +++ b/app/translations/ro/LC_MESSAGES/messages.po @@ -0,0 +1,87 @@ +# Romanian translations for PROJECT. +# Copyright (C) 2026 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2026. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2026-02-10 15:23+0000\n" +"PO-Revision-Date: 2026-02-10 16:28+0000\n" +"Last-Translator: FULL NAME \n" +"Language: ro\n" +"Language-Team: ro \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100" +" < 20)) ? 1 : 2);\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: app/__init__.py:19 +msgid "Please log in to access this page." +msgstr "" + +#: app/forms.py:6 +msgid "Username" +msgstr "" + +#: app/forms.py:7 +msgid "Password" +msgstr "Password" + +#: app/forms.py:8 +msgid "Sign In" +msgstr "Sign In" + +#: app/forms.py:14 +msgid "WiFi Password" +msgstr "WiFi Password" + +#: app/forms.py:15 +msgid "Butterbox Name" +msgstr "Butterbox Name" + +#: app/forms.py:16 +msgid "Butterbox Logo" +msgstr "Butterbox Logo" + +#: app/forms.py:18 +msgid "Submit" +msgstr "Submit" + +#: app/routes.py:39 +msgid "Invalid username or password" +msgstr "" + +#: app/translation_refs.py:3 +msgid "ssid_description" +msgstr "" + +#: app/translation_refs.py:4 +msgid "butterbox_name_description" +msgstr "" + +#: app/translation_refs.py:5 +msgid "wifi_password_description" +msgstr "" + +#: app/translation_refs.py:6 +msgid "logo_description" +msgstr "" + +#: app/templates/admin.html:4 +msgid "Application Settings" +msgstr "" + +#: app/templates/base.html:15 +msgid "Home" +msgstr "" + +#: app/templates/base.html:32 +msgid "" +"Admin settings have changed! Restart the butterbox for changes to take " +"effect." +msgstr "" + diff --git a/babel.cfg b/babel.cfg new file mode 100644 index 0000000..b42c3d5 --- /dev/null +++ b/babel.cfg @@ -0,0 +1,2 @@ +[python: app/**.py] +[jinja2: app/templates/**.html] diff --git a/butter-portal.py b/butter-portal.py new file mode 100644 index 0000000..d099b92 --- /dev/null +++ b/butter-portal.py @@ -0,0 +1 @@ +from app import app diff --git a/config.py b/config.py new file mode 100644 index 0000000..1b77d7e --- /dev/null +++ b/config.py @@ -0,0 +1,22 @@ +import os +basedir = os.path.abspath(os.path.dirname(__file__)) + +class Config: + SECRET_KEY = os.environ.get('SECRET_KEY') or 'msdskdoopancjsduinabemseruulmf781' + SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \ + 'sqlite:///' + os.path.join(basedir, 'app.db') + SETTINGS_CHANGED = False + BUTTERBOX_SSID= "butterbox" + BUTTERBOX_WIFI_PASSWORD= "" + LANGUAGES = ['en', 'ro'] + + BUTTERBOX_NAME = "Butter Box" + BUTTERBOX_LOGO = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjc5IiBoZWlnaHQ9IjIzNiIgdmlld0JveD0iMCAwIDI3OSAyMzYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIG9wYWNpdHk9IjAuOSI+CjxwYXRoIG9wYWNpdHk9IjAuOSIgZD0iTTEzOS4zODggMTk3LjYzNkMxNzIuMjg0IDE5Ny42MzYgMTk4Ljk1MiAxNzAuOTY4IDE5OC45NTIgMTM4LjA3MkMxOTguOTUyIDEwNS4xNzUgMTcyLjI4NCA3OC41MDcgMTM5LjM4OCA3OC41MDdDMTA2LjQ5MSA3OC41MDcgNzkuODIzIDEwNS4xNzUgNzkuODIzIDEzOC4wNzJDNzkuODIzIDE3MC45NjggMTA2LjQ5MSAxOTcuNjM2IDEzOS4zODggMTk3LjYzNloiIGZpbGw9IiNGRUY1QjgiIHN0cm9rZT0iI0ZFRjVCOCIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiLz4KPHBhdGggb3BhY2l0eT0iMC45IiBkPSJNMTM5LjYxMiA0LjAzMjU5VjYwLjM3NTRDMTM0LjgxNyA1Ny40NTM0IDEzMS4xNDYgNDUuOTE1MSAxMzEuMTQ2IDMyLjIwNEMxMzEuMjIxIDE4LjQ5MjkgMTM0LjgxNyA2Ljk1NDYzIDEzOS42MTIgNC4wMzI1OVoiIGZpbGw9IiNGRUY1QjgiIHN0cm9rZT0iI0ZFRjVCOCIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiLz4KPHBhdGggb3BhY2l0eT0iMC45IiBkPSJNNjAuNDE3OCAxMzkuNDJINEM2LjkyMjA0IDE0NC4yMTUgMTguNDYwMyAxNDcuODg3IDMyLjE3MTQgMTQ3Ljg4N0M0NS45NTc0IDE0Ny44ODcgNTcuNDk1NyAxNDQuMjE1IDYwLjQxNzggMTM5LjQyWiIgZmlsbD0iI0ZFRjVCOCIgc3Ryb2tlPSIjRkVGNUI4IiBzdHJva2Utd2lkdGg9IjQiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIvPgo8cGF0aCBvcGFjaXR5PSIwLjkiIGQ9Ik0yNzUgMTM5LjY0NUgyMTguNjU3QzIyMS41NzkgMTM0Ljg1IDIzMy4xMTggMTMxLjE3OSAyNDYuODI5IDEzMS4xNzlDMjYwLjU0IDEzMS4yNTQgMjcyLjA3OCAxMzQuODUgMjc1IDEzOS42NDVaIiBmaWxsPSIjRkVGNUI4IiBzdHJva2U9IiNGRUY1QjgiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIi8+CjxwYXRoIG9wYWNpdHk9IjAuOSIgZD0iTTIzNS4zNjUgNDMuODE3M0wxOTUuNTA2IDgzLjY3NjlDMTk0LjE1NyA3OC4yMDc0IDE5OS43NzYgNjcuNDkzMyAyMDkuNDQyIDU3LjgyODFDMjE5LjI1NyA0OC4wODggMjI5Ljg5NiA0Mi40Njg3IDIzNS4zNjUgNDMuODE3M1oiIGZpbGw9IiNGRUY1QjgiIHN0cm9rZT0iI0ZFRjVCOCIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiLz4KPHBhdGggb3BhY2l0eT0iMC45IiBkPSJNODMuNjQ0MiA4My41MjY5TDQzLjc4NDcgNDMuNjY3NEM0Mi40MzYxIDQ5LjEzNjggNDguMDU1NCA1OS44NTA5IDU3LjcyMDUgNjkuNTE2MUM2Ny40NjA3IDc5LjI1NjIgNzguMTc0OCA4NC44NzU1IDgzLjY0NDIgODMuNTI2OVoiIGZpbGw9IiNGRUY1QjgiIHN0cm9rZT0iI0ZFRjVCOCIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiLz4KPHBhdGggb3BhY2l0eT0iMC45IiBkPSJNMTgyLjkxOCAzNC45MDEyTDE2Ny41NTkgNzIuMTM4NUMxNjUuMTYxIDY4LjkxNjcgMTY1LjkxMSA2MC4zMDA1IDE2OS42NTcgNTEuMjM0N0MxNzMuNDAzIDQyLjE2ODkgMTc4Ljk0NyAzNS41MDA2IDE4Mi45MTggMzQuOTAxMloiIGZpbGw9IiNGRUY1QjgiIHN0cm9rZT0iI0ZFRjVCOCIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiLz4KPHBhdGggb3BhY2l0eT0iMC45IiBkPSJNNzMuMDA1MSAxMTQuMDIxTDM1Ljg0MjggOTguNjYxNkMzNi40NDIyIDEwMi42MzMgNDMuMTEwNCAxMDguMTc3IDUyLjE3NjIgMTExLjkyM0M2MS4yNDIgMTE1LjY2OSA2OS43ODMzIDExNi40MTkgNzMuMDA1MSAxMTQuMDIxWiIgZmlsbD0iI0ZFRjVCOCIgc3Ryb2tlPSIjRkVGNUI4IiBzdHJva2Utd2lkdGg9IjQiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIvPgo8cGF0aCBvcGFjaXR5PSIwLjkiIGQ9Ik0yNDcuNjUzIDE4NC41MjRMMjEwLjQxNiAxNjkuMjRDMjEzLjYzNyAxNjYuODQyIDIyMi4yNTQgMTY3LjU5MiAyMzEuMzE5IDE3MS4zMzhDMjQwLjM4NSAxNzUuMDg0IDI0Ny4wNTMgMTgwLjU1MyAyNDcuNjUzIDE4NC41MjRaIiBmaWxsPSIjRkVGNUI4IiBzdHJva2U9IiNGRUY1QjgiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIi8+CjxwYXRoIG9wYWNpdHk9IjAuOSIgZD0iTTY3LjIzNTkgMTcwLjg4OEwzMC4wNzM2IDE4Ni4zMjNDMzMuMjk1MyAxODguNzIgNDEuODM2NyAxODcuOTcxIDUwLjkwMjUgMTg0LjIyNUM2MC4wNDMyIDE4MC40MDQgNjYuNjM2NSAxNzQuODU5IDY3LjIzNTkgMTcwLjg4OFoiIGZpbGw9IiNGRUY1QjgiIHN0cm9rZT0iI0ZFRjVCOCIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiLz4KPHBhdGggb3BhY2l0eT0iMC45IiBkPSJNMjQ1LjEwNSA5NS4yODk5TDIwNy45NDMgMTEwLjc5OUMyMDguNTQyIDEwNi44MjggMjE1LjEzNiAxMDEuMjg0IDIyNC4yMDIgOTcuNTM3NkMyMzMuMjY3IDkzLjcxNjUgMjQxLjgwOSA5Mi44OTI0IDI0NS4xMDUgOTUuMjg5OVoiIGZpbGw9IiNGRUY1QjgiIHN0cm9rZT0iI0ZFRjVCOCIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiLz4KPHBhdGggb3BhY2l0eT0iMC45IiBkPSJNMTEwLjA5MiA3My4wMzc3TDk0LjY1OCAzNS44NzU0QzkyLjI2MDQgMzkuMDk3MSA5My4wODQ2IDQ3LjcxMzQgOTYuODMwOCA1Ni43NzkyQzEwMC41NzcgNjUuODQ1IDEwNi4xMjEgNzIuNDM4MyAxMTAuMDkyIDczLjAzNzdaIiBmaWxsPSIjRkVGNUI4IiBzdHJva2U9IiNGRUY1QjgiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIi8+CjwvZz4KPHBhdGggZD0iTTIwMy4xMyAxNzguOTM2QzE5OC4xMTkgMTc4LjIyIDE5Mi4zOTMgMTc3Ljc5MSAxOTAuMjQ2IDE3NS41NzJDMTg4LjQ1NyAxNzMuNzExIDE5Mi44OTQgMTY3LjYyNyAxODguNzQzIDE2MS44M0MxODcuODg0IDE2MC42ODUgMTg2LjUyNCAxNTkuNTM5IDE4NC45NSAxNTguNjA5VjEzOS43MTNDMTg0Ljk1IDEzNi4xMzUgMTgzLjE2IDEzMi44NDIgMTgwLjE1NCAxMzAuODM4TDE0NC40MzkgMTA4LjA3OEMxNDAuOTMyIDEwNS43ODcgMTM2LjQyMyAxMDUuNzg3IDEzMi45MTUgMTA4LjA3OEw5Ny4xMjg1IDEzMC45MUM5NC4xMjI0IDEzMi44NDIgOTIuMzMzIDEzNi4yMDYgOTIuMzMzIDEzOS43MTNWMTU4Ljc1MkM5MS4yNTk0IDE1OS4zOTYgOTAuMzI5IDE1OS45NjkgODkuNzU2NCAxNjAuMzk4QzgzLjk1ODkgMTY0LjMzNSA4OC4wMzg2IDE3MS40OTIgODUuODE5OCAxNzUuMjg2QzgzLjAyODQgMTc5Ljg2NiA4MC40NTE3IDE3OC44NjQgNzMuMDA4IDE4MC45NEM2Ni40OTQ4IDE4Mi42NTggNjMuNDE3MSAxOTQuMTgxIDg2LjUzNTUgMTg4LjQ1NUM4OS4xMTIyIDE4Ny44MTEgOTAuNTQzNiAxODcuNTI1IDkzLjQ3ODIgMTg5LjQ1N0MxMDAuNTY0IDE5My45NjYgOTMuMzM1MSAyMDguMjEgOTkuOTkxNCAyMTAuNDI4QzEwOS44NjkgMjEzLjcyMSAxMDIuNDI1IDE4OS40NTcgMTA4LjE1MSAxOTEuMDMyQzExMC44NzEgMTkyLjM5MiAxMTMuMzA0IDE5NC4zOTYgMTE0LjMwNiAxOTcuNjE3QzExNy4xNjkgMjA1LjIwNCAxMTIuNzMyIDIzMy4yNjEgMTIwLjAzMiAyMzQuNDc3QzEyOC40NzggMjM1Ljc2NiAxMjQuMTEyIDIwMy43IDEyOC4wNDggMjAyLjI2OUMxMzAuNDEgMjAxLjQxIDEzMi43MDEgMjA1LjU2MSAxMzguNDk4IDIwNi4yMDZDMTQzLjE1MSAyMDYuNzA3IDE0Ny45NDYgMjAzLjcgMTQ5LjY2NCAyMDIuMjY5QzE1NC41MzEgMTk4LjExOCAxNTcuODk1IDE5Ni41NDMgMTYxLjgzMSAxOTYuMTE0QzE3Mi4zNTMgMTk0Ljg5NyAxNjMuMTkxIDIyMC45NSAxNzIuOTk3IDIxOS44MDVDMTgxLjY1NyAyMTYuOTQyIDE3MS4yMDggMTk1LjA0IDE4Ni44MTEgMTg5LjI0M0MxOTIuODk0IDE4Ny4wOTUgMjA1LjA2MiAxOTAuMDMgMjA5LjI4NSAxODguMzEyQzIxMy4zNjUgMTg2LjUyMyAyMTEuNjQ3IDE3OS43OTUgMjAzLjEzIDE3OC45MzZaIiBmaWxsPSIjRkNFMzYzIi8+CjxwYXRoIGQ9Ik0xMjAuNTMzIDIzNS45MDlDMTIwLjMxOCAyMzUuOTA5IDEyMC4wMzIgMjM1LjkwOSAxMTkuODE3IDIzNS44MzdDMTE0LjE2MyAyMzQuOTA3IDExNC4wOTIgMjI0LjA5OSAxMTQuMDIgMjEyLjY0N0MxMTQuMDIgMjA2Ljc3OCAxMTMuOTQ4IDIwMC42OTQgMTEyLjk0NiAxOTguMDQ2VjE5Ny45NzVDMTEyLjIzMSAxOTUuNjg0IDExMC41MTMgMTkzLjgyMyAxMDcuNzIxIDE5Mi4zMkMxMDcuMTQ5IDE5My4xMDggMTA3LjA3NyAxOTYuODI5IDEwNy4wNzcgMTk5LjEyQzEwNy4wNzcgMjA0LjEzIDEwNy4wMDYgMjA5LjM1NSAxMDQuMjE0IDIxMS4zNTlDMTAyLjk5OCAyMTIuMjE4IDEwMS40MjMgMjEyLjM2MSA5OS41NjIgMjExLjc4OEM5NS4yNjc2IDIxMC4zNTcgOTUuMzM5MiAyMDUuNTYxIDk1LjQ4MjMgMjAwLjk4MUM5NS41NTM5IDE5Ni44MjkgOTUuNjI1NCAxOTIuNTM1IDkyLjc2MjUgMTkwLjY3NEM5MC4yNTc0IDE4OS4wMjggODkuMjU1NCAxODkuMjQzIDg2Ljk2NSAxODkuODg3QzcwLjcxNzcgMTkzLjg5NSA2Ny42NCAxODkuMzg2IDY3LjEzOSAxODcuMjM5QzY2LjM1MTcgMTg0LjE2MSA2OC45OTk5IDE4MC41ODIgNzIuNzkzMyAxNzkuNThDNzQuODY5IDE3OS4wMDggNzYuNTg2OCAxNzguNzIxIDc3Ljk0NjcgMTc4LjQzNUM4MS42Njg1IDE3Ny43MTkgODMuMDI4NCAxNzcuNDMzIDg0Ljc0NjIgMTc0LjY0MUM4NS4zOTA0IDE3My41NjggODUuMzE4OCAxNzEuNzc5IDg1LjI0NzIgMTY5LjkxOEM4NS4xMDQgMTY2LjQ4MiA4NC44ODkzIDE2Mi4xODggODkuMTEyMiAxNTkuMzI1Qzg5LjU0MTYgMTU4Ljk2NyA5MC4xODU4IDE1OC41MzcgOTEuMDQ0NyAxNTguMDM2VjEzOS43ODVDOTEuMDQ0NyAxMzUuNzc3IDkzLjEyMDMgMTMxLjkxMiA5Ni40ODQzIDEyOS43NjVMMTMyLjI3MSAxMDYuOTMyQzEzNi4yMDggMTA0LjM1NiAxNDEuMzYxIDEwNC4zNTYgMTQ1LjM2OSAxMDYuOTMyTDE4MS4wODUgMTI5LjY5M0MxODQuNTIgMTMxLjk4MyAxODYuNTI0IDEzNS43MDUgMTg2LjUyNCAxMzkuNzg1VjE1Ny44OTNDMTg3Ljk1NiAxNTguODI0IDE4OS4xNzMgMTU5Ljk2OSAxOTAuMDMyIDE2MS4wNDJDMTkyLjk2NiAxNjUuMTIyIDE5Mi4xNzkgMTY5LjI3MyAxOTEuNjc4IDE3Mi4wNjVDMTkxLjUzNSAxNzIuOTk1IDE5MS4yNDggMTc0LjM1NSAxOTEuNDYzIDE3NC42NDFDMTkyLjk2NiAxNzYuMjE2IDE5Ny40MDQgMTc2Ljc4OSAyMDEuMzQgMTc3LjI5QzIwMi4wNTYgMTc3LjM2MSAyMDIuNzcyIDE3Ny41MDQgMjAzLjQxNiAxNzcuNTc2QzIwOS43ODYgMTc4LjI5MiAyMTIuNTA2IDE4MS43MjcgMjEyLjkzNSAxODQuNDQ3QzIxMy4yOTMgMTg2LjY2NiAyMTIuMTQ4IDE4OC43NDIgMjEwLjAwMSAxODkuNjcyQzIwNy43MSAxOTAuNjAyIDIwMy45MTcgMTkwLjM4OCAxOTkuNjIyIDE5MC4xMDFDMTk1LjMyOCAxODkuODg3IDE5MC4zODkgMTg5LjYgMTg3LjQ1NSAxOTAuNjAyQzE3OS40MzkgMTkzLjYwOSAxNzkuMDgxIDIwMS4xOTUgMTc4Ljc5NCAyMDguNTY4QzE3OC41MDggMjE0LjI5MyAxNzguMjkzIDIxOS42NjIgMTczLjY0MSAyMjEuMjM2TDE3My4zNTUgMjIxLjMwOEMxNzEuNzggMjIxLjUyMiAxNzAuNDIgMjIxLjE2NSAxNjkuMzQ3IDIyMC4yMzRDMTY2Ljc3IDIxOC4wODcgMTY2LjYyNyAyMTMuMzYzIDE2Ni40MTIgMjA4LjQyNEMxNjYuMjY5IDIwNC4zNDUgMTY2LjA1NCAxOTkuNjkyIDE2NC4zMzYgMTk4LjE4OUMxNjMuOTc5IDE5Ny45MDMgMTYzLjQwNiAxOTcuNTQ1IDE2Mi4xODkgMTk3LjY4OEMxNTguMzk2IDE5OC4xMTggMTU1LjI0NyAxOTkuNjkyIDE1MC44MDkgMjAzLjQ4NkMxNTAuNTIzIDIwMy43MDEgMTQ0Ljc5NyAyMDguNDI0IDEzOC41NyAyMDcuNzhDMTM1LjEzNCAyMDcuNDIyIDEzMi44NDQgMjA1LjkxOSAxMzEuMTI2IDIwNC44NDZDMTMwLjEyNCAyMDQuMjAyIDEyOS4yNjUgMjAzLjcwMSAxMjguODM2IDIwMy43NzJDMTI4LjA0OCAyMDQuODQ2IDEyNy43NjIgMjEwLjcxNSAxMjcuNjE5IDIxNS4wMDlDMTI3LjI2MSAyMjMuNTI3IDEyNi45MDMgMjMyLjMzIDEyMy4zOTYgMjM1LjE5M0MxMjIuMzk0IDIzNS41NTEgMTIxLjQ2NCAyMzUuOTA5IDEyMC41MzMgMjM1LjkwOVpNMTE1LjY2NiAxOTcuMTE2QzExNi44MTEgMjAwLjI2NSAxMTYuODgzIDIwNi4yNzcgMTE2Ljg4MyAyMTIuNjQ3QzExNi44ODMgMjIwLjUyIDExNi45NTQgMjMyLjQ3MyAxMjAuMjQ3IDIzMy4wNDZDMTIwLjY3NiAyMzMuMTE3IDEyMS4wMzQgMjMzLjA0NiAxMjEuMzIxIDIzMi43NkMxMjMuODI2IDIzMC43NTYgMTI0LjE4MyAyMjEuNDUxIDEyNC40NyAyMTQuNjUxQzEyNC44MjggMjA1Ljk5MSAxMjUuMTE0IDIwMS43NjggMTI3LjQ3NiAyMDAuOTA5QzEyOS4yNjUgMjAwLjI2NSAxMzAuNzY4IDIwMS4yNjcgMTMyLjQxNCAyMDIuMjY5QzEzNC4wNjEgMjAzLjI3MSAxMzUuODUgMjA0LjQ4OCAxMzguNTcgMjA0Ljc3NEMxNDIuNzkzIDIwNS4yMDQgMTQ3LjMwMiAyMDIuMzQxIDE0OC42NjIgMjAxLjE5NUMxNTMuNTI5IDE5Ny4wNDQgMTU3LjE3OSAxOTUuMTgzIDE2MS42MTcgMTk0LjY4MkMxNjMuMzM0IDE5NC40NjcgMTY0LjgzOCAxOTQuODk3IDE2NS45ODMgMTk1LjgyN0MxNjguNzAzIDE5OC4xMTggMTY4LjkxNyAyMDIuOTg1IDE2OS4wNiAyMDguMTM4QzE2OS4yMDQgMjEyLjA3NSAxNjkuNDE4IDIxNi41ODQgMTcwLjk5MyAyMTcuOTQ0QzE3MS4yNzkgMjE4LjE1OCAxNzEuNzA5IDIxOC40NDUgMTcyLjYzOSAyMTguMzczQzE3NS4xNDQgMjE3LjQ0MyAxNzUuNDMgMjEzLjkzNiAxNzUuNjQ1IDIwOC4zNTNDMTc2LjAwMyAyMDAuODM4IDE3Ni4zNjEgMTkxLjUzMyAxODYuMjM4IDE4Ny44ODNDMTg5Ljc0NSAxODYuNjY2IDE5NC43NTUgMTg2Ljk1MiAxOTkuNTUxIDE4Ny4yMzlDMjAzLjIwMSAxODcuNDUzIDIwNi45OTUgMTg3LjY2OCAyMDguNjQxIDE4Ny4wMjRDMjA5LjU3MSAxODYuNjY2IDIxMC4wMDEgMTg1Ljg3OSAyMDkuODU4IDE4NC44NzdDMjA5LjU3MSAxODMuMDg3IDIwNy4yODEgMTgwLjg2OCAyMDIuODQzIDE4MC40MzlIMjAyLjc3MkMyMDIuMDU2IDE4MC4zNjcgMjAxLjQxMiAxODAuMjI0IDIwMC42OTYgMTgwLjE1M0MxOTUuODI5IDE3OS41MDkgMTkxLjMyIDE3OC45MzYgMTg5LjEwMSAxNzYuNjQ2QzE4Ny44ODQgMTc1LjM1NyAxODguMjQyIDE3My40OTYgMTg4LjYgMTcxLjU2NEMxODkuMTAxIDE2OC45ODcgMTg5LjY3NCAxNjUuNzY2IDE4Ny40NTUgMTYyLjc2QzE4Ni43MzkgMTYxLjgzIDE4NS41MjIgMTYwLjc1NiAxODQuMDkxIDE1OS45NjlMMTgzLjM3NSAxNTkuNTM5VjEzOS44NTdDMTgzLjM3NSAxMzYuNzc5IDE4MS44MDEgMTMzLjkxNiAxNzkuMjI0IDEzMi4xOThMMTQzLjY1MiAxMDkuMjIzQzE0MC42NDUgMTA3LjIxOSAxMzYuNzA5IDEwNy4yMTkgMTMzLjcwMyAxMDkuMjIzTDk3LjkxNTggMTMyLjA1NUM5NS4zMzkxIDEzMy43MDEgOTMuNzY0NSAxMzYuNjM2IDkzLjc2NDUgMTM5LjY0MlYxNTkuNDY4TDkzLjA0ODggMTU5Ljg5N0M5Mi4xMTgzIDE2MC40NyA5MS4xMTYzIDE2MS4wNDIgOTAuNjE1MiAxNjEuNDcyQzg3LjY4MDcgMTYzLjQ3NiA4Ny44MjM5IDE2Ni40ODIgODcuOTY3IDE2OS42MzFDODguMDM4NiAxNzEuODUgODguMTgxOCAxNzQuMTQgODcuMTA4MSAxNzYuMDAxQzg0Ljc0NjIgMTc5LjkzOCA4Mi4yNDExIDE4MC40MzkgNzguNDQ3NyAxODEuMTU1Qzc3LjAxNjIgMTgxLjQ0MSA3NS40NDE2IDE4MS43MjcgNzMuNTA5MSAxODIuM0M3MS4wNzU2IDE4Mi45NDQgNjkuNTcyNSAxODUuMDkxIDY5LjkzMDQgMTg2LjQ1MUM3MC4zNTk4IDE4OC4wOTcgNzQuMjk2NCAxOTAuMDMgODYuMzIwOCAxODcuMDk1Qzg5LjExMjIgMTg2LjM4IDkxLjA0NDcgMTg2LjA5MyA5NC40MDg3IDE4OC4zMTJDOTguNzAzMSAxOTEuMDMyIDk4LjU2IDE5Ni40IDk4LjQ4ODQgMjAxLjEyNEM5OC40MTY4IDIwNS42MzMgOTguNDg4NCAyMDguNDk2IDEwMC42MzYgMjA5LjIxMkMxMDIuMDY3IDIwOS43MTMgMTAyLjU2OCAyMDkuMzU1IDEwMi43MTEgMjA5LjIxMkMxMDQuMzU3IDIwOC4wNjcgMTA0LjM1NyAyMDIuOTg1IDEwNC4zNTcgMTk5LjMzNUMxMDQuMzU3IDE5NC45NjggMTA0LjQyOSAxOTEuNjA1IDEwNi4yMTggMTkwLjI0NUMxMDYuNzE5IDE4OS44ODcgMTA3LjUwNyAxODkuNTI5IDEwOC43MjMgMTg5LjgxNUwxMDkuMDEgMTg5Ljg4N0MxMTIuNDQ1IDE5MS41MzMgMTE0LjczNiAxOTMuOTY2IDExNS42NjYgMTk3LjExNloiIGZpbGw9IiMwMTAwMDQiLz4KPHBhdGggZD0iTTE1MC4wMjIgMTY2LjEyNEMxNTIuODEzIDE3MC4zNDcgMTQ2LjA4NSAxOTQuMTEgMTM4LjI4NCAxOTQuMTFDMTI4LjY5MyAxOTQuMTEgMTIzLjg5NyAxNjkuODQ2IDEyNi40NzQgMTY2LjEyNEMxMjcuOTA1IDE2NC4wNDkgMTMxLjQxMyAxNjguMzQzIDEzOC42NDEgMTY4LjM0M0MxNDUuMzY5IDE2OC4zNDMgMTQ4LjU5IDE2My45MDUgMTUwLjAyMiAxNjYuMTI0WiIgZmlsbD0iIzAxMDAwNCIvPgo8cGF0aCBkPSJNMTc1LjIxNiAxNTkuNjgzQzE3Ni45MzQgMTYwLjExMiAxNzguMjkzIDE1OC4zMjMgMTc3LjA3NyAxNTcuMTc4QzE3NS4yODcgMTU1LjYwMyAxNzIuMTM4IDE1My4xNjkgMTY2LjU1NSAxNTMuMTY5QzE2MS4xMTYgMTUzLjE2OSAxNTcuNzUyIDE1NS42MDMgMTU1LjY3NiAxNTcuMjQ5QzE1NC4yNDUgMTU4LjM5NCAxNTUuNjc2IDE2MC4zMjcgMTU3LjUzNyAxNTkuODI2QzE2MC4wNDIgMTU5LjE4MiAxNjMuMjYzIDE1Ny42MDcgMTY2LjY5OCAxNTcuNjA3QzE3MC4xMzQgMTU3Ljc1IDE3My4wNjkgMTU5LjE4MiAxNzUuMjE2IDE1OS42ODNaIiBmaWxsPSIjMDEwMDA0Ii8+CjxwYXRoIGQ9Ik0xMTkuMTAyIDE1OS42ODNDMTIwLjgxOSAxNjAuMTEyIDEyMi4xNzkgMTU4LjMyMyAxMjAuOTYzIDE1Ny4xNzhDMTE5LjE3MyAxNTUuNjAzIDExNi4wMjQgMTUzLjE2OSAxMTAuNDQxIDE1My4xNjlDMTA1LjAwMiAxNTMuMTY5IDEwMS42MzggMTU1LjYwMyA5OS41NjIgMTU3LjI0OUM5OC4xMzA1IDE1OC4zOTQgOTkuNTYyIDE2MC4zMjcgMTAxLjQyMyAxNTkuODI2QzEwMy45MjggMTU5LjE4MiAxMDcuMTQ5IDE1Ny42MDcgMTEwLjU4NCAxNTcuNjA3QzExNC4wOTIgMTU3Ljc1IDExNi45NTUgMTU5LjE4MiAxMTkuMTAyIDE1OS42ODNaIiBmaWxsPSIjMDEwMDA0Ii8+CjxwYXRoIGQ9Ik0xMDkuODY5IDE4Mi41ODZDMTE2LjE1NCAxODIuNTg2IDEyMS4yNDkgMTc4LjUxNyAxMjEuMjQ5IDE3My40OTZDMTIxLjI0OSAxNjguNDc2IDExNi4xNTQgMTY0LjQwNiAxMDkuODY5IDE2NC40MDZDMTAzLjU4MyAxNjQuNDA2IDk4LjQ4ODMgMTY4LjQ3NiA5OC40ODgzIDE3My40OTZDOTguNDg4MyAxNzguNTE3IDEwMy41ODMgMTgyLjU4NiAxMDkuODY5IDE4Mi41ODZaIiBmaWxsPSIjRkVGNUI4Ii8+CjxwYXRoIGQ9Ik0xNjYuNjk4IDE4Mi41ODZDMTcyLjk4MyAxODIuNTg2IDE3OC4wNzkgMTc4LjUxNyAxNzguMDc5IDE3My40OTZDMTc4LjA3OSAxNjguNDc2IDE3Mi45ODMgMTY0LjQwNiAxNjYuNjk4IDE2NC40MDZDMTYwLjQxMyAxNjQuNDA2IDE1NS4zMTggMTY4LjQ3NiAxNTUuMzE4IDE3My40OTZDMTU1LjMxOCAxNzguNTE3IDE2MC40MTMgMTgyLjU4NiAxNjYuNjk4IDE4Mi41ODZaIiBmaWxsPSIjRkVGNUI4Ii8+CjxwYXRoIGQ9Ik0xMzMuMjAyIDE1Mi4wOTZMMTA3LjQzNSAxMzYuMjA2QzEwNS45MzIgMTM1LjI3NiAxMDUuOTMyIDEzMy4wNTcgMTA3LjQzNSAxMzIuMTI3TDEzMy4yMDIgMTE2LjIzN0MxMzYuMzUxIDExNC4zMDUgMTQwLjI4OCAxMTQuMzA1IDE0My40MzcgMTE2LjIzN0wxNjkuMjAzIDEzMi4xMjdDMTcwLjcwNiAxMzMuMDU3IDE3MC43MDYgMTM1LjI3NiAxNjkuMjAzIDEzNi4yMDZMMTQzLjQzNyAxNTIuMDk2QzE0MC4yODggMTU0LjAyOCAxMzYuMjc5IDE1NC4wMjggMTMzLjIwMiAxNTIuMDk2WiIgZmlsbD0iI0ZFRjVCOCIvPgo8cGF0aCBkPSJNMTM1LjYzNSAxOTAuMzg4QzEzMi4yNzEgMTg3LjgxMSAxMzMuMjAyIDE3OC41NzggMTM5LjE0MiAxNzcuNTA0QzE0NC4xNTMgMTc2LjU3NCAxNDYuNTE1IDE3OC4yMiAxNDMuMzY1IDE4NC45NDhDMTQwLjIxNiAxOTEuODkxIDEzNy4yMSAxOTEuNTMzIDEzNS42MzUgMTkwLjM4OFoiIGZpbGw9IiNGRUY1QjgiLz4KPC9zdmc+Cg==" + ADMIN_PASSWORD = "admin" + + DISABLE_ACCESS_POINT = "false" + DISABLE_CHAT = "false" + DISABLE_APP_STORE = "false" + DISABLE_MAP_VIEWER = "false" + DISABLE_FILE_VIEWER = "false" + CONVENE_INSTALL_PATH = "/chat" \ No newline at end of file