From fc4ec11521682c78b190c894a0ce37221ad3f726 Mon Sep 17 00:00:00 2001 From: Jarian Date: Mon, 6 Jul 2026 00:18:29 +0000 Subject: [PATCH] ci: re-trigger 20260706001829 --- README.md | 149 +----------------- __pycache__/data.cpython-313.pyc | Bin 0 -> 4089 bytes __pycache__/main.cpython-313.pyc | Bin 0 -> 18015 bytes prompt_v0.2.md | 8 + .../test_data.cpython-313-pytest-9.0.3.pyc | Bin 0 -> 27413 bytes .../test_main.cpython-313-pytest-9.0.3.pyc | Bin 0 -> 18004 bytes 6 files changed, 9 insertions(+), 148 deletions(-) create mode 100644 __pycache__/data.cpython-313.pyc create mode 100644 __pycache__/main.cpython-313.pyc create mode 100644 prompt_v0.2.md create mode 100644 tests/__pycache__/test_data.cpython-313-pytest-9.0.3.pyc create mode 100644 tests/__pycache__/test_main.cpython-313-pytest-9.0.3.pyc diff --git a/README.md b/README.md index a957969..8a8921d 100644 --- a/README.md +++ b/README.md @@ -1,148 +1 @@ -# Arcane Purge - -A text-based exorcist game where Bible verses are your weapons against demonic forces. Type verses from Scripture to cast spells, pass memory tests to defeat demons, and unlock progressively more powerful verses as you advance. - -## What It Does - -Arcane Purge is a terminal-based game that combines Scripture memorization with demon-slaying gameplay: - -- **Verse Casting** - Select a verse, then type it exactly to deal damage to demons. Verses matching a demon's weakness deal double damage. -- **Memory Tests** - After a successful cast, recall the same verse without looking. Passing delivers a powerful finishing strike. -- **Progression** - Start with 4 easy verses. Defeating demons unlocks harder verses and new categories. After 5 demons, Memory Mode activates. -- **Scoring** - Points awarded for correct casts, speed bonuses, memory test success, and demon defeats. Deducted for failures. -- **Hint System** - Press `H` at any input to see the first letter of each word. - -## Setup and Dependencies - -### Requirements - -- Python 3.11+ -- Astral UV (for dependency management) -- Docker (for containerized deployment) - -### Install with UV - -```bash -uv sync -``` - -This installs all dependencies listed in `pyproject.toml` (currently `pytest` for testing). - -### Install with pip - -```bash -pip install pytest -``` - -## How to Run - -### Docker (Recommended) - -```bash -cd docker -docker compose up --build -``` - -This builds the game container and starts it in interactive mode. The game runs inside the container with a TTY attached for input. - -To run tests inside the container: - -```bash -cd docker -docker compose run game python -m pytest tests -v -``` - -### Direct Python - -```bash -python main.py -``` - -### Running Tests - -```bash -python -m pytest tests/ -v -``` - -The test suite includes 34 tests covering data loading, text normalization, verse filtering, similarity matching, hint generation, and game initialization. - -## Project Structure - -``` -exorcist-game/ -├── .dockerignore # Docker build exclusions -├── .env.example # Environment variable template -├── .hadolint.yaml # Dockerfile linting config -├── pyproject.toml # Project metadata and dependencies -├── uv.lock # UV dependency lock file -├── verses.json # Bible verse data (12 verses, 5 categories) -├── data.py # Verse loading, filtering, text normalization -├── main.py # Game engine: encounters, casting, scoring -├── docker/ -│ ├── docker-compose.yml # Service orchestration -│ └── Dockerfile # Multi-stage container build -├── tests/ -│ ├── test_data.py # Data module tests (21 tests) -│ └── test_main.py # Game logic tests (13 tests) -└── README.md # This file -``` - -### Key Modules - -| File | Purpose | -|---|---| -| `main.py` | Game loop, demon encounters, verse casting, memory tests, scoring, progression | -| `data.py` | Verse data loading from JSON, category/difficulty filtering, text normalization | -| `verses.json` | 12 verses across 5 categories (Binding, Healing, Exorcism, Protection, Judgment) | -| `tests/` | Validation suite ensuring data integrity and game logic correctness | - -## Configuration and Environment Variables - -### Environment Variables - -Copy `.env.example` to `.env` and configure: - -```bash -PYTHON_VERSION=3.12-slim # Python version for Docker base image -GAME_PORT=8080 # (Reserved for future web interface) -``` - -The game runs without environment variables configured. All game data is embedded in `verses.json`. - -### Verse Data Format - -Each verse in `verses.json` follows this structure: - -```json -{ - "id": "binding_001", - "text": "Full verse text here.", - "category": "Binding", - "difficulty": 1, - "reference": "Luke 10:19" -} -``` - -### Adding Verses - -Append new verse objects to the `verses` array in `verses.json`. Difficulty must be 1-5. - -### Adding Demons - -Edit the `DEMONS` list in `main.py`: - -```python -{"name": "Demon Name", "health": 100, "weaknesses": ["Binding", "Exorcism"], "damage": 20} -``` - -### Code Quality - -The project uses Ruff for linting and Hadolint for Dockerfile validation: - -```bash -ruff format . -ruff check --fix . -hadolint docker/Dockerfile -``` - -All checks must pass before building the container. \ No newline at end of file +# exorcist-game diff --git a/__pycache__/data.cpython-313.pyc b/__pycache__/data.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3db61c6a160faac9fa01256f29051cba57274410 GIT binary patch literal 4089 zcmb7HO>7&-6`uVeDUlTQYe{x&X=SUinCd64W!GS31GWU$ku1T`nvD}FCf3}gva1V}IKiH1}J?Wu2Oxzw)} zbOi3s&b&AC=6&D1_q0_};YZN^wb?(hU5?PV^uulN&DvHIhtM*T5k@j6^8*~_*qg^Z zyoCXwU&Nw>WO39p>K*lsiru^i6zQ*F-b90DWw?782z}W--GE%4HHdLL80@X)Wt(#&K9m3Gqx9N zRt6h!I_NepbOiWq1sMz@?l>CeOWjgum|C{4eUAnld4C%zb4M<~p0vr_h2m}o8VNXK z2t|=Q&m)5y3A*FMA-A{lK8>QBD{b&H`*YWnP?VPiYI-YbLG7rmsHVd130^|YNP@q& zOEQ;*W|ZK<;_Tc_aI)i0A|w*1GvUIZ z$1UA76s&7Rn$oRtNmtt?OPjXZrMO~gV$Tuyi&X zvc1k%xXk8FVvA|T8n?v>Q#Wj%s$)Y*X?9sGMs144Y|%_>226vQwn*6$7VP43F{a5S zY>|?LQ24=ayRB>7Ole&cV5?$uVJ&TvE^XSxaX3)N7_8pKIF+8U19ZKZV-2nab&4pt z3y(Rp9YnRq9-dt~`>=hf{kQnh)XLPO4^}?-WO}3d(zA|@nj3QiUzb=u2&Jg=ihRK{SKtmOiP4 zfl^oTSdmYTn94yy_q99N+5t(@o^eJD8JqH zI{ml~ya2(&lQgF^92S_j*`Uo$y0pPHAY|8%X;zUCv3oNycMaSKlXMkA9Xf|z)}h9x zjljUKC$lZ9k;kXLZ0XLobZ@j=eAf2I&OdZ+MEdhB{fk$ZCi8)Tb#dT7e+~=~%B^3t zMa0j%5z!8%l(Ds>c;yb@Q7#fG0#{K4uKJb0{pkR3V1k~?q;_3e zDXC3r$^Q$rz2}HXgRfYW!l)bZWJWzY&=iBqj%%cz%Yf@{XLb5*|IYjq-++aZ|D4VUuUj_9u3CCL1t62dT0b$@g1arbEjOlR#O z6Q`7y}2+3e8Bn;u2jvA`L53&NjrtEP|Ml;qJdb>XZyqrJ^)Th=zHHDUKlomV}Ci zZBBr{$mXQ557&buY@be)WO`ho9aSIGE!ts{wpU3*@>4Md#rBYNQn$h)ZlYgM0};rx zwiq8*u>I%`j`B_3C@d~ zfy%|6g`UML3s-WtAC0bzKDxVdcg_0r{*(KkKKS^-X0T>)aA7dl`bDt$r3Y1?DtJ*% z-NS~ZhFtwe&2#;mfzaZmg-hA~FY8+Kb*&q9uWtm-u8U{4U^~cgED6MPbx**ftY%@l>~CqWHFGZYk+!tC#_>rg!^#YzQIl5Pt zd0idCC*j0y{DO-OC_5HXca$)!EJZMylXMkRKlQ?ow8CQ!ZPlTg#(B?XpekFp@RMBI zUjwH%Ya2hj3Ha1B0zSbi3}ph^6QxQ?CIK_cXrvUu+`CAl7DOh9ArP6k!y*$@qpa?5 zZ!JUz2*DJU5xP2SI}riyG(Y>RpK2BWl`NK)MgJDFEUhf}SEsu#>QUJ3EnQ_3TblZc zZDv?m0k_a83j|vrnq>=$s@h({6pMh^{vE?`7aV7AUI|fDc1c_W37JZrg9p@)HK^v; zN5|&+zp8EkY|3gDLkpp7CiiZ>q3w&Z@Jj)(`A48S`^HA#)Vg?zAr!8(eX*Eo#$z!| z!z8A$+xA*BX^0<~asoR`M#@2U2LRpXV z|JN0K8D=T)Bm~cbz;WE)P|vq0@D(cmJE|{u%efQT+qu>pS?$eDuXN^*g|`um6&n5A zO>VV&O{x|B$Pk%;{u|CpPzT$FS^%n-CmF0S%3Gv_2_%~TX*vVv27+%I1%Lf zxXmDNH5<>J&yFuO<%3c|V52{};B>z6l+U-$lWgz&^g?Ieb9~!FrwdJ0TwAWTfZ(-S zyG>t(*DJWHT;FQlYJBbd>iFZP{K+>92*#fEve)N*FKS=JUo<`+T93Yy?|WyP&K0B} k*OcpC6<6i8GplzVhw`s=6%dR)?R!@H*<1gnUFNU<0TWi%lmGw# literal 0 HcmV?d00001 diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5868faa0ff5a328acbd1bb76e117229421e4008 GIT binary patch literal 18015 zcmcJ1YiwKBo#*A7A}LA~srTzjmTXZE%C;W1Wyg+f$?_wzY+ut+V|P@VypkA8q;g65 z!AvKbG)3j{U_#d|LN}QyvmGp$MS)dk7Fc1iAH0j*MHV|BNRVwA)+h`#m_pywiMPA; zr~UoUp5LtCD@$g({&Mxmv-&zH0=h;1a6wUCX}fgnGdQc&*UDz8i%m zp_%2kuqhOcQ5ayUb%KYbxQ6w@AWNw))v_Nob=_#V(RiZ?C3FV# ze%LG=U{KAwK@Dq*Fb5e-3xgR_aJf-~(!(sLbz9EJjV82H158I*ZX3%b-1WjCmeP(s z9%gTRX(gF4gM249!e)i$WnMe4b&tg^os|5(kjP(Jk>*8yfIrDc#kpKC&z>F7ivFf58_D`XioAYT;tRJUhGO z3x;NA-P(e6G3*P>%0&wHP*_^>Ee2!aEVUGK2n)V|$cN|n*B64QOp0u_p@xF#R4^1k zgPSx+Zhb)?0uBY^g6La}E)* z0H;dOeJ*CFrowl4A?jPaB}$ve2*f-gcXDZyws5TK?T6g;QpT0yjw~hMMbI!RgB(FStr2t~?z&#dzhYG0 z%Fj;D%U!7`e=BdwsuJ{q;fNM%%jh=6noci@K8cSmh*(n6QZR%;jrb)|40#ILP_&@) zFGdOmKLMR_Yw)%p`fpuy8w%QRM50CtmdMJ@Whv~(G#7NzN~mCnEH4J50M_}J0udr% ze4%G>A-p6GzUh;KzR;i~E{7w7%DNq(bvsDw(6fB6U}J5~$~Z`UD7_!Q$UfXwxzC-o z9~^pkC=qyc;(m9^w0iof-u}Id?_P`#eQ@OAkw-_9VpiY(1wb+E%Zt8yqEs*h#HDbk zU@R_d^Gawj?7t-j{G~Ajv>iV-AMat5F&~69yOc5Gx$BhAE^`?^v>B_PUpYW@hG;1yS> zx*ZqlsHSA4Z+32I*Iw+3qeCf$@uwZfE^n#4lRG=faVwa~qh5c0Hz;-Dy-}$N?@f4brdsjdGGr~| zICYNWtf1xPT6gVLYq`XHo4eh21&eSTv=+;lZBPG-B!Mo;R6Y{*MOPwxFyvocA^OY9 ztDUFxNI%ckJaXs4{k$&};C;7!!9`!0C3q~BlhS--%);Z6i;nS^*oI+Mh4iz4K^o&h73t-LbDYRggumtsy|ogI zEQkT*Rk4wZ%m&0c(H9j1G3!LgA6^N8BBNTOvN1a=$182cY_FGC>lpt++s{i@0&|=! z&Ga?K{KpE~V4z_3quTkfbT6hoemth-`GSVuBqA5nx>1_%iP`)4@!;HC(7&=6y$6&m zfznq&-@TZapL41;erw1SiqI84iXD6=G;*NtA$&+a%GBl00-9q#F_Xf+kon zuo)~E!Ji=jL}-h%;pcg&mq4tMh47tOc?(Eqkur*3WETBd<(}7Y2FH6BpXw{tdfuDH zBW>Yx`i}DVdz17&oj8*`oN4J#HxHyPr*5w=W(H5EJ>zN1L{5K(04C#S5{Dj6r=4AC zOLtDcmuj-LCynWShco<PozHeUBBTjVpdFel~G3;Y)Tr789>0PbF7US3iC`xwL+8UEDaI8J$dzoZaFy=QQp4_O9fO zO#8uf+tB)fEuF?O`g@(O(*8RWSG)JQoikYE9`<~9TI#3aH;_blKz?mAIx zcFpV=08XX4^kueEhAA@`RhmvIqo`6L1K5CW><3^d5HMyY2Cyx=Ah>lwI*xsQ+P8=e zhQ-fEf=i&tQZRatzbQuVK;Gh`cfugP*emmqq7)BlUGn)s1wdn?{sp4**g3)QHuBA8 z14J??fk2kT_5jlmiuK8qk^m2m@q*|NgC%?wq~!_|SBt#i43vUs3B&!K{fwO)z!Nf@ zBu2oH2&-~$JeGNRNViTDU$C)hjX*ijMZ~B?i=d!e6hj3a$fVmSfje^2c}g|jfhZk0 zP<$RNm{_l&JK*K+EQ&;EfytymrUWj(GN7|%6eIyq(95~V0&c6^?_HeD@prZPs+wP0 ztN+e`=jWBx@!AiXA2vT~%~rOro_V_S+wO?(eK?r4cdkx8wL5;WCqDP6@1sa^^uxEa z_P*80Jijm1@e}LXp^UX9tsh=@;wJA63nN`jXYyl3l`axC+0M9v7up%b-FIG!SP+8A zVYd}5Xq&K4oL^e|SX;W-Pbb9?qpQ4+$4ZIvL?mf$NVK10i(^rY(pmx&6@C5%o<@7y zN-E<%#$TmU#CKUDTTFo6wl)N|R%P+vD;wY=;xZO7m>Pfc9@J1D^aPJZdIf#oHb68u zL->6`>fRoXXM+Su4(eLip%4xqHY_AZj`l4iHO+1AhX$UTa>?@5y!Mc8P6I8BmRmt{ z;^HS9)LN})e?fC6LTL*Bs5mx{vAVk~9WOM`i_uvcF3&Nj1-`||aZf4pE{a5&aofZq zN;^mY!H_!ew#bz5ihNLxd*w-KG|eTgz6qbQ<4yzluk}z}EA&rp-!w z(w_k$gkMp!*{b0x>wjr$$=F)5wzk!Yyw(2x;roX(&e5M4vd+=0bu_IXWot}2gHnDP zFXbWzN#9>Q$6c+x2pX?eVD<~hq&mEpdTZ0QK8h_PT(a0}^Qw!Bw20OLd@T1j~nsuT$Hn+AhjYP??x4~)$e;X;xdySyb`4?0LWwK(ERn<3N8 zJnKg*c7s;dqXfqQ@CecDusOyqVR{eKY>?wM3r-nAaLs&oSl7i}uT)x{nJ+P~3U7r_ zJNBQ!yuQ6{jOvhHUj^OgD`vb=89A)8uUZvN3jSX;W~v^m$KfSckg@`H8Jp%mb!?zH zx4fc#h3y=SWGhYa0BoocT|~PN@5pZ}nTZVzKT!3T*4}XpTp>6u3P$ik!jt@qlR6@_;qhVRQ^jH9OM+%4L`xWIg z>br%?5rF);Vo3+-{}b!T6gENAgO#>e`06yB{E z@0*9=%{?Z)O8A=TMucaRcHPzA{^&7XnqeCG?xRZ6F3#x{vfF+Eu#cZqZeH`FaK>+~FK6k?zQ%BV?}cipiD zS?l#hqdxzwNC*Fo@Cr|>jDKNP)*0jWXP``;LR}a+%uK-$3@xuj3kIw}QDU4{qD{mE zL$^hxb`mRv0W*reu{niOgYga&OvQ;VRI~5dvanpJX6s3n!g_*AN&;STqN_SaO zwa`|St?SYX^54cUatfmim9+&r7Sk48kB=q>l2WRB-ID1&nsy)Cm?*1@q+#C5H1wwH z`_h*FoPGdWBB`W?cmrf z&HKT>3O=}%IG?faU7g%Aa@Oki`|kHW7)T6dEp1QDm2vY&4ax45@#BGPCcRj7|PKv2BA1`I=hw=H$ zRG&5Vekf}l%GWk0d=KAPJCm<+#;>KTy3*#Z z&mG!o(GSBU8mECsO^Hu0z?XL;1#bsMJkyW8PVxs7pJ0(zYH9qrtj%IIDMIjuswQ zW%T>-p4VH}4t-}jzLL0+sqal)&eVG{de3*5QNq@mcr)cpw+^IUPg_QE`cXEST}f~1 z@W-?1u95YbwB>kCeJuGVQ**w#WzD#DH)C#~vFnJxo+kC9g-M0G3xxjz z3v9bUsA9rpai(NC1#2#+s)Rd1AJPeikX|rC#L@{y(r+g?Q>S27S_~Pz#@$T8CE=`s2{qtsDjY0jO&lVIm3FaG-&YD}CGioe0n|X1cxP0~ zhD@r|9rcFHGj|y#=pEXuq&5Wu6Co<_ZKrRr>neJd#H$LST82>Jt};^#HQtJ0*Z|5R z&dlAC&}H#j1Sb=^Xbg22Lx>s>h|4qK0z@suuR678pvtdT`h^~6)OA2qXebFP8ljPJ zR*NXeZ&LDw<{dc=tmnp(;9;cNnD|p%0lubfbJgP2L40Zb3LM+YI4Ud12X-T`A0PO_ zq-F~JSM{pBTwK0Mw&#K z{W}B;)v)nBfiP@KQ6662TRe~oMmylZZt1zSLtf#7b9_h?17g4}y@_QhfsDwOBI!82 z`RNv*n@BewZn5UCZnr4Fkif+R7-^0QbX$t3%ZtPZPjsMzzXSwp(JyRcW4p z&6d-PVF+S9(gJ-psbrgJ_};PDL@XUltVaq`GsNc0Vhod=b~LC+G&`i2o>&z|CMqs1 zV^uARb5VD!wIn0)JztjWV*9rBL#dW*G;C1^C*UTc`LyjhLI+T z=RXnXkFbx6Qcv2_k<)iFk>yxU{|bBQ$?4tCs;XDd=4sd-!xH?UgAa<-!+ z4%EhvrfqGX*SgcaW7*oNHA~)Fn{Z~WEqR+Op}9Y`c9yU^S7iO^fys2u*_`bhCHCiR z?Lh3AxjKIGe&w1uZ?>=9&6*n$6Um;((;0Ig-YM=9&gn-`xM;@&fh@*?Y?CaEm_U-@zc`FZBs->{AubWp4RRqp=(?8iF+d0Yval(V@x9@jT&>ysL@h$o@c3A~*wyi%H>mqNCWDW0nD4AjM@2zFNg` z#~)Ct>KQJ+xdC^Q@x=pjwPQtZsJhs}641e7+q*#xm7s>c25PtjHT*SDBY(2;UtWEflO+Ftc(^k%F0s zHO)V>3V+#E>W~3vsSHzGBhq(J=l{kp@{hQ!a$8+obzQn{U#6-DB)7)3df}O=Dt_QQ z-_AQ-_s#hVP}>KsU;F;d=~^@Y#?icHAho0=V{J>qJ=vRDS-<+p+fRCaK6oDF@BQif z)1YNtk1ynGJ$V~U-EA3LTVf@7_3_)ku=T;&Skv-*3uksR?XE91{_oFya&G-rw*OSR z@AQ-5wEb+(eD0amxmt8WS{dV;Mf90?cUveAWJ;MrMM0~e``}Z)yt?wfEvG6pVF1vK zl7WhSEgUqekO78ugP-Skj4DDO^O`Sdrx1`vK`5b$kh!c=2^C(GjQN)g zw=|CIxRGOS%r5Z{5nAA-Fr3$99jK_5f`eT=1S5mL+5?HHfoFPk_dZaB%89~FG30AKa z*aM>g>h)U7tHN6f%w>EFy;9+$at%!V4fLB2*{ZT#uT^lHF?nqx;E;5!;JN(kP?c)5 zKo}?#3B9y?E0uBa{T3KtloeggYu~1;RS6EJrJ%s3$CCCxW+{)->tyin&|Wy9TcvE2UA*(NwujXsH=`YKym;X@V*zlWL7n z524{=M$sdhQB@6XNMkz*<=fS*z+;LsJ1>D(=BzYQXHg$TV6to5SkumRglfEHcOnXH z8`YX^qpBXE8ufUn`a+|Op)2=g$4r9FPxq?esqd7=tJZ3V(g*B>Z9B;a8>y;3*j$Qw zGWL=RlIr{}gX~mh6f0OYf9kmw_Na4IBj1G@m67jOkGu+IFV#dVWxMSKshw>7)Uf@q zmvDKx*$Px+?DnBNzhfQrl*ij)GMr4 z-A^hR(en6(%yV1^cOB*A%f$JBC$CF5nCcw&imsi51G>+55L0|*CB*w= z7rLyY!SXMMbg82D{6&`mnIdFeNoCF;;p9(rko+rTBqeH2kxkUH5h-*kK0Ag;YOq^! zg@pO>iK*#}f*h7dK8Psd!ue7k|5b7o>HYKakf%?uus2!9Cf$-L+HQj?m8iI^>N8gY zlel!2lYFe17ZG7L4_6ekOOSIbfJicmL+@bPajgAfxF{W$BO^QbNeZ8zhLq%q?UlVp zm_Q~pk$H!vitjmlI@j4_{K}J+Zn=2%d&n zK`!bm7WT;Y4l^p)bWu;34Fp1n>=cn+#apbg=ou*+bvpQQ=7p1PQNHmi^FzgSo&$3+ zeT47ngX@GTAOh>q z9Uf6l!P}yTO2<04p+Rd2!5LB2TJm^eH9Ups-&qhBmm>VV@Cq<=+Y3f{5lT~Nzo5gi zlqKjz`ZPoqMT97U9dOJHf&^H5mJ60^zQq-BLXzO%Tw&!9lEI7Wpd9!R1Ah-O>J-rFTf}0aY|ZULg-?mREExR@;h ztCrkVvuwuL)XXX%G2}*^xX~8eamfy)N`%_amiC+UBZ39li9FUZ>q-Mx(~z+Kz5l0s ze*&k`fsErI94NN>kA^O5bD{hifVX5 zN9W^jrN%$mw?32UedPnkl0YsM|TxuTX(Ml4rS^KfwOG$O&E+}ug*`Fm&b8$W5wHVwk2 zl&%}eRgZpF-H@;6AO6MKS@^ZOJgK>jne3i388g3TO4L77EH7_mtvnk2XKPI!CY+uJ z(}~*|Tla(Md|P))`{Cka$NKye?LRL5%<<`bdghJ)wfH|B>2LYgFb_5HLjb;;vSr#w zHnf@cv5hw}?UNbXL<9!)1#VDWl1op&`Q4wb*^TM{!5-$^;L^}YGtKH15Y zccMVXxhMHn*4cy7+pwvwWi!#AGY@QuFgI1p6Pi^`=r1})w-z)UJajXE`Ht-0GTYNt zeAe8Nyqq!b#ZxhO9n6?pA5@Wt&j@eYwTIu1htu81)AkcN^Q)9|0l4{w<{n`?C%ZcYo3&r~!fE@vy4gH(mXp|t&Q&U}RFrGNOB%UaHH;{QJH z=c=2&;Ivq5WO3}x+4_EEb8Q)r@FLQMZTeq^Y_B!w|Etc3`+swIUTfw4yGD=uKeg7r zc1ZV6qZ-_|#m13rgt$*Bo``r5>mSfyOHco2cbTu6s8W{kxbs+fcmDO!}ofGi;W(t$6C2sfoLWE0Ot#BKHwQm5z!#hH%Nks?~K6%o9JdP0TDq5vZc z5D}VabXsPK6*RuHG``ZuNPm~u;RasdY_Pr5seq}(-empb!E|G9+R~TP_cN#bmxKO6 z`92tXIF@c3Tz6!hL#wYbxR%6?#6`JWzID%!-+25+s`8huqnXyxhZ7s)t5X14n@S8M z+S3+yPTz}97FS=64qEKdcqXZ!+KQIbuN=6|lF=2;nq=#`H z?(mXP2qy_?W5P59`IDK3vyS8O7@9}c)VUVa&tBb0dRmxyFRaJ8- zzEn_$1R$IOu8$g~I2+i3fniQ%j#8B;{fAvM`)9fovzeO8m9a#P&V7J|AyG?;{+HUo zx|yPOkSAYWRhUOPC_-?RXK}u^s1|GHICov_-%ZiRg*F2Z_cD(3MA;@MEo<8$W!j6N zWamOb3i-o9VmZu^kw8Yj`r#t>1tLX7Og^UunN|j4#DT%WkGyP&E=b{(`2|@SEo%li zCjo_JkvZ^-q>;rb%3c#t#aGcs*-}sHp+rY|i}7McS+%55mMJ1L>VHI^-=iDRQ;7o7 zW1|#wMu*6J=(Tdx+9xd`w2+;Qqn1wV8Q9QPGHvBS(+z3m{jqDHdQ*a(TF zm^f&aOt%R7X&fnBAhvIcPJ5`r62!Y8ckt(MJNOYmr`4F?!J0$GG^C7(` zS%h{DV|X(4*VCGjeu6}DFh}}uV}!q^^-=5U`OiA~vQ^{%rYUi9z2%d4o^;^6*CSJ0 z6Yu(g>Eou=v+1gF1aUd*@^y`QM-2k4o;J57?tb`6zP{yml_tA!^~}p1EGvcUr7hz* z{RA-v%TP`~%w7)X^hXr3zc&5R>7@C?slJ z6NFHT(sTW_{i%~r)~(NEofjaqcI``*xCJKm5ythO3^?L}})~5?8AwFQy?g@zW^}#ZsM>9QUEcBxK2PAaBx(@p95gc zixSQQk}@qX0h&qaKHW$JKn@O{7WCwUWBNPVi{cXQThLRquJl(_ zdWCLp)9pKSE3G27DkLyJPCh}=i?@RL7>pn*i{f$VKj4#iR%95|5eMKjn$Ngvzu_u= z#W{Y(S$@S?pXsb?v8=8!Z?nHYd4H1mvQGVY^6})4ryozJ&SqOivbIrZ)FxZ}^ap1j zp3RzC@@DJ%=KJRNtL|4NG>MU%x#PE7KXeLvN9xqZy^ULG@3oBn^?YS>Qrd8DG^a0J z&gie?D_c`F8|Oc*NFTkD{-QwzNZ0Mh>+dQI2IH2Ev$v*n8|R+f zOCPn`@#=zgMq;{S9c{pzL6*yZO0u=N+3!!izd5Ds{( zcd^ID$P?F-$dks*(F@NhdF!^O2cUs14v%$UjmH!D@u}-MeQjOS%xVCF^7KrN%g>GC z^V5j@oqqlLa|WKH~dvxw?^<0)q!TKA^YzDo>6%veNRR_ z%idO5Qc)IBvSBlNO_%)Z7ir$tz^5DcH?gMuF&5juge}>>lr7!g%$oPNuog|ZU0I_f zgLf#&&}Op^TgLOk$cxClsq4 z%4LidGDD{vv*@^Sr#pWneJYj79XpmA8q1f)jrx2soe}NmMpL24M)2&3Y^sz!RT>iG zB|>u`l!DqV3RsWh?59xeXjV$A3Ta)seU|B(5;d4D4a z1Ngl@jgG&j9Fg}n^V^D2@ExK1{2KHf30iUM3l-P2nOTqcGV2vSzmJ5iQUli7urly> zjbgR^08*K|73BzDTU2DAfkOASMmb^)s+^x73Rf-9-r2R#t3Wcis9r5(?CdXQep}hQg^XQQZS*qe_+H-ckAB{aXuUkEBd)hmPG?--z%#nydOZ5P5zXnjf?i4&hO$POFBaVhQj77R z5f~lsprDh2E($jF$D@o^3~QtyhQMfeaCAI%bS#%Ip&=ujFAk;ix)DWg2}?7TX2$I) z{djRKpGmRoC`%3Ji$~M>R3SZ*HR@7&`dF5-ji#Nv{~%?17%MWPB?V$Pk}jpPr$+PX z0w;3lQ&7+5k1-l_qn;it-nv^PM2*cleKQT0(Y^6_aU{F(=`_ow3mfsAqP{VEs>p`$ zg6+fT!A9z%&chTD*2L(zv4Z!TlRK6zjj@8Bq5(1PC8}bRnuK>T;#>N65WJxL$I?5$ zxoR?eHMVkU-S^g(W34l4>s+k$vg-PoRa;L_$UJvSWY4LsQ|p{194T4iduyE~tkfm7 zb*Acx7u444=%C_F2lES}gVxL}fUp<41_Ss1NKuNrt(65zhzVlT$^l6a>AB(p=kyN- zH(|{mzGstvv$@W&wp6RcfTW66jwkJuEA&IrPP?|}O0K57wEmN!MfH+sr~RD8&`!IS zXYX9JGvs)NcWFtLYL=7~C>b{CS11`ts)L~pAE#zv2Q{<%=uOSS)?Bgvf|}L!`U?JD z-{?cbb@AxL9Xm@}KAYA{T4$Fgh!Cf5*-YXZjn+Be`~Drh=X?_#M8di)>V`-)bpuh; zb_kl+6W5JEK3m}A;#`m|K~s#VFp;uu3VPmea*)lfRDN`Pt0Z!*Q~@kZF_r=*<@20? z4HZX5(=5xD(M?+IjNm7`or0AVfU79+2*XELst8q=lWJ{tCN?=q*cNAEn@$v$=ov0{ z7ve?>r#&ONLT+Si!~$h&yy%m=40TQaHUbB6YChBR%I9ZPZR#iwW@FlA)%+=|+T`bD zN<=QH+G$W{sA_CAy62)yLC%axc6wWCNfd_+=(0nfGTLX1RD?0(R+uDI|9@(EV|(}czB zTHb3_)&i9a*DM{hR&+9Q%lj`W(4zV;YoY&L{=&;d^OdoZT&TAWf1f-1bR9Ai0>d%lzK%|IOW{GCp~mrkWB43&>+h`JC;0sSR*gwP$s4*@Yq6%5s?VARP%M%1o5 z(R?tc13V6!&(d-QjrC9)k+H%vh2qJ=#PiV|4)VIqqT7g=bQ>U4098b6Ql3D&V@LID zDf&FetXr&7h?u1|TUm&hS>OhVXR_luDuD+OwvAb%krJa}gg9@BhXp5~6~N-uVG#Yz z6l|ejTYtQPV_ZYE`e6jAVT%)(xKzB^h(2rtAUM}x2X!_(VB6`rz4TlMg6(7-6*)c5 z+gk<97LV@i(Cbi`^8=eFEaNde&Yx*<@e9>z%l^v|e1s$Thg}F> z;&yLD?&4)6!P{KPllN6)aLE%$g12jXa>DA`CW2o~FWns1vzPW5%ig&;u4nJ;TIf}% z*1HVa9M`FXkl4ZbZ9WpC9CqkBZcQ&Gdb2pB9PNe7g{s;Z^)SZ$<2V=O>a96zBzj3k z5~{!?Ni|tFsG8DT-4U#HaXH!|0jJ^uLaDRH-TDiJ5(PRTgc1Qld3-oZx_;eX@E=p+ z^%E<1=JO^%*|!_&Dwfs83b|*;vI!0rNVMzijr%4F3lr^ng=p6aJ(fTY6th7A#|s`n z1EQb>B?LHNB-+QF+1>r| zdZ8KPLgS-Uhaes!cwYk?L~U?j_)f5Xs*#}J5d?zqi$`{L2$aB8ZYCD!av_6FI?ZH> z3`}t`#-V{2c31#(<1Q~$VBe=DrFT04!8_Wza#QPf!&9ASmYqKNW_U6%)6{x3)_kV> zl~Xfn+Z+0H_v<{;J$35!UgS*m&c@mw+#JmH-=P_G{-AVjYZGD$)ynQ?w00tdztHZJ8ICJV1fCY>}^c2n$t`hvG4dL_#fh z5W*&@{#C2i0+ejT{3P-A7Ef(9W<86Gn|7_*%rD@0hIeTv^IJ^+31Zki@nqgM*|W%+ zd=FwPc5Tm|Ro6Bl#$tN8kWrT6x$GT5j2gYO=LLrtwMxr*Q?p&0t%OZcH{xI<_H(=$ zi4>Hr5eFjy10hBNCK8FO69dFLjupq4CA-3$34wK#W%X>Kl+E0)?aCF%q_;uan}s!! zB71~(e`JI97%P^tLu4D>pzR;a43D6WDda}XdPc;oXQ);^L$%5pQM-i+$kx)j0yUvv zJ&2f`XJK+In2@N5h%K~oz66VnDYUAvcc9zZ3?m+5L~ToMmE6jRYYQH=0Wryeh|aK` z6mT|VD=Ild^3qnSHV0xUsz|n5wugd^2%M7W7S@Fvoo2ShW`s`iHqK=1?xxJ|WUTXI zHr3^bqK-e)_GZV{miPJ#3#%=N9q!&p|m3CZY#SShqOeYdz#rlwuJ zKtAqQ%YTw3yZ}x+zx=oNEod{jl_lvX-co#MFnB+JNg1SMeNRI)nQ zIF-hXUyim2@l;&%;8e0Y1n>(@8po;+A3X2SrQJ*9M(VeS)(}`dnk}8oW(!)UmM&zp z&53LHSPHuz!8Q6CasT`N?Y-<6k4`k3CRS~`fT_?iOMm-D48hhjX%(uLuy zvDRxLSC%5NQ-2YGT*f~WdZcAD4INYY+1uCS@67E`DRm%n_E{bvak;_%nQiDe(|Pt; zk#&(0B3kA(W!x&^tco~l&!cf6sKi0oOAE4bCViI19vT+<*!;5DX#ox`d^P?ED{#x#mS)rYwV|Z!x{-0EhcOAlKYL=wY_0YRc!(gunWi) zw*dXlLNq7du%<@u?C(G_ykjIh-^D?%YPBor6{Kb1yAkHna@drXogl|7rUDU9QTbEbq!o#w?BETKB_L4j%$v*yr%3#6=*lJnpK;Z8yQF%6Ze zq2gF!9(RhWVh^BY{rdNzy+2kx?rBKys4lPgZlx1Y(qPmJR`E$xSzY!L$BmHnu zQ&Zg8C6zLwsg!WsL%boCdUhn7tW{c)X*h-WIXnw;r;wmY7(+*5R_l)bdXr-*Wm+RF z44tE0+^o6gv9SW|SK=GybWlE)8yzLHCM%9`duC$dj=kA@zPLdpxe= z=$kE+c%BOj;pzpd!|CQ8#GFXX<@(X1)6@{6l@P3M$8s*g^<<=Y0_%Fz9vS1lsx={; z(mcx2Gj$>vL`UzQ(YBYD_D+Vctn8XmyJl8)&BnSetLD!IwQKT(Oo_-PSKh3h!VOff zD2*fRsyNQr$SYboO0%#=E4qB-Q->Z{ZHk8)0iHZ8X zdk!3URQt@M0|$1$U+-8}d?~Rn;w9J%6cFTRU!s6C=l$%<6nzOn)qED(X!#7?;LhzX z(r)=yn%&U%Q#->5`0Sl-EH6#aU&`Z`MxX#uT7{ zt1yyiqDV;Ylligi0N(a8A)2rFk8 z?2qwwAASz6{p54H8Q1)DNgWbeLiv~qF2Su9p83Bv5-*BQgniE}g$pF8oK;eQ^!zq^c z`4CO$;|NTcvAMjo=l3B9yd6U9R{DiN=AT;B`jjdWbkTy|mYAl{_nn%8Z8 zF^Ha2H#XWP$*SVQrX87MA!Lc{$s%Rf_C)s8wSn-1wQAX;Q?sO$1!|U*iekAH1}dav z#NkT5aH&Bmh^;Y!)SyD0;=`|SCs*Tj6KnR2jF!f^&;VtLxral`Ix-W6p#AVW;4bAK zuwe$K9av^8K>^BJ4*uh&H#y1D!VJ?#F@h-UK?DN-SYF@+zPbLDJxnn&sjwUcn0rdK zclT1h=6HX}lMh@>xbb;FBxj)~s4+rZFDO613r3RG(_ff6T8^zoYkiRzFC_5@5K0P4I%Lq2CR3j)--E-yZTL`g96kiR$ ze$TZTaOBFF##ODfTAixaAG+4UeCw4|tpS&+b@AKG>=pMrTdyvMFcsrhaeYMf1on#m zc#N`Bd3Dd6h0kv}(Sl4sdBV$rsJu$IkA3V}eWVPYk37F5ImeJB4AP7mC6*o`@Lnuv zdLjJ`;dj{A^r0dfg~=YeZBtd#zbL;j58FKSHr&JxqdN$>P~C9v>riPNDkZ3ANJAwI za-{Tecz$g_@_m=P7j#D4-K#?o_;aRWoZ4f5LIGFsJVmh%3P>mJa?tAZu$+I2(|b9D zmYSSvD~gJ<=EO8wf9F&=f}!zaM0?VX@iFr z9GT3YGIC6#0PVJq_I!jn7RIP6BB6Yx7+L4m&ogZ_Suu{}s zo2zr86q;NZtARhFgQ?gs@Yb>#Z>!!%9~zQXZ!x|6-H2u3#emC2_5b$+z_EvNQN3Kq zC`+dCp;=9&<|x}1QEN|AI9ZpB4%!yc-;CANON(fIykTOqQ~6KEP_aQtxMSpoVc>ym z44aP2(t{1~d$ZbcxPgHm9f#WnD?XDgAkB4}#9APqW^`?Aly2u3v_NA>CnkF4uO`H8 z&w8tc>S&5+JV6HTejzx(w<-BL1#ciQ6`|ij)PwTh!zsT*&gUm?i1$sIuWD?bhXZ_Y zH8RynPVfkEg1vtjoIuz;b-aGOk&WRGJ3+xo3QkclPQl9*yh6d(DR`BF*C_Zi3cgFh z1O*jF)aNLVf?fF4X~~fhbq5(yyUB>!>J0oatg6A#4l<(d;9QDVr7t5d3*}uWtl@E5 zN<^NP5|O8+z%2-8pQy$Xni!8{OOMmhC%eY?Wv)GqMygLg$rp>yVBQ}c*Y@q6&-A&l z(@&fpF))Z?-~R!hLwWLj2xC$Nn`h5|fbaPay7v6v`rY*2RMGBRll%ZO0#&!H#m%9$ zO50+NWe&Zyd*r!7W6+b$%l8wox!8+3@99_go0Z~h>WBrAC2cy7!^|s<1q}asTJ*RLK2l>DVi~hdd zQoln~pJyhFdZO7Vl=^g_C*I zla76+!I=DY{X%9SC)^3=F#-@YxKr*q^QaV>M+-F;V-pFOzBo5PbczcUT!Hizy75&C zj#EJXd~6j3VI`+twX_Q6?l z_jLGdV|hsr7|Wf|HEC13;fX8v@n2B2Nx*nJ1995@Z|C9Q04s$XQ@bk)BZ(4MV$04P z`Wg-=SU)wwgW1^n%c}WvL0wO$2~g^y9W7H?Sw==sqFPKK#?3WSZ-5GWJK%B+6_w%F z;b!R&XuAF#aBHL1EMPf$iwM*getG+MxNIT>UTxy!sU5H(owbyRSJA~C|LoeH%fGrd z5k!axi|HkSSNl1hy|nesvUl)xb=30gon4FTN$h8MmzG4mX1kK0*DPrR;z%OIJz*+! zFLcZZzZ`9mvbf>`(~+ds`cfv*Bf=-#1pPQ7WmSK%(9V}I6fNN6lI$Trn=oPp{GkPo zyQyv4u!r4;t^7JD*EXVf(1D1Z2jqu5&w)@NgQVyNVWb*Rq%ay;eu7CnY`rqhagJC3+(|11dElju|i#m2k&$b`fVZ zRhBQ&L*7Clsn(U&tuyM*(_frAQI2gx>?emr5Q8(H`BPSR&cwFKq=;OiN-}TOl@i%= z>dq;+9hi-vgq1?onbxi1jC%OL4(&Tpje8h=QfLpXkodN|QacZILsF`O5cCDVrB z**c+9b5F?ld>GY_3F%Fyom=PJ81)XIx)yof9!_Bkp(FgVJ%Sww_Pf{~_y6S#I-8tH zgT*|X_iS<&N{D?IAqQ%+YkLzgFIT=W{F^t~=bqTex&YH(@x)++pBFZ1k$ux=-hL9; zK;;F)D|UjwkW+Vf*haF+=%O?##5(P#crv9U(v#aF$W|{Gbk<^3Z7`{5vVKv$B-UA@ zm-dLt-Vy7xYt>+e=v95q($d^ov!rBVkOG9y{QOdY-AC{Fd9-C>lu0pn}6SFd2$VlM2y?q>sd` z6Uu8LO*x2x4_P0;|`Z`FX z@}*@feD7~?>{P62);0n-)$CkAaCiC|+?L&cjmD^QOF_gGsw#FBn1|&s8aGBlf@8Bg ztzxg!(ZuEh+8OVXcYaF6_fTNVHXK86gE38Q*6}sUF^XP_^<7q7KeKdS<~dTA)IL-b zcgl!Y)x4ng(cXqFuRKSx)w4XPJelpe3YlqPC$nvlwIE=fF;gU)na$D3Y|qLvGU9nM zoAl>hF|PnMA7^&u`)#r6@I73^VLRmf%q0*=8wI|Pd2tteI!E$jpi}xSh)|NtyZ8W+ z1AfiJ@ntO%p|HNEf9!kykJh3aE_pyee;ODrr(pwE0_-SNQqb8@;e)x};(M<fO$U#jJGNPCi`ooozRl~4Kj>}KWHL5k)@9PmW<&@iTt<+u>2-9 zZUf7nx0jvWdFIJi`=--#Ev;`a`!)Mp>doI#z`@-=ASTbprJ24^%!keFwq~e672Qa$ zYMY4IH!4_$;~k9d5AovP!1HvXGBzc3>>_=qx#!2r%FR79Y7fD=9&9Z|^im9m*t&jZ z>AuW!q%NsFs3z`|5wEI=Ois&O^F%sC{wJu#JahsSL|m2v*mc$)94Kw%x%SP^O-8RSZ9jYLe7d}JEB(g=^HB2k zH-@I~d%ZZLwoesjW9^q!^QWw~lkLyWK>U*0PSn}Vn{}l`_MF;IN0HkltQ4wNHFr_P z!<~g4DcRigea;eA3e8OwQ!qwB;st z?1v_joZ>>wk1`1&y&XCH_H2Lg^MTjHnUqJB7fY0Z9M``_qqP(Phx$b95^yf<8W%Wh%<=Bg{ zGrluj-`eu(mT&a|%5?o;%bQz%(D!EF`K{%9wwGIaFDg531|vTIO@)GG?Y_I-RS?{K p%6G4C$GZxGn~(V#eYPFVl| literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_main.cpython-313-pytest-9.0.3.pyc b/tests/__pycache__/test_main.cpython-313-pytest-9.0.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89096c8d1ddc2e2f288b007b5462c4948291ac6d GIT binary patch literal 18004 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