diff --git a/main.py b/main.py index b8ce1a5..18e41e5 100644 --- a/main.py +++ b/main.py @@ -2,19 +2,33 @@ from flask import Flask, render_template, redirect, request, session, url_for from flask_sqlalchemy import SQLAlchemy from flask_admin import Admin from flask_admin.contrib.sqla import ModelView -from werkzeug.security import generate_password_hash, check_password_hash +from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin app = Flask(__name__) app.secret_key = 'bebra' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///Picture_Puzzle_web.db' +app.config['SECURITY_PASSWORD_SALT'] = app.config['SECRET_KEY'] db = SQLAlchemy(app) -class User(db.Model): +# Define models for Flask-Security +roles_users = db.Table('roles_users', + db.Column('user_id', db.Integer(), db.ForeignKey('user.id')), + db.Column('role_id', db.Integer(), db.ForeignKey('role.id')) +) + +class Role(db.Model, RoleMixin): + id = db.Column(db.Integer(), primary_key=True) + name = db.Column(db.String(80), unique=True) + +class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) - username = db.Column(db.String(100), unique=True, nullable=False) - password = db.Column(db.String(100), nullable=False) - email = db.Column(db.String(100), unique=True, nullable=False) - + username = db.Column(db.String(255), unique=True) + email = db.Column(db.String(255), unique=True) + password = db.Column(db.String(255)) + active = db.Column(db.Boolean()) + roles = db.relationship('Role', secondary=roles_users, + backref=db.backref('users', lazy='dynamic')) + class Post(db.Model): id = db.Column(db.Integer, primary_key=True) date_created = db.Column(db.String(100), unique=False, nullable=False) @@ -22,6 +36,13 @@ class Post(db.Model): title = db.Column(db.String(100), nullable=False) image = db.Column(db.String(100), nullable=False) +user_datastore = SQLAlchemyUserDatastore(db, User, Role) +security = Security(app, user_datastore) + +admin = Admin(app, name='Admin Panel', template_mode='bootstrap3') +admin.add_view(ModelView(User, db.session)) +admin.add_view(ModelView(Role, db.session)) + def create_tables(): with app.app_context(): db.create_all() diff --git a/venv/Lib/site-packages/blinker-1.7.0.dist-info/INSTALLER b/venv/Lib/site-packages/Babel-2.14.0.dist-info/INSTALLER similarity index 100% rename from venv/Lib/site-packages/blinker-1.7.0.dist-info/INSTALLER rename to venv/Lib/site-packages/Babel-2.14.0.dist-info/INSTALLER diff --git a/venv/Lib/site-packages/Babel-2.14.0.dist-info/LICENSE b/venv/Lib/site-packages/Babel-2.14.0.dist-info/LICENSE new file mode 100644 index 0000000..41a1e59 --- /dev/null +++ b/venv/Lib/site-packages/Babel-2.14.0.dist-info/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2013-2023 by the Babel Team, see AUTHORS for more information. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/Lib/site-packages/Babel-2.14.0.dist-info/METADATA b/venv/Lib/site-packages/Babel-2.14.0.dist-info/METADATA new file mode 100644 index 0000000..d78512d --- /dev/null +++ b/venv/Lib/site-packages/Babel-2.14.0.dist-info/METADATA @@ -0,0 +1,37 @@ +Metadata-Version: 2.1 +Name: Babel +Version: 2.14.0 +Summary: Internationalization utilities +Home-page: https://babel.pocoo.org/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Aarni Koskela +Maintainer-email: akx@iki.fi +License: BSD-3-Clause +Project-URL: Source, https://github.com/python-babel/babel +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.7 +License-File: LICENSE +Requires-Dist: pytz >=2015.7 ; python_version < "3.9" +Provides-Extra: dev +Requires-Dist: pytest >=6.0 ; extra == 'dev' +Requires-Dist: pytest-cov ; extra == 'dev' +Requires-Dist: freezegun ~=1.0 ; extra == 'dev' + +A collection of tools for internationalizing Python applications. diff --git a/venv/Lib/site-packages/Babel-2.14.0.dist-info/RECORD b/venv/Lib/site-packages/Babel-2.14.0.dist-info/RECORD new file mode 100644 index 0000000..d496667 --- /dev/null +++ b/venv/Lib/site-packages/Babel-2.14.0.dist-info/RECORD @@ -0,0 +1,1075 @@ +../../Scripts/pybabel.exe,sha256=x7jIoA1NoLj-mAJRibIUsyrPFdK5UlGc_T7HbNQCuNQ,108437 +Babel-2.14.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Babel-2.14.0.dist-info/LICENSE,sha256=kI4K1yBTrifB0X4zQL0Uz_m_k1mS7VZSbRfJg6tuevc,1531 +Babel-2.14.0.dist-info/METADATA,sha256=m-cHPqie3eq-LWf0Gq-T6iCSsLY_nP1vG3mG8mIw3Fw,1554 +Babel-2.14.0.dist-info/RECORD,, +Babel-2.14.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +Babel-2.14.0.dist-info/entry_points.txt,sha256=Y2Cr1P3E8Yt7kqzvVz4wnTvD1H3-BVD4FOkVqHIGBfc,750 +Babel-2.14.0.dist-info/top_level.txt,sha256=mQO3vNkqlcYs_xRaL5EpRIy1IRjMp4N9_vdwmiemPXo,6 +babel/__init__.py,sha256=vTAkGRCz3lOycJZLSi0eJsvLeEjbFdGmJhQhD4Xbz3M,863 +babel/__pycache__/__init__.cpython-312.pyc,, +babel/__pycache__/core.cpython-312.pyc,, +babel/__pycache__/dates.cpython-312.pyc,, +babel/__pycache__/languages.cpython-312.pyc,, +babel/__pycache__/lists.cpython-312.pyc,, +babel/__pycache__/localedata.cpython-312.pyc,, +babel/__pycache__/numbers.cpython-312.pyc,, +babel/__pycache__/plural.cpython-312.pyc,, +babel/__pycache__/support.cpython-312.pyc,, +babel/__pycache__/units.cpython-312.pyc,, +babel/__pycache__/util.cpython-312.pyc,, +babel/core.py,sha256=7TlC6iSaRXrJ-77svYbeD1pvA2RpWeHQDxRuETjxrrc,44006 +babel/dates.py,sha256=AW9mkeuQ6gF-tlc-VjwZvuZpczqtcRqcVf_0GRRlLDQ,72721 +babel/global.dat,sha256=X27frk-HBruc0b2Xd5AmxrnjoDqbVazONtaRehqJl7Y,471487 +babel/languages.py,sha256=2LDTV9WizAuZVam0vfw-Q-QKYCQpF5DxLbmVoat7TKI,2844 +babel/lists.py,sha256=YWUu2YU7AyIwAfTyHBd2bGYKEaImKzRpdmahMeDXuEY,3016 +babel/locale-data/aa.dat,sha256=t4qij3sHObXpx5s1-y_J3gLmDCjn9XZxjGhFSDVtViA,2854 +babel/locale-data/aa_DJ.dat,sha256=VKjSgKVsftG91nj0-AQMYFuF_p4YAGfRkgAvycB2EYU,1112 +babel/locale-data/aa_ER.dat,sha256=6b6qROwoeOq0-batM1Z7Ji2gvGDogl3ODcftt1Jkm9g,637 +babel/locale-data/aa_ET.dat,sha256=piwFu94H7e-jPwd4ZaWiDc-j2nAH_GiC5UZ2IxMx7bs,635 +babel/locale-data/ab.dat,sha256=plWe5eNsmJvVplgNAo5xusXgAJvI025o5i0u73HS7wY,100416 +babel/locale-data/ab_GE.dat,sha256=b5be2Uv1YtP-bkMasJMzoQPxJPNLFqifXnCiK8rCyLE,635 +babel/locale-data/af.dat,sha256=VHwHPH3IrJj39r-Fx8gbUJPGjFUulN-wLx8mN_zQBjA,203730 +babel/locale-data/af_NA.dat,sha256=zif__TyNY44mSCYOCrrglsyr_H31JhBNPwSJftg8200,1450 +babel/locale-data/af_ZA.dat,sha256=6lT-mLg7LRtyAEhWhiF2xVtiPyzEa28U6hsFw_BMrZE,635 +babel/locale-data/agq.dat,sha256=ntz-h-vOsJcVCBrEBQpC-ow4zsUTShPhvDgrlv79wvQ,17302 +babel/locale-data/agq_CM.dat,sha256=hYtg7pRw7J6TsYHvhlEEv7DqpyXoK3KS9DAqtYtgBX0,636 +babel/locale-data/ak.dat,sha256=bgWHrtHvkP_LumU5T6eGbVEkvah06-7JDrk4uO3eQN8,15782 +babel/locale-data/ak_GH.dat,sha256=tM-OSpXWyBwZFfKPVStWBbFv3dwNj_7AqcBz4ONrOQs,616 +babel/locale-data/am.dat,sha256=BiOJmrhvFpI9897xPOO-ZUjci_f8keIj4buqlOCFsEY,239348 +babel/locale-data/am_ET.dat,sha256=2VZDSh5bY9vLLuTqcKYG66p5OYlvPRPX58rpNTFWPok,635 +babel/locale-data/an.dat,sha256=y3xHxp7sm5uD3tAqKreiYFTxFvqbUS-rDVoX9Yd0xyE,34079 +babel/locale-data/an_ES.dat,sha256=rQuq-zKj7-fCjY-5fGGoGJT1x60pAyCEAVEswXPnHrI,653 +babel/locale-data/ann.dat,sha256=fUenvOdPjqayLEiVDRNncK8SOBi9gAGAdxMuOATlsI0,737 +babel/locale-data/ann_NG.dat,sha256=0i2K6cv6eCurgFgwtiCr09hYwZCA1kHkQaKnDyCD86M,617 +babel/locale-data/apc.dat,sha256=G96W-ebLqQlTuPN3-VqSfAY-GF0K99c6uXHza5f4e2g,1564 +babel/locale-data/apc_SY.dat,sha256=tagFeQz8BA9Pc7RMqkce1ZalfKIBjqg0SR4NlpGQaaM,679 +babel/locale-data/ar.dat,sha256=V0ewHhDy2-X75q5nmmtXbQ60lrw6SgXMPDjV8qYhGCI,423869 +babel/locale-data/ar_001.dat,sha256=hRKDI3wzxO5T191MfSdCn_MZ6ckM2Rz_r__0JZqS00s,1707 +babel/locale-data/ar_AE.dat,sha256=cr2KVgBOkQEtxEbJZpZhx3bwfkwr4dc8_PgBPH1bWhw,1106 +babel/locale-data/ar_BH.dat,sha256=FoQ2c3E3TDqKcioarWBvLi_MllJmSd_56r0U45_gHWw,720 +babel/locale-data/ar_DJ.dat,sha256=qbNam_QAmhobsIUfJLCL9pe146SvcmNIE_L3cWpmkBs,698 +babel/locale-data/ar_DZ.dat,sha256=lZQf-qemJ0lxA2VcP8aAke11fvcTXzRCglJGu9gtO_g,1797 +babel/locale-data/ar_EG.dat,sha256=1zcHJKoldryovzBak9GDH2EcPxniQfg-5dlQzPYO2qc,757 +babel/locale-data/ar_EH.dat,sha256=a0xJdGJYzGFzfvwxZVDP7yURlTm93FQSTQ5qp3XDMYo,658 +babel/locale-data/ar_ER.dat,sha256=l-WjJfxm7kP05-Hnr5PingHaKWJ46ScfW4KEBcwD5HM,679 +babel/locale-data/ar_IL.dat,sha256=O3UYAjf4BB3NdcSQTn-RzNjyj4kzTBhX3q7E8-9Aihw,1264 +babel/locale-data/ar_IQ.dat,sha256=2I8H20sPMZSnnFFW5AbesphnQndm_HvHXSk3mccQDag,2405 +babel/locale-data/ar_JO.dat,sha256=0CfGCDngdKxbK8jkD58lAqFRKtqUsstSx1Wep-C1RRU,2404 +babel/locale-data/ar_KM.dat,sha256=Zx5XtfTuRPiW6iViOjeal_Fq-18EA7GuERViMP1_mc4,1230 +babel/locale-data/ar_KW.dat,sha256=1wSXHTcgFKwhNciVS8IvGKvkzzqOIMBFykEJEQXdhEE,720 +babel/locale-data/ar_LB.dat,sha256=1wcUmhH0b3PZc4UvaDy-t6MliQI8kFXMMe_slqEK-u8,2420 +babel/locale-data/ar_LY.dat,sha256=5vCCedkZ19UrYoHmN-rgcUSOMSPXog16mdKX6oAsiAI,1732 +babel/locale-data/ar_MA.dat,sha256=cQr24gcr-GMC40H5uzIavP2lZjPg8_hJJ1RCPC43ZRY,2091 +babel/locale-data/ar_MR.dat,sha256=MUFqWwU1G9xUQxDNlpatch_XyqMYRWVsyHusSjdc-P4,2257 +babel/locale-data/ar_OM.dat,sha256=HVOqTfoH3JVTHJL-yDBiIafNfckU7CIcO_sIzXBffKw,720 +babel/locale-data/ar_PS.dat,sha256=xrrCSXKv7kJ-U8bKc0rRn-s81iLned6i4c8HjvU4RVU,2342 +babel/locale-data/ar_QA.dat,sha256=UKfLpyX856fNgeifdr22wXpDncirWJi9NxqfSnS-7fw,720 +babel/locale-data/ar_SA.dat,sha256=5QID1Wsy7BxL8SdexAyuRd9YAkHOQBTzSzpzH83_sr0,32727 +babel/locale-data/ar_SD.dat,sha256=f7aUKlrKmmC7ijTjVwn5r9m3mfZfEob1a7GHVCj4Qxk,720 +babel/locale-data/ar_SO.dat,sha256=4LD_gds2VsvxdFHpFo56CxTFenzNdvEkMofc4oTGBTU,677 +babel/locale-data/ar_SS.dat,sha256=T6eeWPeFejmBC7InKqg-6qmWoer1vjl6srHe_5ybkDU,700 +babel/locale-data/ar_SY.dat,sha256=09SrzmsmYwn_ODe3jtwmhDCIo1l6cFkoaiGuvNs9yjo,2404 +babel/locale-data/ar_TD.dat,sha256=OG7NYtRrJiDeRt7HP-B4ta5ri-6fdSnYomppfy2A4ec,658 +babel/locale-data/ar_TN.dat,sha256=WkxFT-thyffXMwpqEBYAofwPZcYTUxRXWU6tB5X-fGc,1735 +babel/locale-data/ar_YE.dat,sha256=vu8wYJgzcJ1douKfKLx3-hAg1sjndD5_PTHWG_bzRL0,720 +babel/locale-data/arn.dat,sha256=JcfndkQuEeAnP6aN1ZEJOfljh8DaddCgLjBUXgK_u8I,763 +babel/locale-data/arn_CL.dat,sha256=cf_JrdIAxFwbltVwtloNC9527Du7zaoBDM-_KmctSvE,636 +babel/locale-data/as.dat,sha256=V2PqkKyvcTkkXvFlVUqsE5WxC3kITqkyyBGLvN2cXRY,278346 +babel/locale-data/as_IN.dat,sha256=bE-OZ0Y3d2-QtD23ztjluSsFk1_RFNYMFzKgBC3waw4,658 +babel/locale-data/asa.dat,sha256=dWIi65F3gH0ylkp9-wESGLu5NHMg1qd9cjPvN_YF-Nw,16079 +babel/locale-data/asa_TZ.dat,sha256=U0GU10aP58LxCeqyjl69RQCZi_6tTQxm2vni6XVkoqY,617 +babel/locale-data/ast.dat,sha256=GrbugTFqjqJJXkZDlpaEVhg8Hxr11egrpXbmUC27ZNo,215973 +babel/locale-data/ast_ES.dat,sha256=51kFxigV5COuiPiNisp-OBFYMith5rUgBmU48rGk7Hc,654 +babel/locale-data/az.dat,sha256=prQmgF-qUjo3vVNzaV8g9xobBoV48Xqoy76Wdc4TZ7E,227598 +babel/locale-data/az_Arab.dat,sha256=IGBla73oKavlLHhtIW37idHxTkmQWZ-S8NE54b65d4k,7499 +babel/locale-data/az_Arab_IQ.dat,sha256=VsM0-KQPCP4MUw-2wMsBv-F467cr2Bup3jfxx8Fc3ZE,678 +babel/locale-data/az_Arab_IR.dat,sha256=ROb0gFTPwK5CcjpQMB7CJ662eld9sZj7IA6QMrvxgto,678 +babel/locale-data/az_Arab_TR.dat,sha256=EV6cNf3keBNREHkfF98GGZGOZz4L5dxf8pFbujInaQY,635 +babel/locale-data/az_Cyrl.dat,sha256=d_IEARmo3OXqnEw0PCEZxreYCDj8fyQgHWs-MlsxhmA,38832 +babel/locale-data/az_Cyrl_AZ.dat,sha256=GRZjR-gp6JYeLNxoiAKNdv9bkTmS1bpYnRJ0c9YIGws,635 +babel/locale-data/az_Latn.dat,sha256=aK2ziytg5Ig6GYk9tVCq4BEyV6UYy9Ip7F1_i4Pq1jw,2258 +babel/locale-data/az_Latn_AZ.dat,sha256=GRZjR-gp6JYeLNxoiAKNdv9bkTmS1bpYnRJ0c9YIGws,635 +babel/locale-data/ba.dat,sha256=mXaN5z_Oq1e82Uod4YQ5_EvYHlNKVzF2xb_b0w9Y1VQ,774 +babel/locale-data/ba_RU.dat,sha256=8YcwUOx3h4BcSfUIumKJ4wcFyiSgBM74SqenVIQUKi8,653 +babel/locale-data/bal.dat,sha256=Py4zYyjzbtRaLWKR6kNhivhdDvQPbqb4VcMk4KWLXAo,14015 +babel/locale-data/bal_Arab.dat,sha256=25CVl5rF7FqKEeHzAmt0BccVI_ODqmMP86KqQ4i6PL8,934 +babel/locale-data/bal_Arab_PK.dat,sha256=sy4tpUtN1St5yFoTp8C6-vi2bFGPjSaG_zDbY16Q988,636 +babel/locale-data/bal_Latn.dat,sha256=e0iERNCLdOkEPNe7n9gWIuKKKo_t-3B4SsD8N1afWQA,11564 +babel/locale-data/bal_Latn_PK.dat,sha256=sy4tpUtN1St5yFoTp8C6-vi2bFGPjSaG_zDbY16Q988,636 +babel/locale-data/bas.dat,sha256=JtHPHmGZUAt6-_MSR_0mDeGCp1dOMTkJf9J4BavofG8,17091 +babel/locale-data/bas_CM.dat,sha256=WBq-_rOvkBnT5pBaCyq844LLSRReQzg2HM0u7GmhKKM,636 +babel/locale-data/be.dat,sha256=EYc84d14iU5I3Hdd3QrwDwwJCLCy00nT4Ws1YH3smxY,330917 +babel/locale-data/be_BY.dat,sha256=yN4Rf2-HqinMscTfe4jKEYpsCEaddHce6K25ol595Ag,635 +babel/locale-data/be_TARASK.dat,sha256=c2vboxToOLCMwzVmELk-QMj39GRY5UDJM2C2AYC8q2o,102753 +babel/locale-data/bem.dat,sha256=Tk0RU_oM4nwvV6eHUaxsefqYyz1NNeNiV86JV01ekfo,6463 +babel/locale-data/bem_ZM.dat,sha256=nQvsLK0FOSlgf6wspQdbj00IveO62c2Mvxjzn4eHGSs,617 +babel/locale-data/bez.dat,sha256=2McG-mSD2Xg7WLHHkdx3TSSQ85tmG7ReHgSrTBLYX-M,16873 +babel/locale-data/bez_TZ.dat,sha256=OwcKelhUxQWu-8Jm9nf2vCay6-8LQvg-ueZSN_mrGz0,617 +babel/locale-data/bg.dat,sha256=8DGk_DqF3YU9Tc4s9vbjf-h0BLCN-nmQeDrbqOnvcHw,267293 +babel/locale-data/bg_BG.dat,sha256=CERFyuC4Dw9BfAZapqaq69iKAp7rBXWNCkLWAL5tAhQ,653 +babel/locale-data/bgc.dat,sha256=yWm7s3ZFP3IQb8o1G_mOEaghtRqXXE-MSDQ3eEknlXw,2873 +babel/locale-data/bgc_IN.dat,sha256=hO39nPiyUx1kfCdagpCQ8lzPLycjdfk59jFQgsd3Qec,659 +babel/locale-data/bgn.dat,sha256=Oyx3Ry1G_Naq1C_L4LAcZavSt6vclQT39hszXYgfzjE,31595 +babel/locale-data/bgn_AE.dat,sha256=CXSv6o2WHpjlucCiCXv7vEAY6mF5Dc-ibNwQM8Jnywg,636 +babel/locale-data/bgn_AF.dat,sha256=UXCb78n57adZBdKHEGnhbmeVYppzlSscVOWnQNxfJOQ,679 +babel/locale-data/bgn_IR.dat,sha256=iXxyPD5Z-ouDWFpOE2atoi6-HHGoD6PNaT9c-TH6x7o,679 +babel/locale-data/bgn_OM.dat,sha256=3O0CzFrjWxOQFdN6-lDhCxRngoXfadd_dwYoVyjK9jA,679 +babel/locale-data/bgn_PK.dat,sha256=gdVUcc-isHd9lf0S-AmFoPIMwDZ8ay6NY4o1udWI6Yo,636 +babel/locale-data/bho.dat,sha256=Pt4CtmGkzDTPGO1culdbjJqgwZhiTLOTzrxSMKJxzog,3551 +babel/locale-data/bho_IN.dat,sha256=UcL_aZq35dOHME0Fux9zyt9B6BOTxyR5UvaGWKLs1jE,659 +babel/locale-data/blt.dat,sha256=6G2E9osBy9OrG1iUKLD9cwcRk3IV7fT11iI8zFkLaeo,723 +babel/locale-data/blt_VN.dat,sha256=vpTQEJYssmuBUn_pYqx7ZtYONNNz02_oBYlDMdWqKAc,636 +babel/locale-data/bm.dat,sha256=VhInWEo8x3U5asJ4iTZMMg5i6p4JbtvS-gLHDpmhizU,15802 +babel/locale-data/bm_ML.dat,sha256=PAGrUwc1S6q32DDHTu5LkePFXe_M_i_WxIY4oLuUnzw,616 +babel/locale-data/bm_Nkoo.dat,sha256=jf8Gv-tmQixgSrs_JpNqwpyqH_Otrzx0fFhiemvUMe0,2885 +babel/locale-data/bm_Nkoo_ML.dat,sha256=PAGrUwc1S6q32DDHTu5LkePFXe_M_i_WxIY4oLuUnzw,616 +babel/locale-data/bn.dat,sha256=hx6jxrr9f2nItfwGo27uj9Tw4abkaTuHxSSwGjr4vRo,296914 +babel/locale-data/bn_BD.dat,sha256=mVW90kQmhDcwzKmkmgNAt5iMq1pLWmNndNID9fspVjY,635 +babel/locale-data/bn_IN.dat,sha256=YFSk2NHHq3VtaS9p2B12Kzst8rv4B8-JO99A_KI4ucs,5662 +babel/locale-data/bo.dat,sha256=R6a5-THNIu1o1eKV4S4N26poBCJmVjoAy-TNUwMndAc,22353 +babel/locale-data/bo_CN.dat,sha256=xOnyre81Z1IHnWV5mJH0x313h-ZWu84hIXcMuB50IT0,635 +babel/locale-data/bo_IN.dat,sha256=GvYCgtrOD5zYYsfMtVmkCv8-y6His8Lg7iuytEGjnMI,1307 +babel/locale-data/br.dat,sha256=7CrF-_Rud8dcFRltHX9YGPD3u16wLm_67SwZ73lBOyM,328164 +babel/locale-data/br_FR.dat,sha256=3oVDdZd7Xf4Q-hwmYraF42SM_3NtvSoiZlmlh6gSNOs,653 +babel/locale-data/brx.dat,sha256=eHRkmtgQoeaYzHuudYrFBJszIEMBhW1Qwx6cozlruKQ,195439 +babel/locale-data/brx_IN.dat,sha256=NKuJh0cEhRQasy6JAGUi5HbqdnhhEFTQ_7osgtdG5Iw,659 +babel/locale-data/bs.dat,sha256=RAAcbqRG8DkEs7vQk5xIp7bmsqbgaRjLqWrPwVvD5wM,290130 +babel/locale-data/bs_Cyrl.dat,sha256=i2aa9r1CLt05nRbb2w1fIsP_XCYTUmCI9t6kieq4kgY,249581 +babel/locale-data/bs_Cyrl_BA.dat,sha256=oA7rsQckE_IxCpXXB3F3KWQwM3WZTR7WAdYxJN98oeM,635 +babel/locale-data/bs_Latn.dat,sha256=6L9SY85hONRHO4Jz389C2Ziy7llKcDoyVNiE96ozCJ8,1990 +babel/locale-data/bs_Latn_BA.dat,sha256=oA7rsQckE_IxCpXXB3F3KWQwM3WZTR7WAdYxJN98oeM,635 +babel/locale-data/bss.dat,sha256=7nu6tpedFRw3kGRtrwt8M0CResWl2ZAyD-KKHgfpr40,1828 +babel/locale-data/bss_CM.dat,sha256=TD7ixCHREfOLDsDJn8FY5YqGYH9czdEzdULCIl_0GhM,636 +babel/locale-data/byn.dat,sha256=_Ql6YRd-UhR78KBm8mQFNH8q-H0A-pqcLOEI7RF3Auw,13482 +babel/locale-data/byn_ER.dat,sha256=oAaZEqMJuTbMITO-ZO6gg8qjwROukzh5VgjtLp6rqD4,617 +babel/locale-data/ca.dat,sha256=EHEK_ZUtXWq_ruKn4OUy7ki9vhfn9knoFyvO1d0eQ6o,241287 +babel/locale-data/ca_AD.dat,sha256=tsLumbhbbeXw627WKi-sQdSTFwNpcSRvJIEYcrOMqOM,653 +babel/locale-data/ca_ES.dat,sha256=T-zv3FfnCJA2WUQTeBADKV82ghY-r60wk8mXtD9wbnI,653 +babel/locale-data/ca_ES_VALENCIA.dat,sha256=VDfhBCSYDowm-bMKYOFkd2o5ha3OApQ4ntHb5KPaWIg,3703 +babel/locale-data/ca_FR.dat,sha256=5HUFYUl5QRaUMwJxGLIqUhDO4_wF_crrr346wJmEOZo,672 +babel/locale-data/ca_IT.dat,sha256=Zh2rtOq8MIDC2CQXWnhp5HOvPfXNxhRGnnZViOgc1Mg,653 +babel/locale-data/cad.dat,sha256=_g8YTnbYWFt4gYUVhgk6jrzcagE8qRXOPaG2rNPb2bk,2495 +babel/locale-data/cad_US.dat,sha256=FWV1sofgr9no5P9yBxNDLeKWoQd80XEYEilmLwamkSc,654 +babel/locale-data/cch.dat,sha256=J4S73psT7C_cXs1VNNYow47plBodQ4PKINC59kzvfAw,2430 +babel/locale-data/cch_NG.dat,sha256=0adhw9xNMlVEqDVKvHe4HCPtbjcw5NSo4ny_pOjl0-4,617 +babel/locale-data/ccp.dat,sha256=7AxDu2KPudgZ1BbZTDvRjZvKh7jXhFHs8zs24m8Y4Y8,276511 +babel/locale-data/ccp_BD.dat,sha256=f00776fnI484B-mzW0rY22KNkzV6wtmk7uxrSK_x9bU,636 +babel/locale-data/ccp_IN.dat,sha256=jMJimrQrx-b96hBSLi8sOyHtYRwNZryt-he0rhwEZ2s,659 +babel/locale-data/ce.dat,sha256=XcDsH5WZg0yl-T9upBG7NRaVPBKZbECgVRnvHqVQFTI,144929 +babel/locale-data/ce_RU.dat,sha256=NgNmp1uFnm2MT-s_yx_V8KuW1dSR6_SEWf4NcqrAL9o,653 +babel/locale-data/ceb.dat,sha256=i4uLNz1eciW-yumBFWwca4SYlYt_kdHzO_haWWYRn40,118889 +babel/locale-data/ceb_PH.dat,sha256=Z2zXPyNI3Yu3QcGL6lT1nIsl04vDDLFvyd9GeucDtqA,636 +babel/locale-data/cgg.dat,sha256=Z1baC5RbMwiJLSh0YyQhlspOOiaqEaxNe5MuQQ-jZcs,16124 +babel/locale-data/cgg_UG.dat,sha256=HZBma4MFuX2Q7sk-SOYk5OUkbMXWWr_tEInOqPboNYs,640 +babel/locale-data/cho.dat,sha256=xWGBvUZv6DGSS_tUPXOrwtkOxxB-bF6ciK49Kqo7uf0,771 +babel/locale-data/cho_US.dat,sha256=T3CacgkE-uKPi0CV7fbcCLTNfdjEco_A50vYciuXGGI,654 +babel/locale-data/chr.dat,sha256=JB8MIrwz5u2lw0e7Y9Bel5wDgQVB_pi0MtywjedprGA,233233 +babel/locale-data/chr_US.dat,sha256=wZE2RrJ-5jjUQa1RCJgL7hkXdsU3t91orD-ULDYMXSM,654 +babel/locale-data/cic.dat,sha256=eaHu3naKHQZXra4cPkLtNTA9ifzBGG2RwOq_SIq9OaU,2751 +babel/locale-data/cic_US.dat,sha256=DvW1XJS1hEp_W_5ol0pIECeUb3RqXsyieKVS8J6caJ4,654 +babel/locale-data/ckb.dat,sha256=AZVeUEXTNP24sqYx-yTWm6HurKdGLGgIVRNGBazKaeY,42245 +babel/locale-data/ckb_IQ.dat,sha256=Osgu1RAUf2yQpZ-nNBKMxTFJnH32ItLg0kVVzjNfmeo,679 +babel/locale-data/ckb_IR.dat,sha256=6wWzlZWn7oDmGIdnF7UtCfIcUgQ1zvMxtAcEw4bbM-g,1231 +babel/locale-data/co.dat,sha256=gaYPBHZWXANvwbLrSS2-XPh_BT-a94XTzdlFCCFhK2g,15725 +babel/locale-data/co_FR.dat,sha256=DAmwXn4n1mRSsT17-DcU0vdVSI_JfVR8oGOnj7hTFHk,653 +babel/locale-data/cs.dat,sha256=nADdcIBj8sszhkqnC4gfTSQqB2zjKND1rHLOmNwTs4o,334644 +babel/locale-data/cs_CZ.dat,sha256=keaiqSsGtB_axj8FvdYDOCDmlg2PbQMI6qnW-2mFUTY,653 +babel/locale-data/cu.dat,sha256=AVajYXlHvt5g1cMq-eC69rr-xSko12J8JD-6Ywej59U,20277 +babel/locale-data/cu_RU.dat,sha256=GcbqgE8Mlglk5EGGSVcCR-Zb8AmCqHGE8cbmAUSbpdY,653 +babel/locale-data/cv.dat,sha256=kHbrL_nzQrIKdGXBGrCqYg4Qh1pBILVsH7nMocJ9UZ4,97815 +babel/locale-data/cv_RU.dat,sha256=oVPRtcHzmRmkAy26Bv1jLiWmm0P18ruvHlCQ5F3IFY4,653 +babel/locale-data/cy.dat,sha256=_3et0sgz0QFi8FlAKvN-Od02OjL7-_RW-_GNdDI1h3k,373601 +babel/locale-data/cy_GB.dat,sha256=dyPULIteKk9gP7lGQiDtsiH5QDqNdlxMdK__2dq90dg,653 +babel/locale-data/da.dat,sha256=K1BXQdwR-ahbFdDAlUfvjyx3u-VK0uU0Q3GVapWfSh0,230205 +babel/locale-data/da_DK.dat,sha256=qNTw1H8WXsV8qGBHxu6noCUOV3BcoR63ERJF8Xc86Ls,653 +babel/locale-data/da_GL.dat,sha256=9BNeKX1-U4NDr3pBU1ZnCGAasdYZjBMsvpdS5uTf9qs,616 +babel/locale-data/dav.dat,sha256=6nbRBkxNimZwwDoVsofPh0disJDKsu3eQL3k7O3F3u8,16193 +babel/locale-data/dav_KE.dat,sha256=MfFFEDT6fib5be-EmziiEF0NAnEV6lXD7svYtHUtmn0,636 +babel/locale-data/de.dat,sha256=gHAv7h6C3WGZ-h7TvnUaakK49fKUJLKaIL6ufFW12ws,237243 +babel/locale-data/de_AT.dat,sha256=BUbZOt5qYE0tKfJeqmPlxFgAF3xp9wGFLNtB6C35Ctw,2641 +babel/locale-data/de_BE.dat,sha256=wvdWykhix9Slofcjm2tx2aEhMjffmMLsNrd8709NIR0,653 +babel/locale-data/de_CH.dat,sha256=795GEXg--aobz28qnS_CYO7_TlcSM6gVymZomESGr7U,4311 +babel/locale-data/de_DE.dat,sha256=SM44YjGlqgh7bKlXvUdt53t9hnCX5o46ujI4IrGPpeI,653 +babel/locale-data/de_IT.dat,sha256=_ccaB__UQEMDjx88_tQ4svpXNQhhfypilclNnna1UgQ,1646 +babel/locale-data/de_LI.dat,sha256=FnGRiippDTTFRFswU_4PblQruAuWuPEpa8cGbXPJpbE,1413 +babel/locale-data/de_LU.dat,sha256=QAkvLfyKmZdQVfkk2BbE2AMisK1i7yhRetcApqn4dxA,1067 +babel/locale-data/dje.dat,sha256=qKWXMFDxJ6i4Gaiox33mTyi9gHEUJI3P5DwZ-PaoiAg,16157 +babel/locale-data/dje_NE.dat,sha256=lU1vag_HJ4OrbYNYWFXuSdtqLwSlwBbvD6Tg-hl36e4,617 +babel/locale-data/doi.dat,sha256=Z5-0N1pcReHx1QP8V_XO4QnwwYUowUoW0X3IoyjLHVM,24727 +babel/locale-data/doi_IN.dat,sha256=-q_oAqvdTizFG1DB_1p8sZVyjbaFFQ_FFPtNCyVn9ZA,659 +babel/locale-data/dsb.dat,sha256=WZ4WRm5rxxTbxN44QFfr7tlCn2GKIa1RiqSDw965slE,258955 +babel/locale-data/dsb_DE.dat,sha256=Z2Dzjx7eXscEBEAb-ymvb1GKP4GVNCt5L4i-BYC_vrE,654 +babel/locale-data/dua.dat,sha256=yVkm_JzYn9zK1ct4ORyc00IhvhNXHS_TBcbM5J2zDuU,5317 +babel/locale-data/dua_CM.dat,sha256=Z3vD8WEr2Wlqqt39anvKXVhz4_yBSm4t5BoAaEz9PgE,636 +babel/locale-data/dv.dat,sha256=-1zCv4GXiRHdWjQk0qXWNPSf4FX4Zp-Ij2jwgz5BsGk,2225 +babel/locale-data/dv_MV.dat,sha256=lvuU5gj3vDykU2ftU1_4Lza-130DB6_ZwylDrdb_GlY,635 +babel/locale-data/dyo.dat,sha256=9vdi_yL7p7skDqWnbG29rKYMm9DauMzy9aXEi3wreO8,10500 +babel/locale-data/dyo_SN.dat,sha256=Z6N-NIVcKkx6sFUm8LfN74usyZfgeI6swJL_A_XbBcc,617 +babel/locale-data/dz.dat,sha256=ff_TDWsCb2rKPMJP6XOAHRxXoRRsEYoOcvDiWoB18TY,90284 +babel/locale-data/dz_BT.dat,sha256=KWd6cypWse4XfXbY4BmTlxGjlnRksYNcQYi_iyXluKw,635 +babel/locale-data/ebu.dat,sha256=ZK20F26CyLC-axvixTbESEfn1V2Cye3WrQinYulap_I,16157 +babel/locale-data/ebu_KE.dat,sha256=GEcGqVmH0WwgP1BCsd9vnSGxGXl8ON4UPTRbyeaNDfw,636 +babel/locale-data/ee.dat,sha256=u1vtOZMmRs8yxGQM1gbllFk_0fQHOorqSXRyJ0m2uR8,148049 +babel/locale-data/ee_GH.dat,sha256=SkQi-aVmtqi3S99DUTLQzZqUE4LrAIWuy25QuZqYAfI,616 +babel/locale-data/ee_TG.dat,sha256=7y8-rDvag7_EQtEObq3fpHaRedVmuEREnQwjktmLwgk,1168 +babel/locale-data/el.dat,sha256=f7m9ojEW_s1vGPAsd94D6rpNQgGRh3BYHUZ4JQyD2tE,279619 +babel/locale-data/el_CY.dat,sha256=POPjzTYMuP7Ijf1S88cAFR0ge9Id_sSRNembKdhk2aE,635 +babel/locale-data/el_GR.dat,sha256=S32Cm-1ENgLL_lDecCDI4qDfyd3wlQ1JbUwOnW1whm8,653 +babel/locale-data/el_POLYTON.dat,sha256=lkcs2uXW6mWXztmsAXnapnSuQ6gkns1WwsVgrg-24Uo,14964 +babel/locale-data/en.dat,sha256=Wlq59NM-KcRgvw-FwnUU0K7jW2KNW-kr19V3YY9Mieo,209482 +babel/locale-data/en_001.dat,sha256=OkPYuVpqowcVX0Z64u-6wxw8my-e5JZbj4KWrCVsULc,32030 +babel/locale-data/en_150.dat,sha256=cjKCV1ZLhNY4TvqJF8BXvQR1jVUBFrdjL1RKSnBa0vc,1851 +babel/locale-data/en_AE.dat,sha256=wqlLhrbYmQxkJFUGjLTHRlydDCYhsotTUFWmVDLYj14,4191 +babel/locale-data/en_AG.dat,sha256=POWSM98pRq9k7lqCsxr-MS9PA-zLoOVUKUcI9iXtKq4,654 +babel/locale-data/en_AI.dat,sha256=7iwWKftqPdOdWJ7v94jsre2ZIq2cDpbVGAs_ScBztbs,1206 +babel/locale-data/en_AS.dat,sha256=M-N7v6BuP47wkTFmv5by1w42IQCUiSqKbaVTXtnwF8Q,635 +babel/locale-data/en_AT.dat,sha256=05-bVy1aMFWZlHMBC86A7OVy1zlhJw7hsjyvIOjxE70,1309 +babel/locale-data/en_AU.dat,sha256=a1xjc5DjzNe-LEYVjlvtmEuiwpYhpeJN1-r9Gel3s1g,27440 +babel/locale-data/en_BB.dat,sha256=J8vppKlBp03jJvVuVp6Z4GMc_N0BukeQ8f8q14y8fwU,635 +babel/locale-data/en_BE.dat,sha256=0JXHgqUIWZYe88FYC97spm2TqyIaNOwDJBt3LBmUF7A,1547 +babel/locale-data/en_BI.dat,sha256=AbdI5FjEqQLOMbBtD3wLW_7AccuOwY9MZUFpMF1uEco,1189 +babel/locale-data/en_BM.dat,sha256=cZE8sxf44ETY6nCxOgbvJN2RhABZrRaP8SjwsbSepuE,654 +babel/locale-data/en_BS.dat,sha256=r-oQxdqP68-0nui6I4vSSfLkPXUKS6PMKAWdxxZBSjc,838 +babel/locale-data/en_BW.dat,sha256=k5bc9gYBdl_8ZyCelrlS9ZenMzs8cdfl2MxeCnOAr88,2850 +babel/locale-data/en_BZ.dat,sha256=ea8sr4wyGm4oIuNmp9ZF0_Vk6kKblTAlu60Sl4GMucQ,3065 +babel/locale-data/en_CA.dat,sha256=Ux60R-ZESNBNm9G8t6kv6r6rqA1jP4floCz6neF65Iw,43388 +babel/locale-data/en_CC.dat,sha256=34a3Vb57hT2reRvwn0Ud1nXkoYQJoPmaqh1n5qflFdI,1187 +babel/locale-data/en_CH.dat,sha256=Nfkwk2HNOccSH8Co5SWYnFdHWEDEpKNPQ2o9a67vt_k,1866 +babel/locale-data/en_CK.dat,sha256=gvU21BSAugpjE7CT3xnpHML6oRgHPaBoq7W11YbG-1U,1187 +babel/locale-data/en_CM.dat,sha256=r_7Yzep6S0ZOFvk_TORm5Qhi55yjehVQAotaLnn7igQ,1437 +babel/locale-data/en_CX.dat,sha256=lKYbIRS6r-WMUd1ewX7Q4TpX0PBVcsYN7Cs263_xosM,1187 +babel/locale-data/en_CY.dat,sha256=kQZfhQdPfdBeePOngn-4CpA3ZJ7Th-lmZ-jOrBe115o,635 +babel/locale-data/en_DE.dat,sha256=oI3TmMDoQZsGddvDb0fbbwd_LdTeFbFPdFkZhst2q7Y,1027 +babel/locale-data/en_DG.dat,sha256=xtjjxkuFB7I4p3n0f4Evz631RtMQhIzpoYwUzOzICqA,1168 +babel/locale-data/en_DK.dat,sha256=ygI8iTEmh7BSSNxP5al7Lc-WUAXc4jSM0E3H8rWW338,2449 +babel/locale-data/en_DM.dat,sha256=gbriVhXcdXi5GWmpgWdGB1LUwI2yquuLk1khkzpo1UU,654 +babel/locale-data/en_Dsrt.dat,sha256=HBK4MuF_tSCruRXJ5Bo6pkyQd5IXaDVSLWqR2is-xdc,39791 +babel/locale-data/en_Dsrt_US.dat,sha256=p8c_L5tEvzYmacz0tmq58Wsbfp9wMV_PBgz5R_v7I-k,653 +babel/locale-data/en_ER.dat,sha256=U1vYaQVwnVgfmO9l2_GjBnAhHrShbiHU_E-hAclDvck,887 +babel/locale-data/en_FI.dat,sha256=ZcMBUya_z9GKHdqfeLBpe3kH-3XuKP05mbagahXitYw,2381 +babel/locale-data/en_FJ.dat,sha256=k-hXekogcQzt00qXdcWODsHbg7Vh9U8Vx84bERd8CHM,672 +babel/locale-data/en_FK.dat,sha256=r6OGl7mX4ep5aeFMlhog6Xr--kDKFEVhDcepSJBYZWw,1210 +babel/locale-data/en_FM.dat,sha256=88mCYM5_VDSYpJ_mV4AStjiDpKAo_1W7GbmKcI9f_sk,616 +babel/locale-data/en_GB.dat,sha256=oy9983B04MskGy18XJaeUCxXdh9LnV-X73rjCn-AwTA,23749 +babel/locale-data/en_GD.dat,sha256=c2ap41e5x-OY5dEYZ5wD4ByRbEzlx0845R1lPBLnJus,635 +babel/locale-data/en_GG.dat,sha256=qhfvbRdldEA4467X0_8N09HwT1ZRPJJtb7Evpvbbarg,1273 +babel/locale-data/en_GH.dat,sha256=bBpzsHl9QhNAQ7hrUtKb6TwGvZYibXQwXfuJVgLMlZ0,889 +babel/locale-data/en_GI.dat,sha256=veSOVDagnkTwyqxP4u5mOkRG8_W4MCZ5ptMBoGOg9SE,1228 +babel/locale-data/en_GM.dat,sha256=jfHQeiMTDNgnIpx3WZ9hOpCR_LXCYLLrVN4SUakudi8,885 +babel/locale-data/en_GU.dat,sha256=WDR_uybAkUii6RHT2x62pzCLvX4bMstibEztBvLSuxI,715 +babel/locale-data/en_GY.dat,sha256=TDiVa4YSapsK9rjQN3ATnrj3m267l35pqRLI7r5bLFc,694 +babel/locale-data/en_HK.dat,sha256=vI1hLxrvwa6TaBp2BrDjGTdNANjSLN_1KqkFMOSWv4s,2091 +babel/locale-data/en_IE.dat,sha256=ZNe5XFbdM4UnYu6KaGYHggQqzIVCWwWof5C5ktTsHn4,2094 +babel/locale-data/en_IL.dat,sha256=O4-JPTBiiLezF-iUSDu73id-0VWlSiE0ie8z9qRaxq8,1424 +babel/locale-data/en_IM.dat,sha256=u3JX9jrrsW_G5RQXHsQIGl6ikVduckeldeS_FjKG5Y0,1273 +babel/locale-data/en_IN.dat,sha256=G0LRfr9_xs5siqLd8sWFpC_lUTKtQfGr0dOnTVicM7c,11600 +babel/locale-data/en_IO.dat,sha256=TOM0TxdcWcu1wyBXJxsrE-uCIZsbYTCmUkTdfCaOO-E,1168 +babel/locale-data/en_JE.dat,sha256=IxL3Ry70pMOXDbCwU6LZllHXZmg8XHbjocavEWvb9jY,1273 +babel/locale-data/en_JM.dat,sha256=Z9GFZ6aFGEvIEzlbOlA5bBBvxgcxXx6s_7AxPMp2Yg4,1666 +babel/locale-data/en_KE.dat,sha256=oJa3lUdjavkdhkMK_bcnJ08waK9lfIRs8mFkG0JYf-4,1458 +babel/locale-data/en_KI.dat,sha256=3yfkrwv7Yd9yxDNnXz9Sv8ghbDvqczZTAELr3uGNYn0,635 +babel/locale-data/en_KN.dat,sha256=cFebccXOrQo2X1zmHoHYB2vzXynoroYImJTMnK9j3h0,635 +babel/locale-data/en_KY.dat,sha256=uQV4Jf38XQ3ycqYb2HhyOYdNMIbuHyxyy9HNsb26Q2Y,819 +babel/locale-data/en_LC.dat,sha256=jUYdKd248Jkj5XVxXXbvXnfxu4BH_3s4Ld-O67qbPkE,635 +babel/locale-data/en_LR.dat,sha256=ribT8_azFjDC8uzIsOwkGTjfgEiFlSG_wAb_wG1Fmnw,885 +babel/locale-data/en_LS.dat,sha256=2HtV3gUrynDl2mVvqywMfff8VnVjz2ryoNS7D2n5T9c,885 +babel/locale-data/en_MG.dat,sha256=dtMrsBqOpwQExs7dVukbUzWojz_6swx5Ng6OXdKxsSs,1438 +babel/locale-data/en_MH.dat,sha256=NZjQknLyokLgJRNPicAZ55_VoRCATz_WvAxMo_I-HOg,1368 +babel/locale-data/en_MO.dat,sha256=UJVR7td-vlRY_a36ZWbxr_PcK6egIUQSKoky3DeAmEA,830 +babel/locale-data/en_MP.dat,sha256=Sd2vA3CdR_GBw1vQQQBfKIY0asJGsVUwZ6gD-h7Or8o,1349 +babel/locale-data/en_MS.dat,sha256=BXrA3odGnWSeR6404L85ErqMKxTnRCZ16UWL2RpD7TY,1187 +babel/locale-data/en_MT.dat,sha256=sODJaESHndxdT9SYZcnESDA6G6oln6n9NCojeHhKvJg,1990 +babel/locale-data/en_MU.dat,sha256=SefoZho0XzSzzU_Y_-udWPCuRgz8ujdUVkL7hhzZO8Q,1438 +babel/locale-data/en_MV.dat,sha256=Spp5zsOCHzCeZOyUdYqXoqmSoIJ0pxRR3b3nI27jvTs,2034 +babel/locale-data/en_MW.dat,sha256=5d20Ih8j6iwBY545I4nObBWdv9FL37nE-ggfpGeXSVs,886 +babel/locale-data/en_MY.dat,sha256=nUwwM17W9W78nnbXGmrx2zComZQ9Fg_pu3va9wPZzvY,716 +babel/locale-data/en_NA.dat,sha256=-yNAAmx38RoVJt3YRH7Tp1xO9o3GsSVDU6uF_GKhGb0,885 +babel/locale-data/en_NF.dat,sha256=6LqhwHyOnkQA4TNvseuiE1a5Ov7DV3y46CZ0ENcibXE,1187 +babel/locale-data/en_NG.dat,sha256=dvbDZYdlkmhF-IU8M6s2p_kHswy8HhdmR3LLc4EhePI,1439 +babel/locale-data/en_NL.dat,sha256=dDCtXReh9uMfUOVqGWaWjfV1-dLe5_yj-o_HrKZGMeM,1192 +babel/locale-data/en_NR.dat,sha256=ZiUNBY0c1T3LQP-qGmtuxLW2Jfc-lcVTuWpB2jxfAGI,1187 +babel/locale-data/en_NU.dat,sha256=jU4HXz_3l5k-luPPsjZmZBsdOVB5ZfkN1Xuk5i2pduc,1187 +babel/locale-data/en_NZ.dat,sha256=Hs8XKn1k7mben0jCQQnWTKcK0SMwXeD6zjRgBErPTK4,2286 +babel/locale-data/en_PG.dat,sha256=WV6D2yT-4GX6ftbnUkK-ihfNg8Y-ImX1Af56okx8LTA,635 +babel/locale-data/en_PH.dat,sha256=CJtGtvEQRqL4MDHUuywaCcuhYp3bVv7KUYMK3OH5OeU,656 +babel/locale-data/en_PK.dat,sha256=KS_KXItkhkUULbKd9mHdWD9ok4WjZbVSXhU8e5u8blo,2074 +babel/locale-data/en_PN.dat,sha256=qpEWWX0fvhzV6gcX_SHNbJW7E-5FikKwXrQAP9BWmXc,1187 +babel/locale-data/en_PR.dat,sha256=bpAu9yoeKxzQTF5Be7AfXtyE3wax0eP0m-Eu-Cr0jKE,635 +babel/locale-data/en_PW.dat,sha256=tpiNQH7vUuPfoLqFZ3_R8qBhExAhjG3nlp7zTydqE1k,800 +babel/locale-data/en_RW.dat,sha256=Et3hOZwaSDECrCzypgYq1QxKxxnB3XYziIeEe_WiY7c,1438 +babel/locale-data/en_SB.dat,sha256=h9TJ69YThzzLGTh49BBEmRBxSiZhZpQrVJif0QglLVs,635 +babel/locale-data/en_SC.dat,sha256=omYtCZBrLl8fHuT6XInezdetV7WqWZVYriJRnlWKbTg,1188 +babel/locale-data/en_SD.dat,sha256=ozd3rV_icr8p2H9V6StOSMkoHBPNBsXsay1GMRWZ1zs,928 +babel/locale-data/en_SE.dat,sha256=96guhEOzGr2Lcbd3xZ4j7HTj-0H0oaGMQIbI9a_5g48,1502 +babel/locale-data/en_SG.dat,sha256=u9U5CLnqs0iJmSnMsPBHF71HQLpFM3siADzZeC7iaJ0,2096 +babel/locale-data/en_SH.dat,sha256=rBm_0zxjHnEVzs_CPCyuz5LpI9isA2S6copUuNbxCcM,1210 +babel/locale-data/en_SI.dat,sha256=kkeEkPnW48iNoiwNZb0KV29DPU0oVNuENTi_Wmp2ALc,1046 +babel/locale-data/en_SL.dat,sha256=4hJLAAnyuEVVQZ13NC7wZ0JYJQ3rvX0SsOAp0OoW7_U,886 +babel/locale-data/en_SS.dat,sha256=C4kpyEFjyKT9-6wt2pGl4125aN0Bp0wpcYBrr62nPOc,908 +babel/locale-data/en_SX.dat,sha256=7vESruRIiaBqWxuSRpIE2U6PgWwJ9mxgbjjH_XAraa0,1190 +babel/locale-data/en_SZ.dat,sha256=A9wkzZ5cFffcEf1FobYRPxR1EAFwqQvqELsqRpNleOg,885 +babel/locale-data/en_Shaw.dat,sha256=2a2Nq7ax60C_ojL8QeWNCWF9d8Vb5e6LTUPHwUySfMY,4857 +babel/locale-data/en_Shaw_GB.dat,sha256=uAIWlJ5gr_NR6lncmMaBrjXUPhZ33rGsXoHz8hrd_E0,653 +babel/locale-data/en_TC.dat,sha256=UWqEc9zpN3NdS1dymbUv2iGKhLkH65Kk9uNFxdXGnOw,616 +babel/locale-data/en_TK.dat,sha256=qz4RHtHQ6cNjB8xW8_BIHdzW1cEcQuyJfdqFIybXAs0,1187 +babel/locale-data/en_TO.dat,sha256=OehJQf8kvWi7A-Rwo2hPjs1Z9pTdg7_Hyx_ewWxbLQ8,636 +babel/locale-data/en_TT.dat,sha256=L23iDn_zvh16iPE5uBlLCRvECSozqyzU9W2OcSjYogE,654 +babel/locale-data/en_TV.dat,sha256=3sj3NCjQg-9UOdTz7wDJRpjx57bI0bntpmx0T50OK9E,1187 +babel/locale-data/en_TZ.dat,sha256=5Q87mjSEaCMmWeWwtesb9lJw2tIWOsvyScG1CqSpWvs,1439 +babel/locale-data/en_UG.dat,sha256=aQLfdbfozsYhK3EG9JXVxsmT4B7UvfSzNBo7kO2WSsc,1462 +babel/locale-data/en_UM.dat,sha256=qd26Sl5bJTEgHU25hvskp4LMxvRJByLOSvUikqz0J4I,653 +babel/locale-data/en_US.dat,sha256=p8c_L5tEvzYmacz0tmq58Wsbfp9wMV_PBgz5R_v7I-k,653 +babel/locale-data/en_US_POSIX.dat,sha256=U8r77o6qQID3Sd5FiZqukSpQnq4LV1BDwHUeuNZjW10,1321 +babel/locale-data/en_VC.dat,sha256=ES4c4Xt6OvJDhxoAZpWR2HFbtyENOl9CrV7XFCBs-MY,635 +babel/locale-data/en_VG.dat,sha256=sqiVUOEtDV2pAc5DzGl76qV1mL5K-UWhMRzG-Ff6r30,616 +babel/locale-data/en_VI.dat,sha256=AGffygfBAafQMxKAAoxt6kwmbES4R_ybbXRV2tHpy04,653 +babel/locale-data/en_VU.dat,sha256=ji2cRB8B-c8uJR7L56HzbkiTR8eJZziVTMcEzuiK2g0,636 +babel/locale-data/en_WS.dat,sha256=gowKsveED3UIWyLgnSWxyE6qq87lH2dMgOVLDGCEcBk,656 +babel/locale-data/en_ZA.dat,sha256=uoSLsVWiMu6x-DYwISGhEwveg0kVsDwgnIhq2Jn0hXo,3411 +babel/locale-data/en_ZM.dat,sha256=8y814a5GtYcC5gvh3YBlcYf5Imr0yNEIV_v8jH3SXqk,885 +babel/locale-data/en_ZW.dat,sha256=GUDDEesQRkUuLyyDlnJ3MGlGzG-kDPxt8OTIqVRKDyw,3320 +babel/locale-data/eo.dat,sha256=i6qYU1TiS0gJlaDujDhrni1-lGWa8FqGq8zKuxU4a9w,83033 +babel/locale-data/eo_001.dat,sha256=3-tP9zaTDfbBBjpd2qKVIhS7WWbmtVKGGW_BmGIhrHQ,850 +babel/locale-data/es.dat,sha256=gi1EY1ecGIrSicmPdPBYBLm2eepI8KfdZrWZYAeLeHU,229309 +babel/locale-data/es_419.dat,sha256=7THYHrZzytkn8bemPNyqFg-8D12E7qSRVjRRIWhYLDo,29689 +babel/locale-data/es_AR.dat,sha256=1GMeTw_tadnNXiSu2Fet6K0J-lSFdMLd5qwzQPMzAEs,7888 +babel/locale-data/es_BO.dat,sha256=YWIOkvEMiIKnCUdDcoQT3xkQKOnYCEN3Da1DmIFOIjQ,1633 +babel/locale-data/es_BR.dat,sha256=Wl-H9uBjeuKESxR7bD9c1IGRgvdXWt0u7OkDCOYyg-g,655 +babel/locale-data/es_BZ.dat,sha256=gDSknig_8SiqrzIfM1se8YFXs1VNxLhKEXjIbLU1Bmk,654 +babel/locale-data/es_CL.dat,sha256=7O3xjsrQxIR6HZDJcYfHBT00ClnvKYr3X4YdElO6N80,5131 +babel/locale-data/es_CO.dat,sha256=500xh1FisUJ384tSqiB_Wf3v3GVLX3cdgryRS1s-MMg,8081 +babel/locale-data/es_CR.dat,sha256=U_XwxsksgJWZ8wMdjKdnRAHyp9DvNwwKCBLbVWpIlIc,1257 +babel/locale-data/es_CU.dat,sha256=N-TqpCs34sjlEMeJgvrfOSpmnnlGxuuGtSBSaUKDbvg,656 +babel/locale-data/es_DO.dat,sha256=Tn2WgAGuAxE1rj7C4c4fLRVm-pQxxWMGrlq283zw5-Y,3442 +babel/locale-data/es_EA.dat,sha256=V4UU6BM3pjbuEleLA_MaJtWl8IejNcHzUM660pfKa80,616 +babel/locale-data/es_EC.dat,sha256=xlX1tLT2EBNtogfv2baOygf_dWY2j6K4pcAENeIoXtY,3097 +babel/locale-data/es_ES.dat,sha256=fd1TSjdlf2lSMxwi0NhYGR2eyiABBaSJvhLlwLO46j0,653 +babel/locale-data/es_GQ.dat,sha256=a7A-hqM9wNt51_CdpjzU8aT9KEeMz165-MyhkWyqJOM,638 +babel/locale-data/es_GT.dat,sha256=htP3hiMywjg6OTsHzwxe8qHtYxIgmZiRkrtWvoNqgiM,4466 +babel/locale-data/es_HN.dat,sha256=zi8_eSDk9_RiKomcF9dCdEeROmQVyfauwRWaf1OYmYk,3207 +babel/locale-data/es_IC.dat,sha256=hwey8h4GM8i25i-YZR_K-jvCij95wZqr0zdTIKauP58,616 +babel/locale-data/es_MX.dat,sha256=iVZEE8v-9i-3r-GB-tZ2lFqeoT-UjDgGQ1j0oD1Wy60,27854 +babel/locale-data/es_NI.dat,sha256=v-bflaBIB2T6RUdrf7eZLswfXx20xcCxgXGsbxIf7Mg,1176 +babel/locale-data/es_PA.dat,sha256=8b00L8M61k2vgOOR4tw747goZhjpIavnyu2S1vRM3kk,3485 +babel/locale-data/es_PE.dat,sha256=fWsvGn-qH_jUM14BnijdgZYoS53D8qESgRnAR14coUQ,7406 +babel/locale-data/es_PH.dat,sha256=fEMZmVPQb97bBjEtCVMLn9JUtosTePmRuQqhpfNYkZQ,1248 +babel/locale-data/es_PR.dat,sha256=giHS4bzl9lLM7QW-AVsdouyZliusBvEFGJ5dZOJ-oSc,3518 +babel/locale-data/es_PY.dat,sha256=O44WVQyiDEUz6UhoXdgc6hz8AJJGOTKiEsQoXk3ewkY,5289 +babel/locale-data/es_SV.dat,sha256=phKpy149vgFM_Mt89rIt6zfE1_F5dJBbeIhvOlWfUuM,925 +babel/locale-data/es_US.dat,sha256=B9TmgQ3afX11PA3Pb_C3xhzTNamup1l34VtPJQ4L11I,23055 +babel/locale-data/es_UY.dat,sha256=UfxeB0PVAg0DWV64Goe_8X2aKYuFtc1EpkrSZ_ZJXS0,2338 +babel/locale-data/es_VE.dat,sha256=bMPt02AOJTEUwGkUEJ7LqggAVg9gTB5SHOeaGfYMvTE,3428 +babel/locale-data/et.dat,sha256=50hnZJthmv8dAZc8xvJi4AMP7p_0sUVAnX7aJJnlCTs,231692 +babel/locale-data/et_EE.dat,sha256=JpcyzIDpGwHlLSiInuYO3HfxkMEFsDPBeMc-B8Rj3MM,653 +babel/locale-data/eu.dat,sha256=xXEtbvTYQYVgz7kP4Fqb-cQyX4fyHLOHwuUZhHSbU60,246276 +babel/locale-data/eu_ES.dat,sha256=ABS9lrwjRkWenVB4fNrwKpr0mOuMF_eOlOrSrobcDl4,653 +babel/locale-data/ewo.dat,sha256=RF4j1h65LFuyYvrmmd9ND7ha8wtR4S2Toe7XcdI2k1Y,17554 +babel/locale-data/ewo_CM.dat,sha256=likxlZJqzYOVxcG4oSUQLTiH5DjGjdAFsJPIjnnj2Iw,636 +babel/locale-data/fa.dat,sha256=vFoCBC8KOyce2lEHamZ8wWxULqh89IVYABQX2T5OmfU,249371 +babel/locale-data/fa_AF.dat,sha256=l8reEqmsxV2Y-jGu1NT4gp26VOcGb9L6xRlX6WUfImQ,10703 +babel/locale-data/fa_IR.dat,sha256=nPuexwzRHDb9TFMjILK_V43sVIzbcn_fgp0msY3eFQ8,678 +babel/locale-data/ff.dat,sha256=LXkMNz3LdS4PN5ZiaMev8W58-ce0tgacyhEKvvDKU8Y,15993 +babel/locale-data/ff_Adlm.dat,sha256=cD4vur6RTqnV5rVgMqgDH2SHG0mQXmzb-ZC27WllJBI,350107 +babel/locale-data/ff_Adlm_BF.dat,sha256=eYQLbHvxtEqcJCMbXSkqN2dRSuYHVc6Tg9kOUKayJQs,637 +babel/locale-data/ff_Adlm_CM.dat,sha256=b3VqkcWqXc7s1hCxN60dd-yBRXkcXfMMQ0uAJKmSsg8,656 +babel/locale-data/ff_Adlm_GH.dat,sha256=r1CRe9Z8kZ3B3PDxmZQbvgpsEcY3OjJek9Z_S8FBb5Y,1236 +babel/locale-data/ff_Adlm_GM.dat,sha256=ZM17aBc8xznEjoP4f7HRCHaKn-DIxCSDGkL6GvDYvDw,1232 +babel/locale-data/ff_Adlm_GN.dat,sha256=HWkLsTj8Sd0fWYuYysHhShl08hg0iAvSXhPjy-rUjB0,616 +babel/locale-data/ff_Adlm_GW.dat,sha256=vIUl_C4PZSWmypeEmnsAUbGN2dSquM3nEOdBs22_qNE,637 +babel/locale-data/ff_Adlm_LR.dat,sha256=277rY6zAWlxetFe0D0JpVEY9MNcQiJU9kt1jRoiXE7g,1232 +babel/locale-data/ff_Adlm_MR.dat,sha256=qz618w1XY_zwZ27nB6LBgbzsjsh4UinfnuOVx2bqLgk,1233 +babel/locale-data/ff_Adlm_NE.dat,sha256=waY1EIQKuOkVzrtJ-t-5VY7cK2uKL0SIBO0PQbx4x9Y,637 +babel/locale-data/ff_Adlm_NG.dat,sha256=9UdHELj5G90YopBKktxDyWVQyLxl5f7P3ToBElwlvCo,658 +babel/locale-data/ff_Adlm_SL.dat,sha256=7jLKofwQBRggP61keprrbfFGXvrcJPIOvwEVmUNjcTI,1233 +babel/locale-data/ff_Adlm_SN.dat,sha256=nGazz6Tun3D-XsO6SljxQeeBuzvAb1sBQw21IbkDQKo,637 +babel/locale-data/ff_Latn.dat,sha256=APyNmlFYRwCQOlboY58qsqiF57rrI3F4fHu-uQTdt4g,866 +babel/locale-data/ff_Latn_BF.dat,sha256=Nym5keR3dDPMJBFr7ZyW2cuuY-qTMkdHzXnIHSmfD4Y,616 +babel/locale-data/ff_Latn_CM.dat,sha256=rWaVAF6D5gv_hDhNmSGbcWGpPV7X4gp53FBMXyMjT-8,635 +babel/locale-data/ff_Latn_GH.dat,sha256=-kMvFNIQyikTD2dFakV81ghSR2H584AigLgtmrzlhN8,1231 +babel/locale-data/ff_Latn_GM.dat,sha256=1Air8sk0wb0McqLZXDWIYQeiKgPusBaVjr4zk54IaoU,1227 +babel/locale-data/ff_Latn_GN.dat,sha256=7R-6dXYMBdveo2-9Vc7CjIA2H6y_hGJVbfVGIaJUgbI,636 +babel/locale-data/ff_Latn_GW.dat,sha256=2kbqhzcDeSPQxefHxynmrv2tmFVnWdRNjO7I3AZ6lxk,616 +babel/locale-data/ff_Latn_LR.dat,sha256=MQxcDQnMZC5hN52abzqCjVIL9Z5mA9wOyTqGPP4Oj0g,1227 +babel/locale-data/ff_Latn_MR.dat,sha256=CDUb5owq0Ntsd2lIZJejvYxOjl-NOUPP-v3tgVj1_qU,1228 +babel/locale-data/ff_Latn_NE.dat,sha256=R8C0fI8ql5XpnT29CrwBG8rgdHB1AASDBSdvqIqIQ1o,616 +babel/locale-data/ff_Latn_NG.dat,sha256=00rtiYbJD_ci8-0M4ye95rzGpbyX8qQ-dmFFIajAtRQ,637 +babel/locale-data/ff_Latn_SL.dat,sha256=UaWOeokdbSoxG0JUyyGWkDyz70sXy-cZbc3lXZxmQK0,1228 +babel/locale-data/ff_Latn_SN.dat,sha256=mPVac9iCnwNay8c7Ko3uUvg48lfyfEZrvhpyEFFGmFk,616 +babel/locale-data/fi.dat,sha256=FQfukeFXlRpAwrH5FJEMfkVEXfOP7SqWMyqxyUDlMME,250592 +babel/locale-data/fi_FI.dat,sha256=cpbJU4KKG8OWbmLnc9TKTdzmpoi2AJh_Pu1cHhDwVSM,653 +babel/locale-data/fil.dat,sha256=97-wJKIhPS4_hQxYNIa0uxqxUKznBUzyisdBO9GODgQ,208827 +babel/locale-data/fil_PH.dat,sha256=JjoZt3zNxy1X6RnHoxUKOMzT-xMh3tGZBRq8cvrBwqA,636 +babel/locale-data/fo.dat,sha256=c_xYyN2YpWzYkR2S9Vx7aayZXaUstjJifEc_Pa11AGs,182408 +babel/locale-data/fo_DK.dat,sha256=HUuarLNFSsV_gN2fg-OqrPr-6Ry6KFgitCp173jxAOM,674 +babel/locale-data/fo_FO.dat,sha256=SLeNQ33QTZ92kXCzQcFfo-OgwZVFPJKIeRivuvz0zo8,653 +babel/locale-data/fr.dat,sha256=yxGnVtY_x6Jzd7QafStfUH_OLwXADmGZx04vVGNIuzE,246019 +babel/locale-data/fr_BE.dat,sha256=Rm-b3ihAcJ_ujF2UgsHruHaEuDOLiaVvWl4Zsuh9uxA,1258 +babel/locale-data/fr_BF.dat,sha256=7piWVeMMrZ-YbO9MNqJAu7ZeIdueVnhg07eeMwJHy94,616 +babel/locale-data/fr_BI.dat,sha256=R4kaU1OtMcNIcibkw8OFGP6FaYMxt2uKMRyidkEqbiA,637 +babel/locale-data/fr_BJ.dat,sha256=sel3fdwegY5W4NRg32t4MuXoqpGqTAGO_ffCF2NPggE,616 +babel/locale-data/fr_BL.dat,sha256=n-MRZjeHNkRMwCtGgPZq52Lj0ijntBsxfskC324i2k4,616 +babel/locale-data/fr_CA.dat,sha256=zHXbGxyyPwIsc07LMe0A2Two44tniWEb1ULgorySKig,73908 +babel/locale-data/fr_CD.dat,sha256=W_SAIFUt4o1YDKLq98x6eBUA8ThPko4A37YtyOpwo0E,1137 +babel/locale-data/fr_CF.dat,sha256=wxzk0Nf6_pKO2VDivQprUY9WvaxRSkrfQBoUE1UVrAA,616 +babel/locale-data/fr_CG.dat,sha256=zP3HTP-nqZjG-OD_DLrDEPPbB3t9g4T2kHVzI-HxhaU,616 +babel/locale-data/fr_CH.dat,sha256=jXw4xX_rw5bg1UFxrkzz6KHq6bXmJyV_DlWt1YdYvGY,3093 +babel/locale-data/fr_CI.dat,sha256=TrHL8hQRuJI3Auxe3aTHYa_rljyUvT_s0q-jdSJflJM,616 +babel/locale-data/fr_CM.dat,sha256=2uuuxIhXy1qUg6JrzvxdmDCwRxTi4LVL75vwIJ1GCt4,2150 +babel/locale-data/fr_DJ.dat,sha256=Jqu2FOJQD41B6fLSBEc_Wf-dIQ-B6MWlT0m1buQnmxo,1248 +babel/locale-data/fr_DZ.dat,sha256=uOe9lbjO51q30G0UMs5nKrMLta5CtLW2Fg4dvsfRX3M,1290 +babel/locale-data/fr_FR.dat,sha256=bwtjtv0NG-lxlXO7fJd6r--l38WKaQmqlmn7PpXJdJs,653 +babel/locale-data/fr_GA.dat,sha256=rMwS-msXjMO5T5k1BP2B2S9B_dYvDHlP8HMS-Lq8XU0,616 +babel/locale-data/fr_GF.dat,sha256=x97-H7H0h4_MUTpjMdrkYB790vBvPKKxmnUTu-FOwLg,719 +babel/locale-data/fr_GN.dat,sha256=6KVlBWrF76ZhgyYg47F1TcR8_fbE5Ii2pJzPhmbr3Pk,636 +babel/locale-data/fr_GP.dat,sha256=W99xHjqPQj_NJ1X34ismj8A4xeZcHu_vyqH8tIwXgeI,653 +babel/locale-data/fr_GQ.dat,sha256=Ogf5NI4zMvbVROeIb8F6h1NxJNKOqY4fKU6G2SPJXDk,616 +babel/locale-data/fr_HT.dat,sha256=IVtsK0pIelVfK4eLEgUzfxBPV448daJSGdDLKVtPDhc,1900 +babel/locale-data/fr_KM.dat,sha256=ChLpzCyulxYg8Qmm5HK8YkK203GRSUEBNPSl8war7lA,636 +babel/locale-data/fr_LU.dat,sha256=0sYBhn8-9lvfOrU-ZEIbnO5v03qQOQq4wXCKp70b2sw,729 +babel/locale-data/fr_MA.dat,sha256=CAuI2aOkC9TrnUNmMNd9CRApt5Gc8lGnnP9OMmrfseA,1304 +babel/locale-data/fr_MC.dat,sha256=IfTCZ89rqHzUxdKyIz86Zs_VUH2zc5JAvntdhyKsNR0,653 +babel/locale-data/fr_MF.dat,sha256=xU0grNJKWgpfArwpLt7vuOpSTSkyPx3o6gFkmZLCxd4,616 +babel/locale-data/fr_MG.dat,sha256=A9zYBbE6gIWuGDPxv92ReIcR49gtIEYaEkCj9ZONHHI,636 +babel/locale-data/fr_ML.dat,sha256=-PoWsHBtnaZisIOqZyaEFmwooRXb2R2xEMe6DYad_sk,1153 +babel/locale-data/fr_MQ.dat,sha256=45qWAev4p2ZaFVky1Qlrw5q907PDfbRJq9q2UACahm8,653 +babel/locale-data/fr_MR.dat,sha256=mVSOABz3cRa1-HEeUKW13sLw1ZR6PmB9h_DPfZsK4Uc,1228 +babel/locale-data/fr_MU.dat,sha256=c4ERuS1GI8h7waxcW6BRtloW7BThLlgqdYTf31Ioh_U,636 +babel/locale-data/fr_NC.dat,sha256=Su2DaGZPnLCaONmgosMYke9kH6dP8xJ8wJF6P5xrJq4,616 +babel/locale-data/fr_NE.dat,sha256=D6ghYGdDXlhaVQ5gAr8wWHxEHYR7mBs0QaiNL5nfxWM,616 +babel/locale-data/fr_PF.dat,sha256=oPN2EBo1hpLjlpDYPB51qEAx_4HNMWG5-Bh9JN6Kal0,616 +babel/locale-data/fr_PM.dat,sha256=gEP6Ay7r-p7uIjOGXP8eCa62yujlTBntENdeNd9KKes,616 +babel/locale-data/fr_RE.dat,sha256=ClPJyEDdRdqIJOtHIkeb-r3WyCoIDS476Q5olb7hVxE,1169 +babel/locale-data/fr_RW.dat,sha256=gP8mpM7gx_X_9NKDm8B9PuTg83jwT5Nn3NOKPpVhi3w,636 +babel/locale-data/fr_SC.dat,sha256=qvz0N08LKCsPCPDZK1NmAhhzmaszBQ8mSlDbAsEwAoI,636 +babel/locale-data/fr_SN.dat,sha256=bxJU4g_LmR-JDMhaP4OVB2KXsu03lD4TVqYIRQnnNro,1304 +babel/locale-data/fr_SY.dat,sha256=tpDovgZ3aK7OumRwbntHTknV-tRL_HjcPK1aQINC-x8,1290 +babel/locale-data/fr_TD.dat,sha256=1H47veWKRj_iV9CxHMz7x7tfrL8IYdQaRWhTV455efw,1208 +babel/locale-data/fr_TG.dat,sha256=r_E5Vnj0Kb5CG16ApHFls4UreDeO7-o3uzpQdJjpbRM,616 +babel/locale-data/fr_TN.dat,sha256=hcGRJ2UjuFEFJqb1BDglGsXY8jCEIdM8--OrU3OqRhc,1228 +babel/locale-data/fr_VU.dat,sha256=FYYsiaoM8QZeClMnQzLiLZNXW9hULz-rCgRTYWvrIvs,1228 +babel/locale-data/fr_WF.dat,sha256=jn6VFRw_qpJFxpO-I6C9nhz_wRZ8cV2b2XRBgSzi710,616 +babel/locale-data/fr_YT.dat,sha256=x0WpQCLoqrLY3_nCF7JlcuekkoUtcpE4llC8kRmeRmY,616 +babel/locale-data/frr.dat,sha256=Qg0cT2ii-2mm9Y63crSbI2t08vdqFUm3sbW-07CC6FM,55262 +babel/locale-data/frr_DE.dat,sha256=2ohnodzECbJBUTEta36Ts4amZKl2_LDhuD0-Hu5JBo0,654 +babel/locale-data/fur.dat,sha256=j24ABSy8omhILPSWjZZSN1wTGfKGBbKnnWALmPVb5s8,34894 +babel/locale-data/fur_IT.dat,sha256=PpDH1opUDjndOtvpPadiOtITGyGxKZY0ziEhb-4HKbE,654 +babel/locale-data/fy.dat,sha256=FQXAFW8El4S7hvKngwn6VKyPBmFRIKaZ1T89OMD08cU,111417 +babel/locale-data/fy_NL.dat,sha256=I_M2hFVCAaVAL90yVMloW2eYmzO5C3NZztfEDAes3_I,653 +babel/locale-data/ga.dat,sha256=o3ZlOPQdnLC_m2iPs-vAYuDUgfU5im9jPPGPwEpQoRU,356553 +babel/locale-data/ga_GB.dat,sha256=NKphVJhmH8egga1dgfO-hSRVFhbxms2JvGMU3ybgj_Q,653 +babel/locale-data/ga_IE.dat,sha256=P948T1Tl4B7kL1T-uxii27q4IWO3yQQ5emTLv7iHvW8,653 +babel/locale-data/gaa.dat,sha256=On4fYcu6Xq9AcqCtmb4tOW0om1dRlnskyUgfIrPzrgE,36861 +babel/locale-data/gaa_GH.dat,sha256=FF7vo24vzA2ru3t8py246uanyOqyoSkpD65F7KFTXlA,617 +babel/locale-data/gd.dat,sha256=BivX9BNOgOxhSi6NR7iIRtpldaD-9gAPRzZs_xp3QiA,338371 +babel/locale-data/gd_GB.dat,sha256=weaRul21diYZoqLk7SXacBy8GD1bH30cQO6AHejilPM,653 +babel/locale-data/gez.dat,sha256=An75Oy1DC5mOgIhlZ7smaHuEd3f9HSCqAvGtAIXe_Jk,12828 +babel/locale-data/gez_ER.dat,sha256=MKpSW7Upkpe42Q2mbJStbjtnrW6Kyo8Tg0zXAxnHWqM,638 +babel/locale-data/gez_ET.dat,sha256=93QTSMihpcfFyRhttFplgAcsAhzrPjlbrz5HI4feRSc,636 +babel/locale-data/gl.dat,sha256=flLy2D9LdcwAjmy4B2-YVTuvtgkFkXuBYDedCXc5a9M,210091 +babel/locale-data/gl_ES.dat,sha256=us8xWRQnNTO_KC42-FOU2cnLCNl96591qnxZ4exq5Fc,653 +babel/locale-data/gn.dat,sha256=xGWKm7rf-ZNIM3gTs1BmDh07tJxFYi11QGjioull6TY,2539 +babel/locale-data/gn_PY.dat,sha256=tArgCo85T_BUNmPc4sXVRz8X5wcHJmBS6XP0r8dPgA0,635 +babel/locale-data/gsw.dat,sha256=Uq082ggeRAuwQoLpQfiPsmn723X-tRB6LXlPZGJqu1o,114282 +babel/locale-data/gsw_CH.dat,sha256=fQlRCd1MJ_gI6rcnkrU-lUE7ZM4syRLh-suMRT0DCOk,654 +babel/locale-data/gsw_FR.dat,sha256=vHNQ1q9Zyf6xLfsJpmqpaX1iHerMRt1dsJSPQdQDoTE,654 +babel/locale-data/gsw_LI.dat,sha256=dsg7TA7MECMrbTXC7i7zXIjrEoqrF2jZ_ckGiTMholo,654 +babel/locale-data/gu.dat,sha256=dmuygLhOARE2AQzqC8A6zMYMHSjQIAkLOIxqnCD48Oo,284035 +babel/locale-data/gu_IN.dat,sha256=shXUMyk4ogB8uJPazALoReGyLqRXSYOeVBVMn313_Y4,658 +babel/locale-data/guz.dat,sha256=D0umWg1J7fgM8kq625vdEHk6ZkwYXzm8cI1MZnEYxLU,15930 +babel/locale-data/guz_KE.dat,sha256=Uz_x0_YFKJHDkSd46SvuIfO7W0c-uqYnasmmLNib3WU,636 +babel/locale-data/gv.dat,sha256=-9c_0ZzoIitROCjXzyRHMVIXefwpaMN_MWMqwhcxOO0,4035 +babel/locale-data/gv_IM.dat,sha256=bXOsSoV303kSUECHz2xd5HhASRI-XCjqjxnxpk0Bt10,634 +babel/locale-data/ha.dat,sha256=2XcUNBC18NQuWrPYb8qmilVBa_YFdJuP-SflIl7eV5E,170161 +babel/locale-data/ha_Arab.dat,sha256=pI5aVwTmf5n7laKX4KR_Yh_U2PY_HGa2aZieS9hZw7M,2330 +babel/locale-data/ha_Arab_NG.dat,sha256=oYJYqTkaDX2p4IJ9j3sEJT49dcVn_f9JyjO0rUJTmAc,616 +babel/locale-data/ha_Arab_SD.dat,sha256=7DD6pzCmpEdjwbTMAbAb_vJey6Qh0tIeSs8LjEpJxBo,678 +babel/locale-data/ha_GH.dat,sha256=Cwfuh0nEMJu4LGZmdOXJHp_5fZRdpTIODJ_Tpd83uPM,1231 +babel/locale-data/ha_NE.dat,sha256=udCyUBXGb43G6FYfwxQQKecmQVZxLfcssIa6OR1Dlgg,677 +babel/locale-data/ha_NG.dat,sha256=oYJYqTkaDX2p4IJ9j3sEJT49dcVn_f9JyjO0rUJTmAc,616 +babel/locale-data/haw.dat,sha256=HFKk9XZ8syPFA1BXRsNuZ2Qjtx_QHy3u-bANj-G8jcw,16286 +babel/locale-data/haw_US.dat,sha256=W2qJBTNdETpoN-Ue0UYbqyblj-gIbQNOUMr01RwJ2fw,654 +babel/locale-data/he.dat,sha256=Pr4OdWj7Bzl1hZXHsE-T1lZdN6LVHiQ96ngnObL9kTc,326835 +babel/locale-data/he_IL.dat,sha256=KpQ8sod_QOZ94Tr0tfhlATzVVsrqXck6eq7txoQgCbc,678 +babel/locale-data/hi.dat,sha256=cZoY0NkPdO0T4RUfvVoMPOFzmQoRh3TpaFTnXuC3fSc,285510 +babel/locale-data/hi_IN.dat,sha256=UMkxSHgYSdX-hPgYa7rOOzft7xtJwcM0m5nTphUe9xM,658 +babel/locale-data/hi_Latn.dat,sha256=kaFxV3l4dSvCSrFZnjDFGkE4LrtGivPwEaI2RJ_FNoI,51640 +babel/locale-data/hi_Latn_IN.dat,sha256=UMkxSHgYSdX-hPgYa7rOOzft7xtJwcM0m5nTphUe9xM,658 +babel/locale-data/hnj.dat,sha256=gRR-f4HZS4ZZ5-ocjXis10q7ojD6DDYJzVyKCckhrk8,3658 +babel/locale-data/hnj_Hmnp.dat,sha256=6GekZXtZVXtGcI_zk6NqXq3WxMnOx83IpRlJOyUws6s,746 +babel/locale-data/hnj_Hmnp_US.dat,sha256=OydEowg2bNVks5nd5ij7ZJqqQT0ztYv4HL1ZZ4gNajw,654 +babel/locale-data/hr.dat,sha256=rAEOu8FXEh4hjatKgyrq6Y-iIfghNtlRNkMaho5vD8c,280042 +babel/locale-data/hr_BA.dat,sha256=E_S8FRdn0yszTWFg9RlqTV5zEwCc7-qtod45Ud8LHyI,1188 +babel/locale-data/hr_HR.dat,sha256=PqaNYKNdTFgfgmeiINdYp2d3q8qpfkCUs1y4ZHmsphA,635 +babel/locale-data/hsb.dat,sha256=WF1CY7Aj5UzGGJq6rF0rLsfpVs8djCWlbzcfhx_sf5c,258390 +babel/locale-data/hsb_DE.dat,sha256=_ELT9KBswSqeyiwbcsP9nFY793FE8PQzEu_2w78Amro,654 +babel/locale-data/hu.dat,sha256=ttkx4LP7bttS07ejxX-sDXMEBmpo8XWy3wp9FOyrYQs,224668 +babel/locale-data/hu_HU.dat,sha256=r3RZskHfUdk1Ba226wqBHAoRMXorlh-IkWLlnY_mBTs,653 +babel/locale-data/hy.dat,sha256=FPjMAeHw-1BjlQcr9gYrh0MOtm6CJgINuGHGo6ubpHQ,250022 +babel/locale-data/hy_AM.dat,sha256=r1Bb6WWX2QxVlLP5vRVgox0HgoDOosA-h3oYKLeZMIY,635 +babel/locale-data/ia.dat,sha256=eiarwn6xgBCoGh1tMxduBVzWzCkTf0sIwSZyuoCg5gs,150666 +babel/locale-data/ia_001.dat,sha256=fzAkHPu7PNj2TOl-kQcJLIdlEK6z-KfVFUVcy-YF5Zg,941 +babel/locale-data/id.dat,sha256=q4CIHLhOmaXdrOHtKhMne13fo1VJLPOhzY97H-qE2MM,188243 +babel/locale-data/id_ID.dat,sha256=GvwO35RP_Y8vswE60ItYMQa7XUOBXGLk8tvL8kSJkY4,635 +babel/locale-data/ig.dat,sha256=jcP65j1rPBE6AEPFI0kKEFbOVjt97dcQA_KmkXBVuec,118121 +babel/locale-data/ig_NG.dat,sha256=2MR603ed1L8Y_aZhXPk7K7J8bgQPE4xvvpn8R9Jodiw,616 +babel/locale-data/ii.dat,sha256=Xj_vdySwq9TkfM23teBtVgLYy1hMhyJngE0suii_pmU,12414 +babel/locale-data/ii_CN.dat,sha256=Vr_Oe23kFnz-EDfl7XeDv6GeTY0LSK-VV6UJpzU8yJE,635 +babel/locale-data/io.dat,sha256=laqBHV7QB933VjLibEOmRezXV9StwhKVzKvWp8e62YA,932 +babel/locale-data/io_001.dat,sha256=T6zZvvSVOcdpy3fhXbdPAWmHCvDTluick2U8_hUDu2E,912 +babel/locale-data/is.dat,sha256=TZ7NYQ-Q29gaLQlg2H9Lk_vsOKTdXLdiw4GJRWR5Ks0,217697 +babel/locale-data/is_IS.dat,sha256=f3tUj_oYhQ6_tGnn8yda4PZfqChiHmcZXo_nMDCtzSQ,653 +babel/locale-data/it.dat,sha256=LOEVop9C-GT5fmqr5xaJDzJTPWQt2rdPnIEw_yev4Vo,220387 +babel/locale-data/it_CH.dat,sha256=Tvtge1s4BcbCeKJmPBiSbtbf_qv8wrw3Eb4Dc1sF3dE,2942 +babel/locale-data/it_IT.dat,sha256=-e6EK0A6gEd_G4_BHlmd8_caQ-k_JrEemNgdA0czhsQ,653 +babel/locale-data/it_SM.dat,sha256=xjE63TohE8bjkNiOh-BhOkuB9YWpQ0n2rrBMJoAql5E,653 +babel/locale-data/it_VA.dat,sha256=wwsl_eAmNu9m2JPZnpBwFVh4gsk5AM9lSx8UAXhrMlE,653 +babel/locale-data/iu.dat,sha256=53RtGr8AweFKBrGjz7UdyAcz38J2XsojcKxIeQg1NOk,3873 +babel/locale-data/iu_CA.dat,sha256=C449KxuskTW8w7z56Vv602QRYsQ90O0WbazR7VqlDa8,635 +babel/locale-data/iu_Latn.dat,sha256=3YkIAxkY1-gh5mpslT_pfhBfy7O-hlJB0R9G1usaRDM,946 +babel/locale-data/iu_Latn_CA.dat,sha256=C449KxuskTW8w7z56Vv602QRYsQ90O0WbazR7VqlDa8,635 +babel/locale-data/ja.dat,sha256=RuGLGmPiXVohZ_BjwfnXSa5xqZHaDQX198Lne6R0V-Q,222257 +babel/locale-data/ja_JP.dat,sha256=o2pbFmlkEZjV7CHE9cYENYVv2kQA8texhNDhEecgQ9w,635 +babel/locale-data/jbo.dat,sha256=2eB9ymOoFb8abB-v7ISAGcAg4HEEMmpuseHIXFgtqkU,1008 +babel/locale-data/jbo_001.dat,sha256=wwLKEXJOwULYD-q92kQdvpiwW2fgis5YcsP2mT4tnT0,746 +babel/locale-data/jgo.dat,sha256=_761luGFV86HXtwm9XpenLgaehrfIfhzKW7HwodRuG4,12680 +babel/locale-data/jgo_CM.dat,sha256=1lDyjZLpK6fS6oSpfnVLdYd2IUgGlUQfF53BDdK7TLY,636 +babel/locale-data/jmc.dat,sha256=RNnPpcHNebyd2M1occ5GM2zSdGgZ6sDNx1cTK8hh82k,15958 +babel/locale-data/jmc_TZ.dat,sha256=fODp_OsVygbH0UoRsx4HHcXrde02bRKc-hy80sDkcK4,617 +babel/locale-data/jv.dat,sha256=XI-l4qwfKfza5yuz5n60I0qjbhMXMLK_Z6ZI3aHjNs0,158607 +babel/locale-data/jv_ID.dat,sha256=G3zTSeqWMngemp5lAcghudTcv-i8egZS12P0-T1DNXw,635 +babel/locale-data/ka.dat,sha256=XwQR8_em-AVhIKbPVDozHYSPLxYc-P8N7jagfgBkKS4,285735 +babel/locale-data/ka_GE.dat,sha256=zzw4NZBk8dsHIBeEzB3Vtf2_1nC4DhqblLoBUXfNHN8,635 +babel/locale-data/kab.dat,sha256=lTVrc1W7MDoXagvUCYTVqS5ZzBR2Ln9SbXKNnAW3Whw,151483 +babel/locale-data/kab_DZ.dat,sha256=v6fd0kyletm1kfN2ibSUh6oddckpLHjPd_qrq6FQpd8,679 +babel/locale-data/kaj.dat,sha256=5Bmv7LPJ6mRkZShPRasiiUs5vvQUprGcz_4dRU6XLDw,2753 +babel/locale-data/kaj_NG.dat,sha256=1RODrBAPxCrrlTgfhpdz-VxQkTdjJEJYHaJEsOgQsNk,617 +babel/locale-data/kam.dat,sha256=Hpnb35vRgAxfiKnuLXDSC9PzJcShTiOVPCA8_jmi-D0,16095 +babel/locale-data/kam_KE.dat,sha256=8AQQhHQdaI4rBKXfTivg884XIDfZlbDEQM28KwvB2Og,636 +babel/locale-data/kcg.dat,sha256=dOZR1bP8sPbhD2Mk496Twz8MOivgGQoliuDMAWSO9fY,2549 +babel/locale-data/kcg_NG.dat,sha256=jCObRZa-t9Khgx_M8ps0PLbeit7rPCFtHeCOhtfCnOY,617 +babel/locale-data/kde.dat,sha256=GxEqL4RE573LuQAtVcwgk27YBRd9MqMHyyddSetrScY,16389 +babel/locale-data/kde_TZ.dat,sha256=2sfb3gejYM15YtZeRrc0AJgdaJhqgbVJ9c9yF9SlJmg,617 +babel/locale-data/kea.dat,sha256=8xapxF7U_7OqKJT6xNU6CMiPEvKPM38WQ8Y2fEL323w,95879 +babel/locale-data/kea_CV.dat,sha256=LyzxPE6yP0f9hdD4uvu8CvEp8nmcmRDVuRI8YxBQ5wM,617 +babel/locale-data/ken.dat,sha256=PMrEuqYRQIhbpP2dPowHOL_NKKFpEBd8qNUV_NpZnDw,719 +babel/locale-data/ken_CM.dat,sha256=jNEojAAtQqJMkEq84kxHU5hGOVQCOW_hnGQScxycYMo,636 +babel/locale-data/kgp.dat,sha256=vMgCopXVOUrUUVn5Nvjj8ynCdJitmX7vkkx24wXGW_w,210828 +babel/locale-data/kgp_BR.dat,sha256=FNSYAqPhkzoZzholxTydgasgkuw7jgxCfyKDbeRiLt4,636 +babel/locale-data/khq.dat,sha256=27tQDio-rRfhyBJj9uoL__hYEuWLDg3j19mDND2UohU,15852 +babel/locale-data/khq_ML.dat,sha256=ViqThOcZTHZBtebV8LJY-DXdWVX5jAR5pdlBrTKws2Q,617 +babel/locale-data/ki.dat,sha256=RQuBrvBn59856mBdBQOQyV_VwQH6VdQyQtIElMIuyaw,16037 +babel/locale-data/ki_KE.dat,sha256=PNoxhP-WLxW2vH3fS8N9Nuy0tVimMP-ZAaCfLfnfDN0,635 +babel/locale-data/kk.dat,sha256=XwwTZQPh7uFOewYlGBYVKctOeECt7RiWsinsY165BPE,256332 +babel/locale-data/kk_KZ.dat,sha256=eaQW7Va1z2L34hs-D9QgrmyvOo4Lpy2uxxvxms6kL4s,635 +babel/locale-data/kkj.dat,sha256=crvX9EE44zPX_yiSgE0cMUccp9jiag8asdIzDAnd8SE,4695 +babel/locale-data/kkj_CM.dat,sha256=gqHwzVPG_Lo3svaIVe0Kfhj4DaKtstOxJJhUGvvpSbI,636 +babel/locale-data/kl.dat,sha256=qh2frWDdC8LhcNBCV0Yds7nyQKZtcpp0V3C-_2Sjla8,59424 +babel/locale-data/kl_GL.dat,sha256=c49k11GtBG8-vExsQNo_d1pFaQm0LYmXl7QcMSTEApA,616 +babel/locale-data/kln.dat,sha256=MUyFLtLrWaxHjqxvhp-9QeuBn2ny5DEI4_hhFzx2uog,17923 +babel/locale-data/kln_KE.dat,sha256=ZhkKgZ2lTdWAvWVOJEFlp4ASvjk2hcyTc2_P9s3mykQ,636 +babel/locale-data/km.dat,sha256=Zr4gWySMRpRbjtFYPxjgWsz30Za-PuW1gVFCuTvlqpI,231560 +babel/locale-data/km_KH.dat,sha256=bnykdq-RYJ0ZwajV5dFBVtM4anVkLjXutFdUxKByQ2o,635 +babel/locale-data/kn.dat,sha256=iLwAlelmus4bDc8gYWq-77ykBMfnD4lSBbpslNh6emk,301406 +babel/locale-data/kn_IN.dat,sha256=rx1LJYeAP8xU6MIU3yhHLuije5OQWL_wzz5glztIdi0,658 +babel/locale-data/ko.dat,sha256=2GkYKzQAnSMlCu2FrR8FXIeREGaeBopeOnfaJkD7K-E,195920 +babel/locale-data/ko_KP.dat,sha256=BCMOKQSzXNnjAUWfZZ8pbFoSDBed9tnnatyqIePNWio,816 +babel/locale-data/ko_KR.dat,sha256=CJqKij0oULIeCIG8McohdnhEsfJxUwmJHOpJY1bLrNY,635 +babel/locale-data/kok.dat,sha256=6nwMKp53pdA_w4rLynowHcK1zzFQUL5E_hmGWx9430o,213540 +babel/locale-data/kok_IN.dat,sha256=GiRy8Q6VCULzgIxNPFEZzABKOg13Un-DblBwXnBSeEk,659 +babel/locale-data/kpe.dat,sha256=AHR_ZG1p518D4yulM_cs5E58iMsVXKk4Hi6k0V0IDhQ,1331 +babel/locale-data/kpe_GN.dat,sha256=7eabSFmszupn0IlzP6TRg1-7FZS9AB3JdBkDgJtIs64,1210 +babel/locale-data/kpe_LR.dat,sha256=4O2gzHn_orogC0qOiIyIox-JjyA73hEAe_fZ3Fj5tYc,617 +babel/locale-data/ks.dat,sha256=j26yE-FMnGmu7lhY-71ZEm-xvtTfIdUrgO4x0swzK2k,116505 +babel/locale-data/ks_Arab.dat,sha256=fzDL_rCiC-BqymPhF6GBX-d5uVkvZCE4e8JS2L8cjRU,850 +babel/locale-data/ks_Arab_IN.dat,sha256=-OE8PBigMDH8zQrxiaffmabm91Mi8-OVdDR2JEK8xPA,658 +babel/locale-data/ks_Deva.dat,sha256=qco94Hg-V3CSx4efEtFGlFW1sz5W8WZ1a82WeGkREhk,15457 +babel/locale-data/ks_Deva_IN.dat,sha256=-OE8PBigMDH8zQrxiaffmabm91Mi8-OVdDR2JEK8xPA,658 +babel/locale-data/ksb.dat,sha256=GtwdEsb7QiUhqfSh2cx3c1OQzjsp849VFl421oLMU3A,15939 +babel/locale-data/ksb_TZ.dat,sha256=PvWBMUhpMhV27zE9BCEJW8oMqRXWK-6VwmSsXZDMTPY,617 +babel/locale-data/ksf.dat,sha256=q6dMPvU7sPvvrz1vCZnxWBm45B8SIZgJwtuR6ZIhvM4,16448 +babel/locale-data/ksf_CM.dat,sha256=0OOsuUS0S_AUxUPySFQOZVbPcB3F2I4yzHZm63YypDU,636 +babel/locale-data/ksh.dat,sha256=bmwVCtsEvkCDKD-Y65v1ke2YPdDl2ovpvX3cubOY_jI,90334 +babel/locale-data/ksh_DE.dat,sha256=EhgYIJQaC3LGiWrcE2sdfUC8LOWJnciWORi_yoRkOvw,654 +babel/locale-data/ku.dat,sha256=wsHL6HO7NlbjcwMMZm8qhGu-a7mnQTWp43MKuv6Vx-k,30803 +babel/locale-data/ku_TR.dat,sha256=LoNyoL-poYXgqejDzB9-zI_0TIJF3amwyzcs6UnHUII,635 +babel/locale-data/kw.dat,sha256=cn4YhRhAi8s6-1gaSo-f6vJ7IOuDlBh8yYdMPDU3kXM,7317 +babel/locale-data/kw_GB.dat,sha256=ol7LWhJJFNoNkFEjtk4x1PpLkML9UbuVmZAuG47LokY,653 +babel/locale-data/ky.dat,sha256=Nf8DN9KcYuzzBDmExRTACbN5YCZi4faL550H2m-duuI,236385 +babel/locale-data/ky_KG.dat,sha256=CdtjRR2iZgfG5pdz13MX-EHTDtN6BdLeZwGCmrZnrkU,635 +babel/locale-data/la.dat,sha256=DDW-oS3Lp1q3n1J6787FxfrG6B7s7ud8DnZuZb7QfLw,35701 +babel/locale-data/la_VA.dat,sha256=dhULocaXyJGitrljd1w688DTmezcmmY8YcoKsT30n34,653 +babel/locale-data/lag.dat,sha256=rME76vdHS3s5EKyGtnVWSvW-_F8CJmRid4F0d97JFLo,16855 +babel/locale-data/lag_TZ.dat,sha256=LlfEls8DDvoVp07MYnFdLBPUhkJs2kzwUDk45BZIO-g,617 +babel/locale-data/lb.dat,sha256=pHw62uemLovgiVlep0pCtW_dToq36Kv1O0rEGv2Hxzk,165821 +babel/locale-data/lb_LU.dat,sha256=s0AY2-F7BqA4tMcRPjCfbzbXRbHsKnD6uIQGSkulCT8,653 +babel/locale-data/lg.dat,sha256=2OuuUUKOOAuMMprPQo_nAJJ58OREAn1OzGISkXWsF10,16330 +babel/locale-data/lg_UG.dat,sha256=nyn_HKdBHGkHlbjlDX28L5Z9k59MKFqvmVL3vg222s0,639 +babel/locale-data/lij.dat,sha256=BoCWfNladj1i2Iz-zTdDgR1qugvTSWEOtcMw73UNWyE,154215 +babel/locale-data/lij_IT.dat,sha256=rtPerU7ltwkHHc7HErfwJfX8TDSCpTHvBzwKBdSt4x4,654 +babel/locale-data/lkt.dat,sha256=y_oObtwK66QVFI0voX4zQlpkbH8Nob9LqKqYtVzQxt4,12492 +babel/locale-data/lkt_US.dat,sha256=ywWg9m80tNjumAxGNrBwYhXhc28rC4OSdyvkdXAKs5Y,654 +babel/locale-data/lmo.dat,sha256=GYoR98Ap5hosG9bfENEA3sCkR-msF_KvxV2nLydjs9s,1659 +babel/locale-data/lmo_IT.dat,sha256=Xg4Qvye_hPNJLCTwoBuRMAvhtjQb8VlD9SaH_5hVG9s,654 +babel/locale-data/ln.dat,sha256=NVsdj_LgEQEmpiTN1jc9xRl8s6u2K9xJysJokThkkJ8,25824 +babel/locale-data/ln_AO.dat,sha256=VNcFViSaGw3f92D60Uk7vxQ8i6Q9H1FD6paDpJh-r4M,636 +babel/locale-data/ln_CD.dat,sha256=Ao_lUWuswJgGHhVJYs2_Z8LyN4iqgYsAda8f9UarT6s,616 +babel/locale-data/ln_CF.dat,sha256=g5Jy7ovUkwcn0W5Ov5bu5SBc2iM4SWwUFwtzWzAAb34,616 +babel/locale-data/ln_CG.dat,sha256=jQld0yw63ufWbhlOt81wjf731zZluc2zWc1A65kBlAM,616 +babel/locale-data/lo.dat,sha256=-2yOGrzLzZwzcjtIpmBCUMERnScEm9OuO3vLLj6lGik,242881 +babel/locale-data/lo_LA.dat,sha256=gNa7KRGYWI0h0PcHJ35bwnPskILOH-1jLjHCXP85jaU,635 +babel/locale-data/lrc.dat,sha256=LLyO2gxi4MNG0JEFZ7BKYa6g1nvRTMQWWxSkNLmv96g,19325 +babel/locale-data/lrc_IQ.dat,sha256=cy9DO9oAKI51NMitAb2MTbZoxtaAPzaYVGV0-xd0mGA,1255 +babel/locale-data/lrc_IR.dat,sha256=-ca4EmTX5VAi_5tDfimpevJFb-g8vAjgpe_jkDTDZWQ,679 +babel/locale-data/lt.dat,sha256=ayZByNT5skVArE87dP2f-tcj1h7D4ZOKRgq5cm5EdR0,332515 +babel/locale-data/lt_LT.dat,sha256=j8dIQrFc0s77xJ4P-UGiDcaNqZW6CXOEiOh30FemNiY,653 +babel/locale-data/lu.dat,sha256=vXjd-K_YhUylyGo_hqNWzsGmjGd9KggrmjUEMXITAKY,15825 +babel/locale-data/lu_CD.dat,sha256=K3k0wMpIbjusgPC2W1q2sxyxynx2M78zOLjt4ikcoZA,616 +babel/locale-data/luo.dat,sha256=mlvd9-4xl7PcHqaDMyna_Eu3UWtZOb73hlxlxqgvXdo,15781 +babel/locale-data/luo_KE.dat,sha256=jVUd3oO_U7IP6KmvSkVHYNmlCc8_-m2mpJMBaqArSFI,636 +babel/locale-data/luy.dat,sha256=70evj0tg0OheZ5vwOVzq4YVyz9oMIyNZZ5-6xQQgPcU,15755 +babel/locale-data/luy_KE.dat,sha256=NVkQAtmDBXUws3KybnM706J3lwUc5fJo-YEjKd1zhiw,636 +babel/locale-data/lv.dat,sha256=QTnBtKAoRW2D1FzgP3yMSEnVmkUMtMzt_0zLxWiTa-8,255908 +babel/locale-data/lv_LV.dat,sha256=oS9W0pdiTNtMTeGOsef2K7Va2O6k-dQEtN02qCaAoFw,635 +babel/locale-data/mai.dat,sha256=gd7TmTtbREsB7R7rUtkMt_ajz3kIfIfgHiWJPkA5EA8,104503 +babel/locale-data/mai_IN.dat,sha256=DoclpHa5nlHcAflg286ycOjQ6trZP8uHThzcp37Y91E,659 +babel/locale-data/mas.dat,sha256=PhzhoV8zn93he2AS8EJ-aft1AerbudSZhbGCA3G4PtU,17211 +babel/locale-data/mas_KE.dat,sha256=zH3Le4j03YNsPjt_-GL5RvPG0znnJKQ3ifbLhMZsoYQ,636 +babel/locale-data/mas_TZ.dat,sha256=VyRJlBqV_fukTqSR9Jxr-PujSA7u-MP9aXrJBVJCKiA,638 +babel/locale-data/mdf.dat,sha256=KLWsB8nHbvJQCML8zcqIYUk1ZDIelckeBlZAlfPYWqg,2136 +babel/locale-data/mdf_RU.dat,sha256=sVnTxgzU2rEwl7P4d5UY6XOKv1XUCbtkEQO0cu2OlOk,654 +babel/locale-data/mer.dat,sha256=1IhN4YFj9zmZAlrOzfcJg99NlD8Gplaad6KCvIFS6jo,16002 +babel/locale-data/mer_KE.dat,sha256=WqDQTsO6BtbROdcj3p3omUZk8XB6HiJrIlCCj_wLPxo,636 +babel/locale-data/mfe.dat,sha256=emRd-yzbPo_ATc4KG2yYsuo0PPpdppTOJ4Yy3pKicGc,14842 +babel/locale-data/mfe_MU.dat,sha256=MHUOKiQPHuUbhT6hQXJEkpGDvTUyMV4btJTuiLhJQ4k,617 +babel/locale-data/mg.dat,sha256=kwsUKMdiqF-Kt3pVWIO5K3O8p0_ZtzfIRLL1s62cC_M,23722 +babel/locale-data/mg_MG.dat,sha256=uJbGeEzIn4Rh5Bh4hyV-Hs0_qez9KBeOi4hvfC3zkIw,616 +babel/locale-data/mgh.dat,sha256=RbrZzWNTriTwiGpvPV-26217sk_8nMgW9g6wDtCDRFE,10218 +babel/locale-data/mgh_MZ.dat,sha256=aFZZ41qtARE6CeecCEx99tzW_fp-XfkAc10wpQ5YeGM,636 +babel/locale-data/mgo.dat,sha256=6gETqFSIyq7W6-XtpYMXwgMaKFwNh2bodKlkVOCf0U8,8257 +babel/locale-data/mgo_CM.dat,sha256=Nsp33t4abZsKdDmIgB8tb08OsEh-7JXMY_JKCsd61zY,636 +babel/locale-data/mi.dat,sha256=GGB55X75ngxlnbBqYDokM2IfP8J6XR8q2YNQn7k4x9c,50301 +babel/locale-data/mi_NZ.dat,sha256=RElP_P4F1HDHjSHsdt54vriFcz0TcIeT26pm-_dy-Mk,635 +babel/locale-data/mk.dat,sha256=ReFBouBnKwy3ySqiVMOQEr0U5tuzY659mSfB1cx34ZQ,260709 +babel/locale-data/mk_MK.dat,sha256=qlI1ZtLgyX2fcYS9pnTa8illdSnPmfNXORjws-H93lc,635 +babel/locale-data/ml.dat,sha256=H5MEpV6hC-ITLTwAvT128eTAb6-t6scsbaZzoZd5-Uw,319609 +babel/locale-data/ml_IN.dat,sha256=VwCnSFs3oh7xo4-nS1HzWj_xICDzG6E-AW0Oxi6Lu08,658 +babel/locale-data/mn.dat,sha256=FjtScSmoJ_9TPyMBMczjmFuiJMuFrH0K8RmJjyjEdL4,241487 +babel/locale-data/mn_MN.dat,sha256=qhJGIDXSglsa3BYCalsusoyiKgOj7PJ90Yi4ET2-nxc,635 +babel/locale-data/mn_Mong.dat,sha256=DhbpwA41sPBzDr_gadoIfAFfiXPvp3C_c-7o18BGFzI,2310 +babel/locale-data/mn_Mong_CN.dat,sha256=WTF89EShdtBd0Vz62erFwl9KTG-GgEyzjjmKWuJCFH0,635 +babel/locale-data/mn_Mong_MN.dat,sha256=mcXWuP7AhWm5YDzteeRNMVDCx8l732MhYQwspy4m7s0,14024 +babel/locale-data/mni.dat,sha256=ZRY33HsSwuJDHN7vgQK2a8PGkIfdTO5ILZqjUrawzno,16463 +babel/locale-data/mni_Beng.dat,sha256=7PTKZT_UE3WNiipyGHnn2SDNFNhAcqHhEJ8T0Y3O7gI,693 +babel/locale-data/mni_Beng_IN.dat,sha256=nAW_LfRtJqC6-ehdC8yyszjhibXqMAXPkuaz8POQav8,659 +babel/locale-data/mni_Mtei.dat,sha256=zdzwNyaRIil7lkjEf6ProQX0nwYlc5VF4r4gHNTUVTY,1720 +babel/locale-data/mni_Mtei_IN.dat,sha256=nAW_LfRtJqC6-ehdC8yyszjhibXqMAXPkuaz8POQav8,659 +babel/locale-data/moh.dat,sha256=4ew78Uxue7R-Rm4jJeZ-UA3Ors6UNqnX5FUNFgcuu4s,1358 +babel/locale-data/moh_CA.dat,sha256=AXdrS_As8DrrTGs5IHmQwXoEXndFuoWoTGXPXcL4Pk4,636 +babel/locale-data/mr.dat,sha256=7ZPGySE1iaXP4as5IjWMoTrAz7StlcQeDUkmYT1A2_U,281124 +babel/locale-data/mr_IN.dat,sha256=HOu9QR1BLbciqF6BeTfWvD0L5Igwv5HrCWu9y_vNns0,658 +babel/locale-data/ms.dat,sha256=olOwb4asrHoVg1aq1WD4rLDTW9DnLeXfQ9YrWips3pI,172528 +babel/locale-data/ms_Arab.dat,sha256=S1UK611gCf7hJ6NhS2MVPebOi5gql5cbeKZOMa-hlns,17516 +babel/locale-data/ms_Arab_BN.dat,sha256=vTEKSh0hjyiWJhf503-fwjADvTCN0AqRSzF6muL52JE,1335 +babel/locale-data/ms_Arab_MY.dat,sha256=w6ZZrz3qEmnsLsWtJA8rTohqF1cxctkzSj4WN0XHuHE,635 +babel/locale-data/ms_BN.dat,sha256=EDfyP39y0loC9OYv8o_KBHiSMRX4AyO3WKSrJw59-wg,1355 +babel/locale-data/ms_ID.dat,sha256=Bu0vs6QgGGSjRV8w_79uSKRyDOTzEJoY0zkaDmifZeM,3591 +babel/locale-data/ms_MY.dat,sha256=w6ZZrz3qEmnsLsWtJA8rTohqF1cxctkzSj4WN0XHuHE,635 +babel/locale-data/ms_SG.dat,sha256=jsfNag5WQWdejzh5hayA7_-IbY03MUVPAPDHUJyCZRg,654 +babel/locale-data/mt.dat,sha256=Y1FOafPkLPfdxbpnRWeg_bn4j7Y3UhXGZQhEnOtVAZU,81584 +babel/locale-data/mt_MT.dat,sha256=L5q5LizZQL0-FLj2U-wn2YhkpL3p7ZvjdyAvH1wwUG0,635 +babel/locale-data/mua.dat,sha256=r6Z52nAqw-NTHFh5oS8e6Ka4eumfO-zgvh_cnYXOwhs,16522 +babel/locale-data/mua_CM.dat,sha256=Ib4K67KfndwGsoZDH0ehHA-F7V_SUj7q9VsK2juzaIQ,636 +babel/locale-data/mus.dat,sha256=6HDGlgPkgIs0969LeNwy3PlDUu39-Kb7VphEdGRRC0U,2815 +babel/locale-data/mus_US.dat,sha256=xcd4KKUIqBwSefSC0GGSDkvXL46eDWgWolJsGuSf654,654 +babel/locale-data/my.dat,sha256=xtHbCYyOQxLWAK_tbnWf98GzJKa9cCkORtoOjDX373g,237294 +babel/locale-data/my_MM.dat,sha256=l53-D5YL-BbmLZYveFV2ISa4NcrSwTfKsRRc41Jd42U,635 +babel/locale-data/myv.dat,sha256=IrUiviXedgwt8UpDFgAh2dGcsMMhL6Q8IEPefcG_s68,17716 +babel/locale-data/myv_RU.dat,sha256=sncxwOpjfFkRASKHMP1ytKcjpF4w4GjU_JEVqXv84Tg,654 +babel/locale-data/mzn.dat,sha256=nBwkbxjQxQvO5evMrWb9rAUV2LYq52-lXw0ZgU6QQhU,65671 +babel/locale-data/mzn_IR.dat,sha256=fjN1ek2fAzZyzFJpjX_MIc5oFOEqj7LS_SNdBOQS9ZY,679 +babel/locale-data/naq.dat,sha256=_a4WOpBhdnn0fdmjjQw2cCoPvBDw0caDDg45VxxBmBk,16519 +babel/locale-data/naq_NA.dat,sha256=e5gAIOo7le-dVOAX_k2OW6gEyVfEUxcYDUJu_MBDY5M,617 +babel/locale-data/nb.dat,sha256=-bGHDSonSEdqfb2PxNC1_3jOHELm3CwV7xzEtpmWZUE,1330 +babel/locale-data/nb_NO.dat,sha256=J1UiN-AG900acMz4p0fBHtXDpS0HD6uGAi7gg9gOrsY,653 +babel/locale-data/nb_SJ.dat,sha256=XcK9_nKriUY_4k09kmgJalGTls-e5-YS-MCPEKLP8vA,634 +babel/locale-data/nd.dat,sha256=3Kq2nRkxqxjSBKbrnxergjiyQ1mcOT20xkhdNA8kUcw,16226 +babel/locale-data/nd_ZW.dat,sha256=KpZHrPr_0Ru0t9ojSK9ZiqGZ6-rSpvA7cX9C483ocRk,635 +babel/locale-data/nds.dat,sha256=sqomo8seDm1VS2hqw2GeyzPt3YjmRkuOGM1sbtRV-cM,50795 +babel/locale-data/nds_DE.dat,sha256=Qmh5DjX65W58jXXXX3pxfxS_HVTJVavMspBPdph9sfc,654 +babel/locale-data/nds_NL.dat,sha256=E_EO3ylaBjJNThr211Yzefh5DRbkEFFVpbBMXIQ4U1U,654 +babel/locale-data/ne.dat,sha256=A1QCwmbxXBqeDzICTbjG3q5foUJGH4HgfSi2ZWw-498,274134 +babel/locale-data/ne_IN.dat,sha256=SFloADZtyb42wygQmrMy7yx-aADGQECZJUey796oqnw,1292 +babel/locale-data/ne_NP.dat,sha256=LGc7Z5TRi0HRNQdY4bqPitV73gzTPWLd_g-6aPyvryc,635 +babel/locale-data/nl.dat,sha256=Y2MSK7SKYCNriwQrNxioqepkfIXObt3tcjaYGcDvJaM,237923 +babel/locale-data/nl_AW.dat,sha256=HYycPPe5HDhuP_zN89ysXR2AqjIbx_-XB2n0-TUPhxw,638 +babel/locale-data/nl_BE.dat,sha256=Yl6u2wQU62h3hvXobO9r3sXdrq2d9pans2N_wImwRDs,1910 +babel/locale-data/nl_BQ.dat,sha256=lZQzrmWsFTpiWwT9l6FakrNoll3QNP3drIMcxFkAy6Y,635 +babel/locale-data/nl_CW.dat,sha256=doEeLSsQVaSocP4jr5LxNrT5luSiG4hkgsMvoYjJBtY,638 +babel/locale-data/nl_NL.dat,sha256=bGo4nyjhqe1VtDHlP5EUmNkBKsViUSiH3h_ikXcPuRo,653 +babel/locale-data/nl_SR.dat,sha256=d-YXA5QA5b2Bh-WhxNTkyKQ4ROhuEg1CeGN5XmzWcZM,696 +babel/locale-data/nl_SX.dat,sha256=ciTQIntv0njAJGIUENzo6stN8yarfh-eBpmEzxmpJbs,638 +babel/locale-data/nmg.dat,sha256=z-vVhNGtHFAW9D6NBmqzxDbj7G0g8L4n-l3v_E3UlyU,16148 +babel/locale-data/nmg_CM.dat,sha256=0A-cVUgt1l1ITnPRdcgWiQ68ZGqHDYd-k2wSc_nXnMQ,636 +babel/locale-data/nn.dat,sha256=n_PmkSBfFrxqtO7GJhiZTr8QEMdgc3MfPQnKboH7x-c,68872 +babel/locale-data/nn_NO.dat,sha256=98eWK3CBq5T_dI4a6dQH2TktRygMH0EnpO1EO7w8lVY,653 +babel/locale-data/nnh.dat,sha256=6DL18mnBvO-sh9vGPjLSWi6qgIQmp_msS58XsYLm9eE,6673 +babel/locale-data/nnh_CM.dat,sha256=dt9ZNHX5ZQo-kcyT4-mVRCUiuzL-H2A9e0s0JrHwZts,636 +babel/locale-data/no.dat,sha256=w8PeOU8qfV0seaM005KYEJ7Yh0XQYM1OrjqoJqUaEHg,238457 +babel/locale-data/nqo.dat,sha256=oA-5QvYHoJE5ebe0YRBb6mfPWCK7OZPDvlODJH1F39M,56658 +babel/locale-data/nqo_GN.dat,sha256=3eOSTBaZM0RNLUDZFr__KTR_9iZoGUFq9M6bhtmHjcU,617 +babel/locale-data/nr.dat,sha256=UihZdFPq2Dl8TZ0SYLb7UGKgnqBuVdVIljmNBSY-gKw,2479 +babel/locale-data/nr_ZA.dat,sha256=e4_czqcyMye0qthJd2hzn_9inTS8WjjbFOzRJ3wAS24,635 +babel/locale-data/nso.dat,sha256=0v5HeipvUI_2TeT_TsgkBwj0WilGl3bnwxakwGhJ0js,12632 +babel/locale-data/nso_ZA.dat,sha256=TdOqVTzKNigLD6zOPR7W7QHT-Aw40ylsUE7bmMwgaKY,636 +babel/locale-data/nus.dat,sha256=hgxjaDWCEyVcGI79vpmpF0aM8bcM_pPyFrz5TqLM0Ho,9148 +babel/locale-data/nus_SS.dat,sha256=Is_mWvnSS7j05Vk9RHcCfyLOdhOeOWRqgXDf8FGNEJQ,617 +babel/locale-data/nv.dat,sha256=6KleoDsaTjhXti0fFXfR8hwOUnjmVx_lLgI6Y9MIP8w,763 +babel/locale-data/nv_US.dat,sha256=ak7j2GDaOMbAAmXQhfC9PRM8E9h_hJZL3UDqxqjCtoI,653 +babel/locale-data/ny.dat,sha256=XXvyFcRnNcH9KcAH1K7jzS5xLFsXMlXVW3yowhXPIO0,2152 +babel/locale-data/ny_MW.dat,sha256=kyhkcpqgIwSrUcfxve2OS2P9S1AfXItRHmy94K7cQ48,616 +babel/locale-data/nyn.dat,sha256=s-r3dAJZdZd90y363lu3h75xm4kE8i5V9jUu6Wwwl2g,16171 +babel/locale-data/nyn_UG.dat,sha256=fEm-RMI6-PvIjbMUoZK68dTaiAmOqH1iDQBn23a6r2w,640 +babel/locale-data/oc.dat,sha256=3hoLz_ob_rlkYOi9YmwU2O7M4vpKsmFpLytl4vvPdnE,69557 +babel/locale-data/oc_ES.dat,sha256=XLBR4MaYZHXQwSW_BAWrwO8-an84qeuxT_y8LZfor2U,53139 +babel/locale-data/oc_FR.dat,sha256=L80Ivl6dUpQJF4fAY1xaAeCRO9BkN0l6oCr8nRwogsM,653 +babel/locale-data/om.dat,sha256=t9tYtK7T7OxJ9GlX2op8x97NSpY9hynKctK2FJB9Esc,16883 +babel/locale-data/om_ET.dat,sha256=v0wHN7iwcuJN-iFgWFPrGdplH6P-0c8B2OEqYOEeb40,635 +babel/locale-data/om_KE.dat,sha256=h8jCIllRrl8-c9jorHeFxZrbDZ2Ncj-L5iSbTFnB_XM,1593 +babel/locale-data/or.dat,sha256=GAMdIa-3woF-LrVd7XoDCeF1odh4_5SmSfC2qIF5Z-o,272016 +babel/locale-data/or_IN.dat,sha256=ur6a2cCdapMoKd-6KLXR2xAF2YU8xaueeW7UTPL2yLU,658 +babel/locale-data/os.dat,sha256=22JgCp7PlYngzY6Rf6dC3Z6KgRriV3XWyUWCz0oxgEs,17450 +babel/locale-data/os_GE.dat,sha256=8NgIdMuGlNow1dXmjW6y4xOis1_3raiXcj_jLBPirpI,635 +babel/locale-data/os_RU.dat,sha256=76MsfCZxiy_RXfhW7Do3Z8q4-jhp1hOXTBIsA6SlA-Q,695 +babel/locale-data/osa.dat,sha256=HBDT8EMk5cd05q10hoLjEGh7revrpG6P171zyhjG3sE,5342 +babel/locale-data/osa_US.dat,sha256=qFfjNw8tVOdprzqK2wBlGH4eNMxDxDQqDDReucJZR-E,654 +babel/locale-data/pa.dat,sha256=uFEQPuvdFRt6GA6MY9-PNZ1wRbwl8MfIClyhopgohks,276394 +babel/locale-data/pa_Arab.dat,sha256=TgKzLQj1KONLtB3XehaNU2OVQB4o-FW_tmu7_-9VtDc,3859 +babel/locale-data/pa_Arab_PK.dat,sha256=1Si67Mz8DZfo2D8Ld0b5IlZpvnSMgg4W8_zZLrHrWQ0,635 +babel/locale-data/pa_Guru.dat,sha256=fs7wqdmuGaKQCCwGkT3lRQSKmf1dxG3jyLboZeVtPmE,1276 +babel/locale-data/pa_Guru_IN.dat,sha256=kpz873B1I65nfS3Z5vDLmmGliFVPlPM58sB6jW9nkBY,658 +babel/locale-data/pap.dat,sha256=JDZLD-YVW6iQlqyeCDtVM4lsmtXnidOt-dwN-u8lRu4,2099 +babel/locale-data/pap_AW.dat,sha256=XZSGzQPijHNf5GjxUjDJQt88iD0ETRdZSTF8gn-1U4M,617 +babel/locale-data/pap_CW.dat,sha256=Mu-gCfh3bv9pzz9RrylMffuphhqgiRaODEZm6TtCpaI,617 +babel/locale-data/pcm.dat,sha256=rokktGzg-etVOw21TmIJaE9wa-1nb-BG7LkKlkUMpSc,211372 +babel/locale-data/pcm_NG.dat,sha256=3gBp38NIuVEbHlKAtQPQXJjT3DKvy7zvUqMAZS6pGzk,617 +babel/locale-data/pis.dat,sha256=yQDFCHO03lZB3LsXLP9mJQ6FdiFcmHz5LtYdyLf6Q-U,2135 +babel/locale-data/pis_SB.dat,sha256=-CDkXv_877c__o56bBeYHAAq2X9CcnKdI65DiE61_M0,617 +babel/locale-data/pl.dat,sha256=SS79Wa03ABQ_sOKashUvUN5oqbZmOylvFuNsfdbtZJQ,304460 +babel/locale-data/pl_PL.dat,sha256=3s2XpVyaKha_K9MesXKD6sZNGSn1PVRtuz9XYp1xrsg,653 +babel/locale-data/prg.dat,sha256=LcP5e3z7f9d8Y2JXu1DXyjNTENVMBuBlRsP4j1GF7bA,20302 +babel/locale-data/prg_001.dat,sha256=6LHF5Z1NaPiOsaIvXpkBZxwHGwZ872NhTmNGqChOiwo,1594 +babel/locale-data/ps.dat,sha256=js5Ulvl1E87VQIDRr-sVGfhYQpft9MBbg_PoI3DX_Jk,202956 +babel/locale-data/ps_AF.dat,sha256=sNE6bgx_nV0VWKa8InelUaFYSa3Fpx6byJw0KT4B1o4,678 +babel/locale-data/ps_PK.dat,sha256=O-ZkUudOlKrlurTpN76tsPXzlVHOLGjFoO_ngnIWGTU,8032 +babel/locale-data/pt.dat,sha256=Pw81Gan92r5gaZzsLZgcFuhfxJmkrOTg-Xc9TkQIq-M,236660 +babel/locale-data/pt_AO.dat,sha256=49hMN9AJBDNjcsQw-nl-jY_VKHanO0PGfvd--OxqOxI,1022 +babel/locale-data/pt_BR.dat,sha256=dVKYp9IwRMbjZ_ee-eXFPudSuTRrROvbFzY3dYTYmn0,635 +babel/locale-data/pt_CH.dat,sha256=zAvD0sYytEquwzY8ZRbVCcy7DS2ZzUXofl5qXOixZH4,653 +babel/locale-data/pt_CV.dat,sha256=zOQn8d7--PKrhRUhQ5mPKW1Km6Tyh5JF8hstfxpITzM,1039 +babel/locale-data/pt_GQ.dat,sha256=qI1hvtuSHOev12ips9o3Vy78NJpOMjhkW625M60lqZU,616 +babel/locale-data/pt_GW.dat,sha256=SRxbFDIg9FwEjGjutRI9P1SeLiZBqStwSqPuHBFZwLQ,1002 +babel/locale-data/pt_LU.dat,sha256=z9aq0BTWEnk4lXveNpmi89TKcXN_t6Ud4A_C97uyOuw,672 +babel/locale-data/pt_MO.dat,sha256=shItJIIDrxwlcQhWLhlZG0uhyTlSBDcTag5ivxmb9TA,1635 +babel/locale-data/pt_MZ.dat,sha256=UZ1nkXS9CpiCM1IpOG5XpGK2QqM5mE5lAgRLTGAWl-4,1042 +babel/locale-data/pt_PT.dat,sha256=Ix5iaB2EUBK6SoqBJoxCXo17OXYNvQ_Vijngq2MjnQc,107608 +babel/locale-data/pt_ST.dat,sha256=Cm2HUxlGtZaz8IXX5Ohms-HYuKgazuBcOZBz5rWOzEU,1022 +babel/locale-data/pt_TL.dat,sha256=CIIDM_Zo0xiu4gXngxYtkYK6ldTNZMRaikSD_sAokMw,1002 +babel/locale-data/qu.dat,sha256=kUrGQ4L0tVxwG_b1-9VjN6_N-s5Ox91LzpWgs8H82cM,138806 +babel/locale-data/qu_BO.dat,sha256=7RUvNrmuLtwqP-qab667GocH_c4gIvpas3dbN1uaGxU,878 +babel/locale-data/qu_EC.dat,sha256=_5V4RYoPb3eCAA7jOCNfB7WZqd9sWP1E0tlF8mGeqFc,837 +babel/locale-data/qu_PE.dat,sha256=Vdd0fcK2dtFgyui3Q9NElHuJ841RI-T5l2UHeBq8MQ8,635 +babel/locale-data/quc.dat,sha256=_Admf-sJxEnpo6MgV3-3kuNF2nk1_RjkW8LIhxCwdlw,817 +babel/locale-data/quc_GT.dat,sha256=8M8KtmnsJiTCaf-Nl5X174Omtyc6a0ri07kysDC3-5Y,636 +babel/locale-data/raj.dat,sha256=tjUg3ThgXtza6gABimig-EPb7Up5jKbnM7VanUUi7F0,2491 +babel/locale-data/raj_IN.dat,sha256=SS8GPzJu5j6nfXlDoX4NFPN2QScl4M0YNsrFmWklymM,659 +babel/locale-data/rhg.dat,sha256=kKSwVoO_uNQO12F4YP4f8_axq3hThAc2XCwAVZMFHVA,12292 +babel/locale-data/rhg_Rohg.dat,sha256=DAOuwC-7uaIuZtrIXvUkYt6YkxqaKpHOma1m0-XTtrI,693 +babel/locale-data/rhg_Rohg_BD.dat,sha256=DcLSBtf_k_f6B102-vbhBOjfzNZjiTDvEUdIOQfVc8M,1212 +babel/locale-data/rhg_Rohg_MM.dat,sha256=HspZzbytcZQ853Jstp-eFEdqSMAD3-shgjrdxY_KQrE,636 +babel/locale-data/rif.dat,sha256=eyKDJ1c94TMjWmwGz3xAMgDh2DcLC2kZQsX8CPKvYvQ,1878 +babel/locale-data/rif_MA.dat,sha256=Qq7ZdymuPdjHeYDUDGCjMuQBRU7w5qGdgzzZ6wPfN2o,617 +babel/locale-data/rm.dat,sha256=ETvEMTKhZEIQZkxizgoBhv6q7d__PO1AKtrBepjqlR0,103308 +babel/locale-data/rm_CH.dat,sha256=JHAlYXMD9Vks43cU_gcSEQmqo6pogWPl_R4VMUK2iHI,653 +babel/locale-data/rn.dat,sha256=6DKqK6D6GMFf8rntv29SEmrq9lsfVTItI7uZHt2HAKg,16744 +babel/locale-data/rn_BI.dat,sha256=r5Cweh7L4EAZK-qTmJuloWc33iXeR4IJUbknrl0XC3g,616 +babel/locale-data/ro.dat,sha256=rseUyqgVhgtYT-kbRBh32vn6WsqwGSoiO8ScpySi4fo,269287 +babel/locale-data/ro_MD.dat,sha256=MICjowyyNQja6u9jytd3Dxi3WI5vSgAcwb43cX_J-eo,3248 +babel/locale-data/ro_RO.dat,sha256=lLYIYWhDUmq1EZ9oV5SETauVa_5uNN5p52dW7XeemRk,635 +babel/locale-data/rof.dat,sha256=9MuPz_hPIFVTX4xjou2d6KaH9a5t7AvYlXcPK2jjdsA,16066 +babel/locale-data/rof_TZ.dat,sha256=I_qwGjqqrcwUR_3UNydHOm_EiiLZYyRV0q-s1qfSSi0,617 +babel/locale-data/root.dat,sha256=9Vm72r242O-I1COr-r9kDKYpGCUv5oOkVlggG1XdpVY,50707 +babel/locale-data/ru.dat,sha256=ZgoOvEMNv9bdRiutXP8zUfTjun7Bz3I9GOiytQ_NjQA,353323 +babel/locale-data/ru_BY.dat,sha256=99UlyhoMWnfyhI5ltXGaJkycWLVfJ3FwdxyRm-yr6kM,676 +babel/locale-data/ru_KG.dat,sha256=X-iAT1QuQGhk1mIetpGyWqDlwiBskLfwqrK6ant1XS8,659 +babel/locale-data/ru_KZ.dat,sha256=P1_Gn3esOwDLL8sd8vVYbFA8J7QEsaDAWfZvDsn-WwA,656 +babel/locale-data/ru_MD.dat,sha256=LU12oBwr7MfPTzfs8Dx7uUZVgHin8ybX_oPHrPIJTkw,654 +babel/locale-data/ru_RU.dat,sha256=IVG440mXjphW6iCsKysZCW1Gem_z5_O0lZI6-R3oG_E,653 +babel/locale-data/ru_UA.dat,sha256=aptMDcNM1sBQO4L6D1RYCa0dn76KC793HlTTqKBhyxc,1695 +babel/locale-data/rw.dat,sha256=8uzBUtHj9ty0o4Vs-UaMa5J87t0y9hGU2w7zgF29CzY,16372 +babel/locale-data/rw_RW.dat,sha256=tw-gtzH64PeIAmNGeobgUypw7RAyKITeFAcQPGY0MG8,616 +babel/locale-data/rwk.dat,sha256=7lg1nf_wtYUNHGip2e3MXWnf8ovUeQXVoaYJarV01Eo,15953 +babel/locale-data/rwk_TZ.dat,sha256=s9duai8NRoHwn8YpQrlMd3VDf6jtQxxcUmu9CIIMzC0,617 +babel/locale-data/sa.dat,sha256=H5HEaqVC_nVofSqAtVbgDxxSlLCp5SzqqzgoWRfZYuA,24408 +babel/locale-data/sa_IN.dat,sha256=ABNamoPpYRbO7bK6BGm0tK92kd7su7_OP7Di0wW0zZo,658 +babel/locale-data/sah.dat,sha256=T8bTksxuDgX0_YzpJ6PgnoRtF4BB3Vm4dVnFafFSWDU,51456 +babel/locale-data/sah_RU.dat,sha256=jHlseiwMbtN-IsETeG2dsaIn6OB2kqtAogazMnn0f60,654 +babel/locale-data/saq.dat,sha256=XUklSl56KHtJvgqcNsJpTNm6F2UtAbVLgRqBMdgVgIw,16375 +babel/locale-data/saq_KE.dat,sha256=kN94cJJt8AT0yBRDqUPGoJtMZdOb2e-83NNsq8hmQ64,636 +babel/locale-data/sat.dat,sha256=HdKfJKPFyA_KBP1-F9jblRtk7D-FZ2tXC_y82R0uVQ4,72200 +babel/locale-data/sat_Deva.dat,sha256=0EHZ6UcxsVOfi399xQbOkzaH1OU4jkZ10uqmmWnK8VI,1943 +babel/locale-data/sat_Deva_IN.dat,sha256=Bzh9Vmzia_8KLAryt9VqCl9ter9tKxng4b8oFYbYK6I,659 +babel/locale-data/sat_Olck.dat,sha256=mszOmf6B29mFbE6qN6Moy6SfBjwsjaCsbk75dJR245Q,905 +babel/locale-data/sat_Olck_IN.dat,sha256=Bzh9Vmzia_8KLAryt9VqCl9ter9tKxng4b8oFYbYK6I,659 +babel/locale-data/sbp.dat,sha256=fBots-db5GaQHSyVL_c670sLPouLKYhpdZi6ZMtAS4U,16442 +babel/locale-data/sbp_TZ.dat,sha256=chWs0tZniO53SbtBquTHGS6E4v36tgYL2b3enxHcdCU,617 +babel/locale-data/sc.dat,sha256=SczV0nBRjyJXy2nbFiX9dh9H0DI8-3a3KFLzSoIyRCg,221563 +babel/locale-data/sc_IT.dat,sha256=0G0vL9YXZQLkTmnzJuuygM5ty2Tw5liDg_aWHLvg32k,653 +babel/locale-data/scn.dat,sha256=rgcJX2U9DH9ING8FACFnvUaP5ujMIocxT9ahAUMHnQY,10259 +babel/locale-data/scn_IT.dat,sha256=dTXZIHDRhbFDCw02T0wL1iaJ2kfY1ZUzfbvUs4_WKLs,654 +babel/locale-data/sd.dat,sha256=D149b57qdbFhjEUs-rEUF0GuBFPnNRcJ51x7TcICWfo,223564 +babel/locale-data/sd_Arab.dat,sha256=jgkaYGUhPXll1T7CT68ridccZaERHeZdwUzGoAZBUps,879 +babel/locale-data/sd_Arab_PK.dat,sha256=c3AXdatnrTNDHW_SOh8fNNye4CVey81FnkSXwj7MmcI,635 +babel/locale-data/sd_Deva.dat,sha256=0bbRtnWIj9j5rK5BzykPR0TGwv_tZc0GIiPX0SkRzQM,16972 +babel/locale-data/sd_Deva_IN.dat,sha256=0KQFEKHV6hHidc5hxrxQEvhO-YyvFf5P5z6t9hPenH4,658 +babel/locale-data/sdh.dat,sha256=5cD8u88qanpCtA8kPvHH9AdAi2-HbhznORqis1PYx6M,1032 +babel/locale-data/sdh_IQ.dat,sha256=B_vUMOiGWVcD1HaR4Zk8XxVzcmMFSISe2vRscyA1lYY,679 +babel/locale-data/sdh_IR.dat,sha256=hwMmQnne41X_lyjbyNbQq34Lpkl91bAgoavPZRuozwU,679 +babel/locale-data/se.dat,sha256=_j-UAYXnQAGMshxU_CQsfyR1gVpbb0E8hxXaTmZ4BRc,74113 +babel/locale-data/se_FI.dat,sha256=MwBlsCN6fqQH2Tes1eRNPZtLFW-jzX1-xI-b3Fc6fo8,47250 +babel/locale-data/se_NO.dat,sha256=nm5u2VQ3ne0SUFZtFqwsRa8Gg97Xn1OSxjoP2I-i_PU,653 +babel/locale-data/se_SE.dat,sha256=6M9OxtmQAY_p9fZ_6L8zqo6i--bo_X00cvhTDEbX_UU,694 +babel/locale-data/seh.dat,sha256=ljLjBHD-_xtD1LXjldrCdX0I2owXk39_jyEpyYDFMPk,15823 +babel/locale-data/seh_MZ.dat,sha256=Sv94DueqrM3R5RjhCdwrKZsnNdL1WpjLBg6QhBnoaX0,636 +babel/locale-data/ses.dat,sha256=KhePmTzOCY4zRaDILbPap8IXfykvY6Sfzyv351JqawY,15911 +babel/locale-data/ses_ML.dat,sha256=y14qGwP_r6VxzJhklYIWfYkolu0OHB-6nJ4tvF7J-iU,617 +babel/locale-data/sg.dat,sha256=oDMuuvdPatbYyvy9pPBgXNRXcMYkNXHEtvtwCAlTQrE,16548 +babel/locale-data/sg_CF.dat,sha256=QCNYqo_5l2Sv9JUFEWF6YLDR3MknhgkyMz1mO5j2Gv8,616 +babel/locale-data/shi.dat,sha256=sIPt4Y_phnDkkvFgui8iDz0VrEf-K9eeU5NBf0ikmGc,21949 +babel/locale-data/shi_Latn.dat,sha256=v956UEZ6dMSu4Sw4VhTGYFQ6D14OBmDlodFSDId8hAM,15531 +babel/locale-data/shi_Latn_MA.dat,sha256=X8cwkkvm2LjcClQWzHRxxmiA8P0c37D7P8lf6RO4iNQ,617 +babel/locale-data/shi_Tfng.dat,sha256=VjsR4oSiK9oFfdIdpaVDwNSIBvFbQ3Jvm63K24bRqk0,974 +babel/locale-data/shi_Tfng_MA.dat,sha256=X8cwkkvm2LjcClQWzHRxxmiA8P0c37D7P8lf6RO4iNQ,617 +babel/locale-data/shn.dat,sha256=awBFmgdlHbpKsnUqWZaGAQ-YbTPm9UWkJKMn9IdJ7pM,890 +babel/locale-data/shn_MM.dat,sha256=7VauV3cmVfAJz7kA76hsF3FdwM75CVjvHdjx6lCoH4M,636 +babel/locale-data/shn_TH.dat,sha256=QHPmr3V4GzTbb6QA5SDl2EsVzQBjpbaDP6OHfJZ0S0Y,636 +babel/locale-data/si.dat,sha256=2lhHStmPqL2dqahPVp1A4v_UsMQXtuiVqFs7rM0orBc,285677 +babel/locale-data/si_LK.dat,sha256=cWCgV9WmnEwIIsBmhsIVzSzbrV8hkkXaV1xH1ultlUw,635 +babel/locale-data/sid.dat,sha256=1T-sqoV6zk_nJreKj5UADozq_oTLlhQiKMQaKFkdOZc,2237 +babel/locale-data/sid_ET.dat,sha256=vtwy9BuaZwb5A3XdIl-3mws1cEAVk4s8oKy7i-GnM9o,636 +babel/locale-data/sk.dat,sha256=exkIRNyNsgi63oGJhX4aYsByTtlpKvxnaC8C_3vScw4,298024 +babel/locale-data/sk_SK.dat,sha256=eMjPq18mQOAXvkJN5WV6lKEAPyt7-eleGme2pHHevgA,653 +babel/locale-data/sl.dat,sha256=JsCGVnxl_8sN-rkTjpQh-8pq78fpw-n3WB5Su1CHhyI,293278 +babel/locale-data/sl_SI.dat,sha256=3Hk2t-MUfAUtqu_Gy0_fTjOhwBUtxdnndQ7Kowg0qek,635 +babel/locale-data/sma.dat,sha256=F7xP7-QVGODq95JT875VPPyPT-gXV_mUTP1xb6oqk8M,986 +babel/locale-data/sma_NO.dat,sha256=OeIJ-EJtvWH6z2dZ1Hv8QdmQC7M7r51t-_C6LD6ZyxE,654 +babel/locale-data/sma_SE.dat,sha256=M_zYllAUd2UaWvccZ6ShB9-Gd8JYzIEln-88Q23syaU,654 +babel/locale-data/smj.dat,sha256=z6V0DWiup3F-1YSf7NViI9Z4b_jyCJ9V3kPvzt9QcuM,981 +babel/locale-data/smj_NO.dat,sha256=5fz-YVJEoXswvC-RdFcJWmt-EMGcNXA3c9j_pfmxqCA,654 +babel/locale-data/smj_SE.dat,sha256=7l73FEZcAemOwXSrfPB3X7a0cto3J4oM7AO9i9PMIBU,654 +babel/locale-data/smn.dat,sha256=4zPG9DNBrwN7lvXxpsmaXkvOgQQ2Cwmfca-tQxHfJp0,43534 +babel/locale-data/smn_FI.dat,sha256=VRY3dbCyxEmDUTep9bQXDRldd5wSg4skqQpztnMXplk,654 +babel/locale-data/sms.dat,sha256=ylATYbrfu8SVEVdQRbC7dTSOKCNSX7O1gjS2wJXA1tU,6521 +babel/locale-data/sms_FI.dat,sha256=b-Mk20lC32xysqU5v6jGjDUYDZaMDvoMwWOZNdT5yuA,654 +babel/locale-data/sn.dat,sha256=LTQbCLRgMMr4_Pb9lnGKej-IfTCdxjjcbMeH4sldHbA,23418 +babel/locale-data/sn_ZW.dat,sha256=8HnH2raHHl8PI25abODlThEhjIOGXJb_u7cyQd5YzZw,635 +babel/locale-data/so.dat,sha256=LjDx0NEIDSI4TXP_k5xjgWRH210QHqXgdFr0tVxHrpc,209673 +babel/locale-data/so_DJ.dat,sha256=VWnaj_MuW4dJnlO84t60ySCvfJL7FXI4nIP9PTL5Amo,656 +babel/locale-data/so_ET.dat,sha256=EvRRqU4yQPMYhkEK8a4MR808fwKHmW7EvPvEJdjltnE,655 +babel/locale-data/so_KE.dat,sha256=OSiRggRZ7CTNmqiGOvW1W2Cw2RqjVESTVOdUfgVgWyU,1208 +babel/locale-data/so_SO.dat,sha256=2IPbOqSxQGB5FukQ-B-MEme9FHYn22ClXmAV4x08pNE,616 +babel/locale-data/sq.dat,sha256=eix8XVeFAi3zDFk9x3xMe_OX4LMLfRJ5nATGg5ecNO8,213937 +babel/locale-data/sq_AL.dat,sha256=MN2RvkKGG2PXjCRsMHsvcnwnIOOp9tNSpcInh2uCWaI,635 +babel/locale-data/sq_MK.dat,sha256=L_GaZJ9XuQMs0zw-xZlrefPF36SH0sJqMrdDDbwicZM,1208 +babel/locale-data/sq_XK.dat,sha256=qILZGRwAhuIBJ9xi_T5WTrrZAVouFjQSvybrwgXTsog,1187 +babel/locale-data/sr.dat,sha256=yBO5zeiaUB5ar3GHsewRa27K0YdQmalKEaScTRIROgk,322842 +babel/locale-data/sr_Cyrl.dat,sha256=Tbo90CyBAWciKeDesPhmXf7sdBQfjWsmyyrKBco_NzU,1990 +babel/locale-data/sr_Cyrl_BA.dat,sha256=Wkwj3MsGyxk-_jgARM2VrlcNFhYdiTPUyoAnNsrTjx4,44464 +babel/locale-data/sr_Cyrl_ME.dat,sha256=o1cSgsrmMWDkLFHDhK1Mu2tn77XRauf2jsvbfH7zdRY,3908 +babel/locale-data/sr_Cyrl_RS.dat,sha256=Tn9u1EvJAZZEIdgXloi326qjpq8b1N087nRQ9R1JbWE,635 +babel/locale-data/sr_Cyrl_XK.dat,sha256=KLlEv9Pu32YZMj8eorGznSio7bTSjicGvEH_-T31qyM,2783 +babel/locale-data/sr_Latn.dat,sha256=2Q6jJtD2qPwtd7zeKYjkMP9Kq3L5aMTrr2kaSfHExAc,273929 +babel/locale-data/sr_Latn_BA.dat,sha256=aRa8EvP8C3DEpDCgro7f5IiZMKCxkHcGKn-Q_77Bfi0,34551 +babel/locale-data/sr_Latn_ME.dat,sha256=Oilwiq74izAYctEOmJe3ROcFMhwUwjTjJOWwWD5bHHw,3277 +babel/locale-data/sr_Latn_RS.dat,sha256=Tn9u1EvJAZZEIdgXloi326qjpq8b1N087nRQ9R1JbWE,635 +babel/locale-data/sr_Latn_XK.dat,sha256=48M8oDOTV5ATZpMttuYHlXUl3Tf7YdgMF-RABRDZFWE,2389 +babel/locale-data/ss.dat,sha256=EBfjK8BcF9PU_ycf49tzaXNE1Bv6cuUB2-dPbNMzofk,2490 +babel/locale-data/ss_SZ.dat,sha256=X-Va1uVrsPa1ZX5hwhQ-ME6Q_bovUb24XXFS8UQ87lQ,1208 +babel/locale-data/ss_ZA.dat,sha256=xwT3vZ4tmKEvJpVwFMV9U2j2FLF1tC9PEDN6MC6Qbf4,635 +babel/locale-data/ssy.dat,sha256=AkCerJDPvk_d2gJSRoplTQhgsFYbl8moCu0uBEGIblA,3058 +babel/locale-data/ssy_ER.dat,sha256=9CRIaVxgOMeMTc0tcV0Yz9yZzq_uD3g3ylZzqVpYzsM,617 +babel/locale-data/st.dat,sha256=gTFSFNHmmkv6-8Rqn_DcoR6rhOK_KPKKM1jDsJHhpsw,15534 +babel/locale-data/st_LS.dat,sha256=pSzdNm6-O5V6-14VcgF2iGNYQPFYIXQlY3SqUW3GcjA,1227 +babel/locale-data/st_ZA.dat,sha256=5tdUX7dxXEL2xiS_0IvHvqhKF-gWXFsi4supkP0RDAc,635 +babel/locale-data/su.dat,sha256=vNhYxPh1AzRXMdurBP5yh02ort9F5H7ghd3rk0DE9AA,13795 +babel/locale-data/su_Latn.dat,sha256=ievzq_m7eD5pZWLnVlH7oMIdeadf8GIMqEuVPJTBjyM,745 +babel/locale-data/su_Latn_ID.dat,sha256=axNaukDpD_-G-_4R7P1u5w4dh-ToRPN_Yo-QpC1cFRU,635 +babel/locale-data/sv.dat,sha256=cmdR0j2gMWKpWl8ujFLQXMhIM2id9YP3MQyfHdHWv0Y,242064 +babel/locale-data/sv_AX.dat,sha256=QFGzIe9UCr5gCpgHunvdPiZ-126vP7GYORL9jjip9-E,653 +babel/locale-data/sv_FI.dat,sha256=lrcPInOi023u4IdDjftF0dCFSaHuZj36l_Qu795uysU,2695 +babel/locale-data/sv_SE.dat,sha256=c9PG5p2y_4rnxepGD4uOzemBU3EOQhQNO4BtUS1m3rE,653 +babel/locale-data/sw.dat,sha256=c2SJSTSB53IVWWKvYt2g1RpTJNEvOVdW5sbSRglK3_8,215403 +babel/locale-data/sw_CD.dat,sha256=W7Fw8Wqwo3_x4hWlssmWbVTj4hhSQmRv8c-VSnQdlg8,2577 +babel/locale-data/sw_KE.dat,sha256=UX0V8wV9CmITcAbSyHkERssggIDXA98fyVCOYnXtnik,47932 +babel/locale-data/sw_TZ.dat,sha256=I1bDbpEDiR1jkCgJ_W9fWCPuPxMhjQmwG3sIueKb-Rk,616 +babel/locale-data/sw_UG.dat,sha256=kuNdg2N_dLwUKFm7wSheL1wLOdyrukPxLfDw0PN7tT8,660 +babel/locale-data/syr.dat,sha256=My474Zt8Vw1dvXXXDS1xqsjkVmJew4SeMzeU78pIBso,165027 +babel/locale-data/syr_IQ.dat,sha256=Mrw63eJwh0vRe3Lpj0vRf6Q4cUZXJcx9tlWkuAmMrss,679 +babel/locale-data/syr_SY.dat,sha256=l0Yl2UMjm_7kuzvoG2-KqBp5XR88gdjf1ZlpRRNFMuc,679 +babel/locale-data/szl.dat,sha256=jan4MKB8K_nDa6k4Qn6kTHJqY6ylL5qZOO5miN0vkrY,111023 +babel/locale-data/szl_PL.dat,sha256=1D5dKaG2l2Haxde8uraWI2J5lzw1dIWGeJtBesua-IM,654 +babel/locale-data/ta.dat,sha256=GetaBt44B3qiriQrT-fm6JIPWeOXFO2wWgAn6sK0xCM,301942 +babel/locale-data/ta_IN.dat,sha256=BOFaDBw7fc7C6xSSFYNfkhCgCUd7ydHprJ6u0DaneSE,658 +babel/locale-data/ta_LK.dat,sha256=Od6ln5oUnWfaAHwt_SDafWv844c7A7_7fTT2OPVTuyw,1208 +babel/locale-data/ta_MY.dat,sha256=PEUmjhs_RUr1R5kH9uHExdnG59Hy8LmbU18vXZYYPtA,1325 +babel/locale-data/ta_SG.dat,sha256=tbuefTSiXPMwpeV085Qp53l5uDHLsMMXmt8TPEG2fWY,1344 +babel/locale-data/te.dat,sha256=3uBiMoaDBVmlh1JN-cFB9eZOZVofJY5vGohotgfHrts,300989 +babel/locale-data/te_IN.dat,sha256=LICnXU-D0uhvxVpQ986Ul1JeAQktXaX53sXZSUY3L2g,658 +babel/locale-data/teo.dat,sha256=6wOYzb32RkGey4sEGPkEptonW4zxEum2Gqo__Fy1_3c,16591 +babel/locale-data/teo_KE.dat,sha256=S_lAg36VkA1w384kzPfXRLmJmGWfmz3ll7MzOQAtcr8,657 +babel/locale-data/teo_UG.dat,sha256=0WlDglms5bCe1AMwCqroaXpOXu9jQroxllMwXWLb8q0,640 +babel/locale-data/tg.dat,sha256=T1drajN0RabMR4tG0KK5mWpeGwTlTG5xYjoblk1iYfY,51518 +babel/locale-data/tg_TJ.dat,sha256=TCrsEipGp0reAS2mAvwT58tyzBnYJfL5oNHWpEe1ttc,635 +babel/locale-data/th.dat,sha256=Cv5aRObrY8j69jZ3_ZOIOgvdU1Esi1II4BRKyTNc2Zw,261473 +babel/locale-data/th_TH.dat,sha256=_QhA0WcHmW6Cr_-gU9e6cdpzTMDT19WyHas58fWDUnc,635 +babel/locale-data/ti.dat,sha256=1pTqX8pN96SKAZPPWLCcA3B-pir9jYjzPQ-GxFojACE,128818 +babel/locale-data/ti_ER.dat,sha256=m9w0P5TPQ8IqpWKldwdfnw5_1Upv09AjLdO5WUbcRic,962 +babel/locale-data/ti_ET.dat,sha256=q0b9svPg8aj9xmbXr7F6fPHqeTJmclBl5t_hqQk7IuU,635 +babel/locale-data/tig.dat,sha256=Zg0qqnVRIz7gyDBe3__hVZOSj-T1_2Iud5sjuoKFNjM,13685 +babel/locale-data/tig_ER.dat,sha256=OoQ0U6yyzmjKwDtzLUpqR09h_ZaGvzXlp7t-HqNxmm4,617 +babel/locale-data/tk.dat,sha256=j4XWeKhhe09xRpDTc6BesDQ-yyZciLXqF2cmrkeQHpc,202207 +babel/locale-data/tk_TM.dat,sha256=lADxEQoz-_ImDBmpCFUqDPuZ0ozVUhZKOQF2ZwyXVlw,635 +babel/locale-data/tn.dat,sha256=3zvpXUjb5YJyJCVcPI0NpDvy0dHOASFLvHBBFpWSg2g,15028 +babel/locale-data/tn_BW.dat,sha256=jWMFP1tw-o7rslHAlAIgjEXflko8UCDNaSuQ8ccvNHI,654 +babel/locale-data/tn_ZA.dat,sha256=S3dMOsYSpBwkUv0tW9q0kKawQQl6yx77LexAL5wQqDU,635 +babel/locale-data/to.dat,sha256=Wc0FOumWNapJd1yTtBa-yU9XIZi3M6Tun77ai81pSZM,182085 +babel/locale-data/to_TO.dat,sha256=jcfJ2Pjof8jGE4q1y5LHSP9rb4IanN58kR7OgG8d5Q0,616 +babel/locale-data/tok.dat,sha256=VZdkFu2hovwGCYZlHO8Qy5BANYa7nSDxpnnNvNvj0no,6057 +babel/locale-data/tok_001.dat,sha256=PPUMevT2TBOGFSq-U-AccYkLHSbkWnBRDvxtpokTCD4,693 +babel/locale-data/tpi.dat,sha256=0hp2fl1zHPBF6-3kxfd0W8w7oJNV6t3_QrbaRpG0akc,4771 +babel/locale-data/tpi_PG.dat,sha256=uZD_c8yCtiYwt2EO2VOYPzhSTqWMQBOJMCuMCXe3Css,617 +babel/locale-data/tr.dat,sha256=51Me4EB7yjxjFaoVIxvDIAQfCRUoNo8lsw0FU5mCwBQ,233315 +babel/locale-data/tr_CY.dat,sha256=3EmCqxcPvFuZcHCzpTmHb6pjtPwqQvwCfn27B8rtXNw,1227 +babel/locale-data/tr_TR.dat,sha256=7lS5CMZw76SVlMJxsmIJW5IfL7k9t8MrfKcnElqISSI,635 +babel/locale-data/trv.dat,sha256=JbNccv-KkRK3wx94LotNV6WGtJGEti6TVeD-ooHF2aA,10926 +babel/locale-data/trv_TW.dat,sha256=CTQtGdDW4Z0n2Ckb6B63HgEwNE44YTFnJCetwd8q9GU,636 +babel/locale-data/trw.dat,sha256=GQbDeIwZZMjP78avX1GXLA-ySyOvBLD7gMOppJ1qcd4,129847 +babel/locale-data/trw_PK.dat,sha256=pBHdOulrwRLiQuC96g8ilUzpKBeG6kglBqUXB8MlURA,636 +babel/locale-data/ts.dat,sha256=4DJrk4p_3RiC82zHM5gKgN4nySr-2xHP01BtsUmgPvo,13486 +babel/locale-data/ts_ZA.dat,sha256=AByEO55W3DVVOBIBxIp1F2QwY01-5v6v8sDFOGSxCF0,635 +babel/locale-data/tt.dat,sha256=_1urtzP-CZBIsl8rZh6Xm9IRXLVoBGklF981ZxlxguM,43024 +babel/locale-data/tt_RU.dat,sha256=cmv2MzolKOrsRoqQcFZGcXQj_33dLWGh9oUjnebCnz0,653 +babel/locale-data/twq.dat,sha256=MLoHw6LLZN372T5bROnq_FI8C0Ty4gmRu-VLaiZWr80,16136 +babel/locale-data/twq_NE.dat,sha256=y8xQDxMtyStWC83tm_JiekFxAY0Fj-CWWdmic9GBwd4,617 +babel/locale-data/tzm.dat,sha256=aqmHBfyq6JQZIWyKA2iBtn1Qsi8aE4nxZeVhXl0apj4,16066 +babel/locale-data/tzm_MA.dat,sha256=8eku_7voAqAjN651VYKCuIWvdYGOScCyqbt1rtSVO_g,617 +babel/locale-data/ug.dat,sha256=lKw8VTDQjeTp8BlOxPwAesi9dINASmZNbmSjuuR5UYA,129541 +babel/locale-data/ug_CN.dat,sha256=2UselU1_d6K7NgQj0EDnDfb4Llk51eQZ7z78oYE-Ywg,635 +babel/locale-data/uk.dat,sha256=uzPkrX0I-NhUbmshyQT2KMZN0mUwWG5ydPC609qPUAc,364290 +babel/locale-data/uk_UA.dat,sha256=usJw_J4Uu9OD9nrUxNQAx6vMJBWDjbGuc9l7ssJAyuw,635 +babel/locale-data/ur.dat,sha256=orRmVdptiB_ylinJ6yDIbiSKsTWlYRahX8VAKvAe_qU,231785 +babel/locale-data/ur_IN.dat,sha256=BDrVnRS4pFnz7kO8V2iTSCbEdlCkQExsdFzZ3LOtRvE,12192 +babel/locale-data/ur_PK.dat,sha256=EEAGl6fLd1-a7X0n2PwRxlqwYZ0a0ELm2DuLII9spX0,635 +babel/locale-data/uz.dat,sha256=DqM_s3t-3upGr-FOT0vCGr0AEnViXv7vwMkOJpTWk00,206244 +babel/locale-data/uz_Arab.dat,sha256=_oBgUeBN8a_aTsv8w3K_JiXkUPOkqQ0scM68z0w3H98,3914 +babel/locale-data/uz_Arab_AF.dat,sha256=68eUCR8KeB0QDQRCvNMiOIkZVRozGKFTDednrQL1X_Y,678 +babel/locale-data/uz_Cyrl.dat,sha256=pXZg6iCiiMA7vymcbkY1L4z7Y0gxzuLERuPENHfpPRI,100158 +babel/locale-data/uz_Cyrl_UZ.dat,sha256=MWJtHPdj_pF2h6abRP4wUwDWAUF4-zr7jBn2RQcZ0z8,635 +babel/locale-data/uz_Latn.dat,sha256=L5H7Xfz2Ho-vMqviRPC4ai0MnqoF9CIebiq7muISvSA,1292 +babel/locale-data/uz_Latn_UZ.dat,sha256=MWJtHPdj_pF2h6abRP4wUwDWAUF4-zr7jBn2RQcZ0z8,635 +babel/locale-data/vai.dat,sha256=LahyKrWiA9SCPtM0Evw9AysdrUJxbYIiEYZYsHw3sOc,19008 +babel/locale-data/vai_Latn.dat,sha256=aYnJ4VJNwmTPTBF6Nzkj59hhQv6YxLu_DLUNuMmPZsE,15025 +babel/locale-data/vai_Latn_LR.dat,sha256=LdVmBAL7nzDp-Ab_uHidBAi2crIf9nXhf8tBNfa7xdI,617 +babel/locale-data/vai_Vaii.dat,sha256=l_IXC76zzJ2lPLfWfjWzSw6xVtFwr-x8LofcHQsSG_0,693 +babel/locale-data/vai_Vaii_LR.dat,sha256=LdVmBAL7nzDp-Ab_uHidBAi2crIf9nXhf8tBNfa7xdI,617 +babel/locale-data/ve.dat,sha256=uK759Lvgb-PpNsyxfTEFY0cdGcc0KtygSzFTyNEprPc,2684 +babel/locale-data/ve_ZA.dat,sha256=uJndHi9RMKtDWd58f_Q3g5WgXjL3W7KLQj91rVueabQ,635 +babel/locale-data/vec.dat,sha256=oJFbBfJmGgPpvhy1fqKv2DMHHmqvR3TDZVp-v-raP4w,1776 +babel/locale-data/vec_IT.dat,sha256=mC9jRfk9ndmkpRIpWZNCwdMwvxvB6QX6_9HanawdaUw,654 +babel/locale-data/vi.dat,sha256=GU5bwQgrbL4lEeWcfS_HuU1shwwwiTfc6abCjX7KHQI,188652 +babel/locale-data/vi_VN.dat,sha256=cGwN0vw-qIaeA2g89U97N1xHSMmmaIVNPCLL2P_QJMk,635 +babel/locale-data/vo.dat,sha256=3Z3f56WHslCqteTl1FP1rADNc5CvanU2cOCjyLVHS9c,5258 +babel/locale-data/vo_001.dat,sha256=iF2xY9XIdxC0mOYEp9hjYZp2EG-si_YaNYXri_60-4w,850 +babel/locale-data/vun.dat,sha256=akNUDGYNWXhsxEQRKMjeNbA_1UemqCov3KgYBF3Y628,15957 +babel/locale-data/vun_TZ.dat,sha256=YKrOeOS1VnU3BWQ7HWtxjS-gMKJcKAPQLf4HTgkzf70,617 +babel/locale-data/wa.dat,sha256=1r6krApI8oecIKQt_9RzbpwSN0LcWSjlG34Y9Rfh07Y,880 +babel/locale-data/wa_BE.dat,sha256=j4YADQloo07Oek1j3aOrLYkzcFkrViS1UdRrA0Z56-o,653 +babel/locale-data/wae.dat,sha256=QG4YCienzVk62qMkbSIq0qQ0MMOQwY5JTfZmmBnt9ew,30913 +babel/locale-data/wae_CH.dat,sha256=Z0Wzu5Q9IVTnLGwWu54ozVx-fgnFz0IE3yrky8Y1IkQ,654 +babel/locale-data/wal.dat,sha256=bmgXVK3q57btDK3v6en1XeAd8gfsbFVHlbqh1uUdaBc,8567 +babel/locale-data/wal_ET.dat,sha256=tNjeuU4GPTWtDmsroGmi4VUql0dA57v1tEtDF4rslVg,636 +babel/locale-data/wbp.dat,sha256=IjFhDqCcLq80NrrgBmb7uhiHCi-OgQDQXdqWHo_X4IA,788 +babel/locale-data/wbp_AU.dat,sha256=BT2E1-WiomuRrteCzN1_AfLyDUdEOm0ehT5miAiepBQ,636 +babel/locale-data/wo.dat,sha256=Yyd7YgFQJT3Ge4CQZEiLe8XPv_fijnJvAUv4UyCRquo,33411 +babel/locale-data/wo_SN.dat,sha256=fvlwe-ImWs04fsxSjTsXf8IPxEIiEi45BX8xhoBC_yg,616 +babel/locale-data/xh.dat,sha256=2vc9mrCFHX1rAhrFzHB5VrJB9OCAnqy1f-nJphqxocE,93311 +babel/locale-data/xh_ZA.dat,sha256=9p6wHW1sxOghJMAgsP6BC3RdUhuvLpHoCkqvjsCmPps,635 +babel/locale-data/xog.dat,sha256=9RBj7uyIzJW9uvv83Rzx-4gA7Jn4t1RDnR3RpZfQVjQ,16447 +babel/locale-data/xog_UG.dat,sha256=bMX0Tk5zS4P2LqlOLLpVP4nZxBFhS_qc-ndXjilDCNI,640 +babel/locale-data/yav.dat,sha256=dNH_Acsvz6mE-Rsv9nLUSJQrNYmMPCrc7uOc_OgRI0M,15285 +babel/locale-data/yav_CM.dat,sha256=CsaKwep5CARetyBX-JXHFvUVsFe1KTN4Pyz1Wh7NTHw,636 +babel/locale-data/yi.dat,sha256=QeHqecJsPVyQ6QlapeKZU4jECQEYbz1pmUGiH5SVqyY,30133 +babel/locale-data/yi_001.dat,sha256=tdGIV8N9o_qjy8kvn7QB-meY7HHe4ZjZxFyhO4Y2NYg,912 +babel/locale-data/yo.dat,sha256=odUlozSDJE5yIlr2fv1LjoMEop2HpQsdZ9W6OcYZ6V8,139501 +babel/locale-data/yo_BJ.dat,sha256=-2DRkfPNRUia1uqLRmvz-mVx8O-FHp1nojC-ANNudaQ,47102 +babel/locale-data/yo_NG.dat,sha256=BEIndIiMT1Mo18S5DAWpjefthptCVQkIPeVs0umSop0,616 +babel/locale-data/yrl.dat,sha256=3sVAhKVyZUwrVLJNhN-GBTVmii9sOum1c2M0Zp_FwX4,213577 +babel/locale-data/yrl_BR.dat,sha256=aUgLCNwgEORk2wtuez8AqkYahB8_mX41IWSqogt39YE,636 +babel/locale-data/yrl_CO.dat,sha256=oeTveb-u18jQraHBxtYXegyt6H4DN-NvAXDgYq0Vvx4,9331 +babel/locale-data/yrl_VE.dat,sha256=N5Z7PzXQXLg5_y31iqC4yFLeGQw1TvhxJsnOxgLANbA,9331 +babel/locale-data/yue.dat,sha256=d0JUmI3Tx52QGX7M382UFInIMMhDAmKgQ0uKidl47AY,200901 +babel/locale-data/yue_Hans.dat,sha256=IXOR94pqC8cNAzBKvvvsjFYc_g9Bxusdjc0lNKImH-k,200610 +babel/locale-data/yue_Hans_CN.dat,sha256=MOZnu5r0xokf672rwAXfgzG3VEeTfNlDbu36fR1bB6I,636 +babel/locale-data/yue_Hant.dat,sha256=76wefuhsGIjk0jT05KSTEU_pbb7AfNE2u56jdRoJaDM,1306 +babel/locale-data/yue_Hant_HK.dat,sha256=eMZ7mOTEyKzQz0MDIjvP_Z57CS9nFIP4-Uf0Jpx1CY4,636 +babel/locale-data/zgh.dat,sha256=4_BRrs_rhQZjlMMPGrE3DgaRs-P6rJYR-m19LhtSnvo,30518 +babel/locale-data/zgh_MA.dat,sha256=sV8aPBmHY23lKIzsRna-tPz3UiXoKCMQ1Ur2tCyx2YA,617 +babel/locale-data/zh.dat,sha256=soO-LIfZqc1zuQbG87Am-XNZF-d1Ym3eVJvfPkQOD9k,199506 +babel/locale-data/zh_Hans.dat,sha256=-wR64b65stjA2KWj4GWcBWiF3yI0A24p4K7wApj8qtc,1305 +babel/locale-data/zh_Hans_CN.dat,sha256=zz2qPpWEP9ba12T9cGsPXGI7Bg5LcmZ3NkAMiVTf61A,635 +babel/locale-data/zh_Hans_HK.dat,sha256=wYEV3_5mxfBkKP74urgX9N2wnD9a5jMMvSZgaqxC7FU,3697 +babel/locale-data/zh_Hans_MO.dat,sha256=YFbTnSDiLaoLfkXsmOvrwvC0Sm4e9z7q0-_kLdg3S0A,3828 +babel/locale-data/zh_Hans_SG.dat,sha256=AIkbQjmBkpZX80T3Oq6aSPjsYYekE7dELKBkF5kCLoY,4024 +babel/locale-data/zh_Hant.dat,sha256=WMLaHeGK2sQW2mWfh0Mfn0lFXlLsMNQqjB2ZwddEoik,203093 +babel/locale-data/zh_Hant_HK.dat,sha256=Vxy1c_iJyNSWFFBNBcxa7E9o0B75C2MMhCzRRGTGAyI,61870 +babel/locale-data/zh_Hant_MO.dat,sha256=8GSs5WRDxGFvEN8slDp9A3dmsZslPSN3NJDcT5EN4fk,710 +babel/locale-data/zh_Hant_TW.dat,sha256=5N4K8I3XG89knCaSoy97HGzTVOTiUcd_VmfvNJlA4Bg,635 +babel/locale-data/zu.dat,sha256=fg5PR6NhHCzp30f9PjII1e64zs66X4mJdzJNh594kHw,213979 +babel/locale-data/zu_ZA.dat,sha256=jHloBfkNbQETXgE-3xVxvESitWb994_-SoY0G4_JL5E,635 +babel/localedata.py,sha256=vdTBpZsR2ExG9jBJLe42Xg-NKbm7XU7Pg5z0lIXod1Y,8239 +babel/localtime/__init__.py,sha256=hHBBHcfWoTvnIOfahxHlxqNR7IL4A4yTuxxG7wDZWUk,1043 +babel/localtime/__pycache__/__init__.cpython-312.pyc,, +babel/localtime/__pycache__/_fallback.cpython-312.pyc,, +babel/localtime/__pycache__/_helpers.cpython-312.pyc,, +babel/localtime/__pycache__/_unix.cpython-312.pyc,, +babel/localtime/__pycache__/_win32.cpython-312.pyc,, +babel/localtime/_fallback.py,sha256=0ak6R7ATmobpIlVjzQOK667bCMUjaFGcBWfL-IJlFEo,1207 +babel/localtime/_helpers.py,sha256=8WIkbnxv1aGVvXm63pFlB_IBRQNsMQlATsx7vorRivQ,1060 +babel/localtime/_unix.py,sha256=7ExS68O5KpjqgZ6Dhho2WhxlYQYe2etJiW8BW2mXMCc,3455 +babel/localtime/_win32.py,sha256=nSNnxSMOVAlvqvX50h9HSCzBfP7mj8njJ80JZ3pOIWk,3211 +babel/messages/__init__.py,sha256=7UsGpKWLQkcEBwmt1oLAW-7xNOXaGXJIBI1upvXH5yU,349 +babel/messages/__pycache__/__init__.cpython-312.pyc,, +babel/messages/__pycache__/catalog.cpython-312.pyc,, +babel/messages/__pycache__/checkers.cpython-312.pyc,, +babel/messages/__pycache__/extract.cpython-312.pyc,, +babel/messages/__pycache__/frontend.cpython-312.pyc,, +babel/messages/__pycache__/jslexer.cpython-312.pyc,, +babel/messages/__pycache__/mofile.cpython-312.pyc,, +babel/messages/__pycache__/plurals.cpython-312.pyc,, +babel/messages/__pycache__/pofile.cpython-312.pyc,, +babel/messages/__pycache__/setuptools_frontend.cpython-312.pyc,, +babel/messages/catalog.py,sha256=Dg8qHiACb1JbSjsNcKdJygj-IKgW53w0HFSwKNJSstk,36302 +babel/messages/checkers.py,sha256=Vsi4_ImORDqfu4fbDdBisJY7ALbQ3CsOJqi0VnQZCR4,6375 +babel/messages/extract.py,sha256=fpfNYBW8jGkVD2XCJcu3PsiE1p0SrbLqhCYmYmaNdc8,34333 +babel/messages/frontend.py,sha256=kHprmRt0fL4TMIBk51aJgwoAeoLNb8ZbPFPvkrfDSr8,41618 +babel/messages/jslexer.py,sha256=TUv4DXfVES21MDG38e-3HC0HZabAKf-iNvxqzd2Yo1Q,7153 +babel/messages/mofile.py,sha256=HewAYZVOdUAqtlsma3A1lojIvntXdWpFjkYkODyMhR4,7345 +babel/messages/plurals.py,sha256=dlcmsT2Lu9kzMVs3Yid5_myAR_qhWNH66v6kJeZ26Ys,7319 +babel/messages/pofile.py,sha256=mAfl-8uFlQ_KS4HaeHeDEcenrCRoMtSpgECV9KY_m7Y,22325 +babel/messages/setuptools_frontend.py,sha256=m1l9NHuawj1pSncZeC82cUJfdwxib_C7JSUb_2EhbUM,3485 +babel/numbers.py,sha256=ysT2-EqcI6znM55z-DkeXlZV7G5G8bQgGdp5gCHmDaM,60994 +babel/plural.py,sha256=GX8dOZDOyjvUnIhbZhjfxEgh2zd4FKGJkSeKPN9q-8g,23218 +babel/py.typed,sha256=DtCsIDq6KOv2NOEdQjTbeMWJKRh6ZEL2E-6Mf1RLeMA,59 +babel/support.py,sha256=_LCOy2P2_SgaUGBIR4sOpTh04-pmtjNjcjrdJ1gmeRE,27456 +babel/units.py,sha256=J8uwppyWrgaFYptgI-QPotAm105yOGoYSEPk397wE44,13590 +babel/util.py,sha256=x_2u0RKmNnUo1nucVAla_6jj9A83RDUMzRj3Vj4FenM,7956 diff --git a/venv/Lib/site-packages/Babel-2.14.0.dist-info/WHEEL b/venv/Lib/site-packages/Babel-2.14.0.dist-info/WHEEL new file mode 100644 index 0000000..98c0d20 --- /dev/null +++ b/venv/Lib/site-packages/Babel-2.14.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.42.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Babel-2.14.0.dist-info/entry_points.txt b/venv/Lib/site-packages/Babel-2.14.0.dist-info/entry_points.txt new file mode 100644 index 0000000..95235a5 --- /dev/null +++ b/venv/Lib/site-packages/Babel-2.14.0.dist-info/entry_points.txt @@ -0,0 +1,20 @@ +[babel.checkers] +num_plurals = babel.messages.checkers:num_plurals +python_format = babel.messages.checkers:python_format + +[babel.extractors] +ignore = babel.messages.extract:extract_nothing +javascript = babel.messages.extract:extract_javascript +python = babel.messages.extract:extract_python + +[console_scripts] +pybabel = babel.messages.frontend:main + +[distutils.commands] +compile_catalog = babel.messages.setuptools_frontend:compile_catalog +extract_messages = babel.messages.setuptools_frontend:extract_messages +init_catalog = babel.messages.setuptools_frontend:init_catalog +update_catalog = babel.messages.setuptools_frontend:update_catalog + +[distutils.setup_keywords] +message_extractors = babel.messages.setuptools_frontend:check_message_extractors diff --git a/venv/Lib/site-packages/Babel-2.14.0.dist-info/top_level.txt b/venv/Lib/site-packages/Babel-2.14.0.dist-info/top_level.txt new file mode 100644 index 0000000..98f6593 --- /dev/null +++ b/venv/Lib/site-packages/Babel-2.14.0.dist-info/top_level.txt @@ -0,0 +1 @@ +babel diff --git a/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/INSTALLER b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/LICENSE b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/LICENSE new file mode 100644 index 0000000..2511c5f --- /dev/null +++ b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2013 by Serge S. Koval, Armin Ronacher and contributors. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/METADATA b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/METADATA new file mode 100644 index 0000000..f2fe469 --- /dev/null +++ b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/METADATA @@ -0,0 +1,49 @@ +Metadata-Version: 2.1 +Name: Flask-BabelEx +Version: 0.9.4 +Summary: Adds i18n/l10n support to Flask applications +Home-page: http://github.com/mrjoes/flask-babelex +Author: Serge S. Koval +Author-email: serge.koval+github@gmail.com +License: BSD +Platform: any +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: Flask +Requires-Dist: Babel (>=1.0) +Requires-Dist: speaklater (>=1.2) +Requires-Dist: Jinja2 (>=2.5) + + +Flask-BabelEx +------------- + +Adds i18n/l10n support to Flask applications with the help of the +`Babel`_ library. + +This is fork of official Flask-Babel extension with following features: + +1. It is possible to use multiple language catalogs in one Flask application; +2. Localization domains: your extension can package localization file(s) and use them + if necessary; +3. Does not reload localizations for each request. + +Links +````` + +* `documentation `_ +* `development version + `_ +* `original Flask-Babel extension `_. + +.. _Babel: http://babel.edgewall.org/ + + + diff --git a/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/RECORD b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/RECORD new file mode 100644 index 0000000..99164d0 --- /dev/null +++ b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/RECORD @@ -0,0 +1,10 @@ +Flask_BabelEx-0.9.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_BabelEx-0.9.4.dist-info/LICENSE,sha256=ddAMnohycQ6AB7oPJc5ub8wBXPTHoREsY9gS6k3o5BE,1490 +Flask_BabelEx-0.9.4.dist-info/METADATA,sha256=7Ucgrn0yksLvIX_i1atNyxdK-O2G-vVQnYeElrIr_gU,1545 +Flask_BabelEx-0.9.4.dist-info/RECORD,, +Flask_BabelEx-0.9.4.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 +Flask_BabelEx-0.9.4.dist-info/top_level.txt,sha256=AqbfDJxlPas3yrFqQ60dYfNeWBDrShj9T0EMPZhmIDc,14 +flask_babelex/__init__.py,sha256=JwnmgbU_WKVx1a1L0qYaE0XeW2kaQ4I58wjW6_B8kEg,22676 +flask_babelex/__pycache__/__init__.cpython-312.pyc,, +flask_babelex/__pycache__/_compat.cpython-312.pyc,, +flask_babelex/_compat.py,sha256=VjIWQF9U44ZEa3ZvTDGRRM2KgUdv3aijTVrLS3m8nr8,362 diff --git a/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/WHEEL b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/WHEEL new file mode 100644 index 0000000..b552003 --- /dev/null +++ b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/top_level.txt b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/top_level.txt new file mode 100644 index 0000000..38a6868 --- /dev/null +++ b/venv/Lib/site-packages/Flask_BabelEx-0.9.4.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_babelex diff --git a/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/LICENSE b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/LICENSE new file mode 100644 index 0000000..0446381 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2011 Matthew Frazier + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/METADATA b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/METADATA new file mode 100644 index 0000000..445a0b2 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/METADATA @@ -0,0 +1,183 @@ +Metadata-Version: 2.1 +Name: Flask-Login +Version: 0.6.3 +Summary: User authentication and session management for Flask. +Home-page: https://github.com/maxcountryman/flask-login +Author: Matthew Frazier +Author-email: leafstormrush@gmail.com +Maintainer: Max Countryman +License: MIT +Project-URL: Documentation, https://flask-login.readthedocs.io/ +Project-URL: Changes, https://github.com/maxcountryman/flask-login/blob/main/CHANGES.md +Project-URL: Source Code, https://github.com/maxcountryman/flask-login +Project-URL: Issue Tracker, https://github.com/maxcountryman/flask-login/issues +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: Flask >=1.0.4 +Requires-Dist: Werkzeug >=1.0.1 + +# Flask-Login + +![Tests](https://github.com/maxcountryman/flask-login/workflows/Tests/badge.svg) +[![coverage](https://coveralls.io/repos/maxcountryman/flask-login/badge.svg?branch=main&service=github)](https://coveralls.io/github/maxcountryman/flask-login?branch=main) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE) + +Flask-Login provides user session management for Flask. It handles the common +tasks of logging in, logging out, and remembering your users' sessions over +extended periods of time. + +Flask-Login is not bound to any particular database system or permissions +model. The only requirement is that your user objects implement a few methods, +and that you provide a callback to the extension capable of loading users from +their ID. + +## Installation + +Install the extension with pip: + +```sh +$ pip install flask-login +``` + +## Usage + +Once installed, the Flask-Login is easy to use. Let's walk through setting up +a basic application. Also please note that this is a very basic guide: we will +be taking shortcuts here that you should never take in a real application. + +To begin we'll set up a Flask app: + +```python +import flask + +app = flask.Flask(__name__) +app.secret_key = 'super secret string' # Change this! +``` + +Flask-Login works via a login manager. To kick things off, we'll set up the +login manager by instantiating it and telling it about our Flask app: + +```python +import flask_login + +login_manager = flask_login.LoginManager() + +login_manager.init_app(app) +``` + +To keep things simple we're going to use a dictionary to represent a database +of users. In a real application, this would be an actual persistence layer. +However it's important to point out this is a feature of Flask-Login: it +doesn't care how your data is stored so long as you tell it how to retrieve it! + +```python +# Our mock database. +users = {'foo@bar.tld': {'password': 'secret'}} +``` + +We also need to tell Flask-Login how to load a user from a Flask request and +from its session. To do this we need to define our user object, a +`user_loader` callback, and a `request_loader` callback. + +```python +class User(flask_login.UserMixin): + pass + + +@login_manager.user_loader +def user_loader(email): + if email not in users: + return + + user = User() + user.id = email + return user + + +@login_manager.request_loader +def request_loader(request): + email = request.form.get('email') + if email not in users: + return + + user = User() + user.id = email + return user +``` + +Now we're ready to define our views. We can start with a login view, which will +populate the session with authentication bits. After that we can define a view +that requires authentication. + +```python +@app.route('/login', methods=['GET', 'POST']) +def login(): + if flask.request.method == 'GET': + return ''' +
+ + + +
+ ''' + + email = flask.request.form['email'] + if email in users and flask.request.form['password'] == users[email]['password']: + user = User() + user.id = email + flask_login.login_user(user) + return flask.redirect(flask.url_for('protected')) + + return 'Bad login' + + +@app.route('/protected') +@flask_login.login_required +def protected(): + return 'Logged in as: ' + flask_login.current_user.id +``` + +Finally we can define a view to clear the session and log users out: + +```python +@app.route('/logout') +def logout(): + flask_login.logout_user() + return 'Logged out' +``` + +We now have a basic working application that makes use of session-based +authentication. To round things off, we should provide a callback for login +failures: + +```python +@login_manager.unauthorized_handler +def unauthorized_handler(): + return 'Unauthorized', 401 +``` + +Documentation for Flask-Login is available on [ReadTheDocs](https://flask-login.readthedocs.io/en/latest/). +For complete understanding of available configuration, please refer to the [source code](https://github.com/maxcountryman/flask-login). + + +## Contributing + +We welcome contributions! If you would like to hack on Flask-Login, please +follow these steps: + +1. Fork this repository +2. Make your changes +3. Install the dev requirements with `pip install -r requirements/dev.txt` +4. Submit a pull request after running `tox` (ensure it does not error!) + +Please give us adequate time to review your submission. Thanks! diff --git a/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/RECORD b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/RECORD new file mode 100644 index 0000000..b779544 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/RECORD @@ -0,0 +1,22 @@ +Flask_Login-0.6.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Login-0.6.3.dist-info/LICENSE,sha256=ep37nF2iBO0TcPO2LBPimSoS2h2nB_R-FWiX7rQ0Tls,1059 +Flask_Login-0.6.3.dist-info/METADATA,sha256=AUSHR5Po6-Cwmz1KBrAZbTzR-iVVFvtb2NQKYl7UuAU,5799 +Flask_Login-0.6.3.dist-info/RECORD,, +Flask_Login-0.6.3.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +Flask_Login-0.6.3.dist-info/top_level.txt,sha256=OuXmIpiFnXLvW-iBbW2km7ZIy5EZvwSBnYaOC3Kt7j8,12 +flask_login/__about__.py,sha256=Kkp5e9mV9G7vK_FqZof-g9RFmyyBzq1gge5aKXgvilE,389 +flask_login/__init__.py,sha256=wYQiQCikT_Ndp3PhOD-1gRTGCrUPIE-FrjQUrT9aVAg,2681 +flask_login/__pycache__/__about__.cpython-312.pyc,, +flask_login/__pycache__/__init__.cpython-312.pyc,, +flask_login/__pycache__/config.cpython-312.pyc,, +flask_login/__pycache__/login_manager.cpython-312.pyc,, +flask_login/__pycache__/mixins.cpython-312.pyc,, +flask_login/__pycache__/signals.cpython-312.pyc,, +flask_login/__pycache__/test_client.cpython-312.pyc,, +flask_login/__pycache__/utils.cpython-312.pyc,, +flask_login/config.py,sha256=YAocv18La7YGQyNY5aT7rU1GQIZnX6pvchwqx3kA9p8,1813 +flask_login/login_manager.py,sha256=h20F_iv3mqc6rIJ4-V6_XookzOUl8Rcpasua-dCByQY,20073 +flask_login/mixins.py,sha256=gPd7otMRljxw0eUhUMbHsnEBc_jK2cYdxg5KFLuJcoI,1528 +flask_login/signals.py,sha256=xCMoFHKU1RTVt1NY-Gfl0OiVKpiyNt6YJw_PsgkjY3w,2464 +flask_login/test_client.py,sha256=6mrjiBRLGJpgvvFlLypXPTBLiMp0BAN-Ft-uogqC81g,517 +flask_login/utils.py,sha256=Y1wxjCVxpYohBaQJ0ADLypQ-VvBNycwG-gVXFF7k99I,14021 diff --git a/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/WHEEL b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/WHEEL new file mode 100644 index 0000000..ba48cbc --- /dev/null +++ b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.41.3) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt new file mode 100644 index 0000000..31514bd --- /dev/null +++ b/venv/Lib/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_login diff --git a/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/INSTALLER b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/LICENSE b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/LICENSE new file mode 100644 index 0000000..b6f9cdc --- /dev/null +++ b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2010 by danjac. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/METADATA b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/METADATA new file mode 100644 index 0000000..7268492 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/METADATA @@ -0,0 +1,35 @@ +Metadata-Version: 2.1 +Name: Flask-Mail +Version: 0.9.1 +Summary: Flask extension for sending email +Home-page: https://github.com/rduplain/flask-mail +Author: Dan Jacob +Author-email: danjac354@gmail.com +Maintainer: Ron DuPlain +Maintainer-email: ron.duplain@gmail.com +License: BSD +Platform: any +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +License-File: LICENSE +Requires-Dist: Flask +Requires-Dist: blinker + + +Flask-Mail +---------- + +A Flask extension for sending email messages. + +Please refer to the online documentation for details. + +Links +````` + +* `documentation `_ diff --git a/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/RECORD b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/RECORD new file mode 100644 index 0000000..3c97fac --- /dev/null +++ b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/RECORD @@ -0,0 +1,8 @@ +Flask_Mail-0.9.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Mail-0.9.1.dist-info/LICENSE,sha256=4Rm-c4W3yEpsCANoWqvmytM2PUSFd7btDLd_SpVbEFQ,1449 +Flask_Mail-0.9.1.dist-info/METADATA,sha256=AllY2oEzc2vbZVrVjUpLq56-vHrqzCaemsVMQeWZPS8,995 +Flask_Mail-0.9.1.dist-info/RECORD,, +Flask_Mail-0.9.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92 +Flask_Mail-0.9.1.dist-info/top_level.txt,sha256=DXVYMmoZEmH0LMYIpymMBM-ekAlhlAu1TCcWn2GM9OE,11 +__pycache__/flask_mail.cpython-312.pyc,, +flask_mail.py,sha256=IHsiylgTIXOu6i0MQQcVGqBArCl9pR2XzkBMxj1_lr8,17950 diff --git a/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/WHEEL b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/WHEEL new file mode 100644 index 0000000..bab98d6 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.43.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/top_level.txt b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/top_level.txt new file mode 100644 index 0000000..8a2934b --- /dev/null +++ b/venv/Lib/site-packages/Flask_Mail-0.9.1.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_mail diff --git a/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/INSTALLER b/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/METADATA b/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/METADATA new file mode 100644 index 0000000..42bb281 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/METADATA @@ -0,0 +1,36 @@ +Metadata-Version: 2.1 +Name: Flask-Principal +Version: 0.4.0 +Summary: Identity management for flask +Home-page: http://packages.python.org/Flask-Principal/ +Author: Ali Afshar +Author-email: aafshar@gmail.com +Maintainer: Matt Wright +Maintainer-email: matt@nobien.net +License: MIT +Platform: any +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: Flask +Requires-Dist: blinker + + +Flask Principal +--------------- + +Identity management for Flask. + +Links +````` + +* `documentation `_ +* `source `_ +* `development version + `_ + diff --git a/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/RECORD b/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/RECORD new file mode 100644 index 0000000..72d8e11 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/RECORD @@ -0,0 +1,7 @@ +Flask_Principal-0.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Principal-0.4.0.dist-info/METADATA,sha256=8eUbgL4RZ7o1VIa0OeW7U2w5OA35XNKyR3ji80NTyQU,1092 +Flask_Principal-0.4.0.dist-info/RECORD,, +Flask_Principal-0.4.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92 +Flask_Principal-0.4.0.dist-info/top_level.txt,sha256=OvvQEFZouL0A8O9TdIg_v6TAOLNnvaFr34Zr28AqBGY,16 +__pycache__/flask_principal.cpython-312.pyc,, +flask_principal.py,sha256=H-6ZuSY_nAYfWd-VdojVZuwVLV_tXkUwTwThKdnHunQ,13860 diff --git a/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/WHEEL b/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/WHEEL new file mode 100644 index 0000000..bab98d6 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.43.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/top_level.txt b/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/top_level.txt new file mode 100644 index 0000000..7ab03f4 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Principal-0.4.0.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_principal diff --git a/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/DESCRIPTION.rst b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..2ecb117 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/DESCRIPTION.rst @@ -0,0 +1,30 @@ +Flask-Security +=================== + +.. image:: https://img.shields.io/travis/mattupstate/flask-security.svg + :target: https://travis-ci.org/mattupstate/flask-security + +.. image:: https://img.shields.io/coveralls/mattupstate/flask-security.svg + :target: https://coveralls.io/r/mattupstate/flask-security + +.. image:: https://img.shields.io/github/tag/mattupstate/flask-security.svg + :target: https://github.com/mattupstate/flask-security/releases + +.. image:: https://img.shields.io/pypi/dm/flask-security.svg + :target: https://pypi.python.org/pypi/flask-security + :alt: Downloads + +.. image:: https://img.shields.io/github/license/mattupstate/flask-security.svg + :target: https://github.com/mattupstate/flask-security/blob/master/LICENSE + :alt: License + +It quickly adds security features to your Flask application. + +Resources +--------- + +- `Documentation `_ +- `Issue Tracker `_ +- `Code `_ + + diff --git a/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/INSTALLER b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/METADATA b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/METADATA new file mode 100644 index 0000000..4c76c26 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/METADATA @@ -0,0 +1,130 @@ +Metadata-Version: 2.0 +Name: Flask-Security +Version: 3.0.0 +Summary: Simple security for Flask apps. +Home-page: https://github.com/mattupstate/flask-security +Author: Matt Wright +Author-email: matt@nobien.net +License: MIT +Keywords: flask security +Platform: any +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Development Status :: 4 - Beta +Requires-Dist: Flask (>=0.11) +Requires-Dist: Flask-Login (>=0.3.0) +Requires-Dist: Flask-Mail (>=0.7.3) +Requires-Dist: Flask-Principal (>=0.3.3) +Requires-Dist: Flask-WTF (>=0.13.1) +Requires-Dist: Flask-BabelEx (>=0.9.3) +Requires-Dist: itsdangerous (>=0.21) +Requires-Dist: passlib (>=1.7) +Provides-Extra: all +Requires-Dist: Flask-Sphinx-Themes (>=1.0.1); extra == 'all' +Requires-Dist: Sphinx (>=1.4.2); extra == 'all' +Requires-Dist: Flask-CLI (>=0.4.0); extra == 'all' +Requires-Dist: Flask-Mongoengine (>=0.7.0); extra == 'all' +Requires-Dist: Flask-Peewee (>=0.6.5); extra == 'all' +Requires-Dist: Flask-SQLAlchemy (>=1.0); extra == 'all' +Requires-Dist: bcrypt (>=1.0.2); extra == 'all' +Requires-Dist: check-manifest (>=0.25); extra == 'all' +Requires-Dist: coverage (>=4.0); extra == 'all' +Requires-Dist: isort (>=4.2.2); extra == 'all' +Requires-Dist: mock (>=1.3.0); extra == 'all' +Requires-Dist: mongoengine (>=0.10.0); extra == 'all' +Requires-Dist: pony (>=0.7.1); extra == 'all' +Requires-Dist: pydocstyle (>=1.0.0); extra == 'all' +Requires-Dist: pytest-cache (>=1.0); extra == 'all' +Requires-Dist: pytest-cov (>=2.4.0); extra == 'all' +Requires-Dist: pytest-flakes (>=1.0.1); extra == 'all' +Requires-Dist: pytest-pep8 (>=1.0.6); extra == 'all' +Requires-Dist: pytest-translations (>=1.0.4); extra == 'all' +Requires-Dist: pytest (>=3.0.5); extra == 'all' +Requires-Dist: sqlalchemy (>=0.8.0); extra == 'all' +Requires-Dist: Flask-Sphinx-Themes (>=1.0.1); extra == 'all' +Requires-Dist: Sphinx (>=1.4.2); extra == 'all' +Requires-Dist: Flask-CLI (>=0.4.0); extra == 'all' +Requires-Dist: Flask-Mongoengine (>=0.7.0); extra == 'all' +Requires-Dist: Flask-Peewee (>=0.6.5); extra == 'all' +Requires-Dist: Flask-SQLAlchemy (>=1.0); extra == 'all' +Requires-Dist: bcrypt (>=1.0.2); extra == 'all' +Requires-Dist: check-manifest (>=0.25); extra == 'all' +Requires-Dist: coverage (>=4.0); extra == 'all' +Requires-Dist: isort (>=4.2.2); extra == 'all' +Requires-Dist: mock (>=1.3.0); extra == 'all' +Requires-Dist: mongoengine (>=0.10.0); extra == 'all' +Requires-Dist: pony (>=0.7.1); extra == 'all' +Requires-Dist: pydocstyle (>=1.0.0); extra == 'all' +Requires-Dist: pytest-cache (>=1.0); extra == 'all' +Requires-Dist: pytest-cov (>=2.4.0); extra == 'all' +Requires-Dist: pytest-flakes (>=1.0.1); extra == 'all' +Requires-Dist: pytest-pep8 (>=1.0.6); extra == 'all' +Requires-Dist: pytest-translations (>=1.0.4); extra == 'all' +Requires-Dist: pytest (>=3.0.5); extra == 'all' +Requires-Dist: sqlalchemy (>=0.8.0); extra == 'all' +Provides-Extra: docs +Requires-Dist: Flask-Sphinx-Themes (>=1.0.1); extra == 'docs' +Requires-Dist: Sphinx (>=1.4.2); extra == 'docs' +Provides-Extra: tests +Requires-Dist: Flask-CLI (>=0.4.0); extra == 'tests' +Requires-Dist: Flask-Mongoengine (>=0.7.0); extra == 'tests' +Requires-Dist: Flask-Peewee (>=0.6.5); extra == 'tests' +Requires-Dist: Flask-SQLAlchemy (>=1.0); extra == 'tests' +Requires-Dist: bcrypt (>=1.0.2); extra == 'tests' +Requires-Dist: check-manifest (>=0.25); extra == 'tests' +Requires-Dist: coverage (>=4.0); extra == 'tests' +Requires-Dist: isort (>=4.2.2); extra == 'tests' +Requires-Dist: mock (>=1.3.0); extra == 'tests' +Requires-Dist: mongoengine (>=0.10.0); extra == 'tests' +Requires-Dist: pony (>=0.7.1); extra == 'tests' +Requires-Dist: pydocstyle (>=1.0.0); extra == 'tests' +Requires-Dist: pytest-cache (>=1.0); extra == 'tests' +Requires-Dist: pytest-cov (>=2.4.0); extra == 'tests' +Requires-Dist: pytest-flakes (>=1.0.1); extra == 'tests' +Requires-Dist: pytest-pep8 (>=1.0.6); extra == 'tests' +Requires-Dist: pytest-translations (>=1.0.4); extra == 'tests' +Requires-Dist: pytest (>=3.0.5); extra == 'tests' +Requires-Dist: sqlalchemy (>=0.8.0); extra == 'tests' + +Flask-Security +=================== + +.. image:: https://img.shields.io/travis/mattupstate/flask-security.svg + :target: https://travis-ci.org/mattupstate/flask-security + +.. image:: https://img.shields.io/coveralls/mattupstate/flask-security.svg + :target: https://coveralls.io/r/mattupstate/flask-security + +.. image:: https://img.shields.io/github/tag/mattupstate/flask-security.svg + :target: https://github.com/mattupstate/flask-security/releases + +.. image:: https://img.shields.io/pypi/dm/flask-security.svg + :target: https://pypi.python.org/pypi/flask-security + :alt: Downloads + +.. image:: https://img.shields.io/github/license/mattupstate/flask-security.svg + :target: https://github.com/mattupstate/flask-security/blob/master/LICENSE + :alt: License + +It quickly adds security features to your Flask application. + +Resources +--------- + +- `Documentation `_ +- `Issue Tracker `_ +- `Code `_ + + diff --git a/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/RECORD b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/RECORD new file mode 100644 index 0000000..9d250fb --- /dev/null +++ b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/RECORD @@ -0,0 +1,72 @@ +Flask_Security-3.0.0.dist-info/DESCRIPTION.rst,sha256=9OtuUa-1Ewj1G8_82qaLqXuAq0PN8PPbyiiQYxIv6wE,1050 +Flask_Security-3.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Security-3.0.0.dist-info/METADATA,sha256=t3rYzTxjK-3F2pa2lARHGi3GN9oBitZfGynjWxEqbAk,5785 +Flask_Security-3.0.0.dist-info/RECORD,, +Flask_Security-3.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_Security-3.0.0.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 +Flask_Security-3.0.0.dist-info/metadata.json,sha256=FoVIlT27xu0eLLD2t9OWzgiK5flSZPsZCwFuqWjA3HI,3534 +Flask_Security-3.0.0.dist-info/top_level.txt,sha256=32qbHJfRj6C-_wcbEzQlmEZq9lpS9hdLErS8F5DNQ38,15 +flask_security/__init__.py,sha256=fhIDyA3WZHSZytealFjE44pArzblF5ddP_f1QAsRCH4,1765 +flask_security/__pycache__/__init__.cpython-312.pyc,, +flask_security/__pycache__/babel.cpython-312.pyc,, +flask_security/__pycache__/changeable.cpython-312.pyc,, +flask_security/__pycache__/cli.cpython-312.pyc,, +flask_security/__pycache__/confirmable.cpython-312.pyc,, +flask_security/__pycache__/core.cpython-312.pyc,, +flask_security/__pycache__/datastore.cpython-312.pyc,, +flask_security/__pycache__/decorators.cpython-312.pyc,, +flask_security/__pycache__/forms.cpython-312.pyc,, +flask_security/__pycache__/passwordless.cpython-312.pyc,, +flask_security/__pycache__/recoverable.cpython-312.pyc,, +flask_security/__pycache__/registerable.cpython-312.pyc,, +flask_security/__pycache__/script.cpython-312.pyc,, +flask_security/__pycache__/signals.cpython-312.pyc,, +flask_security/__pycache__/utils.cpython-312.pyc,, +flask_security/__pycache__/views.cpython-312.pyc,, +flask_security/babel.py,sha256=DaxZvUQWWq-waiSk_IEex7r0mL1SEul-jfSLy08O7ss,542 +flask_security/changeable.py,sha256=U4512ekI1qncrj6lZChztTLpCP6OMlusTdGH5T9d_HE,1318 +flask_security/cli.py,sha256=tZUKndP16ouvXqBi0cRcsq-Cj4Dn0agyb6Wk-pftS0c,4424 +flask_security/confirmable.py,sha256=UOwW-u1K9kNHUa4B3PDWG8d3haxMRdeOglI5KCZmbds,2741 +flask_security/core.py,sha256=Q9RpTd1YcnStjU6NO9NY5G_TxDw8RyKLHM0ko0dSF9w,18347 +flask_security/datastore.py,sha256=-fQeMAMbjjyWH8pFVOEdmPQOLde37ISQ5-rq20MzBUg,14935 +flask_security/decorators.py,sha256=OVfbqby7P4SuM5kOn0_TeCNxFjhTDlw71zhwR79lASw,7289 +flask_security/forms.py,sha256=wx3zg-Rh1aF_VJZMVLsyAy7dsNBMVBKd-yGfK1UlRmk,9698 +flask_security/passwordless.py,sha256=pPEaMJJAO8siFpjzG7WGIoYiH39ArazqZ8Iaw1r00eo,1645 +flask_security/recoverable.py,sha256=ER83mDJRCY8pkTQ09oTmP82uRMBWK3cQPMGFuEi-qj8,2869 +flask_security/registerable.py,sha256=TcwHWlCCywl0Sjytlcxj6XaeyJnbkw421Ww0s0XOdSE,1309 +flask_security/script.py,sha256=4y-98Ze_4aLLD2pF-x5YMpEZnywMfKyNPhy2hLwXEZ4,3687 +flask_security/signals.py,sha256=SyYtY3Ow-iPAQLp5j0ZId5rYYbRu-e3AzaL81MWzMzg,703 +flask_security/templates/security/_macros.html,sha256=3PGt7xOxiMeQi-aDqkawz29DHHKrdoMs_j64_6OruE4,356 +flask_security/templates/security/_menu.html,sha256=IruII8fjARKAgWELxhZGKz-q7lNgXfAjafTwUCdnK3s,782 +flask_security/templates/security/_messages.html,sha256=elk2DVV7ov1M7r8LFal14ecmMiZzUlxBRUM6VMwfKig,264 +flask_security/templates/security/change_password.html,sha256=wb_eOd4-TAQIaVYUWOcp3Q61yU6toAPiB3CIuJwtEew,566 +flask_security/templates/security/email/change_notice.html,sha256=FatHl_C1f4Q5VlffzmtzzKMHCcrhJic-PyGEhtshiIM,254 +flask_security/templates/security/email/change_notice.txt,sha256=XCRF1hWcSiDbJSYZPlsVrV2yfHhQ-wvEKyFpdnjivgE,224 +flask_security/templates/security/email/confirmation_instructions.html,sha256=3POCqPWooXy9dLudMcjEaKOs-teN5Ej0Pd2WDhpFWaM,144 +flask_security/templates/security/email/confirmation_instructions.txt,sha256=gk87AYfW89Tr_-0aepBF1agG5PuuZQtM89lbo22wlRc,86 +flask_security/templates/security/email/login_instructions.html,sha256=saUWiCUrZCHLNAW__LBts3CYiGAnZ9iZQv5TcFcPtd4,188 +flask_security/templates/security/email/login_instructions.txt,sha256=1HWUFrQPu0fS1p-0LcS_CWJKg1beZ7_WwhDkuYf87LM,132 +flask_security/templates/security/email/reset_instructions.html,sha256=hOP59QBIVM2Y8yUJtnq9Nl4P9DHZIO4sQIZA8EXhOpY,83 +flask_security/templates/security/email/reset_instructions.txt,sha256=xYROIFrBC4ELw6BDWn3mJPQlvV527E7_eeG1bNC3iak,74 +flask_security/templates/security/email/reset_notice.html,sha256=j-bN_Km62UPp4ih-E4wgrklrVv-29zrRUEsDpEuetgg,47 +flask_security/templates/security/email/reset_notice.txt,sha256=OpJS5IHdq8wh_eawnnSFZmvXWWO6k9PIDfv5GjVhBXc,40 +flask_security/templates/security/email/welcome.html,sha256=FbIAhb6Le68f9DdSb4H--G3PFKBpat6ppNnACOYreL8,243 +flask_security/templates/security/email/welcome.txt,sha256=WxfmkJuARsVx72YEpSs-lBtSbX2Doj0LJG0XgcEqF4o,178 +flask_security/templates/security/forgot_password.html,sha256=DEUq0RrH4CH4xY4Xo2OpLo3uYLlRzwJgW5VOLrmUV0w,472 +flask_security/templates/security/login_user.html,sha256=hc8-ugysz9G8G_Bgk7liRAPsLQA7hYISOQvHffiO44o,575 +flask_security/templates/security/register_user.html,sha256=tZCLa9xocOjgzueZDVDYN9-1blkoxXaovuMKCDKP4ow,627 +flask_security/templates/security/reset_password.html,sha256=c9XaA5hcFb9S_qkDn8a5vFjp1Xrh95Qi_2FhiW1sJtc,550 +flask_security/templates/security/send_confirmation.html,sha256=9glFGv92-0TI7TwwYYVlLxniIjFxWhufxCRj5EMG-KQ,481 +flask_security/templates/security/send_login.html,sha256=dAbScuQg8YHH0wL5XBiRRygsj1dKYsPtG4Z5kUBVznQ,414 +flask_security/translations/da_DK/LC_MESSAGES/flask_security.mo,sha256=oassV9JpocMrXMSYKvdE3AmmFir_zSdu6nehmt0XrZc,6188 +flask_security/translations/da_DK/LC_MESSAGES/flask_security.po,sha256=3y_nbQoChNsycKFtT8kzJGkRu_rGvW62zHZa7xp-f1w,9834 +flask_security/translations/de_DE/LC_MESSAGES/flask_security.mo,sha256=gApTtgk6-8pGMhLb1dRJ0wEfuth5zQhzy6Tc5L6qErY,6425 +flask_security/translations/de_DE/LC_MESSAGES/flask_security.po,sha256=j_8phnK-1Qz7ObqaAQxApz97vFtecglNOVbN7BsgVyU,10101 +flask_security/translations/flask_security.pot,sha256=_IO9Ba6sdXnHPsa6ng7vzCtA_kYOFSWJ-wF83sasc6M,7411 +flask_security/translations/fr_FR/LC_MESSAGES/flask_security.mo,sha256=2vtdHhViQU7_7bOpGfZNRVjuKpPrch9YEpuJvLPpSYA,6792 +flask_security/translations/fr_FR/LC_MESSAGES/flask_security.po,sha256=Rzpwmip9VxGtVlKNH0aV8QDlRHGwkp9xMRxAhKuQXqQ,10438 +flask_security/translations/nl_NL/LC_MESSAGES/messages.po,sha256=92JsGajoZJ2kpRZPb3zRTIvbp9RMLRjJL3IBg7eWnCs,9959 +flask_security/translations/ru_RU/LC_MESSAGES/flask_security.mo,sha256=NS8UVh6eUY_ByyY5wxdthAuCtKhmscO-AeItOkRZY3E,8122 +flask_security/translations/ru_RU/LC_MESSAGES/flask_security.po,sha256=1mRY9_OicQh950Yjt1TdjdSph2c12z-X_k3eIBhL1oo,11749 +flask_security/utils.py,sha256=bUT--9qaA3A5iW1Y3KXNGK-W9Gfn2MLqnqjloCB9X9Y,15083 +flask_security/views.py,sha256=ZDTzIRXi8516hRY-FvhxRUUaCHIiKIo1Vcw09_k1o3k,12129 diff --git a/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/REQUESTED b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/WHEEL b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/WHEEL new file mode 100644 index 0000000..9dff69d --- /dev/null +++ b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.24.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/metadata.json b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/metadata.json new file mode 100644 index 0000000..a04be7d --- /dev/null +++ b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"license": "MIT", "name": "Flask-Security", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "test_requires": [{"requires": ["Flask-CLI (>=0.4.0)", "Flask-Mongoengine (>=0.7.0)", "Flask-Peewee (>=0.6.5)", "Flask-SQLAlchemy (>=1.0)", "bcrypt (>=1.0.2)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "mongoengine (>=0.10.0)", "pony (>=0.7.1)", "pydocstyle (>=1.0.0)", "pytest-cache (>=1.0)", "pytest-cov (>=2.4.0)", "pytest-flakes (>=1.0.1)", "pytest-pep8 (>=1.0.6)", "pytest-translations (>=1.0.4)", "pytest (>=3.0.5)", "sqlalchemy (>=0.8.0)"]}], "summary": "Simple security for Flask apps.", "platform": "any", "run_requires": [{"requires": ["Flask-Sphinx-Themes (>=1.0.1)", "Sphinx (>=1.4.2)"], "extra": "docs"}, {"requires": ["Flask-CLI (>=0.4.0)", "Flask-Mongoengine (>=0.7.0)", "Flask-Peewee (>=0.6.5)", "Flask-SQLAlchemy (>=1.0)", "bcrypt (>=1.0.2)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "mongoengine (>=0.10.0)", "pony (>=0.7.1)", "pydocstyle (>=1.0.0)", "pytest-cache (>=1.0)", "pytest-cov (>=2.4.0)", "pytest-flakes (>=1.0.1)", "pytest-pep8 (>=1.0.6)", "pytest-translations (>=1.0.4)", "pytest (>=3.0.5)", "sqlalchemy (>=0.8.0)"], "extra": "tests"}, {"requires": ["Flask-Sphinx-Themes (>=1.0.1)", "Sphinx (>=1.4.2)", "Flask-CLI (>=0.4.0)", "Flask-Mongoengine (>=0.7.0)", "Flask-Peewee (>=0.6.5)", "Flask-SQLAlchemy (>=1.0)", "bcrypt (>=1.0.2)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "mongoengine (>=0.10.0)", "pony (>=0.7.1)", "pydocstyle (>=1.0.0)", "pytest-cache (>=1.0)", "pytest-cov (>=2.4.0)", "pytest-flakes (>=1.0.1)", "pytest-pep8 (>=1.0.6)", "pytest-translations (>=1.0.4)", "pytest (>=3.0.5)", "sqlalchemy (>=0.8.0)", "Flask-Sphinx-Themes (>=1.0.1)", "Sphinx (>=1.4.2)", "Flask-CLI (>=0.4.0)", "Flask-Mongoengine (>=0.7.0)", "Flask-Peewee (>=0.6.5)", "Flask-SQLAlchemy (>=1.0)", "bcrypt (>=1.0.2)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "mongoengine (>=0.10.0)", "pony (>=0.7.1)", "pydocstyle (>=1.0.0)", "pytest-cache (>=1.0)", "pytest-cov (>=2.4.0)", "pytest-flakes (>=1.0.1)", "pytest-pep8 (>=1.0.6)", "pytest-translations (>=1.0.4)", "pytest (>=3.0.5)", "sqlalchemy (>=0.8.0)"], "extra": "all"}, {"requires": ["Flask (>=0.11)", "Flask-Login (>=0.3.0)", "Flask-Mail (>=0.7.3)", "Flask-Principal (>=0.3.3)", "Flask-WTF (>=0.13.1)", "Flask-BabelEx (>=0.9.3)", "itsdangerous (>=0.21)", "passlib (>=1.7)"]}], "version": "3.0.0", "extensions": {"python.details": {"project_urls": {"Home": "https://github.com/mattupstate/flask-security"}, "document_names": {"description": "DESCRIPTION.rst"}, "contacts": [{"role": "author", "email": "matt@nobien.net", "name": "Matt Wright"}]}}, "keywords": ["flask", "security"], "classifiers": ["Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Development Status :: 4 - Beta"], "extras": ["all", "docs", "tests"]} \ No newline at end of file diff --git a/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/top_level.txt b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/top_level.txt new file mode 100644 index 0000000..dc4e699 --- /dev/null +++ b/venv/Lib/site-packages/Flask_Security-3.0.0.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_security diff --git a/venv/Lib/site-packages/__pycache__/flask_mail.cpython-312.pyc b/venv/Lib/site-packages/__pycache__/flask_mail.cpython-312.pyc new file mode 100644 index 0000000..1f56932 Binary files /dev/null and b/venv/Lib/site-packages/__pycache__/flask_mail.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/__pycache__/flask_principal.cpython-312.pyc b/venv/Lib/site-packages/__pycache__/flask_principal.cpython-312.pyc new file mode 100644 index 0000000..52e1d6e Binary files /dev/null and b/venv/Lib/site-packages/__pycache__/flask_principal.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/__pycache__/speaklater.cpython-312.pyc b/venv/Lib/site-packages/__pycache__/speaklater.cpython-312.pyc new file mode 100644 index 0000000..e02fee6 Binary files /dev/null and b/venv/Lib/site-packages/__pycache__/speaklater.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc index fea8094..4a13525 100644 Binary files a/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc and b/venv/Lib/site-packages/__pycache__/typing_extensions.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__init__.py b/venv/Lib/site-packages/babel/__init__.py new file mode 100644 index 0000000..ff986e9 --- /dev/null +++ b/venv/Lib/site-packages/babel/__init__.py @@ -0,0 +1,37 @@ +""" + babel + ~~~~~ + + Integrated collection of utilities that assist in internationalizing and + localizing applications. + + This package is basically composed of two major parts: + + * tools to build and work with ``gettext`` message catalogs + * a Python interface to the CLDR (Common Locale Data Repository), providing + access to various locale display names, localized number and date + formatting, etc. + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" + +from babel.core import ( + Locale, + UnknownLocaleError, + default_locale, + get_locale_identifier, + negotiate_locale, + parse_locale, +) + +__version__ = '2.14.0' + +__all__ = [ + 'Locale', + 'UnknownLocaleError', + 'default_locale', + 'get_locale_identifier', + 'negotiate_locale', + 'parse_locale', +] diff --git a/venv/Lib/site-packages/babel/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..9c39f0d Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/__init__.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__pycache__/core.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/core.cpython-312.pyc new file mode 100644 index 0000000..3b0d479 Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/core.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__pycache__/dates.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/dates.cpython-312.pyc new file mode 100644 index 0000000..2610a67 Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/dates.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__pycache__/languages.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/languages.cpython-312.pyc new file mode 100644 index 0000000..683df50 Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/languages.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__pycache__/lists.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/lists.cpython-312.pyc new file mode 100644 index 0000000..e728b8c Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/lists.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__pycache__/localedata.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/localedata.cpython-312.pyc new file mode 100644 index 0000000..6caa0dc Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/localedata.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__pycache__/numbers.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/numbers.cpython-312.pyc new file mode 100644 index 0000000..5c79335 Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/numbers.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__pycache__/plural.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/plural.cpython-312.pyc new file mode 100644 index 0000000..d20b462 Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/plural.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__pycache__/support.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/support.cpython-312.pyc new file mode 100644 index 0000000..4dc736b Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/support.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__pycache__/units.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/units.cpython-312.pyc new file mode 100644 index 0000000..c4dde3f Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/units.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/__pycache__/util.cpython-312.pyc b/venv/Lib/site-packages/babel/__pycache__/util.cpython-312.pyc new file mode 100644 index 0000000..b13274d Binary files /dev/null and b/venv/Lib/site-packages/babel/__pycache__/util.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/core.py b/venv/Lib/site-packages/babel/core.py new file mode 100644 index 0000000..207c13b --- /dev/null +++ b/venv/Lib/site-packages/babel/core.py @@ -0,0 +1,1296 @@ +""" + babel.core + ~~~~~~~~~~ + + Core locale representation and locale data access. + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" + +from __future__ import annotations + +import os +import pickle +from collections.abc import Iterable, Mapping +from typing import TYPE_CHECKING, Any + +from babel import localedata +from babel.plural import PluralRule + +__all__ = ['UnknownLocaleError', 'Locale', 'default_locale', 'negotiate_locale', + 'parse_locale'] + +if TYPE_CHECKING: + from typing_extensions import Literal, TypeAlias + + _GLOBAL_KEY: TypeAlias = Literal[ + "all_currencies", + "currency_fractions", + "language_aliases", + "likely_subtags", + "meta_zones", + "parent_exceptions", + "script_aliases", + "territory_aliases", + "territory_currencies", + "territory_languages", + "territory_zones", + "variant_aliases", + "windows_zone_mapping", + "zone_aliases", + "zone_territories", + ] + + _global_data: Mapping[_GLOBAL_KEY, Mapping[str, Any]] | None + +_global_data = None +_default_plural_rule = PluralRule({}) + + +def _raise_no_data_error(): + raise RuntimeError('The babel data files are not available. ' + 'This usually happens because you are using ' + 'a source checkout from Babel and you did ' + 'not build the data files. Just make sure ' + 'to run "python setup.py import_cldr" before ' + 'installing the library.') + + +def get_global(key: _GLOBAL_KEY) -> Mapping[str, Any]: + """Return the dictionary for the given key in the global data. + + The global data is stored in the ``babel/global.dat`` file and contains + information independent of individual locales. + + >>> get_global('zone_aliases')['UTC'] + u'Etc/UTC' + >>> get_global('zone_territories')['Europe/Berlin'] + u'DE' + + The keys available are: + + - ``all_currencies`` + - ``currency_fractions`` + - ``language_aliases`` + - ``likely_subtags`` + - ``parent_exceptions`` + - ``script_aliases`` + - ``territory_aliases`` + - ``territory_currencies`` + - ``territory_languages`` + - ``territory_zones`` + - ``variant_aliases`` + - ``windows_zone_mapping`` + - ``zone_aliases`` + - ``zone_territories`` + + .. note:: The internal structure of the data may change between versions. + + .. versionadded:: 0.9 + + :param key: the data key + """ + global _global_data + if _global_data is None: + dirname = os.path.join(os.path.dirname(__file__)) + filename = os.path.join(dirname, 'global.dat') + if not os.path.isfile(filename): + _raise_no_data_error() + with open(filename, 'rb') as fileobj: + _global_data = pickle.load(fileobj) + assert _global_data is not None + return _global_data.get(key, {}) + + +LOCALE_ALIASES = { + 'ar': 'ar_SY', 'bg': 'bg_BG', 'bs': 'bs_BA', 'ca': 'ca_ES', 'cs': 'cs_CZ', + 'da': 'da_DK', 'de': 'de_DE', 'el': 'el_GR', 'en': 'en_US', 'es': 'es_ES', + 'et': 'et_EE', 'fa': 'fa_IR', 'fi': 'fi_FI', 'fr': 'fr_FR', 'gl': 'gl_ES', + 'he': 'he_IL', 'hu': 'hu_HU', 'id': 'id_ID', 'is': 'is_IS', 'it': 'it_IT', + 'ja': 'ja_JP', 'km': 'km_KH', 'ko': 'ko_KR', 'lt': 'lt_LT', 'lv': 'lv_LV', + 'mk': 'mk_MK', 'nl': 'nl_NL', 'nn': 'nn_NO', 'no': 'nb_NO', 'pl': 'pl_PL', + 'pt': 'pt_PT', 'ro': 'ro_RO', 'ru': 'ru_RU', 'sk': 'sk_SK', 'sl': 'sl_SI', + 'sv': 'sv_SE', 'th': 'th_TH', 'tr': 'tr_TR', 'uk': 'uk_UA', +} + + +class UnknownLocaleError(Exception): + """Exception thrown when a locale is requested for which no locale data + is available. + """ + + def __init__(self, identifier: str) -> None: + """Create the exception. + + :param identifier: the identifier string of the unsupported locale + """ + Exception.__init__(self, f"unknown locale {identifier!r}") + + #: The identifier of the locale that could not be found. + self.identifier = identifier + + +class Locale: + """Representation of a specific locale. + + >>> locale = Locale('en', 'US') + >>> repr(locale) + "Locale('en', territory='US')" + >>> locale.display_name + u'English (United States)' + + A `Locale` object can also be instantiated from a raw locale string: + + >>> locale = Locale.parse('en-US', sep='-') + >>> repr(locale) + "Locale('en', territory='US')" + + `Locale` objects provide access to a collection of locale data, such as + territory and language names, number and date format patterns, and more: + + >>> locale.number_symbols['latn']['decimal'] + u'.' + + If a locale is requested for which no locale data is available, an + `UnknownLocaleError` is raised: + + >>> Locale.parse('en_XX') + Traceback (most recent call last): + ... + UnknownLocaleError: unknown locale 'en_XX' + + For more information see :rfc:`3066`. + """ + + def __init__( + self, + language: str, + territory: str | None = None, + script: str | None = None, + variant: str | None = None, + modifier: str | None = None, + ) -> None: + """Initialize the locale object from the given identifier components. + + >>> locale = Locale('en', 'US') + >>> locale.language + 'en' + >>> locale.territory + 'US' + + :param language: the language code + :param territory: the territory (country or region) code + :param script: the script code + :param variant: the variant code + :param modifier: a modifier (following the '@' symbol, sometimes called '@variant') + :raise `UnknownLocaleError`: if no locale data is available for the + requested locale + """ + #: the language code + self.language = language + #: the territory (country or region) code + self.territory = territory + #: the script code + self.script = script + #: the variant code + self.variant = variant + #: the modifier + self.modifier = modifier + self.__data: localedata.LocaleDataDict | None = None + + identifier = str(self) + identifier_without_modifier = identifier.partition('@')[0] + if not localedata.exists(identifier_without_modifier): + raise UnknownLocaleError(identifier) + + @classmethod + def default(cls, category: str | None = None, aliases: Mapping[str, str] = LOCALE_ALIASES) -> Locale: + """Return the system default locale for the specified category. + + >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES']: + ... os.environ[name] = '' + >>> os.environ['LANG'] = 'fr_FR.UTF-8' + >>> Locale.default('LC_MESSAGES') + Locale('fr', territory='FR') + + The following fallbacks to the variable are always considered: + + - ``LANGUAGE`` + - ``LC_ALL`` + - ``LC_CTYPE`` + - ``LANG`` + + :param category: one of the ``LC_XXX`` environment variable names + :param aliases: a dictionary of aliases for locale identifiers + """ + # XXX: use likely subtag expansion here instead of the + # aliases dictionary. + locale_string = default_locale(category, aliases=aliases) + return cls.parse(locale_string) + + @classmethod + def negotiate( + cls, + preferred: Iterable[str], + available: Iterable[str], + sep: str = '_', + aliases: Mapping[str, str] = LOCALE_ALIASES, + ) -> Locale | None: + """Find the best match between available and requested locale strings. + + >>> Locale.negotiate(['de_DE', 'en_US'], ['de_DE', 'de_AT']) + Locale('de', territory='DE') + >>> Locale.negotiate(['de_DE', 'en_US'], ['en', 'de']) + Locale('de') + >>> Locale.negotiate(['de_DE', 'de'], ['en_US']) + + You can specify the character used in the locale identifiers to separate + the different components. This separator is applied to both lists. Also, + case is ignored in the comparison: + + >>> Locale.negotiate(['de-DE', 'de'], ['en-us', 'de-de'], sep='-') + Locale('de', territory='DE') + + :param preferred: the list of locale identifiers preferred by the user + :param available: the list of locale identifiers available + :param aliases: a dictionary of aliases for locale identifiers + """ + identifier = negotiate_locale(preferred, available, sep=sep, + aliases=aliases) + if identifier: + return Locale.parse(identifier, sep=sep) + return None + + @classmethod + def parse( + cls, + identifier: str | Locale | None, + sep: str = '_', + resolve_likely_subtags: bool = True, + ) -> Locale: + """Create a `Locale` instance for the given locale identifier. + + >>> l = Locale.parse('de-DE', sep='-') + >>> l.display_name + u'Deutsch (Deutschland)' + + If the `identifier` parameter is not a string, but actually a `Locale` + object, that object is returned: + + >>> Locale.parse(l) + Locale('de', territory='DE') + + If the `identifier` parameter is neither of these, such as `None` + e.g. because a default locale identifier could not be determined, + a `TypeError` is raised: + + >>> Locale.parse(None) + Traceback (most recent call last): + ... + TypeError: ... + + This also can perform resolving of likely subtags which it does + by default. This is for instance useful to figure out the most + likely locale for a territory you can use ``'und'`` as the + language tag: + + >>> Locale.parse('und_AT') + Locale('de', territory='AT') + + Modifiers are optional, and always at the end, separated by "@": + + >>> Locale.parse('de_AT@euro') + Locale('de', territory='AT', modifier='euro') + + :param identifier: the locale identifier string + :param sep: optional component separator + :param resolve_likely_subtags: if this is specified then a locale will + have its likely subtag resolved if the + locale otherwise does not exist. For + instance ``zh_TW`` by itself is not a + locale that exists but Babel can + automatically expand it to the full + form of ``zh_hant_TW``. Note that this + expansion is only taking place if no + locale exists otherwise. For instance + there is a locale ``en`` that can exist + by itself. + :raise `ValueError`: if the string does not appear to be a valid locale + identifier + :raise `UnknownLocaleError`: if no locale data is available for the + requested locale + :raise `TypeError`: if the identifier is not a string or a `Locale` + """ + if isinstance(identifier, Locale): + return identifier + elif not isinstance(identifier, str): + raise TypeError(f"Unexpected value for identifier: {identifier!r}") + + parts = parse_locale(identifier, sep=sep) + input_id = get_locale_identifier(parts) + + def _try_load(parts): + try: + return cls(*parts) + except UnknownLocaleError: + return None + + def _try_load_reducing(parts): + # Success on first hit, return it. + locale = _try_load(parts) + if locale is not None: + return locale + + # Now try without script and variant + locale = _try_load(parts[:2]) + if locale is not None: + return locale + + locale = _try_load(parts) + if locale is not None: + return locale + if not resolve_likely_subtags: + raise UnknownLocaleError(input_id) + + # From here onwards is some very bad likely subtag resolving. This + # whole logic is not entirely correct but good enough (tm) for the + # time being. This has been added so that zh_TW does not cause + # errors for people when they upgrade. Later we should properly + # implement ICU like fuzzy locale objects and provide a way to + # maximize and minimize locale tags. + + if len(parts) == 5: + language, territory, script, variant, modifier = parts + else: + language, territory, script, variant = parts + modifier = None + language = get_global('language_aliases').get(language, language) + territory = get_global('territory_aliases').get(territory or '', (territory,))[0] + script = get_global('script_aliases').get(script or '', script) + variant = get_global('variant_aliases').get(variant or '', variant) + + if territory == 'ZZ': + territory = None + if script == 'Zzzz': + script = None + + parts = language, territory, script, variant, modifier + + # First match: try the whole identifier + new_id = get_locale_identifier(parts) + likely_subtag = get_global('likely_subtags').get(new_id) + if likely_subtag is not None: + locale = _try_load_reducing(parse_locale(likely_subtag)) + if locale is not None: + return locale + + # If we did not find anything so far, try again with a + # simplified identifier that is just the language + likely_subtag = get_global('likely_subtags').get(language) + if likely_subtag is not None: + parts2 = parse_locale(likely_subtag) + if len(parts2) == 5: + language2, _, script2, variant2, modifier2 = parts2 + else: + language2, _, script2, variant2 = parts2 + modifier2 = None + locale = _try_load_reducing((language2, territory, script2, variant2, modifier2)) + if locale is not None: + return locale + + raise UnknownLocaleError(input_id) + + def __eq__(self, other: object) -> bool: + for key in ('language', 'territory', 'script', 'variant', 'modifier'): + if not hasattr(other, key): + return False + return ( + self.language == getattr(other, 'language') and # noqa: B009 + self.territory == getattr(other, 'territory') and # noqa: B009 + self.script == getattr(other, 'script') and # noqa: B009 + self.variant == getattr(other, 'variant') and # noqa: B009 + self.modifier == getattr(other, 'modifier') # noqa: B009 + ) + + def __ne__(self, other: object) -> bool: + return not self.__eq__(other) + + def __hash__(self) -> int: + return hash((self.language, self.territory, self.script, + self.variant, self.modifier)) + + def __repr__(self) -> str: + parameters = [''] + for key in ('territory', 'script', 'variant', 'modifier'): + value = getattr(self, key) + if value is not None: + parameters.append(f"{key}={value!r}") + return f"Locale({self.language!r}{', '.join(parameters)})" + + def __str__(self) -> str: + return get_locale_identifier((self.language, self.territory, + self.script, self.variant, + self.modifier)) + + @property + def _data(self) -> localedata.LocaleDataDict: + if self.__data is None: + self.__data = localedata.LocaleDataDict(localedata.load(str(self))) + return self.__data + + def get_display_name(self, locale: Locale | str | None = None) -> str | None: + """Return the display name of the locale using the given locale. + + The display name will include the language, territory, script, and + variant, if those are specified. + + >>> Locale('zh', 'CN', script='Hans').get_display_name('en') + u'Chinese (Simplified, China)' + + Modifiers are currently passed through verbatim: + + >>> Locale('it', 'IT', modifier='euro').get_display_name('en') + u'Italian (Italy, euro)' + + :param locale: the locale to use + """ + if locale is None: + locale = self + locale = Locale.parse(locale) + retval = locale.languages.get(self.language) + if retval and (self.territory or self.script or self.variant): + details = [] + if self.script: + details.append(locale.scripts.get(self.script)) + if self.territory: + details.append(locale.territories.get(self.territory)) + if self.variant: + details.append(locale.variants.get(self.variant)) + if self.modifier: + details.append(self.modifier) + detail_string = ', '.join(atom for atom in details if atom) + if detail_string: + retval += f" ({detail_string})" + return retval + + display_name = property(get_display_name, doc="""\ + The localized display name of the locale. + + >>> Locale('en').display_name + u'English' + >>> Locale('en', 'US').display_name + u'English (United States)' + >>> Locale('sv').display_name + u'svenska' + + :type: `unicode` + """) + + def get_language_name(self, locale: Locale | str | None = None) -> str | None: + """Return the language of this locale in the given locale. + + >>> Locale('zh', 'CN', script='Hans').get_language_name('de') + u'Chinesisch' + + .. versionadded:: 1.0 + + :param locale: the locale to use + """ + if locale is None: + locale = self + locale = Locale.parse(locale) + return locale.languages.get(self.language) + + language_name = property(get_language_name, doc="""\ + The localized language name of the locale. + + >>> Locale('en', 'US').language_name + u'English' + """) + + def get_territory_name(self, locale: Locale | str | None = None) -> str | None: + """Return the territory name in the given locale.""" + if locale is None: + locale = self + locale = Locale.parse(locale) + return locale.territories.get(self.territory or '') + + territory_name = property(get_territory_name, doc="""\ + The localized territory name of the locale if available. + + >>> Locale('de', 'DE').territory_name + u'Deutschland' + """) + + def get_script_name(self, locale: Locale | str | None = None) -> str | None: + """Return the script name in the given locale.""" + if locale is None: + locale = self + locale = Locale.parse(locale) + return locale.scripts.get(self.script or '') + + script_name = property(get_script_name, doc="""\ + The localized script name of the locale if available. + + >>> Locale('sr', 'ME', script='Latn').script_name + u'latinica' + """) + + @property + def english_name(self) -> str | None: + """The english display name of the locale. + + >>> Locale('de').english_name + u'German' + >>> Locale('de', 'DE').english_name + u'German (Germany)' + + :type: `unicode`""" + return self.get_display_name(Locale('en')) + + # { General Locale Display Names + + @property + def languages(self) -> localedata.LocaleDataDict: + """Mapping of language codes to translated language names. + + >>> Locale('de', 'DE').languages['ja'] + u'Japanisch' + + See `ISO 639 `_ for + more information. + """ + return self._data['languages'] + + @property + def scripts(self) -> localedata.LocaleDataDict: + """Mapping of script codes to translated script names. + + >>> Locale('en', 'US').scripts['Hira'] + u'Hiragana' + + See `ISO 15924 `_ + for more information. + """ + return self._data['scripts'] + + @property + def territories(self) -> localedata.LocaleDataDict: + """Mapping of script codes to translated script names. + + >>> Locale('es', 'CO').territories['DE'] + u'Alemania' + + See `ISO 3166 `_ + for more information. + """ + return self._data['territories'] + + @property + def variants(self) -> localedata.LocaleDataDict: + """Mapping of script codes to translated script names. + + >>> Locale('de', 'DE').variants['1901'] + u'Alte deutsche Rechtschreibung' + """ + return self._data['variants'] + + # { Number Formatting + + @property + def currencies(self) -> localedata.LocaleDataDict: + """Mapping of currency codes to translated currency names. This + only returns the generic form of the currency name, not the count + specific one. If an actual number is requested use the + :func:`babel.numbers.get_currency_name` function. + + >>> Locale('en').currencies['COP'] + u'Colombian Peso' + >>> Locale('de', 'DE').currencies['COP'] + u'Kolumbianischer Peso' + """ + return self._data['currency_names'] + + @property + def currency_symbols(self) -> localedata.LocaleDataDict: + """Mapping of currency codes to symbols. + + >>> Locale('en', 'US').currency_symbols['USD'] + u'$' + >>> Locale('es', 'CO').currency_symbols['USD'] + u'US$' + """ + return self._data['currency_symbols'] + + @property + def number_symbols(self) -> localedata.LocaleDataDict: + """Symbols used in number formatting by number system. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('fr', 'FR').number_symbols["latn"]['decimal'] + u',' + >>> Locale('fa', 'IR').number_symbols["arabext"]['decimal'] + u'٫' + >>> Locale('fa', 'IR').number_symbols["latn"]['decimal'] + u'.' + """ + return self._data['number_symbols'] + + @property + def other_numbering_systems(self) -> localedata.LocaleDataDict: + """ + Mapping of other numbering systems available for the locale. + See: https://www.unicode.org/reports/tr35/tr35-numbers.html#otherNumberingSystems + + >>> Locale('el', 'GR').other_numbering_systems['traditional'] + u'grek' + + .. note:: The format of the value returned may change between + Babel versions. + """ + return self._data['numbering_systems'] + + @property + def default_numbering_system(self) -> str: + """The default numbering system used by the locale. + >>> Locale('el', 'GR').default_numbering_system + u'latn' + """ + return self._data['default_numbering_system'] + + @property + def decimal_formats(self) -> localedata.LocaleDataDict: + """Locale patterns for decimal number formatting. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').decimal_formats[None] + + """ + return self._data['decimal_formats'] + + @property + def compact_decimal_formats(self) -> localedata.LocaleDataDict: + """Locale patterns for compact decimal number formatting. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').compact_decimal_formats["short"]["one"]["1000"] + + """ + return self._data['compact_decimal_formats'] + + @property + def currency_formats(self) -> localedata.LocaleDataDict: + """Locale patterns for currency number formatting. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').currency_formats['standard'] + + >>> Locale('en', 'US').currency_formats['accounting'] + + """ + return self._data['currency_formats'] + + @property + def compact_currency_formats(self) -> localedata.LocaleDataDict: + """Locale patterns for compact currency number formatting. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').compact_currency_formats["short"]["one"]["1000"] + + """ + return self._data['compact_currency_formats'] + + @property + def percent_formats(self) -> localedata.LocaleDataDict: + """Locale patterns for percent number formatting. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').percent_formats[None] + + """ + return self._data['percent_formats'] + + @property + def scientific_formats(self) -> localedata.LocaleDataDict: + """Locale patterns for scientific number formatting. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').scientific_formats[None] + + """ + return self._data['scientific_formats'] + + # { Calendar Information and Date Formatting + + @property + def periods(self) -> localedata.LocaleDataDict: + """Locale display names for day periods (AM/PM). + + >>> Locale('en', 'US').periods['am'] + u'AM' + """ + try: + return self._data['day_periods']['stand-alone']['wide'] + except KeyError: + return localedata.LocaleDataDict({}) # pragma: no cover + + @property + def day_periods(self) -> localedata.LocaleDataDict: + """Locale display names for various day periods (not necessarily only AM/PM). + + These are not meant to be used without the relevant `day_period_rules`. + """ + return self._data['day_periods'] + + @property + def day_period_rules(self) -> localedata.LocaleDataDict: + """Day period rules for the locale. Used by `get_period_id`. + """ + return self._data.get('day_period_rules', localedata.LocaleDataDict({})) + + @property + def days(self) -> localedata.LocaleDataDict: + """Locale display names for weekdays. + + >>> Locale('de', 'DE').days['format']['wide'][3] + u'Donnerstag' + """ + return self._data['days'] + + @property + def months(self) -> localedata.LocaleDataDict: + """Locale display names for months. + + >>> Locale('de', 'DE').months['format']['wide'][10] + u'Oktober' + """ + return self._data['months'] + + @property + def quarters(self) -> localedata.LocaleDataDict: + """Locale display names for quarters. + + >>> Locale('de', 'DE').quarters['format']['wide'][1] + u'1. Quartal' + """ + return self._data['quarters'] + + @property + def eras(self) -> localedata.LocaleDataDict: + """Locale display names for eras. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').eras['wide'][1] + u'Anno Domini' + >>> Locale('en', 'US').eras['abbreviated'][0] + u'BC' + """ + return self._data['eras'] + + @property + def time_zones(self) -> localedata.LocaleDataDict: + """Locale display names for time zones. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').time_zones['Europe/London']['long']['daylight'] + u'British Summer Time' + >>> Locale('en', 'US').time_zones['America/St_Johns']['city'] + u'St. John\u2019s' + """ + return self._data['time_zones'] + + @property + def meta_zones(self) -> localedata.LocaleDataDict: + """Locale display names for meta time zones. + + Meta time zones are basically groups of different Olson time zones that + have the same GMT offset and daylight savings time. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').meta_zones['Europe_Central']['long']['daylight'] + u'Central European Summer Time' + + .. versionadded:: 0.9 + """ + return self._data['meta_zones'] + + @property + def zone_formats(self) -> localedata.LocaleDataDict: + """Patterns related to the formatting of time zones. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').zone_formats['fallback'] + u'%(1)s (%(0)s)' + >>> Locale('pt', 'BR').zone_formats['region'] + u'Hor\\xe1rio %s' + + .. versionadded:: 0.9 + """ + return self._data['zone_formats'] + + @property + def first_week_day(self) -> int: + """The first day of a week, with 0 being Monday. + + >>> Locale('de', 'DE').first_week_day + 0 + >>> Locale('en', 'US').first_week_day + 6 + """ + return self._data['week_data']['first_day'] + + @property + def weekend_start(self) -> int: + """The day the weekend starts, with 0 being Monday. + + >>> Locale('de', 'DE').weekend_start + 5 + """ + return self._data['week_data']['weekend_start'] + + @property + def weekend_end(self) -> int: + """The day the weekend ends, with 0 being Monday. + + >>> Locale('de', 'DE').weekend_end + 6 + """ + return self._data['week_data']['weekend_end'] + + @property + def min_week_days(self) -> int: + """The minimum number of days in a week so that the week is counted as + the first week of a year or month. + + >>> Locale('de', 'DE').min_week_days + 4 + """ + return self._data['week_data']['min_days'] + + @property + def date_formats(self) -> localedata.LocaleDataDict: + """Locale patterns for date formatting. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').date_formats['short'] + + >>> Locale('fr', 'FR').date_formats['long'] + + """ + return self._data['date_formats'] + + @property + def time_formats(self) -> localedata.LocaleDataDict: + """Locale patterns for time formatting. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en', 'US').time_formats['short'] + + >>> Locale('fr', 'FR').time_formats['long'] + + """ + return self._data['time_formats'] + + @property + def datetime_formats(self) -> localedata.LocaleDataDict: + """Locale patterns for datetime formatting. + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en').datetime_formats['full'] + u'{1}, {0}' + >>> Locale('th').datetime_formats['medium'] + u'{1} {0}' + """ + return self._data['datetime_formats'] + + @property + def datetime_skeletons(self) -> localedata.LocaleDataDict: + """Locale patterns for formatting parts of a datetime. + + >>> Locale('en').datetime_skeletons['MEd'] + + >>> Locale('fr').datetime_skeletons['MEd'] + + >>> Locale('fr').datetime_skeletons['H'] + + """ + return self._data['datetime_skeletons'] + + @property + def interval_formats(self) -> localedata.LocaleDataDict: + """Locale patterns for interval formatting. + + .. note:: The format of the value returned may change between + Babel versions. + + How to format date intervals in Finnish when the day is the + smallest changing component: + + >>> Locale('fi_FI').interval_formats['MEd']['d'] + [u'E d.\u2009\u2013\u2009', u'E d.M.'] + + .. seealso:: + + The primary API to use this data is :py:func:`babel.dates.format_interval`. + + + :rtype: dict[str, dict[str, list[str]]] + """ + return self._data['interval_formats'] + + @property + def plural_form(self) -> PluralRule: + """Plural rules for the locale. + + >>> Locale('en').plural_form(1) + 'one' + >>> Locale('en').plural_form(0) + 'other' + >>> Locale('fr').plural_form(0) + 'one' + >>> Locale('ru').plural_form(100) + 'many' + """ + return self._data.get('plural_form', _default_plural_rule) + + @property + def list_patterns(self) -> localedata.LocaleDataDict: + """Patterns for generating lists + + .. note:: The format of the value returned may change between + Babel versions. + + >>> Locale('en').list_patterns['standard']['start'] + u'{0}, {1}' + >>> Locale('en').list_patterns['standard']['end'] + u'{0}, and {1}' + >>> Locale('en_GB').list_patterns['standard']['end'] + u'{0} and {1}' + """ + return self._data['list_patterns'] + + @property + def ordinal_form(self) -> PluralRule: + """Plural rules for the locale. + + >>> Locale('en').ordinal_form(1) + 'one' + >>> Locale('en').ordinal_form(2) + 'two' + >>> Locale('en').ordinal_form(3) + 'few' + >>> Locale('fr').ordinal_form(2) + 'other' + >>> Locale('ru').ordinal_form(100) + 'other' + """ + return self._data.get('ordinal_form', _default_plural_rule) + + @property + def measurement_systems(self) -> localedata.LocaleDataDict: + """Localized names for various measurement systems. + + >>> Locale('fr', 'FR').measurement_systems['US'] + u'am\\xe9ricain' + >>> Locale('en', 'US').measurement_systems['US'] + u'US' + + """ + return self._data['measurement_systems'] + + @property + def character_order(self) -> str: + """The text direction for the language. + + >>> Locale('de', 'DE').character_order + 'left-to-right' + >>> Locale('ar', 'SA').character_order + 'right-to-left' + """ + return self._data['character_order'] + + @property + def text_direction(self) -> str: + """The text direction for the language in CSS short-hand form. + + >>> Locale('de', 'DE').text_direction + 'ltr' + >>> Locale('ar', 'SA').text_direction + 'rtl' + """ + return ''.join(word[0] for word in self.character_order.split('-')) + + @property + def unit_display_names(self) -> localedata.LocaleDataDict: + """Display names for units of measurement. + + .. seealso:: + + You may want to use :py:func:`babel.units.get_unit_name` instead. + + .. note:: The format of the value returned may change between + Babel versions. + + """ + return self._data['unit_display_names'] + + +def default_locale(category: str | None = None, aliases: Mapping[str, str] = LOCALE_ALIASES) -> str | None: + """Returns the system default locale for a given category, based on + environment variables. + + >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']: + ... os.environ[name] = '' + >>> os.environ['LANG'] = 'fr_FR.UTF-8' + >>> default_locale('LC_MESSAGES') + 'fr_FR' + + The "C" or "POSIX" pseudo-locales are treated as aliases for the + "en_US_POSIX" locale: + + >>> os.environ['LC_MESSAGES'] = 'POSIX' + >>> default_locale('LC_MESSAGES') + 'en_US_POSIX' + + The following fallbacks to the variable are always considered: + + - ``LANGUAGE`` + - ``LC_ALL`` + - ``LC_CTYPE`` + - ``LANG`` + + :param category: one of the ``LC_XXX`` environment variable names + :param aliases: a dictionary of aliases for locale identifiers + """ + varnames = (category, 'LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'LANG') + for name in filter(None, varnames): + locale = os.getenv(name) + if locale: + if name == 'LANGUAGE' and ':' in locale: + # the LANGUAGE variable may contain a colon-separated list of + # language codes; we just pick the language on the list + locale = locale.split(':')[0] + if locale.split('.')[0] in ('C', 'POSIX'): + locale = 'en_US_POSIX' + elif aliases and locale in aliases: + locale = aliases[locale] + try: + return get_locale_identifier(parse_locale(locale)) + except ValueError: + pass + return None + + +def negotiate_locale(preferred: Iterable[str], available: Iterable[str], sep: str = '_', aliases: Mapping[str, str] = LOCALE_ALIASES) -> str | None: + """Find the best match between available and requested locale strings. + + >>> negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT']) + 'de_DE' + >>> negotiate_locale(['de_DE', 'en_US'], ['en', 'de']) + 'de' + + Case is ignored by the algorithm, the result uses the case of the preferred + locale identifier: + + >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) + 'de_DE' + + >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) + 'de_DE' + + By default, some web browsers unfortunately do not include the territory + in the locale identifier for many locales, and some don't even allow the + user to easily add the territory. So while you may prefer using qualified + locale identifiers in your web-application, they would not normally match + the language-only locale sent by such browsers. To workaround that, this + function uses a default mapping of commonly used language-only locale + identifiers to identifiers including the territory: + + >>> negotiate_locale(['ja', 'en_US'], ['ja_JP', 'en_US']) + 'ja_JP' + + Some browsers even use an incorrect or outdated language code, such as "no" + for Norwegian, where the correct locale identifier would actually be "nb_NO" + (Bokmål) or "nn_NO" (Nynorsk). The aliases are intended to take care of + such cases, too: + + >>> negotiate_locale(['no', 'sv'], ['nb_NO', 'sv_SE']) + 'nb_NO' + + You can override this default mapping by passing a different `aliases` + dictionary to this function, or you can bypass the behavior althogher by + setting the `aliases` parameter to `None`. + + :param preferred: the list of locale strings preferred by the user + :param available: the list of locale strings available + :param sep: character that separates the different parts of the locale + strings + :param aliases: a dictionary of aliases for locale identifiers + """ + available = [a.lower() for a in available if a] + for locale in preferred: + ll = locale.lower() + if ll in available: + return locale + if aliases: + alias = aliases.get(ll) + if alias: + alias = alias.replace('_', sep) + if alias.lower() in available: + return alias + parts = locale.split(sep) + if len(parts) > 1 and parts[0].lower() in available: + return parts[0] + return None + + +def parse_locale( + identifier: str, + sep: str = '_', +) -> tuple[str, str | None, str | None, str | None] | tuple[str, str | None, str | None, str | None, str | None]: + """Parse a locale identifier into a tuple of the form ``(language, + territory, script, variant, modifier)``. + + >>> parse_locale('zh_CN') + ('zh', 'CN', None, None) + >>> parse_locale('zh_Hans_CN') + ('zh', 'CN', 'Hans', None) + >>> parse_locale('ca_es_valencia') + ('ca', 'ES', None, 'VALENCIA') + >>> parse_locale('en_150') + ('en', '150', None, None) + >>> parse_locale('en_us_posix') + ('en', 'US', None, 'POSIX') + >>> parse_locale('it_IT@euro') + ('it', 'IT', None, None, 'euro') + >>> parse_locale('it_IT@custom') + ('it', 'IT', None, None, 'custom') + >>> parse_locale('it_IT@') + ('it', 'IT', None, None) + + The default component separator is "_", but a different separator can be + specified using the `sep` parameter. + + The optional modifier is always separated with "@" and at the end: + + >>> parse_locale('zh-CN', sep='-') + ('zh', 'CN', None, None) + >>> parse_locale('zh-CN@custom', sep='-') + ('zh', 'CN', None, None, 'custom') + + If the identifier cannot be parsed into a locale, a `ValueError` exception + is raised: + + >>> parse_locale('not_a_LOCALE_String') + Traceback (most recent call last): + ... + ValueError: 'not_a_LOCALE_String' is not a valid locale identifier + + Encoding information is removed from the identifier, while modifiers are + kept: + + >>> parse_locale('en_US.UTF-8') + ('en', 'US', None, None) + >>> parse_locale('de_DE.iso885915@euro') + ('de', 'DE', None, None, 'euro') + + See :rfc:`4646` for more information. + + :param identifier: the locale identifier string + :param sep: character that separates the different components of the locale + identifier + :raise `ValueError`: if the string does not appear to be a valid locale + identifier + """ + identifier, _, modifier = identifier.partition('@') + if '.' in identifier: + # this is probably the charset/encoding, which we don't care about + identifier = identifier.split('.', 1)[0] + + parts = identifier.split(sep) + lang = parts.pop(0).lower() + if not lang.isalpha(): + raise ValueError(f"expected only letters, got {lang!r}") + + script = territory = variant = None + if parts and len(parts[0]) == 4 and parts[0].isalpha(): + script = parts.pop(0).title() + + if parts: + if len(parts[0]) == 2 and parts[0].isalpha(): + territory = parts.pop(0).upper() + elif len(parts[0]) == 3 and parts[0].isdigit(): + territory = parts.pop(0) + + if parts and ( + len(parts[0]) == 4 and parts[0][0].isdigit() or + len(parts[0]) >= 5 and parts[0][0].isalpha() + ): + variant = parts.pop().upper() + + if parts: + raise ValueError(f"{identifier!r} is not a valid locale identifier") + + # TODO(3.0): always return a 5-tuple + if modifier: + return lang, territory, script, variant, modifier + else: + return lang, territory, script, variant + + +def get_locale_identifier( + tup: tuple[str] + | tuple[str, str | None] + | tuple[str, str | None, str | None] + | tuple[str, str | None, str | None, str | None] + | tuple[str, str | None, str | None, str | None, str | None], + sep: str = "_", +) -> str: + """The reverse of :func:`parse_locale`. It creates a locale identifier out + of a ``(language, territory, script, variant, modifier)`` tuple. Items can be set to + ``None`` and trailing ``None``\\s can also be left out of the tuple. + + >>> get_locale_identifier(('de', 'DE', None, '1999', 'custom')) + 'de_DE_1999@custom' + >>> get_locale_identifier(('fi', None, None, None, 'custom')) + 'fi@custom' + + + .. versionadded:: 1.0 + + :param tup: the tuple as returned by :func:`parse_locale`. + :param sep: the separator for the identifier. + """ + tup = tuple(tup[:5]) # type: ignore # length should be no more than 5 + lang, territory, script, variant, modifier = tup + (None,) * (5 - len(tup)) + ret = sep.join(filter(None, (lang, script, territory, variant))) + return f'{ret}@{modifier}' if modifier else ret diff --git a/venv/Lib/site-packages/babel/dates.py b/venv/Lib/site-packages/babel/dates.py new file mode 100644 index 0000000..40d9509 --- /dev/null +++ b/venv/Lib/site-packages/babel/dates.py @@ -0,0 +1,1914 @@ +""" + babel.dates + ~~~~~~~~~~~ + + Locale dependent formatting and parsing of dates and times. + + The default locale for the functions in this module is determined by the + following environment variables, in that order: + + * ``LC_TIME``, + * ``LC_ALL``, and + * ``LANG`` + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" + +from __future__ import annotations + +import re +import warnings +from functools import lru_cache +from typing import TYPE_CHECKING, SupportsInt + +try: + import pytz +except ModuleNotFoundError: + pytz = None + import zoneinfo + +import datetime +from collections.abc import Iterable + +from babel import localtime +from babel.core import Locale, default_locale, get_global +from babel.localedata import LocaleDataDict + +if TYPE_CHECKING: + from typing_extensions import Literal, TypeAlias + _Instant: TypeAlias = datetime.date | datetime.time | float | None + _PredefinedTimeFormat: TypeAlias = Literal['full', 'long', 'medium', 'short'] + _Context: TypeAlias = Literal['format', 'stand-alone'] + _DtOrTzinfo: TypeAlias = datetime.datetime | datetime.tzinfo | str | int | datetime.time | None + +# "If a given short metazone form is known NOT to be understood in a given +# locale and the parent locale has this value such that it would normally +# be inherited, the inheritance of this value can be explicitly disabled by +# use of the 'no inheritance marker' as the value, which is 3 simultaneous [sic] +# empty set characters ( U+2205 )." +# - https://www.unicode.org/reports/tr35/tr35-dates.html#Metazone_Names + +NO_INHERITANCE_MARKER = '\u2205\u2205\u2205' + +UTC = datetime.timezone.utc +LOCALTZ = localtime.LOCALTZ + +LC_TIME = default_locale('LC_TIME') + + +def _localize(tz: datetime.tzinfo, dt: datetime.datetime) -> datetime.datetime: + # Support localizing with both pytz and zoneinfo tzinfos + # nothing to do + if dt.tzinfo is tz: + return dt + + if hasattr(tz, 'localize'): # pytz + return tz.localize(dt) + + if dt.tzinfo is None: + # convert naive to localized + return dt.replace(tzinfo=tz) + + # convert timezones + return dt.astimezone(tz) + + +def _get_dt_and_tzinfo(dt_or_tzinfo: _DtOrTzinfo) -> tuple[datetime.datetime | None, datetime.tzinfo]: + """ + Parse a `dt_or_tzinfo` value into a datetime and a tzinfo. + + See the docs for this function's callers for semantics. + + :rtype: tuple[datetime, tzinfo] + """ + if dt_or_tzinfo is None: + dt = datetime.datetime.now() + tzinfo = LOCALTZ + elif isinstance(dt_or_tzinfo, str): + dt = None + tzinfo = get_timezone(dt_or_tzinfo) + elif isinstance(dt_or_tzinfo, int): + dt = None + tzinfo = UTC + elif isinstance(dt_or_tzinfo, (datetime.datetime, datetime.time)): + dt = _get_datetime(dt_or_tzinfo) + tzinfo = dt.tzinfo if dt.tzinfo is not None else UTC + else: + dt = None + tzinfo = dt_or_tzinfo + return dt, tzinfo + + +def _get_tz_name(dt_or_tzinfo: _DtOrTzinfo) -> str: + """ + Get the timezone name out of a time, datetime, or tzinfo object. + + :rtype: str + """ + dt, tzinfo = _get_dt_and_tzinfo(dt_or_tzinfo) + if hasattr(tzinfo, 'zone'): # pytz object + return tzinfo.zone + elif hasattr(tzinfo, 'key') and tzinfo.key is not None: # ZoneInfo object + return tzinfo.key + else: + return tzinfo.tzname(dt or datetime.datetime.now(UTC)) + + +def _get_datetime(instant: _Instant) -> datetime.datetime: + """ + Get a datetime out of an "instant" (date, time, datetime, number). + + .. warning:: The return values of this function may depend on the system clock. + + If the instant is None, the current moment is used. + If the instant is a time, it's augmented with today's date. + + Dates are converted to naive datetimes with midnight as the time component. + + >>> from datetime import date, datetime + >>> _get_datetime(date(2015, 1, 1)) + datetime.datetime(2015, 1, 1, 0, 0) + + UNIX timestamps are converted to datetimes. + + >>> _get_datetime(1400000000) + datetime.datetime(2014, 5, 13, 16, 53, 20) + + Other values are passed through as-is. + + >>> x = datetime(2015, 1, 1) + >>> _get_datetime(x) is x + True + + :param instant: date, time, datetime, integer, float or None + :type instant: date|time|datetime|int|float|None + :return: a datetime + :rtype: datetime + """ + if instant is None: + return datetime.datetime.now(UTC).replace(tzinfo=None) + elif isinstance(instant, (int, float)): + return datetime.datetime.fromtimestamp(instant, UTC).replace(tzinfo=None) + elif isinstance(instant, datetime.time): + return datetime.datetime.combine(datetime.date.today(), instant) + elif isinstance(instant, datetime.date) and not isinstance(instant, datetime.datetime): + return datetime.datetime.combine(instant, datetime.time()) + # TODO (3.x): Add an assertion/type check for this fallthrough branch: + return instant + + +def _ensure_datetime_tzinfo(dt: datetime.datetime, tzinfo: datetime.tzinfo | None = None) -> datetime.datetime: + """ + Ensure the datetime passed has an attached tzinfo. + + If the datetime is tz-naive to begin with, UTC is attached. + + If a tzinfo is passed in, the datetime is normalized to that timezone. + + >>> from datetime import datetime + >>> _get_tz_name(_ensure_datetime_tzinfo(datetime(2015, 1, 1))) + 'UTC' + + >>> tz = get_timezone("Europe/Stockholm") + >>> _ensure_datetime_tzinfo(datetime(2015, 1, 1, 13, 15, tzinfo=UTC), tzinfo=tz).hour + 14 + + :param datetime: Datetime to augment. + :param tzinfo: optional tzinfo + :return: datetime with tzinfo + :rtype: datetime + """ + if dt.tzinfo is None: + dt = dt.replace(tzinfo=UTC) + if tzinfo is not None: + dt = dt.astimezone(get_timezone(tzinfo)) + if hasattr(tzinfo, 'normalize'): # pytz + dt = tzinfo.normalize(dt) + return dt + + +def _get_time( + time: datetime.time | datetime.datetime | None, + tzinfo: datetime.tzinfo | None = None, +) -> datetime.time: + """ + Get a timezoned time from a given instant. + + .. warning:: The return values of this function may depend on the system clock. + + :param time: time, datetime or None + :rtype: time + """ + if time is None: + time = datetime.datetime.now(UTC) + elif isinstance(time, (int, float)): + time = datetime.datetime.fromtimestamp(time, UTC) + + if time.tzinfo is None: + time = time.replace(tzinfo=UTC) + + if isinstance(time, datetime.datetime): + if tzinfo is not None: + time = time.astimezone(tzinfo) + if hasattr(tzinfo, 'normalize'): # pytz + time = tzinfo.normalize(time) + time = time.timetz() + elif tzinfo is not None: + time = time.replace(tzinfo=tzinfo) + return time + + +def get_timezone(zone: str | datetime.tzinfo | None = None) -> datetime.tzinfo: + """Looks up a timezone by name and returns it. The timezone object + returned comes from ``pytz`` or ``zoneinfo``, whichever is available. + It corresponds to the `tzinfo` interface and can be used with all of + the functions of Babel that operate with dates. + + If a timezone is not known a :exc:`LookupError` is raised. If `zone` + is ``None`` a local zone object is returned. + + :param zone: the name of the timezone to look up. If a timezone object + itself is passed in, it's returned unchanged. + """ + if zone is None: + return LOCALTZ + if not isinstance(zone, str): + return zone + + if pytz: + try: + return pytz.timezone(zone) + except pytz.UnknownTimeZoneError as e: + exc = e + else: + assert zoneinfo + try: + return zoneinfo.ZoneInfo(zone) + except zoneinfo.ZoneInfoNotFoundError as e: + exc = e + + raise LookupError(f"Unknown timezone {zone}") from exc + + +def get_period_names(width: Literal['abbreviated', 'narrow', 'wide'] = 'wide', + context: _Context = 'stand-alone', locale: Locale | str | None = LC_TIME) -> LocaleDataDict: + """Return the names for day periods (AM/PM) used by the locale. + + >>> get_period_names(locale='en_US')['am'] + u'AM' + + :param width: the width to use, one of "abbreviated", "narrow", or "wide" + :param context: the context, either "format" or "stand-alone" + :param locale: the `Locale` object, or a locale string + """ + return Locale.parse(locale).day_periods[context][width] + + +def get_day_names(width: Literal['abbreviated', 'narrow', 'short', 'wide'] = 'wide', + context: _Context = 'format', locale: Locale | str | None = LC_TIME) -> LocaleDataDict: + """Return the day names used by the locale for the specified format. + + >>> get_day_names('wide', locale='en_US')[1] + u'Tuesday' + >>> get_day_names('short', locale='en_US')[1] + u'Tu' + >>> get_day_names('abbreviated', locale='es')[1] + u'mar' + >>> get_day_names('narrow', context='stand-alone', locale='de_DE')[1] + u'D' + + :param width: the width to use, one of "wide", "abbreviated", "short" or "narrow" + :param context: the context, either "format" or "stand-alone" + :param locale: the `Locale` object, or a locale string + """ + return Locale.parse(locale).days[context][width] + + +def get_month_names(width: Literal['abbreviated', 'narrow', 'wide'] = 'wide', + context: _Context = 'format', locale: Locale | str | None = LC_TIME) -> LocaleDataDict: + """Return the month names used by the locale for the specified format. + + >>> get_month_names('wide', locale='en_US')[1] + u'January' + >>> get_month_names('abbreviated', locale='es')[1] + u'ene' + >>> get_month_names('narrow', context='stand-alone', locale='de_DE')[1] + u'J' + + :param width: the width to use, one of "wide", "abbreviated", or "narrow" + :param context: the context, either "format" or "stand-alone" + :param locale: the `Locale` object, or a locale string + """ + return Locale.parse(locale).months[context][width] + + +def get_quarter_names(width: Literal['abbreviated', 'narrow', 'wide'] = 'wide', + context: _Context = 'format', locale: Locale | str | None = LC_TIME) -> LocaleDataDict: + """Return the quarter names used by the locale for the specified format. + + >>> get_quarter_names('wide', locale='en_US')[1] + u'1st quarter' + >>> get_quarter_names('abbreviated', locale='de_DE')[1] + u'Q1' + >>> get_quarter_names('narrow', locale='de_DE')[1] + u'1' + + :param width: the width to use, one of "wide", "abbreviated", or "narrow" + :param context: the context, either "format" or "stand-alone" + :param locale: the `Locale` object, or a locale string + """ + return Locale.parse(locale).quarters[context][width] + + +def get_era_names(width: Literal['abbreviated', 'narrow', 'wide'] = 'wide', + locale: Locale | str | None = LC_TIME) -> LocaleDataDict: + """Return the era names used by the locale for the specified format. + + >>> get_era_names('wide', locale='en_US')[1] + u'Anno Domini' + >>> get_era_names('abbreviated', locale='de_DE')[1] + u'n. Chr.' + + :param width: the width to use, either "wide", "abbreviated", or "narrow" + :param locale: the `Locale` object, or a locale string + """ + return Locale.parse(locale).eras[width] + + +def get_date_format(format: _PredefinedTimeFormat = 'medium', locale: Locale | str | None = LC_TIME) -> DateTimePattern: + """Return the date formatting patterns used by the locale for the specified + format. + + >>> get_date_format(locale='en_US') + + >>> get_date_format('full', locale='de_DE') + + + :param format: the format to use, one of "full", "long", "medium", or + "short" + :param locale: the `Locale` object, or a locale string + """ + return Locale.parse(locale).date_formats[format] + + +def get_datetime_format(format: _PredefinedTimeFormat = 'medium', locale: Locale | str | None = LC_TIME) -> DateTimePattern: + """Return the datetime formatting patterns used by the locale for the + specified format. + + >>> get_datetime_format(locale='en_US') + u'{1}, {0}' + + :param format: the format to use, one of "full", "long", "medium", or + "short" + :param locale: the `Locale` object, or a locale string + """ + patterns = Locale.parse(locale).datetime_formats + if format not in patterns: + format = None + return patterns[format] + + +def get_time_format(format: _PredefinedTimeFormat = 'medium', locale: Locale | str | None = LC_TIME) -> DateTimePattern: + """Return the time formatting patterns used by the locale for the specified + format. + + >>> get_time_format(locale='en_US') + + >>> get_time_format('full', locale='de_DE') + + + :param format: the format to use, one of "full", "long", "medium", or + "short" + :param locale: the `Locale` object, or a locale string + """ + return Locale.parse(locale).time_formats[format] + + +def get_timezone_gmt( + datetime: _Instant = None, + width: Literal['long', 'short', 'iso8601', 'iso8601_short'] = 'long', + locale: Locale | str | None = LC_TIME, + return_z: bool = False, +) -> str: + """Return the timezone associated with the given `datetime` object formatted + as string indicating the offset from GMT. + + >>> from datetime import datetime + >>> dt = datetime(2007, 4, 1, 15, 30) + >>> get_timezone_gmt(dt, locale='en') + u'GMT+00:00' + >>> get_timezone_gmt(dt, locale='en', return_z=True) + 'Z' + >>> get_timezone_gmt(dt, locale='en', width='iso8601_short') + u'+00' + >>> tz = get_timezone('America/Los_Angeles') + >>> dt = _localize(tz, datetime(2007, 4, 1, 15, 30)) + >>> get_timezone_gmt(dt, locale='en') + u'GMT-07:00' + >>> get_timezone_gmt(dt, 'short', locale='en') + u'-0700' + >>> get_timezone_gmt(dt, locale='en', width='iso8601_short') + u'-07' + + The long format depends on the locale, for example in France the acronym + UTC string is used instead of GMT: + + >>> get_timezone_gmt(dt, 'long', locale='fr_FR') + u'UTC-07:00' + + .. versionadded:: 0.9 + + :param datetime: the ``datetime`` object; if `None`, the current date and + time in UTC is used + :param width: either "long" or "short" or "iso8601" or "iso8601_short" + :param locale: the `Locale` object, or a locale string + :param return_z: True or False; Function returns indicator "Z" + when local time offset is 0 + """ + datetime = _ensure_datetime_tzinfo(_get_datetime(datetime)) + locale = Locale.parse(locale) + + offset = datetime.tzinfo.utcoffset(datetime) + seconds = offset.days * 24 * 60 * 60 + offset.seconds + hours, seconds = divmod(seconds, 3600) + if return_z and hours == 0 and seconds == 0: + return 'Z' + elif seconds == 0 and width == 'iso8601_short': + return '%+03d' % hours + elif width == 'short' or width == 'iso8601_short': + pattern = '%+03d%02d' + elif width == 'iso8601': + pattern = '%+03d:%02d' + else: + pattern = locale.zone_formats['gmt'] % '%+03d:%02d' + return pattern % (hours, seconds // 60) + + +def get_timezone_location( + dt_or_tzinfo: _DtOrTzinfo = None, + locale: Locale | str | None = LC_TIME, + return_city: bool = False, +) -> str: + """Return a representation of the given timezone using "location format". + + The result depends on both the local display name of the country and the + city associated with the time zone: + + >>> tz = get_timezone('America/St_Johns') + >>> print(get_timezone_location(tz, locale='de_DE')) + Kanada (St. John’s) (Ortszeit) + >>> print(get_timezone_location(tz, locale='en')) + Canada (St. John’s) Time + >>> print(get_timezone_location(tz, locale='en', return_city=True)) + St. John’s + >>> tz = get_timezone('America/Mexico_City') + >>> get_timezone_location(tz, locale='de_DE') + u'Mexiko (Mexiko-Stadt) (Ortszeit)' + + If the timezone is associated with a country that uses only a single + timezone, just the localized country name is returned: + + >>> tz = get_timezone('Europe/Berlin') + >>> get_timezone_name(tz, locale='de_DE') + u'Mitteleurop\\xe4ische Zeit' + + .. versionadded:: 0.9 + + :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines + the timezone; if `None`, the current date and time in + UTC is assumed + :param locale: the `Locale` object, or a locale string + :param return_city: True or False, if True then return exemplar city (location) + for the time zone + :return: the localized timezone name using location format + + """ + locale = Locale.parse(locale) + + zone = _get_tz_name(dt_or_tzinfo) + + # Get the canonical time-zone code + zone = get_global('zone_aliases').get(zone, zone) + + info = locale.time_zones.get(zone, {}) + + # Otherwise, if there is only one timezone for the country, return the + # localized country name + region_format = locale.zone_formats['region'] + territory = get_global('zone_territories').get(zone) + if territory not in locale.territories: + territory = 'ZZ' # invalid/unknown + territory_name = locale.territories[territory] + if not return_city and territory and len(get_global('territory_zones').get(territory, [])) == 1: + return region_format % territory_name + + # Otherwise, include the city in the output + fallback_format = locale.zone_formats['fallback'] + if 'city' in info: + city_name = info['city'] + else: + metazone = get_global('meta_zones').get(zone) + metazone_info = locale.meta_zones.get(metazone, {}) + if 'city' in metazone_info: + city_name = metazone_info['city'] + elif '/' in zone: + city_name = zone.split('/', 1)[1].replace('_', ' ') + else: + city_name = zone.replace('_', ' ') + + if return_city: + return city_name + return region_format % (fallback_format % { + '0': city_name, + '1': territory_name, + }) + + +def get_timezone_name( + dt_or_tzinfo: _DtOrTzinfo = None, + width: Literal['long', 'short'] = 'long', + uncommon: bool = False, + locale: Locale | str | None = LC_TIME, + zone_variant: Literal['generic', 'daylight', 'standard'] | None = None, + return_zone: bool = False, +) -> str: + r"""Return the localized display name for the given timezone. The timezone + may be specified using a ``datetime`` or `tzinfo` object. + + >>> from datetime import time + >>> dt = time(15, 30, tzinfo=get_timezone('America/Los_Angeles')) + >>> get_timezone_name(dt, locale='en_US') # doctest: +SKIP + u'Pacific Standard Time' + >>> get_timezone_name(dt, locale='en_US', return_zone=True) + 'America/Los_Angeles' + >>> get_timezone_name(dt, width='short', locale='en_US') # doctest: +SKIP + u'PST' + + If this function gets passed only a `tzinfo` object and no concrete + `datetime`, the returned display name is independent of daylight savings + time. This can be used for example for selecting timezones, or to set the + time of events that recur across DST changes: + + >>> tz = get_timezone('America/Los_Angeles') + >>> get_timezone_name(tz, locale='en_US') + u'Pacific Time' + >>> get_timezone_name(tz, 'short', locale='en_US') + u'PT' + + If no localized display name for the timezone is available, and the timezone + is associated with a country that uses only a single timezone, the name of + that country is returned, formatted according to the locale: + + >>> tz = get_timezone('Europe/Berlin') + >>> get_timezone_name(tz, locale='de_DE') + u'Mitteleurop\xe4ische Zeit' + >>> get_timezone_name(tz, locale='pt_BR') + u'Hor\xe1rio da Europa Central' + + On the other hand, if the country uses multiple timezones, the city is also + included in the representation: + + >>> tz = get_timezone('America/St_Johns') + >>> get_timezone_name(tz, locale='de_DE') + u'Neufundland-Zeit' + + Note that short format is currently not supported for all timezones and + all locales. This is partially because not every timezone has a short + code in every locale. In that case it currently falls back to the long + format. + + For more information see `LDML Appendix J: Time Zone Display Names + `_ + + .. versionadded:: 0.9 + + .. versionchanged:: 1.0 + Added `zone_variant` support. + + :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines + the timezone; if a ``tzinfo`` object is used, the + resulting display name will be generic, i.e. + independent of daylight savings time; if `None`, the + current date in UTC is assumed + :param width: either "long" or "short" + :param uncommon: deprecated and ignored + :param zone_variant: defines the zone variation to return. By default the + variation is defined from the datetime object + passed in. If no datetime object is passed in, the + ``'generic'`` variation is assumed. The following + values are valid: ``'generic'``, ``'daylight'`` and + ``'standard'``. + :param locale: the `Locale` object, or a locale string + :param return_zone: True or False. If true then function + returns long time zone ID + """ + dt, tzinfo = _get_dt_and_tzinfo(dt_or_tzinfo) + locale = Locale.parse(locale) + + zone = _get_tz_name(dt_or_tzinfo) + + if zone_variant is None: + if dt is None: + zone_variant = 'generic' + else: + dst = tzinfo.dst(dt) + zone_variant = "daylight" if dst else "standard" + else: + if zone_variant not in ('generic', 'standard', 'daylight'): + raise ValueError('Invalid zone variation') + + # Get the canonical time-zone code + zone = get_global('zone_aliases').get(zone, zone) + if return_zone: + return zone + info = locale.time_zones.get(zone, {}) + # Try explicitly translated zone names first + if width in info and zone_variant in info[width]: + return info[width][zone_variant] + + metazone = get_global('meta_zones').get(zone) + if metazone: + metazone_info = locale.meta_zones.get(metazone, {}) + if width in metazone_info: + name = metazone_info[width].get(zone_variant) + if width == 'short' and name == NO_INHERITANCE_MARKER: + # If the short form is marked no-inheritance, + # try to fall back to the long name instead. + name = metazone_info.get('long', {}).get(zone_variant) + if name: + return name + + # If we have a concrete datetime, we assume that the result can't be + # independent of daylight savings time, so we return the GMT offset + if dt is not None: + return get_timezone_gmt(dt, width=width, locale=locale) + + return get_timezone_location(dt_or_tzinfo, locale=locale) + + +def format_date( + date: datetime.date | None = None, + format: _PredefinedTimeFormat | str = 'medium', + locale: Locale | str | None = LC_TIME, +) -> str: + """Return a date formatted according to the given pattern. + + >>> from datetime import date + >>> d = date(2007, 4, 1) + >>> format_date(d, locale='en_US') + u'Apr 1, 2007' + >>> format_date(d, format='full', locale='de_DE') + u'Sonntag, 1. April 2007' + + If you don't want to use the locale default formats, you can specify a + custom date pattern: + + >>> format_date(d, "EEE, MMM d, ''yy", locale='en') + u"Sun, Apr 1, '07" + + :param date: the ``date`` or ``datetime`` object; if `None`, the current + date is used + :param format: one of "full", "long", "medium", or "short", or a custom + date/time pattern + :param locale: a `Locale` object or a locale identifier + """ + if date is None: + date = datetime.date.today() + elif isinstance(date, datetime.datetime): + date = date.date() + + locale = Locale.parse(locale) + if format in ('full', 'long', 'medium', 'short'): + format = get_date_format(format, locale=locale) + pattern = parse_pattern(format) + return pattern.apply(date, locale) + + +def format_datetime( + datetime: _Instant = None, + format: _PredefinedTimeFormat | str = 'medium', + tzinfo: datetime.tzinfo | None = None, + locale: Locale | str | None = LC_TIME, +) -> str: + r"""Return a date formatted according to the given pattern. + + >>> from datetime import datetime + >>> dt = datetime(2007, 4, 1, 15, 30) + >>> format_datetime(dt, locale='en_US') + u'Apr 1, 2007, 3:30:00\u202fPM' + + For any pattern requiring the display of the timezone: + + >>> format_datetime(dt, 'full', tzinfo=get_timezone('Europe/Paris'), + ... locale='fr_FR') + 'dimanche 1 avril 2007, 17:30:00 heure d’été d’Europe centrale' + >>> format_datetime(dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz", + ... tzinfo=get_timezone('US/Eastern'), locale='en') + u'2007.04.01 AD at 11:30:00 EDT' + + :param datetime: the `datetime` object; if `None`, the current date and + time is used + :param format: one of "full", "long", "medium", or "short", or a custom + date/time pattern + :param tzinfo: the timezone to apply to the time for display + :param locale: a `Locale` object or a locale identifier + """ + datetime = _ensure_datetime_tzinfo(_get_datetime(datetime), tzinfo) + + locale = Locale.parse(locale) + if format in ('full', 'long', 'medium', 'short'): + return get_datetime_format(format, locale=locale) \ + .replace("'", "") \ + .replace('{0}', format_time(datetime, format, tzinfo=None, + locale=locale)) \ + .replace('{1}', format_date(datetime, format, locale=locale)) + else: + return parse_pattern(format).apply(datetime, locale) + + +def format_time( + time: datetime.time | datetime.datetime | float | None = None, + format: _PredefinedTimeFormat | str = 'medium', + tzinfo: datetime.tzinfo | None = None, locale: Locale | str | None = LC_TIME, +) -> str: + r"""Return a time formatted according to the given pattern. + + >>> from datetime import datetime, time + >>> t = time(15, 30) + >>> format_time(t, locale='en_US') + u'3:30:00\u202fPM' + >>> format_time(t, format='short', locale='de_DE') + u'15:30' + + If you don't want to use the locale default formats, you can specify a + custom time pattern: + + >>> format_time(t, "hh 'o''clock' a", locale='en') + u"03 o'clock PM" + + For any pattern requiring the display of the time-zone a + timezone has to be specified explicitly: + + >>> t = datetime(2007, 4, 1, 15, 30) + >>> tzinfo = get_timezone('Europe/Paris') + >>> t = _localize(tzinfo, t) + >>> format_time(t, format='full', tzinfo=tzinfo, locale='fr_FR') + '15:30:00 heure d’été d’Europe centrale' + >>> format_time(t, "hh 'o''clock' a, zzzz", tzinfo=get_timezone('US/Eastern'), + ... locale='en') + u"09 o'clock AM, Eastern Daylight Time" + + As that example shows, when this function gets passed a + ``datetime.datetime`` value, the actual time in the formatted string is + adjusted to the timezone specified by the `tzinfo` parameter. If the + ``datetime`` is "naive" (i.e. it has no associated timezone information), + it is assumed to be in UTC. + + These timezone calculations are **not** performed if the value is of type + ``datetime.time``, as without date information there's no way to determine + what a given time would translate to in a different timezone without + information about whether daylight savings time is in effect or not. This + means that time values are left as-is, and the value of the `tzinfo` + parameter is only used to display the timezone name if needed: + + >>> t = time(15, 30) + >>> format_time(t, format='full', tzinfo=get_timezone('Europe/Paris'), + ... locale='fr_FR') # doctest: +SKIP + u'15:30:00 heure normale d\u2019Europe centrale' + >>> format_time(t, format='full', tzinfo=get_timezone('US/Eastern'), + ... locale='en_US') # doctest: +SKIP + u'3:30:00\u202fPM Eastern Standard Time' + + :param time: the ``time`` or ``datetime`` object; if `None`, the current + time in UTC is used + :param format: one of "full", "long", "medium", or "short", or a custom + date/time pattern + :param tzinfo: the time-zone to apply to the time for display + :param locale: a `Locale` object or a locale identifier + """ + + # get reference date for if we need to find the right timezone variant + # in the pattern + ref_date = time.date() if isinstance(time, datetime.datetime) else None + + time = _get_time(time, tzinfo) + + locale = Locale.parse(locale) + if format in ('full', 'long', 'medium', 'short'): + format = get_time_format(format, locale=locale) + return parse_pattern(format).apply(time, locale, reference_date=ref_date) + + +def format_skeleton( + skeleton: str, + datetime: _Instant = None, + tzinfo: datetime.tzinfo | None = None, + fuzzy: bool = True, + locale: Locale | str | None = LC_TIME, +) -> str: + r"""Return a time and/or date formatted according to the given pattern. + + The skeletons are defined in the CLDR data and provide more flexibility + than the simple short/long/medium formats, but are a bit harder to use. + The are defined using the date/time symbols without order or punctuation + and map to a suitable format for the given locale. + + >>> from datetime import datetime + >>> t = datetime(2007, 4, 1, 15, 30) + >>> format_skeleton('MMMEd', t, locale='fr') + u'dim. 1 avr.' + >>> format_skeleton('MMMEd', t, locale='en') + u'Sun, Apr 1' + >>> format_skeleton('yMMd', t, locale='fi') # yMMd is not in the Finnish locale; yMd gets used + u'1.4.2007' + >>> format_skeleton('yMMd', t, fuzzy=False, locale='fi') # yMMd is not in the Finnish locale, an error is thrown + Traceback (most recent call last): + ... + KeyError: yMMd + + After the skeleton is resolved to a pattern `format_datetime` is called so + all timezone processing etc is the same as for that. + + :param skeleton: A date time skeleton as defined in the cldr data. + :param datetime: the ``time`` or ``datetime`` object; if `None`, the current + time in UTC is used + :param tzinfo: the time-zone to apply to the time for display + :param fuzzy: If the skeleton is not found, allow choosing a skeleton that's + close enough to it. + :param locale: a `Locale` object or a locale identifier + """ + locale = Locale.parse(locale) + if fuzzy and skeleton not in locale.datetime_skeletons: + skeleton = match_skeleton(skeleton, locale.datetime_skeletons) + format = locale.datetime_skeletons[skeleton] + return format_datetime(datetime, format, tzinfo, locale) + + +TIMEDELTA_UNITS: tuple[tuple[str, int], ...] = ( + ('year', 3600 * 24 * 365), + ('month', 3600 * 24 * 30), + ('week', 3600 * 24 * 7), + ('day', 3600 * 24), + ('hour', 3600), + ('minute', 60), + ('second', 1), +) + + +def format_timedelta( + delta: datetime.timedelta | int, + granularity: Literal['year', 'month', 'week', 'day', 'hour', 'minute', 'second'] = 'second', + threshold: float = .85, + add_direction: bool = False, + format: Literal['narrow', 'short', 'medium', 'long'] = 'long', + locale: Locale | str | None = LC_TIME, +) -> str: + """Return a time delta according to the rules of the given locale. + + >>> from datetime import timedelta + >>> format_timedelta(timedelta(weeks=12), locale='en_US') + u'3 months' + >>> format_timedelta(timedelta(seconds=1), locale='es') + u'1 segundo' + + The granularity parameter can be provided to alter the lowest unit + presented, which defaults to a second. + + >>> format_timedelta(timedelta(hours=3), granularity='day', locale='en_US') + u'1 day' + + The threshold parameter can be used to determine at which value the + presentation switches to the next higher unit. A higher threshold factor + means the presentation will switch later. For example: + + >>> format_timedelta(timedelta(hours=23), threshold=0.9, locale='en_US') + u'1 day' + >>> format_timedelta(timedelta(hours=23), threshold=1.1, locale='en_US') + u'23 hours' + + In addition directional information can be provided that informs + the user if the date is in the past or in the future: + + >>> format_timedelta(timedelta(hours=1), add_direction=True, locale='en') + u'in 1 hour' + >>> format_timedelta(timedelta(hours=-1), add_direction=True, locale='en') + u'1 hour ago' + + The format parameter controls how compact or wide the presentation is: + + >>> format_timedelta(timedelta(hours=3), format='short', locale='en') + u'3 hr' + >>> format_timedelta(timedelta(hours=3), format='narrow', locale='en') + u'3h' + + :param delta: a ``timedelta`` object representing the time difference to + format, or the delta in seconds as an `int` value + :param granularity: determines the smallest unit that should be displayed, + the value can be one of "year", "month", "week", "day", + "hour", "minute" or "second" + :param threshold: factor that determines at which point the presentation + switches to the next higher unit + :param add_direction: if this flag is set to `True` the return value will + include directional information. For instance a + positive timedelta will include the information about + it being in the future, a negative will be information + about the value being in the past. + :param format: the format, can be "narrow", "short" or "long". ( + "medium" is deprecated, currently converted to "long" to + maintain compatibility) + :param locale: a `Locale` object or a locale identifier + """ + if format not in ('narrow', 'short', 'medium', 'long'): + raise TypeError('Format must be one of "narrow", "short" or "long"') + if format == 'medium': + warnings.warn( + '"medium" value for format param of format_timedelta' + ' is deprecated. Use "long" instead', + category=DeprecationWarning, + stacklevel=2, + ) + format = 'long' + if isinstance(delta, datetime.timedelta): + seconds = int((delta.days * 86400) + delta.seconds) + else: + seconds = delta + locale = Locale.parse(locale) + + def _iter_patterns(a_unit): + if add_direction: + unit_rel_patterns = locale._data['date_fields'][a_unit] + if seconds >= 0: + yield unit_rel_patterns['future'] + else: + yield unit_rel_patterns['past'] + a_unit = f"duration-{a_unit}" + yield locale._data['unit_patterns'].get(a_unit, {}).get(format) + + for unit, secs_per_unit in TIMEDELTA_UNITS: + value = abs(seconds) / secs_per_unit + if value >= threshold or unit == granularity: + if unit == granularity and value > 0: + value = max(1, value) + value = int(round(value)) + plural_form = locale.plural_form(value) + pattern = None + for patterns in _iter_patterns(unit): + if patterns is not None: + pattern = patterns.get(plural_form) or patterns.get('other') + break + # This really should not happen + if pattern is None: + return '' + return pattern.replace('{0}', str(value)) + + return '' + + +def _format_fallback_interval( + start: _Instant, + end: _Instant, + skeleton: str | None, + tzinfo: datetime.tzinfo | None, + locale: Locale | str | None = LC_TIME, +) -> str: + if skeleton in locale.datetime_skeletons: # Use the given skeleton + format = lambda dt: format_skeleton(skeleton, dt, tzinfo, locale=locale) + elif all((isinstance(d, datetime.date) and not isinstance(d, datetime.datetime)) for d in (start, end)): # Both are just dates + format = lambda dt: format_date(dt, locale=locale) + elif all((isinstance(d, datetime.time) and not isinstance(d, datetime.date)) for d in (start, end)): # Both are times + format = lambda dt: format_time(dt, tzinfo=tzinfo, locale=locale) + else: + format = lambda dt: format_datetime(dt, tzinfo=tzinfo, locale=locale) + + formatted_start = format(start) + formatted_end = format(end) + + if formatted_start == formatted_end: + return format(start) + + return ( + locale.interval_formats.get(None, "{0}-{1}"). + replace("{0}", formatted_start). + replace("{1}", formatted_end) + ) + + +def format_interval( + start: _Instant, + end: _Instant, + skeleton: str | None = None, + tzinfo: datetime.tzinfo | None = None, + fuzzy: bool = True, + locale: Locale | str | None = LC_TIME, +) -> str: + """ + Format an interval between two instants according to the locale's rules. + + >>> from datetime import date, time + >>> format_interval(date(2016, 1, 15), date(2016, 1, 17), "yMd", locale="fi") + u'15.\u201317.1.2016' + + >>> format_interval(time(12, 12), time(16, 16), "Hm", locale="en_GB") + '12:12\u201316:16' + + >>> format_interval(time(5, 12), time(16, 16), "hm", locale="en_US") + '5:12\u202fAM\u2009–\u20094:16\u202fPM' + + >>> format_interval(time(16, 18), time(16, 24), "Hm", locale="it") + '16:18\u201316:24' + + If the start instant equals the end instant, the interval is formatted like the instant. + + >>> format_interval(time(16, 18), time(16, 18), "Hm", locale="it") + '16:18' + + Unknown skeletons fall back to "default" formatting. + + >>> format_interval(date(2015, 1, 1), date(2017, 1, 1), "wzq", locale="ja") + '2015/01/01\uff5e2017/01/01' + + >>> format_interval(time(16, 18), time(16, 24), "xxx", locale="ja") + '16:18:00\uff5e16:24:00' + + >>> format_interval(date(2016, 1, 15), date(2016, 1, 17), "xxx", locale="de") + '15.01.2016\u2009–\u200917.01.2016' + + :param start: First instant (datetime/date/time) + :param end: Second instant (datetime/date/time) + :param skeleton: The "skeleton format" to use for formatting. + :param tzinfo: tzinfo to use (if none is already attached) + :param fuzzy: If the skeleton is not found, allow choosing a skeleton that's + close enough to it. + :param locale: A locale object or identifier. + :return: Formatted interval + """ + locale = Locale.parse(locale) + + # NB: The quote comments below are from the algorithm description in + # https://www.unicode.org/reports/tr35/tr35-dates.html#intervalFormats + + # > Look for the intervalFormatItem element that matches the "skeleton", + # > starting in the current locale and then following the locale fallback + # > chain up to, but not including root. + + interval_formats = locale.interval_formats + + if skeleton not in interval_formats or not skeleton: + # > If no match was found from the previous step, check what the closest + # > match is in the fallback locale chain, as in availableFormats. That + # > is, this allows for adjusting the string value field's width, + # > including adjusting between "MMM" and "MMMM", and using different + # > variants of the same field, such as 'v' and 'z'. + if skeleton and fuzzy: + skeleton = match_skeleton(skeleton, interval_formats) + else: + skeleton = None + if not skeleton: # Still no match whatsoever? + # > Otherwise, format the start and end datetime using the fallback pattern. + return _format_fallback_interval(start, end, skeleton, tzinfo, locale) + + skel_formats = interval_formats[skeleton] + + if start == end: + return format_skeleton(skeleton, start, tzinfo, fuzzy=fuzzy, locale=locale) + + start = _ensure_datetime_tzinfo(_get_datetime(start), tzinfo=tzinfo) + end = _ensure_datetime_tzinfo(_get_datetime(end), tzinfo=tzinfo) + + start_fmt = DateTimeFormat(start, locale=locale) + end_fmt = DateTimeFormat(end, locale=locale) + + # > If a match is found from previous steps, compute the calendar field + # > with the greatest difference between start and end datetime. If there + # > is no difference among any of the fields in the pattern, format as a + # > single date using availableFormats, and return. + + for field in PATTERN_CHAR_ORDER: # These are in largest-to-smallest order + if field in skel_formats and start_fmt.extract(field) != end_fmt.extract(field): + # > If there is a match, use the pieces of the corresponding pattern to + # > format the start and end datetime, as above. + return "".join( + parse_pattern(pattern).apply(instant, locale) + for pattern, instant + in zip(skel_formats[field], (start, end)) + ) + + # > Otherwise, format the start and end datetime using the fallback pattern. + + return _format_fallback_interval(start, end, skeleton, tzinfo, locale) + + +def get_period_id( + time: _Instant, + tzinfo: datetime.tzinfo | None = None, + type: Literal['selection'] | None = None, + locale: Locale | str | None = LC_TIME, +) -> str: + """ + Get the day period ID for a given time. + + This ID can be used as a key for the period name dictionary. + + >>> from datetime import time + >>> get_period_names(locale="de")[get_period_id(time(7, 42), locale="de")] + u'Morgen' + + >>> get_period_id(time(0), locale="en_US") + u'midnight' + + >>> get_period_id(time(0), type="selection", locale="en_US") + u'night1' + + :param time: The time to inspect. + :param tzinfo: The timezone for the time. See ``format_time``. + :param type: The period type to use. Either "selection" or None. + The selection type is used for selecting among phrases such as + “Your email arrived yesterday evening” or “Your email arrived last night”. + :param locale: the `Locale` object, or a locale string + :return: period ID. Something is always returned -- even if it's just "am" or "pm". + """ + time = _get_time(time, tzinfo) + seconds_past_midnight = int(time.hour * 60 * 60 + time.minute * 60 + time.second) + locale = Locale.parse(locale) + + # The LDML rules state that the rules may not overlap, so iterating in arbitrary + # order should be alright, though `at` periods should be preferred. + rulesets = locale.day_period_rules.get(type, {}).items() + + for rule_id, rules in rulesets: + for rule in rules: + if "at" in rule and rule["at"] == seconds_past_midnight: + return rule_id + + for rule_id, rules in rulesets: + for rule in rules: + if "from" in rule and "before" in rule: + if rule["from"] < rule["before"]: + if rule["from"] <= seconds_past_midnight < rule["before"]: + return rule_id + else: + # e.g. from="21:00" before="06:00" + if rule["from"] <= seconds_past_midnight < 86400 or \ + 0 <= seconds_past_midnight < rule["before"]: + return rule_id + + start_ok = end_ok = False + + if "from" in rule and seconds_past_midnight >= rule["from"]: + start_ok = True + if "to" in rule and seconds_past_midnight <= rule["to"]: + # This rule type does not exist in the present CLDR data; + # excuse the lack of test coverage. + end_ok = True + if "before" in rule and seconds_past_midnight < rule["before"]: + end_ok = True + if "after" in rule: + raise NotImplementedError("'after' is deprecated as of CLDR 29.") + + if start_ok and end_ok: + return rule_id + + if seconds_past_midnight < 43200: + return "am" + else: + return "pm" + + +class ParseError(ValueError): + pass + + +def parse_date( + string: str, + locale: Locale | str | None = LC_TIME, + format: _PredefinedTimeFormat = 'medium', +) -> datetime.date: + """Parse a date from a string. + + This function first tries to interpret the string as ISO-8601 + date format, then uses the date format for the locale as a hint to + determine the order in which the date fields appear in the string. + + >>> parse_date('4/1/04', locale='en_US') + datetime.date(2004, 4, 1) + >>> parse_date('01.04.2004', locale='de_DE') + datetime.date(2004, 4, 1) + >>> parse_date('2004-04-01', locale='en_US') + datetime.date(2004, 4, 1) + >>> parse_date('2004-04-01', locale='de_DE') + datetime.date(2004, 4, 1) + + :param string: the string containing the date + :param locale: a `Locale` object or a locale identifier + :param format: the format to use (see ``get_date_format``) + """ + numbers = re.findall(r'(\d+)', string) + if not numbers: + raise ParseError("No numbers were found in input") + + # we try ISO-8601 format first, meaning similar to formats + # extended YYYY-MM-DD or basic YYYYMMDD + iso_alike = re.match(r'^(\d{4})-?([01]\d)-?([0-3]\d)$', + string, flags=re.ASCII) # allow only ASCII digits + if iso_alike: + try: + return datetime.date(*map(int, iso_alike.groups())) + except ValueError: + pass # a locale format might fit better, so let's continue + + format_str = get_date_format(format=format, locale=locale).pattern.lower() + year_idx = format_str.index('y') + month_idx = format_str.index('m') + if month_idx < 0: + month_idx = format_str.index('l') + day_idx = format_str.index('d') + + indexes = sorted([(year_idx, 'Y'), (month_idx, 'M'), (day_idx, 'D')]) + indexes = {item[1]: idx for idx, item in enumerate(indexes)} + + # FIXME: this currently only supports numbers, but should also support month + # names, both in the requested locale, and english + + year = numbers[indexes['Y']] + year = 2000 + int(year) if len(year) == 2 else int(year) + month = int(numbers[indexes['M']]) + day = int(numbers[indexes['D']]) + if month > 12: + month, day = day, month + return datetime.date(year, month, day) + + +def parse_time( + string: str, + locale: Locale | str | None = LC_TIME, + format: _PredefinedTimeFormat = 'medium', +) -> datetime.time: + """Parse a time from a string. + + This function uses the time format for the locale as a hint to determine + the order in which the time fields appear in the string. + + >>> parse_time('15:30:00', locale='en_US') + datetime.time(15, 30) + + :param string: the string containing the time + :param locale: a `Locale` object or a locale identifier + :param format: the format to use (see ``get_time_format``) + :return: the parsed time + :rtype: `time` + """ + numbers = re.findall(r'(\d+)', string) + if not numbers: + raise ParseError("No numbers were found in input") + + # TODO: try ISO format first? + format_str = get_time_format(format=format, locale=locale).pattern.lower() + hour_idx = format_str.index('h') + if hour_idx < 0: + hour_idx = format_str.index('k') + min_idx = format_str.index('m') + sec_idx = format_str.index('s') + + indexes = sorted([(hour_idx, 'H'), (min_idx, 'M'), (sec_idx, 'S')]) + indexes = {item[1]: idx for idx, item in enumerate(indexes)} + + # TODO: support time zones + + # Check if the format specifies a period to be used; + # if it does, look for 'pm' to figure out an offset. + hour_offset = 0 + if 'a' in format_str and 'pm' in string.lower(): + hour_offset = 12 + + # Parse up to three numbers from the string. + minute = second = 0 + hour = int(numbers[indexes['H']]) + hour_offset + if len(numbers) > 1: + minute = int(numbers[indexes['M']]) + if len(numbers) > 2: + second = int(numbers[indexes['S']]) + return datetime.time(hour, minute, second) + + +class DateTimePattern: + + def __init__(self, pattern: str, format: DateTimeFormat): + self.pattern = pattern + self.format = format + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.pattern!r}>" + + def __str__(self) -> str: + pat = self.pattern + return pat + + def __mod__(self, other: DateTimeFormat) -> str: + if not isinstance(other, DateTimeFormat): + return NotImplemented + return self.format % other + + def apply( + self, + datetime: datetime.date | datetime.time, + locale: Locale | str | None, + reference_date: datetime.date | None = None, + ) -> str: + return self % DateTimeFormat(datetime, locale, reference_date) + + +class DateTimeFormat: + + def __init__( + self, + value: datetime.date | datetime.time, + locale: Locale | str, + reference_date: datetime.date | None = None, + ) -> None: + assert isinstance(value, (datetime.date, datetime.datetime, datetime.time)) + if isinstance(value, (datetime.datetime, datetime.time)) and value.tzinfo is None: + value = value.replace(tzinfo=UTC) + self.value = value + self.locale = Locale.parse(locale) + self.reference_date = reference_date + + def __getitem__(self, name: str) -> str: + char = name[0] + num = len(name) + if char == 'G': + return self.format_era(char, num) + elif char in ('y', 'Y', 'u'): + return self.format_year(char, num) + elif char in ('Q', 'q'): + return self.format_quarter(char, num) + elif char in ('M', 'L'): + return self.format_month(char, num) + elif char in ('w', 'W'): + return self.format_week(char, num) + elif char == 'd': + return self.format(self.value.day, num) + elif char == 'D': + return self.format_day_of_year(num) + elif char == 'F': + return self.format_day_of_week_in_month() + elif char in ('E', 'e', 'c'): + return self.format_weekday(char, num) + elif char in ('a', 'b', 'B'): + return self.format_period(char, num) + elif char == 'h': + if self.value.hour % 12 == 0: + return self.format(12, num) + else: + return self.format(self.value.hour % 12, num) + elif char == 'H': + return self.format(self.value.hour, num) + elif char == 'K': + return self.format(self.value.hour % 12, num) + elif char == 'k': + if self.value.hour == 0: + return self.format(24, num) + else: + return self.format(self.value.hour, num) + elif char == 'm': + return self.format(self.value.minute, num) + elif char == 's': + return self.format(self.value.second, num) + elif char == 'S': + return self.format_frac_seconds(num) + elif char == 'A': + return self.format_milliseconds_in_day(num) + elif char in ('z', 'Z', 'v', 'V', 'x', 'X', 'O'): + return self.format_timezone(char, num) + else: + raise KeyError(f"Unsupported date/time field {char!r}") + + def extract(self, char: str) -> int: + char = str(char)[0] + if char == 'y': + return self.value.year + elif char == 'M': + return self.value.month + elif char == 'd': + return self.value.day + elif char == 'H': + return self.value.hour + elif char == 'h': + return self.value.hour % 12 or 12 + elif char == 'm': + return self.value.minute + elif char == 'a': + return int(self.value.hour >= 12) # 0 for am, 1 for pm + else: + raise NotImplementedError(f"Not implemented: extracting {char!r} from {self.value!r}") + + def format_era(self, char: str, num: int) -> str: + width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[max(3, num)] + era = int(self.value.year >= 0) + return get_era_names(width, self.locale)[era] + + def format_year(self, char: str, num: int) -> str: + value = self.value.year + if char.isupper(): + value = self.value.isocalendar()[0] + year = self.format(value, num) + if num == 2: + year = year[-2:] + return year + + def format_quarter(self, char: str, num: int) -> str: + quarter = (self.value.month - 1) // 3 + 1 + if num <= 2: + return '%0*d' % (num, quarter) + width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num] + context = {'Q': 'format', 'q': 'stand-alone'}[char] + return get_quarter_names(width, context, self.locale)[quarter] + + def format_month(self, char: str, num: int) -> str: + if num <= 2: + return '%0*d' % (num, self.value.month) + width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num] + context = {'M': 'format', 'L': 'stand-alone'}[char] + return get_month_names(width, context, self.locale)[self.value.month] + + def format_week(self, char: str, num: int) -> str: + if char.islower(): # week of year + day_of_year = self.get_day_of_year() + week = self.get_week_number(day_of_year) + if week == 0: + date = self.value - datetime.timedelta(days=day_of_year) + week = self.get_week_number(self.get_day_of_year(date), + date.weekday()) + return self.format(week, num) + else: # week of month + week = self.get_week_number(self.value.day) + if week == 0: + date = self.value - datetime.timedelta(days=self.value.day) + week = self.get_week_number(date.day, date.weekday()) + return str(week) + + def format_weekday(self, char: str = 'E', num: int = 4) -> str: + """ + Return weekday from parsed datetime according to format pattern. + + >>> from datetime import date + >>> format = DateTimeFormat(date(2016, 2, 28), Locale.parse('en_US')) + >>> format.format_weekday() + u'Sunday' + + 'E': Day of week - Use one through three letters for the abbreviated day name, four for the full (wide) name, + five for the narrow name, or six for the short name. + >>> format.format_weekday('E',2) + u'Sun' + + 'e': Local day of week. Same as E except adds a numeric value that will depend on the local starting day of the + week, using one or two letters. For this example, Monday is the first day of the week. + >>> format.format_weekday('e',2) + '01' + + 'c': Stand-Alone local day of week - Use one letter for the local numeric value (same as 'e'), three for the + abbreviated day name, four for the full (wide) name, five for the narrow name, or six for the short name. + >>> format.format_weekday('c',1) + '1' + + :param char: pattern format character ('e','E','c') + :param num: count of format character + + """ + if num < 3: + if char.islower(): + value = 7 - self.locale.first_week_day + self.value.weekday() + return self.format(value % 7 + 1, num) + num = 3 + weekday = self.value.weekday() + width = {3: 'abbreviated', 4: 'wide', 5: 'narrow', 6: 'short'}[num] + context = "stand-alone" if char == "c" else "format" + return get_day_names(width, context, self.locale)[weekday] + + def format_day_of_year(self, num: int) -> str: + return self.format(self.get_day_of_year(), num) + + def format_day_of_week_in_month(self) -> str: + return str((self.value.day - 1) // 7 + 1) + + def format_period(self, char: str, num: int) -> str: + """ + Return period from parsed datetime according to format pattern. + + >>> from datetime import datetime, time + >>> format = DateTimeFormat(time(13, 42), 'fi_FI') + >>> format.format_period('a', 1) + u'ip.' + >>> format.format_period('b', 1) + u'iltap.' + >>> format.format_period('b', 4) + u'iltapäivä' + >>> format.format_period('B', 4) + u'iltapäivällä' + >>> format.format_period('B', 5) + u'ip.' + + >>> format = DateTimeFormat(datetime(2022, 4, 28, 6, 27), 'zh_Hant') + >>> format.format_period('a', 1) + u'上午' + >>> format.format_period('b', 1) + u'清晨' + >>> format.format_period('B', 1) + u'清晨' + + :param char: pattern format character ('a', 'b', 'B') + :param num: count of format character + + """ + widths = [{3: 'abbreviated', 4: 'wide', 5: 'narrow'}[max(3, num)], + 'wide', 'narrow', 'abbreviated'] + if char == 'a': + period = 'pm' if self.value.hour >= 12 else 'am' + context = 'format' + else: + period = get_period_id(self.value, locale=self.locale) + context = 'format' if char == 'B' else 'stand-alone' + for width in widths: + period_names = get_period_names(context=context, width=width, locale=self.locale) + if period in period_names: + return period_names[period] + raise ValueError(f"Could not format period {period} in {self.locale}") + + def format_frac_seconds(self, num: int) -> str: + """ Return fractional seconds. + + Rounds the time's microseconds to the precision given by the number \ + of digits passed in. + """ + value = self.value.microsecond / 1000000 + return self.format(round(value, num) * 10**num, num) + + def format_milliseconds_in_day(self, num): + msecs = self.value.microsecond // 1000 + self.value.second * 1000 + \ + self.value.minute * 60000 + self.value.hour * 3600000 + return self.format(msecs, num) + + def format_timezone(self, char: str, num: int) -> str: + width = {3: 'short', 4: 'long', 5: 'iso8601'}[max(3, num)] + + # It could be that we only receive a time to format, but also have a + # reference date which is important to distinguish between timezone + # variants (summer/standard time) + value = self.value + if self.reference_date: + value = datetime.datetime.combine(self.reference_date, self.value) + + if char == 'z': + return get_timezone_name(value, width, locale=self.locale) + elif char == 'Z': + if num == 5: + return get_timezone_gmt(value, width, locale=self.locale, return_z=True) + return get_timezone_gmt(value, width, locale=self.locale) + elif char == 'O': + if num == 4: + return get_timezone_gmt(value, width, locale=self.locale) + # TODO: To add support for O:1 + elif char == 'v': + return get_timezone_name(value.tzinfo, width, + locale=self.locale) + elif char == 'V': + if num == 1: + return get_timezone_name(value.tzinfo, width, + uncommon=True, locale=self.locale) + elif num == 2: + return get_timezone_name(value.tzinfo, locale=self.locale, return_zone=True) + elif num == 3: + return get_timezone_location(value.tzinfo, locale=self.locale, return_city=True) + return get_timezone_location(value.tzinfo, locale=self.locale) + # Included additional elif condition to add support for 'Xx' in timezone format + elif char == 'X': + if num == 1: + return get_timezone_gmt(value, width='iso8601_short', locale=self.locale, + return_z=True) + elif num in (2, 4): + return get_timezone_gmt(value, width='short', locale=self.locale, + return_z=True) + elif num in (3, 5): + return get_timezone_gmt(value, width='iso8601', locale=self.locale, + return_z=True) + elif char == 'x': + if num == 1: + return get_timezone_gmt(value, width='iso8601_short', locale=self.locale) + elif num in (2, 4): + return get_timezone_gmt(value, width='short', locale=self.locale) + elif num in (3, 5): + return get_timezone_gmt(value, width='iso8601', locale=self.locale) + + def format(self, value: SupportsInt, length: int) -> str: + return '%0*d' % (length, value) + + def get_day_of_year(self, date: datetime.date | None = None) -> int: + if date is None: + date = self.value + return (date - date.replace(month=1, day=1)).days + 1 + + def get_week_number(self, day_of_period: int, day_of_week: int | None = None) -> int: + """Return the number of the week of a day within a period. This may be + the week number in a year or the week number in a month. + + Usually this will return a value equal to or greater than 1, but if the + first week of the period is so short that it actually counts as the last + week of the previous period, this function will return 0. + + >>> date = datetime.date(2006, 1, 8) + >>> DateTimeFormat(date, 'de_DE').get_week_number(6) + 1 + >>> DateTimeFormat(date, 'en_US').get_week_number(6) + 2 + + :param day_of_period: the number of the day in the period (usually + either the day of month or the day of year) + :param day_of_week: the week day; if omitted, the week day of the + current date is assumed + """ + if day_of_week is None: + day_of_week = self.value.weekday() + first_day = (day_of_week - self.locale.first_week_day - + day_of_period + 1) % 7 + if first_day < 0: + first_day += 7 + week_number = (day_of_period + first_day - 1) // 7 + + if 7 - first_day >= self.locale.min_week_days: + week_number += 1 + + if self.locale.first_week_day == 0: + # Correct the weeknumber in case of iso-calendar usage (first_week_day=0). + # If the weeknumber exceeds the maximum number of weeks for the given year + # we must count from zero.For example the above calculation gives week 53 + # for 2018-12-31. By iso-calender definition 2018 has a max of 52 + # weeks, thus the weeknumber must be 53-52=1. + max_weeks = datetime.date(year=self.value.year, day=28, month=12).isocalendar()[1] + if week_number > max_weeks: + week_number -= max_weeks + + return week_number + + +PATTERN_CHARS: dict[str, list[int] | None] = { + 'G': [1, 2, 3, 4, 5], # era + 'y': None, 'Y': None, 'u': None, # year + 'Q': [1, 2, 3, 4, 5], 'q': [1, 2, 3, 4, 5], # quarter + 'M': [1, 2, 3, 4, 5], 'L': [1, 2, 3, 4, 5], # month + 'w': [1, 2], 'W': [1], # week + 'd': [1, 2], 'D': [1, 2, 3], 'F': [1], 'g': None, # day + 'E': [1, 2, 3, 4, 5, 6], 'e': [1, 2, 3, 4, 5, 6], 'c': [1, 3, 4, 5, 6], # week day + 'a': [1, 2, 3, 4, 5], 'b': [1, 2, 3, 4, 5], 'B': [1, 2, 3, 4, 5], # period + 'h': [1, 2], 'H': [1, 2], 'K': [1, 2], 'k': [1, 2], # hour + 'm': [1, 2], # minute + 's': [1, 2], 'S': None, 'A': None, # second + 'z': [1, 2, 3, 4], 'Z': [1, 2, 3, 4, 5], 'O': [1, 4], 'v': [1, 4], # zone + 'V': [1, 2, 3, 4], 'x': [1, 2, 3, 4, 5], 'X': [1, 2, 3, 4, 5], # zone +} + +#: The pattern characters declared in the Date Field Symbol Table +#: (https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table) +#: in order of decreasing magnitude. +PATTERN_CHAR_ORDER = "GyYuUQqMLlwWdDFgEecabBChHKkjJmsSAzZOvVXx" + + +def parse_pattern(pattern: str | DateTimePattern) -> DateTimePattern: + """Parse date, time, and datetime format patterns. + + >>> parse_pattern("MMMMd").format + u'%(MMMM)s%(d)s' + >>> parse_pattern("MMM d, yyyy").format + u'%(MMM)s %(d)s, %(yyyy)s' + + Pattern can contain literal strings in single quotes: + + >>> parse_pattern("H:mm' Uhr 'z").format + u'%(H)s:%(mm)s Uhr %(z)s' + + An actual single quote can be used by using two adjacent single quote + characters: + + >>> parse_pattern("hh' o''clock'").format + u"%(hh)s o'clock" + + :param pattern: the formatting pattern to parse + """ + if isinstance(pattern, DateTimePattern): + return pattern + return _cached_parse_pattern(pattern) + + +@lru_cache(maxsize=1024) +def _cached_parse_pattern(pattern: str) -> DateTimePattern: + result = [] + + for tok_type, tok_value in tokenize_pattern(pattern): + if tok_type == "chars": + result.append(tok_value.replace('%', '%%')) + elif tok_type == "field": + fieldchar, fieldnum = tok_value + limit = PATTERN_CHARS[fieldchar] + if limit and fieldnum not in limit: + raise ValueError(f"Invalid length for field: {fieldchar * fieldnum!r}") + result.append('%%(%s)s' % (fieldchar * fieldnum)) + else: + raise NotImplementedError(f"Unknown token type: {tok_type}") + return DateTimePattern(pattern, ''.join(result)) + + +def tokenize_pattern(pattern: str) -> list[tuple[str, str | tuple[str, int]]]: + """ + Tokenize date format patterns. + + Returns a list of (token_type, token_value) tuples. + + ``token_type`` may be either "chars" or "field". + + For "chars" tokens, the value is the literal value. + + For "field" tokens, the value is a tuple of (field character, repetition count). + + :param pattern: Pattern string + :type pattern: str + :rtype: list[tuple] + """ + result = [] + quotebuf = None + charbuf = [] + fieldchar = [''] + fieldnum = [0] + + def append_chars(): + result.append(('chars', ''.join(charbuf).replace('\0', "'"))) + del charbuf[:] + + def append_field(): + result.append(('field', (fieldchar[0], fieldnum[0]))) + fieldchar[0] = '' + fieldnum[0] = 0 + + for char in pattern.replace("''", '\0'): + if quotebuf is None: + if char == "'": # quote started + if fieldchar[0]: + append_field() + elif charbuf: + append_chars() + quotebuf = [] + elif char in PATTERN_CHARS: + if charbuf: + append_chars() + if char == fieldchar[0]: + fieldnum[0] += 1 + else: + if fieldchar[0]: + append_field() + fieldchar[0] = char + fieldnum[0] = 1 + else: + if fieldchar[0]: + append_field() + charbuf.append(char) + + elif quotebuf is not None: + if char == "'": # end of quote + charbuf.extend(quotebuf) + quotebuf = None + else: # inside quote + quotebuf.append(char) + + if fieldchar[0]: + append_field() + elif charbuf: + append_chars() + + return result + + +def untokenize_pattern(tokens: Iterable[tuple[str, str | tuple[str, int]]]) -> str: + """ + Turn a date format pattern token stream back into a string. + + This is the reverse operation of ``tokenize_pattern``. + + :type tokens: Iterable[tuple] + :rtype: str + """ + output = [] + for tok_type, tok_value in tokens: + if tok_type == "field": + output.append(tok_value[0] * tok_value[1]) + elif tok_type == "chars": + if not any(ch in PATTERN_CHARS for ch in tok_value): # No need to quote + output.append(tok_value) + else: + output.append("'%s'" % tok_value.replace("'", "''")) + return "".join(output) + + +def split_interval_pattern(pattern: str) -> list[str]: + """ + Split an interval-describing datetime pattern into multiple pieces. + + > The pattern is then designed to be broken up into two pieces by determining the first repeating field. + - https://www.unicode.org/reports/tr35/tr35-dates.html#intervalFormats + + >>> split_interval_pattern(u'E d.M. \u2013 E d.M.') + [u'E d.M. \u2013 ', 'E d.M.'] + >>> split_interval_pattern("Y 'text' Y 'more text'") + ["Y 'text '", "Y 'more text'"] + >>> split_interval_pattern(u"E, MMM d \u2013 E") + [u'E, MMM d \u2013 ', u'E'] + >>> split_interval_pattern("MMM d") + ['MMM d'] + >>> split_interval_pattern("y G") + ['y G'] + >>> split_interval_pattern(u"MMM d \u2013 d") + [u'MMM d \u2013 ', u'd'] + + :param pattern: Interval pattern string + :return: list of "subpatterns" + """ + + seen_fields = set() + parts = [[]] + + for tok_type, tok_value in tokenize_pattern(pattern): + if tok_type == "field": + if tok_value[0] in seen_fields: # Repeated field + parts.append([]) + seen_fields.clear() + seen_fields.add(tok_value[0]) + parts[-1].append((tok_type, tok_value)) + + return [untokenize_pattern(tokens) for tokens in parts] + + +def match_skeleton(skeleton: str, options: Iterable[str], allow_different_fields: bool = False) -> str | None: + """ + Find the closest match for the given datetime skeleton among the options given. + + This uses the rules outlined in the TR35 document. + + >>> match_skeleton('yMMd', ('yMd', 'yMMMd')) + 'yMd' + + >>> match_skeleton('yMMd', ('jyMMd',), allow_different_fields=True) + 'jyMMd' + + >>> match_skeleton('yMMd', ('qyMMd',), allow_different_fields=False) + + >>> match_skeleton('hmz', ('hmv',)) + 'hmv' + + :param skeleton: The skeleton to match + :type skeleton: str + :param options: An iterable of other skeletons to match against + :type options: Iterable[str] + :return: The closest skeleton match, or if no match was found, None. + :rtype: str|None + """ + + # TODO: maybe implement pattern expansion? + + # Based on the implementation in + # http://source.icu-project.org/repos/icu/icu4j/trunk/main/classes/core/src/com/ibm/icu/text/DateIntervalInfo.java + + # Filter out falsy values and sort for stability; when `interval_formats` is passed in, there may be a None key. + options = sorted(option for option in options if option) + + if 'z' in skeleton and not any('z' in option for option in options): + skeleton = skeleton.replace('z', 'v') + + get_input_field_width = dict(t[1] for t in tokenize_pattern(skeleton) if t[0] == "field").get + best_skeleton = None + best_distance = None + for option in options: + get_opt_field_width = dict(t[1] for t in tokenize_pattern(option) if t[0] == "field").get + distance = 0 + for field in PATTERN_CHARS: + input_width = get_input_field_width(field, 0) + opt_width = get_opt_field_width(field, 0) + if input_width == opt_width: + continue + if opt_width == 0 or input_width == 0: + if not allow_different_fields: # This one is not okay + option = None + break + distance += 0x1000 # Magic weight constant for "entirely different fields" + elif field == 'M' and ((input_width > 2 and opt_width <= 2) or (input_width <= 2 and opt_width > 2)): + distance += 0x100 # Magic weight for "text turns into a number" + else: + distance += abs(input_width - opt_width) + + if not option: # We lost the option along the way (probably due to "allow_different_fields") + continue + + if not best_skeleton or distance < best_distance: + best_skeleton = option + best_distance = distance + + if distance == 0: # Found a perfect match! + break + + return best_skeleton diff --git a/venv/Lib/site-packages/babel/global.dat b/venv/Lib/site-packages/babel/global.dat new file mode 100644 index 0000000..1f60525 Binary files /dev/null and b/venv/Lib/site-packages/babel/global.dat differ diff --git a/venv/Lib/site-packages/babel/languages.py b/venv/Lib/site-packages/babel/languages.py new file mode 100644 index 0000000..564f555 --- /dev/null +++ b/venv/Lib/site-packages/babel/languages.py @@ -0,0 +1,72 @@ +from __future__ import annotations + +from babel.core import get_global + + +def get_official_languages(territory: str, regional: bool = False, de_facto: bool = False) -> tuple[str, ...]: + """ + Get the official language(s) for the given territory. + + The language codes, if any are known, are returned in order of descending popularity. + + If the `regional` flag is set, then languages which are regionally official are also returned. + + If the `de_facto` flag is set, then languages which are "de facto" official are also returned. + + .. warning:: Note that the data is as up to date as the current version of the CLDR used + by Babel. If you need scientifically accurate information, use another source! + + :param territory: Territory code + :type territory: str + :param regional: Whether to return regionally official languages too + :type regional: bool + :param de_facto: Whether to return de-facto official languages too + :type de_facto: bool + :return: Tuple of language codes + :rtype: tuple[str] + """ + + territory = str(territory).upper() + allowed_stati = {"official"} + if regional: + allowed_stati.add("official_regional") + if de_facto: + allowed_stati.add("de_facto_official") + + languages = get_global("territory_languages").get(territory, {}) + pairs = [ + (info['population_percent'], language) + for language, info in languages.items() + if info.get('official_status') in allowed_stati + ] + pairs.sort(reverse=True) + return tuple(lang for _, lang in pairs) + + +def get_territory_language_info(territory: str) -> dict[str, dict[str, float | str | None]]: + """ + Get a dictionary of language information for a territory. + + The dictionary is keyed by language code; the values are dicts with more information. + + The following keys are currently known for the values: + + * `population_percent`: The percentage of the territory's population speaking the + language. + * `official_status`: An optional string describing the officiality status of the language. + Known values are "official", "official_regional" and "de_facto_official". + + .. warning:: Note that the data is as up to date as the current version of the CLDR used + by Babel. If you need scientifically accurate information, use another source! + + .. note:: Note that the format of the dict returned may change between Babel versions. + + See https://www.unicode.org/cldr/charts/latest/supplemental/territory_language_information.html + + :param territory: Territory code + :type territory: str + :return: Language information dictionary + :rtype: dict[str, dict] + """ + territory = str(territory).upper() + return get_global("territory_languages").get(territory, {}).copy() diff --git a/venv/Lib/site-packages/babel/lists.py b/venv/Lib/site-packages/babel/lists.py new file mode 100644 index 0000000..a8471fd --- /dev/null +++ b/venv/Lib/site-packages/babel/lists.py @@ -0,0 +1,94 @@ +""" + babel.lists + ~~~~~~~~~~~ + + Locale dependent formatting of lists. + + The default locale for the functions in this module is determined by the + following environment variables, in that order: + + * ``LC_ALL``, and + * ``LANG`` + + :copyright: (c) 2015-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" +from __future__ import annotations + +from collections.abc import Sequence +from typing import TYPE_CHECKING + +from babel.core import Locale, default_locale + +if TYPE_CHECKING: + from typing_extensions import Literal + +DEFAULT_LOCALE = default_locale() + + +def format_list(lst: Sequence[str], + style: Literal['standard', 'standard-short', 'or', 'or-short', 'unit', 'unit-short', 'unit-narrow'] = 'standard', + locale: Locale | str | None = DEFAULT_LOCALE) -> str: + """ + Format the items in `lst` as a list. + + >>> format_list(['apples', 'oranges', 'pears'], locale='en') + u'apples, oranges, and pears' + >>> format_list(['apples', 'oranges', 'pears'], locale='zh') + u'apples\u3001oranges\u548cpears' + >>> format_list(['omena', 'peruna', 'aplari'], style='or', locale='fi') + u'omena, peruna tai aplari' + + These styles are defined, but not all are necessarily available in all locales. + The following text is verbatim from the Unicode TR35-49 spec [1]. + + * standard: + A typical 'and' list for arbitrary placeholders. + eg. "January, February, and March" + * standard-short: + A short version of an 'and' list, suitable for use with short or abbreviated placeholder values. + eg. "Jan., Feb., and Mar." + * or: + A typical 'or' list for arbitrary placeholders. + eg. "January, February, or March" + * or-short: + A short version of an 'or' list. + eg. "Jan., Feb., or Mar." + * unit: + A list suitable for wide units. + eg. "3 feet, 7 inches" + * unit-short: + A list suitable for short units + eg. "3 ft, 7 in" + * unit-narrow: + A list suitable for narrow units, where space on the screen is very limited. + eg. "3′ 7″" + + [1]: https://www.unicode.org/reports/tr35/tr35-49/tr35-general.html#ListPatterns + + :param lst: a sequence of items to format in to a list + :param style: the style to format the list with. See above for description. + :param locale: the locale + """ + locale = Locale.parse(locale) + if not lst: + return '' + if len(lst) == 1: + return lst[0] + + if style not in locale.list_patterns: + raise ValueError( + f'Locale {locale} does not support list formatting style {style!r} ' + f'(supported are {sorted(locale.list_patterns)})', + ) + patterns = locale.list_patterns[style] + + if len(lst) == 2: + return patterns['2'].format(*lst) + + result = patterns['start'].format(lst[0], lst[1]) + for elem in lst[2:-1]: + result = patterns['middle'].format(result, elem) + result = patterns['end'].format(result, lst[-1]) + + return result diff --git a/venv/Lib/site-packages/babel/locale-data/aa.dat b/venv/Lib/site-packages/babel/locale-data/aa.dat new file mode 100644 index 0000000..bf9e8ec Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/aa.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/aa_DJ.dat b/venv/Lib/site-packages/babel/locale-data/aa_DJ.dat new file mode 100644 index 0000000..a3cb256 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/aa_DJ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/aa_ER.dat b/venv/Lib/site-packages/babel/locale-data/aa_ER.dat new file mode 100644 index 0000000..a01edfc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/aa_ER.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/aa_ET.dat b/venv/Lib/site-packages/babel/locale-data/aa_ET.dat new file mode 100644 index 0000000..119b891 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/aa_ET.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ab.dat b/venv/Lib/site-packages/babel/locale-data/ab.dat new file mode 100644 index 0000000..8303aca Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ab.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ab_GE.dat b/venv/Lib/site-packages/babel/locale-data/ab_GE.dat new file mode 100644 index 0000000..15a980a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ab_GE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/af.dat b/venv/Lib/site-packages/babel/locale-data/af.dat new file mode 100644 index 0000000..f8c2e53 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/af.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/af_NA.dat b/venv/Lib/site-packages/babel/locale-data/af_NA.dat new file mode 100644 index 0000000..d5ff2a3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/af_NA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/af_ZA.dat b/venv/Lib/site-packages/babel/locale-data/af_ZA.dat new file mode 100644 index 0000000..3477933 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/af_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/agq.dat b/venv/Lib/site-packages/babel/locale-data/agq.dat new file mode 100644 index 0000000..aebff80 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/agq.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/agq_CM.dat b/venv/Lib/site-packages/babel/locale-data/agq_CM.dat new file mode 100644 index 0000000..57701c9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/agq_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ak.dat b/venv/Lib/site-packages/babel/locale-data/ak.dat new file mode 100644 index 0000000..124c703 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ak.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ak_GH.dat b/venv/Lib/site-packages/babel/locale-data/ak_GH.dat new file mode 100644 index 0000000..a7c63da Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ak_GH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/am.dat b/venv/Lib/site-packages/babel/locale-data/am.dat new file mode 100644 index 0000000..ba03b62 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/am.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/am_ET.dat b/venv/Lib/site-packages/babel/locale-data/am_ET.dat new file mode 100644 index 0000000..050cc76 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/am_ET.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/an.dat b/venv/Lib/site-packages/babel/locale-data/an.dat new file mode 100644 index 0000000..611e23a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/an.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/an_ES.dat b/venv/Lib/site-packages/babel/locale-data/an_ES.dat new file mode 100644 index 0000000..a11156a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/an_ES.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ann.dat b/venv/Lib/site-packages/babel/locale-data/ann.dat new file mode 100644 index 0000000..cee6e2b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ann.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ann_NG.dat b/venv/Lib/site-packages/babel/locale-data/ann_NG.dat new file mode 100644 index 0000000..612c3f8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ann_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/apc.dat b/venv/Lib/site-packages/babel/locale-data/apc.dat new file mode 100644 index 0000000..644ec2a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/apc.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/apc_SY.dat b/venv/Lib/site-packages/babel/locale-data/apc_SY.dat new file mode 100644 index 0000000..6c5e15a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/apc_SY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar.dat b/venv/Lib/site-packages/babel/locale-data/ar.dat new file mode 100644 index 0000000..f109845 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_001.dat b/venv/Lib/site-packages/babel/locale-data/ar_001.dat new file mode 100644 index 0000000..bdc0475 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_001.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_AE.dat b/venv/Lib/site-packages/babel/locale-data/ar_AE.dat new file mode 100644 index 0000000..f484ff8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_AE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_BH.dat b/venv/Lib/site-packages/babel/locale-data/ar_BH.dat new file mode 100644 index 0000000..1792ea6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_BH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_DJ.dat b/venv/Lib/site-packages/babel/locale-data/ar_DJ.dat new file mode 100644 index 0000000..579056a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_DJ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_DZ.dat b/venv/Lib/site-packages/babel/locale-data/ar_DZ.dat new file mode 100644 index 0000000..3a0c42e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_DZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_EG.dat b/venv/Lib/site-packages/babel/locale-data/ar_EG.dat new file mode 100644 index 0000000..3a9c503 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_EG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_EH.dat b/venv/Lib/site-packages/babel/locale-data/ar_EH.dat new file mode 100644 index 0000000..df44a58 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_EH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_ER.dat b/venv/Lib/site-packages/babel/locale-data/ar_ER.dat new file mode 100644 index 0000000..cd03643 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_ER.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_IL.dat b/venv/Lib/site-packages/babel/locale-data/ar_IL.dat new file mode 100644 index 0000000..557c47f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_IL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_IQ.dat b/venv/Lib/site-packages/babel/locale-data/ar_IQ.dat new file mode 100644 index 0000000..133805c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_IQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_JO.dat b/venv/Lib/site-packages/babel/locale-data/ar_JO.dat new file mode 100644 index 0000000..b9633a5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_JO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_KM.dat b/venv/Lib/site-packages/babel/locale-data/ar_KM.dat new file mode 100644 index 0000000..88f1ac4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_KM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_KW.dat b/venv/Lib/site-packages/babel/locale-data/ar_KW.dat new file mode 100644 index 0000000..80762a4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_KW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_LB.dat b/venv/Lib/site-packages/babel/locale-data/ar_LB.dat new file mode 100644 index 0000000..a917af0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_LB.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_LY.dat b/venv/Lib/site-packages/babel/locale-data/ar_LY.dat new file mode 100644 index 0000000..9a98e18 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_LY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_MA.dat b/venv/Lib/site-packages/babel/locale-data/ar_MA.dat new file mode 100644 index 0000000..76d3f19 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_MA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_MR.dat b/venv/Lib/site-packages/babel/locale-data/ar_MR.dat new file mode 100644 index 0000000..9b00ef1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_MR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_OM.dat b/venv/Lib/site-packages/babel/locale-data/ar_OM.dat new file mode 100644 index 0000000..d318d99 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_OM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_PS.dat b/venv/Lib/site-packages/babel/locale-data/ar_PS.dat new file mode 100644 index 0000000..12df9e0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_PS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_QA.dat b/venv/Lib/site-packages/babel/locale-data/ar_QA.dat new file mode 100644 index 0000000..d187cc6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_QA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_SA.dat b/venv/Lib/site-packages/babel/locale-data/ar_SA.dat new file mode 100644 index 0000000..5906492 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_SA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_SD.dat b/venv/Lib/site-packages/babel/locale-data/ar_SD.dat new file mode 100644 index 0000000..0ce23d8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_SD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_SO.dat b/venv/Lib/site-packages/babel/locale-data/ar_SO.dat new file mode 100644 index 0000000..ed6648b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_SO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_SS.dat b/venv/Lib/site-packages/babel/locale-data/ar_SS.dat new file mode 100644 index 0000000..a2cadef Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_SS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_SY.dat b/venv/Lib/site-packages/babel/locale-data/ar_SY.dat new file mode 100644 index 0000000..89dac7f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_SY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_TD.dat b/venv/Lib/site-packages/babel/locale-data/ar_TD.dat new file mode 100644 index 0000000..deb0d9c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_TD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_TN.dat b/venv/Lib/site-packages/babel/locale-data/ar_TN.dat new file mode 100644 index 0000000..b427f76 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_TN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ar_YE.dat b/venv/Lib/site-packages/babel/locale-data/ar_YE.dat new file mode 100644 index 0000000..8c2212b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ar_YE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/arn.dat b/venv/Lib/site-packages/babel/locale-data/arn.dat new file mode 100644 index 0000000..21255ec Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/arn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/arn_CL.dat b/venv/Lib/site-packages/babel/locale-data/arn_CL.dat new file mode 100644 index 0000000..4aadebb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/arn_CL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/as.dat b/venv/Lib/site-packages/babel/locale-data/as.dat new file mode 100644 index 0000000..81a8e5d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/as.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/as_IN.dat b/venv/Lib/site-packages/babel/locale-data/as_IN.dat new file mode 100644 index 0000000..9f24d23 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/as_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/asa.dat b/venv/Lib/site-packages/babel/locale-data/asa.dat new file mode 100644 index 0000000..a523bb6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/asa.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/asa_TZ.dat b/venv/Lib/site-packages/babel/locale-data/asa_TZ.dat new file mode 100644 index 0000000..0b2adf2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/asa_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ast.dat b/venv/Lib/site-packages/babel/locale-data/ast.dat new file mode 100644 index 0000000..3bf5d4f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ast.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ast_ES.dat b/venv/Lib/site-packages/babel/locale-data/ast_ES.dat new file mode 100644 index 0000000..af96de0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ast_ES.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/az.dat b/venv/Lib/site-packages/babel/locale-data/az.dat new file mode 100644 index 0000000..dbe2695 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/az.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/az_Arab.dat b/venv/Lib/site-packages/babel/locale-data/az_Arab.dat new file mode 100644 index 0000000..d18ccb5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/az_Arab.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/az_Arab_IQ.dat b/venv/Lib/site-packages/babel/locale-data/az_Arab_IQ.dat new file mode 100644 index 0000000..393175f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/az_Arab_IQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/az_Arab_IR.dat b/venv/Lib/site-packages/babel/locale-data/az_Arab_IR.dat new file mode 100644 index 0000000..8df9df2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/az_Arab_IR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/az_Arab_TR.dat b/venv/Lib/site-packages/babel/locale-data/az_Arab_TR.dat new file mode 100644 index 0000000..99fa84c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/az_Arab_TR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/az_Cyrl.dat b/venv/Lib/site-packages/babel/locale-data/az_Cyrl.dat new file mode 100644 index 0000000..38c3d74 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/az_Cyrl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/az_Cyrl_AZ.dat b/venv/Lib/site-packages/babel/locale-data/az_Cyrl_AZ.dat new file mode 100644 index 0000000..75ee522 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/az_Cyrl_AZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/az_Latn.dat b/venv/Lib/site-packages/babel/locale-data/az_Latn.dat new file mode 100644 index 0000000..88c306f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/az_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/az_Latn_AZ.dat b/venv/Lib/site-packages/babel/locale-data/az_Latn_AZ.dat new file mode 100644 index 0000000..75ee522 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/az_Latn_AZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ba.dat b/venv/Lib/site-packages/babel/locale-data/ba.dat new file mode 100644 index 0000000..07c9788 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ba.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ba_RU.dat b/venv/Lib/site-packages/babel/locale-data/ba_RU.dat new file mode 100644 index 0000000..93dadc0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ba_RU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bal.dat b/venv/Lib/site-packages/babel/locale-data/bal.dat new file mode 100644 index 0000000..edf9cff Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bal.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bal_Arab.dat b/venv/Lib/site-packages/babel/locale-data/bal_Arab.dat new file mode 100644 index 0000000..9fc6e82 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bal_Arab.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bal_Arab_PK.dat b/venv/Lib/site-packages/babel/locale-data/bal_Arab_PK.dat new file mode 100644 index 0000000..37f77e2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bal_Arab_PK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bal_Latn.dat b/venv/Lib/site-packages/babel/locale-data/bal_Latn.dat new file mode 100644 index 0000000..f034c67 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bal_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bal_Latn_PK.dat b/venv/Lib/site-packages/babel/locale-data/bal_Latn_PK.dat new file mode 100644 index 0000000..37f77e2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bal_Latn_PK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bas.dat b/venv/Lib/site-packages/babel/locale-data/bas.dat new file mode 100644 index 0000000..3263913 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bas.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bas_CM.dat b/venv/Lib/site-packages/babel/locale-data/bas_CM.dat new file mode 100644 index 0000000..992e863 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bas_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/be.dat b/venv/Lib/site-packages/babel/locale-data/be.dat new file mode 100644 index 0000000..73bda33 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/be.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/be_BY.dat b/venv/Lib/site-packages/babel/locale-data/be_BY.dat new file mode 100644 index 0000000..759f67a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/be_BY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/be_TARASK.dat b/venv/Lib/site-packages/babel/locale-data/be_TARASK.dat new file mode 100644 index 0000000..8fe55cf Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/be_TARASK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bem.dat b/venv/Lib/site-packages/babel/locale-data/bem.dat new file mode 100644 index 0000000..1491251 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bem.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bem_ZM.dat b/venv/Lib/site-packages/babel/locale-data/bem_ZM.dat new file mode 100644 index 0000000..7f393a8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bem_ZM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bez.dat b/venv/Lib/site-packages/babel/locale-data/bez.dat new file mode 100644 index 0000000..8b1b501 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bez.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bez_TZ.dat b/venv/Lib/site-packages/babel/locale-data/bez_TZ.dat new file mode 100644 index 0000000..76974eb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bez_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bg.dat b/venv/Lib/site-packages/babel/locale-data/bg.dat new file mode 100644 index 0000000..c19755e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bg_BG.dat b/venv/Lib/site-packages/babel/locale-data/bg_BG.dat new file mode 100644 index 0000000..b69fe97 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bg_BG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bgc.dat b/venv/Lib/site-packages/babel/locale-data/bgc.dat new file mode 100644 index 0000000..6f4a36d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bgc.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bgc_IN.dat b/venv/Lib/site-packages/babel/locale-data/bgc_IN.dat new file mode 100644 index 0000000..bc2e021 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bgc_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bgn.dat b/venv/Lib/site-packages/babel/locale-data/bgn.dat new file mode 100644 index 0000000..3ba55fb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bgn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bgn_AE.dat b/venv/Lib/site-packages/babel/locale-data/bgn_AE.dat new file mode 100644 index 0000000..71d5eb4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bgn_AE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bgn_AF.dat b/venv/Lib/site-packages/babel/locale-data/bgn_AF.dat new file mode 100644 index 0000000..4062c74 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bgn_AF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bgn_IR.dat b/venv/Lib/site-packages/babel/locale-data/bgn_IR.dat new file mode 100644 index 0000000..99a1b50 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bgn_IR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bgn_OM.dat b/venv/Lib/site-packages/babel/locale-data/bgn_OM.dat new file mode 100644 index 0000000..f396268 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bgn_OM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bgn_PK.dat b/venv/Lib/site-packages/babel/locale-data/bgn_PK.dat new file mode 100644 index 0000000..e15afea Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bgn_PK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bho.dat b/venv/Lib/site-packages/babel/locale-data/bho.dat new file mode 100644 index 0000000..9fcf0e0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bho.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bho_IN.dat b/venv/Lib/site-packages/babel/locale-data/bho_IN.dat new file mode 100644 index 0000000..4f7eb58 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bho_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/blt.dat b/venv/Lib/site-packages/babel/locale-data/blt.dat new file mode 100644 index 0000000..fee9521 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/blt.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/blt_VN.dat b/venv/Lib/site-packages/babel/locale-data/blt_VN.dat new file mode 100644 index 0000000..1cf8aa3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/blt_VN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bm.dat b/venv/Lib/site-packages/babel/locale-data/bm.dat new file mode 100644 index 0000000..e42d711 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bm.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bm_ML.dat b/venv/Lib/site-packages/babel/locale-data/bm_ML.dat new file mode 100644 index 0000000..db40608 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bm_ML.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bm_Nkoo.dat b/venv/Lib/site-packages/babel/locale-data/bm_Nkoo.dat new file mode 100644 index 0000000..f4b91db Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bm_Nkoo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bm_Nkoo_ML.dat b/venv/Lib/site-packages/babel/locale-data/bm_Nkoo_ML.dat new file mode 100644 index 0000000..db40608 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bm_Nkoo_ML.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bn.dat b/venv/Lib/site-packages/babel/locale-data/bn.dat new file mode 100644 index 0000000..f106e84 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bn_BD.dat b/venv/Lib/site-packages/babel/locale-data/bn_BD.dat new file mode 100644 index 0000000..0814ec9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bn_BD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bn_IN.dat b/venv/Lib/site-packages/babel/locale-data/bn_IN.dat new file mode 100644 index 0000000..086300e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bn_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bo.dat b/venv/Lib/site-packages/babel/locale-data/bo.dat new file mode 100644 index 0000000..c86022c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bo_CN.dat b/venv/Lib/site-packages/babel/locale-data/bo_CN.dat new file mode 100644 index 0000000..d9e6243 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bo_CN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bo_IN.dat b/venv/Lib/site-packages/babel/locale-data/bo_IN.dat new file mode 100644 index 0000000..900a19e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bo_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/br.dat b/venv/Lib/site-packages/babel/locale-data/br.dat new file mode 100644 index 0000000..d5ef5ff Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/br.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/br_FR.dat b/venv/Lib/site-packages/babel/locale-data/br_FR.dat new file mode 100644 index 0000000..5964d66 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/br_FR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/brx.dat b/venv/Lib/site-packages/babel/locale-data/brx.dat new file mode 100644 index 0000000..e8888e9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/brx.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/brx_IN.dat b/venv/Lib/site-packages/babel/locale-data/brx_IN.dat new file mode 100644 index 0000000..6dafcc9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/brx_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bs.dat b/venv/Lib/site-packages/babel/locale-data/bs.dat new file mode 100644 index 0000000..29131eb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bs.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bs_Cyrl.dat b/venv/Lib/site-packages/babel/locale-data/bs_Cyrl.dat new file mode 100644 index 0000000..c237bae Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bs_Cyrl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bs_Cyrl_BA.dat b/venv/Lib/site-packages/babel/locale-data/bs_Cyrl_BA.dat new file mode 100644 index 0000000..4a56da8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bs_Cyrl_BA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bs_Latn.dat b/venv/Lib/site-packages/babel/locale-data/bs_Latn.dat new file mode 100644 index 0000000..767af2e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bs_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bs_Latn_BA.dat b/venv/Lib/site-packages/babel/locale-data/bs_Latn_BA.dat new file mode 100644 index 0000000..4a56da8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bs_Latn_BA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bss.dat b/venv/Lib/site-packages/babel/locale-data/bss.dat new file mode 100644 index 0000000..281e246 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bss.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/bss_CM.dat b/venv/Lib/site-packages/babel/locale-data/bss_CM.dat new file mode 100644 index 0000000..c02e93f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/bss_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/byn.dat b/venv/Lib/site-packages/babel/locale-data/byn.dat new file mode 100644 index 0000000..54327f0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/byn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/byn_ER.dat b/venv/Lib/site-packages/babel/locale-data/byn_ER.dat new file mode 100644 index 0000000..ef7364c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/byn_ER.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ca.dat b/venv/Lib/site-packages/babel/locale-data/ca.dat new file mode 100644 index 0000000..e6257e3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ca.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ca_AD.dat b/venv/Lib/site-packages/babel/locale-data/ca_AD.dat new file mode 100644 index 0000000..417de47 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ca_AD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ca_ES.dat b/venv/Lib/site-packages/babel/locale-data/ca_ES.dat new file mode 100644 index 0000000..1262e7c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ca_ES.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ca_ES_VALENCIA.dat b/venv/Lib/site-packages/babel/locale-data/ca_ES_VALENCIA.dat new file mode 100644 index 0000000..3d6ed28 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ca_ES_VALENCIA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ca_FR.dat b/venv/Lib/site-packages/babel/locale-data/ca_FR.dat new file mode 100644 index 0000000..1e13497 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ca_FR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ca_IT.dat b/venv/Lib/site-packages/babel/locale-data/ca_IT.dat new file mode 100644 index 0000000..18daef7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ca_IT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cad.dat b/venv/Lib/site-packages/babel/locale-data/cad.dat new file mode 100644 index 0000000..29e5a39 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cad.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cad_US.dat b/venv/Lib/site-packages/babel/locale-data/cad_US.dat new file mode 100644 index 0000000..649a127 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cad_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cch.dat b/venv/Lib/site-packages/babel/locale-data/cch.dat new file mode 100644 index 0000000..6bfb265 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cch.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cch_NG.dat b/venv/Lib/site-packages/babel/locale-data/cch_NG.dat new file mode 100644 index 0000000..7ca50d0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cch_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ccp.dat b/venv/Lib/site-packages/babel/locale-data/ccp.dat new file mode 100644 index 0000000..16dcd6e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ccp.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ccp_BD.dat b/venv/Lib/site-packages/babel/locale-data/ccp_BD.dat new file mode 100644 index 0000000..23248d8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ccp_BD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ccp_IN.dat b/venv/Lib/site-packages/babel/locale-data/ccp_IN.dat new file mode 100644 index 0000000..e4fe9a0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ccp_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ce.dat b/venv/Lib/site-packages/babel/locale-data/ce.dat new file mode 100644 index 0000000..d075997 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ce.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ce_RU.dat b/venv/Lib/site-packages/babel/locale-data/ce_RU.dat new file mode 100644 index 0000000..613de66 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ce_RU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ceb.dat b/venv/Lib/site-packages/babel/locale-data/ceb.dat new file mode 100644 index 0000000..34b2aa2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ceb.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ceb_PH.dat b/venv/Lib/site-packages/babel/locale-data/ceb_PH.dat new file mode 100644 index 0000000..f5a88a1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ceb_PH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cgg.dat b/venv/Lib/site-packages/babel/locale-data/cgg.dat new file mode 100644 index 0000000..9d87c1c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cgg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cgg_UG.dat b/venv/Lib/site-packages/babel/locale-data/cgg_UG.dat new file mode 100644 index 0000000..3ed7de5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cgg_UG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cho.dat b/venv/Lib/site-packages/babel/locale-data/cho.dat new file mode 100644 index 0000000..16de95d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cho.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cho_US.dat b/venv/Lib/site-packages/babel/locale-data/cho_US.dat new file mode 100644 index 0000000..927cd45 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cho_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/chr.dat b/venv/Lib/site-packages/babel/locale-data/chr.dat new file mode 100644 index 0000000..f86e5ff Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/chr.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/chr_US.dat b/venv/Lib/site-packages/babel/locale-data/chr_US.dat new file mode 100644 index 0000000..3057985 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/chr_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cic.dat b/venv/Lib/site-packages/babel/locale-data/cic.dat new file mode 100644 index 0000000..e1e3701 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cic.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cic_US.dat b/venv/Lib/site-packages/babel/locale-data/cic_US.dat new file mode 100644 index 0000000..a2f944f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cic_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ckb.dat b/venv/Lib/site-packages/babel/locale-data/ckb.dat new file mode 100644 index 0000000..22a9b83 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ckb.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ckb_IQ.dat b/venv/Lib/site-packages/babel/locale-data/ckb_IQ.dat new file mode 100644 index 0000000..68ae78b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ckb_IQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ckb_IR.dat b/venv/Lib/site-packages/babel/locale-data/ckb_IR.dat new file mode 100644 index 0000000..407a605 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ckb_IR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/co.dat b/venv/Lib/site-packages/babel/locale-data/co.dat new file mode 100644 index 0000000..a891587 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/co.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/co_FR.dat b/venv/Lib/site-packages/babel/locale-data/co_FR.dat new file mode 100644 index 0000000..ac96852 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/co_FR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cs.dat b/venv/Lib/site-packages/babel/locale-data/cs.dat new file mode 100644 index 0000000..8d7293a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cs.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cs_CZ.dat b/venv/Lib/site-packages/babel/locale-data/cs_CZ.dat new file mode 100644 index 0000000..0c492c4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cs_CZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cu.dat b/venv/Lib/site-packages/babel/locale-data/cu.dat new file mode 100644 index 0000000..87c7ecc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cu.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cu_RU.dat b/venv/Lib/site-packages/babel/locale-data/cu_RU.dat new file mode 100644 index 0000000..a9d3101 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cu_RU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cv.dat b/venv/Lib/site-packages/babel/locale-data/cv.dat new file mode 100644 index 0000000..65ea502 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cv.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cv_RU.dat b/venv/Lib/site-packages/babel/locale-data/cv_RU.dat new file mode 100644 index 0000000..5975991 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cv_RU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cy.dat b/venv/Lib/site-packages/babel/locale-data/cy.dat new file mode 100644 index 0000000..a06823d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cy.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/cy_GB.dat b/venv/Lib/site-packages/babel/locale-data/cy_GB.dat new file mode 100644 index 0000000..f3febac Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/cy_GB.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/da.dat b/venv/Lib/site-packages/babel/locale-data/da.dat new file mode 100644 index 0000000..27f45b5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/da.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/da_DK.dat b/venv/Lib/site-packages/babel/locale-data/da_DK.dat new file mode 100644 index 0000000..dbd0672 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/da_DK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/da_GL.dat b/venv/Lib/site-packages/babel/locale-data/da_GL.dat new file mode 100644 index 0000000..ce46da1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/da_GL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dav.dat b/venv/Lib/site-packages/babel/locale-data/dav.dat new file mode 100644 index 0000000..f81c426 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dav.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dav_KE.dat b/venv/Lib/site-packages/babel/locale-data/dav_KE.dat new file mode 100644 index 0000000..5e3fbf4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dav_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/de.dat b/venv/Lib/site-packages/babel/locale-data/de.dat new file mode 100644 index 0000000..6d8cb95 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/de.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/de_AT.dat b/venv/Lib/site-packages/babel/locale-data/de_AT.dat new file mode 100644 index 0000000..d930740 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/de_AT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/de_BE.dat b/venv/Lib/site-packages/babel/locale-data/de_BE.dat new file mode 100644 index 0000000..806b291 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/de_BE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/de_CH.dat b/venv/Lib/site-packages/babel/locale-data/de_CH.dat new file mode 100644 index 0000000..f9aa38e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/de_CH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/de_DE.dat b/venv/Lib/site-packages/babel/locale-data/de_DE.dat new file mode 100644 index 0000000..1d769ac Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/de_DE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/de_IT.dat b/venv/Lib/site-packages/babel/locale-data/de_IT.dat new file mode 100644 index 0000000..91f8ab0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/de_IT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/de_LI.dat b/venv/Lib/site-packages/babel/locale-data/de_LI.dat new file mode 100644 index 0000000..f4f1a35 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/de_LI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/de_LU.dat b/venv/Lib/site-packages/babel/locale-data/de_LU.dat new file mode 100644 index 0000000..ed9d8fb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/de_LU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dje.dat b/venv/Lib/site-packages/babel/locale-data/dje.dat new file mode 100644 index 0000000..070491f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dje.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dje_NE.dat b/venv/Lib/site-packages/babel/locale-data/dje_NE.dat new file mode 100644 index 0000000..605bb83 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dje_NE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/doi.dat b/venv/Lib/site-packages/babel/locale-data/doi.dat new file mode 100644 index 0000000..c684d5c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/doi.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/doi_IN.dat b/venv/Lib/site-packages/babel/locale-data/doi_IN.dat new file mode 100644 index 0000000..550ec0e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/doi_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dsb.dat b/venv/Lib/site-packages/babel/locale-data/dsb.dat new file mode 100644 index 0000000..c195577 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dsb.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dsb_DE.dat b/venv/Lib/site-packages/babel/locale-data/dsb_DE.dat new file mode 100644 index 0000000..f1a8d4b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dsb_DE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dua.dat b/venv/Lib/site-packages/babel/locale-data/dua.dat new file mode 100644 index 0000000..584392b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dua.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dua_CM.dat b/venv/Lib/site-packages/babel/locale-data/dua_CM.dat new file mode 100644 index 0000000..5eab8c9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dua_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dv.dat b/venv/Lib/site-packages/babel/locale-data/dv.dat new file mode 100644 index 0000000..f8c88ff Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dv.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dv_MV.dat b/venv/Lib/site-packages/babel/locale-data/dv_MV.dat new file mode 100644 index 0000000..6a6048b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dv_MV.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dyo.dat b/venv/Lib/site-packages/babel/locale-data/dyo.dat new file mode 100644 index 0000000..f1c477f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dyo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dyo_SN.dat b/venv/Lib/site-packages/babel/locale-data/dyo_SN.dat new file mode 100644 index 0000000..734192c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dyo_SN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dz.dat b/venv/Lib/site-packages/babel/locale-data/dz.dat new file mode 100644 index 0000000..3aeba92 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dz.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/dz_BT.dat b/venv/Lib/site-packages/babel/locale-data/dz_BT.dat new file mode 100644 index 0000000..34b2803 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/dz_BT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ebu.dat b/venv/Lib/site-packages/babel/locale-data/ebu.dat new file mode 100644 index 0000000..d311611 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ebu.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ebu_KE.dat b/venv/Lib/site-packages/babel/locale-data/ebu_KE.dat new file mode 100644 index 0000000..0abfe0e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ebu_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ee.dat b/venv/Lib/site-packages/babel/locale-data/ee.dat new file mode 100644 index 0000000..a85ea96 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ee.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ee_GH.dat b/venv/Lib/site-packages/babel/locale-data/ee_GH.dat new file mode 100644 index 0000000..3702d42 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ee_GH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ee_TG.dat b/venv/Lib/site-packages/babel/locale-data/ee_TG.dat new file mode 100644 index 0000000..5f19ac9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ee_TG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/el.dat b/venv/Lib/site-packages/babel/locale-data/el.dat new file mode 100644 index 0000000..3acf554 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/el.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/el_CY.dat b/venv/Lib/site-packages/babel/locale-data/el_CY.dat new file mode 100644 index 0000000..22fb874 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/el_CY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/el_GR.dat b/venv/Lib/site-packages/babel/locale-data/el_GR.dat new file mode 100644 index 0000000..ee095c9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/el_GR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/el_POLYTON.dat b/venv/Lib/site-packages/babel/locale-data/el_POLYTON.dat new file mode 100644 index 0000000..24a37da Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/el_POLYTON.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en.dat b/venv/Lib/site-packages/babel/locale-data/en.dat new file mode 100644 index 0000000..98cb092 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_001.dat b/venv/Lib/site-packages/babel/locale-data/en_001.dat new file mode 100644 index 0000000..ae63fe0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_001.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_150.dat b/venv/Lib/site-packages/babel/locale-data/en_150.dat new file mode 100644 index 0000000..82dd271 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_150.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_AE.dat b/venv/Lib/site-packages/babel/locale-data/en_AE.dat new file mode 100644 index 0000000..ed7d30c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_AE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_AG.dat b/venv/Lib/site-packages/babel/locale-data/en_AG.dat new file mode 100644 index 0000000..16d7fa5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_AG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_AI.dat b/venv/Lib/site-packages/babel/locale-data/en_AI.dat new file mode 100644 index 0000000..6f0437d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_AI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_AS.dat b/venv/Lib/site-packages/babel/locale-data/en_AS.dat new file mode 100644 index 0000000..d309d36 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_AS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_AT.dat b/venv/Lib/site-packages/babel/locale-data/en_AT.dat new file mode 100644 index 0000000..ff190b6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_AT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_AU.dat b/venv/Lib/site-packages/babel/locale-data/en_AU.dat new file mode 100644 index 0000000..4a155e2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_AU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_BB.dat b/venv/Lib/site-packages/babel/locale-data/en_BB.dat new file mode 100644 index 0000000..fbcfdd8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_BB.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_BE.dat b/venv/Lib/site-packages/babel/locale-data/en_BE.dat new file mode 100644 index 0000000..481689f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_BE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_BI.dat b/venv/Lib/site-packages/babel/locale-data/en_BI.dat new file mode 100644 index 0000000..e2ef90f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_BI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_BM.dat b/venv/Lib/site-packages/babel/locale-data/en_BM.dat new file mode 100644 index 0000000..f4e57b6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_BM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_BS.dat b/venv/Lib/site-packages/babel/locale-data/en_BS.dat new file mode 100644 index 0000000..51f446e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_BS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_BW.dat b/venv/Lib/site-packages/babel/locale-data/en_BW.dat new file mode 100644 index 0000000..2d08392 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_BW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_BZ.dat b/venv/Lib/site-packages/babel/locale-data/en_BZ.dat new file mode 100644 index 0000000..6dbeea4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_BZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_CA.dat b/venv/Lib/site-packages/babel/locale-data/en_CA.dat new file mode 100644 index 0000000..5da59ac Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_CA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_CC.dat b/venv/Lib/site-packages/babel/locale-data/en_CC.dat new file mode 100644 index 0000000..1102d2b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_CC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_CH.dat b/venv/Lib/site-packages/babel/locale-data/en_CH.dat new file mode 100644 index 0000000..bce7db9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_CH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_CK.dat b/venv/Lib/site-packages/babel/locale-data/en_CK.dat new file mode 100644 index 0000000..e4870c8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_CK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_CM.dat b/venv/Lib/site-packages/babel/locale-data/en_CM.dat new file mode 100644 index 0000000..1816a83 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_CX.dat b/venv/Lib/site-packages/babel/locale-data/en_CX.dat new file mode 100644 index 0000000..b0a5620 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_CX.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_CY.dat b/venv/Lib/site-packages/babel/locale-data/en_CY.dat new file mode 100644 index 0000000..54fb2d1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_CY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_DE.dat b/venv/Lib/site-packages/babel/locale-data/en_DE.dat new file mode 100644 index 0000000..3d7ded0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_DE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_DG.dat b/venv/Lib/site-packages/babel/locale-data/en_DG.dat new file mode 100644 index 0000000..1bdea43 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_DG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_DK.dat b/venv/Lib/site-packages/babel/locale-data/en_DK.dat new file mode 100644 index 0000000..08f2d75 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_DK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_DM.dat b/venv/Lib/site-packages/babel/locale-data/en_DM.dat new file mode 100644 index 0000000..00ce5e1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_DM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_Dsrt.dat b/venv/Lib/site-packages/babel/locale-data/en_Dsrt.dat new file mode 100644 index 0000000..c669205 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_Dsrt.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_Dsrt_US.dat b/venv/Lib/site-packages/babel/locale-data/en_Dsrt_US.dat new file mode 100644 index 0000000..663e826 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_Dsrt_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_ER.dat b/venv/Lib/site-packages/babel/locale-data/en_ER.dat new file mode 100644 index 0000000..349173e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_ER.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_FI.dat b/venv/Lib/site-packages/babel/locale-data/en_FI.dat new file mode 100644 index 0000000..cc7a23d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_FI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_FJ.dat b/venv/Lib/site-packages/babel/locale-data/en_FJ.dat new file mode 100644 index 0000000..e201319 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_FJ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_FK.dat b/venv/Lib/site-packages/babel/locale-data/en_FK.dat new file mode 100644 index 0000000..3b586dd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_FK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_FM.dat b/venv/Lib/site-packages/babel/locale-data/en_FM.dat new file mode 100644 index 0000000..4a4d6ab Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_FM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_GB.dat b/venv/Lib/site-packages/babel/locale-data/en_GB.dat new file mode 100644 index 0000000..9e63a22 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_GB.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_GD.dat b/venv/Lib/site-packages/babel/locale-data/en_GD.dat new file mode 100644 index 0000000..fbd024b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_GD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_GG.dat b/venv/Lib/site-packages/babel/locale-data/en_GG.dat new file mode 100644 index 0000000..6195e7d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_GG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_GH.dat b/venv/Lib/site-packages/babel/locale-data/en_GH.dat new file mode 100644 index 0000000..bfcd6f5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_GH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_GI.dat b/venv/Lib/site-packages/babel/locale-data/en_GI.dat new file mode 100644 index 0000000..98b852e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_GI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_GM.dat b/venv/Lib/site-packages/babel/locale-data/en_GM.dat new file mode 100644 index 0000000..4e7daad Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_GM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_GU.dat b/venv/Lib/site-packages/babel/locale-data/en_GU.dat new file mode 100644 index 0000000..6d18467 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_GU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_GY.dat b/venv/Lib/site-packages/babel/locale-data/en_GY.dat new file mode 100644 index 0000000..4192d41 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_GY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_HK.dat b/venv/Lib/site-packages/babel/locale-data/en_HK.dat new file mode 100644 index 0000000..287aadf Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_HK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_IE.dat b/venv/Lib/site-packages/babel/locale-data/en_IE.dat new file mode 100644 index 0000000..36b4ffb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_IE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_IL.dat b/venv/Lib/site-packages/babel/locale-data/en_IL.dat new file mode 100644 index 0000000..9782e31 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_IL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_IM.dat b/venv/Lib/site-packages/babel/locale-data/en_IM.dat new file mode 100644 index 0000000..a378969 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_IM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_IN.dat b/venv/Lib/site-packages/babel/locale-data/en_IN.dat new file mode 100644 index 0000000..175e00b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_IO.dat b/venv/Lib/site-packages/babel/locale-data/en_IO.dat new file mode 100644 index 0000000..ce4dba2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_IO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_JE.dat b/venv/Lib/site-packages/babel/locale-data/en_JE.dat new file mode 100644 index 0000000..59fad12 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_JE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_JM.dat b/venv/Lib/site-packages/babel/locale-data/en_JM.dat new file mode 100644 index 0000000..8bb03e3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_JM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_KE.dat b/venv/Lib/site-packages/babel/locale-data/en_KE.dat new file mode 100644 index 0000000..5c18167 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_KI.dat b/venv/Lib/site-packages/babel/locale-data/en_KI.dat new file mode 100644 index 0000000..2c57a16 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_KI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_KN.dat b/venv/Lib/site-packages/babel/locale-data/en_KN.dat new file mode 100644 index 0000000..79c9a81 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_KN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_KY.dat b/venv/Lib/site-packages/babel/locale-data/en_KY.dat new file mode 100644 index 0000000..0d5a093 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_KY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_LC.dat b/venv/Lib/site-packages/babel/locale-data/en_LC.dat new file mode 100644 index 0000000..0368fe3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_LC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_LR.dat b/venv/Lib/site-packages/babel/locale-data/en_LR.dat new file mode 100644 index 0000000..80d77d8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_LR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_LS.dat b/venv/Lib/site-packages/babel/locale-data/en_LS.dat new file mode 100644 index 0000000..b3cbbfb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_LS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_MG.dat b/venv/Lib/site-packages/babel/locale-data/en_MG.dat new file mode 100644 index 0000000..cf3db95 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_MG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_MH.dat b/venv/Lib/site-packages/babel/locale-data/en_MH.dat new file mode 100644 index 0000000..f6bc501 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_MH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_MO.dat b/venv/Lib/site-packages/babel/locale-data/en_MO.dat new file mode 100644 index 0000000..6635dc5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_MO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_MP.dat b/venv/Lib/site-packages/babel/locale-data/en_MP.dat new file mode 100644 index 0000000..ede9c2b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_MP.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_MS.dat b/venv/Lib/site-packages/babel/locale-data/en_MS.dat new file mode 100644 index 0000000..53115eb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_MS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_MT.dat b/venv/Lib/site-packages/babel/locale-data/en_MT.dat new file mode 100644 index 0000000..87c2b95 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_MT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_MU.dat b/venv/Lib/site-packages/babel/locale-data/en_MU.dat new file mode 100644 index 0000000..524b3ac Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_MU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_MV.dat b/venv/Lib/site-packages/babel/locale-data/en_MV.dat new file mode 100644 index 0000000..852a33d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_MV.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_MW.dat b/venv/Lib/site-packages/babel/locale-data/en_MW.dat new file mode 100644 index 0000000..d0dcd6a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_MW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_MY.dat b/venv/Lib/site-packages/babel/locale-data/en_MY.dat new file mode 100644 index 0000000..9479385 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_MY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_NA.dat b/venv/Lib/site-packages/babel/locale-data/en_NA.dat new file mode 100644 index 0000000..a3d8829 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_NA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_NF.dat b/venv/Lib/site-packages/babel/locale-data/en_NF.dat new file mode 100644 index 0000000..8003f60 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_NF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_NG.dat b/venv/Lib/site-packages/babel/locale-data/en_NG.dat new file mode 100644 index 0000000..27bae07 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_NL.dat b/venv/Lib/site-packages/babel/locale-data/en_NL.dat new file mode 100644 index 0000000..8cd5773 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_NL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_NR.dat b/venv/Lib/site-packages/babel/locale-data/en_NR.dat new file mode 100644 index 0000000..0c788a8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_NR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_NU.dat b/venv/Lib/site-packages/babel/locale-data/en_NU.dat new file mode 100644 index 0000000..f8607f6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_NU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_NZ.dat b/venv/Lib/site-packages/babel/locale-data/en_NZ.dat new file mode 100644 index 0000000..35984cb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_NZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_PG.dat b/venv/Lib/site-packages/babel/locale-data/en_PG.dat new file mode 100644 index 0000000..4269e33 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_PG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_PH.dat b/venv/Lib/site-packages/babel/locale-data/en_PH.dat new file mode 100644 index 0000000..b8af655 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_PH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_PK.dat b/venv/Lib/site-packages/babel/locale-data/en_PK.dat new file mode 100644 index 0000000..f198d9e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_PK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_PN.dat b/venv/Lib/site-packages/babel/locale-data/en_PN.dat new file mode 100644 index 0000000..9977c74 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_PN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_PR.dat b/venv/Lib/site-packages/babel/locale-data/en_PR.dat new file mode 100644 index 0000000..cdb83db Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_PR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_PW.dat b/venv/Lib/site-packages/babel/locale-data/en_PW.dat new file mode 100644 index 0000000..0a5a4f4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_PW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_RW.dat b/venv/Lib/site-packages/babel/locale-data/en_RW.dat new file mode 100644 index 0000000..c46733b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_RW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SB.dat b/venv/Lib/site-packages/babel/locale-data/en_SB.dat new file mode 100644 index 0000000..b81625e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SB.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SC.dat b/venv/Lib/site-packages/babel/locale-data/en_SC.dat new file mode 100644 index 0000000..4816bb8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SD.dat b/venv/Lib/site-packages/babel/locale-data/en_SD.dat new file mode 100644 index 0000000..985e3e6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SE.dat b/venv/Lib/site-packages/babel/locale-data/en_SE.dat new file mode 100644 index 0000000..5f89bad Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SG.dat b/venv/Lib/site-packages/babel/locale-data/en_SG.dat new file mode 100644 index 0000000..a21a72a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SH.dat b/venv/Lib/site-packages/babel/locale-data/en_SH.dat new file mode 100644 index 0000000..006487c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SI.dat b/venv/Lib/site-packages/babel/locale-data/en_SI.dat new file mode 100644 index 0000000..97b42d0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SL.dat b/venv/Lib/site-packages/babel/locale-data/en_SL.dat new file mode 100644 index 0000000..127d128 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SS.dat b/venv/Lib/site-packages/babel/locale-data/en_SS.dat new file mode 100644 index 0000000..7192fd1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SX.dat b/venv/Lib/site-packages/babel/locale-data/en_SX.dat new file mode 100644 index 0000000..5dfff7d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SX.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_SZ.dat b/venv/Lib/site-packages/babel/locale-data/en_SZ.dat new file mode 100644 index 0000000..90a9f7a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_SZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_Shaw.dat b/venv/Lib/site-packages/babel/locale-data/en_Shaw.dat new file mode 100644 index 0000000..3c02f9f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_Shaw.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_Shaw_GB.dat b/venv/Lib/site-packages/babel/locale-data/en_Shaw_GB.dat new file mode 100644 index 0000000..214e5c6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_Shaw_GB.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_TC.dat b/venv/Lib/site-packages/babel/locale-data/en_TC.dat new file mode 100644 index 0000000..d1edd04 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_TC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_TK.dat b/venv/Lib/site-packages/babel/locale-data/en_TK.dat new file mode 100644 index 0000000..d81803f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_TK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_TO.dat b/venv/Lib/site-packages/babel/locale-data/en_TO.dat new file mode 100644 index 0000000..4512ee4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_TO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_TT.dat b/venv/Lib/site-packages/babel/locale-data/en_TT.dat new file mode 100644 index 0000000..e704f06 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_TT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_TV.dat b/venv/Lib/site-packages/babel/locale-data/en_TV.dat new file mode 100644 index 0000000..c936c69 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_TV.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_TZ.dat b/venv/Lib/site-packages/babel/locale-data/en_TZ.dat new file mode 100644 index 0000000..62091ce Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_UG.dat b/venv/Lib/site-packages/babel/locale-data/en_UG.dat new file mode 100644 index 0000000..dd077cc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_UG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_UM.dat b/venv/Lib/site-packages/babel/locale-data/en_UM.dat new file mode 100644 index 0000000..3a027b2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_UM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_US.dat b/venv/Lib/site-packages/babel/locale-data/en_US.dat new file mode 100644 index 0000000..663e826 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_US_POSIX.dat b/venv/Lib/site-packages/babel/locale-data/en_US_POSIX.dat new file mode 100644 index 0000000..a9ecf5b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_US_POSIX.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_VC.dat b/venv/Lib/site-packages/babel/locale-data/en_VC.dat new file mode 100644 index 0000000..86fb17d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_VC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_VG.dat b/venv/Lib/site-packages/babel/locale-data/en_VG.dat new file mode 100644 index 0000000..3fdd46c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_VG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_VI.dat b/venv/Lib/site-packages/babel/locale-data/en_VI.dat new file mode 100644 index 0000000..c4520cc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_VI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_VU.dat b/venv/Lib/site-packages/babel/locale-data/en_VU.dat new file mode 100644 index 0000000..12647a8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_VU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_WS.dat b/venv/Lib/site-packages/babel/locale-data/en_WS.dat new file mode 100644 index 0000000..8531d31 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_WS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_ZA.dat b/venv/Lib/site-packages/babel/locale-data/en_ZA.dat new file mode 100644 index 0000000..8cc6b0e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_ZM.dat b/venv/Lib/site-packages/babel/locale-data/en_ZM.dat new file mode 100644 index 0000000..5003925 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_ZM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/en_ZW.dat b/venv/Lib/site-packages/babel/locale-data/en_ZW.dat new file mode 100644 index 0000000..6a8835f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/en_ZW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/eo.dat b/venv/Lib/site-packages/babel/locale-data/eo.dat new file mode 100644 index 0000000..a83a5cf Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/eo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/eo_001.dat b/venv/Lib/site-packages/babel/locale-data/eo_001.dat new file mode 100644 index 0000000..ec48fb1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/eo_001.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es.dat b/venv/Lib/site-packages/babel/locale-data/es.dat new file mode 100644 index 0000000..410103c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_419.dat b/venv/Lib/site-packages/babel/locale-data/es_419.dat new file mode 100644 index 0000000..29f94f3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_419.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_AR.dat b/venv/Lib/site-packages/babel/locale-data/es_AR.dat new file mode 100644 index 0000000..ad0f812 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_AR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_BO.dat b/venv/Lib/site-packages/babel/locale-data/es_BO.dat new file mode 100644 index 0000000..30d4c92 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_BO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_BR.dat b/venv/Lib/site-packages/babel/locale-data/es_BR.dat new file mode 100644 index 0000000..98b9e40 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_BR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_BZ.dat b/venv/Lib/site-packages/babel/locale-data/es_BZ.dat new file mode 100644 index 0000000..ec41379 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_BZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_CL.dat b/venv/Lib/site-packages/babel/locale-data/es_CL.dat new file mode 100644 index 0000000..a52bd21 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_CL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_CO.dat b/venv/Lib/site-packages/babel/locale-data/es_CO.dat new file mode 100644 index 0000000..9d051e8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_CO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_CR.dat b/venv/Lib/site-packages/babel/locale-data/es_CR.dat new file mode 100644 index 0000000..166c569 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_CR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_CU.dat b/venv/Lib/site-packages/babel/locale-data/es_CU.dat new file mode 100644 index 0000000..ced5b38 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_CU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_DO.dat b/venv/Lib/site-packages/babel/locale-data/es_DO.dat new file mode 100644 index 0000000..dacd8d7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_DO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_EA.dat b/venv/Lib/site-packages/babel/locale-data/es_EA.dat new file mode 100644 index 0000000..dfd0d91 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_EA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_EC.dat b/venv/Lib/site-packages/babel/locale-data/es_EC.dat new file mode 100644 index 0000000..2263f83 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_EC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_ES.dat b/venv/Lib/site-packages/babel/locale-data/es_ES.dat new file mode 100644 index 0000000..3414dff Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_ES.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_GQ.dat b/venv/Lib/site-packages/babel/locale-data/es_GQ.dat new file mode 100644 index 0000000..775e43b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_GQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_GT.dat b/venv/Lib/site-packages/babel/locale-data/es_GT.dat new file mode 100644 index 0000000..f24ca23 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_GT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_HN.dat b/venv/Lib/site-packages/babel/locale-data/es_HN.dat new file mode 100644 index 0000000..7f968d8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_HN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_IC.dat b/venv/Lib/site-packages/babel/locale-data/es_IC.dat new file mode 100644 index 0000000..3a9f9fd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_IC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_MX.dat b/venv/Lib/site-packages/babel/locale-data/es_MX.dat new file mode 100644 index 0000000..a11c68c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_MX.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_NI.dat b/venv/Lib/site-packages/babel/locale-data/es_NI.dat new file mode 100644 index 0000000..d269927 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_NI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_PA.dat b/venv/Lib/site-packages/babel/locale-data/es_PA.dat new file mode 100644 index 0000000..53a83ba Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_PA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_PE.dat b/venv/Lib/site-packages/babel/locale-data/es_PE.dat new file mode 100644 index 0000000..1448130 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_PE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_PH.dat b/venv/Lib/site-packages/babel/locale-data/es_PH.dat new file mode 100644 index 0000000..91e24f1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_PH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_PR.dat b/venv/Lib/site-packages/babel/locale-data/es_PR.dat new file mode 100644 index 0000000..be484e0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_PR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_PY.dat b/venv/Lib/site-packages/babel/locale-data/es_PY.dat new file mode 100644 index 0000000..9b283ea Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_PY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_SV.dat b/venv/Lib/site-packages/babel/locale-data/es_SV.dat new file mode 100644 index 0000000..cb84391 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_SV.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_US.dat b/venv/Lib/site-packages/babel/locale-data/es_US.dat new file mode 100644 index 0000000..36d561e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_UY.dat b/venv/Lib/site-packages/babel/locale-data/es_UY.dat new file mode 100644 index 0000000..ee67469 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_UY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/es_VE.dat b/venv/Lib/site-packages/babel/locale-data/es_VE.dat new file mode 100644 index 0000000..35e466a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/es_VE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/et.dat b/venv/Lib/site-packages/babel/locale-data/et.dat new file mode 100644 index 0000000..8d410b9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/et.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/et_EE.dat b/venv/Lib/site-packages/babel/locale-data/et_EE.dat new file mode 100644 index 0000000..a08c682 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/et_EE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/eu.dat b/venv/Lib/site-packages/babel/locale-data/eu.dat new file mode 100644 index 0000000..3a3c0ce Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/eu.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/eu_ES.dat b/venv/Lib/site-packages/babel/locale-data/eu_ES.dat new file mode 100644 index 0000000..62f7cc6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/eu_ES.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ewo.dat b/venv/Lib/site-packages/babel/locale-data/ewo.dat new file mode 100644 index 0000000..6d8cc4f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ewo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ewo_CM.dat b/venv/Lib/site-packages/babel/locale-data/ewo_CM.dat new file mode 100644 index 0000000..ae6b0f7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ewo_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fa.dat b/venv/Lib/site-packages/babel/locale-data/fa.dat new file mode 100644 index 0000000..a5c6224 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fa.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fa_AF.dat b/venv/Lib/site-packages/babel/locale-data/fa_AF.dat new file mode 100644 index 0000000..cf5b074 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fa_AF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fa_IR.dat b/venv/Lib/site-packages/babel/locale-data/fa_IR.dat new file mode 100644 index 0000000..b3dd8eb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fa_IR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff.dat b/venv/Lib/site-packages/babel/locale-data/ff.dat new file mode 100644 index 0000000..4648c43 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm.dat new file mode 100644 index 0000000..975406a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_BF.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_BF.dat new file mode 100644 index 0000000..84f0ffb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_BF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_CM.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_CM.dat new file mode 100644 index 0000000..78bf620 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GH.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GH.dat new file mode 100644 index 0000000..6667263 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GM.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GM.dat new file mode 100644 index 0000000..e641b27 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GN.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GN.dat new file mode 100644 index 0000000..216df0b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GW.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GW.dat new file mode 100644 index 0000000..63799ca Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_GW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_LR.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_LR.dat new file mode 100644 index 0000000..f5e3cde Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_LR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_MR.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_MR.dat new file mode 100644 index 0000000..716f23f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_MR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_NE.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_NE.dat new file mode 100644 index 0000000..1209883 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_NE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_NG.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_NG.dat new file mode 100644 index 0000000..a17d85c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_SL.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_SL.dat new file mode 100644 index 0000000..d882552 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_SL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Adlm_SN.dat b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_SN.dat new file mode 100644 index 0000000..125d999 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Adlm_SN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn.dat new file mode 100644 index 0000000..df806dd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_BF.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_BF.dat new file mode 100644 index 0000000..bb3a2e0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_BF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_CM.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_CM.dat new file mode 100644 index 0000000..a3229cd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_GH.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_GH.dat new file mode 100644 index 0000000..5822230 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_GH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_GM.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_GM.dat new file mode 100644 index 0000000..82022df Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_GM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_GN.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_GN.dat new file mode 100644 index 0000000..1a99d48 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_GN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_GW.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_GW.dat new file mode 100644 index 0000000..a2b55bf Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_GW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_LR.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_LR.dat new file mode 100644 index 0000000..5dce447 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_LR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_MR.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_MR.dat new file mode 100644 index 0000000..e6178b8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_MR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_NE.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_NE.dat new file mode 100644 index 0000000..82151e8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_NE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_NG.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_NG.dat new file mode 100644 index 0000000..086889e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_SL.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_SL.dat new file mode 100644 index 0000000..e50753d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_SL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ff_Latn_SN.dat b/venv/Lib/site-packages/babel/locale-data/ff_Latn_SN.dat new file mode 100644 index 0000000..faeff87 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ff_Latn_SN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fi.dat b/venv/Lib/site-packages/babel/locale-data/fi.dat new file mode 100644 index 0000000..f89c936 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fi.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fi_FI.dat b/venv/Lib/site-packages/babel/locale-data/fi_FI.dat new file mode 100644 index 0000000..fa20dae Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fi_FI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fil.dat b/venv/Lib/site-packages/babel/locale-data/fil.dat new file mode 100644 index 0000000..58d1f92 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fil.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fil_PH.dat b/venv/Lib/site-packages/babel/locale-data/fil_PH.dat new file mode 100644 index 0000000..dc08338 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fil_PH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fo.dat b/venv/Lib/site-packages/babel/locale-data/fo.dat new file mode 100644 index 0000000..160d4b8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fo_DK.dat b/venv/Lib/site-packages/babel/locale-data/fo_DK.dat new file mode 100644 index 0000000..669088d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fo_DK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fo_FO.dat b/venv/Lib/site-packages/babel/locale-data/fo_FO.dat new file mode 100644 index 0000000..7d8a814 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fo_FO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr.dat b/venv/Lib/site-packages/babel/locale-data/fr.dat new file mode 100644 index 0000000..d68d38d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_BE.dat b/venv/Lib/site-packages/babel/locale-data/fr_BE.dat new file mode 100644 index 0000000..ae12f18 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_BE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_BF.dat b/venv/Lib/site-packages/babel/locale-data/fr_BF.dat new file mode 100644 index 0000000..ba1ecc5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_BF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_BI.dat b/venv/Lib/site-packages/babel/locale-data/fr_BI.dat new file mode 100644 index 0000000..d4036be Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_BI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_BJ.dat b/venv/Lib/site-packages/babel/locale-data/fr_BJ.dat new file mode 100644 index 0000000..562758e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_BJ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_BL.dat b/venv/Lib/site-packages/babel/locale-data/fr_BL.dat new file mode 100644 index 0000000..e311ee6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_BL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_CA.dat b/venv/Lib/site-packages/babel/locale-data/fr_CA.dat new file mode 100644 index 0000000..7dd9bb8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_CA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_CD.dat b/venv/Lib/site-packages/babel/locale-data/fr_CD.dat new file mode 100644 index 0000000..ca6b699 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_CD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_CF.dat b/venv/Lib/site-packages/babel/locale-data/fr_CF.dat new file mode 100644 index 0000000..2468e1e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_CF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_CG.dat b/venv/Lib/site-packages/babel/locale-data/fr_CG.dat new file mode 100644 index 0000000..b7df1a9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_CG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_CH.dat b/venv/Lib/site-packages/babel/locale-data/fr_CH.dat new file mode 100644 index 0000000..9cdc35c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_CH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_CI.dat b/venv/Lib/site-packages/babel/locale-data/fr_CI.dat new file mode 100644 index 0000000..3d92afc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_CI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_CM.dat b/venv/Lib/site-packages/babel/locale-data/fr_CM.dat new file mode 100644 index 0000000..f5dad53 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_DJ.dat b/venv/Lib/site-packages/babel/locale-data/fr_DJ.dat new file mode 100644 index 0000000..79aa6e6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_DJ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_DZ.dat b/venv/Lib/site-packages/babel/locale-data/fr_DZ.dat new file mode 100644 index 0000000..3f56d23 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_DZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_FR.dat b/venv/Lib/site-packages/babel/locale-data/fr_FR.dat new file mode 100644 index 0000000..553d5e4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_FR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_GA.dat b/venv/Lib/site-packages/babel/locale-data/fr_GA.dat new file mode 100644 index 0000000..beb0dd5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_GA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_GF.dat b/venv/Lib/site-packages/babel/locale-data/fr_GF.dat new file mode 100644 index 0000000..eb9ffc9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_GF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_GN.dat b/venv/Lib/site-packages/babel/locale-data/fr_GN.dat new file mode 100644 index 0000000..c4f9f80 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_GN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_GP.dat b/venv/Lib/site-packages/babel/locale-data/fr_GP.dat new file mode 100644 index 0000000..e2834c7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_GP.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_GQ.dat b/venv/Lib/site-packages/babel/locale-data/fr_GQ.dat new file mode 100644 index 0000000..a04de17 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_GQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_HT.dat b/venv/Lib/site-packages/babel/locale-data/fr_HT.dat new file mode 100644 index 0000000..c467cd9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_HT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_KM.dat b/venv/Lib/site-packages/babel/locale-data/fr_KM.dat new file mode 100644 index 0000000..9ece593 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_KM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_LU.dat b/venv/Lib/site-packages/babel/locale-data/fr_LU.dat new file mode 100644 index 0000000..062b9ab Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_LU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_MA.dat b/venv/Lib/site-packages/babel/locale-data/fr_MA.dat new file mode 100644 index 0000000..a6a623f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_MA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_MC.dat b/venv/Lib/site-packages/babel/locale-data/fr_MC.dat new file mode 100644 index 0000000..52315a3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_MC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_MF.dat b/venv/Lib/site-packages/babel/locale-data/fr_MF.dat new file mode 100644 index 0000000..e5a1df0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_MF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_MG.dat b/venv/Lib/site-packages/babel/locale-data/fr_MG.dat new file mode 100644 index 0000000..c01d050 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_MG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_ML.dat b/venv/Lib/site-packages/babel/locale-data/fr_ML.dat new file mode 100644 index 0000000..721771e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_ML.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_MQ.dat b/venv/Lib/site-packages/babel/locale-data/fr_MQ.dat new file mode 100644 index 0000000..90becb7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_MQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_MR.dat b/venv/Lib/site-packages/babel/locale-data/fr_MR.dat new file mode 100644 index 0000000..28ef3f1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_MR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_MU.dat b/venv/Lib/site-packages/babel/locale-data/fr_MU.dat new file mode 100644 index 0000000..76fc2ab Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_MU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_NC.dat b/venv/Lib/site-packages/babel/locale-data/fr_NC.dat new file mode 100644 index 0000000..6aaf034 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_NC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_NE.dat b/venv/Lib/site-packages/babel/locale-data/fr_NE.dat new file mode 100644 index 0000000..143ac4f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_NE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_PF.dat b/venv/Lib/site-packages/babel/locale-data/fr_PF.dat new file mode 100644 index 0000000..e2f11dc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_PF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_PM.dat b/venv/Lib/site-packages/babel/locale-data/fr_PM.dat new file mode 100644 index 0000000..4f9cdf7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_PM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_RE.dat b/venv/Lib/site-packages/babel/locale-data/fr_RE.dat new file mode 100644 index 0000000..a0e1e15 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_RE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_RW.dat b/venv/Lib/site-packages/babel/locale-data/fr_RW.dat new file mode 100644 index 0000000..6739c52 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_RW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_SC.dat b/venv/Lib/site-packages/babel/locale-data/fr_SC.dat new file mode 100644 index 0000000..1fedefe Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_SC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_SN.dat b/venv/Lib/site-packages/babel/locale-data/fr_SN.dat new file mode 100644 index 0000000..f866e2d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_SN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_SY.dat b/venv/Lib/site-packages/babel/locale-data/fr_SY.dat new file mode 100644 index 0000000..8dd5396 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_SY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_TD.dat b/venv/Lib/site-packages/babel/locale-data/fr_TD.dat new file mode 100644 index 0000000..6abebab Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_TD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_TG.dat b/venv/Lib/site-packages/babel/locale-data/fr_TG.dat new file mode 100644 index 0000000..9395eaa Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_TG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_TN.dat b/venv/Lib/site-packages/babel/locale-data/fr_TN.dat new file mode 100644 index 0000000..bf1e551 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_TN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_VU.dat b/venv/Lib/site-packages/babel/locale-data/fr_VU.dat new file mode 100644 index 0000000..f29eeed Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_VU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_WF.dat b/venv/Lib/site-packages/babel/locale-data/fr_WF.dat new file mode 100644 index 0000000..2d38ac6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_WF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fr_YT.dat b/venv/Lib/site-packages/babel/locale-data/fr_YT.dat new file mode 100644 index 0000000..9e9ba28 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fr_YT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/frr.dat b/venv/Lib/site-packages/babel/locale-data/frr.dat new file mode 100644 index 0000000..cc9f1e5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/frr.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/frr_DE.dat b/venv/Lib/site-packages/babel/locale-data/frr_DE.dat new file mode 100644 index 0000000..ecab330 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/frr_DE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fur.dat b/venv/Lib/site-packages/babel/locale-data/fur.dat new file mode 100644 index 0000000..822b2af Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fur.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fur_IT.dat b/venv/Lib/site-packages/babel/locale-data/fur_IT.dat new file mode 100644 index 0000000..2c40e5c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fur_IT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fy.dat b/venv/Lib/site-packages/babel/locale-data/fy.dat new file mode 100644 index 0000000..73130b7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fy.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/fy_NL.dat b/venv/Lib/site-packages/babel/locale-data/fy_NL.dat new file mode 100644 index 0000000..1a8f581 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/fy_NL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ga.dat b/venv/Lib/site-packages/babel/locale-data/ga.dat new file mode 100644 index 0000000..c3b6dc5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ga.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ga_GB.dat b/venv/Lib/site-packages/babel/locale-data/ga_GB.dat new file mode 100644 index 0000000..7432317 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ga_GB.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ga_IE.dat b/venv/Lib/site-packages/babel/locale-data/ga_IE.dat new file mode 100644 index 0000000..422b05a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ga_IE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gaa.dat b/venv/Lib/site-packages/babel/locale-data/gaa.dat new file mode 100644 index 0000000..82c0bd6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gaa.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gaa_GH.dat b/venv/Lib/site-packages/babel/locale-data/gaa_GH.dat new file mode 100644 index 0000000..7312993 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gaa_GH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gd.dat b/venv/Lib/site-packages/babel/locale-data/gd.dat new file mode 100644 index 0000000..1c2cc34 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gd.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gd_GB.dat b/venv/Lib/site-packages/babel/locale-data/gd_GB.dat new file mode 100644 index 0000000..e370578 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gd_GB.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gez.dat b/venv/Lib/site-packages/babel/locale-data/gez.dat new file mode 100644 index 0000000..f5bff4c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gez.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gez_ER.dat b/venv/Lib/site-packages/babel/locale-data/gez_ER.dat new file mode 100644 index 0000000..20c18a5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gez_ER.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gez_ET.dat b/venv/Lib/site-packages/babel/locale-data/gez_ET.dat new file mode 100644 index 0000000..a70d43d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gez_ET.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gl.dat b/venv/Lib/site-packages/babel/locale-data/gl.dat new file mode 100644 index 0000000..d54f398 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gl_ES.dat b/venv/Lib/site-packages/babel/locale-data/gl_ES.dat new file mode 100644 index 0000000..d432bb2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gl_ES.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gn.dat b/venv/Lib/site-packages/babel/locale-data/gn.dat new file mode 100644 index 0000000..e366639 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gn_PY.dat b/venv/Lib/site-packages/babel/locale-data/gn_PY.dat new file mode 100644 index 0000000..a217cc7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gn_PY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gsw.dat b/venv/Lib/site-packages/babel/locale-data/gsw.dat new file mode 100644 index 0000000..288f78c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gsw.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gsw_CH.dat b/venv/Lib/site-packages/babel/locale-data/gsw_CH.dat new file mode 100644 index 0000000..39ed5a8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gsw_CH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gsw_FR.dat b/venv/Lib/site-packages/babel/locale-data/gsw_FR.dat new file mode 100644 index 0000000..8687c5c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gsw_FR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gsw_LI.dat b/venv/Lib/site-packages/babel/locale-data/gsw_LI.dat new file mode 100644 index 0000000..2e72e06 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gsw_LI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gu.dat b/venv/Lib/site-packages/babel/locale-data/gu.dat new file mode 100644 index 0000000..4019e32 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gu.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gu_IN.dat b/venv/Lib/site-packages/babel/locale-data/gu_IN.dat new file mode 100644 index 0000000..a7071f7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gu_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/guz.dat b/venv/Lib/site-packages/babel/locale-data/guz.dat new file mode 100644 index 0000000..a1ddd31 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/guz.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/guz_KE.dat b/venv/Lib/site-packages/babel/locale-data/guz_KE.dat new file mode 100644 index 0000000..3b2c102 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/guz_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gv.dat b/venv/Lib/site-packages/babel/locale-data/gv.dat new file mode 100644 index 0000000..941fe04 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gv.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/gv_IM.dat b/venv/Lib/site-packages/babel/locale-data/gv_IM.dat new file mode 100644 index 0000000..0793d83 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/gv_IM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ha.dat b/venv/Lib/site-packages/babel/locale-data/ha.dat new file mode 100644 index 0000000..e482b89 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ha.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ha_Arab.dat b/venv/Lib/site-packages/babel/locale-data/ha_Arab.dat new file mode 100644 index 0000000..bdcdea8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ha_Arab.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ha_Arab_NG.dat b/venv/Lib/site-packages/babel/locale-data/ha_Arab_NG.dat new file mode 100644 index 0000000..0a98ac8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ha_Arab_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ha_Arab_SD.dat b/venv/Lib/site-packages/babel/locale-data/ha_Arab_SD.dat new file mode 100644 index 0000000..e33c2b3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ha_Arab_SD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ha_GH.dat b/venv/Lib/site-packages/babel/locale-data/ha_GH.dat new file mode 100644 index 0000000..74d5780 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ha_GH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ha_NE.dat b/venv/Lib/site-packages/babel/locale-data/ha_NE.dat new file mode 100644 index 0000000..5659053 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ha_NE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ha_NG.dat b/venv/Lib/site-packages/babel/locale-data/ha_NG.dat new file mode 100644 index 0000000..0a98ac8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ha_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/haw.dat b/venv/Lib/site-packages/babel/locale-data/haw.dat new file mode 100644 index 0000000..3fd0af6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/haw.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/haw_US.dat b/venv/Lib/site-packages/babel/locale-data/haw_US.dat new file mode 100644 index 0000000..18706f1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/haw_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/he.dat b/venv/Lib/site-packages/babel/locale-data/he.dat new file mode 100644 index 0000000..0f34440 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/he.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/he_IL.dat b/venv/Lib/site-packages/babel/locale-data/he_IL.dat new file mode 100644 index 0000000..3a0da6c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/he_IL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hi.dat b/venv/Lib/site-packages/babel/locale-data/hi.dat new file mode 100644 index 0000000..903d4d0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hi.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hi_IN.dat b/venv/Lib/site-packages/babel/locale-data/hi_IN.dat new file mode 100644 index 0000000..9fbfd57 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hi_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hi_Latn.dat b/venv/Lib/site-packages/babel/locale-data/hi_Latn.dat new file mode 100644 index 0000000..3fcf12d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hi_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hi_Latn_IN.dat b/venv/Lib/site-packages/babel/locale-data/hi_Latn_IN.dat new file mode 100644 index 0000000..9fbfd57 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hi_Latn_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hnj.dat b/venv/Lib/site-packages/babel/locale-data/hnj.dat new file mode 100644 index 0000000..38725bc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hnj.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hnj_Hmnp.dat b/venv/Lib/site-packages/babel/locale-data/hnj_Hmnp.dat new file mode 100644 index 0000000..c8935a2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hnj_Hmnp.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hnj_Hmnp_US.dat b/venv/Lib/site-packages/babel/locale-data/hnj_Hmnp_US.dat new file mode 100644 index 0000000..46c3714 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hnj_Hmnp_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hr.dat b/venv/Lib/site-packages/babel/locale-data/hr.dat new file mode 100644 index 0000000..219b166 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hr.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hr_BA.dat b/venv/Lib/site-packages/babel/locale-data/hr_BA.dat new file mode 100644 index 0000000..44129ab Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hr_BA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hr_HR.dat b/venv/Lib/site-packages/babel/locale-data/hr_HR.dat new file mode 100644 index 0000000..a0ae43d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hr_HR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hsb.dat b/venv/Lib/site-packages/babel/locale-data/hsb.dat new file mode 100644 index 0000000..c326e85 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hsb.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hsb_DE.dat b/venv/Lib/site-packages/babel/locale-data/hsb_DE.dat new file mode 100644 index 0000000..5de4a2c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hsb_DE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hu.dat b/venv/Lib/site-packages/babel/locale-data/hu.dat new file mode 100644 index 0000000..975c7d1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hu.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hu_HU.dat b/venv/Lib/site-packages/babel/locale-data/hu_HU.dat new file mode 100644 index 0000000..113faed Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hu_HU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hy.dat b/venv/Lib/site-packages/babel/locale-data/hy.dat new file mode 100644 index 0000000..482f1da Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hy.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/hy_AM.dat b/venv/Lib/site-packages/babel/locale-data/hy_AM.dat new file mode 100644 index 0000000..fa2eaf7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/hy_AM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ia.dat b/venv/Lib/site-packages/babel/locale-data/ia.dat new file mode 100644 index 0000000..9970a20 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ia.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ia_001.dat b/venv/Lib/site-packages/babel/locale-data/ia_001.dat new file mode 100644 index 0000000..b0a1770 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ia_001.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/id.dat b/venv/Lib/site-packages/babel/locale-data/id.dat new file mode 100644 index 0000000..b4336f1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/id.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/id_ID.dat b/venv/Lib/site-packages/babel/locale-data/id_ID.dat new file mode 100644 index 0000000..cf7c8e5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/id_ID.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ig.dat b/venv/Lib/site-packages/babel/locale-data/ig.dat new file mode 100644 index 0000000..1560c06 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ig.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ig_NG.dat b/venv/Lib/site-packages/babel/locale-data/ig_NG.dat new file mode 100644 index 0000000..4b5635b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ig_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ii.dat b/venv/Lib/site-packages/babel/locale-data/ii.dat new file mode 100644 index 0000000..9603535 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ii.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ii_CN.dat b/venv/Lib/site-packages/babel/locale-data/ii_CN.dat new file mode 100644 index 0000000..ef6effa Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ii_CN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/io.dat b/venv/Lib/site-packages/babel/locale-data/io.dat new file mode 100644 index 0000000..33aa1fa Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/io.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/io_001.dat b/venv/Lib/site-packages/babel/locale-data/io_001.dat new file mode 100644 index 0000000..964a6ab Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/io_001.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/is.dat b/venv/Lib/site-packages/babel/locale-data/is.dat new file mode 100644 index 0000000..e8f47e9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/is.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/is_IS.dat b/venv/Lib/site-packages/babel/locale-data/is_IS.dat new file mode 100644 index 0000000..b3649a7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/is_IS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/it.dat b/venv/Lib/site-packages/babel/locale-data/it.dat new file mode 100644 index 0000000..b8781f2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/it.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/it_CH.dat b/venv/Lib/site-packages/babel/locale-data/it_CH.dat new file mode 100644 index 0000000..cddfb6b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/it_CH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/it_IT.dat b/venv/Lib/site-packages/babel/locale-data/it_IT.dat new file mode 100644 index 0000000..b9a944a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/it_IT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/it_SM.dat b/venv/Lib/site-packages/babel/locale-data/it_SM.dat new file mode 100644 index 0000000..db8432a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/it_SM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/it_VA.dat b/venv/Lib/site-packages/babel/locale-data/it_VA.dat new file mode 100644 index 0000000..30ecca0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/it_VA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/iu.dat b/venv/Lib/site-packages/babel/locale-data/iu.dat new file mode 100644 index 0000000..d09fb97 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/iu.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/iu_CA.dat b/venv/Lib/site-packages/babel/locale-data/iu_CA.dat new file mode 100644 index 0000000..61bb544 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/iu_CA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/iu_Latn.dat b/venv/Lib/site-packages/babel/locale-data/iu_Latn.dat new file mode 100644 index 0000000..f776f97 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/iu_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/iu_Latn_CA.dat b/venv/Lib/site-packages/babel/locale-data/iu_Latn_CA.dat new file mode 100644 index 0000000..61bb544 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/iu_Latn_CA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ja.dat b/venv/Lib/site-packages/babel/locale-data/ja.dat new file mode 100644 index 0000000..aba3d1c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ja.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ja_JP.dat b/venv/Lib/site-packages/babel/locale-data/ja_JP.dat new file mode 100644 index 0000000..f0d4479 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ja_JP.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/jbo.dat b/venv/Lib/site-packages/babel/locale-data/jbo.dat new file mode 100644 index 0000000..1bf2dbb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/jbo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/jbo_001.dat b/venv/Lib/site-packages/babel/locale-data/jbo_001.dat new file mode 100644 index 0000000..dcc98ae Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/jbo_001.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/jgo.dat b/venv/Lib/site-packages/babel/locale-data/jgo.dat new file mode 100644 index 0000000..25c0407 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/jgo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/jgo_CM.dat b/venv/Lib/site-packages/babel/locale-data/jgo_CM.dat new file mode 100644 index 0000000..7a523f3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/jgo_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/jmc.dat b/venv/Lib/site-packages/babel/locale-data/jmc.dat new file mode 100644 index 0000000..5bf65fd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/jmc.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/jmc_TZ.dat b/venv/Lib/site-packages/babel/locale-data/jmc_TZ.dat new file mode 100644 index 0000000..6abba32 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/jmc_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/jv.dat b/venv/Lib/site-packages/babel/locale-data/jv.dat new file mode 100644 index 0000000..db236ce Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/jv.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/jv_ID.dat b/venv/Lib/site-packages/babel/locale-data/jv_ID.dat new file mode 100644 index 0000000..b60dc4d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/jv_ID.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ka.dat b/venv/Lib/site-packages/babel/locale-data/ka.dat new file mode 100644 index 0000000..c8a0ca0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ka.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ka_GE.dat b/venv/Lib/site-packages/babel/locale-data/ka_GE.dat new file mode 100644 index 0000000..73278fa Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ka_GE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kab.dat b/venv/Lib/site-packages/babel/locale-data/kab.dat new file mode 100644 index 0000000..7922190 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kab.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kab_DZ.dat b/venv/Lib/site-packages/babel/locale-data/kab_DZ.dat new file mode 100644 index 0000000..c0cbad8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kab_DZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kaj.dat b/venv/Lib/site-packages/babel/locale-data/kaj.dat new file mode 100644 index 0000000..67bc260 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kaj.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kaj_NG.dat b/venv/Lib/site-packages/babel/locale-data/kaj_NG.dat new file mode 100644 index 0000000..a94d6f7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kaj_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kam.dat b/venv/Lib/site-packages/babel/locale-data/kam.dat new file mode 100644 index 0000000..a1c30a8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kam.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kam_KE.dat b/venv/Lib/site-packages/babel/locale-data/kam_KE.dat new file mode 100644 index 0000000..d16ca2a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kam_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kcg.dat b/venv/Lib/site-packages/babel/locale-data/kcg.dat new file mode 100644 index 0000000..3ff14c3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kcg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kcg_NG.dat b/venv/Lib/site-packages/babel/locale-data/kcg_NG.dat new file mode 100644 index 0000000..1e6dc36 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kcg_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kde.dat b/venv/Lib/site-packages/babel/locale-data/kde.dat new file mode 100644 index 0000000..db2ff7b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kde.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kde_TZ.dat b/venv/Lib/site-packages/babel/locale-data/kde_TZ.dat new file mode 100644 index 0000000..2fcf1d4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kde_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kea.dat b/venv/Lib/site-packages/babel/locale-data/kea.dat new file mode 100644 index 0000000..b7fbcac Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kea.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kea_CV.dat b/venv/Lib/site-packages/babel/locale-data/kea_CV.dat new file mode 100644 index 0000000..da97962 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kea_CV.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ken.dat b/venv/Lib/site-packages/babel/locale-data/ken.dat new file mode 100644 index 0000000..57e91a1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ken.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ken_CM.dat b/venv/Lib/site-packages/babel/locale-data/ken_CM.dat new file mode 100644 index 0000000..9ef6180 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ken_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kgp.dat b/venv/Lib/site-packages/babel/locale-data/kgp.dat new file mode 100644 index 0000000..b0e4a7e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kgp.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kgp_BR.dat b/venv/Lib/site-packages/babel/locale-data/kgp_BR.dat new file mode 100644 index 0000000..44b499d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kgp_BR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/khq.dat b/venv/Lib/site-packages/babel/locale-data/khq.dat new file mode 100644 index 0000000..9e36027 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/khq.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/khq_ML.dat b/venv/Lib/site-packages/babel/locale-data/khq_ML.dat new file mode 100644 index 0000000..91f7da1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/khq_ML.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ki.dat b/venv/Lib/site-packages/babel/locale-data/ki.dat new file mode 100644 index 0000000..efb5caa Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ki.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ki_KE.dat b/venv/Lib/site-packages/babel/locale-data/ki_KE.dat new file mode 100644 index 0000000..901b921 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ki_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kk.dat b/venv/Lib/site-packages/babel/locale-data/kk.dat new file mode 100644 index 0000000..a38583a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kk.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kk_KZ.dat b/venv/Lib/site-packages/babel/locale-data/kk_KZ.dat new file mode 100644 index 0000000..ca827ac Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kk_KZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kkj.dat b/venv/Lib/site-packages/babel/locale-data/kkj.dat new file mode 100644 index 0000000..7ae3bf5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kkj.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kkj_CM.dat b/venv/Lib/site-packages/babel/locale-data/kkj_CM.dat new file mode 100644 index 0000000..231f08b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kkj_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kl.dat b/venv/Lib/site-packages/babel/locale-data/kl.dat new file mode 100644 index 0000000..863fc63 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kl_GL.dat b/venv/Lib/site-packages/babel/locale-data/kl_GL.dat new file mode 100644 index 0000000..a8fb28d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kl_GL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kln.dat b/venv/Lib/site-packages/babel/locale-data/kln.dat new file mode 100644 index 0000000..a00bdce Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kln.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kln_KE.dat b/venv/Lib/site-packages/babel/locale-data/kln_KE.dat new file mode 100644 index 0000000..9a12beb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kln_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/km.dat b/venv/Lib/site-packages/babel/locale-data/km.dat new file mode 100644 index 0000000..7f92f72 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/km.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/km_KH.dat b/venv/Lib/site-packages/babel/locale-data/km_KH.dat new file mode 100644 index 0000000..2ccaba6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/km_KH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kn.dat b/venv/Lib/site-packages/babel/locale-data/kn.dat new file mode 100644 index 0000000..bc2e29a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kn_IN.dat b/venv/Lib/site-packages/babel/locale-data/kn_IN.dat new file mode 100644 index 0000000..1f0d646 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kn_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ko.dat b/venv/Lib/site-packages/babel/locale-data/ko.dat new file mode 100644 index 0000000..29ad5d9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ko.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ko_KP.dat b/venv/Lib/site-packages/babel/locale-data/ko_KP.dat new file mode 100644 index 0000000..7c76309 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ko_KP.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ko_KR.dat b/venv/Lib/site-packages/babel/locale-data/ko_KR.dat new file mode 100644 index 0000000..4af3b62 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ko_KR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kok.dat b/venv/Lib/site-packages/babel/locale-data/kok.dat new file mode 100644 index 0000000..2df8d27 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kok.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kok_IN.dat b/venv/Lib/site-packages/babel/locale-data/kok_IN.dat new file mode 100644 index 0000000..8fff8b1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kok_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kpe.dat b/venv/Lib/site-packages/babel/locale-data/kpe.dat new file mode 100644 index 0000000..48cf0bf Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kpe.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kpe_GN.dat b/venv/Lib/site-packages/babel/locale-data/kpe_GN.dat new file mode 100644 index 0000000..d333167 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kpe_GN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kpe_LR.dat b/venv/Lib/site-packages/babel/locale-data/kpe_LR.dat new file mode 100644 index 0000000..8afe47b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kpe_LR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ks.dat b/venv/Lib/site-packages/babel/locale-data/ks.dat new file mode 100644 index 0000000..a7a0748 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ks.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ks_Arab.dat b/venv/Lib/site-packages/babel/locale-data/ks_Arab.dat new file mode 100644 index 0000000..6441efe Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ks_Arab.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ks_Arab_IN.dat b/venv/Lib/site-packages/babel/locale-data/ks_Arab_IN.dat new file mode 100644 index 0000000..02a5d11 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ks_Arab_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ks_Deva.dat b/venv/Lib/site-packages/babel/locale-data/ks_Deva.dat new file mode 100644 index 0000000..853316e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ks_Deva.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ks_Deva_IN.dat b/venv/Lib/site-packages/babel/locale-data/ks_Deva_IN.dat new file mode 100644 index 0000000..02a5d11 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ks_Deva_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ksb.dat b/venv/Lib/site-packages/babel/locale-data/ksb.dat new file mode 100644 index 0000000..3decf72 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ksb.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ksb_TZ.dat b/venv/Lib/site-packages/babel/locale-data/ksb_TZ.dat new file mode 100644 index 0000000..6837e37 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ksb_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ksf.dat b/venv/Lib/site-packages/babel/locale-data/ksf.dat new file mode 100644 index 0000000..98746ae Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ksf.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ksf_CM.dat b/venv/Lib/site-packages/babel/locale-data/ksf_CM.dat new file mode 100644 index 0000000..fc29c49 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ksf_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ksh.dat b/venv/Lib/site-packages/babel/locale-data/ksh.dat new file mode 100644 index 0000000..c06a08b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ksh.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ksh_DE.dat b/venv/Lib/site-packages/babel/locale-data/ksh_DE.dat new file mode 100644 index 0000000..9318d48 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ksh_DE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ku.dat b/venv/Lib/site-packages/babel/locale-data/ku.dat new file mode 100644 index 0000000..18e5a90 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ku.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ku_TR.dat b/venv/Lib/site-packages/babel/locale-data/ku_TR.dat new file mode 100644 index 0000000..206426a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ku_TR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kw.dat b/venv/Lib/site-packages/babel/locale-data/kw.dat new file mode 100644 index 0000000..7e99278 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kw.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/kw_GB.dat b/venv/Lib/site-packages/babel/locale-data/kw_GB.dat new file mode 100644 index 0000000..da81c10 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/kw_GB.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ky.dat b/venv/Lib/site-packages/babel/locale-data/ky.dat new file mode 100644 index 0000000..28edfd8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ky.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ky_KG.dat b/venv/Lib/site-packages/babel/locale-data/ky_KG.dat new file mode 100644 index 0000000..c61073f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ky_KG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/la.dat b/venv/Lib/site-packages/babel/locale-data/la.dat new file mode 100644 index 0000000..317352e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/la.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/la_VA.dat b/venv/Lib/site-packages/babel/locale-data/la_VA.dat new file mode 100644 index 0000000..31a68ac Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/la_VA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lag.dat b/venv/Lib/site-packages/babel/locale-data/lag.dat new file mode 100644 index 0000000..ec02033 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lag.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lag_TZ.dat b/venv/Lib/site-packages/babel/locale-data/lag_TZ.dat new file mode 100644 index 0000000..7893a0e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lag_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lb.dat b/venv/Lib/site-packages/babel/locale-data/lb.dat new file mode 100644 index 0000000..6811fff Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lb.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lb_LU.dat b/venv/Lib/site-packages/babel/locale-data/lb_LU.dat new file mode 100644 index 0000000..bcb5653 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lb_LU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lg.dat b/venv/Lib/site-packages/babel/locale-data/lg.dat new file mode 100644 index 0000000..b7179b3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lg_UG.dat b/venv/Lib/site-packages/babel/locale-data/lg_UG.dat new file mode 100644 index 0000000..6ee321d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lg_UG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lij.dat b/venv/Lib/site-packages/babel/locale-data/lij.dat new file mode 100644 index 0000000..86f8324 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lij.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lij_IT.dat b/venv/Lib/site-packages/babel/locale-data/lij_IT.dat new file mode 100644 index 0000000..6969b52 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lij_IT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lkt.dat b/venv/Lib/site-packages/babel/locale-data/lkt.dat new file mode 100644 index 0000000..0be8aeb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lkt.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lkt_US.dat b/venv/Lib/site-packages/babel/locale-data/lkt_US.dat new file mode 100644 index 0000000..44a5969 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lkt_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lmo.dat b/venv/Lib/site-packages/babel/locale-data/lmo.dat new file mode 100644 index 0000000..c7388c7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lmo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lmo_IT.dat b/venv/Lib/site-packages/babel/locale-data/lmo_IT.dat new file mode 100644 index 0000000..50dd592 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lmo_IT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ln.dat b/venv/Lib/site-packages/babel/locale-data/ln.dat new file mode 100644 index 0000000..83cb9b2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ln.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ln_AO.dat b/venv/Lib/site-packages/babel/locale-data/ln_AO.dat new file mode 100644 index 0000000..60dd0ba Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ln_AO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ln_CD.dat b/venv/Lib/site-packages/babel/locale-data/ln_CD.dat new file mode 100644 index 0000000..b87aad7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ln_CD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ln_CF.dat b/venv/Lib/site-packages/babel/locale-data/ln_CF.dat new file mode 100644 index 0000000..b5a9a82 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ln_CF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ln_CG.dat b/venv/Lib/site-packages/babel/locale-data/ln_CG.dat new file mode 100644 index 0000000..4059b36 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ln_CG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lo.dat b/venv/Lib/site-packages/babel/locale-data/lo.dat new file mode 100644 index 0000000..1b71bc4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lo_LA.dat b/venv/Lib/site-packages/babel/locale-data/lo_LA.dat new file mode 100644 index 0000000..6f12ab5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lo_LA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lrc.dat b/venv/Lib/site-packages/babel/locale-data/lrc.dat new file mode 100644 index 0000000..52755df Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lrc.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lrc_IQ.dat b/venv/Lib/site-packages/babel/locale-data/lrc_IQ.dat new file mode 100644 index 0000000..b7fdaf2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lrc_IQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lrc_IR.dat b/venv/Lib/site-packages/babel/locale-data/lrc_IR.dat new file mode 100644 index 0000000..75d8975 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lrc_IR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lt.dat b/venv/Lib/site-packages/babel/locale-data/lt.dat new file mode 100644 index 0000000..34cc4c7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lt.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lt_LT.dat b/venv/Lib/site-packages/babel/locale-data/lt_LT.dat new file mode 100644 index 0000000..abd28f7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lt_LT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lu.dat b/venv/Lib/site-packages/babel/locale-data/lu.dat new file mode 100644 index 0000000..edac3a7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lu.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lu_CD.dat b/venv/Lib/site-packages/babel/locale-data/lu_CD.dat new file mode 100644 index 0000000..b2f405c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lu_CD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/luo.dat b/venv/Lib/site-packages/babel/locale-data/luo.dat new file mode 100644 index 0000000..e9f3404 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/luo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/luo_KE.dat b/venv/Lib/site-packages/babel/locale-data/luo_KE.dat new file mode 100644 index 0000000..9ad4a6a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/luo_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/luy.dat b/venv/Lib/site-packages/babel/locale-data/luy.dat new file mode 100644 index 0000000..6528d2d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/luy.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/luy_KE.dat b/venv/Lib/site-packages/babel/locale-data/luy_KE.dat new file mode 100644 index 0000000..e1b346e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/luy_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lv.dat b/venv/Lib/site-packages/babel/locale-data/lv.dat new file mode 100644 index 0000000..1f37266 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lv.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/lv_LV.dat b/venv/Lib/site-packages/babel/locale-data/lv_LV.dat new file mode 100644 index 0000000..37bb4e2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/lv_LV.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mai.dat b/venv/Lib/site-packages/babel/locale-data/mai.dat new file mode 100644 index 0000000..8a7807e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mai.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mai_IN.dat b/venv/Lib/site-packages/babel/locale-data/mai_IN.dat new file mode 100644 index 0000000..288b92f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mai_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mas.dat b/venv/Lib/site-packages/babel/locale-data/mas.dat new file mode 100644 index 0000000..e12dcc6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mas.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mas_KE.dat b/venv/Lib/site-packages/babel/locale-data/mas_KE.dat new file mode 100644 index 0000000..b264c83 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mas_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mas_TZ.dat b/venv/Lib/site-packages/babel/locale-data/mas_TZ.dat new file mode 100644 index 0000000..d5c71c3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mas_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mdf.dat b/venv/Lib/site-packages/babel/locale-data/mdf.dat new file mode 100644 index 0000000..157aaae Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mdf.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mdf_RU.dat b/venv/Lib/site-packages/babel/locale-data/mdf_RU.dat new file mode 100644 index 0000000..9457135 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mdf_RU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mer.dat b/venv/Lib/site-packages/babel/locale-data/mer.dat new file mode 100644 index 0000000..5c3aa79 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mer.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mer_KE.dat b/venv/Lib/site-packages/babel/locale-data/mer_KE.dat new file mode 100644 index 0000000..a7c286f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mer_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mfe.dat b/venv/Lib/site-packages/babel/locale-data/mfe.dat new file mode 100644 index 0000000..6f765b4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mfe.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mfe_MU.dat b/venv/Lib/site-packages/babel/locale-data/mfe_MU.dat new file mode 100644 index 0000000..2f4715b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mfe_MU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mg.dat b/venv/Lib/site-packages/babel/locale-data/mg.dat new file mode 100644 index 0000000..8a1f12d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mg_MG.dat b/venv/Lib/site-packages/babel/locale-data/mg_MG.dat new file mode 100644 index 0000000..9e18e6c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mg_MG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mgh.dat b/venv/Lib/site-packages/babel/locale-data/mgh.dat new file mode 100644 index 0000000..56ab195 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mgh.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mgh_MZ.dat b/venv/Lib/site-packages/babel/locale-data/mgh_MZ.dat new file mode 100644 index 0000000..999e8ef Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mgh_MZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mgo.dat b/venv/Lib/site-packages/babel/locale-data/mgo.dat new file mode 100644 index 0000000..e3f9ace Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mgo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mgo_CM.dat b/venv/Lib/site-packages/babel/locale-data/mgo_CM.dat new file mode 100644 index 0000000..667c017 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mgo_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mi.dat b/venv/Lib/site-packages/babel/locale-data/mi.dat new file mode 100644 index 0000000..f52e31c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mi.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mi_NZ.dat b/venv/Lib/site-packages/babel/locale-data/mi_NZ.dat new file mode 100644 index 0000000..7c8b4d1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mi_NZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mk.dat b/venv/Lib/site-packages/babel/locale-data/mk.dat new file mode 100644 index 0000000..f8c83a7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mk.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mk_MK.dat b/venv/Lib/site-packages/babel/locale-data/mk_MK.dat new file mode 100644 index 0000000..33207d9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mk_MK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ml.dat b/venv/Lib/site-packages/babel/locale-data/ml.dat new file mode 100644 index 0000000..87cb5fe Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ml.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ml_IN.dat b/venv/Lib/site-packages/babel/locale-data/ml_IN.dat new file mode 100644 index 0000000..5f89f11 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ml_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mn.dat b/venv/Lib/site-packages/babel/locale-data/mn.dat new file mode 100644 index 0000000..1a455c8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mn_MN.dat b/venv/Lib/site-packages/babel/locale-data/mn_MN.dat new file mode 100644 index 0000000..096cb10 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mn_MN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mn_Mong.dat b/venv/Lib/site-packages/babel/locale-data/mn_Mong.dat new file mode 100644 index 0000000..2861203 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mn_Mong.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mn_Mong_CN.dat b/venv/Lib/site-packages/babel/locale-data/mn_Mong_CN.dat new file mode 100644 index 0000000..284cbee Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mn_Mong_CN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mn_Mong_MN.dat b/venv/Lib/site-packages/babel/locale-data/mn_Mong_MN.dat new file mode 100644 index 0000000..ae48b56 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mn_Mong_MN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mni.dat b/venv/Lib/site-packages/babel/locale-data/mni.dat new file mode 100644 index 0000000..4f38486 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mni.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mni_Beng.dat b/venv/Lib/site-packages/babel/locale-data/mni_Beng.dat new file mode 100644 index 0000000..de357a8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mni_Beng.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mni_Beng_IN.dat b/venv/Lib/site-packages/babel/locale-data/mni_Beng_IN.dat new file mode 100644 index 0000000..28787cc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mni_Beng_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mni_Mtei.dat b/venv/Lib/site-packages/babel/locale-data/mni_Mtei.dat new file mode 100644 index 0000000..654042f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mni_Mtei.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mni_Mtei_IN.dat b/venv/Lib/site-packages/babel/locale-data/mni_Mtei_IN.dat new file mode 100644 index 0000000..28787cc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mni_Mtei_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/moh.dat b/venv/Lib/site-packages/babel/locale-data/moh.dat new file mode 100644 index 0000000..78edd4a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/moh.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/moh_CA.dat b/venv/Lib/site-packages/babel/locale-data/moh_CA.dat new file mode 100644 index 0000000..ba2edde Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/moh_CA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mr.dat b/venv/Lib/site-packages/babel/locale-data/mr.dat new file mode 100644 index 0000000..eda41b0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mr.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mr_IN.dat b/venv/Lib/site-packages/babel/locale-data/mr_IN.dat new file mode 100644 index 0000000..a57af72 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mr_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ms.dat b/venv/Lib/site-packages/babel/locale-data/ms.dat new file mode 100644 index 0000000..05659ec Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ms.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ms_Arab.dat b/venv/Lib/site-packages/babel/locale-data/ms_Arab.dat new file mode 100644 index 0000000..217e850 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ms_Arab.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ms_Arab_BN.dat b/venv/Lib/site-packages/babel/locale-data/ms_Arab_BN.dat new file mode 100644 index 0000000..1785baa Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ms_Arab_BN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ms_Arab_MY.dat b/venv/Lib/site-packages/babel/locale-data/ms_Arab_MY.dat new file mode 100644 index 0000000..5df0cb7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ms_Arab_MY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ms_BN.dat b/venv/Lib/site-packages/babel/locale-data/ms_BN.dat new file mode 100644 index 0000000..b90a651 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ms_BN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ms_ID.dat b/venv/Lib/site-packages/babel/locale-data/ms_ID.dat new file mode 100644 index 0000000..3f0a56f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ms_ID.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ms_MY.dat b/venv/Lib/site-packages/babel/locale-data/ms_MY.dat new file mode 100644 index 0000000..5df0cb7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ms_MY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ms_SG.dat b/venv/Lib/site-packages/babel/locale-data/ms_SG.dat new file mode 100644 index 0000000..3320511 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ms_SG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mt.dat b/venv/Lib/site-packages/babel/locale-data/mt.dat new file mode 100644 index 0000000..46f77b4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mt.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mt_MT.dat b/venv/Lib/site-packages/babel/locale-data/mt_MT.dat new file mode 100644 index 0000000..9f4731e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mt_MT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mua.dat b/venv/Lib/site-packages/babel/locale-data/mua.dat new file mode 100644 index 0000000..eab7ace Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mua.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mua_CM.dat b/venv/Lib/site-packages/babel/locale-data/mua_CM.dat new file mode 100644 index 0000000..5b71a89 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mua_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mus.dat b/venv/Lib/site-packages/babel/locale-data/mus.dat new file mode 100644 index 0000000..04a16d5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mus.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mus_US.dat b/venv/Lib/site-packages/babel/locale-data/mus_US.dat new file mode 100644 index 0000000..a506b8b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mus_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/my.dat b/venv/Lib/site-packages/babel/locale-data/my.dat new file mode 100644 index 0000000..64bef12 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/my.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/my_MM.dat b/venv/Lib/site-packages/babel/locale-data/my_MM.dat new file mode 100644 index 0000000..33bc911 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/my_MM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/myv.dat b/venv/Lib/site-packages/babel/locale-data/myv.dat new file mode 100644 index 0000000..1223bb6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/myv.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/myv_RU.dat b/venv/Lib/site-packages/babel/locale-data/myv_RU.dat new file mode 100644 index 0000000..de64fee Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/myv_RU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mzn.dat b/venv/Lib/site-packages/babel/locale-data/mzn.dat new file mode 100644 index 0000000..10c083a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mzn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/mzn_IR.dat b/venv/Lib/site-packages/babel/locale-data/mzn_IR.dat new file mode 100644 index 0000000..7399074 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/mzn_IR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/naq.dat b/venv/Lib/site-packages/babel/locale-data/naq.dat new file mode 100644 index 0000000..89e5ec0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/naq.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/naq_NA.dat b/venv/Lib/site-packages/babel/locale-data/naq_NA.dat new file mode 100644 index 0000000..82c109a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/naq_NA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nb.dat b/venv/Lib/site-packages/babel/locale-data/nb.dat new file mode 100644 index 0000000..5abc253 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nb.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nb_NO.dat b/venv/Lib/site-packages/babel/locale-data/nb_NO.dat new file mode 100644 index 0000000..fc57a39 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nb_NO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nb_SJ.dat b/venv/Lib/site-packages/babel/locale-data/nb_SJ.dat new file mode 100644 index 0000000..9af3a27 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nb_SJ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nd.dat b/venv/Lib/site-packages/babel/locale-data/nd.dat new file mode 100644 index 0000000..8a551e1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nd.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nd_ZW.dat b/venv/Lib/site-packages/babel/locale-data/nd_ZW.dat new file mode 100644 index 0000000..bb86d3f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nd_ZW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nds.dat b/venv/Lib/site-packages/babel/locale-data/nds.dat new file mode 100644 index 0000000..21495c5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nds.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nds_DE.dat b/venv/Lib/site-packages/babel/locale-data/nds_DE.dat new file mode 100644 index 0000000..771fba3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nds_DE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nds_NL.dat b/venv/Lib/site-packages/babel/locale-data/nds_NL.dat new file mode 100644 index 0000000..14b9b12 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nds_NL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ne.dat b/venv/Lib/site-packages/babel/locale-data/ne.dat new file mode 100644 index 0000000..35e0027 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ne.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ne_IN.dat b/venv/Lib/site-packages/babel/locale-data/ne_IN.dat new file mode 100644 index 0000000..647efe6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ne_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ne_NP.dat b/venv/Lib/site-packages/babel/locale-data/ne_NP.dat new file mode 100644 index 0000000..5c513db Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ne_NP.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nl.dat b/venv/Lib/site-packages/babel/locale-data/nl.dat new file mode 100644 index 0000000..7250cce Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nl_AW.dat b/venv/Lib/site-packages/babel/locale-data/nl_AW.dat new file mode 100644 index 0000000..0bd826c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nl_AW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nl_BE.dat b/venv/Lib/site-packages/babel/locale-data/nl_BE.dat new file mode 100644 index 0000000..9a73066 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nl_BE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nl_BQ.dat b/venv/Lib/site-packages/babel/locale-data/nl_BQ.dat new file mode 100644 index 0000000..8f686f7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nl_BQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nl_CW.dat b/venv/Lib/site-packages/babel/locale-data/nl_CW.dat new file mode 100644 index 0000000..ea3eb94 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nl_CW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nl_NL.dat b/venv/Lib/site-packages/babel/locale-data/nl_NL.dat new file mode 100644 index 0000000..c686473 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nl_NL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nl_SR.dat b/venv/Lib/site-packages/babel/locale-data/nl_SR.dat new file mode 100644 index 0000000..6ffb0f9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nl_SR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nl_SX.dat b/venv/Lib/site-packages/babel/locale-data/nl_SX.dat new file mode 100644 index 0000000..6932aa1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nl_SX.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nmg.dat b/venv/Lib/site-packages/babel/locale-data/nmg.dat new file mode 100644 index 0000000..a6c3f0c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nmg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nmg_CM.dat b/venv/Lib/site-packages/babel/locale-data/nmg_CM.dat new file mode 100644 index 0000000..f675485 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nmg_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nn.dat b/venv/Lib/site-packages/babel/locale-data/nn.dat new file mode 100644 index 0000000..f61b4dd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nn_NO.dat b/venv/Lib/site-packages/babel/locale-data/nn_NO.dat new file mode 100644 index 0000000..0e233b7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nn_NO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nnh.dat b/venv/Lib/site-packages/babel/locale-data/nnh.dat new file mode 100644 index 0000000..b9d9d57 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nnh.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nnh_CM.dat b/venv/Lib/site-packages/babel/locale-data/nnh_CM.dat new file mode 100644 index 0000000..7722c09 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nnh_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/no.dat b/venv/Lib/site-packages/babel/locale-data/no.dat new file mode 100644 index 0000000..cb22219 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/no.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nqo.dat b/venv/Lib/site-packages/babel/locale-data/nqo.dat new file mode 100644 index 0000000..2d27e6c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nqo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nqo_GN.dat b/venv/Lib/site-packages/babel/locale-data/nqo_GN.dat new file mode 100644 index 0000000..3cdbcbc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nqo_GN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nr.dat b/venv/Lib/site-packages/babel/locale-data/nr.dat new file mode 100644 index 0000000..51e2354 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nr.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nr_ZA.dat b/venv/Lib/site-packages/babel/locale-data/nr_ZA.dat new file mode 100644 index 0000000..ff0ba0b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nr_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nso.dat b/venv/Lib/site-packages/babel/locale-data/nso.dat new file mode 100644 index 0000000..e8bb1b9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nso.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nso_ZA.dat b/venv/Lib/site-packages/babel/locale-data/nso_ZA.dat new file mode 100644 index 0000000..42f9efc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nso_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nus.dat b/venv/Lib/site-packages/babel/locale-data/nus.dat new file mode 100644 index 0000000..1b74af0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nus.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nus_SS.dat b/venv/Lib/site-packages/babel/locale-data/nus_SS.dat new file mode 100644 index 0000000..b8b8657 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nus_SS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nv.dat b/venv/Lib/site-packages/babel/locale-data/nv.dat new file mode 100644 index 0000000..b4fce41 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nv.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nv_US.dat b/venv/Lib/site-packages/babel/locale-data/nv_US.dat new file mode 100644 index 0000000..2c78aa7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nv_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ny.dat b/venv/Lib/site-packages/babel/locale-data/ny.dat new file mode 100644 index 0000000..e1fc061 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ny.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ny_MW.dat b/venv/Lib/site-packages/babel/locale-data/ny_MW.dat new file mode 100644 index 0000000..0039255 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ny_MW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nyn.dat b/venv/Lib/site-packages/babel/locale-data/nyn.dat new file mode 100644 index 0000000..68bbd3c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nyn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/nyn_UG.dat b/venv/Lib/site-packages/babel/locale-data/nyn_UG.dat new file mode 100644 index 0000000..2e51c77 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/nyn_UG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/oc.dat b/venv/Lib/site-packages/babel/locale-data/oc.dat new file mode 100644 index 0000000..2d5adcb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/oc.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/oc_ES.dat b/venv/Lib/site-packages/babel/locale-data/oc_ES.dat new file mode 100644 index 0000000..310fd55 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/oc_ES.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/oc_FR.dat b/venv/Lib/site-packages/babel/locale-data/oc_FR.dat new file mode 100644 index 0000000..613abbe Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/oc_FR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/om.dat b/venv/Lib/site-packages/babel/locale-data/om.dat new file mode 100644 index 0000000..54ad3cd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/om.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/om_ET.dat b/venv/Lib/site-packages/babel/locale-data/om_ET.dat new file mode 100644 index 0000000..82c438b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/om_ET.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/om_KE.dat b/venv/Lib/site-packages/babel/locale-data/om_KE.dat new file mode 100644 index 0000000..53fde2b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/om_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/or.dat b/venv/Lib/site-packages/babel/locale-data/or.dat new file mode 100644 index 0000000..bff9ed5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/or.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/or_IN.dat b/venv/Lib/site-packages/babel/locale-data/or_IN.dat new file mode 100644 index 0000000..12b4f1b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/or_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/os.dat b/venv/Lib/site-packages/babel/locale-data/os.dat new file mode 100644 index 0000000..ab39521 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/os.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/os_GE.dat b/venv/Lib/site-packages/babel/locale-data/os_GE.dat new file mode 100644 index 0000000..205ddbf Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/os_GE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/os_RU.dat b/venv/Lib/site-packages/babel/locale-data/os_RU.dat new file mode 100644 index 0000000..f51d3d9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/os_RU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/osa.dat b/venv/Lib/site-packages/babel/locale-data/osa.dat new file mode 100644 index 0000000..7c2832b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/osa.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/osa_US.dat b/venv/Lib/site-packages/babel/locale-data/osa_US.dat new file mode 100644 index 0000000..03c1100 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/osa_US.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pa.dat b/venv/Lib/site-packages/babel/locale-data/pa.dat new file mode 100644 index 0000000..f7e25fd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pa.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pa_Arab.dat b/venv/Lib/site-packages/babel/locale-data/pa_Arab.dat new file mode 100644 index 0000000..99f9c5f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pa_Arab.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pa_Arab_PK.dat b/venv/Lib/site-packages/babel/locale-data/pa_Arab_PK.dat new file mode 100644 index 0000000..eefdeba Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pa_Arab_PK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pa_Guru.dat b/venv/Lib/site-packages/babel/locale-data/pa_Guru.dat new file mode 100644 index 0000000..ed8c6b6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pa_Guru.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pa_Guru_IN.dat b/venv/Lib/site-packages/babel/locale-data/pa_Guru_IN.dat new file mode 100644 index 0000000..6af3517 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pa_Guru_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pap.dat b/venv/Lib/site-packages/babel/locale-data/pap.dat new file mode 100644 index 0000000..a4cfdaf Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pap.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pap_AW.dat b/venv/Lib/site-packages/babel/locale-data/pap_AW.dat new file mode 100644 index 0000000..973cc76 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pap_AW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pap_CW.dat b/venv/Lib/site-packages/babel/locale-data/pap_CW.dat new file mode 100644 index 0000000..3c481d4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pap_CW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pcm.dat b/venv/Lib/site-packages/babel/locale-data/pcm.dat new file mode 100644 index 0000000..646a727 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pcm.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pcm_NG.dat b/venv/Lib/site-packages/babel/locale-data/pcm_NG.dat new file mode 100644 index 0000000..7ee8274 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pcm_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pis.dat b/venv/Lib/site-packages/babel/locale-data/pis.dat new file mode 100644 index 0000000..74ed3d6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pis.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pis_SB.dat b/venv/Lib/site-packages/babel/locale-data/pis_SB.dat new file mode 100644 index 0000000..3b1f17c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pis_SB.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pl.dat b/venv/Lib/site-packages/babel/locale-data/pl.dat new file mode 100644 index 0000000..f34eb0a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pl_PL.dat b/venv/Lib/site-packages/babel/locale-data/pl_PL.dat new file mode 100644 index 0000000..7a4339a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pl_PL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/prg.dat b/venv/Lib/site-packages/babel/locale-data/prg.dat new file mode 100644 index 0000000..e98c749 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/prg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/prg_001.dat b/venv/Lib/site-packages/babel/locale-data/prg_001.dat new file mode 100644 index 0000000..84003f5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/prg_001.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ps.dat b/venv/Lib/site-packages/babel/locale-data/ps.dat new file mode 100644 index 0000000..08d1240 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ps.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ps_AF.dat b/venv/Lib/site-packages/babel/locale-data/ps_AF.dat new file mode 100644 index 0000000..94a50bf Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ps_AF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ps_PK.dat b/venv/Lib/site-packages/babel/locale-data/ps_PK.dat new file mode 100644 index 0000000..ea5cf6a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ps_PK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt.dat b/venv/Lib/site-packages/babel/locale-data/pt.dat new file mode 100644 index 0000000..4df0dce Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_AO.dat b/venv/Lib/site-packages/babel/locale-data/pt_AO.dat new file mode 100644 index 0000000..4cd1fbd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_AO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_BR.dat b/venv/Lib/site-packages/babel/locale-data/pt_BR.dat new file mode 100644 index 0000000..22952c7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_BR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_CH.dat b/venv/Lib/site-packages/babel/locale-data/pt_CH.dat new file mode 100644 index 0000000..2684286 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_CH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_CV.dat b/venv/Lib/site-packages/babel/locale-data/pt_CV.dat new file mode 100644 index 0000000..78e2bbc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_CV.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_GQ.dat b/venv/Lib/site-packages/babel/locale-data/pt_GQ.dat new file mode 100644 index 0000000..8896833 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_GQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_GW.dat b/venv/Lib/site-packages/babel/locale-data/pt_GW.dat new file mode 100644 index 0000000..d44108a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_GW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_LU.dat b/venv/Lib/site-packages/babel/locale-data/pt_LU.dat new file mode 100644 index 0000000..af0b45b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_LU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_MO.dat b/venv/Lib/site-packages/babel/locale-data/pt_MO.dat new file mode 100644 index 0000000..4fcee09 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_MO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_MZ.dat b/venv/Lib/site-packages/babel/locale-data/pt_MZ.dat new file mode 100644 index 0000000..198075e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_MZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_PT.dat b/venv/Lib/site-packages/babel/locale-data/pt_PT.dat new file mode 100644 index 0000000..21b709a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_PT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_ST.dat b/venv/Lib/site-packages/babel/locale-data/pt_ST.dat new file mode 100644 index 0000000..cdccab7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_ST.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/pt_TL.dat b/venv/Lib/site-packages/babel/locale-data/pt_TL.dat new file mode 100644 index 0000000..7bb756c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/pt_TL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/qu.dat b/venv/Lib/site-packages/babel/locale-data/qu.dat new file mode 100644 index 0000000..79ed3ba Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/qu.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/qu_BO.dat b/venv/Lib/site-packages/babel/locale-data/qu_BO.dat new file mode 100644 index 0000000..bc994ff Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/qu_BO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/qu_EC.dat b/venv/Lib/site-packages/babel/locale-data/qu_EC.dat new file mode 100644 index 0000000..8f7f46a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/qu_EC.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/qu_PE.dat b/venv/Lib/site-packages/babel/locale-data/qu_PE.dat new file mode 100644 index 0000000..07aacf9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/qu_PE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/quc.dat b/venv/Lib/site-packages/babel/locale-data/quc.dat new file mode 100644 index 0000000..b764c14 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/quc.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/quc_GT.dat b/venv/Lib/site-packages/babel/locale-data/quc_GT.dat new file mode 100644 index 0000000..c14f849 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/quc_GT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/raj.dat b/venv/Lib/site-packages/babel/locale-data/raj.dat new file mode 100644 index 0000000..2636cdb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/raj.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/raj_IN.dat b/venv/Lib/site-packages/babel/locale-data/raj_IN.dat new file mode 100644 index 0000000..e56e750 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/raj_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rhg.dat b/venv/Lib/site-packages/babel/locale-data/rhg.dat new file mode 100644 index 0000000..0b321cb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rhg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rhg_Rohg.dat b/venv/Lib/site-packages/babel/locale-data/rhg_Rohg.dat new file mode 100644 index 0000000..01b82ec Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rhg_Rohg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rhg_Rohg_BD.dat b/venv/Lib/site-packages/babel/locale-data/rhg_Rohg_BD.dat new file mode 100644 index 0000000..cc14c7f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rhg_Rohg_BD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rhg_Rohg_MM.dat b/venv/Lib/site-packages/babel/locale-data/rhg_Rohg_MM.dat new file mode 100644 index 0000000..6cfde86 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rhg_Rohg_MM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rif.dat b/venv/Lib/site-packages/babel/locale-data/rif.dat new file mode 100644 index 0000000..e3f4711 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rif.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rif_MA.dat b/venv/Lib/site-packages/babel/locale-data/rif_MA.dat new file mode 100644 index 0000000..9b7f434 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rif_MA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rm.dat b/venv/Lib/site-packages/babel/locale-data/rm.dat new file mode 100644 index 0000000..6a7f1b6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rm.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rm_CH.dat b/venv/Lib/site-packages/babel/locale-data/rm_CH.dat new file mode 100644 index 0000000..26eccfc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rm_CH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rn.dat b/venv/Lib/site-packages/babel/locale-data/rn.dat new file mode 100644 index 0000000..eb1f5f0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rn_BI.dat b/venv/Lib/site-packages/babel/locale-data/rn_BI.dat new file mode 100644 index 0000000..d1ef975 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rn_BI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ro.dat b/venv/Lib/site-packages/babel/locale-data/ro.dat new file mode 100644 index 0000000..1b2dac0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ro.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ro_MD.dat b/venv/Lib/site-packages/babel/locale-data/ro_MD.dat new file mode 100644 index 0000000..8e5a47f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ro_MD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ro_RO.dat b/venv/Lib/site-packages/babel/locale-data/ro_RO.dat new file mode 100644 index 0000000..3517a61 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ro_RO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rof.dat b/venv/Lib/site-packages/babel/locale-data/rof.dat new file mode 100644 index 0000000..4ad71ae Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rof.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rof_TZ.dat b/venv/Lib/site-packages/babel/locale-data/rof_TZ.dat new file mode 100644 index 0000000..d7ffaeb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rof_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/root.dat b/venv/Lib/site-packages/babel/locale-data/root.dat new file mode 100644 index 0000000..3ee2eb6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/root.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ru.dat b/venv/Lib/site-packages/babel/locale-data/ru.dat new file mode 100644 index 0000000..40d7843 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ru.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ru_BY.dat b/venv/Lib/site-packages/babel/locale-data/ru_BY.dat new file mode 100644 index 0000000..e8ef98d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ru_BY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ru_KG.dat b/venv/Lib/site-packages/babel/locale-data/ru_KG.dat new file mode 100644 index 0000000..f3e5950 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ru_KG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ru_KZ.dat b/venv/Lib/site-packages/babel/locale-data/ru_KZ.dat new file mode 100644 index 0000000..b66765a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ru_KZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ru_MD.dat b/venv/Lib/site-packages/babel/locale-data/ru_MD.dat new file mode 100644 index 0000000..d704199 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ru_MD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ru_RU.dat b/venv/Lib/site-packages/babel/locale-data/ru_RU.dat new file mode 100644 index 0000000..a118357 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ru_RU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ru_UA.dat b/venv/Lib/site-packages/babel/locale-data/ru_UA.dat new file mode 100644 index 0000000..fe32ac9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ru_UA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rw.dat b/venv/Lib/site-packages/babel/locale-data/rw.dat new file mode 100644 index 0000000..594f0c0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rw.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rw_RW.dat b/venv/Lib/site-packages/babel/locale-data/rw_RW.dat new file mode 100644 index 0000000..4ade0dd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rw_RW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rwk.dat b/venv/Lib/site-packages/babel/locale-data/rwk.dat new file mode 100644 index 0000000..d630cc8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rwk.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/rwk_TZ.dat b/venv/Lib/site-packages/babel/locale-data/rwk_TZ.dat new file mode 100644 index 0000000..fedafc3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/rwk_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sa.dat b/venv/Lib/site-packages/babel/locale-data/sa.dat new file mode 100644 index 0000000..fb0d7bd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sa.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sa_IN.dat b/venv/Lib/site-packages/babel/locale-data/sa_IN.dat new file mode 100644 index 0000000..3178175 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sa_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sah.dat b/venv/Lib/site-packages/babel/locale-data/sah.dat new file mode 100644 index 0000000..625455f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sah.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sah_RU.dat b/venv/Lib/site-packages/babel/locale-data/sah_RU.dat new file mode 100644 index 0000000..44075f9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sah_RU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/saq.dat b/venv/Lib/site-packages/babel/locale-data/saq.dat new file mode 100644 index 0000000..7e718ee Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/saq.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/saq_KE.dat b/venv/Lib/site-packages/babel/locale-data/saq_KE.dat new file mode 100644 index 0000000..ffd91c3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/saq_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sat.dat b/venv/Lib/site-packages/babel/locale-data/sat.dat new file mode 100644 index 0000000..935e2d3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sat.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sat_Deva.dat b/venv/Lib/site-packages/babel/locale-data/sat_Deva.dat new file mode 100644 index 0000000..9a1af36 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sat_Deva.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sat_Deva_IN.dat b/venv/Lib/site-packages/babel/locale-data/sat_Deva_IN.dat new file mode 100644 index 0000000..1781be0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sat_Deva_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sat_Olck.dat b/venv/Lib/site-packages/babel/locale-data/sat_Olck.dat new file mode 100644 index 0000000..444b358 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sat_Olck.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sat_Olck_IN.dat b/venv/Lib/site-packages/babel/locale-data/sat_Olck_IN.dat new file mode 100644 index 0000000..1781be0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sat_Olck_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sbp.dat b/venv/Lib/site-packages/babel/locale-data/sbp.dat new file mode 100644 index 0000000..ef1d9bd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sbp.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sbp_TZ.dat b/venv/Lib/site-packages/babel/locale-data/sbp_TZ.dat new file mode 100644 index 0000000..2292ffb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sbp_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sc.dat b/venv/Lib/site-packages/babel/locale-data/sc.dat new file mode 100644 index 0000000..bedf4e5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sc.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sc_IT.dat b/venv/Lib/site-packages/babel/locale-data/sc_IT.dat new file mode 100644 index 0000000..12c8c56 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sc_IT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/scn.dat b/venv/Lib/site-packages/babel/locale-data/scn.dat new file mode 100644 index 0000000..cf91321 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/scn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/scn_IT.dat b/venv/Lib/site-packages/babel/locale-data/scn_IT.dat new file mode 100644 index 0000000..0e8b90e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/scn_IT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sd.dat b/venv/Lib/site-packages/babel/locale-data/sd.dat new file mode 100644 index 0000000..d134f0b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sd.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sd_Arab.dat b/venv/Lib/site-packages/babel/locale-data/sd_Arab.dat new file mode 100644 index 0000000..8003f26 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sd_Arab.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sd_Arab_PK.dat b/venv/Lib/site-packages/babel/locale-data/sd_Arab_PK.dat new file mode 100644 index 0000000..42f6290 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sd_Arab_PK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sd_Deva.dat b/venv/Lib/site-packages/babel/locale-data/sd_Deva.dat new file mode 100644 index 0000000..dda7f8a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sd_Deva.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sd_Deva_IN.dat b/venv/Lib/site-packages/babel/locale-data/sd_Deva_IN.dat new file mode 100644 index 0000000..21aee01 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sd_Deva_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sdh.dat b/venv/Lib/site-packages/babel/locale-data/sdh.dat new file mode 100644 index 0000000..f51767d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sdh.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sdh_IQ.dat b/venv/Lib/site-packages/babel/locale-data/sdh_IQ.dat new file mode 100644 index 0000000..774d04d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sdh_IQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sdh_IR.dat b/venv/Lib/site-packages/babel/locale-data/sdh_IR.dat new file mode 100644 index 0000000..6e83d1f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sdh_IR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/se.dat b/venv/Lib/site-packages/babel/locale-data/se.dat new file mode 100644 index 0000000..33c6138 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/se.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/se_FI.dat b/venv/Lib/site-packages/babel/locale-data/se_FI.dat new file mode 100644 index 0000000..1dca0af Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/se_FI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/se_NO.dat b/venv/Lib/site-packages/babel/locale-data/se_NO.dat new file mode 100644 index 0000000..09eca0d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/se_NO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/se_SE.dat b/venv/Lib/site-packages/babel/locale-data/se_SE.dat new file mode 100644 index 0000000..632b54e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/se_SE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/seh.dat b/venv/Lib/site-packages/babel/locale-data/seh.dat new file mode 100644 index 0000000..6ac9943 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/seh.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/seh_MZ.dat b/venv/Lib/site-packages/babel/locale-data/seh_MZ.dat new file mode 100644 index 0000000..ba30e95 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/seh_MZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ses.dat b/venv/Lib/site-packages/babel/locale-data/ses.dat new file mode 100644 index 0000000..c632c26 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ses.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ses_ML.dat b/venv/Lib/site-packages/babel/locale-data/ses_ML.dat new file mode 100644 index 0000000..a001088 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ses_ML.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sg.dat b/venv/Lib/site-packages/babel/locale-data/sg.dat new file mode 100644 index 0000000..bc2ee84 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sg_CF.dat b/venv/Lib/site-packages/babel/locale-data/sg_CF.dat new file mode 100644 index 0000000..0ca555a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sg_CF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/shi.dat b/venv/Lib/site-packages/babel/locale-data/shi.dat new file mode 100644 index 0000000..f6572d4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/shi.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/shi_Latn.dat b/venv/Lib/site-packages/babel/locale-data/shi_Latn.dat new file mode 100644 index 0000000..0104435 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/shi_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/shi_Latn_MA.dat b/venv/Lib/site-packages/babel/locale-data/shi_Latn_MA.dat new file mode 100644 index 0000000..1495585 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/shi_Latn_MA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/shi_Tfng.dat b/venv/Lib/site-packages/babel/locale-data/shi_Tfng.dat new file mode 100644 index 0000000..63ebefe Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/shi_Tfng.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/shi_Tfng_MA.dat b/venv/Lib/site-packages/babel/locale-data/shi_Tfng_MA.dat new file mode 100644 index 0000000..1495585 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/shi_Tfng_MA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/shn.dat b/venv/Lib/site-packages/babel/locale-data/shn.dat new file mode 100644 index 0000000..7eb5699 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/shn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/shn_MM.dat b/venv/Lib/site-packages/babel/locale-data/shn_MM.dat new file mode 100644 index 0000000..3cace29 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/shn_MM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/shn_TH.dat b/venv/Lib/site-packages/babel/locale-data/shn_TH.dat new file mode 100644 index 0000000..cc5364a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/shn_TH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/si.dat b/venv/Lib/site-packages/babel/locale-data/si.dat new file mode 100644 index 0000000..121b1e5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/si.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/si_LK.dat b/venv/Lib/site-packages/babel/locale-data/si_LK.dat new file mode 100644 index 0000000..eb32302 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/si_LK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sid.dat b/venv/Lib/site-packages/babel/locale-data/sid.dat new file mode 100644 index 0000000..05cf5ee Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sid.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sid_ET.dat b/venv/Lib/site-packages/babel/locale-data/sid_ET.dat new file mode 100644 index 0000000..1be7a4a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sid_ET.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sk.dat b/venv/Lib/site-packages/babel/locale-data/sk.dat new file mode 100644 index 0000000..414cf62 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sk.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sk_SK.dat b/venv/Lib/site-packages/babel/locale-data/sk_SK.dat new file mode 100644 index 0000000..4ba6c84 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sk_SK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sl.dat b/venv/Lib/site-packages/babel/locale-data/sl.dat new file mode 100644 index 0000000..ef8b3f3 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sl_SI.dat b/venv/Lib/site-packages/babel/locale-data/sl_SI.dat new file mode 100644 index 0000000..b495582 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sl_SI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sma.dat b/venv/Lib/site-packages/babel/locale-data/sma.dat new file mode 100644 index 0000000..1d31846 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sma.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sma_NO.dat b/venv/Lib/site-packages/babel/locale-data/sma_NO.dat new file mode 100644 index 0000000..325e16c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sma_NO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sma_SE.dat b/venv/Lib/site-packages/babel/locale-data/sma_SE.dat new file mode 100644 index 0000000..b9cb4e7 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sma_SE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/smj.dat b/venv/Lib/site-packages/babel/locale-data/smj.dat new file mode 100644 index 0000000..263fb54 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/smj.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/smj_NO.dat b/venv/Lib/site-packages/babel/locale-data/smj_NO.dat new file mode 100644 index 0000000..7cc3654 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/smj_NO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/smj_SE.dat b/venv/Lib/site-packages/babel/locale-data/smj_SE.dat new file mode 100644 index 0000000..78aa9de Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/smj_SE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/smn.dat b/venv/Lib/site-packages/babel/locale-data/smn.dat new file mode 100644 index 0000000..6ccfa3e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/smn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/smn_FI.dat b/venv/Lib/site-packages/babel/locale-data/smn_FI.dat new file mode 100644 index 0000000..a88e29d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/smn_FI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sms.dat b/venv/Lib/site-packages/babel/locale-data/sms.dat new file mode 100644 index 0000000..590f25a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sms.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sms_FI.dat b/venv/Lib/site-packages/babel/locale-data/sms_FI.dat new file mode 100644 index 0000000..91bdf45 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sms_FI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sn.dat b/venv/Lib/site-packages/babel/locale-data/sn.dat new file mode 100644 index 0000000..465d729 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sn_ZW.dat b/venv/Lib/site-packages/babel/locale-data/sn_ZW.dat new file mode 100644 index 0000000..4dd1932 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sn_ZW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/so.dat b/venv/Lib/site-packages/babel/locale-data/so.dat new file mode 100644 index 0000000..d98269b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/so.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/so_DJ.dat b/venv/Lib/site-packages/babel/locale-data/so_DJ.dat new file mode 100644 index 0000000..756644b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/so_DJ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/so_ET.dat b/venv/Lib/site-packages/babel/locale-data/so_ET.dat new file mode 100644 index 0000000..abd6c12 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/so_ET.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/so_KE.dat b/venv/Lib/site-packages/babel/locale-data/so_KE.dat new file mode 100644 index 0000000..2c422f9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/so_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/so_SO.dat b/venv/Lib/site-packages/babel/locale-data/so_SO.dat new file mode 100644 index 0000000..aa7955c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/so_SO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sq.dat b/venv/Lib/site-packages/babel/locale-data/sq.dat new file mode 100644 index 0000000..9d0b749 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sq.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sq_AL.dat b/venv/Lib/site-packages/babel/locale-data/sq_AL.dat new file mode 100644 index 0000000..5a5320f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sq_AL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sq_MK.dat b/venv/Lib/site-packages/babel/locale-data/sq_MK.dat new file mode 100644 index 0000000..32565ce Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sq_MK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sq_XK.dat b/venv/Lib/site-packages/babel/locale-data/sq_XK.dat new file mode 100644 index 0000000..bbe0062 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sq_XK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr.dat b/venv/Lib/site-packages/babel/locale-data/sr.dat new file mode 100644 index 0000000..09f754f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr_Cyrl.dat b/venv/Lib/site-packages/babel/locale-data/sr_Cyrl.dat new file mode 100644 index 0000000..8915435 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr_Cyrl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_BA.dat b/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_BA.dat new file mode 100644 index 0000000..5936e83 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_BA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_ME.dat b/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_ME.dat new file mode 100644 index 0000000..900c3aa Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_ME.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_RS.dat b/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_RS.dat new file mode 100644 index 0000000..b263309 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_RS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_XK.dat b/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_XK.dat new file mode 100644 index 0000000..aa461d8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr_Cyrl_XK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr_Latn.dat b/venv/Lib/site-packages/babel/locale-data/sr_Latn.dat new file mode 100644 index 0000000..5f9e2dc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr_Latn_BA.dat b/venv/Lib/site-packages/babel/locale-data/sr_Latn_BA.dat new file mode 100644 index 0000000..b2a8c4d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr_Latn_BA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr_Latn_ME.dat b/venv/Lib/site-packages/babel/locale-data/sr_Latn_ME.dat new file mode 100644 index 0000000..35f626d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr_Latn_ME.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr_Latn_RS.dat b/venv/Lib/site-packages/babel/locale-data/sr_Latn_RS.dat new file mode 100644 index 0000000..b263309 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr_Latn_RS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sr_Latn_XK.dat b/venv/Lib/site-packages/babel/locale-data/sr_Latn_XK.dat new file mode 100644 index 0000000..6bf272f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sr_Latn_XK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ss.dat b/venv/Lib/site-packages/babel/locale-data/ss.dat new file mode 100644 index 0000000..1e2d118 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ss.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ss_SZ.dat b/venv/Lib/site-packages/babel/locale-data/ss_SZ.dat new file mode 100644 index 0000000..b4fcf77 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ss_SZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ss_ZA.dat b/venv/Lib/site-packages/babel/locale-data/ss_ZA.dat new file mode 100644 index 0000000..6731569 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ss_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ssy.dat b/venv/Lib/site-packages/babel/locale-data/ssy.dat new file mode 100644 index 0000000..0e058e9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ssy.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ssy_ER.dat b/venv/Lib/site-packages/babel/locale-data/ssy_ER.dat new file mode 100644 index 0000000..1d28855 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ssy_ER.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/st.dat b/venv/Lib/site-packages/babel/locale-data/st.dat new file mode 100644 index 0000000..f77dd33 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/st.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/st_LS.dat b/venv/Lib/site-packages/babel/locale-data/st_LS.dat new file mode 100644 index 0000000..50eef78 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/st_LS.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/st_ZA.dat b/venv/Lib/site-packages/babel/locale-data/st_ZA.dat new file mode 100644 index 0000000..9539d62 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/st_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/su.dat b/venv/Lib/site-packages/babel/locale-data/su.dat new file mode 100644 index 0000000..59c7b02 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/su.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/su_Latn.dat b/venv/Lib/site-packages/babel/locale-data/su_Latn.dat new file mode 100644 index 0000000..79e460e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/su_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/su_Latn_ID.dat b/venv/Lib/site-packages/babel/locale-data/su_Latn_ID.dat new file mode 100644 index 0000000..5c45bdc Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/su_Latn_ID.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sv.dat b/venv/Lib/site-packages/babel/locale-data/sv.dat new file mode 100644 index 0000000..3ec0014 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sv.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sv_AX.dat b/venv/Lib/site-packages/babel/locale-data/sv_AX.dat new file mode 100644 index 0000000..bfb414d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sv_AX.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sv_FI.dat b/venv/Lib/site-packages/babel/locale-data/sv_FI.dat new file mode 100644 index 0000000..536ca7f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sv_FI.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sv_SE.dat b/venv/Lib/site-packages/babel/locale-data/sv_SE.dat new file mode 100644 index 0000000..57a602a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sv_SE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sw.dat b/venv/Lib/site-packages/babel/locale-data/sw.dat new file mode 100644 index 0000000..1c4139f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sw.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sw_CD.dat b/venv/Lib/site-packages/babel/locale-data/sw_CD.dat new file mode 100644 index 0000000..b1a7f0e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sw_CD.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sw_KE.dat b/venv/Lib/site-packages/babel/locale-data/sw_KE.dat new file mode 100644 index 0000000..f31819d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sw_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sw_TZ.dat b/venv/Lib/site-packages/babel/locale-data/sw_TZ.dat new file mode 100644 index 0000000..a267886 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sw_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/sw_UG.dat b/venv/Lib/site-packages/babel/locale-data/sw_UG.dat new file mode 100644 index 0000000..0d160d5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/sw_UG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/syr.dat b/venv/Lib/site-packages/babel/locale-data/syr.dat new file mode 100644 index 0000000..2750de4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/syr.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/syr_IQ.dat b/venv/Lib/site-packages/babel/locale-data/syr_IQ.dat new file mode 100644 index 0000000..7821e92 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/syr_IQ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/syr_SY.dat b/venv/Lib/site-packages/babel/locale-data/syr_SY.dat new file mode 100644 index 0000000..1edf041 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/syr_SY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/szl.dat b/venv/Lib/site-packages/babel/locale-data/szl.dat new file mode 100644 index 0000000..355c958 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/szl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/szl_PL.dat b/venv/Lib/site-packages/babel/locale-data/szl_PL.dat new file mode 100644 index 0000000..f0b9954 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/szl_PL.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ta.dat b/venv/Lib/site-packages/babel/locale-data/ta.dat new file mode 100644 index 0000000..b54fa4b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ta.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ta_IN.dat b/venv/Lib/site-packages/babel/locale-data/ta_IN.dat new file mode 100644 index 0000000..cd08ee8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ta_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ta_LK.dat b/venv/Lib/site-packages/babel/locale-data/ta_LK.dat new file mode 100644 index 0000000..f473b05 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ta_LK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ta_MY.dat b/venv/Lib/site-packages/babel/locale-data/ta_MY.dat new file mode 100644 index 0000000..8e791e9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ta_MY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ta_SG.dat b/venv/Lib/site-packages/babel/locale-data/ta_SG.dat new file mode 100644 index 0000000..9f1131c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ta_SG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/te.dat b/venv/Lib/site-packages/babel/locale-data/te.dat new file mode 100644 index 0000000..6b41f64 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/te.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/te_IN.dat b/venv/Lib/site-packages/babel/locale-data/te_IN.dat new file mode 100644 index 0000000..d76a416 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/te_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/teo.dat b/venv/Lib/site-packages/babel/locale-data/teo.dat new file mode 100644 index 0000000..d249cac Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/teo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/teo_KE.dat b/venv/Lib/site-packages/babel/locale-data/teo_KE.dat new file mode 100644 index 0000000..66b33ca Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/teo_KE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/teo_UG.dat b/venv/Lib/site-packages/babel/locale-data/teo_UG.dat new file mode 100644 index 0000000..e81befa Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/teo_UG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tg.dat b/venv/Lib/site-packages/babel/locale-data/tg.dat new file mode 100644 index 0000000..c396c2e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tg.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tg_TJ.dat b/venv/Lib/site-packages/babel/locale-data/tg_TJ.dat new file mode 100644 index 0000000..1982383 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tg_TJ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/th.dat b/venv/Lib/site-packages/babel/locale-data/th.dat new file mode 100644 index 0000000..32baf71 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/th.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/th_TH.dat b/venv/Lib/site-packages/babel/locale-data/th_TH.dat new file mode 100644 index 0000000..c2a4c99 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/th_TH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ti.dat b/venv/Lib/site-packages/babel/locale-data/ti.dat new file mode 100644 index 0000000..e9774a0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ti.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ti_ER.dat b/venv/Lib/site-packages/babel/locale-data/ti_ER.dat new file mode 100644 index 0000000..41ca554 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ti_ER.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ti_ET.dat b/venv/Lib/site-packages/babel/locale-data/ti_ET.dat new file mode 100644 index 0000000..50a447b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ti_ET.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tig.dat b/venv/Lib/site-packages/babel/locale-data/tig.dat new file mode 100644 index 0000000..5ebcaa2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tig.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tig_ER.dat b/venv/Lib/site-packages/babel/locale-data/tig_ER.dat new file mode 100644 index 0000000..5632fa6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tig_ER.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tk.dat b/venv/Lib/site-packages/babel/locale-data/tk.dat new file mode 100644 index 0000000..9e7f440 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tk.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tk_TM.dat b/venv/Lib/site-packages/babel/locale-data/tk_TM.dat new file mode 100644 index 0000000..01e7cf6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tk_TM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tn.dat b/venv/Lib/site-packages/babel/locale-data/tn.dat new file mode 100644 index 0000000..e9f4860 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tn_BW.dat b/venv/Lib/site-packages/babel/locale-data/tn_BW.dat new file mode 100644 index 0000000..5da0cc5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tn_BW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tn_ZA.dat b/venv/Lib/site-packages/babel/locale-data/tn_ZA.dat new file mode 100644 index 0000000..a559a12 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tn_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/to.dat b/venv/Lib/site-packages/babel/locale-data/to.dat new file mode 100644 index 0000000..587e879 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/to.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/to_TO.dat b/venv/Lib/site-packages/babel/locale-data/to_TO.dat new file mode 100644 index 0000000..8cdedf5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/to_TO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tok.dat b/venv/Lib/site-packages/babel/locale-data/tok.dat new file mode 100644 index 0000000..099ae7c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tok.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tok_001.dat b/venv/Lib/site-packages/babel/locale-data/tok_001.dat new file mode 100644 index 0000000..ea39a45 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tok_001.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tpi.dat b/venv/Lib/site-packages/babel/locale-data/tpi.dat new file mode 100644 index 0000000..a621f3a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tpi.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tpi_PG.dat b/venv/Lib/site-packages/babel/locale-data/tpi_PG.dat new file mode 100644 index 0000000..9057c6e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tpi_PG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tr.dat b/venv/Lib/site-packages/babel/locale-data/tr.dat new file mode 100644 index 0000000..71f97ee Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tr.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tr_CY.dat b/venv/Lib/site-packages/babel/locale-data/tr_CY.dat new file mode 100644 index 0000000..a0bbd6f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tr_CY.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tr_TR.dat b/venv/Lib/site-packages/babel/locale-data/tr_TR.dat new file mode 100644 index 0000000..8c20ebb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tr_TR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/trv.dat b/venv/Lib/site-packages/babel/locale-data/trv.dat new file mode 100644 index 0000000..c311695 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/trv.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/trv_TW.dat b/venv/Lib/site-packages/babel/locale-data/trv_TW.dat new file mode 100644 index 0000000..da4e716 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/trv_TW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/trw.dat b/venv/Lib/site-packages/babel/locale-data/trw.dat new file mode 100644 index 0000000..2d8aa0e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/trw.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/trw_PK.dat b/venv/Lib/site-packages/babel/locale-data/trw_PK.dat new file mode 100644 index 0000000..593e957 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/trw_PK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ts.dat b/venv/Lib/site-packages/babel/locale-data/ts.dat new file mode 100644 index 0000000..a822be4 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ts.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ts_ZA.dat b/venv/Lib/site-packages/babel/locale-data/ts_ZA.dat new file mode 100644 index 0000000..5364032 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ts_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tt.dat b/venv/Lib/site-packages/babel/locale-data/tt.dat new file mode 100644 index 0000000..69b9b76 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tt.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tt_RU.dat b/venv/Lib/site-packages/babel/locale-data/tt_RU.dat new file mode 100644 index 0000000..88ba72f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tt_RU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/twq.dat b/venv/Lib/site-packages/babel/locale-data/twq.dat new file mode 100644 index 0000000..8576652 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/twq.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/twq_NE.dat b/venv/Lib/site-packages/babel/locale-data/twq_NE.dat new file mode 100644 index 0000000..be95079 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/twq_NE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tzm.dat b/venv/Lib/site-packages/babel/locale-data/tzm.dat new file mode 100644 index 0000000..0edb429 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tzm.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/tzm_MA.dat b/venv/Lib/site-packages/babel/locale-data/tzm_MA.dat new file mode 100644 index 0000000..b74c937 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/tzm_MA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ug.dat b/venv/Lib/site-packages/babel/locale-data/ug.dat new file mode 100644 index 0000000..5db6d66 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ug.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ug_CN.dat b/venv/Lib/site-packages/babel/locale-data/ug_CN.dat new file mode 100644 index 0000000..997752b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ug_CN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/uk.dat b/venv/Lib/site-packages/babel/locale-data/uk.dat new file mode 100644 index 0000000..ed9cd75 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/uk.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/uk_UA.dat b/venv/Lib/site-packages/babel/locale-data/uk_UA.dat new file mode 100644 index 0000000..e1ff80c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/uk_UA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ur.dat b/venv/Lib/site-packages/babel/locale-data/ur.dat new file mode 100644 index 0000000..dcca616 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ur.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ur_IN.dat b/venv/Lib/site-packages/babel/locale-data/ur_IN.dat new file mode 100644 index 0000000..b7afefa Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ur_IN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ur_PK.dat b/venv/Lib/site-packages/babel/locale-data/ur_PK.dat new file mode 100644 index 0000000..5a3d6ce Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ur_PK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/uz.dat b/venv/Lib/site-packages/babel/locale-data/uz.dat new file mode 100644 index 0000000..1e1ee9e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/uz.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/uz_Arab.dat b/venv/Lib/site-packages/babel/locale-data/uz_Arab.dat new file mode 100644 index 0000000..beb1fa9 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/uz_Arab.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/uz_Arab_AF.dat b/venv/Lib/site-packages/babel/locale-data/uz_Arab_AF.dat new file mode 100644 index 0000000..d7355f6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/uz_Arab_AF.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/uz_Cyrl.dat b/venv/Lib/site-packages/babel/locale-data/uz_Cyrl.dat new file mode 100644 index 0000000..5be580e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/uz_Cyrl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/uz_Cyrl_UZ.dat b/venv/Lib/site-packages/babel/locale-data/uz_Cyrl_UZ.dat new file mode 100644 index 0000000..0e9fb27 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/uz_Cyrl_UZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/uz_Latn.dat b/venv/Lib/site-packages/babel/locale-data/uz_Latn.dat new file mode 100644 index 0000000..217235e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/uz_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/uz_Latn_UZ.dat b/venv/Lib/site-packages/babel/locale-data/uz_Latn_UZ.dat new file mode 100644 index 0000000..0e9fb27 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/uz_Latn_UZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vai.dat b/venv/Lib/site-packages/babel/locale-data/vai.dat new file mode 100644 index 0000000..45a71e6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vai.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vai_Latn.dat b/venv/Lib/site-packages/babel/locale-data/vai_Latn.dat new file mode 100644 index 0000000..5b244b5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vai_Latn.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vai_Latn_LR.dat b/venv/Lib/site-packages/babel/locale-data/vai_Latn_LR.dat new file mode 100644 index 0000000..f3bc7f0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vai_Latn_LR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vai_Vaii.dat b/venv/Lib/site-packages/babel/locale-data/vai_Vaii.dat new file mode 100644 index 0000000..6519e24 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vai_Vaii.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vai_Vaii_LR.dat b/venv/Lib/site-packages/babel/locale-data/vai_Vaii_LR.dat new file mode 100644 index 0000000..f3bc7f0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vai_Vaii_LR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ve.dat b/venv/Lib/site-packages/babel/locale-data/ve.dat new file mode 100644 index 0000000..bf5c1de Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ve.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/ve_ZA.dat b/venv/Lib/site-packages/babel/locale-data/ve_ZA.dat new file mode 100644 index 0000000..81c087b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/ve_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vec.dat b/venv/Lib/site-packages/babel/locale-data/vec.dat new file mode 100644 index 0000000..422a17e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vec.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vec_IT.dat b/venv/Lib/site-packages/babel/locale-data/vec_IT.dat new file mode 100644 index 0000000..a1f0238 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vec_IT.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vi.dat b/venv/Lib/site-packages/babel/locale-data/vi.dat new file mode 100644 index 0000000..0819065 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vi.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vi_VN.dat b/venv/Lib/site-packages/babel/locale-data/vi_VN.dat new file mode 100644 index 0000000..d1942c8 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vi_VN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vo.dat b/venv/Lib/site-packages/babel/locale-data/vo.dat new file mode 100644 index 0000000..f5a9683 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vo_001.dat b/venv/Lib/site-packages/babel/locale-data/vo_001.dat new file mode 100644 index 0000000..e06ed1c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vo_001.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vun.dat b/venv/Lib/site-packages/babel/locale-data/vun.dat new file mode 100644 index 0000000..8198127 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vun.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/vun_TZ.dat b/venv/Lib/site-packages/babel/locale-data/vun_TZ.dat new file mode 100644 index 0000000..a29794a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/vun_TZ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/wa.dat b/venv/Lib/site-packages/babel/locale-data/wa.dat new file mode 100644 index 0000000..6699fd2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/wa.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/wa_BE.dat b/venv/Lib/site-packages/babel/locale-data/wa_BE.dat new file mode 100644 index 0000000..63f30c1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/wa_BE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/wae.dat b/venv/Lib/site-packages/babel/locale-data/wae.dat new file mode 100644 index 0000000..ac59d4e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/wae.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/wae_CH.dat b/venv/Lib/site-packages/babel/locale-data/wae_CH.dat new file mode 100644 index 0000000..7e10fee Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/wae_CH.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/wal.dat b/venv/Lib/site-packages/babel/locale-data/wal.dat new file mode 100644 index 0000000..aeeac57 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/wal.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/wal_ET.dat b/venv/Lib/site-packages/babel/locale-data/wal_ET.dat new file mode 100644 index 0000000..fa5fc6d Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/wal_ET.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/wbp.dat b/venv/Lib/site-packages/babel/locale-data/wbp.dat new file mode 100644 index 0000000..5086b28 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/wbp.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/wbp_AU.dat b/venv/Lib/site-packages/babel/locale-data/wbp_AU.dat new file mode 100644 index 0000000..3b6b5b1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/wbp_AU.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/wo.dat b/venv/Lib/site-packages/babel/locale-data/wo.dat new file mode 100644 index 0000000..477e5f6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/wo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/wo_SN.dat b/venv/Lib/site-packages/babel/locale-data/wo_SN.dat new file mode 100644 index 0000000..ce673ad Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/wo_SN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/xh.dat b/venv/Lib/site-packages/babel/locale-data/xh.dat new file mode 100644 index 0000000..3c9cc1f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/xh.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/xh_ZA.dat b/venv/Lib/site-packages/babel/locale-data/xh_ZA.dat new file mode 100644 index 0000000..68d7166 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/xh_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/xog.dat b/venv/Lib/site-packages/babel/locale-data/xog.dat new file mode 100644 index 0000000..f2dcb4f Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/xog.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/xog_UG.dat b/venv/Lib/site-packages/babel/locale-data/xog_UG.dat new file mode 100644 index 0000000..b5fb4da Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/xog_UG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yav.dat b/venv/Lib/site-packages/babel/locale-data/yav.dat new file mode 100644 index 0000000..e8fa7bd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yav.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yav_CM.dat b/venv/Lib/site-packages/babel/locale-data/yav_CM.dat new file mode 100644 index 0000000..2a0cbb2 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yav_CM.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yi.dat b/venv/Lib/site-packages/babel/locale-data/yi.dat new file mode 100644 index 0000000..78816af Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yi.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yi_001.dat b/venv/Lib/site-packages/babel/locale-data/yi_001.dat new file mode 100644 index 0000000..04f0da6 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yi_001.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yo.dat b/venv/Lib/site-packages/babel/locale-data/yo.dat new file mode 100644 index 0000000..454bafd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yo.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yo_BJ.dat b/venv/Lib/site-packages/babel/locale-data/yo_BJ.dat new file mode 100644 index 0000000..4ffea61 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yo_BJ.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yo_NG.dat b/venv/Lib/site-packages/babel/locale-data/yo_NG.dat new file mode 100644 index 0000000..e473a96 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yo_NG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yrl.dat b/venv/Lib/site-packages/babel/locale-data/yrl.dat new file mode 100644 index 0000000..689bfae Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yrl.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yrl_BR.dat b/venv/Lib/site-packages/babel/locale-data/yrl_BR.dat new file mode 100644 index 0000000..bf1012e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yrl_BR.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yrl_CO.dat b/venv/Lib/site-packages/babel/locale-data/yrl_CO.dat new file mode 100644 index 0000000..eccf555 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yrl_CO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yrl_VE.dat b/venv/Lib/site-packages/babel/locale-data/yrl_VE.dat new file mode 100644 index 0000000..89d9ce5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yrl_VE.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yue.dat b/venv/Lib/site-packages/babel/locale-data/yue.dat new file mode 100644 index 0000000..7c813dd Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yue.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yue_Hans.dat b/venv/Lib/site-packages/babel/locale-data/yue_Hans.dat new file mode 100644 index 0000000..aa79471 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yue_Hans.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yue_Hans_CN.dat b/venv/Lib/site-packages/babel/locale-data/yue_Hans_CN.dat new file mode 100644 index 0000000..1ba6197 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yue_Hans_CN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yue_Hant.dat b/venv/Lib/site-packages/babel/locale-data/yue_Hant.dat new file mode 100644 index 0000000..d674034 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yue_Hant.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/yue_Hant_HK.dat b/venv/Lib/site-packages/babel/locale-data/yue_Hant_HK.dat new file mode 100644 index 0000000..853efcb Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/yue_Hant_HK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zgh.dat b/venv/Lib/site-packages/babel/locale-data/zgh.dat new file mode 100644 index 0000000..f9b48f0 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zgh.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zgh_MA.dat b/venv/Lib/site-packages/babel/locale-data/zgh_MA.dat new file mode 100644 index 0000000..8475afe Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zgh_MA.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zh.dat b/venv/Lib/site-packages/babel/locale-data/zh.dat new file mode 100644 index 0000000..aac9c9c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zh.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zh_Hans.dat b/venv/Lib/site-packages/babel/locale-data/zh_Hans.dat new file mode 100644 index 0000000..c5c94bf Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zh_Hans.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zh_Hans_CN.dat b/venv/Lib/site-packages/babel/locale-data/zh_Hans_CN.dat new file mode 100644 index 0000000..09d08c1 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zh_Hans_CN.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zh_Hans_HK.dat b/venv/Lib/site-packages/babel/locale-data/zh_Hans_HK.dat new file mode 100644 index 0000000..db1b36a Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zh_Hans_HK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zh_Hans_MO.dat b/venv/Lib/site-packages/babel/locale-data/zh_Hans_MO.dat new file mode 100644 index 0000000..2809c8e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zh_Hans_MO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zh_Hans_SG.dat b/venv/Lib/site-packages/babel/locale-data/zh_Hans_SG.dat new file mode 100644 index 0000000..410962e Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zh_Hans_SG.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zh_Hant.dat b/venv/Lib/site-packages/babel/locale-data/zh_Hant.dat new file mode 100644 index 0000000..665cc01 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zh_Hant.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zh_Hant_HK.dat b/venv/Lib/site-packages/babel/locale-data/zh_Hant_HK.dat new file mode 100644 index 0000000..38b1ea5 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zh_Hant_HK.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zh_Hant_MO.dat b/venv/Lib/site-packages/babel/locale-data/zh_Hant_MO.dat new file mode 100644 index 0000000..91a9321 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zh_Hant_MO.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zh_Hant_TW.dat b/venv/Lib/site-packages/babel/locale-data/zh_Hant_TW.dat new file mode 100644 index 0000000..657e888 Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zh_Hant_TW.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zu.dat b/venv/Lib/site-packages/babel/locale-data/zu.dat new file mode 100644 index 0000000..cb6418b Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zu.dat differ diff --git a/venv/Lib/site-packages/babel/locale-data/zu_ZA.dat b/venv/Lib/site-packages/babel/locale-data/zu_ZA.dat new file mode 100644 index 0000000..026694c Binary files /dev/null and b/venv/Lib/site-packages/babel/locale-data/zu_ZA.dat differ diff --git a/venv/Lib/site-packages/babel/localedata.py b/venv/Lib/site-packages/babel/localedata.py new file mode 100644 index 0000000..f1e8a12 --- /dev/null +++ b/venv/Lib/site-packages/babel/localedata.py @@ -0,0 +1,254 @@ +""" + babel.localedata + ~~~~~~~~~~~~~~~~ + + Low-level locale data access. + + :note: The `Locale` class, which uses this module under the hood, provides a + more convenient interface for accessing the locale data. + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" + +from __future__ import annotations + +import os +import pickle +import re +import sys +import threading +from collections import abc +from collections.abc import Iterator, Mapping, MutableMapping +from functools import lru_cache +from itertools import chain +from typing import Any + +_cache: dict[str, Any] = {} +_cache_lock = threading.RLock() +_dirname = os.path.join(os.path.dirname(__file__), 'locale-data') +_windows_reserved_name_re = re.compile("^(con|prn|aux|nul|com[0-9]|lpt[0-9])$", re.I) + + +def normalize_locale(name: str) -> str | None: + """Normalize a locale ID by stripping spaces and apply proper casing. + + Returns the normalized locale ID string or `None` if the ID is not + recognized. + """ + if not name or not isinstance(name, str): + return None + name = name.strip().lower() + for locale_id in chain.from_iterable([_cache, locale_identifiers()]): + if name == locale_id.lower(): + return locale_id + + +def resolve_locale_filename(name: os.PathLike[str] | str) -> str: + """ + Resolve a locale identifier to a `.dat` path on disk. + """ + + # Clean up any possible relative paths. + name = os.path.basename(name) + + # Ensure we're not left with one of the Windows reserved names. + if sys.platform == "win32" and _windows_reserved_name_re.match(os.path.splitext(name)[0]): + raise ValueError(f"Name {name} is invalid on Windows") + + # Build the path. + return os.path.join(_dirname, f"{name}.dat") + + +def exists(name: str) -> bool: + """Check whether locale data is available for the given locale. + + Returns `True` if it exists, `False` otherwise. + + :param name: the locale identifier string + """ + if not name or not isinstance(name, str): + return False + if name in _cache: + return True + file_found = os.path.exists(resolve_locale_filename(name)) + return True if file_found else bool(normalize_locale(name)) + + +@lru_cache(maxsize=None) +def locale_identifiers() -> list[str]: + """Return a list of all locale identifiers for which locale data is + available. + + This data is cached after the first invocation. + You can clear the cache by calling `locale_identifiers.cache_clear()`. + + .. versionadded:: 0.8.1 + + :return: a list of locale identifiers (strings) + """ + return [ + stem + for stem, extension in + (os.path.splitext(filename) for filename in os.listdir(_dirname)) + if extension == '.dat' and stem != 'root' + ] + + +def load(name: os.PathLike[str] | str, merge_inherited: bool = True) -> dict[str, Any]: + """Load the locale data for the given locale. + + The locale data is a dictionary that contains much of the data defined by + the Common Locale Data Repository (CLDR). This data is stored as a + collection of pickle files inside the ``babel`` package. + + >>> d = load('en_US') + >>> d['languages']['sv'] + u'Swedish' + + Note that the results are cached, and subsequent requests for the same + locale return the same dictionary: + + >>> d1 = load('en_US') + >>> d2 = load('en_US') + >>> d1 is d2 + True + + :param name: the locale identifier string (or "root") + :param merge_inherited: whether the inherited data should be merged into + the data of the requested locale + :raise `IOError`: if no locale data file is found for the given locale + identifier, or one of the locales it inherits from + """ + name = os.path.basename(name) + _cache_lock.acquire() + try: + data = _cache.get(name) + if not data: + # Load inherited data + if name == 'root' or not merge_inherited: + data = {} + else: + from babel.core import get_global + parent = get_global('parent_exceptions').get(name) + if not parent: + parts = name.split('_') + parent = "root" if len(parts) == 1 else "_".join(parts[:-1]) + data = load(parent).copy() + filename = resolve_locale_filename(name) + with open(filename, 'rb') as fileobj: + if name != 'root' and merge_inherited: + merge(data, pickle.load(fileobj)) + else: + data = pickle.load(fileobj) + _cache[name] = data + return data + finally: + _cache_lock.release() + + +def merge(dict1: MutableMapping[Any, Any], dict2: Mapping[Any, Any]) -> None: + """Merge the data from `dict2` into the `dict1` dictionary, making copies + of nested dictionaries. + + >>> d = {1: 'foo', 3: 'baz'} + >>> merge(d, {1: 'Foo', 2: 'Bar'}) + >>> sorted(d.items()) + [(1, 'Foo'), (2, 'Bar'), (3, 'baz')] + + :param dict1: the dictionary to merge into + :param dict2: the dictionary containing the data that should be merged + """ + for key, val2 in dict2.items(): + if val2 is not None: + val1 = dict1.get(key) + if isinstance(val2, dict): + if val1 is None: + val1 = {} + if isinstance(val1, Alias): + val1 = (val1, val2) + elif isinstance(val1, tuple): + alias, others = val1 + others = others.copy() + merge(others, val2) + val1 = (alias, others) + else: + val1 = val1.copy() + merge(val1, val2) + else: + val1 = val2 + dict1[key] = val1 + + +class Alias: + """Representation of an alias in the locale data. + + An alias is a value that refers to some other part of the locale data, + as specified by the `keys`. + """ + + def __init__(self, keys: tuple[str, ...]) -> None: + self.keys = tuple(keys) + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.keys!r}>" + + def resolve(self, data: Mapping[str | int | None, Any]) -> Mapping[str | int | None, Any]: + """Resolve the alias based on the given data. + + This is done recursively, so if one alias resolves to a second alias, + that second alias will also be resolved. + + :param data: the locale data + :type data: `dict` + """ + base = data + for key in self.keys: + data = data[key] + if isinstance(data, Alias): + data = data.resolve(base) + elif isinstance(data, tuple): + alias, others = data + data = alias.resolve(base) + return data + + +class LocaleDataDict(abc.MutableMapping): + """Dictionary wrapper that automatically resolves aliases to the actual + values. + """ + + def __init__(self, data: MutableMapping[str | int | None, Any], base: Mapping[str | int | None, Any] | None = None): + self._data = data + if base is None: + base = data + self.base = base + + def __len__(self) -> int: + return len(self._data) + + def __iter__(self) -> Iterator[str | int | None]: + return iter(self._data) + + def __getitem__(self, key: str | int | None) -> Any: + orig = val = self._data[key] + if isinstance(val, Alias): # resolve an alias + val = val.resolve(self.base) + if isinstance(val, tuple): # Merge a partial dict with an alias + alias, others = val + val = alias.resolve(self.base).copy() + merge(val, others) + if isinstance(val, dict): # Return a nested alias-resolving dict + val = LocaleDataDict(val, base=self.base) + if val is not orig: + self._data[key] = val + return val + + def __setitem__(self, key: str | int | None, value: Any) -> None: + self._data[key] = value + + def __delitem__(self, key: str | int | None) -> None: + del self._data[key] + + def copy(self) -> LocaleDataDict: + return LocaleDataDict(self._data.copy(), base=self.base) diff --git a/venv/Lib/site-packages/babel/localtime/__init__.py b/venv/Lib/site-packages/babel/localtime/__init__.py new file mode 100644 index 0000000..e1ece73 --- /dev/null +++ b/venv/Lib/site-packages/babel/localtime/__init__.py @@ -0,0 +1,43 @@ +""" + babel.localtime + ~~~~~~~~~~~~~~~ + + Babel specific fork of tzlocal to determine the local timezone + of the system. + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" + +import datetime +import sys + +if sys.platform == 'win32': + from babel.localtime._win32 import _get_localzone +else: + from babel.localtime._unix import _get_localzone + + +# TODO(3.0): the offset constants are not part of the public API +# and should be removed +from babel.localtime._fallback import ( + DSTDIFF, # noqa: F401 + DSTOFFSET, # noqa: F401 + STDOFFSET, # noqa: F401 + ZERO, # noqa: F401 + _FallbackLocalTimezone, +) + + +def get_localzone() -> datetime.tzinfo: + """Returns the current underlying local timezone object. + Generally this function does not need to be used, it's a + better idea to use the :data:`LOCALTZ` singleton instead. + """ + return _get_localzone() + + +try: + LOCALTZ = get_localzone() +except LookupError: + LOCALTZ = _FallbackLocalTimezone() diff --git a/venv/Lib/site-packages/babel/localtime/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/babel/localtime/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..6bb105f Binary files /dev/null and b/venv/Lib/site-packages/babel/localtime/__pycache__/__init__.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/localtime/__pycache__/_fallback.cpython-312.pyc b/venv/Lib/site-packages/babel/localtime/__pycache__/_fallback.cpython-312.pyc new file mode 100644 index 0000000..825266f Binary files /dev/null and b/venv/Lib/site-packages/babel/localtime/__pycache__/_fallback.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/localtime/__pycache__/_helpers.cpython-312.pyc b/venv/Lib/site-packages/babel/localtime/__pycache__/_helpers.cpython-312.pyc new file mode 100644 index 0000000..f89c601 Binary files /dev/null and b/venv/Lib/site-packages/babel/localtime/__pycache__/_helpers.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/localtime/__pycache__/_unix.cpython-312.pyc b/venv/Lib/site-packages/babel/localtime/__pycache__/_unix.cpython-312.pyc new file mode 100644 index 0000000..6b8a66b Binary files /dev/null and b/venv/Lib/site-packages/babel/localtime/__pycache__/_unix.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/localtime/__pycache__/_win32.cpython-312.pyc b/venv/Lib/site-packages/babel/localtime/__pycache__/_win32.cpython-312.pyc new file mode 100644 index 0000000..40124de Binary files /dev/null and b/venv/Lib/site-packages/babel/localtime/__pycache__/_win32.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/localtime/_fallback.py b/venv/Lib/site-packages/babel/localtime/_fallback.py new file mode 100644 index 0000000..14979a5 --- /dev/null +++ b/venv/Lib/site-packages/babel/localtime/_fallback.py @@ -0,0 +1,44 @@ +""" + babel.localtime._fallback + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + Emulated fallback local timezone when all else fails. + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" + +import datetime +import time + +STDOFFSET = datetime.timedelta(seconds=-time.timezone) +DSTOFFSET = datetime.timedelta(seconds=-time.altzone) if time.daylight else STDOFFSET + +DSTDIFF = DSTOFFSET - STDOFFSET +ZERO = datetime.timedelta(0) + + +class _FallbackLocalTimezone(datetime.tzinfo): + + def utcoffset(self, dt: datetime.datetime) -> datetime.timedelta: + if self._isdst(dt): + return DSTOFFSET + else: + return STDOFFSET + + def dst(self, dt: datetime.datetime) -> datetime.timedelta: + if self._isdst(dt): + return DSTDIFF + else: + return ZERO + + def tzname(self, dt: datetime.datetime) -> str: + return time.tzname[self._isdst(dt)] + + def _isdst(self, dt: datetime.datetime) -> bool: + tt = (dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.weekday(), 0, -1) + stamp = time.mktime(tt) + tt = time.localtime(stamp) + return tt.tm_isdst > 0 diff --git a/venv/Lib/site-packages/babel/localtime/_helpers.py b/venv/Lib/site-packages/babel/localtime/_helpers.py new file mode 100644 index 0000000..f27b315 --- /dev/null +++ b/venv/Lib/site-packages/babel/localtime/_helpers.py @@ -0,0 +1,43 @@ +try: + import pytz +except ModuleNotFoundError: + pytz = None + import zoneinfo + + +def _get_tzinfo(tzenv: str): + """Get the tzinfo from `zoneinfo` or `pytz` + + :param tzenv: timezone in the form of Continent/City + :return: tzinfo object or None if not found + """ + if pytz: + try: + return pytz.timezone(tzenv) + except pytz.UnknownTimeZoneError: + pass + else: + try: + return zoneinfo.ZoneInfo(tzenv) + except zoneinfo.ZoneInfoNotFoundError: + pass + + return None + + +def _get_tzinfo_or_raise(tzenv: str): + tzinfo = _get_tzinfo(tzenv) + if tzinfo is None: + raise LookupError( + f"Can not find timezone {tzenv}. \n" + "Timezone names are generally in the form `Continent/City`.", + ) + return tzinfo + + +def _get_tzinfo_from_file(tzfilename: str): + with open(tzfilename, 'rb') as tzfile: + if pytz: + return pytz.tzfile.build_tzinfo('local', tzfile) + else: + return zoneinfo.ZoneInfo.from_file(tzfile) diff --git a/venv/Lib/site-packages/babel/localtime/_unix.py b/venv/Lib/site-packages/babel/localtime/_unix.py new file mode 100644 index 0000000..eb81beb --- /dev/null +++ b/venv/Lib/site-packages/babel/localtime/_unix.py @@ -0,0 +1,98 @@ +import datetime +import os +import re + +from babel.localtime._helpers import ( + _get_tzinfo, + _get_tzinfo_from_file, + _get_tzinfo_or_raise, +) + + +def _tz_from_env(tzenv: str) -> datetime.tzinfo: + if tzenv[0] == ':': + tzenv = tzenv[1:] + + # TZ specifies a file + if os.path.exists(tzenv): + return _get_tzinfo_from_file(tzenv) + + # TZ specifies a zoneinfo zone. + return _get_tzinfo_or_raise(tzenv) + + +def _get_localzone(_root: str = '/') -> datetime.tzinfo: + """Tries to find the local timezone configuration. + This method prefers finding the timezone name and passing that to + zoneinfo or pytz, over passing in the localtime file, as in the later + case the zoneinfo name is unknown. + The parameter _root makes the function look for files like /etc/localtime + beneath the _root directory. This is primarily used by the tests. + In normal usage you call the function without parameters. + """ + + tzenv = os.environ.get('TZ') + if tzenv: + return _tz_from_env(tzenv) + + # This is actually a pretty reliable way to test for the local time + # zone on operating systems like OS X. On OS X especially this is the + # only one that actually works. + try: + link_dst = os.readlink('/etc/localtime') + except OSError: + pass + else: + pos = link_dst.find('/zoneinfo/') + if pos >= 0: + zone_name = link_dst[pos + 10:] + tzinfo = _get_tzinfo(zone_name) + if tzinfo is not None: + return tzinfo + + # Now look for distribution specific configuration files + # that contain the timezone name. + tzpath = os.path.join(_root, 'etc/timezone') + if os.path.exists(tzpath): + with open(tzpath, 'rb') as tzfile: + data = tzfile.read() + + # Issue #3 in tzlocal was that /etc/timezone was a zoneinfo file. + # That's a misconfiguration, but we need to handle it gracefully: + if data[:5] != b'TZif2': + etctz = data.strip().decode() + # Get rid of host definitions and comments: + if ' ' in etctz: + etctz, dummy = etctz.split(' ', 1) + if '#' in etctz: + etctz, dummy = etctz.split('#', 1) + + return _get_tzinfo_or_raise(etctz.replace(' ', '_')) + + # CentOS has a ZONE setting in /etc/sysconfig/clock, + # OpenSUSE has a TIMEZONE setting in /etc/sysconfig/clock and + # Gentoo has a TIMEZONE setting in /etc/conf.d/clock + # We look through these files for a timezone: + timezone_re = re.compile(r'\s*(TIME)?ZONE\s*=\s*"(?P.+)"') + + for filename in ('etc/sysconfig/clock', 'etc/conf.d/clock'): + tzpath = os.path.join(_root, filename) + if not os.path.exists(tzpath): + continue + with open(tzpath) as tzfile: + for line in tzfile: + match = timezone_re.match(line) + if match is not None: + # We found a timezone + etctz = match.group("etctz") + return _get_tzinfo_or_raise(etctz.replace(' ', '_')) + + # No explicit setting existed. Use localtime + for filename in ('etc/localtime', 'usr/local/etc/localtime'): + tzpath = os.path.join(_root, filename) + + if not os.path.exists(tzpath): + continue + return _get_tzinfo_from_file(tzpath) + + raise LookupError('Can not find any timezone configuration') diff --git a/venv/Lib/site-packages/babel/localtime/_win32.py b/venv/Lib/site-packages/babel/localtime/_win32.py new file mode 100644 index 0000000..1a52567 --- /dev/null +++ b/venv/Lib/site-packages/babel/localtime/_win32.py @@ -0,0 +1,98 @@ +from __future__ import annotations + +try: + import winreg +except ImportError: + winreg = None + +import datetime +from typing import Any, Dict, cast + +from babel.core import get_global +from babel.localtime._helpers import _get_tzinfo_or_raise + +# When building the cldr data on windows this module gets imported. +# Because at that point there is no global.dat yet this call will +# fail. We want to catch it down in that case then and just assume +# the mapping was empty. +try: + tz_names: dict[str, str] = cast(Dict[str, str], get_global('windows_zone_mapping')) +except RuntimeError: + tz_names = {} + + +def valuestodict(key) -> dict[str, Any]: + """Convert a registry key's values to a dictionary.""" + dict = {} + size = winreg.QueryInfoKey(key)[1] + for i in range(size): + data = winreg.EnumValue(key, i) + dict[data[0]] = data[1] + return dict + + +def get_localzone_name() -> str: + # Windows is special. It has unique time zone names (in several + # meanings of the word) available, but unfortunately, they can be + # translated to the language of the operating system, so we need to + # do a backwards lookup, by going through all time zones and see which + # one matches. + handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + + TZLOCALKEYNAME = r'SYSTEM\CurrentControlSet\Control\TimeZoneInformation' + localtz = winreg.OpenKey(handle, TZLOCALKEYNAME) + keyvalues = valuestodict(localtz) + localtz.Close() + if 'TimeZoneKeyName' in keyvalues: + # Windows 7 (and Vista?) + + # For some reason this returns a string with loads of NUL bytes at + # least on some systems. I don't know if this is a bug somewhere, I + # just work around it. + tzkeyname = keyvalues['TimeZoneKeyName'].split('\x00', 1)[0] + else: + # Windows 2000 or XP + + # This is the localized name: + tzwin = keyvalues['StandardName'] + + # Open the list of timezones to look up the real name: + TZKEYNAME = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones' + tzkey = winreg.OpenKey(handle, TZKEYNAME) + + # Now, match this value to Time Zone information + tzkeyname = None + for i in range(winreg.QueryInfoKey(tzkey)[0]): + subkey = winreg.EnumKey(tzkey, i) + sub = winreg.OpenKey(tzkey, subkey) + data = valuestodict(sub) + sub.Close() + if data.get('Std', None) == tzwin: + tzkeyname = subkey + break + + tzkey.Close() + handle.Close() + + if tzkeyname is None: + raise LookupError('Can not find Windows timezone configuration') + + timezone = tz_names.get(tzkeyname) + if timezone is None: + # Nope, that didn't work. Try adding 'Standard Time', + # it seems to work a lot of times: + timezone = tz_names.get(f"{tzkeyname} Standard Time") + + # Return what we have. + if timezone is None: + raise LookupError(f"Can not find timezone {tzkeyname}") + + return timezone + + +def _get_localzone() -> datetime.tzinfo: + if winreg is None: + raise LookupError( + 'Runtime support not available') + + return _get_tzinfo_or_raise(get_localzone_name()) diff --git a/venv/Lib/site-packages/babel/messages/__init__.py b/venv/Lib/site-packages/babel/messages/__init__.py new file mode 100644 index 0000000..883a2e0 --- /dev/null +++ b/venv/Lib/site-packages/babel/messages/__init__.py @@ -0,0 +1,21 @@ +""" + babel.messages + ~~~~~~~~~~~~~~ + + Support for ``gettext`` message catalogs. + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" + +from babel.messages.catalog import ( + Catalog, + Message, + TranslationError, +) + +__all__ = [ + "Catalog", + "Message", + "TranslationError", +] diff --git a/venv/Lib/site-packages/babel/messages/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/babel/messages/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..2d2e06d Binary files /dev/null and b/venv/Lib/site-packages/babel/messages/__pycache__/__init__.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/messages/__pycache__/catalog.cpython-312.pyc b/venv/Lib/site-packages/babel/messages/__pycache__/catalog.cpython-312.pyc new file mode 100644 index 0000000..05200fe Binary files /dev/null and b/venv/Lib/site-packages/babel/messages/__pycache__/catalog.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/messages/__pycache__/checkers.cpython-312.pyc b/venv/Lib/site-packages/babel/messages/__pycache__/checkers.cpython-312.pyc new file mode 100644 index 0000000..f2b83f5 Binary files /dev/null and b/venv/Lib/site-packages/babel/messages/__pycache__/checkers.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/messages/__pycache__/extract.cpython-312.pyc b/venv/Lib/site-packages/babel/messages/__pycache__/extract.cpython-312.pyc new file mode 100644 index 0000000..8f511cf Binary files /dev/null and b/venv/Lib/site-packages/babel/messages/__pycache__/extract.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/messages/__pycache__/frontend.cpython-312.pyc b/venv/Lib/site-packages/babel/messages/__pycache__/frontend.cpython-312.pyc new file mode 100644 index 0000000..20e911f Binary files /dev/null and b/venv/Lib/site-packages/babel/messages/__pycache__/frontend.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/messages/__pycache__/jslexer.cpython-312.pyc b/venv/Lib/site-packages/babel/messages/__pycache__/jslexer.cpython-312.pyc new file mode 100644 index 0000000..9a86624 Binary files /dev/null and b/venv/Lib/site-packages/babel/messages/__pycache__/jslexer.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/messages/__pycache__/mofile.cpython-312.pyc b/venv/Lib/site-packages/babel/messages/__pycache__/mofile.cpython-312.pyc new file mode 100644 index 0000000..601d56a Binary files /dev/null and b/venv/Lib/site-packages/babel/messages/__pycache__/mofile.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/messages/__pycache__/plurals.cpython-312.pyc b/venv/Lib/site-packages/babel/messages/__pycache__/plurals.cpython-312.pyc new file mode 100644 index 0000000..41d74c8 Binary files /dev/null and b/venv/Lib/site-packages/babel/messages/__pycache__/plurals.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/messages/__pycache__/pofile.cpython-312.pyc b/venv/Lib/site-packages/babel/messages/__pycache__/pofile.cpython-312.pyc new file mode 100644 index 0000000..0ce3e67 Binary files /dev/null and b/venv/Lib/site-packages/babel/messages/__pycache__/pofile.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/messages/__pycache__/setuptools_frontend.cpython-312.pyc b/venv/Lib/site-packages/babel/messages/__pycache__/setuptools_frontend.cpython-312.pyc new file mode 100644 index 0000000..c1ebec5 Binary files /dev/null and b/venv/Lib/site-packages/babel/messages/__pycache__/setuptools_frontend.cpython-312.pyc differ diff --git a/venv/Lib/site-packages/babel/messages/catalog.py b/venv/Lib/site-packages/babel/messages/catalog.py new file mode 100644 index 0000000..41adfae --- /dev/null +++ b/venv/Lib/site-packages/babel/messages/catalog.py @@ -0,0 +1,948 @@ +""" + babel.messages.catalog + ~~~~~~~~~~~~~~~~~~~~~~ + + Data structures for message catalogs. + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" +from __future__ import annotations + +import datetime +import re +from collections import OrderedDict +from collections.abc import Iterable, Iterator +from copy import copy +from difflib import SequenceMatcher +from email import message_from_string +from heapq import nlargest +from typing import TYPE_CHECKING + +from babel import __version__ as VERSION +from babel.core import Locale, UnknownLocaleError +from babel.dates import format_datetime +from babel.messages.plurals import get_plural +from babel.util import LOCALTZ, FixedOffsetTimezone, _cmp, distinct + +if TYPE_CHECKING: + from typing_extensions import TypeAlias + + _MessageID: TypeAlias = str | tuple[str, ...] | list[str] + +__all__ = ['Message', 'Catalog', 'TranslationError'] + +def get_close_matches(word, possibilities, n=3, cutoff=0.6): + """A modified version of ``difflib.get_close_matches``. + + It just passes ``autojunk=False`` to the ``SequenceMatcher``, to work + around https://github.com/python/cpython/issues/90825. + """ + if not n > 0: # pragma: no cover + raise ValueError(f"n must be > 0: {n!r}") + if not 0.0 <= cutoff <= 1.0: # pragma: no cover + raise ValueError(f"cutoff must be in [0.0, 1.0]: {cutoff!r}") + result = [] + s = SequenceMatcher(autojunk=False) # only line changed from difflib.py + s.set_seq2(word) + for x in possibilities: + s.set_seq1(x) + if s.real_quick_ratio() >= cutoff and \ + s.quick_ratio() >= cutoff and \ + s.ratio() >= cutoff: + result.append((s.ratio(), x)) + + # Move the best scorers to head of list + result = nlargest(n, result) + # Strip scores for the best n matches + return [x for score, x in result] + + +PYTHON_FORMAT = re.compile(r''' + \% + (?:\(([\w]*)\))? + ( + [-#0\ +]?(?:\*|[\d]+)? + (?:\.(?:\*|[\d]+))? + [hlL]? + ) + ([diouxXeEfFgGcrs%]) +''', re.VERBOSE) + + +def _parse_datetime_header(value: str) -> datetime.datetime: + match = re.match(r'^(?P.*?)(?P[+-]\d{4})?$', value) + + dt = datetime.datetime.strptime(match.group('datetime'), '%Y-%m-%d %H:%M') + + # Separate the offset into a sign component, hours, and # minutes + tzoffset = match.group('tzoffset') + if tzoffset is not None: + plus_minus_s, rest = tzoffset[0], tzoffset[1:] + hours_offset_s, mins_offset_s = rest[:2], rest[2:] + + # Make them all integers + plus_minus = int(f"{plus_minus_s}1") + hours_offset = int(hours_offset_s) + mins_offset = int(mins_offset_s) + + # Calculate net offset + net_mins_offset = hours_offset * 60 + net_mins_offset += mins_offset + net_mins_offset *= plus_minus + + # Create an offset object + tzoffset = FixedOffsetTimezone(net_mins_offset) + + # Store the offset in a datetime object + dt = dt.replace(tzinfo=tzoffset) + + return dt + + +class Message: + """Representation of a single message in a catalog.""" + + def __init__( + self, + id: _MessageID, + string: _MessageID | None = '', + locations: Iterable[tuple[str, int]] = (), + flags: Iterable[str] = (), + auto_comments: Iterable[str] = (), + user_comments: Iterable[str] = (), + previous_id: _MessageID = (), + lineno: int | None = None, + context: str | None = None, + ) -> None: + """Create the message object. + + :param id: the message ID, or a ``(singular, plural)`` tuple for + pluralizable messages + :param string: the translated message string, or a + ``(singular, plural)`` tuple for pluralizable messages + :param locations: a sequence of ``(filename, lineno)`` tuples + :param flags: a set or sequence of flags + :param auto_comments: a sequence of automatic comments for the message + :param user_comments: a sequence of user comments for the message + :param previous_id: the previous message ID, or a ``(singular, plural)`` + tuple for pluralizable messages + :param lineno: the line number on which the msgid line was found in the + PO file, if any + :param context: the message context + """ + self.id = id + if not string and self.pluralizable: + string = ('', '') + self.string = string + self.locations = list(distinct(locations)) + self.flags = set(flags) + if id and self.python_format: + self.flags.add('python-format') + else: + self.flags.discard('python-format') + self.auto_comments = list(distinct(auto_comments)) + self.user_comments = list(distinct(user_comments)) + if isinstance(previous_id, str): + self.previous_id = [previous_id] + else: + self.previous_id = list(previous_id) + self.lineno = lineno + self.context = context + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.id!r} (flags: {list(self.flags)!r})>" + + def __cmp__(self, other: object) -> int: + """Compare Messages, taking into account plural ids""" + def values_to_compare(obj): + if isinstance(obj, Message) and obj.pluralizable: + return obj.id[0], obj.context or '' + return obj.id, obj.context or '' + return _cmp(values_to_compare(self), values_to_compare(other)) + + def __gt__(self, other: object) -> bool: + return self.__cmp__(other) > 0 + + def __lt__(self, other: object) -> bool: + return self.__cmp__(other) < 0 + + def __ge__(self, other: object) -> bool: + return self.__cmp__(other) >= 0 + + def __le__(self, other: object) -> bool: + return self.__cmp__(other) <= 0 + + def __eq__(self, other: object) -> bool: + return self.__cmp__(other) == 0 + + def __ne__(self, other: object) -> bool: + return self.__cmp__(other) != 0 + + def is_identical(self, other: Message) -> bool: + """Checks whether messages are identical, taking into account all + properties. + """ + assert isinstance(other, Message) + return self.__dict__ == other.__dict__ + + def clone(self) -> Message: + return Message(*map(copy, (self.id, self.string, self.locations, + self.flags, self.auto_comments, + self.user_comments, self.previous_id, + self.lineno, self.context))) + + def check(self, catalog: Catalog | None = None) -> list[TranslationError]: + """Run various validation checks on the message. Some validations + are only performed if the catalog is provided. This method returns + a sequence of `TranslationError` objects. + + :rtype: ``iterator`` + :param catalog: A catalog instance that is passed to the checkers + :see: `Catalog.check` for a way to perform checks for all messages + in a catalog. + """ + from babel.messages.checkers import checkers + errors: list[TranslationError] = [] + for checker in checkers: + try: + checker(catalog, self) + except TranslationError as e: + errors.append(e) + return errors + + @property + def fuzzy(self) -> bool: + """Whether the translation is fuzzy. + + >>> Message('foo').fuzzy + False + >>> msg = Message('foo', 'foo', flags=['fuzzy']) + >>> msg.fuzzy + True + >>> msg + + + :type: `bool`""" + return 'fuzzy' in self.flags + + @property + def pluralizable(self) -> bool: + """Whether the message is plurizable. + + >>> Message('foo').pluralizable + False + >>> Message(('foo', 'bar')).pluralizable + True + + :type: `bool`""" + return isinstance(self.id, (list, tuple)) + + @property + def python_format(self) -> bool: + """Whether the message contains Python-style parameters. + + >>> Message('foo %(name)s bar').python_format + True + >>> Message(('foo %(name)s', 'foo %(name)s')).python_format + True + + :type: `bool`""" + ids = self.id + if not isinstance(ids, (list, tuple)): + ids = [ids] + return any(PYTHON_FORMAT.search(id) for id in ids) + + +class TranslationError(Exception): + """Exception thrown by translation checkers when invalid message + translations are encountered.""" + + +DEFAULT_HEADER = """\ +# Translations template for PROJECT. +# Copyright (C) YEAR ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , YEAR. +#""" + + +def parse_separated_header(value: str) -> dict[str, str]: + # Adapted from https://peps.python.org/pep-0594/#cgi + from email.message import Message + m = Message() + m['content-type'] = value + return dict(m.get_params()) + + +class Catalog: + """Representation of a message catalog.""" + + def __init__( + self, + locale: str | Locale | None = None, + domain: str | None = None, + header_comment: str | None = DEFAULT_HEADER, + project: str | None = None, + version: str | None = None, + copyright_holder: str | None = None, + msgid_bugs_address: str | None = None, + creation_date: datetime.datetime | str | None = None, + revision_date: datetime.datetime | datetime.time | float | str | None = None, + last_translator: str | None = None, + language_team: str | None = None, + charset: str | None = None, + fuzzy: bool = True, + ) -> None: + """Initialize the catalog object. + + :param locale: the locale identifier or `Locale` object, or `None` + if the catalog is not bound to a locale (which basically + means it's a template) + :param domain: the message domain + :param header_comment: the header comment as string, or `None` for the + default header + :param project: the project's name + :param version: the project's version + :param copyright_holder: the copyright holder of the catalog + :param msgid_bugs_address: the email address or URL to submit bug + reports to + :param creation_date: the date the catalog was created + :param revision_date: the date the catalog was revised + :param last_translator: the name and email of the last translator + :param language_team: the name and email of the language team + :param charset: the encoding to use in the output (defaults to utf-8) + :param fuzzy: the fuzzy bit on the catalog header + """ + self.domain = domain + self.locale = locale + self._header_comment = header_comment + self._messages: OrderedDict[str | tuple[str, str], Message] = OrderedDict() + + self.project = project or 'PROJECT' + self.version = version or 'VERSION' + self.copyright_holder = copyright_holder or 'ORGANIZATION' + self.msgid_bugs_address = msgid_bugs_address or 'EMAIL@ADDRESS' + + self.last_translator = last_translator or 'FULL NAME ' + """Name and email address of the last translator.""" + self.language_team = language_team or 'LANGUAGE ' + """Name and email address of the language team.""" + + self.charset = charset or 'utf-8' + + if creation_date is None: + creation_date = datetime.datetime.now(LOCALTZ) + elif isinstance(creation_date, datetime.datetime) and not creation_date.tzinfo: + creation_date = creation_date.replace(tzinfo=LOCALTZ) + self.creation_date = creation_date + if revision_date is None: + revision_date = 'YEAR-MO-DA HO:MI+ZONE' + elif isinstance(revision_date, datetime.datetime) and not revision_date.tzinfo: + revision_date = revision_date.replace(tzinfo=LOCALTZ) + self.revision_date = revision_date + self.fuzzy = fuzzy + + # Dictionary of obsolete messages + self.obsolete: OrderedDict[str | tuple[str, str], Message] = OrderedDict() + self._num_plurals = None + self._plural_expr = None + + def _set_locale(self, locale: Locale | str | None) -> None: + if locale is None: + self._locale_identifier = None + self._locale = None + return + + if isinstance(locale, Locale): + self._locale_identifier = str(locale) + self._locale = locale + return + + if isinstance(locale, str): + self._locale_identifier = str(locale) + try: + self._locale = Locale.parse(locale) + except UnknownLocaleError: + self._locale = None + return + + raise TypeError(f"`locale` must be a Locale, a locale identifier string, or None; got {locale!r}") + + def _get_locale(self) -> Locale | None: + return self._locale + + def _get_locale_identifier(self) -> str | None: + return self._locale_identifier + + locale = property(_get_locale, _set_locale) + locale_identifier = property(_get_locale_identifier) + + def _get_header_comment(self) -> str: + comment = self._header_comment + year = datetime.datetime.now(LOCALTZ).strftime('%Y') + if hasattr(self.revision_date, 'strftime'): + year = self.revision_date.strftime('%Y') + comment = comment.replace('PROJECT', self.project) \ + .replace('VERSION', self.version) \ + .replace('YEAR', year) \ + .replace('ORGANIZATION', self.copyright_holder) + locale_name = (self.locale.english_name if self.locale else self.locale_identifier) + if locale_name: + comment = comment.replace("Translations template", f"{locale_name} translations") + return comment + + def _set_header_comment(self, string: str | None) -> None: + self._header_comment = string + + header_comment = property(_get_header_comment, _set_header_comment, doc="""\ + The header comment for the catalog. + + >>> catalog = Catalog(project='Foobar', version='1.0', + ... copyright_holder='Foo Company') + >>> print(catalog.header_comment) #doctest: +ELLIPSIS + # Translations template for Foobar. + # Copyright (C) ... Foo Company + # This file is distributed under the same license as the Foobar project. + # FIRST AUTHOR , .... + # + + The header can also be set from a string. Any known upper-case variables + will be replaced when the header is retrieved again: + + >>> catalog = Catalog(project='Foobar', version='1.0', + ... copyright_holder='Foo Company') + >>> catalog.header_comment = '''\\ + ... # The POT for my really cool PROJECT project. + ... # Copyright (C) 1990-2003 ORGANIZATION + ... # This file is distributed under the same license as the PROJECT + ... # project. + ... #''' + >>> print(catalog.header_comment) + # The POT for my really cool Foobar project. + # Copyright (C) 1990-2003 Foo Company + # This file is distributed under the same license as the Foobar + # project. + # + + :type: `unicode` + """) + + def _get_mime_headers(self) -> list[tuple[str, str]]: + headers: list[tuple[str, str]] = [] + headers.append(("Project-Id-Version", f"{self.project} {self.version}")) + headers.append(('Report-Msgid-Bugs-To', self.msgid_bugs_address)) + headers.append(('POT-Creation-Date', + format_datetime(self.creation_date, 'yyyy-MM-dd HH:mmZ', + locale='en'))) + if isinstance(self.revision_date, (datetime.datetime, datetime.time, int, float)): + headers.append(('PO-Revision-Date', + format_datetime(self.revision_date, + 'yyyy-MM-dd HH:mmZ', locale='en'))) + else: + headers.append(('PO-Revision-Date', self.revision_date)) + headers.append(('Last-Translator', self.last_translator)) + if self.locale_identifier: + headers.append(('Language', str(self.locale_identifier))) + if self.locale_identifier and ('LANGUAGE' in self.language_team): + headers.append(('Language-Team', + self.language_team.replace('LANGUAGE', + str(self.locale_identifier)))) + else: + headers.append(('Language-Team', self.language_team)) + if self.locale is not None: + headers.append(('Plural-Forms', self.plural_forms)) + headers.append(('MIME-Version', '1.0')) + headers.append(("Content-Type", f"text/plain; charset={self.charset}")) + headers.append(('Content-Transfer-Encoding', '8bit')) + headers.append(("Generated-By", f"Babel {VERSION}\n")) + return headers + + def _force_text(self, s: str | bytes, encoding: str = 'utf-8', errors: str = 'strict') -> str: + if isinstance(s, str): + return s + if isinstance(s, bytes): + return s.decode(encoding, errors) + return str(s) + + def _set_mime_headers(self, headers: Iterable[tuple[str, str]]) -> None: + for name, value in headers: + name = self._force_text(name.lower(), encoding=self.charset) + value = self._force_text(value, encoding=self.charset) + if name == 'project-id-version': + parts = value.split(' ') + self.project = ' '.join(parts[:-1]) + self.version = parts[-1] + elif name == 'report-msgid-bugs-to': + self.msgid_bugs_address = value + elif name == 'last-translator': + self.last_translator = value + elif name == 'language': + value = value.replace('-', '_') + self._set_locale(value) + elif name == 'language-team': + self.language_team = value + elif name == 'content-type': + params = parse_separated_header(value) + if 'charset' in params: + self.charset = params['charset'].lower() + elif name == 'plural-forms': + params = parse_separated_header(f" ;{value}") + self._num_plurals = int(params.get('nplurals', 2)) + self._plural_expr = params.get('plural', '(n != 1)') + elif name == 'pot-creation-date': + self.creation_date = _parse_datetime_header(value) + elif name == 'po-revision-date': + # Keep the value if it's not the default one + if 'YEAR' not in value: + self.revision_date = _parse_datetime_header(value) + + mime_headers = property(_get_mime_headers, _set_mime_headers, doc="""\ + The MIME headers of the catalog, used for the special ``msgid ""`` entry. + + The behavior of this property changes slightly depending on whether a locale + is set or not, the latter indicating that the catalog is actually a template + for actual translations. + + Here's an example of the output for such a catalog template: + + >>> from babel.dates import UTC + >>> from datetime import datetime + >>> created = datetime(1990, 4, 1, 15, 30, tzinfo=UTC) + >>> catalog = Catalog(project='Foobar', version='1.0', + ... creation_date=created) + >>> for name, value in catalog.mime_headers: + ... print('%s: %s' % (name, value)) + Project-Id-Version: Foobar 1.0 + Report-Msgid-Bugs-To: EMAIL@ADDRESS + POT-Creation-Date: 1990-04-01 15:30+0000 + PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE + Last-Translator: FULL NAME + Language-Team: LANGUAGE + MIME-Version: 1.0 + Content-Type: text/plain; charset=utf-8 + Content-Transfer-Encoding: 8bit + Generated-By: Babel ... + + And here's an example of the output when the locale is set: + + >>> revised = datetime(1990, 8, 3, 12, 0, tzinfo=UTC) + >>> catalog = Catalog(locale='de_DE', project='Foobar', version='1.0', + ... creation_date=created, revision_date=revised, + ... last_translator='John Doe ', + ... language_team='de_DE ') + >>> for name, value in catalog.mime_headers: + ... print('%s: %s' % (name, value)) + Project-Id-Version: Foobar 1.0 + Report-Msgid-Bugs-To: EMAIL@ADDRESS + POT-Creation-Date: 1990-04-01 15:30+0000 + PO-Revision-Date: 1990-08-03 12:00+0000 + Last-Translator: John Doe + Language: de_DE + Language-Team: de_DE + Plural-Forms: nplurals=2; plural=(n != 1); + MIME-Version: 1.0 + Content-Type: text/plain; charset=utf-8 + Content-Transfer-Encoding: 8bit + Generated-By: Babel ... + + :type: `list` + """) + + @property + def num_plurals(self) -> int: + """The number of plurals used by the catalog or locale. + + >>> Catalog(locale='en').num_plurals + 2 + >>> Catalog(locale='ga').num_plurals + 5 + + :type: `int`""" + if self._num_plurals is None: + num = 2 + if self.locale: + num = get_plural(self.locale)[0] + self._num_plurals = num + return self._num_plurals + + @property + def plural_expr(self) -> str: + """The plural expression used by the catalog or locale. + + >>> Catalog(locale='en').plural_expr + '(n != 1)' + >>> Catalog(locale='ga').plural_expr + '(n==1 ? 0 : n==2 ? 1 : n>=3 && n<=6 ? 2 : n>=7 && n<=10 ? 3 : 4)' + >>> Catalog(locale='ding').plural_expr # unknown locale + '(n != 1)' + + :type: `str`""" + if self._plural_expr is None: + expr = '(n != 1)' + if self.locale: + expr = get_plural(self.locale)[1] + self._plural_expr = expr + return self._plural_expr + + @property + def plural_forms(self) -> str: + """Return the plural forms declaration for the locale. + + >>> Catalog(locale='en').plural_forms + 'nplurals=2; plural=(n != 1);' + >>> Catalog(locale='pt_BR').plural_forms + 'nplurals=2; plural=(n > 1);' + + :type: `str`""" + return f"nplurals={self.num_plurals}; plural={self.plural_expr};" + + def __contains__(self, id: _MessageID) -> bool: + """Return whether the catalog has a message with the specified ID.""" + return self._key_for(id) in self._messages + + def __len__(self) -> int: + """The number of messages in the catalog. + + This does not include the special ``msgid ""`` entry.""" + return len(self._messages) + + def __iter__(self) -> Iterator[Message]: + """Iterates through all the entries in the catalog, in the order they + were added, yielding a `Message` object for every entry. + + :rtype: ``iterator``""" + buf = [] + for name, value in self.mime_headers: + buf.append(f"{name}: {value}") + flags = set() + if self.fuzzy: + flags |= {'fuzzy'} + yield Message('', '\n'.join(buf), flags=flags) + for key in self._messages: + yield self._messages[key] + + def __repr__(self) -> str: + locale = '' + if self.locale: + locale = f" {self.locale}" + return f"<{type(self).__name__} {self.domain!r}{locale}>" + + def __delitem__(self, id: _MessageID) -> None: + """Delete the message with the specified ID.""" + self.delete(id) + + def __getitem__(self, id: _MessageID) -> Message: + """Return the message with the specified ID. + + :param id: the message ID + """ + return self.get(id) + + def __setitem__(self, id: _MessageID, message: Message) -> None: + """Add or update the message with the specified ID. + + >>> catalog = Catalog() + >>> catalog[u'foo'] = Message(u'foo') + >>> catalog[u'foo'] + + + If a message with that ID is already in the catalog, it is updated + to include the locations and flags of the new message. + + >>> catalog = Catalog() + >>> catalog[u'foo'] = Message(u'foo', locations=[('main.py', 1)]) + >>> catalog[u'foo'].locations + [('main.py', 1)] + >>> catalog[u'foo'] = Message(u'foo', locations=[('utils.py', 5)]) + >>> catalog[u'foo'].locations + [('main.py', 1), ('utils.py', 5)] + + :param id: the message ID + :param message: the `Message` object + """ + assert isinstance(message, Message), 'expected a Message object' + key = self._key_for(id, message.context) + current = self._messages.get(key) + if current: + if message.pluralizable and not current.pluralizable: + # The new message adds pluralization + current.id = message.id + current.string = message.string + current.locations = list(distinct(current.locations + + message.locations)) + current.auto_comments = list(distinct(current.auto_comments + + message.auto_comments)) + current.user_comments = list(distinct(current.user_comments + + message.user_comments)) + current.flags |= message.flags + message = current + elif id == '': + # special treatment for the header message + self.mime_headers = message_from_string(message.string).items() + self.header_comment = "\n".join([f"# {c}".rstrip() for c in message.user_comments]) + self.fuzzy = message.fuzzy + else: + if isinstance(id, (list, tuple)): + assert isinstance(message.string, (list, tuple)), \ + f"Expected sequence but got {type(message.string)}" + self._messages[key] = message + + def add( + self, + id: _MessageID, + string: _MessageID | None = None, + locations: Iterable[tuple[str, int]] = (), + flags: Iterable[str] = (), + auto_comments: Iterable[str] = (), + user_comments: Iterable[str] = (), + previous_id: _MessageID = (), + lineno: int | None = None, + context: str | None = None, + ) -> Message: + """Add or update the message with the specified ID. + + >>> catalog = Catalog() + >>> catalog.add(u'foo') + + >>> catalog[u'foo'] + + + This method simply constructs a `Message` object with the given + arguments and invokes `__setitem__` with that object. + + :param id: the message ID, or a ``(singular, plural)`` tuple for + pluralizable messages + :param string: the translated message string, or a + ``(singular, plural)`` tuple for pluralizable messages + :param locations: a sequence of ``(filename, lineno)`` tuples + :param flags: a set or sequence of flags + :param auto_comments: a sequence of automatic comments + :param user_comments: a sequence of user comments + :param previous_id: the previous message ID, or a ``(singular, plural)`` + tuple for pluralizable messages + :param lineno: the line number on which the msgid line was found in the + PO file, if any + :param context: the message context + """ + message = Message(id, string, list(locations), flags, auto_comments, + user_comments, previous_id, lineno=lineno, + context=context) + self[id] = message + return message + + def check(self) -> Iterable[tuple[Message, list[TranslationError]]]: + """Run various validation checks on the translations in the catalog. + + For every message which fails validation, this method yield a + ``(message, errors)`` tuple, where ``message`` is the `Message` object + and ``errors`` is a sequence of `TranslationError` objects. + + :rtype: ``generator`` of ``(message, errors)`` + """ + for message in self._messages.values(): + errors = message.check(catalog=self) + if errors: + yield message, errors + + def get(self, id: _MessageID, context: str | None = None) -> Message | None: + """Return the message with the specified ID and context. + + :param id: the message ID + :param context: the message context, or ``None`` for no context + """ + return self._messages.get(self._key_for(id, context)) + + def delete(self, id: _MessageID, context: str | None = None) -> None: + """Delete the message with the specified ID and context. + + :param id: the message ID + :param context: the message context, or ``None`` for no context + """ + key = self._key_for(id, context) + if key in self._messages: + del self._messages[key] + + def update( + self, + template: Catalog, + no_fuzzy_matching: bool = False, + update_header_comment: bool = False, + keep_user_comments: bool = True, + update_creation_date: bool = True, + ) -> None: + """Update the catalog based on the given template catalog. + + >>> from babel.messages import Catalog + >>> template = Catalog() + >>> template.add('green', locations=[('main.py', 99)]) + + >>> template.add('blue', locations=[('main.py', 100)]) + + >>> template.add(('salad', 'salads'), locations=[('util.py', 42)]) + + >>> catalog = Catalog(locale='de_DE') + >>> catalog.add('blue', u'blau', locations=[('main.py', 98)]) + + >>> catalog.add('head', u'Kopf', locations=[('util.py', 33)]) + + >>> catalog.add(('salad', 'salads'), (u'Salat', u'Salate'), + ... locations=[('util.py', 38)]) + + + >>> catalog.update(template) + >>> len(catalog) + 3 + + >>> msg1 = catalog['green'] + >>> msg1.string + >>> msg1.locations + [('main.py', 99)] + + >>> msg2 = catalog['blue'] + >>> msg2.string + u'blau' + >>> msg2.locations + [('main.py', 100)] + + >>> msg3 = catalog['salad'] + >>> msg3.string + (u'Salat', u'Salate') + >>> msg3.locations + [('util.py', 42)] + + Messages that are in the catalog but not in the template are removed + from the main collection, but can still be accessed via the `obsolete` + member: + + >>> 'head' in catalog + False + >>> list(catalog.obsolete.values()) + [] + + :param template: the reference catalog, usually read from a POT file + :param no_fuzzy_matching: whether to use fuzzy matching of message IDs + """ + messages = self._messages + remaining = messages.copy() + self._messages = OrderedDict() + + # Prepare for fuzzy matching + fuzzy_candidates = {} + if not no_fuzzy_matching: + for msgid in messages: + if msgid and messages[msgid].string: + key = self._key_for(msgid) + ctxt = messages[msgid].context + fuzzy_candidates[self._to_fuzzy_match_key(key)] = (key, ctxt) + fuzzy_matches = set() + + def _merge(message: Message, oldkey: tuple[str, str] | str, newkey: tuple[str, str] | str) -> None: + message = message.clone() + fuzzy = False + if oldkey != newkey: + fuzzy = True + fuzzy_matches.add(oldkey) + oldmsg = messages.get(oldkey) + assert oldmsg is not None + if isinstance(oldmsg.id, str): + message.previous_id = [oldmsg.id] + else: + message.previous_id = list(oldmsg.id) + else: + oldmsg = remaining.pop(oldkey, None) + assert oldmsg is not None + message.string = oldmsg.string + + if keep_user_comments: + message.user_comments = list(distinct(oldmsg.user_comments)) + + if isinstance(message.id, (list, tuple)): + if not isinstance(message.string, (list, tuple)): + fuzzy = True + message.string = tuple( + [message.string] + ([''] * (len(message.id) - 1)), + ) + elif len(message.string) != self.num_plurals: + fuzzy = True + message.string = tuple(message.string[:len(oldmsg.string)]) + elif isinstance(message.string, (list, tuple)): + fuzzy = True + message.string = message.string[0] + message.flags |= oldmsg.flags + if fuzzy: + message.flags |= {'fuzzy'} + self[message.id] = message + + for message in template: + if message.id: + key = self._key_for(message.id, message.context) + if key in messages: + _merge(message, key, key) + else: + if not no_fuzzy_matching: + # do some fuzzy matching with difflib + matches = get_close_matches( + self._to_fuzzy_match_key(key), + fuzzy_candidates.keys(), + 1, + ) + if matches: + modified_key = matches[0] + newkey, newctxt = fuzzy_candidates[modified_key] + if newctxt is not None: + newkey = newkey, newctxt + _merge(message, newkey, key) + continue + + self[message.id] = message + + for msgid in remaining: + if no_fuzzy_matching or msgid not in fuzzy_matches: + self.obsolete[msgid] = remaining[msgid] + + if update_header_comment: + # Allow the updated catalog's header to be rewritten based on the + # template's header + self.header_comment = template.header_comment + + # Make updated catalog's POT-Creation-Date equal to the template + # used to update the catalog + if update_creation_date: + self.creation_date = template.creation_date + + def _to_fuzzy_match_key(self, key: tuple[str, str] | str) -> str: + """Converts a message key to a string suitable for fuzzy matching.""" + if isinstance(key, tuple): + matchkey = key[0] # just the msgid, no context + else: + matchkey = key + return matchkey.lower().strip() + + def _key_for(self, id: _MessageID, context: str | None = None) -> tuple[str, str] | str: + """The key for a message is just the singular ID even for pluralizable + messages, but is a ``(msgid, msgctxt)`` tuple for context-specific + messages. + """ + key = id + if isinstance(key, (list, tuple)): + key = id[0] + if context is not None: + key = (key, context) + return key + + def is_identical(self, other: Catalog) -> bool: + """Checks if catalogs are identical, taking into account messages and + headers. + """ + assert isinstance(other, Catalog) + for key in self._messages.keys() | other._messages.keys(): + message_1 = self.get(key) + message_2 = other.get(key) + if ( + message_1 is None + or message_2 is None + or not message_1.is_identical(message_2) + ): + return False + return dict(self.mime_headers) == dict(other.mime_headers) diff --git a/venv/Lib/site-packages/babel/messages/checkers.py b/venv/Lib/site-packages/babel/messages/checkers.py new file mode 100644 index 0000000..e5448e0 --- /dev/null +++ b/venv/Lib/site-packages/babel/messages/checkers.py @@ -0,0 +1,173 @@ +""" + babel.messages.checkers + ~~~~~~~~~~~~~~~~~~~~~~~ + + Various routines that help with validation of translations. + + :since: version 0.9 + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" +from __future__ import annotations + +from collections.abc import Callable + +from babel.messages.catalog import PYTHON_FORMAT, Catalog, Message, TranslationError + +#: list of format chars that are compatible to each other +_string_format_compatibilities = [ + {'i', 'd', 'u'}, + {'x', 'X'}, + {'f', 'F', 'g', 'G'}, +] + + +def num_plurals(catalog: Catalog | None, message: Message) -> None: + """Verify the number of plurals in the translation.""" + if not message.pluralizable: + if not isinstance(message.string, str): + raise TranslationError("Found plural forms for non-pluralizable " + "message") + return + + # skip further tests if no catalog is provided. + elif catalog is None: + return + + msgstrs = message.string + if not isinstance(msgstrs, (list, tuple)): + msgstrs = (msgstrs,) + if len(msgstrs) != catalog.num_plurals: + raise TranslationError("Wrong number of plural forms (expected %d)" % + catalog.num_plurals) + + +def python_format(catalog: Catalog | None, message: Message) -> None: + """Verify the format string placeholders in the translation.""" + if 'python-format' not in message.flags: + return + msgids = message.id + if not isinstance(msgids, (list, tuple)): + msgids = (msgids,) + msgstrs = message.string + if not isinstance(msgstrs, (list, tuple)): + msgstrs = (msgstrs,) + + for msgid, msgstr in zip(msgids, msgstrs): + if msgstr: + _validate_format(msgid, msgstr) + + +def _validate_format(format: str, alternative: str) -> None: + """Test format string `alternative` against `format`. `format` can be the + msgid of a message and `alternative` one of the `msgstr`\\s. The two + arguments are not interchangeable as `alternative` may contain less + placeholders if `format` uses named placeholders. + + The behavior of this function is undefined if the string does not use + string formatting. + + If the string formatting of `alternative` is compatible to `format` the + function returns `None`, otherwise a `TranslationError` is raised. + + Examples for compatible format strings: + + >>> _validate_format('Hello %s!', 'Hallo %s!') + >>> _validate_format('Hello %i!', 'Hallo %d!') + + Example for an incompatible format strings: + + >>> _validate_format('Hello %(name)s!', 'Hallo %s!') + Traceback (most recent call last): + ... + TranslationError: the format strings are of different kinds + + This function is used by the `python_format` checker. + + :param format: The original format string + :param alternative: The alternative format string that should be checked + against format + :raises TranslationError: on formatting errors + """ + + def _parse(string: str) -> list[tuple[str, str]]: + result: list[tuple[str, str]] = [] + for match in PYTHON_FORMAT.finditer(string): + name, format, typechar = match.groups() + if typechar == '%' and name is None: + continue + result.append((name, str(typechar))) + return result + + def _compatible(a: str, b: str) -> bool: + if a == b: + return True + for set in _string_format_compatibilities: + if a in set and b in set: + return True + return False + + def _check_positional(results: list[tuple[str, str]]) -> bool: + positional = None + for name, _char in results: + if positional is None: + positional = name is None + else: + if (name is None) != positional: + raise TranslationError('format string mixes positional ' + 'and named placeholders') + return bool(positional) + + a, b = map(_parse, (format, alternative)) + + # now check if both strings are positional or named + a_positional, b_positional = map(_check_positional, (a, b)) + if a_positional and not b_positional and not b: + raise TranslationError('placeholders are incompatible') + elif a_positional != b_positional: + raise TranslationError('the format strings are of different kinds') + + # if we are operating on positional strings both must have the + # same number of format chars and those must be compatible + if a_positional: + if len(a) != len(b): + raise TranslationError('positional format placeholders are ' + 'unbalanced') + for idx, ((_, first), (_, second)) in enumerate(zip(a, b)): + if not _compatible(first, second): + raise TranslationError('incompatible format for placeholder ' + '%d: %r and %r are not compatible' % + (idx + 1, first, second)) + + # otherwise the second string must not have names the first one + # doesn't have and the types of those included must be compatible + else: + type_map = dict(a) + for name, typechar in b: + if name not in type_map: + raise TranslationError(f'unknown named placeholder {name!r}') + elif not _compatible(typechar, type_map[name]): + raise TranslationError( + f'incompatible format for placeholder {name!r}: ' + f'{typechar!r} and {type_map[name]!r} are not compatible', + ) + + +def _find_checkers() -> list[Callable[[Catalog | None, Message], object]]: + checkers: list[Callable[[Catalog | None, Message], object]] = [] + try: + from pkg_resources import working_set + except ImportError: + pass + else: + for entry_point in working_set.iter_entry_points('babel.checkers'): + checkers.append(entry_point.load()) + if len(checkers) == 0: + # if pkg_resources is not available or no usable egg-info was found + # (see #230), just resort to hard-coded checkers + return [num_plurals, python_format] + return checkers + + +checkers: list[Callable[[Catalog | None, Message], object]] = _find_checkers() diff --git a/venv/Lib/site-packages/babel/messages/extract.py b/venv/Lib/site-packages/babel/messages/extract.py new file mode 100644 index 0000000..b13f1a9 --- /dev/null +++ b/venv/Lib/site-packages/babel/messages/extract.py @@ -0,0 +1,842 @@ +""" + babel.messages.extract + ~~~~~~~~~~~~~~~~~~~~~~ + + Basic infrastructure for extracting localizable messages from source files. + + This module defines an extensible system for collecting localizable message + strings from a variety of sources. A native extractor for Python source + files is builtin, extractors for other sources can be added using very + simple plugins. + + The main entry points into the extraction functionality are the functions + `extract_from_dir` and `extract_from_file`. + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" +from __future__ import annotations + +import ast +import io +import os +import sys +import tokenize +from collections.abc import ( + Callable, + Collection, + Generator, + Iterable, + Mapping, + MutableSequence, +) +from os.path import relpath +from textwrap import dedent +from tokenize import COMMENT, NAME, OP, STRING, generate_tokens +from typing import TYPE_CHECKING, Any + +from babel.util import parse_encoding, parse_future_flags, pathmatch + +if TYPE_CHECKING: + from typing import IO, Protocol + + from _typeshed import SupportsItems, SupportsRead, SupportsReadline + from typing_extensions import Final, TypeAlias, TypedDict + + class _PyOptions(TypedDict, total=False): + encoding: str + + class _JSOptions(TypedDict, total=False): + encoding: str + jsx: bool + template_string: bool + parse_template_string: bool + + class _FileObj(SupportsRead[bytes], SupportsReadline[bytes], Protocol): + def seek(self, __offset: int, __whence: int = ...) -> int: ... + def tell(self) -> int: ... + + _SimpleKeyword: TypeAlias = tuple[int | tuple[int, int] | tuple[int, str], ...] | None + _Keyword: TypeAlias = dict[int | None, _SimpleKeyword] | _SimpleKeyword + + # 5-tuple of (filename, lineno, messages, comments, context) + _FileExtractionResult: TypeAlias = tuple[str, int, str | tuple[str, ...], list[str], str | None] + + # 4-tuple of (lineno, message, comments, context) + _ExtractionResult: TypeAlias = tuple[int, str | tuple[str, ...], list[str], str | None] + + # Required arguments: fileobj, keywords, comment_tags, options + # Return value: Iterable of (lineno, message, comments, context) + _CallableExtractionMethod: TypeAlias = Callable[ + [_FileObj | IO[bytes], Mapping[str, _Keyword], Collection[str], Mapping[str, Any]], + Iterable[_ExtractionResult], + ] + + _ExtractionMethod: TypeAlias = _CallableExtractionMethod | str + +GROUP_NAME: Final[str] = 'babel.extractors' + +DEFAULT_KEYWORDS: dict[str, _Keyword] = { + '_': None, + 'gettext': None, + 'ngettext': (1, 2), + 'ugettext': None, + 'ungettext': (1, 2), + 'dgettext': (2,), + 'dngettext': (2, 3), + 'N_': None, + 'pgettext': ((1, 'c'), 2), + 'npgettext': ((1, 'c'), 2, 3), +} + +DEFAULT_MAPPING: list[tuple[str, str]] = [('**.py', 'python')] + +# New tokens in Python 3.12, or None on older versions +FSTRING_START = getattr(tokenize, "FSTRING_START", None) +FSTRING_MIDDLE = getattr(tokenize, "FSTRING_MIDDLE", None) +FSTRING_END = getattr(tokenize, "FSTRING_END", None) + + +def _strip_comment_tags(comments: MutableSequence[str], tags: Iterable[str]): + """Helper function for `extract` that strips comment tags from strings + in a list of comment lines. This functions operates in-place. + """ + def _strip(line: str): + for tag in tags: + if line.startswith(tag): + return line[len(tag):].strip() + return line + comments[:] = map(_strip, comments) + + +def default_directory_filter(dirpath: str | os.PathLike[str]) -> bool: + subdir = os.path.basename(dirpath) + # Legacy default behavior: ignore dot and underscore directories + return not (subdir.startswith('.') or subdir.startswith('_')) + + +def extract_from_dir( + dirname: str | os.PathLike[str] | None = None, + method_map: Iterable[tuple[str, str]] = DEFAULT_MAPPING, + options_map: SupportsItems[str, dict[str, Any]] | None = None, + keywords: Mapping[str, _Keyword] = DEFAULT_KEYWORDS, + comment_tags: Collection[str] = (), + callback: Callable[[str, str, dict[str, Any]], object] | None = None, + strip_comment_tags: bool = False, + directory_filter: Callable[[str], bool] | None = None, +) -> Generator[_FileExtractionResult, None, None]: + """Extract messages from any source files found in the given directory. + + This function generates tuples of the form ``(filename, lineno, message, + comments, context)``. + + Which extraction method is used per file is determined by the `method_map` + parameter, which maps extended glob patterns to extraction method names. + For example, the following is the default mapping: + + >>> method_map = [ + ... ('**.py', 'python') + ... ] + + This basically says that files with the filename extension ".py" at any + level inside the directory should be processed by the "python" extraction + method. Files that don't match any of the mapping patterns are ignored. See + the documentation of the `pathmatch` function for details on the pattern + syntax. + + The following extended mapping would also use the "genshi" extraction + method on any file in "templates" subdirectory: + + >>> method_map = [ + ... ('**/templates/**.*', 'genshi'), + ... ('**.py', 'python') + ... ] + + The dictionary provided by the optional `options_map` parameter augments + these mappings. It uses extended glob patterns as keys, and the values are + dictionaries mapping options names to option values (both strings). + + The glob patterns of the `options_map` do not necessarily need to be the + same as those used in the method mapping. For example, while all files in + the ``templates`` folders in an application may be Genshi applications, the + options for those files may differ based on extension: + + >>> options_map = { + ... '**/templates/**.txt': { + ... 'template_class': 'genshi.template:TextTemplate', + ... 'encoding': 'latin-1' + ... }, + ... '**/templates/**.html': { + ... 'include_attrs': '' + ... } + ... } + + :param dirname: the path to the directory to extract messages from. If + not given the current working directory is used. + :param method_map: a list of ``(pattern, method)`` tuples that maps of + extraction method names to extended glob patterns + :param options_map: a dictionary of additional options (optional) + :param keywords: a dictionary mapping keywords (i.e. names of functions + that should be recognized as translation functions) to + tuples that specify which of their arguments contain + localizable strings + :param comment_tags: a list of tags of translator comments to search for + and include in the results + :param callback: a function that is called for every file that message are + extracted from, just before the extraction itself is + performed; the function is passed the filename, the name + of the extraction method and and the options dictionary as + positional arguments, in that order + :param strip_comment_tags: a flag that if set to `True` causes all comment + tags to be removed from the collected comments. + :param directory_filter: a callback to determine whether a directory should + be recursed into. Receives the full directory path; + should return True if the directory is valid. + :see: `pathmatch` + """ + if dirname is None: + dirname = os.getcwd() + if options_map is None: + options_map = {} + if directory_filter is None: + directory_filter = default_directory_filter + + absname = os.path.abspath(dirname) + for root, dirnames, filenames in os.walk(absname): + dirnames[:] = [ + subdir for subdir in dirnames + if directory_filter(os.path.join(root, subdir)) + ] + dirnames.sort() + filenames.sort() + for filename in filenames: + filepath = os.path.join(root, filename).replace(os.sep, '/') + + yield from check_and_call_extract_file( + filepath, + method_map, + options_map, + callback, + keywords, + comment_tags, + strip_comment_tags, + dirpath=absname, + ) + + +def check_and_call_extract_file( + filepath: str | os.PathLike[str], + method_map: Iterable[tuple[str, str]], + options_map: SupportsItems[str, dict[str, Any]], + callback: Callable[[str, str, dict[str, Any]], object] | None, + keywords: Mapping[str, _Keyword], + comment_tags: Collection[str], + strip_comment_tags: bool, + dirpath: str | os.PathLike[str] | None = None, +) -> Generator[_FileExtractionResult, None, None]: + """Checks if the given file matches an extraction method mapping, and if so, calls extract_from_file. + + Note that the extraction method mappings are based relative to dirpath. + So, given an absolute path to a file `filepath`, we want to check using + just the relative path from `dirpath` to `filepath`. + + Yields 5-tuples (filename, lineno, messages, comments, context). + + :param filepath: An absolute path to a file that exists. + :param method_map: a list of ``(pattern, method)`` tuples that maps of + extraction method names to extended glob patterns + :param options_map: a dictionary of additional options (optional) + :param callback: a function that is called for every file that message are + extracted from, just before the extraction itself is + performed; the function is passed the filename, the name + of the extraction method and and the options dictionary as + positional arguments, in that order + :param keywords: a dictionary mapping keywords (i.e. names of functions + that should be recognized as translation functions) to + tuples that specify which of their arguments contain + localizable strings + :param comment_tags: a list of tags of translator comments to search for + and include in the results + :param strip_comment_tags: a flag that if set to `True` causes all comment + tags to be removed from the collected comments. + :param dirpath: the path to the directory to extract messages from. + :return: iterable of 5-tuples (filename, lineno, messages, comments, context) + :rtype: Iterable[tuple[str, int, str|tuple[str], list[str], str|None] + """ + # filename is the relative path from dirpath to the actual file + filename = relpath(filepath, dirpath) + + for pattern, method in method_map: + if not pathmatch(pattern, filename): + continue + + options = {} + for opattern, odict in options_map.items(): + if pathmatch(opattern, filename): + options = odict + if callback: + callback(filename, method, options) + for message_tuple in extract_from_file( + method, filepath, + keywords=keywords, + comment_tags=comment_tags, + options=options, + strip_comment_tags=strip_comment_tags, + ): + yield (filename, *message_tuple) + + break + + +def extract_from_file( + method: _ExtractionMethod, + filename: str | os.PathLike[str], + keywords: Mapping[str, _Keyword] = DEFAULT_KEYWORDS, + comment_tags: Collection[str] = (), + options: Mapping[str, Any] | None = None, + strip_comment_tags: bool = False, +) -> list[_ExtractionResult]: + """Extract messages from a specific file. + + This function returns a list of tuples of the form ``(lineno, message, comments, context)``. + + :param filename: the path to the file to extract messages from + :param method: a string specifying the extraction method (.e.g. "python") + :param keywords: a dictionary mapping keywords (i.e. names of functions + that should be recognized as translation functions) to + tuples that specify which of their arguments contain + localizable strings + :param comment_tags: a list of translator tags to search for and include + in the results + :param strip_comment_tags: a flag that if set to `True` causes all comment + tags to be removed from the collected comments. + :param options: a dictionary of additional options (optional) + :returns: list of tuples of the form ``(lineno, message, comments, context)`` + :rtype: list[tuple[int, str|tuple[str], list[str], str|None] + """ + if method == 'ignore': + return [] + + with open(filename, 'rb') as fileobj: + return list(extract(method, fileobj, keywords, comment_tags, + options, strip_comment_tags)) + + +def _match_messages_against_spec(lineno: int, messages: list[str|None], comments: list[str], + fileobj: _FileObj, spec: tuple[int|tuple[int, str], ...]): + translatable = [] + context = None + + # last_index is 1 based like the keyword spec + last_index = len(messages) + for index in spec: + if isinstance(index, tuple): # (n, 'c') + context = messages[index[0] - 1] + continue + if last_index < index: + # Not enough arguments + return + message = messages[index - 1] + if message is None: + return + translatable.append(message) + + # keyword spec indexes are 1 based, therefore '-1' + if isinstance(spec[0], tuple): + # context-aware *gettext method + first_msg_index = spec[1] - 1 + else: + first_msg_index = spec[0] - 1 + # An empty string msgid isn't valid, emit a warning + if not messages[first_msg_index]: + filename = (getattr(fileobj, "name", None) or "(unknown)") + sys.stderr.write( + f"{filename}:{lineno}: warning: Empty msgid. It is reserved by GNU gettext: gettext(\"\") " + f"returns the header entry with meta information, not the empty string.\n", + ) + return + + translatable = tuple(translatable) + if len(translatable) == 1: + translatable = translatable[0] + + return lineno, translatable, comments, context + + +def extract( + method: _ExtractionMethod, + fileobj: _FileObj, + keywords: Mapping[str, _Keyword] = DEFAULT_KEYWORDS, + comment_tags: Collection[str] = (), + options: Mapping[str, Any] | None = None, + strip_comment_tags: bool = False, +) -> Generator[_ExtractionResult, None, None]: + """Extract messages from the given file-like object using the specified + extraction method. + + This function returns tuples of the form ``(lineno, message, comments, context)``. + + The implementation dispatches the actual extraction to plugins, based on the + value of the ``method`` parameter. + + >>> source = b'''# foo module + ... def run(argv): + ... print(_('Hello, world!')) + ... ''' + + >>> from io import BytesIO + >>> for message in extract('python', BytesIO(source)): + ... print(message) + (3, u'Hello, world!', [], None) + + :param method: an extraction method (a callable), or + a string specifying the extraction method (.e.g. "python"); + if this is a simple name, the extraction function will be + looked up by entry point; if it is an explicit reference + to a function (of the form ``package.module:funcname`` or + ``package.module.funcname``), the corresponding function + will be imported and used + :param fileobj: the file-like object the messages should be extracted from + :param keywords: a dictionary mapping keywords (i.e. names of functions + that should be recognized as translation functions) to + tuples that specify which of their arguments contain + localizable strings + :param comment_tags: a list of translator tags to search for and include + in the results + :param options: a dictionary of additional options (optional) + :param strip_comment_tags: a flag that if set to `True` causes all comment + tags to be removed from the collected comments. + :raise ValueError: if the extraction method is not registered + :returns: iterable of tuples of the form ``(lineno, message, comments, context)`` + :rtype: Iterable[tuple[int, str|tuple[str], list[str], str|None] + """ + func = None + if callable(method): + func = method + elif ':' in method or '.' in method: + if ':' not in method: + lastdot = method.rfind('.') + module, attrname = method[:lastdot], method[lastdot + 1:] + else: + module, attrname = method.split(':', 1) + func = getattr(__import__(module, {}, {}, [attrname]), attrname) + else: + try: + from pkg_resources import working_set + except ImportError: + pass + else: + for entry_point in working_set.iter_entry_points(GROUP_NAME, + method): + func = entry_point.load(require=True) + break + if func is None: + # if pkg_resources is not available or no usable egg-info was found + # (see #230), we resort to looking up the builtin extractors + # directly + builtin = { + 'ignore': extract_nothing, + 'python': extract_python, + 'javascript': extract_javascript, + } + func = builtin.get(method) + + if func is None: + raise ValueError(f"Unknown extraction method {method!r}") + + results = func(fileobj, keywords.keys(), comment_tags, + options=options or {}) + + for lineno, funcname, messages, comments in results: + if not isinstance(messages, (list, tuple)): + messages = [messages] + if not messages: + continue + + specs = keywords[funcname] or None if funcname else None + # {None: x} may be collapsed into x for backwards compatibility. + if not isinstance(specs, dict): + specs = {None: specs} + + if strip_comment_tags: + _strip_comment_tags(comments, comment_tags) + + # None matches all arities. + for arity in (None, len(messages)): + try: + spec = specs[arity] + except KeyError: + continue + if spec is None: + spec = (1,) + result = _match_messages_against_spec(lineno, messages, comments, fileobj, spec) + if result is not None: + yield result + + +def extract_nothing( + fileobj: _FileObj, + keywords: Mapping[str, _Keyword], + comment_tags: Collection[str], + options: Mapping[str, Any], +) -> list[_ExtractionResult]: + """Pseudo extractor that does not actually extract anything, but simply + returns an empty list. + """ + return [] + + +def extract_python( + fileobj: IO[bytes], + keywords: Mapping[str, _Keyword], + comment_tags: Collection[str], + options: _PyOptions, +) -> Generator[_ExtractionResult, None, None]: + """Extract messages from Python source code. + + It returns an iterator yielding tuples in the following form ``(lineno, + funcname, message, comments)``. + + :param fileobj: the seekable, file-like object the messages should be + extracted from + :param keywords: a list of keywords (i.e. function names) that should be + recognized as translation functions + :param comment_tags: a list of translator tags to search for and include + in the results + :param options: a dictionary of additional options (optional) + :rtype: ``iterator`` + """ + funcname = lineno = message_lineno = None + call_stack = -1 + buf = [] + messages = [] + translator_comments = [] + in_def = in_translator_comments = False + comment_tag = None + + encoding = parse_encoding(fileobj) or options.get('encoding', 'UTF-8') + future_flags = parse_future_flags(fileobj, encoding) + next_line = lambda: fileobj.readline().decode(encoding) + + tokens = generate_tokens(next_line) + + # Current prefix of a Python 3.12 (PEP 701) f-string, or None if we're not + # currently parsing one. + current_fstring_start = None + + for tok, value, (lineno, _), _, _ in tokens: + if call_stack == -1 and tok == NAME and value in ('def', 'class'): + in_def = True + elif tok == OP and value == '(': + if in_def: + # Avoid false positives for declarations such as: + # def gettext(arg='message'): + in_def = False + continue + if funcname: + message_lineno = lineno + call_stack += 1 + elif in_def and tok == OP and value == ':': + # End of a class definition without parens + in_def = False + continue + elif call_stack == -1 and tok == COMMENT: + # Strip the comment token from the line + value = value[1:].strip() + if in_translator_comments and \ + translator_comments[-1][0] == lineno - 1: + # We're already inside a translator comment, continue appending + translator_comments.append((lineno, value)) + continue + # If execution reaches this point, let's see if comment line + # starts with one of the comment tags + for comment_tag in comment_tags: + if value.startswith(comment_tag): + in_translator_comments = True + translator_comments.append((lineno, value)) + break + elif funcname and call_stack == 0: + nested = (tok == NAME and value in keywords) + if (tok == OP and value == ')') or nested: + if buf: + messages.append(''.join(buf)) + del buf[:] + else: + messages.append(None) + + messages = tuple(messages) if len(messages) > 1 else messages[0] + # Comments don't apply unless they immediately + # precede the message + if translator_comments and \ + translator_comments[-1][0] < message_lineno - 1: + translator_comments = [] + + yield (message_lineno, funcname, messages, + [comment[1] for comment in translator_comments]) + + funcname = lineno = message_lineno = None + call_stack = -1 + messages = [] + translator_comments = [] + in_translator_comments = False + if nested: + funcname = value + elif tok == STRING: + val = _parse_python_string(value, encoding, future_flags) + if val is not None: + buf.append(val) + + # Python 3.12+, see https://peps.python.org/pep-0701/#new-tokens + elif tok == FSTRING_START: + current_fstring_start = value + elif tok == FSTRING_MIDDLE: + if current_fstring_start is not None: + current_fstring_start += value + elif tok == FSTRING_END: + if current_fstring_start is not None: + fstring = current_fstring_start + value + val = _parse_python_string(fstring, encoding, future_flags) + if val is not None: + buf.append(val) + + elif tok == OP and value == ',': + if buf: + messages.append(''.join(buf)) + del buf[:] + else: + messages.append(None) + if translator_comments: + # We have translator comments, and since we're on a + # comma(,) user is allowed to break into a new line + # Let's increase the last comment's lineno in order + # for the comment to still be a valid one + old_lineno, old_comment = translator_comments.pop() + translator_comments.append((old_lineno + 1, old_comment)) + elif call_stack > 0 and tok == OP and value == ')': + call_stack -= 1 + elif funcname and call_stack == -1: + funcname = None + elif tok == NAME and value in keywords: + funcname = value + + if (current_fstring_start is not None + and tok not in {FSTRING_START, FSTRING_MIDDLE} + ): + # In Python 3.12, tokens other than FSTRING_* mean the + # f-string is dynamic, so we don't wan't to extract it. + # And if it's FSTRING_END, we've already handled it above. + # Let's forget that we're in an f-string. + current_fstring_start = None + + +def _parse_python_string(value: str, encoding: str, future_flags: int) -> str | None: + # Unwrap quotes in a safe manner, maintaining the string's encoding + # https://sourceforge.net/tracker/?func=detail&atid=355470&aid=617979&group_id=5470 + code = compile( + f'# coding={str(encoding)}\n{value}', + '', + 'eval', + ast.PyCF_ONLY_AST | future_flags, + ) + if isinstance(code, ast.Expression): + body = code.body + if isinstance(body, ast.Str): + return body.s + if isinstance(body, ast.JoinedStr): # f-string + if all(isinstance(node, ast.Str) for node in body.values): + return ''.join(node.s for node in body.values) + if all(isinstance(node, ast.Constant) for node in body.values): + return ''.join(str(node.value) for node in body.values) + # TODO: we could raise an error or warning when not all nodes are constants + return None + + +def extract_javascript( + fileobj: _FileObj, + keywords: Mapping[str, _Keyword], + comment_tags: Collection[str], + options: _JSOptions, + lineno: int = 1, +) -> Generator[_ExtractionResult, None, None]: + """Extract messages from JavaScript source code. + + :param fileobj: the seekable, file-like object the messages should be + extracted from + :param keywords: a list of keywords (i.e. function names) that should be + recognized as translation functions + :param comment_tags: a list of translator tags to search for and include + in the results + :param options: a dictionary of additional options (optional) + Supported options are: + * `jsx` -- set to false to disable JSX/E4X support. + * `template_string` -- if `True`, supports gettext(`key`) + * `parse_template_string` -- if `True` will parse the + contents of javascript + template strings. + :param lineno: line number offset (for parsing embedded fragments) + """ + from babel.messages.jslexer import Token, tokenize, unquote_string + funcname = message_lineno = None + messages = [] + last_argument = None + translator_comments = [] + concatenate_next = False + encoding = options.get('encoding', 'utf-8') + last_token = None + call_stack = -1 + dotted = any('.' in kw for kw in keywords) + for token in tokenize( + fileobj.read().decode(encoding), + jsx=options.get("jsx", True), + template_string=options.get("template_string", True), + dotted=dotted, + lineno=lineno, + ): + if ( # Turn keyword`foo` expressions into keyword("foo") calls: + funcname and # have a keyword... + (last_token and last_token.type == 'name') and # we've seen nothing after the keyword... + token.type == 'template_string' # this is a template string + ): + message_lineno = token.lineno + messages = [unquote_string(token.value)] + call_stack = 0 + token = Token('operator', ')', token.lineno) + + if options.get('parse_template_string') and not funcname and token.type == 'template_string': + yield from parse_template_string(token.value, keywords, comment_tags, options, token.lineno) + + elif token.type == 'operator' and token.value == '(': + if funcname: + message_lineno = token.lineno + call_stack += 1 + + elif call_stack == -1 and token.type == 'linecomment': + value = token.value[2:].strip() + if translator_comments and \ + translator_comments[-1][0] == token.lineno - 1: + translator_comments.append((token.lineno, value)) + continue + + for comment_tag in comment_tags: + if value.startswith(comment_tag): + translator_comments.append((token.lineno, value.strip())) + break + + elif token.type == 'multilinecomment': + # only one multi-line comment may precede a translation + translator_comments = [] + value = token.value[2:-2].strip() + for comment_tag in comment_tags: + if value.startswith(comment_tag): + lines = value.splitlines() + if lines: + lines[0] = lines[0].strip() + lines[1:] = dedent('\n'.join(lines[1:])).splitlines() + for offset, line in enumerate(lines): + translator_comments.append((token.lineno + offset, + line)) + break + + elif funcname and call_stack == 0: + if token.type == 'operator' and token.value == ')': + if last_argument is not None: + messages.append(last_argument) + if len(messages) > 1: + messages = tuple(messages) + elif messages: + messages = messages[0] + else: + messages = None + + # Comments don't apply unless they immediately precede the + # message + if translator_comments and \ + translator_comments[-1][0] < message_lineno - 1: + translator_comments = [] + + if messages is not None: + yield (message_lineno, funcname, messages, + [comment[1] for comment in translator_comments]) + + funcname = message_lineno = last_argument = None + concatenate_next = False + translator_comments = [] + messages = [] + call_stack = -1 + + elif token.type in ('string', 'template_string'): + new_value = unquote_string(token.value) + if concatenate_next: + last_argument = (last_argument or '') + new_value + concatenate_next = False + else: + last_argument = new_value + + elif token.type == 'operator': + if token.value == ',': + if last_argument is not None: + messages.append(last_argument) + last_argument = None + else: + messages.append(None) + concatenate_next = False + elif token.value == '+': + concatenate_next = True + + elif call_stack > 0 and token.type == 'operator' \ + and token.value == ')': + call_stack -= 1 + + elif funcname and call_stack == -1: + funcname = None + + elif call_stack == -1 and token.type == 'name' and \ + token.value in keywords and \ + (last_token is None or last_token.type != 'name' or + last_token.value != 'function'): + funcname = token.value + + last_token = token + + +def parse_template_string( + template_string: str, + keywords: Mapping[str, _Keyword], + comment_tags: Collection[str], + options: _JSOptions, + lineno: int = 1, +) -> Generator[_ExtractionResult, None, None]: + """Parse JavaScript template string. + + :param template_string: the template string to be parsed + :param keywords: a list of keywords (i.e. function names) that should be + recognized as translation functions + :param comment_tags: a list of translator tags to search for and include + in the results + :param options: a dictionary of additional options (optional) + :param lineno: starting line number (optional) + """ + from babel.messages.jslexer import line_re + prev_character = None + level = 0 + inside_str = False + expression_contents = '' + for character in template_string[1:-1]: + if not inside_str and character in ('"', "'", '`'): + inside_str = character + elif inside_str == character and prev_character != r'\\': + inside_str = False + if level: + expression_contents += character + if not inside_str: + if character == '{' and prev_character == '$': + level += 1 + elif level and character == '}': + level -= 1 + if level == 0 and expression_contents: + expression_contents = expression_contents[0:-1] + fake_file_obj = io.BytesIO(expression_contents.encode()) + yield from extract_javascript(fake_file_obj, keywords, comment_tags, options, lineno) + lineno += len(line_re.findall(expression_contents)) + expression_contents = '' + prev_character = character diff --git a/venv/Lib/site-packages/babel/messages/frontend.py b/venv/Lib/site-packages/babel/messages/frontend.py new file mode 100644 index 0000000..34f9e89 --- /dev/null +++ b/venv/Lib/site-packages/babel/messages/frontend.py @@ -0,0 +1,1129 @@ +""" + babel.messages.frontend + ~~~~~~~~~~~~~~~~~~~~~~~ + + Frontends for the message extraction functionality. + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" + +from __future__ import annotations + +import datetime +import fnmatch +import logging +import optparse +import os +import re +import shutil +import sys +import tempfile +from collections import OrderedDict +from configparser import RawConfigParser +from io import StringIO +from typing import Iterable + +from babel import Locale, localedata +from babel import __version__ as VERSION +from babel.core import UnknownLocaleError +from babel.messages.catalog import DEFAULT_HEADER, Catalog +from babel.messages.extract import ( + DEFAULT_KEYWORDS, + DEFAULT_MAPPING, + check_and_call_extract_file, + extract_from_dir, +) +from babel.messages.mofile import write_mo +from babel.messages.pofile import read_po, write_po +from babel.util import LOCALTZ + +log = logging.getLogger('babel') + + +class BaseError(Exception): + pass + + +class OptionError(BaseError): + pass + + +class SetupError(BaseError): + pass + + +def listify_value(arg, split=None): + """ + Make a list out of an argument. + + Values from `distutils` argument parsing are always single strings; + values from `optparse` parsing may be lists of strings that may need + to be further split. + + No matter the input, this function returns a flat list of whitespace-trimmed + strings, with `None` values filtered out. + + >>> listify_value("foo bar") + ['foo', 'bar'] + >>> listify_value(["foo bar"]) + ['foo', 'bar'] + >>> listify_value([["foo"], "bar"]) + ['foo', 'bar'] + >>> listify_value([["foo"], ["bar", None, "foo"]]) + ['foo', 'bar', 'foo'] + >>> listify_value("foo, bar, quux", ",") + ['foo', 'bar', 'quux'] + + :param arg: A string or a list of strings + :param split: The argument to pass to `str.split()`. + :return: + """ + out = [] + + if not isinstance(arg, (list, tuple)): + arg = [arg] + + for val in arg: + if val is None: + continue + if isinstance(val, (list, tuple)): + out.extend(listify_value(val, split=split)) + continue + out.extend(s.strip() for s in str(val).split(split)) + assert all(isinstance(val, str) for val in out) + return out + + +class CommandMixin: + # This class is a small shim between Distutils commands and + # optparse option parsing in the frontend command line. + + #: Option name to be input as `args` on the script command line. + as_args = None + + #: Options which allow multiple values. + #: This is used by the `optparse` transmogrification code. + multiple_value_options = () + + #: Options which are booleans. + #: This is used by the `optparse` transmogrification code. + # (This is actually used by distutils code too, but is never + # declared in the base class.) + boolean_options = () + + #: Option aliases, to retain standalone command compatibility. + #: Distutils does not support option aliases, but optparse does. + #: This maps the distutils argument name to an iterable of aliases + #: that are usable with optparse. + option_aliases = {} + + #: Choices for options that needed to be restricted to specific + #: list of choices. + option_choices = {} + + #: Log object. To allow replacement in the script command line runner. + log = log + + def __init__(self, dist=None): + # A less strict version of distutils' `__init__`. + self.distribution = dist + self.initialize_options() + self._dry_run = None + self.verbose = False + self.force = None + self.help = 0 + self.finalized = 0 + + def initialize_options(self): + pass + + def ensure_finalized(self): + if not self.finalized: + self.finalize_options() + self.finalized = 1 + + def finalize_options(self): + raise RuntimeError( + f"abstract method -- subclass {self.__class__} must override", + ) + + +class CompileCatalog(CommandMixin): + description = 'compile message catalogs to binary MO files' + user_options = [ + ('domain=', 'D', + "domains of PO files (space separated list, default 'messages')"), + ('directory=', 'd', + 'path to base directory containing the catalogs'), + ('input-file=', 'i', + 'name of the input file'), + ('output-file=', 'o', + "name of the output file (default " + "'//LC_MESSAGES/.mo')"), + ('locale=', 'l', + 'locale of the catalog to compile'), + ('use-fuzzy', 'f', + 'also include fuzzy translations'), + ('statistics', None, + 'print statistics about translations'), + ] + boolean_options = ['use-fuzzy', 'statistics'] + + def initialize_options(self): + self.domain = 'messages' + self.directory = None + self.input_file = None + self.output_file = None + self.locale = None + self.use_fuzzy = False + self.statistics = False + + def finalize_options(self): + self.domain = listify_value(self.domain) + if not self.input_file and not self.directory: + raise OptionError('you must specify either the input file or the base directory') + if not self.output_file and not self.directory: + raise OptionError('you must specify either the output file or the base directory') + + def run(self): + n_errors = 0 + for domain in self.domain: + for errors in self._run_domain(domain).values(): + n_errors += len(errors) + if n_errors: + self.log.error('%d errors encountered.', n_errors) + return (1 if n_errors else 0) + + def _run_domain(self, domain): + po_files = [] + mo_files = [] + + if not self.input_file: + if self.locale: + po_files.append((self.locale, + os.path.join(self.directory, self.locale, + 'LC_MESSAGES', + f"{domain}.po"))) + mo_files.append(os.path.join(self.directory, self.locale, + 'LC_MESSAGES', + f"{domain}.mo")) + else: + for locale in os.listdir(self.directory): + po_file = os.path.join(self.directory, locale, + 'LC_MESSAGES', f"{domain}.po") + if os.path.exists(po_file): + po_files.append((locale, po_file)) + mo_files.append(os.path.join(self.directory, locale, + 'LC_MESSAGES', + f"{domain}.mo")) + else: + po_files.append((self.locale, self.input_file)) + if self.output_file: + mo_files.append(self.output_file) + else: + mo_files.append(os.path.join(self.directory, self.locale, + 'LC_MESSAGES', + f"{domain}.mo")) + + if not po_files: + raise OptionError('no message catalogs found') + + catalogs_and_errors = {} + + for idx, (locale, po_file) in enumerate(po_files): + mo_file = mo_files[idx] + with open(po_file, 'rb') as infile: + catalog = read_po(infile, locale) + + if self.statistics: + translated = 0 + for message in list(catalog)[1:]: + if message.string: + translated += 1 + percentage = 0 + if len(catalog): + percentage = translated * 100 // len(catalog) + self.log.info( + '%d of %d messages (%d%%) translated in %s', + translated, len(catalog), percentage, po_file, + ) + + if catalog.fuzzy and not self.use_fuzzy: + self.log.info('catalog %s is marked as fuzzy, skipping', po_file) + continue + + catalogs_and_errors[catalog] = catalog_errors = list(catalog.check()) + for message, errors in catalog_errors: + for error in errors: + self.log.error( + 'error: %s:%d: %s', po_file, message.lineno, error, + ) + + self.log.info('compiling catalog %s to %s', po_file, mo_file) + + with open(mo_file, 'wb') as outfile: + write_mo(outfile, catalog, use_fuzzy=self.use_fuzzy) + + return catalogs_and_errors + + +def _make_directory_filter(ignore_patterns): + """ + Build a directory_filter function based on a list of ignore patterns. + """ + + def cli_directory_filter(dirname): + basename = os.path.basename(dirname) + return not any( + fnmatch.fnmatch(basename, ignore_pattern) + for ignore_pattern + in ignore_patterns + ) + + return cli_directory_filter + + +class ExtractMessages(CommandMixin): + description = 'extract localizable strings from the project code' + user_options = [ + ('charset=', None, + 'charset to use in the output file (default "utf-8")'), + ('keywords=', 'k', + 'space-separated list of keywords to look for in addition to the ' + 'defaults (may be repeated multiple times)'), + ('no-default-keywords', None, + 'do not include the default keywords'), + ('mapping-file=', 'F', + 'path to the mapping configuration file'), + ('no-location', None, + 'do not include location comments with filename and line number'), + ('add-location=', None, + 'location lines format. If it is not given or "full", it generates ' + 'the lines with both file name and line number. If it is "file", ' + 'the line number part is omitted. If it is "never", it completely ' + 'suppresses the lines (same as --no-location).'), + ('omit-header', None, + 'do not include msgid "" entry in header'), + ('output-file=', 'o', + 'name of the output file'), + ('width=', 'w', + 'set output line width (default 76)'), + ('no-wrap', None, + 'do not break long message lines, longer than the output line width, ' + 'into several lines'), + ('sort-output', None, + 'generate sorted output (default False)'), + ('sort-by-file', None, + 'sort output by file location (default False)'), + ('msgid-bugs-address=', None, + 'set report address for msgid'), + ('copyright-holder=', None, + 'set copyright holder in output'), + ('project=', None, + 'set project name in output'), + ('version=', None, + 'set project version in output'), + ('add-comments=', 'c', + 'place comment block with TAG (or those preceding keyword lines) in ' + 'output file. Separate multiple TAGs with commas(,)'), # TODO: Support repetition of this argument + ('strip-comments', 's', + 'strip the comment TAGs from the comments.'), + ('input-paths=', None, + 'files or directories that should be scanned for messages. Separate multiple ' + 'files or directories with commas(,)'), # TODO: Support repetition of this argument + ('input-dirs=', None, # TODO (3.x): Remove me. + 'alias for input-paths (does allow files as well as directories).'), + ('ignore-dirs=', None, + 'Patterns for directories to ignore when scanning for messages. ' + 'Separate multiple patterns with spaces (default ".* ._")'), + ('header-comment=', None, + 'header comment for the catalog'), + ('last-translator=', None, + 'set the name and email of the last translator in output'), + ] + boolean_options = [ + 'no-default-keywords', 'no-location', 'omit-header', 'no-wrap', + 'sort-output', 'sort-by-file', 'strip-comments', + ] + as_args = 'input-paths' + multiple_value_options = ( + 'add-comments', + 'keywords', + 'ignore-dirs', + ) + option_aliases = { + 'keywords': ('--keyword',), + 'mapping-file': ('--mapping',), + 'output-file': ('--output',), + 'strip-comments': ('--strip-comment-tags',), + 'last-translator': ('--last-translator',), + } + option_choices = { + 'add-location': ('full', 'file', 'never'), + } + + def initialize_options(self): + self.charset = 'utf-8' + self.keywords = None + self.no_default_keywords = False + self.mapping_file = None + self.no_location = False + self.add_location = None + self.omit_header = False + self.output_file = None + self.input_dirs = None + self.input_paths = None + self.width = None + self.no_wrap = False + self.sort_output = False + self.sort_by_file = False + self.msgid_bugs_address = None + self.copyright_holder = None + self.project = None + self.version = None + self.add_comments = None + self.strip_comments = False + self.include_lineno = True + self.ignore_dirs = None + self.header_comment = None + self.last_translator = None + + def finalize_options(self): + if self.input_dirs: + if not self.input_paths: + self.input_paths = self.input_dirs + else: + raise OptionError( + 'input-dirs and input-paths are mutually exclusive', + ) + + keywords = {} if self.no_default_keywords else DEFAULT_KEYWORDS.copy() + + keywords.update(parse_keywords(listify_value(self.keywords))) + + self.keywords = keywords + + if not self.keywords: + raise OptionError( + 'you must specify new keywords if you disable the default ones', + ) + + if not self.output_file: + raise OptionError('no output file specified') + if self.no_wrap and self.width: + raise OptionError( + "'--no-wrap' and '--width' are mutually exclusive", + ) + if not self.no_wrap and not self.width: + self.width = 76 + elif self.width is not None: + self.width = int(self.width) + + if self.sort_output and self.sort_by_file: + raise OptionError( + "'--sort-output' and '--sort-by-file' are mutually exclusive", + ) + + if self.input_paths: + if isinstance(self.input_paths, str): + self.input_paths = re.split(r',\s*', self.input_paths) + elif self.distribution is not None: + self.input_paths = dict.fromkeys([ + k.split('.', 1)[0] + for k in (self.distribution.packages or ()) + ]).keys() + else: + self.input_paths = [] + + if not self.input_paths: + raise OptionError("no input files or directories specified") + + for path in self.input_paths: + if not os.path.exists(path): + raise OptionError(f"Input path: {path} does not exist") + + self.add_comments = listify_value(self.add_comments or (), ",") + + if self.distribution: + if not self.project: + self.project = self.distribution.get_name() + if not self.version: + self.version = self.distribution.get_version() + + if self.add_location == 'never': + self.no_location = True + elif self.add_location == 'file': + self.include_lineno = False + + ignore_dirs = listify_value(self.ignore_dirs) + if ignore_dirs: + self.directory_filter = _make_directory_filter(self.ignore_dirs) + else: + self.directory_filter = None + + def _build_callback(self, path: str): + def callback(filename: str, method: str, options: dict): + if method == 'ignore': + return + + # If we explicitly provide a full filepath, just use that. + # Otherwise, path will be the directory path and filename + # is the relative path from that dir to the file. + # So we can join those to get the full filepath. + if os.path.isfile(path): + filepath = path + else: + filepath = os.path.normpath(os.path.join(path, filename)) + + optstr = '' + if options: + opt_values = ", ".join(f'{k}="{v}"' for k, v in options.items()) + optstr = f" ({opt_values})" + self.log.info('extracting messages from %s%s', filepath, optstr) + + return callback + + def run(self): + mappings = self._get_mappings() + with open(self.output_file, 'wb') as outfile: + catalog = Catalog(project=self.project, + version=self.version, + msgid_bugs_address=self.msgid_bugs_address, + copyright_holder=self.copyright_holder, + charset=self.charset, + header_comment=(self.header_comment or DEFAULT_HEADER), + last_translator=self.last_translator) + + for path, method_map, options_map in mappings: + callback = self._build_callback(path) + if os.path.isfile(path): + current_dir = os.getcwd() + extracted = check_and_call_extract_file( + path, method_map, options_map, + callback, self.keywords, self.add_comments, + self.strip_comments, current_dir, + ) + else: + extracted = extract_from_dir( + path, method_map, options_map, + keywords=self.keywords, + comment_tags=self.add_comments, + callback=callback, + strip_comment_tags=self.strip_comments, + directory_filter=self.directory_filter, + ) + for filename, lineno, message, comments, context in extracted: + if os.path.isfile(path): + filepath = filename # already normalized + else: + filepath = os.path.normpath(os.path.join(path, filename)) + + catalog.add(message, None, [(filepath, lineno)], + auto_comments=comments, context=context) + + self.log.info('writing PO template file to %s', self.output_file) + write_po(outfile, catalog, width=self.width, + no_location=self.no_location, + omit_header=self.omit_header, + sort_output=self.sort_output, + sort_by_file=self.sort_by_file, + include_lineno=self.include_lineno) + + def _get_mappings(self): + mappings = [] + + if self.mapping_file: + with open(self.mapping_file) as fileobj: + method_map, options_map = parse_mapping(fileobj) + for path in self.input_paths: + mappings.append((path, method_map, options_map)) + + elif getattr(self.distribution, 'message_extractors', None): + message_extractors = self.distribution.message_extractors + for path, mapping in message_extractors.items(): + if isinstance(mapping, str): + method_map, options_map = parse_mapping(StringIO(mapping)) + else: + method_map, options_map = [], {} + for pattern, method, options in mapping: + method_map.append((pattern, method)) + options_map[pattern] = options or {} + mappings.append((path, method_map, options_map)) + + else: + for path in self.input_paths: + mappings.append((path, DEFAULT_MAPPING, {})) + + return mappings + + +class InitCatalog(CommandMixin): + description = 'create a new catalog based on a POT file' + user_options = [ + ('domain=', 'D', + "domain of PO file (default 'messages')"), + ('input-file=', 'i', + 'name of the input file'), + ('output-dir=', 'd', + 'path to output directory'), + ('output-file=', 'o', + "name of the output file (default " + "'//LC_MESSAGES/.po')"), + ('locale=', 'l', + 'locale for the new localized catalog'), + ('width=', 'w', + 'set output line width (default 76)'), + ('no-wrap', None, + 'do not break long message lines, longer than the output line width, ' + 'into several lines'), + ] + boolean_options = ['no-wrap'] + + def initialize_options(self): + self.output_dir = None + self.output_file = None + self.input_file = None + self.locale = None + self.domain = 'messages' + self.no_wrap = False + self.width = None + + def finalize_options(self): + if not self.input_file: + raise OptionError('you must specify the input file') + + if not self.locale: + raise OptionError('you must provide a locale for the new catalog') + try: + self._locale = Locale.parse(self.locale) + except UnknownLocaleError as e: + raise OptionError(e) from e + + if not self.output_file and not self.output_dir: + raise OptionError('you must specify the output directory') + if not self.output_file: + self.output_file = os.path.join(self.output_dir, self.locale, + 'LC_MESSAGES', f"{self.domain}.po") + + if not os.path.exists(os.path.dirname(self.output_file)): + os.makedirs(os.path.dirname(self.output_file)) + if self.no_wrap and self.width: + raise OptionError("'--no-wrap' and '--width' are mutually exclusive") + if not self.no_wrap and not self.width: + self.width = 76 + elif self.width is not None: + self.width = int(self.width) + + def run(self): + self.log.info( + 'creating catalog %s based on %s', self.output_file, self.input_file, + ) + + with open(self.input_file, 'rb') as infile: + # Although reading from the catalog template, read_po must be fed + # the locale in order to correctly calculate plurals + catalog = read_po(infile, locale=self.locale) + + catalog.locale = self._locale + catalog.revision_date = datetime.datetime.now(LOCALTZ) + catalog.fuzzy = False + + with open(self.output_file, 'wb') as outfile: + write_po(outfile, catalog, width=self.width) + + +class UpdateCatalog(CommandMixin): + description = 'update message catalogs from a POT file' + user_options = [ + ('domain=', 'D', + "domain of PO file (default 'messages')"), + ('input-file=', 'i', + 'name of the input file'), + ('output-dir=', 'd', + 'path to base directory containing the catalogs'), + ('output-file=', 'o', + "name of the output file (default " + "'//LC_MESSAGES/.po')"), + ('omit-header', None, + "do not include msgid "" entry in header"), + ('locale=', 'l', + 'locale of the catalog to compile'), + ('width=', 'w', + 'set output line width (default 76)'), + ('no-wrap', None, + 'do not break long message lines, longer than the output line width, ' + 'into several lines'), + ('ignore-obsolete=', None, + 'whether to omit obsolete messages from the output'), + ('init-missing=', None, + 'if any output files are missing, initialize them first'), + ('no-fuzzy-matching', 'N', + 'do not use fuzzy matching'), + ('update-header-comment', None, + 'update target header comment'), + ('previous', None, + 'keep previous msgids of translated messages'), + ('check=', None, + 'don\'t update the catalog, just return the status. Return code 0 ' + 'means nothing would change. Return code 1 means that the catalog ' + 'would be updated'), + ('ignore-pot-creation-date=', None, + 'ignore changes to POT-Creation-Date when updating or checking'), + ] + boolean_options = [ + 'omit-header', 'no-wrap', 'ignore-obsolete', 'init-missing', + 'no-fuzzy-matching', 'previous', 'update-header-comment', + 'check', 'ignore-pot-creation-date', + ] + + def initialize_options(self): + self.domain = 'messages' + self.input_file = None + self.output_dir = None + self.output_file = None + self.omit_header = False + self.locale = None + self.width = None + self.no_wrap = False + self.ignore_obsolete = False + self.init_missing = False + self.no_fuzzy_matching = False + self.update_header_comment = False + self.previous = False + self.check = False + self.ignore_pot_creation_date = False + + def finalize_options(self): + if not self.input_file: + raise OptionError('you must specify the input file') + if not self.output_file and not self.output_dir: + raise OptionError('you must specify the output file or directory') + if self.output_file and not self.locale: + raise OptionError('you must specify the locale') + + if self.init_missing: + if not self.locale: + raise OptionError( + 'you must specify the locale for ' + 'the init-missing option to work', + ) + + try: + self._locale = Locale.parse(self.locale) + except UnknownLocaleError as e: + raise OptionError(e) from e + else: + self._locale = None + + if self.no_wrap and self.width: + raise OptionError("'--no-wrap' and '--width' are mutually exclusive") + if not self.no_wrap and not self.width: + self.width = 76 + elif self.width is not None: + self.width = int(self.width) + if self.no_fuzzy_matching and self.previous: + self.previous = False + + def run(self): + check_status = {} + po_files = [] + if not self.output_file: + if self.locale: + po_files.append((self.locale, + os.path.join(self.output_dir, self.locale, + 'LC_MESSAGES', + f"{self.domain}.po"))) + else: + for locale in os.listdir(self.output_dir): + po_file = os.path.join(self.output_dir, locale, + 'LC_MESSAGES', + f"{self.domain}.po") + if os.path.exists(po_file): + po_files.append((locale, po_file)) + else: + po_files.append((self.locale, self.output_file)) + + if not po_files: + raise OptionError('no message catalogs found') + + domain = self.domain + if not domain: + domain = os.path.splitext(os.path.basename(self.input_file))[0] + + with open(self.input_file, 'rb') as infile: + template = read_po(infile) + + for locale, filename in po_files: + if self.init_missing and not os.path.exists(filename): + if self.check: + check_status[filename] = False + continue + self.log.info( + 'creating catalog %s based on %s', filename, self.input_file, + ) + + with open(self.input_file, 'rb') as infile: + # Although reading from the catalog template, read_po must + # be fed the locale in order to correctly calculate plurals + catalog = read_po(infile, locale=self.locale) + + catalog.locale = self._locale + catalog.revision_date = datetime.datetime.now(LOCALTZ) + catalog.fuzzy = False + + with open(filename, 'wb') as outfile: + write_po(outfile, catalog) + + self.log.info('updating catalog %s based on %s', filename, self.input_file) + with open(filename, 'rb') as infile: + catalog = read_po(infile, locale=locale, domain=domain) + + catalog.update( + template, self.no_fuzzy_matching, + update_header_comment=self.update_header_comment, + update_creation_date=not self.ignore_pot_creation_date, + ) + + tmpname = os.path.join(os.path.dirname(filename), + tempfile.gettempprefix() + + os.path.basename(filename)) + try: + with open(tmpname, 'wb') as tmpfile: + write_po(tmpfile, catalog, + omit_header=self.omit_header, + ignore_obsolete=self.ignore_obsolete, + include_previous=self.previous, width=self.width) + except Exception: + os.remove(tmpname) + raise + + if self.check: + with open(filename, "rb") as origfile: + original_catalog = read_po(origfile) + with open(tmpname, "rb") as newfile: + updated_catalog = read_po(newfile) + updated_catalog.revision_date = original_catalog.revision_date + check_status[filename] = updated_catalog.is_identical(original_catalog) + os.remove(tmpname) + continue + + try: + os.rename(tmpname, filename) + except OSError: + # We're probably on Windows, which doesn't support atomic + # renames, at least not through Python + # If the error is in fact due to a permissions problem, that + # same error is going to be raised from one of the following + # operations + os.remove(filename) + shutil.copy(tmpname, filename) + os.remove(tmpname) + + if self.check: + for filename, up_to_date in check_status.items(): + if up_to_date: + self.log.info('Catalog %s is up to date.', filename) + else: + self.log.warning('Catalog %s is out of date.', filename) + if not all(check_status.values()): + raise BaseError("Some catalogs are out of date.") + else: + self.log.info("All the catalogs are up-to-date.") + return + + +class CommandLineInterface: + """Command-line interface. + + This class provides a simple command-line interface to the message + extraction and PO file generation functionality. + """ + + usage = '%%prog %s [options] %s' + version = f'%prog {VERSION}' + commands = { + 'compile': 'compile message catalogs to MO files', + 'extract': 'extract messages from source files and generate a POT file', + 'init': 'create new message catalogs from a POT file', + 'update': 'update existing message catalogs from a POT file', + } + + command_classes = { + 'compile': CompileCatalog, + 'extract': ExtractMessages, + 'init': InitCatalog, + 'update': UpdateCatalog, + } + + log = None # Replaced on instance level + + def run(self, argv=None): + """Main entry point of the command-line interface. + + :param argv: list of arguments passed on the command-line + """ + + if argv is None: + argv = sys.argv + + self.parser = optparse.OptionParser(usage=self.usage % ('command', '[args]'), + version=self.version) + self.parser.disable_interspersed_args() + self.parser.print_help = self._help + self.parser.add_option('--list-locales', dest='list_locales', + action='store_true', + help="print all known locales and exit") + self.parser.add_option('-v', '--verbose', action='store_const', + dest='loglevel', const=logging.DEBUG, + help='print as much as possible') + self.parser.add_option('-q', '--quiet', action='store_const', + dest='loglevel', const=logging.ERROR, + help='print as little as possible') + self.parser.set_defaults(list_locales=False, loglevel=logging.INFO) + + options, args = self.parser.parse_args(argv[1:]) + + self._configure_logging(options.loglevel) + if options.list_locales: + identifiers = localedata.locale_identifiers() + id_width = max(len(identifier) for identifier in identifiers) + 1 + for identifier in sorted(identifiers): + locale = Locale.parse(identifier) + print(f"{identifier:<{id_width}} {locale.english_name}") + return 0 + + if not args: + self.parser.error('no valid command or option passed. ' + 'Try the -h/--help option for more information.') + + cmdname = args[0] + if cmdname not in self.commands: + self.parser.error(f'unknown command "{cmdname}"') + + cmdinst = self._configure_command(cmdname, args[1:]) + return cmdinst.run() + + def _configure_logging(self, loglevel): + self.log = log + self.log.setLevel(loglevel) + # Don't add a new handler for every instance initialization (#227), this + # would cause duplicated output when the CommandLineInterface as an + # normal Python class. + if self.log.handlers: + handler = self.log.handlers[0] + else: + handler = logging.StreamHandler() + self.log.addHandler(handler) + handler.setLevel(loglevel) + formatter = logging.Formatter('%(message)s') + handler.setFormatter(formatter) + + def _help(self): + print(self.parser.format_help()) + print("commands:") + cmd_width = max(8, max(len(command) for command in self.commands) + 1) + for name, description in sorted(self.commands.items()): + print(f" {name:<{cmd_width}} {description}") + + def _configure_command(self, cmdname, argv): + """ + :type cmdname: str + :type argv: list[str] + """ + cmdclass = self.command_classes[cmdname] + cmdinst = cmdclass() + if self.log: + cmdinst.log = self.log # Use our logger, not distutils'. + assert isinstance(cmdinst, CommandMixin) + cmdinst.initialize_options() + + parser = optparse.OptionParser( + usage=self.usage % (cmdname, ''), + description=self.commands[cmdname], + ) + as_args = getattr(cmdclass, "as_args", ()) + for long, short, help in cmdclass.user_options: + name = long.strip("=") + default = getattr(cmdinst, name.replace("-", "_")) + strs = [f"--{name}"] + if short: + strs.append(f"-{short}") + strs.extend(cmdclass.option_aliases.get(name, ())) + choices = cmdclass.option_choices.get(name, None) + if name == as_args: + parser.usage += f"<{name}>" + elif name in cmdclass.boolean_options: + parser.add_option(*strs, action="store_true", help=help) + elif name in cmdclass.multiple_value_options: + parser.add_option(*strs, action="append", help=help, choices=choices) + else: + parser.add_option(*strs, help=help, default=default, choices=choices) + options, args = parser.parse_args(argv) + + if as_args: + setattr(options, as_args.replace('-', '_'), args) + + for key, value in vars(options).items(): + setattr(cmdinst, key, value) + + try: + cmdinst.ensure_finalized() + except OptionError as err: + parser.error(str(err)) + + return cmdinst + + +def main(): + return CommandLineInterface().run(sys.argv) + + +def parse_mapping(fileobj, filename=None): + """Parse an extraction method mapping from a file-like object. + + >>> buf = StringIO(''' + ... [extractors] + ... custom = mypackage.module:myfunc + ... + ... # Python source files + ... [python: **.py] + ... + ... # Genshi templates + ... [genshi: **/templates/**.html] + ... include_attrs = + ... [genshi: **/templates/**.txt] + ... template_class = genshi.template:TextTemplate + ... encoding = latin-1 + ... + ... # Some custom extractor + ... [custom: **/custom/*.*] + ... ''') + + >>> method_map, options_map = parse_mapping(buf) + >>> len(method_map) + 4 + + >>> method_map[0] + ('**.py', 'python') + >>> options_map['**.py'] + {} + >>> method_map[1] + ('**/templates/**.html', 'genshi') + >>> options_map['**/templates/**.html']['include_attrs'] + '' + >>> method_map[2] + ('**/templates/**.txt', 'genshi') + >>> options_map['**/templates/**.txt']['template_class'] + 'genshi.template:TextTemplate' + >>> options_map['**/templates/**.txt']['encoding'] + 'latin-1' + + >>> method_map[3] + ('**/custom/*.*', 'mypackage.module:myfunc') + >>> options_map['**/custom/*.*'] + {} + + :param fileobj: a readable file-like object containing the configuration + text to parse + :see: `extract_from_directory` + """ + extractors = {} + method_map = [] + options_map = {} + + parser = RawConfigParser() + parser._sections = OrderedDict(parser._sections) # We need ordered sections + parser.read_file(fileobj, filename) + + for section in parser.sections(): + if section == 'extractors': + extractors = dict(parser.items(section)) + else: + method, pattern = (part.strip() for part in section.split(':', 1)) + method_map.append((pattern, method)) + options_map[pattern] = dict(parser.items(section)) + + if extractors: + for idx, (pattern, method) in enumerate(method_map): + if method in extractors: + method = extractors[method] + method_map[idx] = (pattern, method) + + return method_map, options_map + + +def _parse_spec(s: str) -> tuple[int | None, tuple[int | tuple[int, str], ...]]: + inds = [] + number = None + for x in s.split(','): + if x[-1] == 't': + number = int(x[:-1]) + elif x[-1] == 'c': + inds.append((int(x[:-1]), 'c')) + else: + inds.append(int(x)) + return number, tuple(inds) + + +def parse_keywords(strings: Iterable[str] = ()): + """Parse keywords specifications from the given list of strings. + + >>> import pprint + >>> keywords = ['_', 'dgettext:2', 'dngettext:2,3', 'pgettext:1c,2', + ... 'polymorphic:1', 'polymorphic:2,2t', 'polymorphic:3c,3t'] + >>> pprint.pprint(parse_keywords(keywords)) + {'_': None, + 'dgettext': (2,), + 'dngettext': (2, 3), + 'pgettext': ((1, 'c'), 2), + 'polymorphic': {None: (1,), 2: (2,), 3: ((3, 'c'),)}} + + The input keywords are in GNU Gettext style; see :doc:`cmdline` for details. + + The output is a dictionary mapping keyword names to a dictionary of specifications. + Keys in this dictionary are numbers of arguments, where ``None`` means that all numbers + of arguments are matched, and a number means only calls with that number of arguments + are matched (which happens when using the "t" specifier). However, as a special + case for backwards compatibility, if the dictionary of specifications would + be ``{None: x}``, i.e., there is only one specification and it matches all argument + counts, then it is collapsed into just ``x``. + + A specification is either a tuple or None. If a tuple, each element can be either a number + ``n``, meaning that the nth argument should be extracted as a message, or the tuple + ``(n, 'c')``, meaning that the nth argument should be extracted as context for the + messages. A ``None`` specification is equivalent to ``(1,)``, extracting the first + argument. + """ + keywords = {} + for string in strings: + if ':' in string: + funcname, spec_str = string.split(':') + number, spec = _parse_spec(spec_str) + else: + funcname = string + number = None + spec = None + keywords.setdefault(funcname, {})[number] = spec + + # For best backwards compatibility, collapse {None: x} into x. + for k, v in keywords.items(): + if set(v) == {None}: + keywords[k] = v[None] + + return keywords + + +def __getattr__(name: str): + # Re-exports for backwards compatibility; + # `setuptools_frontend` is the canonical import location. + if name in {'check_message_extractors', 'compile_catalog', 'extract_messages', 'init_catalog', 'update_catalog'}: + from babel.messages import setuptools_frontend + + return getattr(setuptools_frontend, name) + + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + +if __name__ == '__main__': + main() diff --git a/venv/Lib/site-packages/babel/messages/jslexer.py b/venv/Lib/site-packages/babel/messages/jslexer.py new file mode 100644 index 0000000..6456bd0 --- /dev/null +++ b/venv/Lib/site-packages/babel/messages/jslexer.py @@ -0,0 +1,203 @@ +""" + babel.messages.jslexer + ~~~~~~~~~~~~~~~~~~~~~~ + + A simple JavaScript 1.5 lexer which is used for the JavaScript + extractor. + + :copyright: (c) 2013-2023 by the Babel Team. + :license: BSD, see LICENSE for more details. +""" +from __future__ import annotations + +import re +from collections.abc import Generator +from typing import NamedTuple + +operators: list[str] = sorted([ + '+', '-', '*', '%', '!=', '==', '<', '>', '<=', '>=', '=', + '+=', '-=', '*=', '%=', '<<', '>>', '>>>', '<<=', '>>=', + '>>>=', '&', '&=', '|', '|=', '&&', '||', '^', '^=', '(', ')', + '[', ']', '{', '}', '!', '--', '++', '~', ',', ';', '.', ':', +], key=len, reverse=True) + +escapes: dict[str, str] = {'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t'} + +name_re = re.compile(r'[\w$_][\w\d$_]*', re.UNICODE) +dotted_name_re = re.compile(r'[\w$_][\w\d$_.]*[\w\d$_.]', re.UNICODE) +division_re = re.compile(r'/=?') +regex_re = re.compile(r'/(?:[^/\\]*(?:\\.[^/\\]*)*)/[a-zA-Z]*', re.DOTALL) +line_re = re.compile(r'(\r\n|\n|\r)') +line_join_re = re.compile(r'\\' + line_re.pattern) +uni_escape_re = re.compile(r'[a-fA-F0-9]{1,4}') +hex_escape_re = re.compile(r'[a-fA-F0-9]{1,2}') + + +class Token(NamedTuple): + type: str + value: str + lineno: int + + +_rules: list[tuple[str | None, re.Pattern[str]]] = [ + (None, re.compile(r'\s+', re.UNICODE)), + (None, re.compile(r'