From 1864aa7ab6411c90c402a8d74fc14a60c5bf5c13 Mon Sep 17 00:00:00 2001 From: Benjamin Kirkbride Date: Sat, 30 May 2020 19:20:23 -0400 Subject: [PATCH 1/4] Revert "RESET" This reverts commit 4ff013c1f8fed99b40aadfea39f97c66291c0d88. --- old_pytiled_parser/__init__.py | 4 -- .../test_data/images/tmw_desert_spacing.png | Bin 37830 -> 0 bytes pytiled_parser/__init__.py | 5 +- .../objects.py | 0 .../typing_helpers.py | 0 .../utilities.py | 0 .../xml_parser.py | 0 {old_tests => tests}/__init__.py | 0 .../simple_external_tileset/map.json | 68 ------------------ .../simple_external_tileset/tile_set.json | 14 ---- .../test_data/test_map_image_tile_set.tmx | 0 .../test_data/test_map_infinite.tmx | 0 .../test_data/test_map_simple.tmx | 0 .../test_data/test_map_simple_meme.tmx | 0 .../test_data/test_map_simple_objects.tmx | 0 .../test_data/test_map_simple_offset.tmx | 0 .../test_data/tile_set_image.tsx | 0 .../test_data/tile_set_image_objects.tsx | 0 {old_tests => tests}/test_infinite_maps.py | 0 {old_tests => tests}/test_parser.py | 0 .../test_pytiled_parser_integration.py | 0 .../test_test_map_simple_offset.py | 0 {old_tests => tests}/test_typing_helpers.py | 0 23 files changed, 4 insertions(+), 87 deletions(-) delete mode 100644 old_pytiled_parser/__init__.py delete mode 100644 old_tests/test_data/images/tmw_desert_spacing.png rename {old_pytiled_parser => pytiled_parser}/objects.py (100%) rename {old_pytiled_parser => pytiled_parser}/typing_helpers.py (100%) rename {old_pytiled_parser => pytiled_parser}/utilities.py (100%) rename {old_pytiled_parser => pytiled_parser}/xml_parser.py (100%) rename {old_tests => tests}/__init__.py (100%) delete mode 100644 tests/test_data/simple_external_tileset/map.json delete mode 100644 tests/test_data/simple_external_tileset/tile_set.json rename {old_tests => tests}/test_data/test_map_image_tile_set.tmx (100%) rename {old_tests => tests}/test_data/test_map_infinite.tmx (100%) rename {old_tests => tests}/test_data/test_map_simple.tmx (100%) rename {old_tests => tests}/test_data/test_map_simple_meme.tmx (100%) rename {old_tests => tests}/test_data/test_map_simple_objects.tmx (100%) rename {old_tests => tests}/test_data/test_map_simple_offset.tmx (100%) rename {old_tests => tests}/test_data/tile_set_image.tsx (100%) rename {old_tests => tests}/test_data/tile_set_image_objects.tsx (100%) rename {old_tests => tests}/test_infinite_maps.py (100%) rename {old_tests => tests}/test_parser.py (100%) rename {old_tests => tests}/test_pytiled_parser_integration.py (100%) rename {old_tests => tests}/test_test_map_simple_offset.py (100%) rename {old_tests => tests}/test_typing_helpers.py (100%) diff --git a/old_pytiled_parser/__init__.py b/old_pytiled_parser/__init__.py deleted file mode 100644 index d58a1b1..0000000 --- a/old_pytiled_parser/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""init for pytiled_parser""" - -from . import objects, utilities -from .xml_parser import parse_tile_map diff --git a/old_tests/test_data/images/tmw_desert_spacing.png b/old_tests/test_data/images/tmw_desert_spacing.png deleted file mode 100644 index 4e9995c0d95bc53d3dcc4bca2e7ee0b9aa531550..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37830 zcma&N1yoh-*Y3UP+H`FcX$jfDrn?)F20=hNq+38ha?{=2DM(3ocL@qehopqk8-cTU zp7;Nq^PcgZF}|T9EQf2~YpuEFJ?HPbX1JP)JTCSVY!C>9tEeEO0Rkam0pAZ{q61&C z?@CC3zmQxtSNopo}aCa1g^y z@s%vb0wxuy0B+CtJ#b#oGdEdXH)%(EdkY6QkhF`1iJOHv&HHz5)-+ny7BupTuhdS= zpF4m+G$2J8NiEMGzdAm+QGQG2__F8<-TemK!v8d5pcmWkn%86#=Cp>k6dyv+d zNCN3;b(%$z}cDVnRvj5e39k%-d)sIY{L8-*(56s(B8)sBgeAq66?G1IS$ z%dM;W{^{FP#pjBXSWWkX8SN^E2J=Yw+sfkSN=YU`4WV%Xa8Juu4P3No5Z23wrI#8{Su{U`WdhJ;8UQ=2DsNde*ppE@Su zuC&qBo`b+5srD>p)3CqSj(mlsZDW6qI(#vvXMF_+Y7TFR7wYnpP4|vI#QHUsw!OUd zNkx-(Tto6XWF3P-yl?UHcJDutF~IA@pp@V!KQF|bJ|7sF!D%?h3rCF3K)HzJOyK@}j0fMimAe$g_M75%ZVO<_6ISy5q%d`X}^E z?{nhpaiJF$ZxQbu3H$5M`yzL!c7+3{6bk4$-D^2fI=}4rB#NXfMA)>_fh}-}Ox1ew zLd0#V*c|!&dlPF0c+N4q-HCWu&h5PM&@s~a{kb7md9EK$(<)?SQPjW=Y~ia5f$Y%{ zR@(RzRG}7tK|KQ!BdFN@?=hbG3WPUA1OsM#Uh6j(Cykjkmh**&bq*=#&SBkINI|)c;&rv zc^^auM(~oLfQH|lyS?A|{*?Z_)#&)?8#Tx%qQ(g}EsMMriZrQuKdJ0*;>BDi5GcaVJ1~WF+wLMhy&L$11&^y2 z%yq%`Ywbk9?TTLQL|Jfojq$@)5OMzMmHhAS*Fp_gx9r_F(VYU~-no8De~RvZcG4oc zZa$DB{~Ka*u@|r7)-(b;8A>*b>fK1P2;fFJsK~SkKON4BGF8Och(JlFVrh@0ys8V?wB|<`G+ec#yQaIZ&c`_B^+R z-n<6{q7nn!tl=hOW(NCixjDo*md$&Hs?pISm5f3s50lT1<^P&GJVX)n*)P6 zxs4T=v+d^f%o2z3Xa|{ifk?MyJNxMRDmMdYg5x4`G04jTNMZv6kb{L_B0hNb?r#x# zmulh+oYJko5pgl9f#iXw2v)U0eKi)+tm;ru$Jz%-=7|9|XrcB4DAU0a#DV&|e=3%Z`QJE# z*tprWQK*qJyO05|KifBvey!yi?+gi**lZ~}s!&KQ9R+ot6Az987OK=Yf{F}UOr%P? z>QI7;5^)d#<~$w2XS5TXO#>lguna{In)Fm*to2d{6qHw-F?4B#XM8x%kq|~6aB)?UuV-@W&&wFYBF?me2}*2 zX|p8-nwEA*MVWCsk^~v;h~98HOV}wbC3YNBP!d|*JO2#@E9~FpffpKuitP0Cc{fh3 znWeT*M{4|SAOt4&_(qTPx)E* z7&kel9T7YxxB7jXh#tGpz5U}ChkeL>-AEFqE~wDmf%JD|zzZbONz)RB<4^sO-0mkA z4XM0P4w8U4DlHh3cGE+hq3-#g8uYN=eG(H&Tba56pr$Sd8w)T3)tg+O@5@&v_H5%U z|7X6pwMWO=1iavF?p!2YbRZ)s9)V74AQYa|(eb3uV}rzb0|$TR_72ZnO*jA5{Jb^o z`tU>|8TV@M&KAaXDwclTgw=9&v+Xz5Yy4IM2(lWO6R5ie8mz`kN9z**f)NQGA|D^d zK?-CCI5L@)}}0th43|NT~MGA9t#&GjMd1jcA0 zZn16iCQBWunqaqpX&8^34oNg^G9?PAe~@VgqL&}tXIf@Tgd6{I*j+X%h!}o!hcOZ_ zyF{0Xn}P_uKB7*(Fp)F?NnlcB#50IK3#n9ytAAHywi_R#DnXiF=c zi(^&OTkaDn!ctDI^LfFZb^Py0{+ulh&H|!*0rk?ME`uA()3ic(A*Kt6iD!QsFZ8l-gt<<{ke9#qw5ObbZ?b|jsGKg*>(twolD+Ij{qx&`x zQ)>=XVVT5Y1_DJ7`uLkpn^87iQTOk(3C#epdoF^&^!R%gpTK#oNiQ4Q*Rmx&DBwg| z-#b0KB1_(-UfZ~2a&GiD)A|#au!Z|W8@_iNQk@H`eGS3W?QNcq) zFOX;OT^95-7?Bi-3?&!d73nroWu?NpMj>D@{_1SV(H*t%7+lA0aXR8z8%E8=D(mmW zU35y$D6pRZD>(Yur%0;M!I*ClLB!h;NSUP0Q;fSX?eC!>p#doV#4}*JXfdaZsie2Y zjS&a75ywiLdQ!#8$X&iSxFliL!cf8 zQ7P=_(i#SxUe|w|sJ%uR>T#_cSegNflVr38TI;&F=QE^zcR3<2ts`MS8hy6Zgy2k#BObhCZI%4zEP5+I2 z`L5X26W`n#K45EUIk}xz<3Dct$nyZfj+do{$iZXsoC&+~IJaj*rC?4mOVOhqnJ@{R z@=-hxc1(^y>?MMxNSP?W=~*BWQcp3i0>iAVYGo%%BFJC1LAyRD%NK+3WoM@r*lb2o zTB2N0A)NsN2Xmwf;5Aebr{g2?nYr@9)`KF~DSYt_R&3_&Jx^vGcbmmV)=m<#gM*+c zP1?y(`C7g-kPO;lMnX|v>~E3eyT%~@?QIIXj@!i3C~6lb#5g^=Y&@s?J=8{D*h&;H zIy+T8b*pzkEkg_v8O-)VIsW;u9wBrW4ML^7BxHUi4xU+yx!(Bw4gY z%tIhQZa%y=bSY7FAVXt-u}Y45f@9OeBok2Gd~Tzqg}RRq8hf~$&wA4-wv6CzvaRl< z-R0h~wLROji#p&snYIYWmNv$caN&4O5mOY$eJde6E5mE=pqc3}^E|0}fLZTzJ( zu4`88m~hh}6Z1Vxjgi`R2zK&-9c*ui%aB@WKrKoPhG=|6NGu@YhCZ^u+=~XP zNrRo9p|YWV`y*SKY_l}o&STZP|7z`7^D7ls>emL|yq|&V652nz*mb*Ov*rJKc(F!G zDygi>1oag#;WV=C^eZ{x<&PaoWCh#PM)PPV*k9CL;2~?8q=fjLPcNpncVR!4m)TRe zZ%k?598|E?8S6Ss!p3!|v3nkqQqb@o=V2%7%hL{33 z`H3+5!0>vgbyQ`I-vg8rh%O;G_m*?b?5_G+r>PuRZcmWY;4LN?*x9`}NnYUGF>f$N zN^wGPisREt3BaJ!Wm}eW85jpb!j5PW6_=t|pE5CoTOI%kPc!Ze21xL!HWYfJ_w4* z|Bg?y5T$Gbex)sm10Q<0!PNGvLo=(YWjTxLAwt;-%vaOfgXDZ*3&GGYd0f6hbymOQ zDorg6sBtER;Wu*_cp%TogKZGgw2B+OqK)Hvw#5I(K>CJnP5bHcCAv{O(KC$kdS zdc#q@A+7Scooq^tyIJYR{&a5@TV2gDsb`(pLr%Lw=V5wNIyUXOzCzy-ec(yH?@D8B(f3-O8wQ z_KDT{?ENd$QnAK9;Ii7LRKoOFj%%$c&>@0=v3cvK0}m$RkXECh(xv#Ir85#D{>m$wG{C zyco!){k5W?KItk0xhcBVF`4-1HQ|XMO&r6Cm0 zR2m&-S0HV6*%beBv*WsT1C#O|T-JEtW7zsU& z=zAuR-O9o{tbm8_uT#{)9+vw)#z1a$Rk`S?E8V(#LQeUXxlU(6dL+=KLn04XA#VAh zw^nrBR}wkyx4LS#F!iq{pXwXkJk{omCtL4$#d7+;KL2)pk&yxNwf7Ox)1pS~PUMa? zLHbQwfnSnlohM+r=w9g%mQ ztC6dn(puM<^ZY?39Sb*+JpL#}fhn)ZxJ1m`bdlj27x|svgY5nqyaijri<1-|yO*BJ z6LG0%_*sa_?%5D8Jq<;u473vOWp?qm2X(C#mNk*unbbIKTAc0D2PA*OS%Nw?SiC zi)x5DIFyKXk^j)B>UVaLpEu>wadR8llebnq>x=?o2{W}x-zMpIBa&(k#HOcsDyyST z`1zejl>Ky55^zn@$^&fqn?QMoC95Pf8mLX=8kkSwYn+Ta_!XLAlf|i=^;F8tJS17s zrsAGA7xGy1lVNN@Hh)Yn%rl`Cs<~JEnk`P->pO&_>;DPmPF{ zY)G2o#_77VP0JNR8guT86sDHMI)%JSz+Jdw?y}0O-1QBoIF$v{+v#fFD-%BNgEccF znuvjQw=U57iMKzA4Ch@`e+NPD#S?cOvz37kOzkEb;@BrxuXsZMkn~NR40KvmT`dPx z9s1^+IU8kAPoo-hASI!k;1pO)+UmE1rUvNYdvM?;>=yyt`ae@M$)8R*zF_4dVX?UW zaKaism2-xVFxoeehG~diZ0eo6@oytGF2ae+ zU?d~5WOWQF!6xkIwAApUuF)OTszuxg93*MZy6K?b>n1F4pu8``4Q%y0IS5XoY%_-J zNKr%DKyW!b+BKE(MnR;wS!;c$E+n=3*F!_dHvth5o5h3IueCRU)e(+fBscxD%$%?D zZ@qA`zaUieefO#tnK~A6ZI9)CzeCTM8#5K|D2|@HyXW&51VN2pQkWNX1 zP5A17ZenU(To;>|0{B)KRt?#CL%r9-?t8$7$@V(koK`}Eq|E9Ph15Q{zZd(>-e=Na z@nulgt0bWChuUB6#AWk()0au~WOzm*D&_ zE9gJ>rjW!iCmCoQ4|tMBEfiE@1Fo>wL$JBvb*P?ExY-?>q*w?&6h-x#!V}fTDd=dt zEP!%P4nDl>RjUxw;&>YspHB}|7)qSiC=9=@!*i+YWmv6#^jGMXr)! zV}&6mnDf049zZ^2lS*O4a8rw!rK_9)r$qo8Em7UGdsE*8TrR5W#bBKUn24PRuoJnI zk?vok0_7`w(rOw)Mq4^aV1xK#GMq=I8G{}Gj_!9M>P$=B%;twn@4n`NQyB_UtWr6qZk1elGjlY!oT;@wWddfp4Z#Cq&y~Tah-W%~-@L$=%I@iZc^ zA{INmO{p>`A9-4{Umpg2*Zr6{%gLwoz}n^4ddx54NGMtxVtL@<)a^1r0+u#2m-PdK zo)hj5HUn(>ugltWmPwj3C3d%38T6d(?#JQM%&+aB~c^xwyFLojy654ait?-+P6zF2ePR3Rh_I{tKe~ukQM{) zFe`wr0VFK{@?Pq3VSoT(JZAXJy85TJc=t9$x(n>w;rEez^?jHw3$`G?}0%ugxOq~wtLEU{5G zt}MAr!hm|u3Ei2_wl)|qCr6^F{EeCQJ5-#`zJt#?A_T$Hl_eVb`q?3UdEzq@KB4og zUW;7uM^VE*GAyOC{r4Hqf{15c7`a9)0sJjOzDEK{>KTMeEVNOmFzLyMGU@~cGMUvw zX(2JJx0r7fpdI2~eSb(=ZV);$85Om66hUi_yF6veWPwdj%CEhg0x}XflM3)djQ8$V z`xbnd6up{(3XyMR74#N!6L`ZjUxR@*K;tI|D!^4}+K{(AYkq!Wtvxfs+X}#aSuO_h z_Y8oIH;BRJ7QT9L=eQWaK*SFnETkMC|tj zj(>Ju(SxC(EZx*9wP!Xv$ll&vu!t#p+q~1y)05-`zukdWX|ao+8eMos>A?q@(tYju z^^e~CR&tUAjTUZx1w|l1_vocJX1)yq1r*@KhP?6Sw3BAC809;`Tl|-<;xD)q#lC7x znB8)}DXWQuY9wkZ3=Y94Cnm9gYN#hB;3q?bXzwv$1`}%NrwFFS7A4~IZq#Rw-S&*y-X+Wy; zd}$Vv(Cys*%lodp(pwh=7cybQL!hIB?(qv8ZdosO*ti_EWv_9J(ewj<+g~y|xRiPR z)$gik*5CcdeKCz__0LSjVB?`;PN29nN~AF_XUh!PB2I9u>R8_pT6b(0PNNG&Tm=2I zDNq)5AOU(XfwOo^GOqM*MXO~yl9?G@Ny5BhhN^VJzVhW@?wI^dOOq(-#v}uJu{*cp zL$aT~|6*@kZKz6jj95a8!Z;Jo2ecABV`e>S9xy%13GvIezV{bmEo)q~{eL z|3Gp0PAF_%(B0NG+@$k700jiMpbf4d#EOs9;>3bMMIun=Dp660;!FLXyJPAO)}+~> zY$Ul2E@LYS6}r;8;RPj1YUU0*D4JPjei^hYobHkqpWHTYRoZPaI(+1i%&?zIx&})tfX&+-ukJ z2}QrlZzRhsjl*}i9PQxZ#(G?^P_|}dS^?sMUcS!~y)!|l_RYL}J=t+n;2HVyAE`7W zR~OCJ7RihIalMLh@Pt$h^zwd!ir~zYd-hJ_`y1CpMF?E>X1h76almglBElSsU2WV! z?y6%BN>P^a(9`<cFm6d-GZ4Q2-DHG`?pKKK{)qYc)rZ2ONO4^z^q7Tp|^u-H$e-(nZ`f| z0n~jRqU%%IK98ScX8$b1fQ9d6ndVoD51B0cQTMB-r)Bi~8$iXbP8C9oQIJ%`yK@42 zs4iV>T4KmLzG}_L z$3mI@3(}Jg&e5n*)Pg|%dy6Jn0`ZxubV3;=Ezd(k<$vE%-^X=6jI!z!POw%}*0uAA z*mZ>NS%bw_8@P8@$LAMr-F{4v1oeFNK}BiFoyod2)Y1=G>->xU-EW`l1^AAI&T0gE z((n(iXH1uJTJWOQ=MSUj4Ea_|;e{=4iD8dGzrd{(3N*+PvL1n2pL3qWrOqFz>l5+Cn^-d$I|O0Ut46>A>=b?kE@cXXe0tlvjDaD9A8$0a)Mv-zAo?+{Nz zGS?8=H36ujExRI<;LwqrMcXS##zR*fihp1s(_~?X7$!?1K%4o^#KL{pyhk%sO-l@j zE>9h}G3eGVRK}HOvsprSd3S4j9EgH3_C3Kes)z0iVTf4V??_CTw1Q789L zhE3hx*Us!LyM~DKH@CT&&^p~!9ke_O4I84F*;2I*&sutT`I(ja(vSVHd;(wVU+qz? zKYjto`H_Fry3+#^_{a$Ng7+2E28H;x%6WRR3KCbE| z&eL70pj&~YlEgtelSu5@L$0>JzNbU-Tw4kzLY7Qe6G7Ql8*3uMVChXhTn zf9V>Mpc_&Hk`YZZ<=7|u5Yy=!l%~}$lpVe&8mT$=+jlFOvw#(aI}IlrYEFsW0|21& z$IZ-NJ!Lw$r=6AA5;zEZsz*|RpVeuv*^e4SB_3MbAQEg$T4g1n^MsChjJ!55g|w_j zMQzcV7BsuowpBje)O$2w@+OYbDyKk-AH-x!OX%K2Cxg5XB@PU||hUlsDz>PY6 zlGgd7gZy@meG#hvuKO6#zQ%>;0EirDz6Y~qe(OCg$7VpqsY$1AKX;_kg4i$d! zPgba>zz_zSUXw}3a%!COc0$CA|9GoJ&z2f9`X{KXg?fZaf(2t{-e=O*Z`^tUuE9t& znT&Epg-iurOwqH!6HS>;V;Cl@g3Y9R=`7>`xx(HbtD5O&`=11XR1(_;y@Vz|GhWY_ zdNHpr8Sy)8pBB?DjK@eGnf_sNVi*sBzG4-%L=8py93-P6(2J9RzG%cfC0fJxpQ{;W zVxCNCJ)kVM{iPdi=Z)>o_R`rJMjph>VqNiPI@~0jf7;gEyOO;_!@Vxf+4FC1?DhbR zRnNyB4QR>M5w>I-{El%v*g%^=^n_=~bnNwOGG0KlPg5i--eZvW`P|5c^{5<}ssEqK zLF|7i2LdavnqLX{Z-+Hkp1Ja*D~rVEZ_Mxb5Lq4v3KwDwkPd& z8?dzMZ%oZzb%!4hg(*h!ow|*Oj{3j4wHirsV-n`Nl0`7IaWIM~3|KwKv8L#BA?cMF z(l!q#i{Wik{@*GAl6PzB!rxUrW{u+*Hr7(wmjyWJ^r`*^wGevgkFr4X|0vFO@^aOS zZC|g}@A)D)w9={n{=lwCTe`(J9UIhEP>m)4zhTv5dInnqKueTlqMScE-f^NKXr~(w!tT%T{af{vjg5B_);gWGRZ@vFp~*ygS7wj zxJ}qHM#(@ICAC-hedRSUPHS*H8ACUsn=+^W*-XLWDt>gXF}kQHIlX zHZg^fT1pF_^+__PfG5B99&nOFj&%~buwXuD_pft#5z|;G0<7q+Q2(5RjviMso0m_E zlmkf+zDG0z#`74@P-aH3J#{%6#c$xO==EQpYB#BxeRk6ric=-yHcdm(0}a<2jbotu z{!W_^*q&81ix+6bF!n4<9s`e6?r^D_W7%yobk9k}a~r38L=%`3-=gS<1D@s-JQJyI z+K0%asYKAb9s*YJl~o;3TO!K2X{Igdu`H=f&-wMLo{<}h&yomg`*TPj?!y?0RTfI5 z*_7e;Jx2%~)*zQ7L+mB*xP}a~!)>j=GhR=y16;cF0jQq# zFH}^$>tD`|1m&w&)Dq#iHKwdyC0g zds<^=Sth;b0ku4lB^d^KKFfpoz|-CWE`tk1kSl=0NjfCIOXT*F$-qM#k`h``M!?NN zNhPAfb_MX^fD9eX0BlSV>Gwn-f1WQ(^=I4IZx?E|eVeZ#|5keyAIoZT<=^Z(dE|Fz zh#wcoT#_5#OfJ>@wvf~Ib44?G{sEc!raFD?rxF4n83~OdgE}uRz5#Eq{fo#)laK0U z*5Kp{M(x=mia9G{kN%6mIIwtQ-5drEPVLBpM{}ox^-!auA9}hc4-?mKQ=r^t@-iY| zvpt@Q9~iQy1jLVvP*~0e^znLJEI<8qIWsN1d1WCBrz-}3bXVa?*GP(lt!>YdV{_;B zwkM{&3vkN#iy-V>md_t}zicZ1htGbQWD!Ono5Hir@WkHnvoxO|y0&^ZM&O)++rtsA z7TH)Exh=NYripa}D^M)+_#7}kh)8_>a^?13eXUh+qauB}5D+2mH4AgLrFvmZLi;q4 zu}cCZkw~CNvEol?@gak}^)l{fp(!jAC(HLqEVsu-v3LcAA=hbk6nt<|D_#e&T38y`3c8I?T zyPHOe%xgU#gTZ`VaBEfZ^y527@hCQ!@`ZYTRaElNl3OyRH+VBu?eu56rJV``l+p@8 z$b4Z+sND^$Ib$9dzdW2sTz;EbNC5WuaTSW8`qSXVt!sY84Hxh{G$Y1n0Gd$tHc%oD zS&cMIs(wSKz-$zxNv)UWXjwc1urR#=mUydKAQTQ>ePJUjJA5Vn@zU*m{_Z_5gJ5`t zS}`g)jOA&M@npgm0@!$n$`6a*&Xl31oFrU$0|!M7t3EBs`Yp+szISM#i*Aq9CJN?L z8e-~@ieY02o|JZE<3X96z%Ox;=%Tbtx0310TINYJ+sl7C5Pf};%8om^BhuJL3u0cr zB_4AYlrEieEGoH3eq&IwU8-oR{mnvjpN|O;Y8MM=ZI769UEfI0G9E2o$S9dUlKNp{ zCo3D*%hX7P^HE-SR3!m3_A2)^eu|bmIUZ2aR_4?%?lXuk6a!x9{GTrpp{NQG$QR>& zc?HpNy1J5)o%MlfQ$^e!X8GyN798z~vGnTJU(=-!!>Mj^@7i!jXL3<|2(lC0!ER=1;Z=FlwCkGo-rat#A!7?wehYd+fwBBru3fHP@M`B36h8K71HL?cKXW^b z|7FVWAkYku3f2vM9TkNX|Kr(~DtjWm%WVygjMFs3Q{l8)gF@UBOmpFW)&qiPKFMb3wRJ;n11XhRSbmbsah}GM#IzW~~71)!0U{>A>?dX1eLzw%V~t#q&w6B5dJIahx13x3oMi zjEA;Y^e@cE8T)_3{C#W5U1g@aIc25ooz=MqKC32|mqMDuwl|G4Kr0aGS^Qr#pU2LF zc2Dfrze@`lcIA5v5#?f{&vnyhyn9Efw{Xf1ERP*}E(X>)K$ajpxZtlY;^k{x{uXfg zCgw6RBW5$8+O6QKoL`aAe$w%rcM5|2EL6(e-Jd(z48#@xN-y4_+gFzK%~EXbw&QmW`2z9NIF z&Hsn->CTlpVsZHJ&@MTjK8EnW|FdVSEL-6f%l`fD#GPr#yxK(b*lK>`CONXL5x=U`s5>>eVXP94F@l-fO zMg)(ON|sBEZ;NbM#k-E6SQ*O*9xDGXfr7sv>Bdobaa8$>3!?qL>E7J6SIwIG^A+oJ z0!(e`G8;GzYE50os)jK-2;lXoy$wLyo%Ip}iX&5g<(xm%gDcJQ7(0|PmVl#7aD*=M zac*K|LD2%qe>9K^MFi?iHyP2>|>S=cCIZLAyC9vN;zc0C$x{0SAjtlI(ep}O!&iHfxP&AYJ(lq?}%Y%KX{58k-uOYUM zMz&ZT6BZ??SrkDa5yPcX5vIS*fil6~ zEkN={pv43InhnQS^0Jsq;1qkazj@i!_+lX`MKZY>pBJ*?;UE8Ne`Pj*Cz zq6HV?(_?JdI^3HhtCSnOc278Ro2RN$15DuztsK@It&Xwb$N*DJ=YQALL5{lwh36$! z8DEbGT|;`_Q7X+S;(`8>Hq0p`N1m9~rS0l4de1i8FV2Hk0Nm7ipZB9}n9GYs@m(w}hGyme~{-nXW4G@P8vK60j^Wh0z#~ zBp?C}%2j+9^l}H@8re~Y%u!H038($KY|d3jLH09oi|Ys3EiLPdgj(iyse5I^OYB3C zCGT5TQM`e3d&XC!S@mB~v$LY1d}}QvZ)vSfgf9W0u4EaZ;wcROQT$5bRW=$35Cn9i z!f!Ys!eRQ3QNYeBZBFalWBmDBzEx`mR-eHh1JBiz%COkU;%SXTCasC@ znf^d0_Rbw58r6W>-c>@S{mmUs70UFpky`IpZj-9g2kQB^zCmVBL|qwAeAa-~bMwC8 zo08NO+KNURF-#-XBwLlF9dZ2={hBi}YgQLPdLis-+-#-}S?Mj)BT^O{s?q)%uXl$x z^FOeM9Be$})G{A>9L_+8JLOq}Ep;pa5M-Dh5b;DFEEHhF&Ph^`2nG$ikkvr}V?Czc zb5aal>K~~*bOc`o*4}tL#qa9_ddNMD6ppg<+nUPa#1eN`rIVc$Vhu;!iI>g;#jj^= zt2+?rLq{F@)Q?BTenbmGvKX5(HI_KjZeb4|eR;z~0Q5{?XvGft13JG-t(yOuA$&r& z%%~xKrZM)AnCR^NaIrnkE0ca==R4ar4AAQy6RlxW{y}y;4;nUvi$CvD8{Ja;7K# z*4Ng`r}-C)FV(+Zq_^}C>>mW?CEJG5sUNpxJ!choKf=E*c+X`*WT_dWt& zCh~z820ZMnEsw&w6?Cbyhu0n;HK+4_uP^f$v=#}N!H1_S)oV)r#fvcNMLHvME`mfsjY_2k|j|VednnVOCQ3G1v|AL$!T1J~p{WTl*nRXn2 zA#%_FDc~C8=0`FTKA=&g=*9M3-Tx+k9^1EecYe|SH&V*wO;SbT*iwa3iY!HtZ+wkx z$UZue4mUQZ{bAh715D;4_m9I7O{rW6Fy{r({ybzyJckJb|MIvjvVSHJ1zHW&wOa?KS?_Av zQ?;b!&;b{x+9x4Gm~87lg}Y!3ijf|E?9f&-0yq1KbWscXFk??9*bQLVC=iav`H|l; z=$~FUG(Wk+#+t%2*micZRgpAt5M=vjrVxhkko_Nx>cRdx_CLUZye=YK&|R>UW}1TL z^A<%-g$g7s;IadH_RG}mR3alq@j{x#tPDihs@sLw(c8D^;u z$v=Zc!_M@Xd9;OYk!E#HJG#0^=Cl2tF6S~N@$k3{-xyiVO;GqVrhTWBu-c~AlnFzWx!6lL&*kan3&ia~W6KN`o%{X;JT)fKeTCmS$8 zlZW#Q`rzw4&~t7yrytl>6?eLW5&{I(?Jmrr{Kk$AxacTzViXo3Eqhz*!4u<1>HGKp zJTQnLd+ZSsgv#b8mrKdaGBePYL3cw`BND8I1ru$z*O3VZcY^w{LFz6Xf~cbk=+dvSot)-r~W+@Eug0^b>r>{ z6V+R0E|y>U%zCg&a?CGCSet%?F-J%zI7F9ZTR~v_#R5;=g90RwcJc;}R)T8`3q@p- zBEiG)?+1T^N?<@SpeM&j^2&4J&}L5rYnQ~k76|GAPk|pl4*qxxjtY7G=5(@*Y|f(i zCZ^EH_4ebi=__ppG5}$L5EURfq)!C2hXd*tDT*qR%1pGutjuBNb|iYTvdtxeRu-&g zu)3FroKJVKNE%uc)^3cuY^Rt137v64&ha*MrY(zqrW(;fo5WUt2MU-4>RlN9zpz%- z&i{e6P*%x^yXe^@DAJPr*Z0!Bj2>VmPYUN;C!|vYY`b5Ov>)H*!g|dUrvT!5plDX8-F#_B_NCnDjud*$HVrF0l>E{Yw`cMBJE_1rZX~ z9DAOBCJBUR4GeNIF!s+he3l0=oJzHD{D%((jmmtpP>qxV+$ULPGo$nD+w@H`J*|zH15uSVrEL z6?kQul+J~&zn5m|296G$ps1y;GDQwV`#)pvl??QEj>5mo8ri`gn~@@IK0(F3e;|Ma zr?QYxAQ5itk&qSwv$XjqCGXMEhQ480G~M$-FE&nQ12RjQ%sB=2EaS~JLDm!Be`Rw!UsZO;ixM4%|4OP3Bo^Tr^RidHG?<&A&& zh^v5+vWZs>=R*f8&COeJ_?b6vfqy9(@XQk7`{#qpHn?<)_0$D{S@ep0hN&RJC$B!? z=%tg8LPWUXKPQ5tWpP=&g}C9x{H3LP--+%1{0CBWG)DErhwLTsE-f#IX+ZZD&})%J$)n{-X;Ta*1XflWPhB}=lA_al0KH2* zBP%x&{3jddUU@m8a%^^RT0~*Tcc+M=l0t=IBDr^*laAmVwxg6;&|bLU7=+=qRI=$_az@Mw>feM+ja zCR8KUayoff2y(}N(4T=swN-Ql{!NMcW~4lzXtmEQKnv~?!9oS=$p2^P{QO5yL=y6# z7%Ev6dJ)M=9c-*iN)eb zOEvNx`0e*_fiu53_$hOTr0-(w4!43lgkXoHrk$MkoAzm))6!`ED;UsTd4QOc#&?igNcwF765qlezkF5IBo-ud6u^SM31*rtmL z?7D+0SdTCPJNO#=dXWb59R+SeV>?qoN}8;oVtJa*Di+GWir~#S%;<^D=`IWHBY*JV zzr4TFx9XQj!N$k=vH~u{CK1Hp2AQ+_6I4_NRb1wj|qu~>Owbk@#nmf zfzZyQ=3n+8*tvC~i}E!%H#zCL!(MT`BXoAae({lGlIseB(_gCzx@YyW*TZozXv6|-nt*uZ!=YnS!G|+Bs9_^=z7sA<*}5*?%QvY(CKNn# zJnM76k)TzMvP#PIgt;=such(^V;k1)E}|d;-tgk$UR|eE8i=DmtbQB%wf2l)Ls~$l z^03nhCGJ&Fby>)~QGjYNSm=LI^^M_mL|xk__6Zvsjcv2BZL6`HhK+4BX5*xBlQgy( z+ji2}`liqG>HT?Tu5-=owb#Cv?zN_r0tq=!$8~jF*aCULycXv$A3>KbFFh0JLei(E zIIn0f-P!b5t)ZSB&h)elIO$!-xhH?@x6E4cC+_lxanLtoK->4&!8ac4+`eo_7ijh% z`K?(M%)=VEi<4P<-|wsKeem5fWNX>JwdO|^_6JdLtv2FT4as-I4y^OeDiMu(=_2Xe zF*!aKw;OTKS0M(SI>H=GsQ6hAc?Egn1kzr$?#+Jj8-Z{9A^Jec+2ei!#KnsNj^jaMq@N3THd8t4J zlGSPF3cjL~k7@wL2nt$Xj7{gE*-+4lnG9b6$K0#B9k+m>Hsiu zPMWbcZ>fvn(cj={p{Eup@#Qz_C&u~y?>o*9Ji|1nyQ*(lPf8EjT)MJ9`(NFofYp@ASAdAW&MArw?!61Oey z2Au^5U!xNq9Sy*cYl+1(y-nG_j((VfTZqVDJHDTSY0#!)8dQlN<+6T-7K1zDTZ9q-#s^Y z3t*QEz3hK~uGx8iWPAHO!QXtlC8+IukQ5#(bNJkAe>lLb?A=ShI4ukY@ig4vYR0w& z>c)TC9Dm2|3IY-P+M|_&|?8HPwOaeg6V> zzqKFwvF&+Y6?aiqA#FS#DTfnukeN4v7^+ATMn{j!Unr(g?|E`-q?-Ec2a7RjZ?7c; z$lGW&3}{6e2qY`PE?qb%WIc#Z9h02bWE#TzQCxEPcsQrEK3b7w+v$dsC%yP=`cv=l zxBG(WdFOf2dux>`PTiTWGf9LujSJ98tPs0$3MfDMn8HVjOcNbpUZz6(T9Uc~a=fS> zdLGP@o~^w8E8!g`Q!r~Xz^7s~zJn3#JRtNNf{YKr>;3Ipy_Hd>$WW2pN0i$Met%nb zbarclVt(nAnI$I2UGU4C-4M8#h3DhrV@V&{%#iE&_P5pu)Jbiy?!RO6GLwTWR>IbN zcHcReK)-+$Eqdt$kI3p|hjz=z$n(Vp7m$vz0G;9UYZ&O;gr6S_tT29G3#QI;fA0H( zoZR>HMH+z)8;nsCj~2Ez7^wf`U{Z$VXBgA7K3q<Y3T_3gUDb0xsVb$g2)kNv7c6Y2OjYHzB^1hH8R z4CG?Et_{umlPL&Tjl2(nUfJvLDaN8)1Rwx*_9am-h)FY3;I_uS&^>@gGxmTQQiCx_X~be%bx}mPe^i~sM_X& zIUkvYn+Xz>w*V-DDc=qVyCprW5Hk?`IzNaZ^IHVem0rk7sm5AEjBPBS?S7#|-Pql3DByPvqMH+9@;k6ZmY%Maso?XWU7Mhgmp z(r$7fGW0s4dh+Vp+~D@erdVj_6w8U162WsGzdZm;+^jjjaQS$1&z8K`8Y5>x z)3hPdGKyY2qQO70WJ_NdWO4f^{oy{kg-P*z1R+-ka9kX+cvwpKk)#wGd4`!;V#>`%NpAR%2rogAVf* zR(-}^I{fUV;B?^s_@+NM_)A$?!Od6cg>`pB2;3;g?O2^5$pM!PX#QOc2oN20Fy}&w zedKo|1Vre0RP-G_R+!|Arfdv5D$6{EEx!L|;}^qU=0#5zo3wc%nSC8buYTC0>9s+8 z=wq9QEB+U57E+?uy;L{l}<`y53=HrCuJ#C_XAh z>0`lGE5Yns8oOKxNKT-beWstf7d`_j^7jj5nAF5^sIi3oIPWttxPtuA`vd*bKaw8S zNbd3*^AXO@a{Iyt*Tw0GM{cdsSe$tMRQ}(jigqU(w9@EZ4a{fCFPRUDNzG~d^9Sm;4Ho^bz)R=5-XkE?!xe(;^&d1$(YpM-ol4BRR6S580V`wocyFG zZGShWfIa&$U|P%$+HR$G4MP?Say_0k9L|eBs-4)qun~VQ{zg03ol_Q2) zuL{Es;+W(TzkH-WNKdXUlVvVEu-;CQMFes_T=1xX;1kx<$Fl0ODbNBGV zKZEcuER285%Y|1*?}o$aW`81X{yoR54@nJGBnaUkkUg59t*)mr?Ri6#mX+kU`atlz zmW{-g!;20W`(WCT9LZlfyx-ujvT_%$eN(^f5b1v1$h8gZb5MNd&JD(4`H%<_~ z-w{0N5Iy^#AxiQQ6L0nM@#K&^pZk?&d+URAohnNx^Bm@ye=fzShUy<(4~)BF8a9E* zzz_67A-!Q6)ZT*mh!KByI$RCf_v#n?f6Sh_4l{-n`yb5 z=1Y=742PdP-Om+W?1b@SpeztAFD&OOm^P^^VXGcK7>7Vr#4bs`W-KD2p;7wdEvrD})_YRC_l#_tH%h9O4U5#1%`w{;`PyM_6YBb|ccr5SYq{j=`(B4wP=H8rJUp2d}0Y$jVuFKK?mO%f@ z3@409^JVJ09k1#!KYY{t>Tiq^4g!fEdzhv73*-<93!O#5Ga~kqOs+mC+f9 z-az93UDIj9pdk@}P4Wv2NoxklB8^2G)@VIQ9~6Z)K!SoFVH$~Dnl zB+Lat;(eJ)r2(Ikw|!m-XC%58pL5AIdoRRwSKX)J>v}v@ju+KcDg} zto!XmzQ3AP#_V|Tr%b1(U|BAA&T-~ZZL}q z=5^2Rr>g0ef7n#%+Lwiu-)dGw=rV6y3VaYe@NBw!#%G@EMW4j}@c9!=;xG{gB^hP< zA9Dw9fB)0=`O0>y^K`+M8*9{)ub$Fu-sdk@KO6m?+pF#^6k-Z=<_@1ssllOCLtJ?- zl2je66v%%rASXMZZ_s(LgG6SzX!!!6h{9BKX?l)^OCo5=-Aifm(dos{FKitgWXND# zh?ahw!p=Er7FeijJgRZo8W^LdNhCz({bxPJvUQ`s9c~tSEuKIAY{g^IJJ>1E^1-vQvNbV)wRRC`E`P3 zI1R(mO8rcE2}yqjnrt#84aU~ywv+2AIurC zahfpBjo%>8z59oXcn%f9byJ4O^G}1b>^0BzTJgQSWTQ+Mgf(@Pjns(47P8cEz$iro zyod|sx?wn5sQ%uvqBdUEGe|S>nA3MkyYy9S8Kcnji0)8^l$eUOi>ULK z!kEb7Bw1_V3T?1>137z-i7!T_QRs`n9`Uw`QaZBPIseMlgmn#iaKa=_k9hmxF<)g% zaRohRgAKN`anzj9+iY*>Lj1u|ZvMOA)AMbJ(-L8Pettr7;kKD>Qk}$JDf2dzqQrAP znR=?c#?M+798266_UlV_&=|$wW^Q`i#``1bat}%V6TwI*GyN1c#Q3{0^aIJ`;n`4c zkrQN!4VERedejg$RD$^JaEZxS^lI`;PTku*z}5BgpsDLT$lhIEygQsr-OHP__X#G} zE20DMSd4{|{^9Z}uG#MJ&EDi8@XUcS7S~xKlqmc*W*IaF3va`JGo#4=!N6cG-hvb# zMzbm-CCu#L@a4iyTb#UsgxQ7G_p?R_c2p0)wTzznJv9D;cl!YH241fj|X$YGbpoB$f3v#3dTB*w`IX_((*z9t0%g z`lZRKso45)T?o+Op*5Uw(3qvT-kN=iX{I}r>F@9(BWf}o(+a^Jr_vt=;wuC$rp0 z$~`*gZk58+VSUIE>dp62av_EHNPSqWjwqHmktvNM8qL^+=?~4(;^gN<6^j&)q^iq^ za>MQTy3Vc2(snsw`)~jFR`f?w|Fqo!?lXQ+e8>oh0nMB$$NSfUkmpmF+n5Nl2dCok4GiR zWiu2nuS1saovagKTx=}ZDGLP#1`!h*YnL1i-uU$i32RW*mj3E0(R^|qTg1qSnT}q@ zG7Y&abbcPxW{5*a?^{}am0v{lZLReSErXs8g6c>`BWE6iPc@QNu5WCC35;&HGZ#nM&S53ILrU71%%b33QsG;;(bs2$-;u_)T5Ou@#47x#Cf7x(@MH%0OAQJrv5QR znr9>Zh~QhB}@{hgx3I3kLd$aHEU zq@lYqyWG}oyI=QyxajTdI;aR-IDs6b5}Z&hA@XSbcEA3N`rzZoLpTh@6ClEFW3%6L zexKjMoA=nV#?*CiJu^WF=HDOBmJ@~pUDHZF#2jI6qK%+@E6Z=f^gPx zrl<@{fMXPJzzdwRU%x<}hL0UpjNgurc}vU6G`X#=4hRPgCuSywI)O_!ExT|3?)=OV z_lFyFrj^)pf9%NIC6eo>Ftw!j&MX*I}Oy!B_MN9FQXbN=CM6X70m zWR`$VwZ3sF#UuEYBkbF*OwA+4QwGMat}kQg<$5(q`mt8>ccmEtsoV+H_2+t>q+R^= zoWeBRS~BT~X4N#wR~+KM^#VBWXt<#APaN%&!I+BoYJro{9JtUP=+xv=vq&E_2L4{z zj33Ie5=VF@57^9l!Rt-#Vm5SZh1H+SX?AxZ{KQv%E&|px$Z(`K^v<2HLVqm z!G#CIGEVdhL&CmVdx`4A8$qioF=d);f=GELqpW$tfAvzRr#Le$!^h%~$*~nAu-rAe z(a2j|NM$Z>gD?;xFvMg{qdv2#M&XOy*!IL*LU$*2dk$!`)R-qa@VG|J5+jcsA}nt) z(uh(nerGr>M?$4jL5};VH)S1^Nu?ii>t~PEU-&gvh@QD?$o za@G8k5$ah=Qb#H3=3SaZqXwx_jKa14JmV`F9_p^EIR6TG2sdZcpMQSGkSVd)JKaw1 zX|{B|jQbYAqvqQkHx(sdx8V!=M(+CS!JZF@-#w8c6{uyM_Ir-TWq_##1|(fWvaLla3i`8(STVdUki;~gQpn91n&Nn_gOs&Fyq=bg(>t^}qD=zZiAxF}#! zuR{unUeREn!wm~xlwsEKE7O|_OS}+?91^TEAhgxr?A3l8C-xs^on1c&GIe8&%GNqw3@x#Rz zRqk(-!1QuYJj2dcK7X9AGz#N9nKuvVhAk9_8XUZI_8}yxR1#ai4j&#Qq+CQpAP!)l z>T-t6dZZE&2p+h>}u z#o>`tv|!;uPof+OTZeNQN!dkNFU#pjLb3O2N7%gA>OOKK!$u0+;TfGmDeO;W@-opx zq1Ut8(`JdkIKH@G0TpR~HZl^17M1XSSCLOI$kM3^LlqmjCgWH|o%*XTo9ap)A6^D0 zzgyi%_z^!Sh4bsS!Lp*&^WV-Ohv=zI&}pNV7~cgXsTV0rX8*B%^k*ZM%sPiwycQM8p4W?U{Q^kLIkRRAZ#~&XRP{fbL<0Yq1Uo)M_S+x_Oif6y=NHkx&q9NTCxL#wu7us3WQ=0Lt&vn$i$A(Cqj|!#u^WADUG|impFbc!@y#cW9pQiV zLOyMNKM#TsInQjGu8z`rCj?!*p)4qc6COI;?^YP9cZZBD!NiLh1-gz)BZ^skl!4U+ z-)1u5w@Zp9mTH$2sTjb&k|HT~#@~e4$Or}Lyanqtm=&;Sr$FgBX}Eb#x^o1`x)c4l z@qfV|F=1oT)=6S^^ydm;(bV@~yIb>a%^1Ul;UVU1S`9HZBKu|F?yl*YaMn?plM>c8 zQ!OQT?T7X7;oxl(4h1wgW0i>Uh8eMyl08NntkU*Ge6!x9LlL%}*_3A^%Il%;Tx5Yf zd^j-WJItn&08xY>Ek;X9H!R{=1K0a%5FQ#-N`u8#9%=3jc=6DXjBczozi9P3#!vk) zd?zbvC4mw;7fUNCHAavIFU|U4jYmEUMbTULf;>1WkgPWY`rG zazi~U_|DBCC^cO0u+OLt?&o%d0G)bnuH4wt<0krRB2H@t|7O?t-$BKSZT~ufvEHmR=jFk8}3IMhUs=W zbN(<(?GQY_jr{um;R5i)O1Zf~a}nI5QiUOOcU8*#Zh<&`EFpm^92Wc1{tD;37Sgmi zweWWiBgDoJ4aID%m|gjlUSdq?Z`Z+>4Lf@#N^aK*U&K>JHF~@Ur9q#g0BMuzjyyAd%N1 zIS3HD<#&32qiesmhd%5lUXZ@et!2pU+g*B~_m&UVJ|7y9OpY&I#!teIn5BL#YjU3{o8IX+ z{sjJ(s4GW@+~SI~HO?4(c(Hj=%D;zu`JY9LHho;GJ=+law{4RzcKsIAJ9}pnrodj( z=u|eJn#Y)_?I<^~;qW1Q1sW?v^&=hZY*%m>zD*a=XwiSsdOXx~;%l+^9H`%T~gYPXrtQ$+zktO+xhMnuUXB$7X;4~W-z zZ~mbTp27%U)vjEoNpt#aVI`GKAw}EVdNNPotaFM`#o8{{&&twv98~t z9-%$vLy#euQm{2YpKMQPid~_spGGd!V{<_V>;=fzY%GHl@X5(W*}#NDvVCjseev{5 z@bJh64z%jGR)iR^`p5xNR@*5-6$qnyCscnt$OGhHEi525TwL^3xLlpR9}$*33|L@Z z{t+*rubdXwT8zpZnPc2plEZ=eGyFa*d&>aym?r~tI*LIr7JNbx+X*xvO6CdE;*F=| zAp;YCTiXjELf;d3Iixu)SgC7)7|L+7_UNwNsLzxqQEa&KUVKInwO9sWMu@&^auT+w zl@YtS87-J%i0k|?y+QnGtHE*|B4KipVqBVinSp1P=y zQBNW*Mt-yk?zXJYzwh?ukjO*zKZa`weIQ$`-3f5i`+Jc8(QO+D3Nw@Q8EpqjKkqH|NS))x!>x?gWt9Omq=OI&_MWncQ&}*p4)p~T@Vr~ot^83i@ZR|Zn*x&kn^-KcroC(Q6dEY z>IrNuryo4%5QUP+w|2;Bxy6_j`L7qDi=8@xMfo!%$Z+Eq+=(W`{CNKF%ZM^j>EPGO zEh~aD88P@kAIV0f`u5>yEe|fUQOCDvL1u%1&|-s7e*k@4@r9v54L-{bI$%gpvkPKb zlDS(mYT#PF`WIr2Y-nSbCDx+kZZ_Ya^L{{a*}d7fp+@$4ze%@q8QJI;FG z2b)=n8T~_6tg0uxr>2d#2Wzx{2NR_H4u#ib^o16iIV(=k{}~y_s69Oq!Zs4^iZla( zEDSi=YMn5%LxJgphMr-AR23fil=oQWjI-74gv@Q%=d>=QiesrtD^u-s0Z)zJ3;n80 ze`zO(%Q7ps_KL>kxY#(SL(fXYOF(aJiH?zz-8C(Jq-Cz|D)@wC+=LYR^-VHL_nd}6 zi4neC%NH=|2|+Z=5R@k#9z+UxKEII=WF)OiQ9ViyY?x}4QfFPwZPx(SN$i7yR1ys#Fl$X$O- zN(S~H)HS;&JY{EhHBY_V6TP(8{Q6t&avM_*E78-B`k2`u@`*opo`+Ru%=EJ7@!!o_ z=e06V-xcBp5@JySe6EzNQEm`kkykRyQZIsR3_8BH8KB(!XP1WF%!vGdnj| zSX6|!x3_2g`Evjb;>~Gj3Y{utLuwhBV{rkuBwWHr3@F-fqa!9~%Z=97))Hz-zjV3y zrRRxCFr-Hch9HAX@S9n4gf>~T$1s`6n1=WQ-T5&#n*yC}^g9+>^ z$wsQ@9JaxH3WsAAhmSZErm#eqqO@^nkxMF~5gTN7OIw9F01s6MsZOemq2pD+kzD!qm?AHjlu$_ub>z7~nsg2tDzNV9L)lMY>!O{+O73O~iqs&Rcf7dFPF?bRJ2j zZITbtRvh-$^{n=#^*_gT(?x!5DjFCF9-k0gWNxf}OHBo>I#}&*N|MJe=hB&s3kqxf ziR|z6k;fc1&Q7-F$`0W6dlq8SeKUxO3$#WH7BKXAqe5}6Tym3CMVcB5nd&fpMFS)u zjSw)0uU#g^m!Z2 z9=A|aeq01ilcnY@*ll8RwD%N*O|WPDUb|&TabQ`O?wUOiwxz{fRaqGu|R@BT^Q=5(wr!5*VWYYu$n3X9b5d|HkgX5-gd)cudf(MW{d z(?dz4Spd&eNhV+p96q0SFM8-o1K$FucnXHZ{Uprqt)5_)^UY}Qu{C(rdT%e3dAA0L%>G;UXOC}2$+ z4shR(_~{d#1?r>twkg3di^|&s2}CG&P4_+7{J#3Q85tQIKe}vGEMwwh#L{;Se?2v+ zP?mHUR%FjEETr=!B<+U+wFNyrdVMB-&zuSQo8t^D81&j^E-&Y)tMhHZ%T*oQ+?M0U zwZQ^{nak~K=B?jIj`>zRH$TMw;JoVNo*^Y3a@6ejeZzF_d0Ihnr3&{Ce0@7wIGAxI z%&?t=tcaQw%SN_h4G&e7qZo(Z1Zpys7H+8Ag^8il!zO8M`SmXp)Q_>Ew0wnaE#-Q5FJJ&};V98H1mfxf<;#*3p~~C-466 z365(q+mq($*`;v}IUELLRaSZlTCHRIyv}fh@o0(y2W+7e?TPm7a|Oo~e4#n3;Bf5T zp^udnb+P=goZdjZkW|yhjn_BHKdom%SkH)@WXg&3-C!}?zCYUaN61;7Pl3rBa|DOI z9p8o6a*;lWch`~FUXd@>P}^#@b=af+>?qL3+*g0o>d7Kl$S!AP)!u-W8S%PPdRF0j z<*nq&pH>E+`yR0Uc{!?9Zp_R2s1A|Wf^kY3Ecz$mKAM|00@z1w zF-dZPWV@^GWs^%Mo3EV3qNvXvX5LEiWHM|+k1_HVqkp(SnH?2cN@MFkEp1LE%#0N> z++6bVsk)5W@&t>8VUZ<2qRJK6(f6dLmSbTC$E2mD@ zB%X>>#Oi0?tTCTn;EySk5%zOzHA&IqC^k+c&ZkH*YMaXlhb}KHI-jk2^&|eF*{(>3 z|5I+tWU1fk>!cvwUY<3^CAyb+ayd`*!df(GC9+Pcg1F&u|56&)0a=ojLFXhJF9$V# zP!U-_T3jeP3aYpp9f|?(dIH88E-EZVQW#puyEfdv1mpG;%lH-6W`>%7d|#Jm{RxD= zYbYxD%pW|f@j3m%qn3i7VFUKwjOn?W2V$Kcm;Oit8(VC>0Khee&|M8iVw)S3Lifjf z#TeKre>5DU-w^-s9B_Y-l&S@hh~qHx^GOwrQYdqJX1Gl*g2FBqM@eirV7G0J>lt(k ztUdioGTv*{TwT;jFpB*Bul-1g2WU%jVu6ACVltOl7X@_w*@TP#`=P?W9?A7v_bfnN z_6rlmw2PFp!?Az!4VurMmj3wwSQ~9H)mg28sswK1PNx)NW;N)*IU5fYn!tN}cd48$ zr45g;@$Nw=DK$4~z*XIOw(Nke|1)eyfszzKmWhr62Z1h9Ns@>KCvmO?+iPA4R}gWi z6p%3n6BRHPJ)8Mqr4|LJx&zQt%J+ZE2b3BzCO0r9IsPR)M&UieYTO9n%TFAVwtAGP zacRwBztcTbT0FD^^WJOzvageVp3t}7*`}a0f;>%6Z1G);v(vnig0jwe_^<}{H(v2j z9r-XXA-_caTW!0}CFF?nj+cE}k~LzSeFr>2=fvl%WV;{1yHY+Uap&8&?gu}H$RfI$ zh-)WuL+qO|T^x8x1+xnVul(> z2cyUe358UBFap<#ET^5(1Qn$dL`9TGA=uhU1|tE>PD3Vn_NvJm?JoF(yA^AuzNjd@ z*rH@i__As+Qg7aRx?JW45;RAQPvVUWY_+5B}TiWr(SdH;?GUPNiZj)z$n`3B7+*#d#@Z$S>%+BI2)o zX0gfk8jB>5U!-xmK8VRmBxiV@uZi1hcoZh?;?2|lz1A>!d%yeXp~66mw)1EPmK5dELofrp3ffozTJXR*2-ng8vMYq(`xduVcBBLcICh7H1>=*+ zPkO2>nSqsiqexf3t2QpSX~D|J94aJ?N8@2Ljtt6g6-+z`FuY8EvJ=99F$vvFn?WLI zCyMeOenuXHPyhEJtFOx6Gv4EGdS~;qih)<&3VX@%>-L5Uyw^4lo=8F=T~$lyb;sI;cmlY9qqA6IP#@fRr%j znVO8Ee_|>0NggGBUzDRz2^riSe*3WK_!mMXsf*5aPt*zj6T9fxXmYFwv2o{Ow7&QD zYrUZ{4Y9{lE5(FfGvRh<)k7LS?^sjGDJ(m$3r4K{qlNn_Z4!)1>U9+Eaig!Q6(^y^sSe)L}ryt z+0yp-4k>Ug9Vx}IG!biJVZ=Z3#s`-lTEma868`2D7nef&ZoaFSo`SK2iv&w=qFsSI z@SB(|-GD0-v#P2}ySYYl#$Jf13?143<*tb)bmZjk4?mbh_)jlL{T*T`5p54IaSI4^H30dI|wLWUpg6aNF5_FFFny;W?Zqn z-xAL0ga$n!J-%ZGy$*I=3amQ7c@9Z;!AcM7rp#O$r14eYI?D{m;O%c$A3B$dibgwfKqyLdmX0GC#b9&3)&wR+B$wwK~HV=rx z1Z_l}_#rqsVp-KZwl|A@#OPSb1Zf(AxsS`NpOo3ec#DrShG9w?L{c?gbUmla>$Vdx;0v5pe1Tn4E9lv?W9#P8IpLaH)k zMbEI2Dc7kCZ?n`T*>i#I?d|b7?HLHP&OPOE_E^XxFBdP;|D{-jNIFdCIr_w3H+KEz=soMtCJHBkuJMYm0do zG*FkGvK^mFAUh5u0S3ijrh@v}{ysJb2c<1Wc!9{ui_TKCq#$AR@@UZsD{t!Lp*Cxc z5Gn=l6Mk}Ep$4daRg$EP|xHg8k;5Vut5dxPcjOOlA+HmE_P^OZ{kS$s{v-X z^;l+bLtgn0k$!X-Zme&~Cu%)^0tpJxV1=>LYFdo^A@(y9n~Ap5bj0E6v)0fflRPthfbo}n?+w2TQ?O@F7^Mu586_OdFD-zK&{mgG z##p`B#p+2?<8gKg4^tKrY!Lacy%?)qT^tUE_LlQeqOILVLO4LBq*( zFJOAb3WvZY5hz6}hv1Y2vhqVfL(RWz_iY%2e1@e4(#%)74?acV5iTlw^5Y$z!aX^kM5DM_R@{5Z< z_Cs47m@?pkmM$2OjiGqZ{T)_=t?nob5#t2sc(z=If*}&Od16DusO_0P;zMzAOSZm4 zS`C*W!%~|jLO)JEizv2iYwTqoM<_3GXnl*$&o?_f`=G2GZ>8g_*mOCQ?ZY9*H!`oo zi;ZkxkX>4p9k;b*0+Ll#Ff!_#H-s@pB?(SG5Vvk7DOf8@W;l=_MOPCSxk_V2%MC^k zeS0g^F-wcS1;wl7wWJk?I^=cW>AQwBN}}!x?r-DXqy4o4BW7u=&(evGTeY za~)VaeKY-b7|><6D3cw9Fd(Ak(xVp&)Pb|sAshVgx}#TVFt+?Wt(au^)OLgM>(G(8 zvGq)bj@-WOcmj+sA)}|H?~(*_r}$T}oX5)9Oiu|%HwT_9Ka!w`)NHz($yXnF!$Y3X z@df1Ban2zj3e87UkwegSbW$mWgSeFSdImsyx1nW<7&5OvuKb( zEG#VFdc(ZS%8j&nJ^+cz+0{HYbz9ePFzWBvkIH2~gOcCkbW8!VTBa%KzT_|5k6wZR zV<`=nE0b|Y-#kcE_^1A#t#rXeGTs`Kqli@T+e(2mS9L3@W^-qpX+@K|ebWL~N+SrV zdx#k&<&Ie7Z#yaKrWTT)BtpG_V1w*8qOuANDB$LpYH+E`nF|CIb;mY&m@3AnpS)1K zI9C|b>D0(FA_gXBXM+O+1Ecptw`0Jz)G|0yB&e|T`;vg3dJ3YM)+~J!Aq9zUvQK=% z#sy;V-!V4eR@7l_gMNafAP4zU!dZ0UzfjOP`b>&ndy$xc83tH#eu6r#tlhYY2&kW^ zX=9Q0ive1XHA8@P4JrV7ygty1O{?~aViWe|9O5Ux1XFsx=#{#npUj6e+r9ykJsVxu>`=j(X2MKw`XE7 zUA$(NJ>o6kjrR{G^&m;)e4k;JaruYQ5r)nB#1^hDZQBPO=^lQ zgAlXcUv&BkWFu>=zZi3PA{Wdg$pg$&$S;d$ zCUh;#Jc~!|@wHYaQCz>S`{;(8@C75#8_~2|$SEG=_+fbkwa`bmZjIudvkM3;xrk|m zapI|@BX|n7fE0T;P@x~86*Zu-Xzt|SA)Lq&Bmi^@9$I&5m9VBk^wy?ChXSAN2F75} zOcyZwbBNkMT981^|6d_gPaMsxJN~nIj0wiPxSSmO$cSZORTU8l^i=Zx1E zLDpu6Hh+0sECq6Oi{*z)v{PaykETST)NnJmLpg~pk)O*yCld6KZGwyO&d&a&B`q6) zJeJRqjRtf&^&&>YGLCSu8eq%_6SjGv$$*522=J)pbfs6}dw&i( z)>QJM#ROQRf>^4RC20^j5sfpkcz3h>3ir_y;)wI@S&8KQ!iS_#l7w(#Pq=J}$%Mb6 z_8YezYYr)`XMcc&07=H)0u*E(jz5Jil1z5sIG3c&P)|2*suQ0Y5D4Q;MnY8mL4X7e zY|4QP0gaP2{-@RVd;ry((TSbe`2jx94Gj&*YIT$?UJmZ29~^O1jt>1eEF=Psg~awAQv@G`I7e6- z5@(FD_gF@?vyhRWns_U^|wXwoKeVChMCoqK-mgT}_n+S2~)Ii2;A&&Nu3Z|JJ z3n7DbKO95UG$S>F>aymLp$sM@{`w+HNr_iGm5-1VWF{j>73dDKOis2P0>+;cRd)i6 zVoqu4tKjjFv+@-hbp5)KYFfwptDx^CH;Y5CK+W`Lme?^R9?{<*<1aLG*-{!(-`C25 z<#%yCV}r1W6m=%e>tqB2D5Shp)Hy!b+gG7MgZ=zDeNXU7T|%!xqZ;(1yo`H#JZA3?*(M=cFrXLrcg1-?bz z7Fto=h9-Xp6{BQT~lqlB1AB0*)IzL}t)&!lh%ae~#|Gvxx8`r#Fd{?*iyqJq~ z-g!#0hM`k+=>)2Z#mWvS4+@>iSxYfZR(+(0f+HSbK{?(B`jNt95Ger|=)qxdjI^l$ zjeKp5D2=@Y)^-2Eq<)D_Q)9Y>GOkIcS|!+wjrH&q;Z(4|8ZQ2Z=F9)AB3g;<)*QZv4KYzRV`9o}lpJbZdt z|Hlf>Pc{GOj3wS=tobVatO8E7EA1w>B>;{+z<2H_wqk>3{aubvFsV${`9GY7>2}8T zQ9GV$i-iZL_c#|@d~>OgMdRUw_ z(bm`-#4$P*cX#L9|8rU5SzpDsQh5W>IPEtfy^|)594VV^5Qm(2IZy_T5f?fbLS{Dm zvC~fMCnp76yQVSa#`H9sx~3*Mnsw1!-PnGQwL(S+XUtFl6+Eaki<9$H(g+7m`W+0O zgxNP6n@YX(7vATke|t5jWf)GK^VPnGwMM~9)4N6o6U;EbQ zN^A%Olc*3?IrT_12?1*voRSD9f?ee(7>wL+9uv8p@tN(kw7OdEQEz56pVhuunzohqP!-Dl(aaedYb$6@Ha`Yma_>&zCXLX^}eYA)mwVb;=UNBceS;_Hz{ z)(&e6od4M&Ye_15`=eRpB>IbKb|M^VJSix$g_gY?C;xbC?ppaG^nmr%`z> zp-_-3{ZW`|zvU7}_;;;-sN*e(+}^s=a^j6~<*Af$(!Ww_dw*vT@#VH>mm-nF>PzQR z!Hv#x`b-^kr@hy}I6uuJIg_n4H38Ey9*s<`27a0tdLJ?Al)bsT!%ZZh=kMiA4=EI^D!?SAS$49)8tNPpk*TCxOOF}LlKr=8H+}6$Qh2jQ%P029Z zHs^6IQ41v9M=bNPw*b~uBOwwV5D#s2EN3x5+Lhi(RR$Nujx$n+5CJIxcyx z5R!~6NENHViq1|-D1fDEe!5+9H$z%_vD2S~5ZrpCUsF8k-%e<*uKA?OflHxQy=$w5yL ztaCGT>`+!1g(%FFlc`!y7D1%0uYY?f)lY&KjhpB#3Ccu-`)$i`qnesaC+yZBuPjl5(tN*a5(I= zw7(fim_5fx4#`sdO{RopRSw!=Lt9$_4u>5)&t-1ztXq?hJpLeEladV0nlu_CN4sEm z<ncQ?Mcsc?HnJ#*-bSDA_Kk6pGYJSiA1Tq$%d=1uS;>R zrt=4xnH=WVHKoXbkOnIUmXQ4ZDpXh3A{aadhr>Zh!rasu|C)5?6{Q{~Q{Tu|=0cAF zNM=&%{Sai+@9Wx*n%OzH`FqP#OcOmp(2)fOS(fn9uP@isX<;K3%BFt~OPAN+;XC{( zriq>)tY8p`DIrBiaG>KbN()6eJ^8ekfJmJg(8N@U7NPZI*Te5u-atnFfV#SR&7vdy zGWBmAqYa|3cto1du$qkDUxmiT_Jv}|h%k!iy zsZXCbhBc`lh6EwS08Z4*#V61F1P+%2^G-ZTI~O_(`oZQu-1ocfc;cDYsCL07QV|n` z{7=RWcWqU^NVgtRFvuwcK?vYScQn%+2-dVH$vuT8S&{$Axah{`GGed+kfVE^LL%6k zY~!X2hoqEO<3u!W+lz*VCY2Pli^53FH#&?(7FB(HBN`g&(!RyaROyMtP*=A$s~ik7 ze+#=20ibT>3CiL$@~|^S z`bIqZ=+Cfs@83{bT8e`Q4}#-tkY%OH*sNKz(A}-{)jaLAQ*rR%AxM%0o6Uyq?rxNn zlt7XsNRo_rJdT4058})-mm?G!LT;`XE|&v>z|#$E6pgB{Z$!3hQeVDq_aPaNJpQ0Y z&h3Z8s4SVPnTs!W?}m-DAr^^Z!RgC1bD_uJSW-{@3}o}`H3hxKpbv){X%aWwwKaL3 zL$@CE7;IPFM*R$A^XoMQy~dyqhZ<=T7v1<=@;rwQgQ7{qN9d7Js^Tyn&J+(TfK8{B zV$*3?<3ML0DvQ0^&jmLiMd5TR@$h&wjI%rixaQO!fEVm3O>64`TyusGB3sSr%(du^#f+0RSG@%%N{k_#%47!l7(dLei4gsf?8elk!Vjw5%;?Xdo;bDkQPZER9lT0?Q zSru^hEy?pdJRTQ%dipRj5=L8F8_LSc(B6Is2M>1Rth3HUdwU0D8L-=xH(Y0D4+Oyj zS(dSI;S!MZR)-GtVabwH)N5Lhm*>UM&;W9BTqrBkCRZIh<^*8Flqq=_9v-A`oV>g_ z=;-J~Sy?F(2^n2o9az8qf8g-pUgYI@sV~Cp;9rug8ppII^@A2};Y2{-F*Dyr=i=k{ zw!`IhLy~0h;IQD-(^Df&It-DI9)V-Y53x@5L9pb&k_J22Xoqs9Ly2hgbhqQa-)#o~ z{OR5e`0SHUF#m*;GGdUQya%?cZp9_5{OBIqg-cc?FJ(!C9c;8iIn(hmc5dH?OI9VQ z_VM1OYfLc+0CXDzw8;qTz>G)35bQ2`tdtiNdu3kL?9`aE6o(W`m`|JtAl9#RG!m7K zbsU2?C5&q1pI|dcd7e`@oI*XYu0mNFr2EBlAVjc{pBx^V{tf~c0@yAWmoVC+|+tD7uGssYJl1 zXb##mZN)rcotc?1BoX-5Blh{Tunl)Y&MgOIiH44N(Vq0O#ubK%$3}H8)*RS)J2*)> zRmSGp3w9R-y9)pZ(c^>^83Y9Nt;_bnJdPnPLFgTrWW#YBhtAG6xLkJl{eJj-J_G`- zc<;S!%Ae$`Qk`BvAfOhYaoVwZ^=kEJ%J1-a6vvgz+8zAfRHf!SDBLOpJ7)-LcMvek3H0&c*)SyD%CI zL52*c$BlSG!s2D8DjJGleLZ;3xJ47y(367R2JS)nychz0=wQ{B$A7?LCrcopD8$ay|$uaVG^l!$>J=>oVy zNQnrz>PvvnpJmw1jc9Zfd}J`C%2GPX&jFFvnU*= zLR2JRHZ6iowXKm#%}EQRKnM z;Yse#bPnXJg2C!s7>&*^_5vKIbm~^Sn3qBbl76rKoRGuE8!xnk zfs%xjh#?U8NK}bqq-{9*KA~IZ=*$fRn&WO07MrrVvL@Xb{oS5S+O=bTUFi zM-Z1}FnB?L zzjpqFuZPI)-{OO}--g4ZsO9r&{rG%uGX#Oh$jB&oo`c=xM0h9&UL~nSERI=4c{q4@ z5Q4y=sK5h`=ON27rk0f`A>Ax6$p7d5NyoqeKyaWJ(QpuLhexPN=UlW=0U^nVM#9+F z(m}n&c9$3KDP?fFbKn#?hz<{2i+=!)7d8KSf_6A_i`3LvRs9Ou;VmdZB-ocM4sDN&d#zAu&L;8(tRO-zv@ybkvAJ1W~zc+?#=i=uN{Z=<8`1`Df%9+|Q>_P@Z z;8iSJxm<$*g8OTQfdc?(N-8spJOEEx705%?9G`ArZ89^*Eg3;grqK7_0 zG#o@|=m5Jcwbn!?Lin%5 zaC|*{bugs#qD#rH)Ugd4vo4>WEFNNac>&iV1+aQLFBTa_)Hw^z6z1Z9!2mtkcN{~- znBVGF`kw0V(Puc0)in5fVK}}X{%bL4dz>F1$H(z;eCWpi2S_}f3_h)b1^@s607*qo IM6N<$f^W5A%>V!Z diff --git a/pytiled_parser/__init__.py b/pytiled_parser/__init__.py index 7fd3538..d58a1b1 100644 --- a/pytiled_parser/__init__.py +++ b/pytiled_parser/__init__.py @@ -1 +1,4 @@ -"""Parse Tiled Maps and Tilesets""" +"""init for pytiled_parser""" + +from . import objects, utilities +from .xml_parser import parse_tile_map diff --git a/old_pytiled_parser/objects.py b/pytiled_parser/objects.py similarity index 100% rename from old_pytiled_parser/objects.py rename to pytiled_parser/objects.py diff --git a/old_pytiled_parser/typing_helpers.py b/pytiled_parser/typing_helpers.py similarity index 100% rename from old_pytiled_parser/typing_helpers.py rename to pytiled_parser/typing_helpers.py diff --git a/old_pytiled_parser/utilities.py b/pytiled_parser/utilities.py similarity index 100% rename from old_pytiled_parser/utilities.py rename to pytiled_parser/utilities.py diff --git a/old_pytiled_parser/xml_parser.py b/pytiled_parser/xml_parser.py similarity index 100% rename from old_pytiled_parser/xml_parser.py rename to pytiled_parser/xml_parser.py diff --git a/old_tests/__init__.py b/tests/__init__.py similarity index 100% rename from old_tests/__init__.py rename to tests/__init__.py diff --git a/tests/test_data/simple_external_tileset/map.json b/tests/test_data/simple_external_tileset/map.json deleted file mode 100644 index 1b89be4..0000000 --- a/tests/test_data/simple_external_tileset/map.json +++ /dev/null @@ -1,68 +0,0 @@ -{ "compressionlevel":0, - "height":6, - "infinite":false, - "layers":[ - { - "data":[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48], - "height":6, - "id":1, - "name":"Tile Layer 1", - "opacity":1, - "type":"tilelayer", - "visible":true, - "width":8, - "x":0, - "y":0 - }], - "nextlayerid":2, - "nextobjectid":1, - "orientation":"orthogonal", - "properties":[ - { - "name":"bool property - false", - "type":"bool", - "value":false - }, - { - "name":"bool property - true", - "type":"bool", - "value":true - }, - { - "name":"color property", - "type":"color", - "value":"#ff49fcff" - }, - { - "name":"file property", - "type":"file", - "value":"..\/..\/..\/..\/..\/..\/..\/var\/log\/syslog" - }, - { - "name":"float property", - "type":"float", - "value":1.23456789 - }, - { - "name":"int property", - "type":"int", - "value":13 - }, - { - "name":"string property", - "type":"string", - "value":"Hello, World!!" - }], - "renderorder":"right-down", - "tiledversion":"1.3.1", - "tileheight":32, - "tilesets":[ - { - "firstgid":1, - "source":"tile_set.json" - }], - "tilewidth":32, - "type":"map", - "version":1.2, - "width":8 -} \ No newline at end of file diff --git a/tests/test_data/simple_external_tileset/tile_set.json b/tests/test_data/simple_external_tileset/tile_set.json deleted file mode 100644 index c1431bb..0000000 --- a/tests/test_data/simple_external_tileset/tile_set.json +++ /dev/null @@ -1,14 +0,0 @@ -{ "columns":8, - "image":"..\/images\/tmw_desert_spacing.png", - "imageheight":199, - "imagewidth":265, - "margin":1, - "name":"tile_set_image", - "spacing":1, - "tilecount":48, - "tiledversion":"1.3.1", - "tileheight":32, - "tilewidth":32, - "type":"tileset", - "version":1.2 -} \ No newline at end of file diff --git a/old_tests/test_data/test_map_image_tile_set.tmx b/tests/test_data/test_map_image_tile_set.tmx similarity index 100% rename from old_tests/test_data/test_map_image_tile_set.tmx rename to tests/test_data/test_map_image_tile_set.tmx diff --git a/old_tests/test_data/test_map_infinite.tmx b/tests/test_data/test_map_infinite.tmx similarity index 100% rename from old_tests/test_data/test_map_infinite.tmx rename to tests/test_data/test_map_infinite.tmx diff --git a/old_tests/test_data/test_map_simple.tmx b/tests/test_data/test_map_simple.tmx similarity index 100% rename from old_tests/test_data/test_map_simple.tmx rename to tests/test_data/test_map_simple.tmx diff --git a/old_tests/test_data/test_map_simple_meme.tmx b/tests/test_data/test_map_simple_meme.tmx similarity index 100% rename from old_tests/test_data/test_map_simple_meme.tmx rename to tests/test_data/test_map_simple_meme.tmx diff --git a/old_tests/test_data/test_map_simple_objects.tmx b/tests/test_data/test_map_simple_objects.tmx similarity index 100% rename from old_tests/test_data/test_map_simple_objects.tmx rename to tests/test_data/test_map_simple_objects.tmx diff --git a/old_tests/test_data/test_map_simple_offset.tmx b/tests/test_data/test_map_simple_offset.tmx similarity index 100% rename from old_tests/test_data/test_map_simple_offset.tmx rename to tests/test_data/test_map_simple_offset.tmx diff --git a/old_tests/test_data/tile_set_image.tsx b/tests/test_data/tile_set_image.tsx similarity index 100% rename from old_tests/test_data/tile_set_image.tsx rename to tests/test_data/tile_set_image.tsx diff --git a/old_tests/test_data/tile_set_image_objects.tsx b/tests/test_data/tile_set_image_objects.tsx similarity index 100% rename from old_tests/test_data/tile_set_image_objects.tsx rename to tests/test_data/tile_set_image_objects.tsx diff --git a/old_tests/test_infinite_maps.py b/tests/test_infinite_maps.py similarity index 100% rename from old_tests/test_infinite_maps.py rename to tests/test_infinite_maps.py diff --git a/old_tests/test_parser.py b/tests/test_parser.py similarity index 100% rename from old_tests/test_parser.py rename to tests/test_parser.py diff --git a/old_tests/test_pytiled_parser_integration.py b/tests/test_pytiled_parser_integration.py similarity index 100% rename from old_tests/test_pytiled_parser_integration.py rename to tests/test_pytiled_parser_integration.py diff --git a/old_tests/test_test_map_simple_offset.py b/tests/test_test_map_simple_offset.py similarity index 100% rename from old_tests/test_test_map_simple_offset.py rename to tests/test_test_map_simple_offset.py diff --git a/old_tests/test_typing_helpers.py b/tests/test_typing_helpers.py similarity index 100% rename from old_tests/test_typing_helpers.py rename to tests/test_typing_helpers.py From 079acd87c0b8e5cb769a9ad52ff885be5aad09fb Mon Sep 17 00:00:00 2001 From: Darren Eberly Date: Sun, 20 Sep 2020 16:35:08 -0400 Subject: [PATCH 2/4] Changed required python verison to >= 3.6 from ~= 3.6 --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index d115d33..b3036d3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -21,7 +21,7 @@ classifiers = Topic :: Software Development :: Libraries :: Python Modules [options] -python_requires = ~=3.6 +python_requires = >=3.6 setup_requires = setuptools >= 40.6 pip >= 10 From 5a44abd87af8edd0bcfec7ad3778f057492e7495 Mon Sep 17 00:00:00 2001 From: Travis Dixon Date: Sun, 20 Sep 2020 17:23:45 +1000 Subject: [PATCH 3/4] better objectgroup parsing --- pytiled_parser/xml_parser.py | 213 +++++++++++++++++------------------ 1 file changed, 104 insertions(+), 109 deletions(-) diff --git a/pytiled_parser/xml_parser.py b/pytiled_parser/xml_parser.py index e400d53..ae7296a 100644 --- a/pytiled_parser/xml_parser.py +++ b/pytiled_parser/xml_parser.py @@ -261,55 +261,109 @@ def _parse_tiled_objects( tiled_objects: List[objects.TiledObject] = [] for object_element in object_elements: - id_ = int(object_element.attrib["id"]) - location_x = float(object_element.attrib["x"]) - location_y = float(object_element.attrib["y"]) - location = objects.OrderedPair(location_x, location_y) - - tiled_object = objects.TiledObject(id_=id_, location=location) - - try: - tiled_object.gid = int(object_element.attrib["gid"]) - except KeyError: - tiled_object.gid = None - - try: - # If any dimension is provided, they both will be - width = float(object_element.attrib["width"]) - height = float(object_element.attrib["height"]) - tiled_object.size = objects.Size(width, height) - except KeyError: - pass - - try: - tiled_object.opacity = float(object_element.attrib["opacity"]) - except KeyError: - pass - - try: - tiled_object.rotation = float(object_element.attrib["rotation"]) - except KeyError: - pass - - try: - tiled_object.name = object_element.attrib["name"] - except KeyError: - pass - - try: - tiled_object.type = object_element.attrib["type"] - except KeyError: - pass - - properties_element = object_element.find("./properties") - if properties_element is not None: - tiled_object.properties = _parse_properties_element(properties_element) - - tiled_objects.append(tiled_object) + my_object = _parse_object(object_element) + if my_object is not None: + tiled_objects.append(my_object) return tiled_objects +def _parse_object(obj): + my_id = obj.attrib["id"] + my_x = float(obj.attrib["x"]) + my_y = float(obj.attrib["y"]) + my_location = objects.OrderedPair(x=my_x, y=my_y) + if "width" in obj.attrib: + my_width = float(obj.attrib["width"]) + else: + my_width = None + if "height" in obj.attrib: + my_height = float(obj.attrib["height"]) + else: + my_height = None + my_name = obj.attrib["name"] + + properties: Optional[objects.Properties] + properties_element = obj.find("./properties") + if properties_element is not None: + properties = _parse_properties_element(properties_element) + else: + properties = None + + # This is where it would be nice if we could assume a walrus + # operator was part of our Python distribution. + + my_object = None + + polygon = obj.findall("./polygon") + + if polygon and len(polygon) > 0: + points = _parse_points(polygon[0].attrib["points"]) + my_object = objects.PolygonObject( + id_=my_id, + name=my_name, + location=my_location, + size=(my_width, my_height), + points=points, + properties=properties, + ) + + if my_object is None: + polyline = obj.findall("./polyline") + + if polyline and len(polyline) > 0: + points = _parse_points(polyline[0].attrib["points"]) + my_object = objects.PolylineObject( + id_=my_id, + name=my_name, + location=my_location, + size=(my_width, my_height), + points=points, + properties=properties, + ) + + if my_object is None: + ellipse = obj.findall("./ellipse") + + if ellipse and len(ellipse): + my_object = objects.ElipseObject( + id_=my_id, + name=my_name, + location=my_location, + size=(my_width, my_height), + properties=properties, + ) + + if my_object is None: + if "template" in obj.attrib: + print( + "Warning, this .tmx file is using an unsupported" + "'template' attribute. Ignoring." + ) + + if my_object is None: + point = obj.findall("./point") + if point: + my_object = objects.PointObject( + id_=my_id, + name=my_name, + location=my_location, + properties=properties, + ) + + if my_object is None: + my_object = objects.RectangleObject( + id_=my_id, + name=my_name, + location=my_location, + size=(my_width, my_height), + properties=properties, + ) + + return my_object + + + def _parse_object_layer(element: etree.Element,) -> objects.ObjectLayer: """Parse the objectgroup element given. @@ -451,7 +505,7 @@ def _parse_points(point_string: str) -> List[objects.OrderedPair]: xys = str_pair.split(",") x = float(xys[0]) y = float(xys[1]) - points.append((x, y)) + points.append(objects.OrderedPair(x, y)) return points @@ -531,69 +585,10 @@ def _parse_tiles(tile_element_list: List[etree.Element]) -> Dict[int, objects.Ti if objectgroup_element: objectgroup = [] object_list = objectgroup_element.findall("./object") - for object in object_list: - my_id = object.attrib["id"] - my_x = float(object.attrib["x"]) - my_y = float(object.attrib["y"]) - if "width" in object.attrib: - my_width = float(object.attrib["width"]) - else: - my_width = None - if "height" in object.attrib: - my_height = float(object.attrib["height"]) - else: - my_height = None - - # This is where it would be nice if we could assume a walrus - # operator was part of our Python distribution. - - my_object = None - - polygon = object.findall("./polygon") - - if polygon and len(polygon) > 0: - points = _parse_points(polygon[0].attrib["points"]) - my_object = objects.PolygonObject( - id_=my_id, - location=(my_x, my_y), - size=(my_width, my_height), - points=points, - ) - - if my_object is None: - polyline = object.findall("./polyline") - - if polyline and len(polyline) > 0: - points = _parse_points(polyline[0].attrib["points"]) - my_object = objects.PolylineObject( - id_=my_id, - location=(my_x, my_y), - size=(my_width, my_height), - points=points, - ) - - if my_object is None: - ellipse = object.findall("./ellipse") - - if ellipse and len(ellipse): - my_object = objects.ElipseObject( - id_=my_id, location=(my_x, my_y), size=(my_width, my_height) - ) - - if my_object is None: - if "template" in object.attrib: - print( - "Warning, this .tmx file is using an unsupported" - "'template' attribute. Ignoring." - ) - continue - - if my_object is None: - my_object = objects.RectangleObject( - id_=my_id, location=(my_x, my_y), size=(my_width, my_height) - ) - - objectgroup.append(my_object) + for obj in object_list: + my_object = _parse_object(obj) + if my_object is not None: + objectgroup.append(my_object) # if this is None, then the Tile is part of a spritesheet image = None From b3c2c0034649f7a9a9357161ebd5ed11a8a9e9fb Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Wed, 23 Sep 2020 11:24:42 +1000 Subject: [PATCH 4/4] recognise image layers --- pytiled_parser/objects.py | 15 +++++++++++++++ pytiled_parser/xml_parser.py | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/pytiled_parser/objects.py b/pytiled_parser/objects.py index b9fab0f..0e7667e 100644 --- a/pytiled_parser/objects.py +++ b/pytiled_parser/objects.py @@ -420,6 +420,21 @@ class LayerGroup(Layer): layers: Optional[List[Union["LayerGroup", Layer, ObjectLayer]]] +@attr.s(auto_attribs=True, kw_only=True) +class ImageLayer(Layer): + """Image Layer. + + An image layer displays a single image. + + See: https://doc.mapeditor.org/en/stable/reference/tmx-map-format/#imagelayer + + Attributes: + image: the image to display for this layer. + """ + + image: Image + + @attr.s(auto_attribs=True) class TileSet: """Object for storing a TSX with all associated collision data. diff --git a/pytiled_parser/xml_parser.py b/pytiled_parser/xml_parser.py index ae7296a..d03fed7 100644 --- a/pytiled_parser/xml_parser.py +++ b/pytiled_parser/xml_parser.py @@ -403,6 +403,29 @@ def _parse_object_layer(element: etree.Element,) -> objects.ObjectLayer: ) +def _parse_image_layer(element: etree.Element,) -> objects.ImageLayer: + """Parse the imagelayer element given. + + Args: + element: Element to be parsed. + + Returns: + ImageLayer: The image layer object. + """ + id_, name, offset, opacity, properties = _parse_layer(element) + + image = _parse_image_element(element.find("./image")) + + return objects.ImageLayer( + id_=id_, + name=name, + offset=offset, + opacity=opacity, + properties=properties, + image=image, + ) + + def _parse_layer_group(element: etree.Element,) -> objects.LayerGroup: """Parse the objectgroup element given. @@ -447,6 +470,8 @@ def _get_layer_parser( return _parse_object_layer if layer_tag == "group": return _parse_layer_group + if layer_tag == "imagelayer": + return _parse_image_layer return None