From b8e4dc2a5d28c2f8d983572f8c8b13d9037dff88 Mon Sep 17 00:00:00 2001 From: Leo VIALLON-GALINIER Date: Sat, 25 Apr 2020 12:08:19 +0200 Subject: [PATCH] Firs commit --- .gitignore | 35 +++ belote.py | 373 +++++++++++++++++++++++++++++++ belote.wsgi | 8 + belote_jeu.py | 148 +++++++++++++ belote_ws.py | 168 ++++++++++++++ db.py | 339 ++++++++++++++++++++++++++++ requirements.txt | 7 + settings.exemple.cfg | 9 + static/belote-script.js | 73 ++++++ static/belote.css | 391 +++++++++++++++++++++++++++++++++ static/cards/0C.png | Bin 0 -> 11663 bytes static/cards/0F.png | Bin 0 -> 10954 bytes static/cards/0P.png | Bin 0 -> 11157 bytes static/cards/0T.png | Bin 0 -> 13392 bytes static/cards/7C.png | Bin 0 -> 8756 bytes static/cards/7F.png | Bin 0 -> 8223 bytes static/cards/7P.png | Bin 0 -> 8764 bytes static/cards/7T.png | Bin 0 -> 10330 bytes static/cards/8C.png | Bin 0 -> 10414 bytes static/cards/8F.png | Bin 0 -> 9843 bytes static/cards/8P.png | Bin 0 -> 10141 bytes static/cards/8T.png | Bin 0 -> 11832 bytes static/cards/9C.png | Bin 0 -> 11156 bytes static/cards/9F.png | Bin 0 -> 10358 bytes static/cards/9P.png | Bin 0 -> 10699 bytes static/cards/9T.png | Bin 0 -> 12708 bytes static/cards/AC.png | Bin 0 -> 3950 bytes static/cards/AF.png | Bin 0 -> 3767 bytes static/cards/AP.png | Bin 0 -> 3838 bytes static/cards/AT.png | Bin 0 -> 4217 bytes static/cards/C.png | Bin 0 -> 5291 bytes static/cards/DC.png | Bin 0 -> 34486 bytes static/cards/DF.png | Bin 0 -> 31156 bytes static/cards/DP.png | Bin 0 -> 32056 bytes static/cards/DT.png | Bin 0 -> 32707 bytes static/cards/F.png | Bin 0 -> 4938 bytes static/cards/P.png | Bin 0 -> 5144 bytes static/cards/RC.png | Bin 0 -> 30513 bytes static/cards/RF.png | Bin 0 -> 31874 bytes static/cards/RP.png | Bin 0 -> 32273 bytes static/cards/RT.png | Bin 0 -> 34410 bytes static/cards/T.png | Bin 0 -> 6333 bytes static/cards/VC.png | Bin 0 -> 29661 bytes static/cards/VF.png | Bin 0 -> 28158 bytes static/cards/VP.png | Bin 0 -> 32349 bytes static/cards/VT.png | Bin 0 -> 32812 bytes static/croix.png | Bin 0 -> 326 bytes static/edit.png | Bin 0 -> 719 bytes static/fleche-bas.gif | Bin 0 -> 76 bytes static/fleche-haut.gif | Bin 0 -> 76 bytes static/game_script.js | 262 ++++++++++++++++++++++ static/logo.gif | Bin 0 -> 849 bytes static/ok.png | Bin 0 -> 506 bytes static/plus.png | Bin 0 -> 1150 bytes templates/admin_game_add.html | 28 +++ templates/admin_games.html | 27 +++ templates/admin_user_del.html | 17 ++ templates/admin_user_edit.html | 40 ++++ templates/admin_users.html | 25 +++ templates/base.html | 52 +++++ templates/belote.html | 44 ++++ templates/game.html | 21 ++ templates/game_add.html | 21 ++ templates/game_del.html | 17 ++ templates/game_join.html | 166 ++++++++++++++ templates/game_start.html | 88 ++++++++ templates/game_zone_jeu.html | 95 ++++++++ templates/games.html | 43 ++++ templates/head.html | 5 + templates/index.html | 12 + templates/login.html | 29 +++ templates/password.html | 27 +++ templates/scripts.html | 1 + 73 files changed, 2571 insertions(+) create mode 100644 .gitignore create mode 100644 belote.py create mode 100644 belote.wsgi create mode 100644 belote_jeu.py create mode 100644 belote_ws.py create mode 100644 db.py create mode 100644 requirements.txt create mode 100644 settings.exemple.cfg create mode 100644 static/belote-script.js create mode 100644 static/belote.css create mode 100644 static/cards/0C.png create mode 100644 static/cards/0F.png create mode 100644 static/cards/0P.png create mode 100644 static/cards/0T.png create mode 100644 static/cards/7C.png create mode 100644 static/cards/7F.png create mode 100644 static/cards/7P.png create mode 100644 static/cards/7T.png create mode 100644 static/cards/8C.png create mode 100644 static/cards/8F.png create mode 100644 static/cards/8P.png create mode 100644 static/cards/8T.png create mode 100644 static/cards/9C.png create mode 100644 static/cards/9F.png create mode 100644 static/cards/9P.png create mode 100644 static/cards/9T.png create mode 100644 static/cards/AC.png create mode 100644 static/cards/AF.png create mode 100644 static/cards/AP.png create mode 100644 static/cards/AT.png create mode 100644 static/cards/C.png create mode 100644 static/cards/DC.png create mode 100644 static/cards/DF.png create mode 100644 static/cards/DP.png create mode 100644 static/cards/DT.png create mode 100644 static/cards/F.png create mode 100644 static/cards/P.png create mode 100644 static/cards/RC.png create mode 100644 static/cards/RF.png create mode 100644 static/cards/RP.png create mode 100644 static/cards/RT.png create mode 100644 static/cards/T.png create mode 100644 static/cards/VC.png create mode 100644 static/cards/VF.png create mode 100644 static/cards/VP.png create mode 100644 static/cards/VT.png create mode 100644 static/croix.png create mode 100644 static/edit.png create mode 100644 static/fleche-bas.gif create mode 100644 static/fleche-haut.gif create mode 100644 static/game_script.js create mode 100644 static/logo.gif create mode 100644 static/ok.png create mode 100644 static/plus.png create mode 100644 templates/admin_game_add.html create mode 100644 templates/admin_games.html create mode 100644 templates/admin_user_del.html create mode 100644 templates/admin_user_edit.html create mode 100644 templates/admin_users.html create mode 100644 templates/base.html create mode 100644 templates/belote.html create mode 100644 templates/game.html create mode 100644 templates/game_add.html create mode 100644 templates/game_del.html create mode 100644 templates/game_join.html create mode 100644 templates/game_start.html create mode 100644 templates/game_zone_jeu.html create mode 100644 templates/games.html create mode 100644 templates/head.html create mode 100644 templates/index.html create mode 100644 templates/login.html create mode 100644 templates/password.html create mode 100644 templates/scripts.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ecb1e52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# Translations +*.mo +*.pot + +# pyenv +.python-version + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +## Editors: +*.bak +*.sav +*.backup +.*.swp +*~ + +# Secret configuration +settings.cfg + +# Personal conf +static/jquery.js +static/socket.io.js +templates/head-perso.html +templates/scripts-perso.html diff --git a/belote.py b/belote.py new file mode 100644 index 0000000..0f9268d --- /dev/null +++ b/belote.py @@ -0,0 +1,373 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import flask +from flask_socketio import SocketIO +import flask_login as fll +import datetime +from db import db, User, Game, Player, levels_users +from belote_jeu import N_TURN, N_PLAYERS +import belote_ws + +login_manager = fll.LoginManager() + +app = flask.Flask(__name__) +app.config.from_pyfile('settings.cfg') + +####################################################################### +# Plugin management # +####################################################################### + +# SocketIO +socketio = SocketIO(app) +login_manager.init_app(app) + +# Database management +db.app = app +db.init_app(app) +db.create_all() +db.session.commit() + +# Insert admin if not exist +if User.query.limit(1).first() is None: + admin = User(login='admin', name='Admin', level=levels_users['Admin']) + admin.set_password('admin') + db.session.add(admin) + db.session.commit() + +for i in range(4): + if User.query.get('leo'+str(i)) is None: + leo = User(login='leo'+str(i), name='Leo '+str(i), level=levels_users['Can manage simple users']) + leo.set_password('leo') + db.session.add(leo) +db.session.commit() + +# Login management +@login_manager.user_loader +def load_user(user_id): + if user_id is None : + return None + return User.query.get(user_id) + +@login_manager.unauthorized_handler +def unauthorized_callback(): + return flask.redirect('/login?next=' + flask.request.path) + + +####################################################################### +# Global variables or fuctions # +####################################################################### +URL_DEFAULT = '/games' +namespaces_join = {} +namespaces = {} + +def create_namespace(gid, join=False): + if(join): + namespace = belote_ws.CustomNamespaceJoin(gid) + namespaces_join[gid] = True + socketio.on_namespace(namespace) + else: + namespace = belote_ws.CustomNamespacePlay(gid) + namespaces[gid] = True + socketio.on_namespace(namespace) + + +@app.route('/') +def home(): + user = fll.current_user + if not hasattr(user, 'level'): + user = None + return flask.render_template("index.html", user=user) +####################################################################### +# Login, logout # +####################################################################### + +@app.route('/login', methods=['GET', 'POST']) +def login(): + if fll.current_user: + flask.redirect(URL_DEFAULT) + if flask.request.method=="POST": + username = flask.request.form['username'] + password = flask.request.form['password'] + user = User.query.get(username) + if user and user.level > levels_users['Inactive'] and user.check_password(password): + fll.login_user(user) + user.last_login = datetime.datetime.utcnow() + next = flask.request.args.get('next') + if next is not None and next[0]=='/': + return flask.redirect(next) + else: + return flask.redirect(URL_DEFAULT) + else: + app.logger.warning('Login fail for user {} from {}'.format(user, flask.request.remote_addr)) + flask.flash('Invalid username/password combination') + return flask.render_template('login.html', user=None) + +@app.route('/logout') +def logout(): + fll.logout_user() + return flask.redirect('/') + +####################################################################### +# Games : list # +####################################################################### + +@app.route('/games') +@fll.login_required +def games(): + games = Game.query.all() + mesjeux = [] + joinable = [] + for g in games: + if g.admin==fll.current_user.login: + mesjeux.append(g) + elif g.can_join(fll.current_user): + joinable.append(g) + cancreategames = fll.current_user.level >= levels_users['Can create games'] + candeletegames = fll.current_user.level >= levels_users['Admin'] + return flask.render_template('games.html', mesjeux=mesjeux, joinable=joinable, user=fll.current_user, \ + cancreategames=cancreategames, candeletegames=candeletegames) + +####################################################################### +# Create, join and play to a game # +####################################################################### + +@app.route('/add_game', methods=['GET', 'POST']) +@fll.login_required +def game_add(): + player = fll.current_user + if fll.current_user.level >= levels_users['Can create games']: + if flask.request.method=="POST": + name = flask.request.form['name'] + if name is None or name == '': + return flask.redirect('/add_game') + game = Game(name=name, admin=player.login) + db.session.add(game) + db.session.commit() + game.join(fll.current_user) + db.session.commit() + return flask.redirect('/game/{}'.format(game.id)) + return flask.render_template('game_add.html', user=fll.current_user) + return flask.redirect(URL_DEFAULT) + +@app.route('/game//join') +@fll.login_required +def game_page_join(roomid): + game = Game.query.get(roomid) + if game: + player = fll.current_user + if game.start: + return flask.redirect('/game/{}'.format(roomid)) + if game.can_join(player): + if game.id not in namespaces_join: + create_namespace(game.id, join=True) + return flask.render_template('game_join.html', game=game, user=player, admin=game.admin) + return flask.redirect(URL_DEFAULT) + +@app.route('/game//start') +@fll.login_required +def game_page_start(roomid): + game = Game.query.get(roomid) + if game: + player = fll.current_user + if game.isadmin(player) and game.fixplayers and not game.start: + return flask.render_template('game_start.html', game=game, user=player) + return flask.redirect('/game/{}'.format(roomid)) + return flask.redirect(URL_DEFAULT) + +@app.route('/game/') +@fll.login_required +def game_page(roomid): + game = Game.query.get(roomid) + if game: + player = fll.current_user + if not game.start: + return flask.redirect('/game/{}/join'.format(roomid)) + if game.authorized(player) : + if game.id not in namespaces: + create_namespace(game.id) + return flask.render_template('game.html', game=game, user=player) + return flask.redirect(URL_DEFAULT) + +@app.route('/game//del') +@fll.login_required +def delgame(roomid): + game = Game.query.get(roomid) + if game is not None and fll.current_user.login == game.admin: + confirm = flask.request.args.get('confirm') + if confirm is not None: + db.session.delete(game) + db.session.commit() + else: + return flask.render_template('game_del.html', game=game, user=fll.current_user) + return flask.redirect(URL_DEFAULT) + +####################################################################### +# Users management # +####################################################################### +@app.route('/admin/users') +@fll.login_required +def admin_users(): + if fll.current_user.level < levels_users['Can manage simple users']: + return flask.redirect(URL_DEFAULT) + users = User.query.all() + return flask.render_template('admin_users.html', user=fll.current_user, users=users) + +@app.route('/admin/users/', methods=['GET', 'POST']) +@fll.login_required +def edituser(user): + new = user=='new' + user = User.query.get(user) + if not new and user is None: + return flask.redirect('/admin/users') + if fll.current_user.level >= levels_users['Admin'] or \ + fll.current_user.level >= levels_users['Can manage simple users'] and \ + fll.current_user.level > user.level: + if flask.request.method=="POST": + username = flask.request.form['username'] + name = flask.request.form['name'] + password = flask.request.form['password'] + level = int(flask.request.form['level']) + if level not in levels_users.values(): + flask.flash('Level unknown') + return flask.render_template("admin_user_edit.html", user=fll.current_user, useredit=user, levels_users=levels_users) + if fll.current_user.level < levels_users['Admin']: + if not level < fll.current_user.level: + flask.flash('Invalid level') + return flask.render_template("admin_user_edit.html", user=fll.current_user, useredit=user, levels_users=levels_users) + if len(password)<2 and new: + flask.flash('Mot de passe trop court') + return flask.render_template("admin_user_edit.html", user=fll.current_user, useredit=user, levels_users=levels_users) + if new and User.query.get(username) is not None: + flask.flash('Login déjà utilisé ! Choisissez un autre !') + return flask.render_template("admin_user_edit.html", user=fll.current_user, useredit=user, levels_users=levels_users) + if new: + usertoadd = User(login=username, name=name, level=level) + usertoadd.set_password(password) + db.session.add(usertoadd) + else: + user.name = name + if len(password)>=2: + user.password = password + user.level = level + db.session.commit() + return flask.redirect('/admin/users') + else: + return flask.render_template("admin_user_edit.html", user=fll.current_user, useredit=user, levels_users=levels_users) + return flask.redirect(URL_DEFAULT) + +@app.route('/admin/users//del') +@fll.login_required +def deluser(user): + user = User.query.get(user) + if user is None: + return flask.redirect('/admin/users') + if fll.current_user.level >= levels_users['Admin'] or \ + fll.current_user.level >= levels_users['Can manage simple users'] and \ + fll.current_user.level > user.level: + confirm = flask.request.args.get('confirm') + if confirm is not None: + delete_game(user=user) + db.session.delete(user) + db.session.commit() + return flask.redirect('/admin/users') + return flask.render_template("admin_user_del.html", user=fll.current_user, useredit=user) + +@app.route('/password', methods=['GET', 'POST']) +@fll.login_required +def change_password(): + if flask.request.method=="POST": + password = flask.request.form['password'] + if len(password) < 5: + flask.flash('Mot de passe trop court !') + else: + fll.current_user.set_password(password) + db.session.commit() + return flask.redirect(URL_DEFAULT) + return flask.render_template("password.html", user=fll.current_user) + +####################################################################### +# Game managament # +####################################################################### +@app.route('/admin/games') +@fll.login_required +def admin_games(): + if fll.current_user.level < levels_users['Can manage games']: + return flask.redirect(URL_DEFAULT) + games = Game.query.all() + return flask.render_template('admin_games.html', user=fll.current_user, games=games) + +@app.route('/admin/games//del') +@fll.login_required +def admin_game_del(roomid): + game = Game.query.get(roomid) + if game is None: + return flask.redirect('/admin/games') + if fll.current_user.level >= levels_users['Can manage games']: + confirm = flask.request.args.get('confirm') + if confirm is not None: + delete_game(game=game) + return flask.redirect('/admin/games') + else: + return flask.render_template('game_del.html', user=fll.current_user, game=game) + return flask.redirect(URL_DEFAULT) + +@app.route('/game//see') +@fll.login_required +def see_game(roomid): + game = Game.query.get(roomid) + if game is None: + return flask.redirect('/games') + if fll.current_user.level >= levels_users['Can manage games'] or game.authorized(fll.current_user) and game.turn==N_TURN*N_PLAYERS: + return game.serialize_state_anonymous() + return flask.redirect(URL_DEFAULT) + +@app.route('/admin/games/new', methods=['GET', 'POST']) +@fll.login_required +def admin_games_new(): + if fll.current_user.level < levels_users['Can manage games']: + return flask.redirect(URL_DEFAULT) + if flask.request.method=="POST": + name = flask.request.form['name'] + admin = flask.request.form['admin'] + admin = User.query.get(admin) + if admin is None: + flask.flash('Login inconnu') + elif len(name)<2: + flask.flash('Nom trop court !') + else: + game = Game(name=name, admin=admin.login) + db.session.add(game) + db.session.commit() + game.join(admin) + db.session.commit() + return flask.redirect('/admin/games') + return flask.render_template('admin_game_add.html', user=fll.current_user) + + + +def delete_game(user=None, game=None): + if user is not None: + games = Game.query.filter_by(admin=user.login).all() + for g in games: + for p in g.players: + db.session.delete(p) + db.session.delete(g) + db.session.commit() + if isinstance(game, int): + g = Game.query.get(game) + if g is not None: + for p in g.players: + db.session.delete(p) + db.session.delete(g) + db.session.commit() + elif game is not None: + for p in game.players: + db.session.delete(p) + db.session.delete(game) + db.session.commit() + + +if __name__ == '__main__': + socketio.run(app, debug=True, host='0.0.0.0') + diff --git a/belote.wsgi b/belote.wsgi new file mode 100644 index 0000000..8ec0d02 --- /dev/null +++ b/belote.wsgi @@ -0,0 +1,8 @@ +import os +import sys +os.chdir(os.path.dirname(__file__)) +sys.path.insert(0,os.path.dirname(__file__)+'/venv/lib/python{}.{}/site-packages'.format(sys.version_info.major, sys.version_info.minor)) +sys.path.insert(0,os.path.dirname(__file__)) + +from belote import app as application + diff --git a/belote_jeu.py b/belote_jeu.py new file mode 100644 index 0000000..455812f --- /dev/null +++ b/belote_jeu.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- + +N_PLAYERS = 4 +N_TURN = int(32/4) + +# P : pique, C : Coeur, F : Carreau, T : Trèfle +# 7..9, 0 puis VDRA +cards =['AP', 'RP', 'DP', 'VP', '0P', '9P', '8P', '7P', + 'AC', 'RC', 'DC', 'VC', '0C', '9C', '8C', '7C', + 'AF', 'RF', 'DF', 'VF', '0F', '9F', '8F', '7F', + 'AT', 'RT', 'DT', 'VT', '0T', '9T', '8T', '7T' + ] + +points_atout = {'V' : 20, '9' : 14, 'A': 11, '0': 10, 'R': 4, 'D': 3, '8':0, '7':0} +points_atout_order = {'V' : 20, '9' : 14, 'A': 11, '0': 10, 'R': 4, 'D': 3, '8':1, '7':0} +points_order = {'A': 11, '0': 10, 'R': 4, 'D': 3, 'V': 2, '9': 1, '8':0.5, '7':0} +points = {'A': 11, '0': 10, 'R': 4, 'D': 3, 'V': 2, '9': 0, '8':0, '7':0} + +translate = {'A': 'As', 'R' : 'Roi', 'D': 'Dame', 'V': 'Valet', '0': '10', 'P': 'Pique', 'C': 'Coeur', 'T':'Trèfle', 'F':'Carreau'} + +colors = ['P', 'C', 'F', 'T'] + +def translator(card): + s = [] + for c in card: + if c in translate: + s.append(translate[c]) + else: + s.append(c) + return ' '.join(s) + +def winner(cards, atout): + """ + Returns id winner (0-3), number of points + """ + if isinstance(cards, str): + cardsl = cards.split(',') + cardss = cards + else: + cardss = ''.join(cards) + cardsl = cards + + if len(cardss)==0: + return 0, 0 + winner = None + if atout in cardss: + for i in range(len(cardsl)): + if cardsl[i][1] == atout: + if winner is None or points_atout_order[cardsl[i][0]] > points_atout_order[cardsl[winner][0]]: + winner = i + if winner is None: + couldemandee = cardss[1] + for i in range(len(cardsl)): + if cardsl[i][1] == couldemandee: + if winner is None or points_order[cardsl[i][0]] > points_order[cardsl[winner][0]]: + winner = i + + pointsr = 0 + for c in cardsl: + if c[1] == atout: + pointsr += points_atout[c[0]] + else: + pointsr += points[c[0]] + + return winner, pointsr + +def legal_play(played, atout, card, main): + if card not in cards: + return False + if card not in main: + return False + + if played is None : + playedl = [] + playeds = '' + elif isinstance(played, str): + playedl = played.split(',') + playeds = played + else: + playeds = ''.join(played) + playedl = played + + if main is None or main=='': + main = [] + if isinstance(main, str): + mains = main + main = main.split(',') + else: + mains = ','.join(main) + + # Le premier a jouer fait ce qu'il veut + if len(playeds)==0: + return True + couldemandee =playeds[1] + + # On regarde les atouts pour plus tard: + maxpose = -1 + for c in playedl: + if c[1]==atout and points_atout_order[c[0]]>maxpose: + maxpose = points_atout_order[c[0]] + + peutmonter = False + has_atout = False + for m in main: #Peut-on monter ? + if m[1] == atout: + has_atout = True + if points_atout_order[m[0]]>maxpose: + peutmonter = True + break + + # Il faut jouer de la couleur demandée + if couldemandee != atout: + if couldemandee in mains: + if card[1]== couldemandee: + return True + else: + return False + if couldemandee == atout: + # Il faut jouer atout (si possible) + if has_atout: + if card[1] != atout: + return False + # Et monter ! (si possible) + if peutmonter: + if points_atout_order[card[0]]<=maxpose: + return False + # Mais si on a pas, tant pis ! + return True + + # Sinon, mon partenaire est-il maitre ? + if len(playedl)>=2: + maitre, xxx = winner(playedl, atout) + if maitre == len(playedl)-2 : + # Si oui, jeu libre + return True + + # Sinon, ai-je de l'atout ? + if has_atout: + if card[1] != atout: + return False + # Si oui, je dois monter si possible + if peutmonter: + if points_atout_order[card[0]] < maxpose: + return False + return True + + # Sinon, jeu libre ! + return True diff --git a/belote_ws.py b/belote_ws.py new file mode 100644 index 0000000..63c3fd8 --- /dev/null +++ b/belote_ws.py @@ -0,0 +1,168 @@ +# -*- coding: utf-8 -*- + +import flask_socketio as fio +from flask_login import current_user +from db import Game, Player, User +from belote_jeu import translator, legal_play, colors, N_PLAYERS, N_TURN + +NAME_ARBITRE = 'Arbitre' +NAME_BONJOUR = 'Portier' + +class CustomNamespacePlay(fio.Namespace): + def __init__(self, id): + self._id = id + self.users = [] + fio.Namespace.__init__(self, '/game/{}'.format(id)) + def on_connect(self): + if current_user is None or not self.game().authorized(current_user): + fio.disconnect() + if current_user.name not in self.users: + if len(self.users)==1: + fio.emit('text', {'text': '{} est là !'.format(self.users[0]), 'username':None, 'name':NAME_BONJOUR}) + elif len(self.users)>1: + fio.emit('text', {'text': '{} est là !'.format(', '.join(self.users)), 'username':None, 'name':NAME_BONJOUR}) + self.users.append(current_user.name) + fio.emit('text', {'text': '{} vient d\'arriver !'.format(current_user.name), 'username':None, 'name':NAME_BONJOUR}, broadcast=True) + pass + + def on_disconnect(self): + if current_user.name in self.users: + self.users.remove(current_user.name) + fio.emit('text', {'text': '{} est parti.'.format(current_user.name), 'username':None, 'name':NAME_BONJOUR}, broadcast=True) + pass + + def on_join(self, data): + pass + + def on_choose_color(self, data): + if 'atout' not in data: + return + atout = data['atout'] + + game = self.game() + if not game.turn<0: + fio.emit('text', {'text': "Choix d'atout indisponible", 'username':None, 'name':NAME_ARBITRE}) + return + # C'est mon tour ? + if game.get_nr(current_user) != (game.turn + game.first_player)%4: + fio.emit('text', {'text': "Ce n'est pas votre tour...", 'username':None, 'name':NAME_ARBITRE}) + return + # Choix légal pour ce tour ? + if atout is not None and game.turn < -4 and game.played[1] != atout: + fio.emit('text', {'text': "Pour l'instant on prend ou pas, mais on ne peut pas choisir l'atout.", 'username':None, 'name':NAME_ARBITRE}) + return + if atout is not None and not atout in colors: + fio.emit('text', {'text': "Couleur d'atout inconnue ({})".format(atout), 'username':None, 'name':NAME_ARBITRE}) + return + # OK ! + print('atout choix') + print(atout) + if(game.tour_choix(atout, current_user)): + print('Emit atout choix') + fio.emit('choose_color', {'turn':game.turn, 'first_player':game.first_player, 'atout':game.atout, 'preneur':game.preneur if game.preneur is not None else current_user.login}, broadcast=True) + else: + fio.emit('text', {'text': "Erreur E0101", 'username':None, 'name':NAME_ARBITRE}) + + def on_play(self, data): + if 'card' not in data: + return + card = data['card'] + + game = self.game() + if game.turn<0: + fio.emit('text', {'text': "Jeu pas encore disponible. Il faut choisir l'atout !", 'username':None, 'name':NAME_ARBITRE}) + return + # C'est mon tour ? + if game.get_nr(current_user) != (game.turn + game.first_player)%4: + fio.emit('text', {'text': "Ce n'est pas votre tour...", 'username':None, 'name':NAME_ARBITRE}) + return + # Choix légal pour ce tour ? + p = game.get_player(current_user) + if legal_play(game.played, game.atout, card, p.cards): + ok, winnr = game.tour_jeu(card, current_user) + if ok: + fio.emit('play', {'turn':game.turn, 'played':game.played.split(',') if game.played is not None and game.played !='' else [], \ + 'last_played':game.last_played.split(',') if game.last_played is not None else [] , 'first_player': game.first_player, 'points':[game.points_0, game.points_1]}, broadcast=True) + else: + fio.emit('text', {'text': "Vous ne pouvez pas jouer cette carte ({})".format(translator(card)), 'username':None, 'name':NAME_ARBITRE}) + return + + def on_text(self, data): + if 'text' in data and len(data['text'])>0: + fio.emit('text', {'text':data['text'], 'username':current_user.login, 'name':current_user.name}, broadcast=True); + + def on_monjeu(self, data): + cards = self.game().get_player(current_user).cards + cards = cards.split(',') if cards is not None and cards != '' else [] + fio.emit('monjeu', {'cards':cards}); + + def on_restart(self, data): + game = self.game() + if game.isadmin(current_user): + if game.turn==N_TURN*N_PLAYERS: + game.restart_jeu() + fio.emit('restart', game.serialize_state_anonymous(), broadcast=True) + else: + fio.emit('text', {'text': "Finissez la partie avant d'en recommencer une.", 'username':None, 'name':NAME_ARBITRE}) + else: + fio.emit('text', {'text': "Demandez au maitre du jeu pour reprendre une partie.", 'username':None, 'name':NAME_ARBITRE}) + + def game(self): + return Game.query.get(self._id) + + +class CustomNamespaceJoin(fio.Namespace): + def __init__(self, id): + self._id = id + fio.Namespace.__init__(self, '/game/{}/join'.format(id)) + def on_connect(self): + pass + + def on_disconnect(self): + pass + + def on_join(self, data): + if self.game().can_join(current_user): + if not self.game().authorized(current_user): + self.game().join(current_user) + fio.emit('join', {'username':current_user.login, 'name': current_user.name}, broadcast=True) + + def on_add_player(self, data): + if self.game().isadmin(current_user): + if 'username' in data: + user = User.query.get(data['username']) + if user is not None and self.game().can_join(user): + if not self.game().authorized(user): + self.game().join(user) + fio.emit('join', {'username':user.login, 'name': user.name}, broadcast=True) + + def on_leave(self, data): + if self.game().leave(current_user): + fio.emit('leave', {'username':current_user.login}, broadcast=True) + + def on_ban(self, data): + if 'username' in data: + username = data['username'] + if self.game().isadmin(current_user): + if 'username' is not None: + if self.game().leave(username): + fio.emit('leave', {'username':username}) + + def on_fixplayers(self, data): + if self.game().isadmin(current_user): + if self.game().can_start(): + self.game().fix_players() + fio.emit('fixplayers', {}) + + def on_start(self, data): + if 'order' in data: + order = data['order'] + else: + order = None + if self.game().isadmin(current_user): + if self.game().start_game(order): + fio.emit('start', {}, broadcast=True) + + def game(self): + return Game.query.get(self._id) + diff --git a/db.py b/db.py new file mode 100644 index 0000000..03012bf --- /dev/null +++ b/db.py @@ -0,0 +1,339 @@ +from flask_login import UserMixin +from werkzeug.security import generate_password_hash, check_password_hash +from flask_sqlalchemy import SQLAlchemy +from sqlalchemy.orm import relationship +import random +from belote_jeu import cards, N_PLAYERS, colors, winner, N_TURN + +db = SQLAlchemy() + +levels_users = {'Inactive':0, 'Simple user':1, 'Can create games':2, 'Can manage simple users': 8, 'Can manage games':9, 'Admin':10} + +####################################################################### +# User class # +####################################################################### + +class User(UserMixin, db.Model): + """Model for user accounts.""" + + __tablename__ = 'users' + + login = db.Column(db.String(200), + primary_key=True) + name = db.Column(db.String(200), + nullable=False, + unique=False) + password = db.Column(db.String(200), + primary_key=False, + unique=False, + nullable=False) + level = db.Column(db.Integer, default=1) + last_login = db.Column(db.DateTime) + + def set_password(self, password): + """Create hashed password.""" + self.password = generate_password_hash(password, method='sha256') + + def check_password(self, password): + """Check hashed password.""" + return check_password_hash(self.password, password) + + def get_id(self): + return self.login + + def __repr__(self): + return ''.format(self.login) + +####################################################################### +# Game class # +####################################################################### + +class Game(db.Model): + __tablename__ = 'games' + + id = db.Column(db.Integer, + primary_key=True) + name = db.Column(db.String(200)) + players = relationship("Player") + turn = db.Column(db.Integer, default=-8) + atout = db.Column(db.String(1)) + preneur = db.Column(db.Integer) + admin = db.Column(db.String(200), db.ForeignKey('users.login')) + cards_to_distribute = db.Column(db.String(200)) + first_player = db.Column(db.Integer) + start = db.Column(db.Boolean, default=False) + last_played = db.Column(db.String(20)) + played = db.Column(db.String(20)) + fixplayers = db.Column(db.Boolean, default=False) + points_0 = db.Column(db.Integer, default=0) + points_1 = db.Column(db.Integer, default=0) + cumul_0 = db.Column(db.Integer, default=0) + cumul_1 = db.Column(db.Integer, default=0) + partie = db.Column(db.Integer, default=1) + + def start_game(self, ordered_players): + # Ordering players + if self.fixplayers and not self.start: + i=0 + if ordered_players is not None: + for op in ordered_players: + player = Player.query.filter_by(game=self.id, user=op).first() + if player is not None: + player.nr = i + i+=1 + for p in self.players: + if p.nr is None or p.nr<0: + p.nr = i + i+=1 + db.session.commit() + + self.start = True + self.first_player = 0 + self.distribute() + db.session.commit() + return True + return False + + def fix_players(self): + if self.can_start(): + self.fixplayers = True + db.session.commit() + + def distribute(self): + ___cartes = random.sample(cards, k=len(cards)) + for i in range(len(self.players)): + self.players[i].cards = ','.join(___cartes[5*i:5*(i+1)]) + self.played = ___cartes[5*(i+1)] + self.cards_to_distribute = ','.join(___cartes[5*(i+1)+1:]) + + def authorized(self, user): + for p in self.players: + if user.login == p.user: + return True + return False + + def isadmin(self, user): + return user.login == self.admin + + def serialize_state_anonymous(self): + r = {} + r['atout'] = self.atout + r['preneur'] = self.preneur + r['last_played'] = self.last_played.split(',') if self.last_played is not None else [] + r['played'] = self.played.split(',') if self.played is not None else [] + r['turn'] = self.turn + r['first_player'] = self.first_player + r['points'] = [self.points_0, self.points_1] + r['cumul'] = [self.cumul_0, self.cumul_1] + r['partie'] = self.partie + return r + + def serialize_state(self, user): + r = self.serialize_state_anonymous() + r['players'] = self.get_ordered_players() + r['playersinfo'] = {} + for p in self.players: + r['playersinfo'][p.user] = User.query.get(p.user).name + r['nr'] = self.get_nr(user) + r['admin'] = self.admin + cards = self.get_player(user).cards + r['cards'] = cards.split(',') if cards is not None else [] + return r + + def get_ordered_players(self): + r = {} + for p in self.players: + r[p.nr] = p.user + r2 = [] + for i in range(N_PLAYERS): + r2.append(r[i] if i in r else None) + return r2 + + def get_nr(self, user): + p = self.get_player(user) + if p is not None : + return p.nr + else: + return -1 + + def get_player(self, user): + if not isinstance(user, str): + user = user.login + return Player.query.filter_by(game=self.id, user=user).first() + + def can_join(self, user): + if self.authorized(user): + return True + if not self.fixplayers and len(self.players) < N_PLAYERS: + return True + return False + + def can_start(self): + if len(self.players)==N_PLAYERS: + return True + return False + + def join(self, user): + if not self.fixplayers and not self.authorized(user): + p = Player(game=self.id, user=user.login) + db.session.add(p) + db.session.commit() + + def leave(self, user): + if not self.fixplayers: + for p in self.players: + if isinstance(user, str) and user != self.admin or hasattr(user, 'login') and user.login != self.admin: + if isinstance(user, str) and user == p.user or hasattr(user, 'login') and user.login == p.user: + db.session.delete(p) + db.session.commit() + return True + return False + + def get_players(self): + r = [] + for p in self.players: + user = User.query.get(p.user) + r.append({'username':user.login, 'name':user.name}) + return r + + def tour_choix(self, atout, user): + if (self.turn + self.first_player) % N_PLAYERS == self.get_nr(user): + self.turn += 1 + if atout is not None and atout in colors: + self.atout = atout + self.preneur = user.login + self.turn = 0 + self.distribute_restant() + db.session.commit() + return True + return False + + def distribute_restant(self): + todistribute = self.cards_to_distribute.split(',') + for pn in self.get_ordered_players(): + p = self.get_player(pn) + if pn == self.preneur: + p.cards += ',' + ','.join(todistribute[:2]) + p.cards += ',' + self.played + todistribute = todistribute[2:] + else: + p.cards += ',' + ','.join(todistribute[:3]) + todistribute = todistribute[3:] + self.cards_to_distribute = '' + self.played = None + + def tour_jeu(self, carte, user): + if (self.turn + self.first_player) % N_PLAYERS == self.get_nr(user): + winnr = -1 + self.turn += 1 + if self.played is None or self.played == '': + self.played = carte + else: + self.played += ',' + carte + if self.turn % N_PLAYERS == 0 : + winnr, points = winner(self.played, self.atout) + if (self.first_player + winnr)%2 == 0: + self.points_0 += points + else: + self.points_1 += points + self.last_played = self.played + if len(self.cards_to_distribute)>1: + self.cards_to_distribute += ',' + self.cards_to_distribute += self.played + self.played = None + self.first_player = (self.first_player + winnr)%4 + if self.turn == N_TURN*N_PLAYERS: # Dix de der, chute, belote et capote ! + if (self.first_player + winnr)%2 == 0: + self.points_0 += 10 + else: + self.points_1 += 10 + if self.get_player(self.preneur).nr %2 ==0 and self.points_0 < self.points_1: + self.points_0 = 0 + self.points_1 = 162 + if self.get_player(self.preneur).nr %2 ==1 and self.points_1 < self.points_0: + self.points_0 = 162 + self.points_1 = 0 + if self.points_0 == 162 or self.points_1 == 162: + winequipe = 0 if self.points_0 == 162 else 1 + # Capote possible. + winnr = 0 + ccc = self.cards_to_distribute.split(',') + for i in range(N_TURN): + win, xxx = winner(ccc[i*N_PLAYERS:(i+1)*N_PLAYERS], self.atout) + winnr = win+winnr + if winnr % 2 != winequipe: + break + else: + if winequipe == 0: + self.points_0 += 90 + else: + self.points_1 += 90 + # belote possible + winnr = 0 + belote =-1 + ccc = self.cards_to_distribute.split(',') + for i in range(N_TURN): + cccc = ccc[i*N_PLAYERS:(i+1)*N_PLAYERS] + if 'R'+self.atout in cccc: + if belote>=0: + if (cccc.index('R'+self.atout) + winnr)%4 == belote %4: + if belote %2 ==0: + self.points_0 += 20 + else: + self.points_1 += 20 + else: + belote = winnr + cccc.index('R'+self.atout) + if 'D'+self.atout in cccc: + if belote>=0: + if (cccc.index('D'+self.atout) + winnr)%4 == belote %4: + if belote %2 ==0: + self.points_0 += 20 + else: + self.points_1 += 20 + else: + belote = winnr + cccc.index('D'+self.atout) + win, xxx = winner(cccc, self.atout) + winnr = win+winnr + # Retirer la carte du jeu ! + p = self.get_player(user) + ccc = p.cards + ccc = ccc.split(',') + ccc.remove(carte) + p.cards = ','.join(ccc) + db.session.commit() + return True, winnr + return False, -1 + + def restart_jeu(self): + if self.turn==N_TURN*N_PLAYERS: + self.turn = -8 + self.atout = None + self.preneur = None + self.last_played = None + self.played = None + self.cumul_0 += self.points_0 + self.cumul_1 += self.points_1 + self.points_0 = 0 + self.points_1 = 0 + self.partie +=1 + self.first_player = 0 + self.distribute() + db.session.commit() + return True + return False + +####################################################################### +# Player class # +####################################################################### + +class Player(db.Model): + __tablename__ = 'players' + + id = db.Column(db.Integer, + primary_key=True) + game = db.Column(db.Integer, db.ForeignKey('games.id')) + user = db.Column(db.Integer, db.ForeignKey('users.login')) + cards = db.Column(db.String(40)) + nr = db.Column(db.Integer, default=-1) + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7d18817 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +Flask==1.1.2 +Flask-Login==0.5.0 +Flask-SocketIO==4.2.1 +Flask-SQLAlchemy==2.4.1 +SQLAlchemy==1.3.16 +Werkzeug==1.0.1 +eventlet==0.25.2 diff --git a/settings.exemple.cfg b/settings.exemple.cfg new file mode 100644 index 0000000..0f8f842 --- /dev/null +++ b/settings.exemple.cfg @@ -0,0 +1,9 @@ +# App configuration file +# copy this file to settings.cfg + +# Generate a secure key with +# python -c "import os, base64; print(base64.b64encode(os.urandom(24)))" +SECRET_KEY = "to-be-changed" + +SQLALCHEMY_DATABASE_URI = 'sqlite:///db.sqlite' +SQLALCHEMY_TRACK_MODIFICATIONS = False diff --git a/static/belote-script.js b/static/belote-script.js new file mode 100644 index 0000000..c36ebbf --- /dev/null +++ b/static/belote-script.js @@ -0,0 +1,73 @@ +/************************* + la Belote +**************************/ +var go = function(url) { + document.location.href=url; +} + +$(document).ready(function() { +/*============================== +listeners à activer à ready +===============================*/ + +document.getElementById("username").addEventListener("click",function() {apparaitDisparaitMenu('username-items','username-fleche')}); + +var options = document.getElementById("options"); +if(options){ + options.addEventListener("click",function() {apparaitDisparaitAccordeon('options-valeur','options-fleche')}); +} +var derpli = document.getElementById("dernier-pli") +if(derpli){ + derpli.addEventListener("click",function() {apparaitDisparaitAccordeon('dernier-pli-valeur','dernier-pli-fleche')}); +} + + +/*============================== +fonctions +===============================*/ +/* +fonction apparaitDisparaitUserAttr +apparition/disparition d'un menu +*/ +function apparaitDisparaitMenu (idMenu,idFleche) { + var element = document.getElementById(idMenu); + if(element.style.visibility == "hidden" || element.style.visibility == "") { + document.getElementById(idMenu).style.visibility = "visible"; + } + else { + document.getElementById(idMenu).style.visibility = "hidden"; + }; + var elementFleche = document.getElementById(idFleche); + var splitElement = elementFleche.src.split('/'); + var lastElement = splitElement[splitElement.length-1]; + if(lastElement == "fleche-bas.gif") { + document.getElementById(idFleche).src = "/static/fleche-haut.gif"; + } + else { + document.getElementById(idFleche).src = "/static/fleche-bas.gif"; + } + return(0); +} + +function apparaitDisparaitAccordeon (idZone,idFleche) { + var element = document.getElementById(idZone); + if(element.style.display == "none" || element.style.display == "") { + document.getElementById(idZone).style.display = "block"; + } + else { + document.getElementById(idZone).style.display = "none"; + }; + var elementFleche = document.getElementById(idFleche); + var splitElement = elementFleche.src.split('/'); + var lastElement = splitElement[splitElement.length-1]; + if(lastElement == "fleche-bas.gif") { + document.getElementById(idFleche).src = "/static/fleche-haut.gif"; + } + else { + document.getElementById(idFleche).src = "/static/fleche-bas.gif"; + } + return(0); +} + +/* fin de $(document).ready() */ +}); diff --git a/static/belote.css b/static/belote.css new file mode 100644 index 0000000..4cc6aa1 --- /dev/null +++ b/static/belote.css @@ -0,0 +1,391 @@ +/* ========================= + la Belote +========================= */ +/****************/ +/* Reset */ +/****************/ +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;vertical-align:baseline;background:transparent} +body{line-height:1} +ol,ul{list-style:none} +blockquote,q{quotes:none} +blockquote:before,blockquote:after,q:before,q:after{content:'';content:none} +:focus{outline:0} +ins{text-decoration:none} +del{text-decoration:line-through} +table{border-collapse:collapse;border-spacing:0} +/****************/ +/* généralités */ +/****************/ +body { + margin: 0px; + background-color: #13995E; +} +div.clear { + clear: both; +} +div.clearfix-head::after { + content:""; + clear: both; + display: table; + border: 1px solid black; + width: 100%; +} +div.clearfix::after{ + content:""; + clear: both; + display: table; +} +div, p, li, a, th, td { + font-family: 'Segoe UI', Arial, Helvetica, sans-serif; + font-size: 15px; + line-height: 17px; + color: #092E1E; +} +/****************/ +/* conteneur */ +/****************/ +#conteneur { + margin-top: 8px; + margin-right: auto; + margin-bottom: 0px; + margin-left: auto; + height: 600px; + width: 1200px; + /* border: 1px solid #092E1E; */ +} +/****************/ +/* entete */ +/****************/ +#entete { + position: relative; + height: 66px; + margin: 2px; +/* + border: 1px solid #092E1E; +*/ +} +#logo { + margin: 2px 10px 2px 2px; + float: left; +} +#logo img { + height: 60px; + width: 60px; + display: block; + margin-left: auto; + margin-right: auto; +} +#titre { + width: 55%; + line-height: 60px; + margin: 2px 15px 2px 2px; + text-align: center; + font-size: 140%; + font-weight: bold; + float: left; +} +#username { + width: 20%; + height: 60px; + line-height: 60px; + margin: 2px 15px 2px 30px; + float: right; + + font-size: 140%; + font-weight: bold; + text-align: right; +} +#username-fleche { + height: 14px; + width: 14px; + cursor: pointer; + padding-left: 10px; + vertical-align: baseline; +} +#username-items { + position: absolute; + top: 68px; + right: 0px; + width: 180px; + visibility: hidden; + margin-top: 2px ; + padding: 5px; + border: 1px solid #092E1E; + overflow: hidden; + z-index: 100; + background-color: #b7a86b; +} +.menu-item:hover { + cursor: pointer; + background-color: #15A160; +} + +/****************/ +/* zone-de-contenu */ +/****************/ +#zone-de-contenu { + width:50%; + margin:auto; +} +#zone-de-contenu>div { + margin:auto; +} +.tablelist { + width:100%; +} +/****************/ +/* zone-de-jeu */ +/****************/ +#zone-de-jeu { + height: 438px; + margin: 2px; +/* + border: 1px solid #092E1E; +*/ +} +#plateau { + height: 320px; + width: 740px; + position: relative; + margin: 3px; +} +#joueur-0 { + position: absolute; + top: 55px; + left: 190px; + text-align: right; +} +#joueur-1 { + position: absolute; + top: 145px; + left: 80px; + text-align: right; +} +#joueur-2 { + position: absolute; + top: 245px; + left: 190px; + text-align: right; +} +#joueur-3 { + position: absolute; + top: 145px; + left: 500px; +} +#jeu-0 { + position: absolute; + top: 30px; + left: 300px; +} +#jeu-1 { + position: absolute; + top: 120px; + left: 190px; +} +#jeu-2 { + position: absolute; + top: 220px; + left: 300px; +} +#jeu-3 { + position: absolute; + top: 120px; + left: 420px; +} +#suivant { +position: absolute; + bottom: 15px; + right: 90px; +} +#suivant input { + width: 80px; +} + +#ov { + height: 310px; + width: 390px; + padding: 5px 25px 5px 25px; + position: relative; + top: -322px; + left: 746px; + margin: 2px; + border: 1px solid #092E1E; + +} +#table-atout { + width: 98%; +} +#table-atout td { + padding: 4px; + text-align: center; + vertical-align: middle; +} +#atout { + margin: 0px auto 0px auto; +} +#choix { + height: 160px; + margin-top: 25px; + padding: 6px; + border: 1px solid #092E1E; + overflow-x: hidden; + overflow-y: auto; +} +#options-fleche { + width: 11px; + height: 11px; + float: right; + cursor: pointer; + vertical-align: baseline; +} +#options-valeur { + display: none; +} +#dernier-pli-fleche { + width: 11px; + height: 11px; + float: right; + cursor: pointer; + vertical-align: baseline; +} +#dernier-pli-valeur { + display: none; +} +#dernier-pli { + margin-top: 10px; +} +#dernier-pli-valeur { + padding-left: 50px; +} +#jeu-en-main { + height: 76px; + width: 642px; + position: relative; + top: -320px; + left: 0px; + margin: 2px; + padding: 15px 58px 15px 40px; + border: 1px solid #092E1E; +} +#a-vous { + float: left; + width: 90px; + height: 79px; + padding-top: 20px; + text-align: center; + margin-right: 20px; + visibility: hidden; +} +#points { + height: 98px; + width: 390px; + position: relative; + top: -430px; + left: 746px; + margin: 2px; + border: 1px solid #092E1E; + padding: 4px 25px 4px 25px; +} +#points p { + text-align: center; + margin: 5px 0px 5px 0px; +} +#points table { + width: 98%; + border-collapse: collapse; + border: 1px solid #092E1E; +} +#points table td { + padding: 0px 2px 0px 2px; + text-align: center; + border: 1px solid #092E1E; +} +.joueur { + width: 90px; + height: 18px; + overflow: hidden; + text-decoration: underscore; +} +.carte { + height: 77px; + width: 50px; + /* carte : hauteur = 1,54 * largueur; */ + border: 1px solid #092E1E; + background-color: #117F4A; +} +.carte-en-main, .carte-dernier-pli { + float: left; + margin-right: 12px; +} +.item-choix { + padding: 4px; + border: 1px solid #092E1E; +} +.item-choix-valeur { + padding: 4px; + border-right: 1px solid #092E1E; + border-bottom: 1px solid #092E1E; + border-left: 1px solid #092E1E; +} +/************************/ +/* zone-de-conversation */ +/************************/ +#zone-de-conversation { + height: 84px; + margin: 2px; +/* + border: 1px solid #092E1E; +*/ + position: relative; +} +#chat { + width: 61%; + height: 87%; + float: left; + background-color: #C4E8D7; + margin: 2px 15px 2px 2px; + border-top: 2px solid #888; + border-right: 2px solid #DDD; + border-bottom: 2px solid #DDD; + border-left: 2px solid #888; + position: absolute; + overflow-x: hidden; + overflow-y: auto; +} +#message { + width: 34%; + float: right; + margin: 1px 15px 2px 2px; + position: absolute; + right: 2px; + top: 3px; +} +#message p { + padding-bottom: 4px; +} +#texte-msg { + width:80%; + background-color: #C4E8D7; + margin-right: 5px; +} +button#add{ + min-width:180px; + margin:auto; + padding:10px; + background: #b7a86b; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + -khtml-border-radius: 10px; + border-radius: 10px; + display:block; +} + +thead{ + font-weight: bold; +} + +fieldset.fieldset { + border:1px solid green; + padding:30px; + margin:20px; +} diff --git a/static/cards/0C.png b/static/cards/0C.png new file mode 100644 index 0000000000000000000000000000000000000000..5efbcf181eef73664cf7946389f5ddf129523a84 GIT binary patch literal 11663 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 JDjBn&{{!fIdb$7r literal 0 HcmV?d00001 diff --git a/static/cards/0F.png b/static/cards/0F.png new file mode 100644 index 0000000000000000000000000000000000000000..617a9b69ef435e18be573fe3d93cf58c60b109f5 GIT binary patch literal 10954 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%0ApQQrf*uZp4UyYAJmOM~fS=fOjwcZgl3|$;h zA}Cu00iS&q&*guXiouB08$)}1>XdnJ`cV%#@C8-_1W7YD3iAHBWBNfrP3P&eCH5Ob z{_RPq$)%kU@{2moka#k{c($F6>1aX;uwDTELs~uCefkotBmp{@Eh<#ub_1-{d!7(- zfRfZTiJ%Py8fsU|x|OT3CU8|LeeGf|1B_i{k zgaTZb0_ev8jw)sPOurs^t-FQ(ar6Gv<<}DRU?^>D%qNEIFXRe1T#lCwfI)xNI1-)A z*p7;%lWPM&`nb4^%8D_hr!L{ZCi332U{SD>v7L6m>vy%}G|q3if&2@r^Z%%SD$oRe z?U$W|5l+D{msj(6-nR+C@kJ#bwM{kp3VVRP9pr$?oxWtp0mNWbs;==p-5scQGO%2V zRpa44lLMe~tR`J)*lj#kJSn%%fm(?<#?L2d1Ju!X*g0pMIB?Wf?GbOB$#VoTWbeS$ z?HT4sy?QQKFqQ1mcoFDioZITuv@L= z+b#4pD4D!kX#5RAz@g6K36faZ_5<5|GHoXaF8JArxTt;uahhQ}0=kH_(kWjNzvnEY zobufp_L{U_XJM07s@E_1s}m}6USNL`tpMx-_$NYjGl|=l#Q& zJ2==n27r%SiQwDu*Fw%VD9|;pg4AzITu+L+Vxl0Xat~GUUxKzG!3O|+5I$|zffV62 zdfNby7-K8iQ2M1mM>#f7J*Cdn&6Ihc6FH!n7R~vNTQ2{*5}aR3Tkm(~f@@-2@BIT> zp1-?2i(bzd7nyO$1&*+3<7|0LWM>XF+pa4umG&vkK`gFbp8i$lp5$$ZhLieOH3lcE53wxf$f95QDO@ek9$g z#{+~CsR^_USrK3^3>CCcBgcfMyxnrh5)AAYOk-X+V5g`Qi(LDd7Yy`(UvE|gkkH87 zq_q)VUMV6uCUiZ2RY$XV#% zQT+vE-3L0LL#j-q@fUL;si+V!{xSki%4X+6Rcmaa{)eLH3Ui^+=m_r+HFk?f;UP;8plrg+u zQp-Es;|JPvEb}H&@1HiE37eW4=#2bM_x}A3`8y!s?$&sLZX*&C=6U?gv2*Y@;`?Bq z@ofKbxRkJ8eV$*en&)L4PXHkAYLtE|Pa6ch2PziOW|Pe0r>m@Ut^Y^|=%${&_mcVi z$Igs4Ku|~Z<-|gOYKNtifRqN~dLkpn*}Vku?;;d${ebuV=)yKOpXC7Uaw1!@Fs5w7 z6xT3}|0e`l4;?psNnGXQLE^kGsQ&)2}_ zx0;mwqn0h%$yi9Qq9pl&*k-9Qax7P6ZO*m{&51kWjufO1LT&%Sg7gk)8CmjF;!Y*S zD+R>7(wJ~_8!a~qdO$q_`>-?*WuDkY<2NgV#z5<4JNFW|wj8vbf4t&>eWxHrIc3>m IX(PY?1M{>EDF6Tf literal 0 HcmV?d00001 diff --git a/static/cards/0P.png b/static/cards/0P.png new file mode 100644 index 0000000000000000000000000000000000000000..b230ad2a14aa34adb3faa9b502d8797247c61109 GIT binary patch literal 11157 zcmaJ{by$>7v|fV{M7m45LAtvZ1w=$j1f^5DO95%*N4K=Jbe9Oyoe}~fA>BxO5BL6m zd7c$_+5L9DnKSQsV?xwa6|peLFc1g?mJ(7<9ex+U;}{(k{$)#=$cA5c9c7d>(Ba1m z-8dMY-?KyNI3f@aI&L1f;@BRL!;7R&^4d<%ZB3nA-#C~cTwPr`E#6u=8ojYI;k0!y zOW6@4Lm(a^l;or}+)}sGT(t?bF8;PQVm_&4qt!+by8Ceu`P{k_N{edPj#n;EfG^4# znru4$BioQ~Qcl)7lFTqHlEIGz({d|>Zq?2VX}&l7&0=}qZP z4JHXYE|~poG&5DL$Ighrd`FFlz4LI1@vWHc3gW?SI|T;g7ZSdAU*ASp1qbg%61+ou zr;b>AMx%$k7H7VLgZ3I7fy`Au`ZIFpXM?kUNl6K!B~%*^eO$p+@HAFDm1ysVu}tu*P2?;XIQr5%?)KU+(u6BSLVq4^;5zOGJaz{lL2dEWc) zt19bhymX)Q0>-PJ7^ZMbE8Ii>Xr%AID_86JCQ`)W)|OuT^trIlrO?6QA^*i4)ceC; zR6=$cll7h_TbU-Z9b%dEqwa^RnN3X;2poKT**-NH8NW#%m}&lWN=nL+3X>=PYoXc# zv2y39`$mYb!^Yx5k5Z10&%$%;RtQ@mYv2$=3ooV$t}ZK!c}(&5#PlW+F3ztLjj%w?-i< zDq3KTK&=b~QD+1Z)MP<$3rKK#97)CNA;i>T|vA<5KJdiBOf7Evv3`+oRv1>)4O zs{DK;lS=x-lHy|K6~b~cA>x9T0><Pw^J$!_?hw%CMxVZJ4XU#u1`}zc+yh>ai zht*dabv;PKwfr2oBOY&(7#zEqT$Pc5`1R{o_rQR>loVp7%A&nM{5c&11IozA2u$y{ zzst?_tEw zAGfC~(Z=$gPF=i2zqdv^A=vSBq4mW=iNb;u0V8wVW3SU+L8m9PwpgDWPquXKqM@a% zl>CFMk?@)045o>i?WNkx*1Wkq-A@*_`TXu7?F19j+d{dsOmhWp8yyof`-su^`qKSq zeGJXr-Mx64IC*YP?`Uf}W|Y3`XQQjpkFqz+EG)m;DwDY_qAFg*w0In2+>9+#Hi&tx z-g%SA%iDXvaL-v+m+bQD%KqZSrq|u)e4QyEARw`W@_UYauY!uDGM0KAAVb^20(I-v z3AvGEz|!^A#opmzHa}&T#tt*oi-Apd0`mFu=fBq0%rxNbTU*vQW77Jf_hvZ^hn|7q z=EF%zNmZrxo0A-;XJ<4V91-GO;Q>%ZRu4b3j-DTHj@6`m`t(u4`}`pT!-o_8aWUU( z3TbI+A>V7U-&Xtb>gsqhGBVnvIWeiJ;h)4kF^FX29is#Q5}6_jk;f~!G9Dfx9)EWR zHdS~40_Qv9hi^1`9bWw6uaq;~(Z{Bow zcRw0bqGM)emI7G%B;nnggw=2f`+vOWu*d)!!(r?7k@SU zuD$j00CP>i4Y#1SwpR1+pGvbKr8vY1&#`tZXLXGl6PIO-=oHYEqCe+4g9Fwe0S!<*MoO{boGd z)~lLHp9$i$-r8aTo0$xqO4Hacn~RHIh4>iobJSU8YHZjNuWD>&9XO*m?CkA-d9@kO zKPJY*%c}OhI(Hse3lG0vl3cY>&%ZzKxy$YN@fQ5pIXMyZw`6D2-M)SMZskyy>rVWKQst#GCuRy z8dOrAv2om#XqGwZ1rN7lUg%U?5|+$V9aP9UDWp!68c<^ru|E=_rbI_nn2*rK$_1n#4U%=pW}sk4To))g?lIPddH0z-MD) zEAjP#hA`dYE&7a^AOJ^3A)F-hMJ0|*uzCS~&;v?ZKmeu(4<6{QY|K=%>C{-0x?f)k z(^0cI?k~wZ{Q8D6`Q`7{H1EN8VuSynE#rj9W$m}BrimDTeRpel?^k>B?rDVJ{4fRf z{rmI*I9Y1U-B2jVQvK%O>gwv%y6S5F^@$?l=?3Sb)r;TJz5E5s3)tFK=D0*$`o&t` zB`^16tH<84(M2H(DgR`s7d)~UrBBmIp%ihtDU-o0BV{$#xbD6_e>vLs+1c5ujw&#X z)w+bEV`I*iOHEB;vGMU)7Gs}_pO$m7v&;S6`AHLnw1cXgT!?=18|}SMB}M{U{`*L_A}%3eZsj@p6osgZGLw4OQ^~82FdG^4&#Gym@LiUp52z)= zL-3gnh*m#W*zkMBEocW=p%5j)26)D_otN&j#LzL=rH3nN$uTsW%vOGHHE&=6k#IQLtX#aQ7hq#N8D6y|c3g39B^qqA$izdNy{^Ek=B z(aJYKS^K|X00{36833vSWGZlU>%B^fz?-cf<*6T9E;ouwk3Qqe>;Xw|G>l;>ZWS^y zHI0sr#+&@o#aLfopYx_Ya6%xPfswJo@(@}vy^zq4{7#q4S#}M8q(Uy>h;+dAGgQ#f z(4ynxI}24r?9P{R9^4mj-O;Pz8X$q&f10ju^fiFx`R6i$%U$3Bf2K;QRnsMGoaW(% zXdgYofk`#`o&YpjIhn6uMlmESi&puQ*!1%4jS9_}7N4tRm}Bij>{I9_qy{k@v5y&& zc+DQH=oZ^9w1iug1Nj^+H&V>D8ZJypNFa8*gISs!o|b$vzq#{PBB|$fe$}VOOfI6kfp9BM+_wW_DVvlq2rl+U> z3}@c?NFgjU3&1X*r>7?r(xigYSqL;*5iq6*OT5x`S09Md*3ZU-zqcB^u!9GCdZc0B zGgWGhjgI0F5Cl9);LL=L!vBdYrl%_K_k<=1OCXLPl(|}HL=|X~k``@8Im*?bzV(To zo}Q+ldR#IE+K8~Qc90G%=|IjMED3ItPWdSmXQ# zao3`uoDayD4MEK?&Q1*qgv(hnSLnerED28x%9&(L0t^%`@0}M(;+{40|H-eS(nXPx zCH>5j$MmObibyloBL7iqOP%+N5i2S=ITWDj@NI%ENyt&mQ;D|I{omEej0ztqLPVT5 z7E5a9Wg@A>`POS{YP6vrpx!6>+L5DFVKzk7X1zO8{p8WCS6lwQUI6Rz@^bBRLlkv& z^~If?k2hRlDT+FA{!Wxczc_mt9HT4mTmr+SmGd^QLIyX1BySI1rUa5s@*?h$ps{WUn znt?zqE4|%g{MV)Khsb@a^KXx(Rdu{oL@VyNdcWo0wdcU~Xzr8!y@nZK*l;}i_j&)s-k!h5yW1A4^I&{QUh3pJl*_vJbjf9OUHW%ug0Pcg3@*$tS_gi%YKf+z*V!yiReVqM|&sRQHdL zIu2I)Zf@}|D(VtUeXwh8Z>Mx)55|qO$U-cNM4`bq4wIl#U^3U;G{Hc zx1sUIn^xZjBwDo3)j2LUHufY_Q-KES0Vw$B*jPEAt7EO`w6qe(CXk28BWs}Dm^#&A zf1CkkDFF{Id3MGR{74G;%M&2ZOnf@Wo) z1sbAk&;$OSGxLB%WFlqeG;G*-&R2!gl1_hcB%o8J4U6j8U!K~hRsFl#^=d?f4rE3N)7du_Ydn80Kxb z2O3Ube3+ifVU6ou+3tS0;a-W zB^@17wiXiq@4>NevDBS6VPp05_Zu&V0idRP9o#cXfvNyl2IxBg+lPl!lGrsixePsu zh>$P}6bJA1`|*^#Jf@!B-mH~AXnxY0LwI<2GCp8f=nABZxyy)&iD|R>LiM;4vTnX{ zQI3GtaG#71X`7+faDz_Zv3;#~Tw_+0XW`;fR8TjmjXoOk<;6`hd4 zkmxOgo)?v7wFHc&32S^( z5wy|T&`Py_j&(80<7%cZ90mr4aPJJvu>)QXQF4iKxe{Uvz<$zF{2?cIxx%9NcG5+f zB_u0mx+mZQIZ&m2o(v;+m%;tCxv6P!b(JyE8`!PWpJC}o7a%g1=K^(tkA6o=ey&!C zRc0LX0%J#lV-}N`Gbb)mMdJF@NcW62A!+ch88~Bq{+R35M6|KX%|OF1NlMo!pjc&O zX72v8Rtf0v2Gpa%tVs$C+^9d1TVbWVrlu398~+99Q-#@A&>b3_)(xE`jJPqQZhuvz z_714Fno`G0j)=e#csmyieAgnETEZ)F^e|42whc79N>+r1inTR6Y(ts#IfV$aU$9=f z<#|vZL0IGhYN3h@34OTu`2Jv@jhswr_h;?u4?sWY>5ifcNlQyp^{s4f7AF;TVRt{> zqoD~fS7C$Zj75`UI5GoDGX}1>zFb>TLA%>@_(0hAy6Hdp;&@;dcmxD;#l^)=m$u{i zxFMmTqjJypPfjK&FtM;00&pDuU3>GG_LCUe+Lr#kAm=r`U+?=*Vr?aV&Xw!z?;Roz zU1JB{yGd&5>V7GLwzO<)nBabLa&rEeEFlLW#JA?OF@6sU4MpvlC^!rR5#)lXYTQ-_ zC)=}b2g~kNx8iAnrm>z6c!e?v$Ku)p$ZguTzJhTraY!nZkDKK^`I z_oIVdQJS=GNb+AXZ|U`T!Smbh?UK-QhLw0H4qg@`eJ}SF)2aZg@6CMgW(w@J4b{#; z5@LLqUwr-alUN%p-QB%lgX_z~rvsI4CWD{E!(gbl#0sf^DucGV-5Q?d|Q^lO+L{ z=f_qz@LuP#O$HX$ugy)XBYxFSV)txqZR_gm%Xy@dADD8egGvNii)u4dg*!tiT~=QH z9@uhIQ&WJ;2V5fiM&g2>!L)?j?s8F~iDF=CDpNhnp=FF@R>zG|Bq#{(p$paMSjLrS zH9Yu#-)1!VTj|!~`dA)PSy>L8w316zRn;5Hzj7?6a!&@GhnLs>{K(?Q8LIjMLj1jc zvxmhu?0X-kgQfw_nO@euWdO1lOFS0cV{E)Wnk$#7hQ2LfbVKONiaoo)B6 zI2>(EJb7qa*mbnw5|4cHq#e}Ojq1o)`T&-rL8Zs5-<=U)FnrNzngmw2JzG1q?0d3B z3Y;T|>FFn_OtlPvr@fOC1?Z8^9X6qJjjq@r@nrS&sQ@^JfxzFrd-vM3M;MnUU*+Ff)yZ^3t|8)Zl33G+%oCvYRJ;oy?RVq-Fr;YmW z25P~opRWAr?cctIZ_J`fogb~s_V)FC;1szj-S_X`E1Ypg zA*#nHT@_zbkP3lOfYz+FGkkDmE_Hql}xs6x|t zo;w*<_4a2&_$)_XZ!gITv4hlOh~G$|Z@Ykw`4NJAjpY%Kr2kQFgjQTq zQto}>qFD-69u~v&R8y3pjt8{j4QzvHViAdz|2*%b=?-Dsnt`XMXR3%Z#*HJ-)p{w@ z_n8K|Kp6x*($^W)J_NB6U~k;R#?IpxK`yMqrqOTlQtC^{dzu~%Ta#4$8#9c&38JO= z0r0w(*4Dao&$_}%+c(SPD#;7Y(BmGqk&gmz7fO?aCMIc$QWI0 zyQG7TzZZnGsN3MyCi6CG>@sU=YSIe`#Pdq#zb>a`$T1Yi@%NXl=I@3~YM=lcasrP$ zD{UQ}C~%GKEj_^qL^b<%`yn{@%fJy*&!tc*QzQ)U--ID9TO`&tHpf&3m8Mvx{fTV_ z*bpZI%Slo7fK?Zc%ol@D%IoTQ$|EIe*+F<|X$gmdqQ3yU)6gD@7yM`naSshMisev3 zwnyMs>3iYu^bbLqJDvYD;UPWQ`5ETA;GIBB9sWJ*?cccRa-*QtctDk&qHV~s|IAr} z=i+w!X0lj^Y<9ux5UaGtD(hf-e#;{@{LNBFNS)oU+f))>!8eoQu??%G*XlzFG^(tk zLI!Bm4T7p{|ICy{6A}{2fW$>gp5&pHmX^vjICXP%2Em?V2m~hT%~=5ZJFtP7IXL9O z6I|ThjsT%nzWO_v-^y;Km(b0_W2qfm(s;W;?{zsp3r)aHYhB*?*;xE)7k0#rgWEAP zqnr2H$%YXb~~stZ3jl3Ma}TC2e8 zk?kDo*Jfs2%#!%;i!w!?XVlP6=G?b;aS3d0Zhn2Ty}fO$o<^Sl>@O8%%3*%ek9UqJ0kf zr1eZyh*pXW4VW!AryBGV9vXlexxBn|t7M|jLh2aLH@QQC`Fn2gKN{Ibw)0|x+ld(P zx+(NlIL?4(HuZOZzYP{uMW7#>IMLat1^iz?n*XAszvYiKL5Z196cXl^Er7=_1U>QQ zSiofClSY^AP_S8k)N|E^Qi)dCA& zB9Z9Zw?@DOTL$lqXXbNe3Ao!;vOAC#`vbk`Gf#yCIsmmj08f&odk^Yf)xw zhazwqJ;OLOVkcr7y>$omPtHCm+Ir=X#27|6WOsaC*Jo=@)1?g_!5Xacuwu3+5pBhu zsj#$Bad9XJNbg24jDD}KqQb}^uf3hG-Cbju(+EKd#E!rUZfKtQYz;?I_D4fQ!UZ`_TCsh&7j2R-`!-+9xImfxRdHh7Pa0=IP%QB(xZnAbDiC6KDp;hq5j{?1}kcIGAjx(23 zsD&8i&eP-FJKJg86=I8=4&f6PPI6$s>`j4sUUh`vCSnl#9fhQi-k+ryhy=$DnjvpV z9s>Kns-+d2QvVp9q*tQrg)fRS)R@BuwS@asfQoa>8hGualz3Uo)V^2*il02>^zE_< zG_8Tp83V^`=W8O`5{lC>TX0f7!cw(unVFg{fo0)0E$MN@{J&n0L5o)i5JX;Jho-r3 zoPoP{C}4bCL*Xnb{t80P?x7(wr-&N@Xkvs2R4*`&HRxWvuiQ6OwPk&(h7Vp4;LJ_- zJ08@Vb~oObJfGx6r?anb2{8)-Y!l#w`uh5IE-pm zy{_qsq~=Pr;a}DFfmh&oL4(V7Z{ttcwTW`#b*Y@5pjBcZg_UE(lkvj?!m{Xn%bSxoE#h+ z{1vE-TV<{FG!MMtz_fJIHLUPifd)vCa82S&?w4?M2>I+;)bRHSIIj}mv^$@6cn}mA z=pa$oxz!*)fuzTSyzI{W{Cw&(?5#F1m{1~itkGY-dhz7d0;tz+#fM*s z$ASQ=f(FVb6&+%hd+;ASS68#E8S7uGtAW7t`E2J?kF9PFy-EJNFd`Si~Q&>hwHPIQv|S} zsOdmT3LS-$5z(k;WVu@oB=c+6SnEWreI(=WrMJWp0Nb(+GFdph^n+~Z6&NNU%KFWP zl?1r4xZIY#a!ECL|*B}qTc+;AFUIQ5x1opv-rIwvbau^yN zM(10VLr$Zzva;n6fK}?dD1aCTX5m4ckq9}W#Mv_bt)?5-hy?*r1;O(?)rl>%yLT5C z+x$}_c?406c}T&hFX4aSda&H1UHdleojz&jrEioa2=Y5`7g{3VU<8Gj+c3NBe&Bz7 zD>o@W*o=N)!@UL+lW8=@2_q_iguLZqN0gq4X%p*%`Hql?h#|Bis0zV#$$a@Rf_(F0 z-`^2}0WPwSj^v5?_}NdAG;&TJ{=c4!LJpTf3&AKhE-nXam+C~YMl(iWa4?ISP9z>; z1z`-P9~{VB_L3LEjY_U_KV)obZk9&Bg~%oNijB}O(qIh;3d$}kQ`5$lXHWL?yB$s~ zsn4N?^3Go!;fN@{^=`rUAEl3vPo48-{JXcI+N^M~fb?`~AR&3Gx+o8IDFbCN79YO* zCG{Q82O0#}27xg#F+Iw3INXvNtb`7Zj`q-4^qM_@K0fyTgNDdPiY95Z{9J<5@6LPk=yWN)%ZDA_Z6?;T~AP4?z@pYQK^ z{(fASTydOpKA-n}zwXz#1*#~?;9yf=BM=B2Ia#C{e9eQ;easv1FH8Jr27I~Z_(V&^7Sa!0yjtB&93;Od)Gz%^ze3RTsO2({T@Q8q6f%}nep z*litNByNgOAP}?&Ipkvv*QAYPPyNut%XXtBjhxd{CkEBHB=nPxYGH)ajN9eK^0=FmP|mP(kz;bA($cZ3 zK3<=*r_FTg@R~=_+KI<>>Y@Klxk-$GtN(Bj+K3pnq2+%Erfnj+dO`)s1J3JvF zC^PdO=7*;0VgD;3*J-c49n0N#jD>LCnohR)T`eW#l$(&qZyOO7rhIPbO#XIE1aYb| z<%{j%;bHfuizF^F@ykI@reyo&?&>JZ-pcUJ3fq|*R<`Fd#|UW*{C~$D>l4Mk;S!`A zhPNpxDF?TYmr}beWKk%lJMbN4W#v-T@QtmyLuzVK_m*@yp;8=2N5_`dR-gVQjJI@F z`?^zQ2OCqds<9qh)1ri!*G%zhXuQuJEwI;RX1;en++^EsuzvNb@J-JE9X&0rL?+H4 zWz^TN91L0g3B0$WqoWJFnNmG=u)HqMUkC1f`0#;D)SXBE=~LaYA#V;hrA$rf*McsO7Vuiy+W6c>85l4q`K*l%>Tx$3Cnxpxyz4`pOo>TJ%{G5k zVQbd9?LHsG_pPrNQ%VsDEGS^Dtf>he@;Lncdf%VUY1x>4h~vi@p`f5(0Shw+M|-31 zO{r8#Ny$eZM|PE!mBw>TAJTXGQ$*EsE5_11ISEnj?m~RF)3*_J4i2W8s!yI=4GIcE zrux2nhrGnY#l7>i=H)oMmhj?)n4cB zWMpLDiWcW2?P;`7^t{~Mk?}Gz-5 zfLIQrpyWtKHPjL|Hg?qW*pGjGhotm0H12I%=Mm-Mx~WvlW?_Zq$zGlx8f8snX1Jvd z(zCI$Y6K|?C6LOKuB?rJz27HClnLjXQ7fcJEl-+Pn#DLYy_kii9d5xaRC+TjxHLas ze*W(8R9$JU{-^M8pX1%745*`TrKRtSiy!^^^@|fVbT3KFQ;*5nig3KhpxK|sD?lk( zsBvV3`1$ka|8{nodg8gE2lH)q?|rImcL<@U|5N>-u&Ai*-Su1FOqy?C)o^ihhsVbU z8q~O?d0$>k)V<-KEJZb=&R4T5E6G$m#CMC} z7LBrM%SWOpD3m9XlEp3?lZ@SUPAh~So}S_1;f=cR6rVpMu3WjIc3qE#{)vZ&$h7+! zTj2I9=d?TF`3vz*7iY%;ZaeoD_WD!BW$f%Y0WSng9w&#;h*Q7bnzl%~7%O}hCt#mW z$Y%O+NUCdLJ3;CFq!H&-t>X5$k+;c0TPSmP4(hI`JMoMDlxSfisA;d`Kcx3{?$N;A zz{F9UFHQ#c>d1oO^{CnRQtPSm8I3~48K`9TNwTuqJ zm5`9z<`x$Arv5^-^!k-{KF$}rOZ|?PIKn)7nfm*g=!Sae?dU?@)8DVXTvZMCsI|5A zuHHRy3O2POcQvV28%xWMK&n-V!SY>Kkv^eYun6yN3*M;dUF~OfG;;vS?n0OD&VBPys|O}SElt&Y6tEy7uCCY`OLAg zv4SRy4}O01tgInKlp}#*VR(Og;u&7oU%z#yVQT6b)}2m&d7DF=R5s1ukyjfsjFbuSX*AYBXOH69>m4$?NQBTc_G74}Bc+cjkGC6H9%ZQS^m0vYLkQcJHe` zS5UYOh%jt!`1I-1v$NfPiUs3FzY~JnK9kQ50T*W1*MFHC;^Bpz*sqO#lrOM6YUSLJ zi}y%#j*5+4sM)G-Zt%e{F*Ut<>((vIYgb)eU5yXce|B_qAi~<40qox4QVH?seUzYW z_|qLbx4s?%J!smSz`HzE!BJ39(6F#=Y-Z+raeiucezO0NiOIw|^*htUhYdS_x(7>M zD3ei8G)+!YT=hZxu6ZrvIZJnQZ4MNO5zLLy5Y{&YzX0|ExWe?nKNUlkD&5@H^+ zva%wFLZReQ>P}8h=haahLjV!MSzFU}HOK_1;5&g?D??eg7~Y`UBJj70IhCZ}?X=oj zk=609sV%%vPVUD$_Z5?cqFqI(Gj@(V#LkZv!a}SyZ_Id|vY9=*G7!b2o|~H+kd%~k zuc+?$Z=!~to_w<(j+uT+U?7%3t!wzM%P46cRL{m#1?eg4s|~egN1R>Rh0e$aWc)Ts z`s|)?FQsynlJBKI#b{^=BqF$bH)LW$C(lrK2p{`H+#|Ca5s{JPQw=0A!CQV+Ig(Fd zj|fd&yLQbOs*P}*Q7H)xXmbE#A>Ax&Y*MbSl}H4Bk*d40`^wP$;yooLB|=nsdV1!x zi^U`Rd1Tv`t+1!nuebUp4b|1vi~FUerOmCad#Y>m z)N>pr`JxX2h3id+Gmejs3C*&qs;W#=&(F^-VszEi=*v~#*J@~MXQZb;Sx=&0J5yIv z`;?N>C-kE>Gb?Kj5UOC8zt%B2Ha4T6AjH}2&B40rtGz{tb|nV6VZdcUToCgIw) zQLQW8K^4FnSNGZZ;S6uzOT*}zZ2f8{ISc1UX$1wh0lwAce=<{Iz7!Dq$vI?rPIe6U z6pAvVXD90XcFPSZgR6hi?w1)^(Bs^`O?>Kce&RfMS@QjRi~EotDr=BaBa`v7yltA_ zwm$C_i?Y*9#pJmh;xiF##0Qqo;FBU9bT*jSm9lN0Qp z*5>BOt3Gd`c<)Ug{1Mfwuu+6|NGenQV|(cAu{S7VT9LQBY#BnqD{r0RHeKr$(lx*B z8Zs>3+~1FfE+r|c>&(o|_@t!%mluaW3bb>T5_s}Dmn_+fOG=tY^3-*g@UXBN0qs?F zbpv;H9DqrfjO3~obSDbGE>c@M(Hx5;lvDB^6F=EsdocdBI6pt=3=It-mlo#d;dZotq#|6%QKWh`SsMO@w70V}t?cFaknmQmBwRGS+ye?8OMJFx zBgEN&o)z`J(BEuZTv}3xW+uP%nO|6ta$CC$7du_& z9)u?ESO20_NH+5qICN{rSV97YUb!`Sd|VulUJ6uyZ<1hSS63HVG|*vht~*wVe6L!v zImOTS)CbFwgSSPC5m4H{UoNKkoOQXvT_rl4r>deQU3Y! zXNYw{etx=YhV-M&H0+{(&0)t}H@Ja8MO-$;n1Dn~LZM&J)a@kya5`Y5KW9A*B7 z%?u2D5<6Zbaz8)eWuW|%RWIx2EFb#uV_U@irvph$tgJ22uAd?z-T_oJ0K)-dMkeMV zQ0=rrA3i-bMR~aS8$)F+U0X$kcCPKDS{k@6&_JGqO?t7SUO?FOB$ghTVoDPe!W5O=nCY=%YO_j#2R^&z%wX|Z8 zTXyp;SXm>{DJe?s?(PnvOQTd>4%bEO=ieg@;^X7x^MY~Yy=(frx|-nD+W(t<3`fqA zf&Jll&Y$L99}`Pv&*6-BzxzU|Vj`ctwIbWlq!Th_V)Is(>#29e0ytO ze>kY|X~P_i^!4=}c~Kz~Ms06sbb7F%yPqzxVTpue%sCM8I@7W0pU&50Y2&c&l17Q5 zo{MueFwtNL5qgej#-U`<%{%JrtdqEEbtWg#KiZ8Z6gBk z2?%`NzrUumy14CXXK!zkJOe#iQn3tmYT6aW#5Eih6Jy#EK!AOm?|_p-PbK2|P2+(t z%+sds?%?kH#re5r|094X0(|@i%OCK>YH6h87dwObT{!DR^Y(-ogMy1q1|u zj3Hxa{|kt9bb4ym`0hF(d-UqtNc$l`5p#3%&%lr?-yE{P1Hq)!%g)YT>F@`em6i2V zYAPOx_voS}c4lTZ*Ham2{fViml0NUlO@pJOqi^ob;$CN!Bl|iEoxQ!9t}A7sp`krB znOw6@N$6v{qnNgR?2#b)rhFn%S6~0`2Y>%yF=0VLrdJ|rk$K|RJNJNmX;%ES@-6uf zF`k|~fFkOII{`yE6L+7CoP03V`=ZmcnNgNy;;Mbs1SV{wm1k-bJ{DBT}J1oKbZiZoy;2cN8t}2@uv|ch|m-XB+ zCp-HF$gP%2`-Rz+6)fNkpwQ?!Iq~7}q~+wWdU|`qqoS@kI_^q$6JTDebl+zNVWOg{ z>O&>$V%!t=Xc<)7WZ6sq6wx>I%*@z7&US+J*ESM`3v3U?&;I$2Jc}+XYDQBs&Qb4ueeyNYDuWOX2EtK*>g~S>z3k%Dm zM?0<}4p8z2)9g47K5VaCwv(aInLLPDZ2m-BG|Di;3DH5crXl8^+}9esND z@gX$)uug@n)SMH`HdqEpqHnb5#omB0x{863c+O6}FQ=fOfx`cpoeLVUHJJ2~`<|t9 zVv}G}Q0c3wax@)_m9k>Zzn#|{1?(Yr>RQ%k^2dXTbk^lbs(cBSM5N2eE<%2Oe&Et_OxcHa0d;-7#!C-oFxGb=9((eAr zk_vJHRp6k^d*kL!?&*IaxqNDJAZV`Nycr2>_xg<+L+d|FR?d!h)w=V4fziDR90P}p^Q{T? zR5x+&sst$lca6?{s_TWzZ#!+iuBmxBFg%>Gx95~KF+yy0EBy<5xy|n`_ea!;Y#s5m zY?-|vdZN_EtDV;t-3h*AWM@k=ypt-$3{Mepi*TNPIbLMHS*fb07X&R3xCrj38gWkkp)e$f`62sGd$hKu;V>2-^X$)kuMiJ0!npY1tH)B9gXy#tPX!JPWAOClF_+oMX zaQ!DYdO&~_Q=_@H=+nNy#FO*2<8?a;o2i}?jHRQ$iMBew%d?eJi&TDtv(Y}|eHjYo z8HUWqyWzr@z%T}j&1625&m8xAUo@Xwf5^-nvaWJOk~O z&EQt?^YcSb4G|F$T4L;N7>VH66SnP0h`Lxh^?XS1@jLcsvJNl}yy*NF`bE0ew1*2h~(DPxHyu zwKbN>D&@(K?{S>%=9;d@r}^&f?OE*to1 zM!|7)PNbHZwSU}O>?G=&%HpMGV`sk;%-y;;yX`sxhJ;?7ds#~v77^pXcZ=@DX+*i^ z7cKc?NnR;w=^MJwo^@M%@$tD5O3v*EX3zbiLc_X*wvSXSuj5jI^fQ%iWb>3tX9nM4 zi&*O}@D>mhlnV%7k**&4SZvmwUwaO4SFrKwXn~KDla_;nW9(0BON-qkUm-q9Q!~29 z0zY32G(R*!Ucou=P=`a;E)gKffVV*<2dGv7l)QY9bgLLWJ=$Kh*iRO8l+Jj!{C8=I zftOd4$%6k`cvs02bShpAa?}6$wt64 zVqjn(rKP|3*`iQ^U+Yh>0gWHBv9&@$&uwk>SJwiR<~hCWf@*zuPXiohR=rZpKY#w9 z=L;12?CNS)b!|WZCJ?0JK8|2`LWEAKCBc`el*Giuj;HmwAk6gZ+)0QYC`Hw1^Kx-D zfmOp&K^62Jv`<_@LRYkmvN9gVP23iA1H&y3?0da7h66CznrK_kR6zySL%_$6F~T(J z31zZ{g@xgtJ~arq5Fvo`V8E>N0g1giUB@Ei4bcKRsQ6Vy^fZ>;f>p!Q)6;sUo=Vhx z@6(i*)b_za+jQL<@2t^vo1;S(gQ? z>`u3~cbnDre5>jB{QP{v9@fA8{j49C7tfep4F!=uK;2_x9J)#4Ap!4;_Q8V(AVrBn z$sWB!TfTYr$ycvlMH;;aJkZqE4mRLmW6J{CsIH=d@8<3vk(G5HToYAj?^iSR$so`* zMoSsK0nw{v(nl2IW}0u*>8%eC-Y%R<>dX}P(wrkjSz(+c^Ff`YmQ8{jF(JJy)_ zYAFOW%X@g#w#=4fv&O1i$6?3?&&CYc!0MxHEWJ$GKunOp5duFPmy|xFd-9M%_VMk_ zp-tc}e0!)PzV;5&5QEIe*?#fMC;=lqy?lZz)lt1*5oEO`oq#mlhR-jJ^gl}l!U2Cw z!Ica(G^%sw9U30iv<$bZa$dVrf3gY^240cU&CQLuG#8~8C3_1S8=sKyo%h9Y&L9tz zCK-@(E-o$&%Xll-f3sJ>ZUCMTET=pNN;l}l)x_(zB=IQL_eCgy^PG4To?@0@Ndh2 z&?8jlff^M>m{O(?4|TGvv!%%Y@j$K9NJ0X`T2~+R8wNI3P}@`EvJnK0-8eW%0PP_E zP0bAsasdpFN=O!LX6o5qdx@ony?u+=TmMM}@lg_z+WcuSCN7ZZWX40Gd~a}#2R_^) z9eKs~0t#CG_nqA04BMG{Cz$+YKd0z@B|+FP05gK=hT?h!oeB;8?BLmVwdO=)h5%W|3s?^BH$meh0 zRG$AU_IpKwd5w(MDyqj}bkwVm0Hv!-&SyRGR?PFHVPF6sUZ0bX&#$IN7@ZOjeC`1w z)AMAHz|+Of?rm6Dm`(!lu>$=n!aDc;cOZgps5Ai-b^whjT3DzeTtKeMg7zs(A|DiFNzG{>brPA)D&&#&Mx zOIlmA=I7^Y4Dm_aYLf%E5!u(*$JKtmx4*yA&GCac*tOQ<*kN!V&?GRr3R?L)73~NE+8x$H!(#`L(t~0m~(Lr$Etq)K1z`uk+6mL;(JCjmm z^rHyozh>qVOoLA_br&A5f))-cuM=}wk6S(qB4G*0<-2watw0vrzOcOvVTJm$Q=mNE z6Iuu!Na0k;wjsP6JO*AyM4$?e6Aq17lD!+uHHf*~{+s@upf4gt14=WXk)x8674fJ= z@RNld7BNLVPohLbMgL5n>nJOS73o){?;NBGzy5gSQU7aWYpP;qY{nmfAZkSK0&qk} zMGb^A$RL+CXMQMyb75+~7f%gmhL)8|Q`x-SNJ}S6>=$l4;G=}>bv2Zd8cte6O|41yv^4#} zIau8mH+(JRAtSW1vJ&`~Th6aV63cEdpP7`O&#YwnDJDAlQP6pp-*c8Ba9%)GHUb!F zXlXyS@-89CW9++~HA|+v8U#e6U$nc=tw+mWJuA>Deo`c&k55G83+$vLy1k@`VpjtJG?2f&_B95Is*`8<$eDA7B&#FK9Y;M{(DPE zMASJr7_J%*{*%+`!K<<|@Y7C5(j;$6mzTdB|Hy7sui$;Q?LShi3ey&CWq=9u39{l0 zt{IPA#jf7oKeYyW+-!O>78duxwpRFivCbeJg1^x#1_&=b9C}wUA|L=Lyfn;=S584u z{Y%3@##ew(tXc~Zj9#d`=!qN5#Y1l;fFT(Q2^yH>4R5c6mU}~BhD188jj^G_rJlx9 z=xFfZrAA4GUaj;DVG}KQ6@(w6H3Hg@q-ntSqCdN?>hmJ-e{rJ3DI(TqiHnK*4Q${<>0< zfX`HgEdvJ!9+)g>tO0HU`2r3?r^1HnZ(s71B{>)qU<7=C1r7u)FE0tiQcX|^|G+2{ z5E5z{A17^WY_uHBj~<%*Zr(}AYEZ4QSM~ESQvs|6I@oEER{sDUq+U^#L_|v3Zizhs zT7X*It3c~nnW>(JApjfNP620)KfXLa9~(Sw)6!NG$2l-|;&@-)$zYnDpEnI5=aybo z>RScv8Wq3^kFP?;CMSo28_@T6f3&kZmV*E&Lqr5&n;TdQX?y%G*_O_6$wIhy1>P<$ znpf>+WoMfL@WhF@ajjKDtmFe`%2U=E0UTvD`{SuADuzCB24t*SedXGd!25LW zpd_tTG!mlSXy<8I;`v~E>>)-28d+9O4z2bQ6=uLv2absY-^0F%^=5CGAVtixOXw0X zmLxy*R;ghoj05aC1bD}E92{Xp&+bxD0ZT@_e7Pn)44yhI9i2}}VGW7%%J8*V31A)I z&otG+Is&=O*oa@1Zkd&4#<+HYPTIEx1y5p}_-2c#pXvMbqvPY+mIHOpYhy{5X`qcD z3TCyR?(D>ZwS%OwKbxEEhx#6#tBj9F0>^@h5gB%2T^&97G{cAOqp*E-fp|f;tZRlPKm{y^K!aTZ_=q+(@t1Nx(3!GCgf?Yf}RfZLVaPnVrqWuBXgr2huQF+uDM}z8ciTtZ!`S#vX3gY~`P>%|_kf zXUo40o=2;xT<25J+}TRW*wE&%df;)gk^?%#!eAO$066^pLO&QYh?t(T>sK}eQW`;+ z@_--;@;VKQzcSHiOH|Wu#3YDM5H$`AIL31R&PND)R{0(?p?{|M?ETFVC45T;q44kK z1D_uQyV9y4rw88j$Z~+zIWdjciQXa*m=wA;g}h;?-RpB+9SL-H0~Zi>%C4`SC4?wt zV*mRSYb4)O!T%v8g_==0h1Gef>eDBDxJsBhEA#V1>t>7{>8-s2_JLriqj$#AB>lPc z(qWVI{vBECi0oI( z?rON-Dk|DRg5y(Bg~Gfg2bR*&-R%n^5jX~?X$$7w+BhD&IjU|OAqo_-P1w$~! zIzl8hA@Bv|Kqo3n1svGHel-(4&E>Z!V*j?T_T@V3cBU&O@3%mXKpL80=nS%*EG z=ryl^3IhB>`%McX&;!lh7rQj~^+r7gPNqCz*g!1TUadU@!-4I$ad%&`uZCUE_VrL{t5s29A-;atu$TkF zO0ckda8NaETLCgbRqnVnV1>l1(`Mb*tCkUb<2yb6Etbt(w+6O9~Gsc;1(k zcP*HffGo6s>7_Xbw&hQO74Q)3AVftEB`_qwmh=G~13DZ3?p@Xc4;}uSP%qe@$HX-z zT^C_W{jY@yk{xPR28by>?2Ukwk#>Q~XMng${NgA>e?zz4LvVrf6Y@Ru%v?t}LnUMa zu=Y1QJBt8Xie6a5xN#f*G!6Dv8hUyZh-H3&9wamaL>dJ|i?R$(f`JaHAbN`d0-_kf z>pi@^UYN|n!if-XSm1sEVS#q%8DeZqE=br( z*hEBcCP8ooJ6r+Jd*U9W4fL0kEvJWDk?5GZ9I9v#a*n`&hhk!ePGWF7f`WtdfZ>HK zsEksRVV@$%DXgIHbnGqYjgSz(!T~lm0j{R1rPU@7WMGC*pp+_B zs6xJD_qT`qLpQ8hHNa2*1Yu8*U0$4Wpe3oD;E-iGz30wiV71~W32JXuDKP#tbPW_# zV-!Ko1RZ#Ey)Ep|F8^F`0EVnX)i{B6?oc)yNqzx)_QNmd@E8#3YBd$Eu=hot{=J&# zm3>N8l_1c>C^Z+*SD)7Lr?wQ7l<4g{hpDuO5V83}6Y9II z-j$;`I05_iXg-)@c5aTY0=-Yu7;EIk^jgf#GG-yu88*NC@7}#j7G~jfH0Q6Os!Hc< zIN8+|gnjE43gVp1uV4Ff6?`Nl{Bfz&o}I#N?{wXW09PIy^TA+Jjt(%8=Br_`F*+tj zO+$ltVOtfB3>L8$K<+$>GfK@-P8|Zcv+#-s7tCq4;R-~_6*dMLE30>f`%=Y~ZES3~ zx?z=^!Jy7v^S{&po^fY;I~?^AC_fVuQ(!;TCFRtjxg10a%fMjdQITVT zr5~YN2HI)76)r9=7XSX02EQ{6Ce~!NGfSPfkQ#;MZs%D z?7Th^UQk$wHan%ms1?CoO6vReP+n0H2ZUQlwnF?9aDVPW;JOO&j$#5&Am~XXpbAps zbRn{ga{wG*F#ME|NZ<*35aXdQvU7Aa8pcA$)Knt8y{*VP?0D=0Rj?|tVcwQ;Er)W?`eP^lIJKZDYZem6aC^7HY|cXwzPamE#}c7 z&=2X!H}`$3`+BWOcj$&d%YX@Pu;~G28!X1B6N29b8o8k9tfi&JvZY)Yf;*^3Q_r=@ zS~u?YvD_38oW)(*T3UW+Bh)(d3>_wlzKL<321L^|OX;2X6dCCY60oGN|HISI>6Ue} z!1BrKSb1ShA+X8o%PLYeR$9?6aKt^_f#BSC4U;|}sXE1*wxP$N20q$s1J`A~sUu}SGuVx`z;1kk&jMnzB?h{5WsZ;SvimmRulzSzF_02hjA4x# zy~eb#2Nb>yY{4i?a94+io1wM_v!0T+xrv?qlk7+bp+)FTSvzPshZB7D8Oj!jlsd#-JFEfbVKpCR>*>=NqCogiT;4^k~)> z@7s%hYOqM@Sy*l%uaT0HqPg}~{b|vYZdo33^q)zzwavpH0-(bb^q*pYX)HmD-|+i4 z6_D&^cnc;#qHNS#Emi3Yn?ZcRXdI23iqBtxvoDz(t!n+X>C9vFf4IcqvPShDc}l`g z%lH}KPVRY!%SMxAY5U{yjf^wkN$?^>!R>`sggrHbSAHu4R}fHAkXsZ!d#2TV(+(l= zLFFM5ZY`jBmffd6*}bxUlanGh)Z{1ZCLNueG&MH*44;oVFXx5un$6}4(loZ8coBlzndgq)NTvgnENyZ;C0N7H5i literal 0 HcmV?d00001 diff --git a/static/cards/7C.png b/static/cards/7C.png new file mode 100644 index 0000000000000000000000000000000000000000..852f92c5fbc713b70dba2bd41e4c4b48134333a1 GIT binary patch literal 8756 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 Zt0R0v2H~_k;0X_qyo`!;jihnVe*uc&&MyD} literal 0 HcmV?d00001 diff --git a/static/cards/7F.png b/static/cards/7F.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8ae7906b05f27473561e30b4fac9af311ab5fa GIT binary patch literal 8223 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 R0TlB=5C!!&<#N#A{{`_as=ojL literal 0 HcmV?d00001 diff --git a/static/cards/7P.png b/static/cards/7P.png new file mode 100644 index 0000000000000000000000000000000000000000..da7d09987d8112d2f7605f04cf229e52d4f56a5b GIT binary patch literal 8764 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 literal 0 HcmV?d00001 diff --git a/static/cards/7T.png b/static/cards/7T.png new file mode 100644 index 0000000000000000000000000000000000000000..317c38dd7ce19f84ecac10eec1d15d1fd033e7f9 GIT binary patch literal 10330 zcmdT~RalhKx*kwzrKLee1VN>wQ^_F(1Vp5imM&>gIs`;SxF)0CuJg^_ zSLf#3AD#yhm>K3@YkhD2K`P3!*YT+F5D3I|Ih2$de9eZ>eH<+K_g-v&I()h6AR(uY z10NnZMuG4>t}W`h0|IfQ0sV;)b?*iZ{E*5~TFddNjftc4OM7F4v$He1xwVCZ;Y(X% zb{l)s_ze+i1mYG#PU^9`OTv1htB$(HWs`UzC+DrZ1m3rTE0D}F$g~FwUtZl}7d4Kp zcy8_=r@(IhyvD(lic(LB)vuDNJo@r7eseSY6@Al7|5)L} z396Xgw^bYX8|90qqLUAIV=EFIHUvqQda3^~A+BH)A-W3uMF_Bx$q*>)Eq#OqB7^$h z-78yOh<^y8(IJz}e1bnD2(>exx#Svd#7~4j<~wyZ>CPn4?qZ8)0)m3?Yl%pTwL>#9 zm=Xl+FsVbo3b_iu^TOz2K4Z90wYRn9Jl}3&XfOzDKi*wry?b}5yKp4{5hsr*!nCD& zhrD|ir{?^CMn_jy`izc?@^W^%K47Uomx5id66efwd6E@l3-?{QS~l5YN1~*P%0~?! zBhHRQ;ed}HKdvZvMUnlvg;*Lc{HFR|Q$yo1G6JXM{ABgVj0Yw`{9+4BvQ#*|XpXb7 z8sY)QEheUh*N?dNo3kxRsE|dhKW8>q+mkObChMbm|%xeDa^-})| zTw_pFe1xQ|^$S0#BKXX@{){kkT9OG;+~()!_c&SpmViHAYQr!yGgEYWorX^e)PO9m(4qtb`CUZiRvo^|U9yC8t`+_?{SACPJlmtKmx)EGk^#YVSm`$y zf1{i?Cqj32?ANQ+vK#)qztVWaM>T**H$(W%TGucGrvXAoN2lRGKhwx~T}*v?u-+?Y z80{uw70A}(>w8ti<4C1~Bf6E#Wy^p|(xC6L;@jWREk-CMrT&XfKmE7I(x#WgrpbQa zzOk_A6P(uOF=uJ!YumAB<>cU1yjky&qv5lpH1#4leO%Of-kmNR5g(sB9*trO{P2M+ z*F}a-h9^SoLY;w{8c$qY{AaLf-%BZCR$@jmF+G-0(f)^u(qs`yqV6|KZ6*igXt<36 zDWwOSi!BB@-486UVq>SjtoK)8i!$raA(siK&mWZ1WDs;(A)9cSy9nHGbmz`<;Yw;oM3GrHvR3cJYqRRm@vGW$Uv{K{F;#k6nzuSc5m9k;9k5Q<=l9qh2kI~Tqa1F0UORQveiHZ5FMtn_^T(SK8{E*V7 zw6)T1`zsnc<@VAn?bOIbQFp$Bjd2V6i@d!1Qc_YWd3lO|vKrn8ZuKZ|Fy6V-XcWJ@ z*lD=8)Qu@)EaV-sx2ml7yxx#$j7UAhd1I{G zUAyRS=0#VkWP;TX-3otL4f=FqiclG!+p=M{C5!f03p9_VsVOM1kv$vkuCCALc_W0K zH?)i{U3Q=ABKi3T(@s~;&OFG-$+syZj&ay}nmG1VRaFzPziD}A{`e{&B(y^obfl&2 z93+K_jg6g@HtlbKY;SF?x2ZY*8flWR$E<+$7nP|7yX9SDAoW!>U1n=*YszwSanW?2 zA=>~sUheR%qdqt{_g<3whG1&&!{9rHn)P*c_fI}qVJNKF;LmzqBVC@2J_!uO$vsE1 zC?_;OH`}Z}W$)|`>}-pD$QTuOsnI%bub3#L@h-4Uk|^RPIr%h-aJt;)>CMp&o# z<(Op!oH0f=Hu-mf4R-)edcQs4AGMySbj2YcAiIU!ovzvx$c@2{q+8c{5{5c=<*eDH@4Jg(Vs&-7gVc&J1BXUHozFSZrVcRR&7 zPF@icGKfiOXhbQG$TE2PZj4t9z8=j|z1`5**uPw=wY$6PbYRR)#b-0|;j2>oz-u^7 zFY@$j^!Ah~B)8am;QXx(7s|3IeNd><&i|XEk=s?_Y$G5nT;JY)9nTNbYP3Y!(UIr7 ze$9<+_24VmH&UEd2e8iXlHt(`zagluuD*Ns?w?=Aty_IhpQOT4e?&3CYCqbXsM_v- zrvJR^d`op>vL^hF!j}|_!SA+?j=mKY!en^YynTFr!Z^*%&Hd@`CkL#J?`B924<}Sk z5WtX?l^v`0q=5q~8_ljeH8X=5B<0Pl6n6`W#Ej>&ni&gex~9i*=zh4-UvAlK#Qm?O zWxBDHF^oZ6xjmkr-|ZOSJ>?qyO%)9d^7XOuUW4j#heZ-%RYgStR~Hw`{pIy_CBPVx zBI~aO#;rGB4;7?#Yw7ChnxCKSOG)hkFVM7=y6&3vnDL;$iG&Z;WI7?o6nIDYYTslz z4l6_U_6PL`vr)-no-W%KfiU);BvLt#^(_9p!}uH-DfvYFyl8?eN?sbKmFMl5OXQ|* zrW$L$ZiQx-5cO;;M-5N;2EuHt%uZcJ<&jbxPq*+*5)z3!ckb{Q{6R#X3knPO0_eH^ zh&Djx=j0$67#I@e^R#}}?F3%`n3SY!ZEbDhDcAo>r^GT=?__Ve*MiK(D&EKEN}`CX zT7et&42&OBlze*_KPTtMwDk1-o|=o3RqY=rf3eQCHbuQv<``5sgZOvSN-1ROi&E?7 z^gl6VLaB`pu(hjN=I!kr9s5oT%1>6i(*q3l^Ke6Dc8^E`OsuX`^K=b6+uI{E)mnxp z8-hq(^OFsp9EOYc2l)D?JTElyxS2W+Oj#Vp%`XFRHt{ELlzS{XW+r%mEQ<0dl z%ZAgF=ih&NmzA}4x%b<(?e=&Shfdi$8h-1g4BX)tk+HF?F*e@=1vmO`u5$E!l$nq^ zIeK1X*c7(Zm3l>gV;_Lt`*Y^)*Lw?Fdxj|m!JDZUr z^V{0bzrJeuh%($l_7oNIoEeG|mKYXRG7+NuZBsmO5LAM~e|R0X0uE zl3{^}p8iI8LhmPR?SzDc6qUOv>TC}-Fs(<5Sd%<<7}t25uvqsOadYYHFYO&I1_U-a@8@((tboCl8eHS`2*nRahvUy_*iBsM7l7LAy0W zqM!paF|pN9!Q*(n@hU-!f%~6Yj7*LR@bS}s{o>YJ{cBt2`C@2va$-j0njfwaG9+3bP6*zG3oipC`s@}SUyvYTF{=!*w{Gec|Uba zOG_#)DKllltUOy(&r)~#enTH%oX@kG5DE@8GqbGP&R)P^G>JDhHhT9ht47G@MEwSI zy02GB=@g4iNN)f-O2G4kXJeuYpMrt{tr4cDrwVSuA@8hwcnHQXudv5fKq)JsCj;PR}b{ zxWta8uB^XJ6pyrL6cyFoTq`i`q_+sTLygu@*%e*0_uHhmB92R~$Lj$7iD+mnRK3bR z=IK>wbL5LDW*f4F4<-j%zLKYt+;U^qEwxVUP%4$rOaq+Xnu+J=d(G?W>bjgL2Lv)+ zW>-HljoShAZ&5jD4M#HS%NK275hTf$qTB4>>y`ThFNCg$@9gYst>pgD=Be|y5xYEd z7^`r8!cmozBflt?RsGAL7SoJ}x@s>WfmXSY5bydAq^SKIDs=b8c$GVa*V#69vb5a- z@R8OpqoCSZ@v|)-X-R}tVoVI>*Og7@NI;gd9TPzn68sxH7w+KYzX@A~KftGsmMo7j=5LsXtpO*D10~Fj8vM zX{u@x5f>LM=&+FT?1x@+N5^+wFW85)v@}jY?Reo_TSit^+;rLSzk$TJ6@Rb)`}a=* z#5!qU?%Hfvb`>jS&+AHZ%@@;K|I=BXtz5%vMVbqyT!pln6F(t z!!wWnY-e}Z?()Jj#G~x@?=-vFzar91?1vlUg-87sQSyHN*J*ahBFwi&lz%%et6Axn zs%&o>VD@%e}%-=@jy}p`mZccwu!_!M;4f!^5L_ zbo9k$nOb%RfPTnj9M{VAO5VrkN3-F)UrkL+(tiCSdH(!)nfu}QiS3@A9=G$W?NbyX zQrfDjwZkQ1_eJZ8utTI?FG*JbBcys=UQj+X0h}{S(a%y3rqFY#{gg)a##b5%RKxvM zF*fZX(*0;_y3A!8379lJKko;JXQ?tA;KX;nHTpLAoBuw6qXor8lBZKnQfSgHVQi$pS%INQ!_HIj{kNdbqu6Pzj!$uuX8!Ixk>2d<+XnC z<-v=h&33e6#lXN=>itH@AkDQ#H1VSUhh7zW9}!0tA$CBlpi8DIDE;YbTVspj;`wb} zU0$5W2s(UKKKZU&!D&17$i>ZV=Q(Y?@{~r##l=Mow=rHaI~Bn+#UEqN`+h;6U+!{7 za9h&<$9Jvzkk<3S)%|oow5AoXMNm;u!Ta?Fx#D)X5!&30O1BXhx~-Uj+&w>>Gz5*u ztLzQ(4~yq@9}b*@*-CmdPhU?wJh#4$YPB#ZNgdS2&FN$J`D zc?^KzHW->%t3w#d*{ElF#JAFZUn9*%d7Q47;^5;y6!e0#T3|KG_n2ZU=N`PQuUfX0 zqM~AGq_IetMCv0&#SdBc)`qz)$;iT)n3-RJc@*%v5CQC%T3HDOKtu2LVLA%tu;lQ zmGNMg0VY<~AZmVV%N~*dJU{O*9Qw*2CwY9|C=)=MH5#~rozAlrHkyA zQ^J~Gh4Us7G^(JWAoDy22S?Kfs)w8&N46j6gf%yhd~r#)E>1TM;oQqC?t6U(V?;nN zGBh)sXGO)VhObp%@V*^LYPAZ3-kK__JN^olrumF-+Ju|)tQj$#IF z_OhaxmE}u88peXwH$7mv3}*j^4nbG|7@(r6`W^)KRQ9)|y4)Ytuhlw&>x7H#-Q`X0vDeS1hQDWeNoni@6E8XwuXi@NA*!! zi@pok(j~wJtn>MWg-<%{rCM5HVPVA=W{Sf`+_BvZnvWl2IIWNL8+lc^?WfJmyke}z zi$q_MA3g<=k8fb^Y7}?oxeEgM5@85w_SYcbHL-O;hA zWt%lh-g5kR@n64y+~b2$8>NFofxjyp%=;IL)FdRYy3Z#-VthEMaa{h?U3&|W<+{7z zW|5;D$0O%{7Ro=-C0JtEbYo|4k7wl}*a0{&raXM1GKSrvKjbrK4pLtFd_K!HAkKV42@MdIYrW&_?8R2>M z?3rSM05K_xGLQI@S3%JRNl?ZBgLl_ZqiFWe)8Y}Zph6bv+l_xiY4&^WQ{fxnK)4w) zkaM`b{XR01G@Lj#TsP3ME9G&56%1_0X^$8P#iNai&AlGb01uj75DF^{^zo+%epQ+krFZy=AK~We zIvx2$jBC_->d*V5!J3Oki~HHx*)if?)wQ$02Zd%ES#e7fRl>|qk}ONc!M<%bkUrU> z#(%crNvh5ZFZ8f{88U-FPz$aP#BbmBfh6kng9^Z~&#|#B7Q^%N^L;g5UXiQfM$JSy zd3kfZSPliP)$YhN2n+CT-1xqaZ*OOp3bJHZ+ZtT&@zGJteG&-DMt(cp`ytWN-kx8) zUi^D4Ee$#GZ(gFxk|jSc4*;6rm7$^CLK_u`Ho}gM4ztN>(YpHj?Y}fOe+CCB;Ka*7 z+b92_WN7L91O--{ijUhm~@4(-CdwUa+llws&@Hkb4@`GG@ z_bp*znxLSdyZ7%mz{A>edVR17w_vu?z{GDI9Ps__lC-nq8u+do0@2_#Q0&d^?S26P z*qB$YaKSYy#_`~?Md3AtGsxQ77SuXtiHM4#k0)AP@$*xlsS(T%`qV*eR69CK!^p_! zvYZ)BL`B6qGDq%oq3E_TCir@?x~jX-2ZRxvqX?OFE}=GdA)&ayz&Gn7(hz0Hc%Gb| z_5#r5>A0uCNPQ|TE$!A46%}RWuG7c>V~|l(=Q!uVI_!Za3=Rw96I$5mR$`BS3Jlo4Qe)Ci z9cdVaVj`oXQ@VET8n51gkGD4}U$b{>x?br*1R_urEL!DY?nK}ojP2a?^vfM^=&+q# zFlgVS#jHknK$(3UPX7qT^YywUg*TvBA}uX#Td)Q)LIs6Fg%U=zMss|FD~vsNp#>NCrbCX>C zI93`}sy=-pX=rG$EqRvP?^Y$eP%U|R7uzs}Pwo~uSj3HG)75!37&C0@oEA>A5UWm+p+uHr5 zz!8-qIP~;}|;j&HMco6v3z)yg0 zZaxsbawe*&o~>RtJUpDn75!&&ljAzAK-Ygwy7ji&tbIAHd?pF7(M|npl~q;U5W9mx zPwNO)XN!9E_XAbJ`jsnJh#45ddwSHsIvBt-Qi{J7G4rl#;`^xIxR2m674wku3g0 zX|mGwAu;g-{pztbEPERpn{-k+9BC61W?rk2zC5ic`8!p|3-Q4E(&&}rI|ucj(QRf1 zW`_CDK*I*|gH(8LdaIfoBXaL+7?NgYXS>TCOe1%M1qENu|BDiE*}C;v{ti?XS)yM) zeZoYbMJG(Q5hkK)kib zESL@YU*-o2;5`GB&f}H6rC9ZyPI0Xwvxs5I7Ryk`uK;asb8!(vL*WN0?nsGM2(VDP zX=jq#ak9${E)xsO6+}W}BHC$Hea#1#Kl3g5ZC!uvvxvmR>x6`aSFc@r3E>b>Q^?(Y z?kKQH3c~7}aPYTwb|irLhylF9=!941VE-V^?5f^?k@^7X-|8GA5}kX3IEN;q5p>%0 z`g&+rmkI%cm`>MCe{k)qZF;(kof$gK&COlHyG%?>TEh3ck2bw7bDc}(PpuFNS^S3? zUkYIKs{~~LJuEWK8Wy)pHG*(JCKamj{QapA@g+KXP@qXwM~9Z1n>&vvqHOH96Fw-m zK84GLcpHKaq?yv1T1KvBzQmh1C3T-F0c%5Fq(B%5T+VJgHQZpnB4EnQcto?1t;tbIo`Zqalkrv#G_?nS{=H0t&Y}_%j z>D>l%%@G0~M+JcqL6Q;@nCN)WvHG&EPQo`JU>5WyQpSX~g2?>M8$Pj%BSXi{2|ADt zIlNvl^H>Cw@0OO#GQNHdCQ2>Psd-BW)FtiWQr692#tUa*X&|5G3%hPGfPWBCs@+Qa zy>@>9d}&S1n^-q!o6QlZw{OLM{rc6FAr~oBdLTl~2=oB}Ny%?b3#@Kh5)Ky#!7s#c z7)YK_Hx9KYPo7M$(B|F)i+OZ(q$Q%=HZs&WpQKv)5@|dnqL@JtAMn2|-T$i6{vSQ) z>1H$uOs}lGJf6I~yudK@5Ld5W{WCfmzu4R`JyGS3l9PK32ZF`j)YKIHoAL3)#pX62 zL>ClKS=DMVwYkrJe1%nf>f~uL3RALNPbi)-Hl||{V8aE@rO0Lbl^RaOwO|F4R5FczxgVha0I9Im_U)`uo}mB zcQ>)aLfcOXsTpps3lFG@Rx(ddPtmoPW?-|x8&MWT^h#FBRLjNGb?44Ch)K~f z^G!LC({ZVbdiMoBvJQv?to;oDu37jm2qGD%X|{J-Inn{+0ES1-!0br)U|m;HSHFsI z*=b?vF0(VFOOA?)8me;VhvqK?b~O#6QS=|be!UR{1ThiOExmJvH;O+s#F4S~!w)^A?8{Pjpt zw%qkTk|5s+uS?JT^>FcvEYT9%X$h+nuufqfoC zsYQ0PGWqN7n^oUL51{2DC03P|zV_hxFJCw>a$-RAO6KO~|ItN7DJk!?ORcT!Ipm8~ z(5WyvIl1F>-8CyWkh2=<>RsUPP^l_0^G`F?aCfBp|LS|4OQY+PMz+WnvyKEoDXAi; zdaT?aks`l&Qw?%8Ib=l4JlZK8CS|+z##};Se~Xv5|2_>;0&uXduI?jr(MlYwtdAjb zDu5@09gLrU2q_;}WA0XeLP(O|15OrNf-l|z=35A{X;gV8d^OL2;+TMr% zf=D+wBqUWc_rU>F0s(NCwb#BeujHX@CMwO>iS|$m3Z(gYdwY)E|G3FhU*!}ci}%`C zuIe;d4p8{!cqNi&*VNP$OLj@N#l-R3utQ&hR7a~c=uh*+w9o9o<+5l$2Pc~rWsHZu z0|D~&Th;IYI$B!JmvvV=4kjihgvK)v_o*d^f9Q)BSqz31R+Yo}l0a@aXL)&KEAroh zrQ-rX3foVjc6fr)Ni*Zmq-00g2TuYx+z>rLV38Ur=D4J?w>hbAGbLvwAT0c!T21(d z!ZFMVQRDtowzj^-=_J|Q0u}BX#GQ5#$&k9iO0B4bty3mnjWGY0f0sld% zv`R;KGUww3hXBdU|?Ca2yk>8aBVBbIYApZ|-kSPA&y3LrDAc=TB%E;pPXb zwnK28B*fkCuV7~Zpvicaz-qj`Ja@LxObiU{ND@^5vBpPj0g_~St|d}Ris#Lmmd|m{ z>A_(B3t9LZGM*6Cg{VD!dM*2D6{$Hd`ks}l^Mg^cn>S^kgvo&7ts9`g9J17r>UkJ$ zD!Px;Q&TCT4?jmmb;Aq-*$0E8k=@wX=u4HvrsjHe6&(~;9u#QFLwkA-5X1xMx&q-^ zvE}e5be%;l>c(R=S)Iss?;aQ-NL6Lr2SG@)3Jb>v2BMct-*cZFt~Ob_$m}r$b7Yj1 zC>Zc>(2?S4C%fJ287cF+td{%1%Wu~84#>oO-PUyxH16Eel9t8!ixNxNgOQw{10mL` z4y^a?)kBpT5gGZ^VglUi2U|Y| z1}IOJI=p5Ya3LvB{S(*##TAL9KLM9T!_eWRm(5u_FT z1hv6(psi)$y4cy4q>+&k4pD^bkRR&Vcb%5wo?^)3lG2Hj!SUGtx(AIUoOjo-zaDE6 z8BpTg93J^sMMVL4YX_6waq#MfIFD2ng}JIKF=U$pqv9S%T{CvM0}VZlp(UJ5za~QZ z#@IXJT=q1ke*0(s9F-VftwJRxCQdIew+v6Tx3@3IyomM5tY5Tzsh0&R2SEvDPs7p* z1Nvaluy!S-ekY@TsBem~b;rMqEwO(8uItNwDmV-snZer7&oiug3{YrhW_KamGb$M$ z`f0e@$nz0mKS@BYwvrdWjBq_XJ+B2ei@^Iw6u`|Nh3vXeg4gp;dfYaUnqiD=A)=rN zfJimcYQk;xfnu_l?w>5hCTpo2mAeHNgY1=;7pG9KV(o%(cnP`pP=zxGI8mt&Dq29S zwmWkz)TX2!WDviB_#Rbfk*SK)_`zqyO@*$l6q7`#xVX3k9G5cyRF1z3+_WzuV*d)k5&c2&Bm zz#VSs;Ciz*v=YtGk9d`d=s|ekAmi&;bj8-diR;Tdauu4+;?{ zyQ_fVfs;bO+@aLMSAtuRjdB0)?e_F=c57wCcT6+f6j3c2Hc5{h#2Mz4Az~!+;)3Bi Y#@rp#Wg`l>4-g?Itt|Cj!od4~0ByTv>;M1& literal 0 HcmV?d00001 diff --git a/static/cards/8C.png b/static/cards/8C.png new file mode 100644 index 0000000000000000000000000000000000000000..d584d6eb43fd4de4bcaa428598b7e50e672210e4 GIT binary patch literal 10414 zcmb7~bx<2oyT*fC@gT+BN(;0&#Vt@=id&($Q=A~d-HH@wv7p5ric<=-xD zCZ(W-3HX|+{Io;RsMX7Lq&_0)ufi5Bf8xsdxmjEoo zNmunLZ5JO^J&FznE?`$Kh&nSyC4sZk<+QRPN70Q(L#(WdrkM_D|5S9UC|D*bS+Ztt z&2E|TH*aNCEjJIe30)c@RDOeW(da;d+WwzuBLk58CroS>(7mTS!jZSp17R@OSuscp z34u|C+pw8Rv1wVe|?2l&A~)W6OVy`N7cF1=G(=s^ibJ> zJW2{e0ewV@=_!BJXgQSe@37->n1c;6lq(%RL&0ae;D1YtlEaB)%6#IZrW{MbS7kLq zldi;K)1ios-B>lhZ#|lW^l*2o3OYi*%8*#<;V984aXvywP8O>NH=6xQLODF3KH8s+ z?2KG9b#?31b(MgV=l*6xuNf2_oeUtFE25M(x<)dqRLt#n0lsEoX}P(4V}smCqe97V zA0g^{arFAv`a+2LjYSjbFxsAni*3Hc0=UpqKG3I*bYzqyDH0u*!t`*d4Rj)>2?`t> zR5F&k3!v_bWl`-E+S43HMgtvQlsApt*$8%I4gATLa#b%<`3egli(`DPB9@plNm<^|&_~9lcOe(3%0DdvBCXp>de3zpidnWrmcfgNI?Ym^^%ka99 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 Ua5%>gptlgDAgdx%A!Q2tA0I#nVE_OC literal 0 HcmV?d00001 diff --git a/static/cards/8F.png b/static/cards/8F.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe31580176967059d4cd4b49e636a20ec0e9bb8 GIT binary patch literal 9843 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 QuhJnTMP)?33+ulBU&&hQ#Q*>R literal 0 HcmV?d00001 diff --git a/static/cards/8T.png b/static/cards/8T.png new file mode 100644 index 0000000000000000000000000000000000000000..08f5c0ec0679ef747e141cf109acadf07849804c GIT binary patch literal 11832 zcmb7~bySsM)9yEjiYOq6QUZz~($Xa$u<7pZ?(P(o4iS+Sq`N_+K|tvg2?+`54r$Kp z_q=PJ^?m;x*FqLMp1q&@o_prHelwv8a^l!nBv=Rp0$Wl7sRY0C;pY(Z2K-N-_%joJ zVK@s*s$jxDA54=F`1_WFgr+kBfzyuqL5riuA%zEtT|_lpl%0yn`VFqZT80-=R3>wCz2C^k2 zk$Jz6jV!Hh_c$Kl8;_=ib}l}Zx4|o7`AR9pUT)nI#3J#i-0(VDwlrSC;pHDwy?331kfRr(ZR~lwNyU$pt!jE7#IhVrl!NI-YfBg7y z5vkwl0c{k8VAR6*=qGG!_pV>R?g5W%Y;4T^{dsME<#r)n!Ce!@O%gZBy*Khym>aZNxo2d5r6`vZ!1(C+{b7+8P~tq5l<)XVN9OQV$tzZGGi< z4gL^DA~DDXeDdP1RaaLhaM_a^85>tu5I*-!Nlm?fMOc`h`{Dh2e3=w(JX2Fssh+87 z>)=_xGwh!~f7be62|Sfc$*U;7Pp>vNny+l5d-pk;M!3sTcU-Nn_Q{(76*^I2VRWy9 z6|{Vnum_AQnN}Em#hEJWoJ{-xF7q_)#)aJtI#Z;qYq^JKjR;;c1@!$4r^Uz4W z2193&W~IuciK!_p;;Tqfbh8`uF-f<;3^6Xyo^ ze(YgqAZ*d^;2^p+rO(lU!7$`E9RnCa9PdvS=qyZ7(EEh~E-LC&wWihTLS zZrWjOl=gK*^h}-W?QlY7v0S;-xs?@6YisM{(^I4F547A~2hX-IcltWQ33vPXw$pvj zj>@X5-=?OLp8P#i_=3DUERKm z2O`)i>gxYFJ8f;k#nHZ}2cK`^lJ9J#HPO=1W$Z3|FO1Zs!XL_#jLoa68clCv(r;>L z(w_{ks;y0^v6&E_nVE^epo@{P7|IZJS?I*x${c>_>dJvlA&|055u2M!Gu_}B>n?cM z0Rc_R&7I(Qp33W*k&!|9`lKgR!hP$vBsn>`7IpS}395rq|BG-bDXD{dpYe^1j5N+B zntZ(r^77{T#C=%}S`cHq(GPis4KCNHAQglf^QEMu8;46yJdGDeQ*^eJl$3cnIbyhmm;R#{ik5YgHMWK7v&RNM-aXd(F6eb&@%p%^ zT4H2mq-%Is$@FDtXsFaCq`59QJK57~KMQ$q${*|2xeT4gV+3qX*XOEV9fayI(a_V= z7aO}fI6M!TJrwP>!nFEXpqf`uprrM8em?NANYFFJ%F4=b5KAgG^=_M5A3l62b9{S$ z(o8FVq4o96hn{VM@}FJ^nVM#g9Z^$LdtFRFe^oBAJ<}Kt=`oK17Z+EZ?}{7`?{h^_ zULGdImH8T$wFzsY+|kF6A5rhF>twDr#R&**9D2 zI2SNJ5sMg{tg-%8Lifdr>wXX}h23545;(rHXY(Ak%tHs^B_$=D`u-OkqhxAGadGSE zWCo400Au@Onx{{17_poYJA@(w-DiE(ammYH$1Fq6A)ydp4;_WIUHBf*VNs8aA{h=78>KFHX942Ie z-JyUsY$a)NQ&?oADqpukaAxL{%d^=l*03%OPagR|B&Cp#&x?k}MvlqTvoquGQDj=a zqJuXh8Vp$bbMkYqvu_ud=H(g8M=8`K;4|7u`8HXb-`AQs%rYr{_#Yr|KOo4_FS9Y*tiQkzm~*l}KCV%0 zM&oz3$z?TBkv&<%$iQIH^`2TqTU#2Uoo<~`t12WUdVNHzKWuI+%b&Xa~FwN`V)^uKPN5@-OBg@l+ zRVw^YqH3B4;j8uAO~#vC>OQ+2gb}{iUykI+WRE&OHZ$4H*&nnGIo-%ucv2($N@IB@a5J_qcjchBUC+;-aZqu8tz1Ga z_zLS5Uaycy)Oexn=*mR&jymeZjx|p-l0V&YYj< zu{E|+1+E7p@`9??{%1$Fk*zt|+2vS^eO$997eQmXO8HeoM#NC!il^2mtLf=yzox@w zway^JPtBP_s;H=`8LMkt9m#bjNmjcpQ|G>2QuBhDSw7dv+uIxC`gIo9n{ZUD+&^1o zaD;7--ssRyDUCmK=>eI4p_1HCk7W-|}yg5g9nMoHuyY-li=}Ft$ z+i^_qbSq3kC%3a8BN?aO?w*}ZQ}q?F7|Fr5FU_X?_WALksbtnuBL3-Ljw^$YtG_7< z2?)|6O)ag0>6x}gRM|P+ zH7+(93OYacDdr*^(^XSbql)eNF*#W`G$Jrn=(+zF!oEk-hu7Zna=`yG^XKvJ9(5BF zDo~y>>n}O&XNnH3gM))dLhsQK2!cvT042b$c5UIX)N&-pk}SBUH;F?!_n+UuC;qUs zk>OzrP^4O4{`p`1^H1sQ>}opu7L04%xUEMQHw-uJIzz3ct1An2*zj=j!Gi|`#Ke*V zX@a?h>ZNpB+vDZ0LqeLaF1@RhvEy_F1Oyt6GF%szmt&z0((7+-Y*<{LpM+_wZ~crul9eH5*%Oxq`2c4~dK+lSbJ~#Rr6h zxwXx(=AC>pe6DL*@q!BdNUgMk1DDBK$0v>dX1ovnCfg4WeipH8dvl8&bcxniC+bvg zM`8PkmyjVXSBJB$n$@vM*h4PQ_XlpcZ8x2jWHdm|#O`)-a(YHb7uIf6K77<}#L~Fi zN%|o+HZwk9d}p!iUJ{FOP&c^(!-J6zw8|u*`S6x7UMN-83LigxDmjXt9Ugu^wse8O-xjP>GdZlB|_&(rgf5F=b+vkC7FEK(l^(t-;R z*U@?Ccl_sO>fdjNp%n`~&1YMD*F21flC;iKj<^ zCDmL%{nh#V;MQs?+*YQowj zyOGUi;Pkbj%b(f2EttYD&m~pV&rhJ~d{6qCM;5u9sMqO%W%kz$Cue6@EwxVS{QUe7 zD4m+*5E-1Q3d-iQO}^um=F#1IC?E81)_-~ENuL9q63Sqh_V@SeG<{G*nL&^d3R8vm z@N(o*3*3Zcl$YjOUng+dCQb4#EiDlV_|y)$&>_B4l5snv4>w3QdjC`NzKm`9>U+j{ zd9m#e8$lj%bQB*S|AdYXYiMXl>{p@1H>f-;u4^h0#B4!Bze-Y49=brTqwv{z)qQR8 z_)VckoR|&kX1;bg8-!yXD zYta9`m7`4Muzv8jH*w@q>il@QvE#+5E9Bvp>1nd>(G>P&T0gqGu}Hb>kQy2ZOw5c1 zVr5eoNBE#hz~*&ACW`s=DGG`h<)cRkRaI39Sy@r=qhlqy;SmvcQuw_ez_zRmXWxbx z{<^2%a%WI7%e4w5ZL3$ubiF&2V01zzotGfM!H?`tT9-QRDxsTUE@!U6L28-r2uEv3 zFiPRHC4qAO)sGmBEim>|Rh0L?tv|o?{X5Q2_DO%s%gD69dn}T4PD_p+^h!CV#_A`Q z^WWY-6_RLZTY_8HF>1x`<_8Qt2~lZT!9&s+95|fLjjH5<+AKHz?r^Z8_`BX67o7Oc z&dy6nzIgZVXLCBI(<*3bg|)XMQ(k!D!#aZ;vVaY_afc}2&$nRGr4v=N>g`L2J;