From e6b7c8d34d3b33a8b538acd5b95b0c0911b098aa Mon Sep 17 00:00:00 2001 From: Julian Freeman Date: Thu, 26 Jun 2025 13:54:35 -0400 Subject: [PATCH] add basic files --- main.py | 128 ++++++++++++++++ processing.py | 46 ++++++ requirements.txt | 7 + static/favicon.ico | Bin 0 -> 161862 bytes templates/index.html | 340 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 521 insertions(+) create mode 100644 main.py create mode 100644 processing.py create mode 100644 requirements.txt create mode 100644 static/favicon.ico create mode 100644 templates/index.html diff --git a/main.py b/main.py new file mode 100644 index 0000000..e73b5e6 --- /dev/null +++ b/main.py @@ -0,0 +1,128 @@ +from fastapi import FastAPI, File, UploadFile, Form +from fastapi.responses import FileResponse, HTMLResponse, JSONResponse +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates +from fastapi.requests import Request +from typing import List +from pathlib import Path +from processing import process_image +from zipfile import ZipFile +import shutil +import uuid +from rembg import remove +import os + +app = FastAPI() + +# 文件路径设置 +BASE_DIR = Path(__file__).resolve().parent +STATIC_DIR = BASE_DIR / "static" +OUTPUT_DIR = STATIC_DIR / "output" +UPLOAD_DIR = STATIC_DIR / "uploads" +TEMPLATE_DIR = BASE_DIR / "templates" + +# 确保目录存在 +OUTPUT_DIR.mkdir(parents=True, exist_ok=True) +UPLOAD_DIR.mkdir(parents=True, exist_ok=True) + +# 挂载静态目录和模板 +app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") +templates = Jinja2Templates(directory=TEMPLATE_DIR) + + +@app.get("/", response_class=HTMLResponse) +async def index(request: Request): + return templates.TemplateResponse("index.html", {"request": request}) + + +@app.post("/upload") +async def upload_images(files: List[UploadFile] = File(...)): + session_id = str(uuid.uuid4()) + session_upload_dir = UPLOAD_DIR / session_id + session_output_dir = OUTPUT_DIR / session_id + session_zip_path = OUTPUT_DIR / f"{session_id}.zip" + + session_upload_dir.mkdir(parents=True) + session_output_dir.mkdir(parents=True) + + for file in files: + contents = await file.read() + input_path = session_upload_dir / file.filename + with open(input_path, "wb") as f: + f.write(contents) + + output_path = session_output_dir / file.filename + process_image(input_path, output_path) + + # 打包为 zip + with ZipFile(session_zip_path, 'w') as zipf: + for image_file in session_output_dir.iterdir(): + zipf.write(image_file, arcname=image_file.name) + + # 清理上传目录(可选) + shutil.rmtree(session_upload_dir) + shutil.rmtree(session_output_dir) + + return {"download_url": f"/static/output/{session_zip_path.name}"} + + +@app.get("/download/{zip_filename}") +async def download_zip(zip_filename: str): + file_path = OUTPUT_DIR / zip_filename + if file_path.exists(): + return FileResponse(path=file_path, filename=zip_filename, media_type='application/zip') + return {"error": "File not found"} + + +@app.post("/remove-bg") +async def remove_bg(files: List[UploadFile] = File(...)): + session_id = str(uuid.uuid4()) + session_upload_dir = UPLOAD_DIR / session_id + session_output_dir = OUTPUT_DIR / session_id + session_zip_path = OUTPUT_DIR / f"{session_id}.zip" + + session_upload_dir.mkdir(parents=True, exist_ok=True) + session_output_dir.mkdir(parents=True, exist_ok=True) + + result_files = [] + + for file in files: + if file.filename == '': + return JSONResponse(content={"error": "No selected file"}, status_code=400) + + input_path = session_upload_dir / file.filename + output_path = session_output_dir / file.filename + + contents = await file.read() + with open(input_path, "wb") as f: + f.write(contents) + + with open(input_path, 'rb') as input_file: + with open(output_path, 'wb') as output_file: + input_data = input_file.read() + output_data = remove( + input_data, + alpha_matting=True, + alpha_matting_erode_size=15, + alpha_matting_background_threshold=5, + alpha_matting_foreground_threshold=250, + ) + output_file.write(output_data) + + result_files.append(f'/static/output/{session_id}/{file.filename}') + + # 打包为 zip 文件 + with ZipFile(session_zip_path, 'w') as zipf: + for image_file in session_output_dir.iterdir(): + zipf.write(image_file, arcname=image_file.name) + + # 清理临时目录 + shutil.rmtree(session_upload_dir) + shutil.rmtree(session_output_dir) + + return JSONResponse(content={"download_url": f"/static/output/{session_zip_path.name}"}) + + +if __name__ == "__main__": + import uvicorn + uvicorn.run(app, host="127.0.0.1", port=7310) diff --git a/processing.py b/processing.py new file mode 100644 index 0000000..76a6845 --- /dev/null +++ b/processing.py @@ -0,0 +1,46 @@ +from PIL import Image, ImageDraw +from pathlib import Path + + +def create_soft_edge_mask(width: int, height: int, transition_ratio: float = 0.02) -> Image: + transition_height = int(height * transition_ratio) + mask = Image.new("L", (width, height), 255) # 默认全白(不透明) + draw = ImageDraw.Draw(mask) + draw.rectangle([0, 0, width, height // 2 - transition_height // 2], fill=0) # 上半黑 + draw.rectangle([0, height // 2 + transition_height // 2, width, height], fill=255) # 下半白 + + # 顶部和底部之间 2% 的区域渐变 + for i in range(transition_height): + alpha = int(255 * (i / transition_height)) + y = height // 2 - transition_height // 2 + i + draw.line([(0, y), (width, y)], fill=alpha) + + return mask + + +def process_image(input_path: str | Path, output_path: str | Path): + base_width, base_height = 800, 1000 + original = Image.open(input_path).convert("RGBA") + + # 缩放图像宽度适配底图宽度 + scale_ratio = base_width / original.width + new_height = int(original.height * scale_ratio) + resized = original.resize((base_width, new_height), Image.LANCZOS) + + # 创建底图并粘贴第一个图像(对齐顶部) + base_image = Image.new("RGBA", (base_width, base_height), "white") + base_image.paste(resized, (0, 0), resized) + + # 创建 A2 图层(对齐底部) + A2 = resized.copy() + A2_image = Image.new("RGBA", (base_width, base_height), (0, 0, 0, 0)) + A2_y = base_height - A2.height + A2_image.paste(A2, (0, A2_y), A2) + + # 创建遮罩并加为 alpha 通道 + mask = create_soft_edge_mask(base_width, base_height, 0.02) + A2_image.putalpha(mask) + + # 合成 + final = Image.alpha_composite(base_image, A2_image) + final.convert("RGB").save(output_path, format="PNG") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..97ab4f9 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +fastapi +uvicorn +python-multipart +pillow +jinja2 +rembg +onnxruntime \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0c535f494d732a41948a851e3ad4f6642406b74c GIT binary patch literal 161862 zcmeEv1$b1~_WiVd{`y|~>h3L6XiI5+EyqipBDfiA7ZhbyYrCcmA9Y5dpVawy#&%dwrpYZctAGYMj?;HqVr`*q>1;01&Umyd4 z3AOnF61TqlFKp+Ew37o=I)<);U7QuG*B7n0t^5~0I|R{U}gXhWDb}c=7_ms&X_yq@af!W0Pp_`&=iPi z(6GUpMT-|5-IuKI&3^vxB2 z@C|+ajVsQbKmY5&w6q%=H*GpUd(NDrQBhHAm_vihzxb;GyuVRUP|(7Sn>J=M&v(AN zBcb!o+$;S5tO1?>2TcRcx>&V(b#{@WMHe!s{_v0Yy;7`Lu{l?+Uinq=ZXWI2KL{GI z*T3=t_a4CBVD|uyJ$nGZ=C2R@Z)kvhp=eOh9Ol-S2JoKdn>KIGHgj%{UHSiS&jo)( z4P3!|;m(;HOGRJqm`_AV3X8t+$R|AfHfa(kU z?FG0$aO?$m+n-*5z2JY}2kyNFTC`{}l{xmL0lZdt_3G8BI`_=~gQo%a{If3ZuMc?d z1-V!Bw;$ww(chl%-fCd+k|n9ku^0YBQ&UqT3YsbHV?n2JTHin0p`aR|Ed73%&OP zhcYs*fd3j^_-_m!`-S-rXux@m;P0B?zpnvz{U7f;f8oL};J>jK{#z>U)%ak|1^)Jf zuKj?&bHN|Q2Rvy2{I|>v{|}xI{1G+aZ$HS#5dB>jUU7SjFfaW7|Dl2VaeOE@bHVSU zfxPk`(7^A}58Mw8I36GJ&HwkZ_fzw~^XS+QxL*^vKSp#v)&=)tF8Cw*fL#Or@gLBD z`TK(3zbCwZKHxw9-Zije$wZpcs;Ge?7>m%<)@Br?scnkVG`9%CexR*FF~lacLu^BF z#3r;Yf$b7B-3=1jl_ZJw7@g4p`#O}eVMd42C3Z2REG0$*U3ARCs3R1kfoP1;Q`8FBosqpGv)j?az3RG6%d*nFBwdtU(3n*q{&T*x--o_>hk!P7Ezb zCx?APCx;iJQ^P-{QzJg3?2&~jdsGoR4V)QWl+KI^qO)U*0mbRuxDs@Jd`X}bU5F`7 z7h+4(#kgR~i7P`n@ga0+LRq>rF_bP(EJv3om8Y*Jm#43%gaP67&D09?&9sViWm+Y= zI=wPoO{hZGW-zMK^_kV^Mq&irm{py=omGRron4b|&Z#AFYi=F7Jr9^)m+s7uq&o|u z=(~mW==(+WC4N}kkbYRwkbYd+h<;kyn0{K;gnnM$6lg}jtY}8Ru53ZK7B!+3G2Q%L z7x=@!qXyjbpAa2Rn;Jesn;QLzHaBMcnYJ|f3vF%sSK8X_Z?vu1-)UR(f6(?8|CHGA z`J=S6<-cfWtAA5ctH+=nvu>V%ZlE2dn+_)3bYk5AU7#H&-5g-ubZ6ZFJzuAEsU4GU zdYg5lv}4lEzyi>Yp&LUxteX?=bOY@;=w^&vH|L~oNAIQh zs+%iPH@L}lY5!x)Zqw8i1>!zt$H@bE_=|*{uO*ieI zhUb`d^PFehbYtBZp5vsOL+m$FH_%Sse00R-IfiZqz;C2(;5mcso@3L^utM-0!*2}F zVcnc&zZng`G3& z_ojiVUBYQ$O^d`LjEu##EVRVH(%KeUW?*?83#~A)5}IMKc33w`JFFX}9T(lyXWamX zZgkIa)Q$9<=6|Q{hUc(ucCg>HRDOfGs*T-qTy-NTcJ0{w#@6HTJY|}zxW{qUO@G#nhaQLLDd^_# zz>jF@I5Ypc2YAvzZuxig0J{bzcMhis6)ZHdqK-)zCs)!j1>@ApI;LTqUPVU&M%Ikd zjnWS5Mrp?%-6-v_-zd*vzfqpUn(?I@p0AYO@O-7_Dd)M$-sAk)YmXy!W$5F zm6zUF_BcH}_s09WzXkp~o9bVkXX^gkfxPhVP6LxVh12MA78+w^I7D%yX3|-SB+nPB&_<^3>z7W<2Z0 z-W$92IJxYNU3#47X;=GaY3bOGZuocK3*?o5XAMjM|AT@p5`)WFXo!KKAr=~DV0c*z zjW94W)Iy^Sux^xgoOPqLW7dt*j1jSTnwK!}FE$o80Jz`yAyr+~=ry z>VEddUq(Jei${0xQ2+M1K%GD0oBtn(dG-cAJ`~p>oH`bN^7uL}MBWuQ; zZj^RdH%dFsx>4F;%_!Zl@3`|DO8E`XSITdAzEbm)FWo55@u$Zz_r^*) z&VJ*o$5Cr4UT^uXf4dL(;{S&qnR^A#KEU;F=0C5oH{B@hux^xg*l(2Qux4_j8}=P{ zx>0i#YewmY=PP%*;XX(CjW69O?fBE<_@f(lJr3_%JgS4=*O>Xkzdssa{_7O~4^=Pu z4Am&{G}SErB-Jkdgxps*=y9r3>~X4vef(NPiD#*5spqLu>6fTt@GBG+{2GNb%DgJK zD+RwSU#nc|MPgJf`GS0ZwNlUF^Pi>aCG_7>qxe(uGiw)n62IpOiY)dY;Bl%~>@ncq z)S%eEs8O*;sd3OhsYTG=s7;YaeCmehE9EylU#WS@-CSkvaac1-H{9pA(~Ykl$J`q$ z&+(_nG55yfvEEu_@bAxchW_&JO9RY*#nLZRaA^Jq8f8NBQMr&esRDFYrPK>jk9DA% z`a%Dq#zp^5&5QhnS`~hT+QDPo`Hj1|%2SWSnsKKav zT|sX6_oe~nKdj<=4>b3=(q`HG6jJsb3WZj}LSC1?RHd};LpBd8{xsDp@f6iA@g&uS z|3sDe57jIFIDF?ZYFHfJQ~XhCTI`?Hyx8CA^J0Ia4n-gK*c&U)@u$b}rW^JiJO92l zkX!yeX@L1JU!}kwhyVNHWA9Q}L;!2gDWq;8D%;>QD%+^YeM2ZdyIIKN zG~b1P&pwb>{+%`O|1JOExr~YDvXRVl;rqt1JN=YvT$Cy_D@F}Fm7_u3LOt;BUITZ- zzgYu+c>X2NA5fWUA5xi`ACu&{{{7{dd5vgQit2X=rIy_)Q0G1o)T4h5>N~g&4ICCp z!$;Ml(PJ9X`0XICbRK%(HVGH@pT- zh%QP!%RfO2$3`3dzncG@M|(fuoBtn)>)ado_|VR!lPC;xo!^`x$02n-@#2%Ht@@wI zc{8NeClpfsBj}@mu8;CqXYl+QhB5p-DiaRPT7#yY$IAfwILmyRgZG!MM)%2YD6g;7yIDf?gReu z?^^@@@vqlbNFB_P_qq>iSQs1@qB1oKN{DX-doSXSip3+?M@85l>u8}|d`=f!K%O+C&cENvWe%fcjoEu_0}r)&Ra<-{$LPj=jYxF*U*e62I?1;xGTc zG;pu@4@J-04)rr|SY6rY_8eG~I-ndRjj-0@zir$&|9doNEySX~ zON__)`jf%;^agYU^Y}$$9{0wvx7Si8)i?O}?^@H`@b66n_k#Z#txMA&tZSU}WZve! zxLdynY8D+v5iLtW4@G}BO;m*b+V-qWBS$yz`Zt>YUKR7ay>LQ9T0f;8r6fdA)~vd8 zVNPAjnd=Ub*zW{CbaC~|PL!P3$;7{J4dj-8Pa2T?w=JDVE{e+a?btlj(x@>F=nK?g zOI&|czhkKEx7d^2d39d*)o)XZy7sG1{``G$n6GEWH>8yl>(P#Bk(4&0E}fZOn{sfC zj}DIAp$_&Nz;!@5Hn`IV?{n10^>y9ox9k<*zl#(9-ZhXH{@rOHul!ePUPAUts!s0J z$h{YP#eku8<=o8tb?jYL`bL!&C4A~54841w?!mM@wgTnMilEI?>eAHMhQ$0P#5JS^ z@eOFzq$t`lC6bb-*P)CVwdqu14Z1kH2IaU#P3(6An=X_-cyy-^-sh^3ua`8X9}i3< z?aV5PiR_ms_dh-DmE)lExJ}Pj&I$4zwC+g7#tIw z1)kSTtV27e)S&cf5tNN){Ec9R>F`p#G04Oo1K@9GybH z92iaimo}b$%a};kqf?;|N1bR{3E0P&q2m}vlb2}660vQ-q?6=nEhYba&vNe?(C<&{ zKmXn}Ao-t=_hTX6>f8L<*c4>3>{qZwvBAWl#)YeL0lJ(y$Gfg`?} zi~Bb$Z$!5@w5K0;^`YO=$B=deJ(xs1Mg`UZ1AVy-CS7Dg6E>K1k;ytxU_B@p{&5WB zF=#@9^`KzPF~?_8^0d!w{QIK;fB3h1fM*TdPyQ2P>(TlN5tM=ZYvfGBJvbbI>*J>Z z-uPGk;NS_0e;&=e8}W?tbahc3y0xw~{h0Ix{oldiq#Yg)#F!8Z&J~mncvL#TD0SdL z51Bkqc+mpuK>|8Z^GT+fOL$ZsVfTsTX*m85|M&Nq1^)8yO9RaRY#jG6*Qz<5KCu}c zT+yCRuj@>gHg}~PJGxWOrmmE+sv~Wh--f14XlDCae(#2PZ76e17rME%GySls72R6Z zkghMRL0=_?(WU9kd1)OSOTY_MozFnM&j7D30Jq@P6?&b2HK!`Pyg7Zp6TRD^(I#%0 zWAJ)ZfqC@?#kb)BneYJ#=3BwUdlo#v237w&g7;$#u6qSl{}_*>{+*CAUDdyT&#lM} z|K2p9^Y6NrpA^@G4zFxa|F@?rX(`=+?k4m=45aoTYidtuq8oh+XsKVA(2KOa3cV3C z;JwK`>6fG~^wW+`^!?_xbZ0&8eY2(o-B{I_t}czFZx+;`%d^qTyW@K%G?W-lm*?RA zJj?3Q?JXVXm;HmmDQf#DxXx4n-&yYy_t zX42k-7KZ;T{_Q^Ct{=<`|L!!9v}^(;O|4C<6Pwcn@SZrSDP3IOhP2%s40Ob(&l zU~MSmQ6s6)0CO+-hi_+rPYH0E*K%)25Q#@;Q54tm)f=Q zYvx+jw7stN`UdAGfm2u)x&!8ry$Lw~L(c!M{JZN1^UA-o2AKboxSyG}s~!Ei6MmnB zy59wO;(s^zXV|zmd4%+eXwN>8?CcXgNZZ$sv~=`n8KZRWnJ>wWJB}1Do<`==&1)yI z&jxUMQUSGkN&%dmazZw?vr)S)0GHYB0DiL#oW`2p2CVl_y93t#r||jcNs=ev93U6| z?H=H)fxF?~tbwGZ6DS+Uy|g{-_o#UrQ1g3$WM_c;WCJPSUIO)>q5%F=45VU?umRks zDs)FLU|?S_ct5x|BQr+UtpFba`LToR2wbv8PC_5xPJjn-3OI?Fw;jMgui*GO@@M$x z954&p9spj2#B7WTa}WdIR-B&e1M~2@4h=t};rGfpgT3g`C`z7K*8~6VHE_55D-H1c ze;W5Ll>8@ye;dragYOgt#kupS_~+4`1{C*d1plc94)lfxpbt1ag2d6Wb{wBT;w*B_ zID`Bj!*=F)JF*ZTivuQ+IBv#d5+{ID(~)!hoHO{d&hTft1Gqfn3~+nKz*%tU6Z7#N zC!E7J>j&N@(03}xwduhjsQ=nt_;=NSZ~lKK=GYgw{?9Co)N7sVUBakuS?Az6SpnQ~ zA84y}C$3Yx)H`!6YaX7zSD`0j1N$&C_V+H0V=yW}M@Inog*XT9B*5J{1@OU~xL^VH0q4D8AzpXJBJ6Vm)(YkisZs7# zcwNGC-N9jc|GOXmp8W$UIldO9y7hne{eUn2fBwZ!{xScb!SQc~rbfjJ?4sLn0-fro}-A3Wj!v?0+KqXAx9sC5bJPihbz zbD*E@Bdh_|5ZABd+TfQtJ_in601nUj!eYD!V7}2yNR45QC+8r!%`t#^O4d1kzph_+ z9M-@R`|$VM(2tViYDoV5eWs;9{QIK;?*C5VJ2%aNYct1gxV6pW$n#!?s%;)sZS!c< zv;)t)PjL;NnQIB~%N$FXcxFFv$2<6y8rao_v?LRDwMGBRXor7Ocik7{oDl=>#T;=O zwRjHxejc@d5gfY366{x4iWtao1D-#W2Vu=Ab;erb7`kOI($e8od>q8K2FAbLcANzJ zjbkLqaS=BD{n3EG{QJ@X^M7JWFlq?iZ|l{VbMWd62d;C&vr*G-xmKL>2(E2FeeCBN zXP(`F`$qnocYY4EG@%t@Ac@gh*TF$}0nZCrm@gQzXW+R79I+-azlgKYM9wl2mzI0M z3cO|j`e2W`SI0<_W2-sv?@I%@;oqAEB>$63lD4@PY1K_mvFp8F{|Gw35W-Rc^2v`v88O`*yh&=Hn#L zp$(Wn^KgtLIi?EuU+VYsjdRPtCk;scClx1cLp1{tq-~8vZ6WUmz^4SbJm7?b*ggn8 zZ9q;BnvjNA0=%XvFprLq^T#gKsswmV0#Dl-;%{hR$Ice`>;V9Du>+iMYh<7?MujHO zf&yzp!4Hk>hUU`;f`8Tk`~Yi9aTfi;1Zz$>S>;{QLJz%e?XL+7n9tCkBzWzOsQT7!7QVA_0#TY0R^!KFzU>PrW`>o!Uq6 zmZpFlr`aL<$}M%^J#|fh_BI1s7*Pi5>6+LAO>C)e*Tq)Wi2^jS)q^g!K^GEA6DIGF z9s>W^4)A=zUc>9oQ&XKV4ciRVJ%(8PjhJ&b)dYAn1M87Z3ak$W)(LbWy}{s}y@LH^o0zpMGgE(8;FiI@cNCI0Ky8Fa)`B z0_%W#gA~k@Nyt0*8s_b&G)9hkolDT zAZk|DDc34P@y4SY?sn__hwK|9cg&v&@|Y>MZO2UE^XeFiI!5a57z+0XYK>xOB-N$< znSak3xEub>8j$?Q6(sG;5TL9Hp@@Ms4AzE%T_a*|XYh`?Z~>0rWH1Jx9^u*SAr7eQ ze!f{>75jk=4AqbDXy}7S_Mjc8b6ahr#%1roTzTV*xp4<*(srC1ytw1bcDyTE?@Q(J z&8~<6xn}C-x>k~FC-exmwQ&!`2G|2+e_+>A%Ggjh_3v2&cgw%hK+@89IuZL3X{$<; zwwe)aLK(yi)`o&fBj8CKhBqD^=>!~`OToW!9eaiH5FV9>@M!pmZLZ;Y$E*`i8i5{| z`<-0#@Dj#u)UWOMG&q#UGCE`IVgk71V^@0_;LR<-<34u)k5~`s0Ebu$$zzqa;~HOJ zt*U@^scoHW#OR&nx`o#+tOuKK7~TPIN*+^&_HO3>Uvcg{IzG?tUhvNv;N!n1VhWJ9 zvV?(>(1JoK#0t=cJB@6t25-lD@c`z^y~sEF`zF+>%}adyNUk-)eIfszB+TEtfMj_0 ze(+`ka*V%82e{hr2Kak57l1>ocXTjk3gC^olfW?wtaCg9YaR{j9Uc8JD)h(k0)V~5 z`8zetW67gS`{3VkF7U4Qh54<401c=VtV z=^=r5+`ZDkb^<_NH^)J8$bg;1B=)Xh7#b zKWWPgn@|L?ffYre2ZaYnBikB~*xd?ftpl}hUwfF>A?Db;9x>J;ydGhg`&aNKT!49w z*8$Gpb%6x>ox|=h0{jnyKA}PG71Vbt>;tKot9adl^>6aX5;p$*(SX1F`_h2qf9%_& zEiFXaGKEhOD}06+Sk8FBG_n>wDb|ew_0MYyd7O#Y9!J2_5%A&`;OK|~j{os7Kr@bF z+Xi!AgPtbS1Ne9HaWeE4^0+DMAagW6XO!e!pzq+hQ3v;s;GKJzjkRrSo8*zj9QgO8 zf!y%#O#?~G(Ep8jle8rt0UzsFig9T{1D{}2Q2O9e>4V4LOCuiUn=gamp|x?W3dbZ+ zQ-Y68W`es+9P_tfEMg~QVLNM_9~h7K0GW6%ABRRA3-pgVz^&}((1YNZh_;8KKY#<3z~yP4b8$;C~r0?`C-F2Xo86Ck^QQzfRiX4*>Lm z3QInO7R+FMC_JD#;kC;aQEfRasK0R?r{S9CHVUwFF=1F_JMZ=?l-v) zby(MUSleu_sjpR-^L4Iko8;kz4gPOB@bAe7^1{D64M_e+y+YcecMYHyT%_IIe$_hka_|-?s+x%D=M)B>y8{B5lDtIu>GFn9l_Ch6@e+FKc9VNz4maqw;rB z=?r|IaT?s7ndykr({(RkeH_8O&hI}6ACcd8VP4sf`seiquW{wEk}?<>A>{TLiJxnm zWIQ)g_kZSI!Sh^jH~gD5p!5GcY4gzoC@gpjT2Mf5xIp25TO(peL-39|Ryc+^-F9x+ zT<|^tbv{7vBUv8|K1Q&kfzCG{3zf%7xDQb%g;=39Vj#E2(V&s!p#|OW@7V|LmVc#z zq-Ak*V#Kqg&3hGi%>?uW^BHfL@IS5*tYgIi__zGd0&79^?ZoE-otusM06l{I4h#IN zk^8sR;P!V||0WOl$OHfGHE=KZXAMaHhdoW&T+9J;Up4_f!CV7U8?28%fJS&7yA|uM zZFNx7=*2cxg}1}wdHsKwj|G7LeOQ}stU~%4=l5CLBo8S-`?hfZue{%Rbes$B75}?< z{Wt7M(q>~0nEe82a}-`gtN?AyVSW5THNtCI_H#boxrEof=w0)?{)JxhaGWH0@cWYg zo41^KH*ecDa8LOk`Z#H`o-u&AV79_@h!t2L53)x7xBJ%QLGRl5_pE{Y#Q%_gla>e% zka!BCfmu&O6ADTnJSu&tQE7z72VEx*=GrECU_J-_eQDrc)&HKAQz@?Ai%O%Her z`+ebUyvG$YvCli+p_#4j1@hr@{6uTKPoY(Q{G1b7W7`4mV%tB=!29fY4>5!Hso3*4 zs?IC4f7?o8-W9y{0{4o4?g7p4^?jjw{imND&m;46osmEHAX4`t)9+XA`CjGb=a%Tt zw)Fg5OMbSk9p52#k2~LeM~=9IZCBjBbBA1U8~Yq_>-KGO#Vzb}#LZi`z_UBp`SV6EJ>l!#w0T<>{1N*BS0C`fe`EA2KQnLl62AHX^}46E zp!5Fww>G>V8gSna{(e27T?5}-`Q~Tv-`L{eKfG4sV$Q|O_mX?{S&Cy{qchi@wgVc- z&Dv1cz{yi5FEhs;=(pgt(4(10GZbg{di2G;dfgM}&iiwx0q@6$9FGzGF@4~`!2=o0 zu^0XeC+$kwe6M*of1cvl*XYc(r|p0ST#pZVI!3f<^QO(nv+X(O_%$(ip z*cbQwy1&N;SQr0&4R}62<#{WU*xY3xE?3wW5@m;Cv@)vSFT?Dv3&XRUBUlTzW6sZP>3~P_`rRe z3;rk?u=CH~9p1eU_^SawzAF%^ds9;l?hEAOnF61TqlF zKp+Ew3kgU$r`JKjyssi{tBmb>6=1`1&J( zZHI&e^5KvUOCTSCe3&y3(1SS}mfycVoc-K++j%~4oAOnF61TqlFKp+Ew3Y2!k)o- z-uZw}fFPh`0DkA71akEmPyl!X*GK+iz`%hI`9pErc5VO4Kl}Xi&({N5Bkqc^H^#mg zZ7^@=HO}kL@!#Rk&-(j5e?BV@@9Bx(-x2s6KO0`OXwer(j2Q8-HxA~_pZ{=)5+#bi z^UgaXTD5MqDlR@gb;;7DCpT`|bZN`htzU21y2SyTw`}>Eu|?e*C29_znex857peZ6*_ zj&;V!+xB>^{`y*s0P=Qj%G9YDgNF=BDp|7RG;q+efB*i^c*_5**|Q(2S+i#GTD58| zI(+2tHC&r0bll;4*CEzNT!Stc`aSLRn6FjBy$c0HzefEgV#Y1Lf4N{7_bWsEtr36A z`}z5nf}zJZ5Z~bU@N@6Q^&7nXE%B(wHxOS(%(y|HwJ-&wc zD)uw35w4#U40DWa`sT_N!ElVP82i8B*XZkSz7Y&_jBWbr>#qgF9G^aO=9lp?F&PC5 z792Ec^yojk<6zXNQIA)sP+>sE;fx#lJ!CxP|F+-xS6t}%cjiLn+?;=o?fK_8ulZLT zR;twa^qJ2b}k(CuWEtopmOEP9ns%B>dZlzGG!WNW@dh6zmC%JehRMF&N^N@%^cX_ zc)hgy`>N{q&SBqih5f$j?w_}1fA%hWk1MV-H|$RyaE(2ReaQo^vQM!;d4TjH_9GAA zI&hDXqed-k(W1pm&iO~b+4;i73%8(m!5kpp?D>f0^{KXzwa+m7zd2?Oe9r~C7b*So zoWLA7&IOKMgdFGEi#+RJ*2Z1T1*#Tu??uxS61KK#-TH0k{8y<`We_y;tFQd?oUG?x z`H_Efu{$sFoqzwl$Z`I)&&#?u+2>=&xxjxfg3j~oMb2~a(q+pIweQfOfOGyMA|l3` zukpA0kn8;(9lglWhxA&=jThPP`itr;piR=0%QkGkcEGymNdv zeW`CRQu8m@0`h;dOLX*I=U?%0H(r#x{Co2v_v-@3{L6KNZEfJ53*UWF-n_`(mva82 zJ>=i)Kjzr(MUFj@&Vl(JcCZ>(-v^>LLHgwa5H#oH>Zrw|ZV|X#IlN*ycsx zCEC>XC9$d9%VKl;S7=LzSH+f&uZgW4U#D%I-Vob5y(zYLd5d;*d0Xs=en;%=nvZsN z%O`er%P)3yf0uUkcu(x^`9AIL`GMH;MFElA>qAQJ{gFuN^RY>4=hXv1{D>IgM))8ZAdYZHng}%A6kMA4J#=Q4KF1!MwF(*BTI|JBZI|} zQ6b{U=(2QlOsF_IHWZJRE=O78%Hz?|VR-y-I316vfJezzz@vsM(aHGA;^c%X;?#ty zbZTNXkv*xJI6b*K0piS*8sf~rZfmi8ZkJl)z=j)W-^G!O`>n+OY&3K0n z_sK^``sD}Sqoe)br_2HGQ`W!&bZpRvbR5r3JU*l#of!HFogDTFof`frWsmrbvPTxC z)1!*gnbARXW=s&B8(W;tjVnRt$CsoFF{SBZY%pDn3#Od-5V|y>EM1-$N?%PXPhU+A zqpzog(>GHq(3NQw>B{s*m&fSpPb{=jTs2)WWK`Xj)p!B9_*+h-JX?Iu=?{$0Ak&tLj<^5MM?D zQ5ISgWf5!ZJtWqFFF>qs@QB#Z@K50FPXfG&&ERcIlfQ_q;0>IKZO#8Km^W}HcC`GL zki4~iOzdj?xY*6SwR=+RY4?<1-oTki>G&)js}A0}ynsg|z9{xf-d+|5y1gO}c7K)9 zdb}>udcGmjzj#yVyuB?l`n)5K^kvT86-WEOCz!L$fggyhK_7}^gPF6B#qps91#@e?D(?W}C zS_ETBEeipPGXiHqat6Lug0Iz)76O61O z182?t&b1~`Yr?2Ck<{ujk<|Ket~G&L17}Z4&XPNrIP3hpVBVZLL#=_c*O@b}HF2o- z+v0E^)LP$s0=34R(a{0#3xhK{HW<7O`AD3=b81m*f;l^ZXIAeRQQgSD`@Ym${>}H| zbH4Z5ir8q13%5wbW1LXILKA^W6)iLwm{Li{w8|D@Oa~IGSZD^Ls)Z5_fIk9%WbjAK zoxvZ0KUxTYJ6a4F{1NI+!l*ey%`tzpngI?`ceDmri`rXP&qC|#J*0ajd{TL(QFGEO z*(VMD46po`;g#@7oj=1XpEA4>KH2eEn^&Ud46kILe1*8?*eehAc%3#42&a=r515V{ zU2*UtfBZ+E2OPa<8S+0Y#3F_RBg#t9$WV(I1&l6dp)utwVk|JOyoCTUKFlIw!YmXU zZV}*3#Dgn9fHN@>e1SJ%@Fu2KvIv7SF};dKNZzVi#7uyBFohnfR#t~JNJ88x?9 z)g0h74Y5ehByVLc#Jm}t(P;1n&S)&SVvGlG24@1Cah*xt zxXu9POvqXTSEx1SjO&bflYD_QfjVQ(q)*zsQgH^}WSzk;4XR_N#5eqRo16_(*D4G#u zp>9C;Vmf*hw@^>u3!qmC3-c$@x1@y_;E%u`b0@*v8T=9WqoDw}Bh(yoCjtHlHAhCx z5o(S(B*`B}S#zj6<(0}OoxRfFPkJTSoAOG@pU$E5Nt;(HpTwwq(w$c>>{ysi95MTk z`55*U!uORP`yb>S{m=KptbY}A{y+c3A{Z@!R)s7C@F-e;Y9W9}(FQRf+5+u9vk)NK z1I$~;!WIF}1asE8s6|NLf-IsdVDKiuoiI2PU!dM3Z>r{W&V;NxRdc92$r)BG#>6cM{*fxa~jf_s4a;FD~alD(GKSr`Y3EH|XCou2=L?VnkxQPSE32tJo7% zy~NX0t;Dmya}-hXS!_Q;HL$N{@u#R(@h7Qv@h7NG@&8a=d`@Js$0(}Uzo|ZczCp2n zQKO(osd3OhsY%d3s9Dh8sYTG=s8!Hks6&y5WUVn@24@7$s2l2x(SxCC4K-$PM({~u zpJZ^I^*8ElAVyVdTxYV@bg!i0s51sQlXd1$YdUA_lM=D|{HFILJimdvgw}-#{%@Lp z&HBGe_>TXSr~I@2b^O53s&uFY&VTukH$>^O`6Plv^V8kN{(eR}t zXkrUp|DL|bME*VMU*%t~1K0eAR(S8fl7F8(m(5RQ%Dy8)Lf#UgA#YOoGOvlS;MYWW z@T;Oi=~uwn%c2rcx%5j^rSyxUYUvk5wbIX1M5*URjZ)8vx}~3{2IZd>jl!Q3O~Rig zKr{`1Ml=h5hMI*xEt&%@!k;2Qd>;O!XjT3{)VkbbqHXBEM2E7EQm2rAh%RORCcQGI znack)t^r<$IrKu_^3QoU!~9HF)_-Wl_lY(8KaXDW_LWaR(B)W4G#2A6wR1cw3P?}=b&26-09vk0m435C@AOoTKnEXp=2LOl8#hvNNV zO@ltL$Wwv32sA0j$+uR!tr>I(Ef4(Ak^y~vyXo&Cq0 z|E00rSpRQ*inGqI76};m+&b?PIU;dq00J=bC>{r4K}zsvmNmsZ6bc zqD^#!>pP@YL0Ri%sum#DB=kwh9ryt__Q%)wy{zY|A5xhb_&uy= z{(Sy@@Q)DWx@^ND#5v3@plhnvp)9rkq6+mISc^EvLq|l>h*9-v%-DuBetaXKu?rI7 z8qtQS4d_5ZB<+o>MjIzb)4A;99?xr8@1_4i&e8w;Ak6-w;dA8@j5lxCgzT+E; zHB%Z;()9Ww9XUTc$DVVC{LhM_SlDV$y8m&vqn(lzQ zhTbTueOU@?5|r!D$*rI8`!PRK$KF-pC3U2axbqL^eb6|~if>3OCpVxy3H9l4Vm&%B zJBrTFjUvvqH=IWPQx*)O3+J*uo?nM^uTSCG7q07H2mSxZeW-&MasF$yDk=K~r7IrY z$3;YiX2nFC9+ha+=msuzJ$7s(8aS-3=-j6&HRu>B`-sZu+rm*_@Q7S_nECgY$Glku zpVOpEnCL&G4r|=SPh#OAlVTc*gt&$@E3Sc9G@-uOIHew?PLC8>iFL%qIdur&QRK+D zF5I92H+$*hpMj*PD`;j)nfS`P@^U1K>lB=Tsp7C%bj;?lu2< z9XNWC%zw)gKJ(9gTFutMqAPj@)UnqZS6+)bPV^mIo4WRkV2=>3yH}*<(cz+T=klU{ z$55(^{tkH+{Mqg}=l!kPmk=@i%8IEYBPecsLlMVbjXcket4|9j)DtTv))VU|N7A;b zbw%p5I^xKTT9lnwQ(T-~Q{>F9Nj&OtEyT4D*FyelBj>e||JqKmi6e0F&5AbS&YscY z=D|c${_W=)nR_8``8PjL%h`(z{rmKdrd`5l(C|p^$y|B`=UVr)&Af5XF=|W$8Zo*) z4If#LMh>q{BL`Qd#_jAL7~Z4^b?j7<77s5+X_G3^*%?(Rdqy?Nm|lZ25^B&<;P{N{ zbZTaGI+IwPF3gIc92=@5HZU8bL=B8))Wo(E=G3AbiQ4qdvKI8+o)Prx(OG28UPiYL z&ZOieV+{XM=l(jL>#O@uZuGBv5%)hmdROMY0sTWMS?8?DDxa4Wwc7+!i>?*Kpka|N z^=_ZbT>A>8e|`_g6QJAaG4;iqxF}jXv9{PfrMk$NRuy@zBreXVC~{_0q|?(Yi1nk( ziN(W1>CmKb?5`wpW>&&E2zbxT%7`l?t}J7@omd6iRj^$}a6G>k$X)La+Y$a~*=ubbVPZHJ> z^M!VD5m`?z64q0T#LWZKkpIz!|Je0!_9D;vua5rbN7?_F{YS-|{~7U(1$2r2AxioM zJOe&kSFldK3a}V)D@-X@(EnfVVl_<31bI5vpj<6n|E3^~y$a-QPxR@ty z?!$RYi$@8}zaGzZ^pyYV)vKfb@%*g6bj-iVf1W+Xo!7)b^ULFF)4|D=D0^CY%9$Pt zl%t#kGq69wj4*6F0lY9bj;Mfb0JZVW!n$;8Lr3~~?{NApBaXDAlYq$vrjQl!uLsA{ z_q+Ph54#4?kI6&n=Y6B-*YsHW?eHYBW=)e^fihnJ^R`pgE?_B`%7#jt&OiPj!r30 z7pIjG7pH}YoarHmLlBom9Eup{b4)kl>7j^2Q48hh;`DNe%OS?kn&Qi|Sl`vfH;bV0 zRZYd6O`XI~yZZ_2p>bqA94oAc<2 zCnE+onNx%{b1GugOXf7h(}b2a9knxE){d5yfOrPt8RBN@c;tV$K>nrv`T7Iyfz0Qc zBL8mtAIJRvg#0^t5$7L0o9rdcd5({5B3350qz!Xhi>(XVi1l+?)8d5B#pL*=($iyO z8jHlq&BeMot!VfB<|1QGq&PRTB6N;(W~Sl1r)fBcW?C>}wbjPtMi*ez53_3LlsbsjGH@9shW>RH6@o;hjc z-{wE;9ZM2g(5bZ@=+4e)`f*n``ejcyjNR$xj;{38mS{S*rX!tM-x#PWLI1a> zJN>#Vnts{QiGJGFo_^fYmcHB2f^M&EO5d((K-ZVmrz?wV)7SH=(WON86Znt>{AUI* zGmI|JsZ7^aG@v_MJJHXn1K}GZpyP4yl2`-mFF?y2!`v~p8K(eL{g=WV=voXkNjQA~M955E~cxV$^MvkpVq2Eks z8Tqwl!b>utU*y-C1ubX6OS0f4S@06ZG5EHGLSo0r}5DZjZqa0PPs^DPzthyjkV)xH&fRdK`H@ju@j3ZKWOUP!+MP7U-Y-bY7)jdU(WD(23m<@gAa??};rwVPQRB!N=a=)S zo#JhMpWyul9N#~K1oFmt`z!!k1FvNvY63Mr$fO2^?7W_ZHT)fkMj| z4i3hk4q}8jh1{No{*J+Cj*QXw9~~z|7W_U7eGDL&EBKFgd?MZtu1-Uj2E-ZU=ge%u z5ND7>8P7qC{GFMD{VGN;e|DY_XXg=*uJL^A$9jw3!=IDQ>j2an&o%H$En|$hxvd9| zfA;sFf4)}#n((22FZo|amzQ(?z2%(q49`KnJ>^`_J95oA--~%*Zx8rC{AVxbg1tN! z^c32@UZkZB#=nj8jNF0?>%jq-Bj8ayrVnKhwz03j&<+kD?I80uQix3Ok`3=TYvl8s z%G-P)&Mh!-#VcU#W)eSw^RK~{{`eZ4Rj^uoUhb28^T4fFDWzCvyv=!5+n_eIU2&XU?; z{%I$)UF?adN#>MmClhn^am=^bGm%^9{52-+*U?x1 z+&!3IcD5vK$LBgYR!C~2f9@gF$KjEL3tvcNjwf*}9-cpq@Z|}Ki;GEITJD4u*amWz z!OP$&=-s%l(_zeG=DH!plrp~$LH~UJ5I5K5-yqzd#bf_z zXkX~hr+1tSWd0M&2K5q_NMxNyvFah?r1KoJ3mKlw3T%Njc|RzF9t!w+$Tp_stEhDS2LRseg5U3e3BvUi7*^{(bt7 zJ^ywulKG!eN?6xd2C4{cV|CKD*26s99(m;4B8Qw)Be&YYzSs}Fa^3)O5E@o-T7Sg- zg-B!HhR1*(Z71@!rJk^E0k>P~lXY_x;wZ#Xq-|@2ytWY9)<$IAia7|-wl+lE5HVic zhW+5g&Px--ikoJ3Zn#FcU*O+;ViM+w1b93A{4{!>(}^;c-m7sWm(fF`y;2 zMcfuKINhas@AkU)Nse%wZhZ^nzZdd<#&&-YxB2hk{`imbA2t5;^UpRPlKG!rjI=f3 zq^)JZizF(NwyrX18>;EpR1J{N!!k7qGLx>_z|O-0n`rH&(0Pmz_WG&yHLNVC$2l8 z>j54DZ{htmz-xCg+8Jn%5m3Fi9C;uAOk29Ot|_I=>jnQgV_c{2dQGhK9}oF=_8)!w zXTlml$ox+$EUaIa1ww`PWhhy{EGMjM$_Z^vd9to4k2p+7Zg#>G(gzBWF@&^3Lj*%) zz>hP~)9iznBq1N$q1!EyWZh6ruc!4@$-2HO;;MqVv~GwH3~fUM;_8U23+Ba&T3~SA ztvg#lkFD@|tkc$rp;`F9)a)+kmi-5L;Zgd@Zs>M5`e%T1X!8@SUu=CH<`(N7?xnG= z=Q&>W(pbw_lil=n{5j|W7`N6nqm;Q{82VTD%8~b!;^PtUA;W)ik$>eyy#Bf{wUDr` zDlM$5gN3#_n5?TY9{}3w5O5J9xzWBXOB(yr0r>xs5$MyQ@*Q{MA*{bHO#Ya(6~%!P zq^(paN!lu4Whsn|(mK|Lk=We|wF=MO4$oKzzXDGZ%#lPWMn*aK8l$`p{H(UdfZ6N# zGk88oY7Q=e6x9BH^jimj{ph(E2ha;Rfcqx{2YE!_#o#&12J`{k3-ElE<^k#b@EW5( zY3YmsdhZABnSWl7-da_gQs#7{OBa;?nC};&dlB+~%1i#a_p$Xq>_0aB??C=1eITsM zi%4k8i;{JDQDI#XB(xPlWL;4VaWTZj$-1(*u&yj2m?IvoD@zLI$hxW&>ZcUq(uhlA z(e`dfxCD=bX#@Y|>v7*1=^}MXN6!=wA zOL22WbxN7tRUrRP_bRe`kq`ZQ$v^yO;=97S6dts!kkFQWO4encBK{2VXW#;J1E4K0 zg4p0_1vpxvI4Y)dv=SVx)H!nHr=-D8DanuINcxrV8_d$9J~4o}=%SKM4)1^JJb`B(Q)bG~mB?(68$e}4J(7gBKcphLX= zihrB5#UBD6k+y^ZKawbj5m@?(fkGG=pAz$=<1>tm!lW%{6fsZ~BO?gD#z2oH!9Hg| zd7bn*_Bw#QZcSPALUrMDElI$0IQQb{D6F@}0ONFIVN^JVby$`Ghd2iB#X1e%BCxI$ zm>XEv+D`OQJJC{L&vA$Xl8>nX_aJfoggz~|Or4%viWX-jSN z?2VyK=#n*`ITpu*#^M-4ERI7@5aQ%S9IKp&V>mcYXO6*z^r8LTh1l1PbC2~!q^Ykf zk2nlHUKn}>^bMGYtQ*mvai6gkeZyM4Z@9U*9Hq?a4E>+=cn?9=e-F>|uk;^}`Hy*3 zSQoq_tP9@}+QNKfU6>DXe#H3^!FD8x_gCjs&T)@uJ5^%KSLxZ1>41PWa z7moZeH`+3A1iy3P2sNa8UJ=9d*yord%tc?KC)?EwUV(MrA_b&cRTjp<;BfKA;^Cx zBmXyz``Ov=r^#OAE&s}UoJaN|=|AINAZ^|oI_AGgn#5Ze72r<`81ER!hYrU=s3mNWHq+}p9o8D8hy+hI=P-a%Vk#y|+h5W2OX6s06~fd8B|-P6(W z{%Pz#xzWF>g+n`*(uHx)3hUgLfmeh!_Z70vMLhu8yw}J&?=@ka_d4R&5yPkEzaf|( z>-;wnzlHcMvMzWF_4Br1j<}APC+h;Pp?pRSKv*JSibSoiU~Ap4p_1BBQQkKY!B9t{1MLoFG7o%B2I>)7wO zuVcUCzOJ}qUk9GJzvI5{=KNyFe|snWJKnd;oBoyOtDN(;ilzR?JT0uVUl7(gF9>bU zi)5YiBH|Yjzl8WD$&EJmW$^Nf!O^SW0vrJj9L;|Nyf8mJGCyyE3uk`bmR_eV1V_^6 zoH$zKh9l{7JQwL4Np4o4A6vow7<#jHSW_@3YvJds(PMG{Cg&lZkDU8Do|Dkmp}(^( zM~~-@BjtAnM>ppdM*iE0%NN=ImH%-5ReVF>9@ifI-`RJ}+Zo*djDDQ7#HWF0NSmeb zEMmrUI%YplngqORHseKNu9zb`UMA*=Ye>hd7y;Cgj@L0VoV|`c&)Ms8<98;n^XYe< zdOPm%oclYyx4Sjx6H1-ghLC^U1J(Jyvbql;|9SGCjGZfJOV?*a`k)te41ST)2O}Q* z5(Dwe7$xlSkXI1Dg8jgdR|yblK>85eS82#=wlQr8?)x(IbxIqG`}P3oL*GFB24dX9 zXPAoLMEoYD4SQ2C(uci;_$|b5i}c}dBYxY6-$DG2NE@yreMCM=8=eo_`S8B{i1UlI z5&1>>h<7P%#Jh;!73m}2L;N1%_Yl9Y$0Og@V~lAMA5hxJ4-f;R3Lq|k7#Q^-0X&L5 zgWji&6Ix0At9zUBJ!S3s|JJMiz4_10>tECPqr1e#tli>5rUV%yZ#%|#-vu3HjJz#> zo<9Rnu^Q#Rb9n9C5k?XLJUYZ@vH$GhB%x!cDc1L&!D|4WIlL324f=Klwlj7TfN=){ zu^h!|>_2^Ir!atc2Vw~sXCns47!hwryq!mpoxYt;rEeFElWE)O%&|0a9pCe+{5#*< zH?RI<_9A0W;5C94Z_wu;p`6?|@^GjQG=pL@sWKe~l}P4W+XeUuCA_bhU} zcN*^Lh3onGKC)&w-pes}_mt)P%i8a8?d|^7&OU@^9^}b?jGU|E6SjHTe2mCB=6t(5 zr^~dTbL?`?HRqqN1N3w)pmA*)=TzP=jk!=UbD-{>#-pBh{a&&v*6(Yr?s0t^_gT~L zaqZ82W%=IL{@vqR-n*CAVYXUeFGBu3&cELL$5Z}|pJ9#5@9w!KRLph2-yJXqrktB& zxB2IqaK8SDbIvtk#~8{N48CLpm4s@6eb7XE^(hdD}lPa`hpd1Lj1*)sHy;cHB=dvftmD zy@>tC-T7}3)gwkCH&)iOS?elRBfswHJ@|Rs@gnD#^Uig^P_Y_~{cdaF?!1Wo$L>e& zYQb6m_uGqb{!bR}KU2{8{@azSRPGIazW0<{fAVi|WAh(u+hTLBRjfvD`NwN{_9FHs zU-@TWvU^eP=7PL<(X!>s_Tc{8?>Xlm&tGVkb1COC=lO2HIrjw4w>NOEJ;7T~q|XcP zd!pQVk)sdkwUC?pTl?yZZqoFG>5Dpc>iC*-{)-hW7QX+${tVWzS?elRBfswHJ?8z$ zvrjKF>)#wJ&GQ^=j_qFLI2Sw4%l5gL^{?h*$69cli<2?gw+ORjfvT^KZP*=0DiB#VXfoM2>B90>|c@yNkW| zrS`tabN=1;rT5#5j-NPju0q9%Var!6|C4k6=P#K5NN{j)5XMdDgCz%?^Spxd?G2oJ zPq<&}Ge<9S?TPd{P<_$edXas7hI8S5JDPbkr$K`T1DZE){!i!Jt8IAGqu`(@*TKI1 z`!X(FzH|xo@E!7Gy_fno)q+b;WUdAHjmKK>~+;5sG*k@IH63+UI4gT&2pu z@bK^sA!S4ARjgR?QwfjehjvXKE z+`03kUAlC66z7IKisysNkz*aa-vGZSm*|Z5JEAkT0sKy9bizJIbiy{!$vrw^zbiUE z+7bUIMu!d^9&OjY{iAK#wE0J?R;~VubB`YOMJT=_{d>WJ1wVe_g%`>L)t`U<`MMY# z;LpDM^`86mxi#=_4FBMR4?e9M8TqKE98H@({m=OQkvLy#M$eu-H;*1OCM`ZbJ`>1N zh(ioy#>K~BG$Af7GcFF>c4WpPwj&mCEcRiHwINf*G1zAyQy*in9g{UaCMGi`2C)I& z26(?6hw+_l-KEQxX5+jQ4d=7)Ii@&Q`Zmrpy^UCh`kt82Q87cEtAf$E zenY=@fUh4=z<2q4POou)5B<7szSoTcuJOaO2lRX1;C>Uv^X~O~F!Ft1)xBVids5q; zlfuu+(w`HgKd%YTOqb8i(w}#)KTDdQAIi^CSKw`c%=qf-uf@t$tImgohj#?84(ECF z>(}pj=w-e7K3$z(rRPVUgKNr>ex9@Y{K#{AI48!r&F1{**L$fPsq3#*et1;(q~Tm~ zjyPW`H|G49bEM~opDCc8XJyV0?^DlvcFYf+|Ll?<&QZdQ8GGTs`OF%Mii!%(%*y&& zod?DFv7dLK&O=igQu(o;b7t2M=SM&1$*v_mNBZ?B=4%r9{v=9Ix{e(4qx59IkF&a` zu>1Vja%9qvT~kUsJlgeS&k^T_^@Kd!tW~>qq&Yt=KL5PV*WY~oL+4x54%ezR#8uWLnV{bjnKk4Hepa7*Kr8G!PLSTiT5$m9M*)4!Fmry; zL$p!n8k)~NH|q(pi)XW6yYph>7(vRs@9Z#)cxYP&K&((d6Lo&kFI{C zKVumC`8C6%9sOF>9M=~Eeby**e$b2A@?$<1&72=c&vu;CbUk_YBd#;ll!Irh{3yT1 zHauC?oXU}!&-5Izo>Z-=I%6&Q@FUKNgC`l9vdw4y=SM$(QswAd+}G)=3)%G5g;Qo= zpTjm?K7UF8JQ_HO?UQtgaZcfcxODCWwt=%JDCg`60q|(U#WUu8$FcvoxOnC`nP6-m zqYI~P5T=;UXCD&)j|Q?ZW{Gpza^#p0V>^>BCYnyM9O;yM08Px)r3&-3!u|9-oLUJqyv+o}bdTFFvE~y$Xx%y^GL}K1FFq z-yquAuNWouFD{b$m!Mq(O49CurD^w|(qhlxU`ifR2EaWMhL#nncz(!UJhx@0t7-5RTNQ#03$$P zid*bB&KpZ-|7)EyXYSmq3ogn3<$LqN^K8z{m2~IqHG9s?oU`{@YGV|%-&>VXn_J(Z zwDxNRz8^j}oo*f-Rvac`>AAC^&P#+OxRCze-858mP<_Q=PHff2;;RW4z-J-YdKK z^2K!?xsIXjOQ)&@9^LQ7O+sWzlMn^HcA;MT3R*K)tDQRSvNrq{Ne;h-xQfwezfFLv zY-$Z$+uR{3ZSRyV?e3D)_V*B10j>gE1-QzNF88UO-5wC&DjD4$l#HGatE^rnWq0pK zWKW;piG!;ER{^d9Tt(wL=xG720$e3$h{jcbs~jKsk^on6a24Pxr^mf1#5HeR8A)F{ z$$5VCe})W2IeI$l*W zV%38y#{t>Y>UP06;KZv3*N!?~)wWK*l z8uZY>rv5y%%&iu-)xp*p*pBYJ8e%l(t^T!g_2!{7Kia1?Z*=CNH4khRG|P!C_2m_G z%84suR?UF6Jg}v{JaJWVFs&;OTs5{0LR2EHVTekCAznEasD+I~)FR?)#sReqaZ6k= z4iH<$tOB;$Qs<2dcy=_;lEKFxQ$NA@u||A4z8WI5PO#3fF0X|sm~{P1h;(x-`t=ai zhpR;EG+o@2pu;)=Kht`dWBz!?jaXDndMssxM&DT$-};>SEg zB7S=J_Pf8E@yD&f_2Gl-t4Y}hq*1xwNMq=-bGvcb2UNpy4+^x}rEZ1aN}US7L;HxT zhwb|1OG*QL-mv^bs!{m|r7`}lNx5H3Q&_Wd52)tl?w9a#_eo^AUrFn-KUW>f+%28T z+$mj3myqbvw@J^^x45_>UWG9WT*c9Dm-nF8uC?2}xSE(1;!4eS#w>6Z#H);{8X{w1 z#PvgeT=jUcDIpj>SAyc>sfF^xr)ssQ{WNy1&aqc_H}JE-eXEOH>~E?(Ezn+gku=cQiLXQe^dpQKUar&OC7zmeql(aw86-_3mQ zAi?m#n8TVmKjZiVd|d5q_V53gS&eNRzj9q@Yy$_absSDjVxvE5H7T#xLZ4FWmWOqz zq#~lLs8&6zDd;q+j{Rz>0sW!pH-BQlyFW3ytbk9k=R+GmY|S>bvDYU7A81;8&a-~|}pEn20O?!VFV zhJL!%_ol|T))9Y|y5Fi2^}m5*@oSMw$=hOi=IA{%7ivfMN+x9q)7PU0$R6$zz ztS-Ppy+5L<*8Fxb(E4FkH*e~sRuT*C=_S*nWasQiIW{*!@{_{VvG|s9D1BW3K4uQG z7(RV^cd>P278|z5_ia=4p-CLt9DZ0$bLwpa3va)%tQ`})q1#sZyaNBg|B)_1g6Pz#+py3>Hkd}wiRqW*b&gybfM zLm$_tQB1AeW3$8M(9U4^T$SMX7(Nusf5Nfo_`a>G;afiKTlP1Y@%pAFY@CYHeR=%A$2NeW~$l%xL;jbD3Jp z7Z$dZ&r;r3=eJFkL%TNUbt5ysX7rRf2N^7WEIy_+81edoc6Biyh)c7sm8prY^?Hei z#fEL*zWt0CPKLiTCPYZ=gyt$?d=rWJpteN!#Mt^)X^HMpPR$=#RSwLkEobBF$qCFs z}ya zYbT$lyeHpg$3S;$sVdkGe9|pGuI8&AkG>BdixJ1?(W9Di43rLiYVzJ7-4F)@hcy+% zyI;IqAD>p#&y__}o2%3rjb(pKJvkOvN6yTqF00W3JsDF|_DrjxHFT*9YR&5AQajh` z=Uzx`D3_PDman!ChVJTQ`F76)b#Y+}=;s1AgPppN6ebrJhRc;z9p%f^f%47n3F@Cm zW<%p_0eEH?Lc45{D%dt2_z(-z04k9&O)8*7Z8m?^DY9BdqTu?Y5=jUVE& zb{gjEWfTyC)pL&CE%j6{B-WR!tJ!~ZtBA~z7QBi;MAG@hvI0-hz7<5jJ#_2S) z)1hHVn*p0?OlzCYf`(xXEY_H#Yicw#=cs~|5eoQlZeJVc`K6$j`+R~@fTIB8&iyt38KCNTolQ6ZVK&w?2#IUl*x45v59Eh_8wL$6>LzAFmjT<~?Sj5&#=G)AneVHAWDS$QXAG8ac4ACOAE^Gm z>wUfd?d}osPvYU|S883*qtoCke1~qOwqrBk=M3s!!A}~lFGsgh>w#+hPhg?7DuD%c zK(z)a$DKLgxyH2yeM+lQc`v zbtkDesm;*g zIL^B<_=Rn4v1sGK;SImFAr_2ABDLADO@sfAW~9|Pq-G>c>qS!A(C9`csDe!cG5)OQ znwt|tH^ztKPoOb=uB>SdZM1S0J;K6_e$WJ= zLF?nda0T5it$hc4&|i$1C&8JmwK#FzoFHB?XmNc&R}&cE=kdn)yM9K0ttHZT@Nm!b zSQ55_7_nn~;hHR1*9*^w>pbh%Mn{n25#r~%;}7G<8u7WB3?6%}lZklIdX2rbzKqrY zq7IPO4eSHHWL$5Kwwl!n^y#VLnsfC5hhdzUg!lm_2S$KDdn<-!G35I>>qCS zso4me)R`nv&{kAuaBqf=B3o_H1XR=o)H;A>TTvU((OFc`X~csx__Gl+)GE!vIF>yI z$AbpNo*}AWO*c7=_b(Gab}ifF9br5UI{p9`&3EJCvwxeqyfPdZ^wKz3JwJm(U!yak zwfx@J`Y={wPV2w8`f>xbR-D%FqkbYa<@ODRe#2nua-kiB&(Lb!KBH%)b(N?^dJq~A z(AuMRr8+$qz9%UKeKM5~ojB<6(X>wAxny z-vCIPbpk%g0r;3}Ef_vtZWJ#*pDd~^T1Sey2u5qqU_mVkZ8#=%a*X~Pd?g0tlm`w* z`^{iN9X9?9dXrk)j@oS0CZlE_b)+2qHmzH=tpoPo(t1idF8N&t5LbuB0H6?pOqT{Kp^QW8=qZ^%$h_Nh}XeeDHre zdP3A}fKC*(qNHeR6nOH7XblLjRvI*Fl-3BO9tSlzHZ+3n1Mu}|r4?=rQ(7Nwb8{)8 zE*f>|pocvrk5qOKRT=n9raI`LCHH!E2Dc=53qX?zmi)Exd+pGoU4SZyX~V--7) zuR8h&h$HACSREy;cSSvfjSbKj=!WcqU#Ss@Gw6jlI&ntZ3i=9KC$0wg=WQHPhs5_(0>OFazhAIwacQ7q4ZjZ-w(vxQF8$&IiXjN8759Iz3w3isL?>v#7_YHLWn_ zYaPZx&`iShxF2I3@2|U{+lJ?qf<=wwNc!4h_;5V>A@M_eaykCYhE|0~Q^#t7xOzGs z%_FNVQ4B*z)6K+Ss94Pptr13juoPTlJKnbP#QF%&}xk- zJSUje(U#&ff;Ou!h5eDnsMSZT_&maA6lh8n%&!v!A9Jl;2OrH(Xvb)_I(}lH&*JFc zP;)@*4LI62T4R7Z1Ivwul+lkenm1Pe!RUJ#{RgY*Wpy8jqt?Y+4V@_H5Eg9-$Gx!+ zFaa)({+-rtqJGnnu|aGcKBGaWg&JGb@uKabWp68kXHkx(9sdHT2EF($fxr}y@uDJ+wi&@ zi$*u7G_;&(WwdE+H0sZ#U`(Q35U*Qmq-dR{iFoILruPXv57Bas6`jCm{2l1cX?>>c zZEzje#C2ZF81(~rEmJ#_TAYrCU_oN2j-O!pw0-*eKOgq(+qa9w$7wZ28lUNp`Ltym zO$=9423iSSq6Gw5B|>sjlM zY-uW5GlrUA)bBY>J^5LpjzQmwT4MX&Lu~Xg*XQOittIED53@E@YswkDzp5Aup(O_m zpMr!64n8_JlKI7MKKA$FV=)5nz4~O@Bhae=M%thOEDJS z<7*e*jrR{k96@*LOV8ZpxvFzahl>%|j;Wwj0*HQhtX4~5lF@0gIy%(SA%<3;g&I0m zKSyg&QHM%v=TI}p=;jy=Dx*C`jWDeb=Fwu&I#O#mRzb5Xr5VPl7I=QBqqSN5$HUjO z4w(OVNDUXGG36T*%c_F7*HljWnxJ{vz{l_TF!1_f{LoGw!2N5|eMVbl?r)%@@}LyX zeNef&Dv1wkO_jpLl1gi;Xg!rjgcxc~6_1t*arBErY7#-`#>8PMv_|K~=tMoKb)twP z^}K8>Y7HW-5A~coCRzt{1iLP?6QY!}aVN5Am$x=o1#iyeK*8tBb`C$D=-d z`})0~UJsuOr;e!YGulW-TzijoP#JL@uh#2l*XS-NURvMiw6*M*jE^C+7IsTx_=f_~?DsT{#@5#p@p&yjVBGni02V?fdE!OHe%MX{qt!oH>`t;n+IufvVD2kHb0y755|Jk(XgK8 z#&tBrDOep1@bMd;u^!e5SQHTt8#_+C`0d-z@O$nvB)1)`{H`w>PrSD5^<}s1K4Zsg zj46A4+4wQ7$u}lWHlA!9P4OBLd%byUM2M5ArC}V|crw?Qf6W@}L@>WP%9|gKTICk_ zyTAQVeC)MmaUwnrP8uWlA2=QX2g5mRF*0%F8;^*S!AG~w7-V?PEk<5^%=KokIUlEU z;CN)Nu`gJorE84>>y0c%j3d_3AV2EcuHCxz^WuZL<)-#Z@J7$QczzN`@+ z?|8&GB0gEWvraT=(xiFP{G{8w_;7n|^4b#M@qTf@fB{1j<|Zs%xpHNC^19@MKgg1k z5905G+gf}cU~90CbK-An)*M`|Z8chtt;TkMp$_|?u~le2wrbVEm9DMCwqq;N2G|Ph z)0QkzqS02cVasq#(#X+O5+CpQK%!08~Ar~`z8+m$r#8t@ay>W#_+##EqMQy zFJYBnLt&POG$a%|H~-y4;3fh$5x9xKO$34<(5zXrUxKsoWmrX6jsGH}KQA{43*)0= z(0{F3xBA1g&ptb(W2cTQ2MrpO4nD?gYa_93Y$RI8MxqU{5!mN|1*emi;zgJ|#+po&T zcV3fC@4POX`oAul2fQIE@4hK1@0F1)1ItS4pmMPCvUP9;**3VMYzMdC_Mw#}ZCI$J z4X+|QM^u%aBdbaJ$m){*K@CYCRZ}uX*OH7ewIy?G9myJ7SF*;{lieTImp$Vf$esy} zWbedAvTssjSQFVZ5!`~ATU;(dJ2ng*77+iVdHwtQpP3vF?yy^AedMhI4nf0p*Qx}# z!%A50Fz~UF=k8t)&)xl!4xYPR(Z7+59uG-o&yteW`?mt_Kyuv4zPBHf{r$;tS4y(q zdr}S#1i#&&KN)_zq0h_FVSm>Ab|*%@EV&=ND&P#1yfLo}I0MOTCm&BJCub*?m;A{U z<=m9Ya(-GB0bihiFHpc2D4)dCmdkN<1$=>WEgto?v+K*=)RjT}ALf7k!~ekb-(B$E z;a(G$d#$nNUNgLF;9etFU?A^Wa(IY~+eg3+Ty_rU8gOglas(ROI+7pom*fX@cOoez-`oP8n+XpUza^wRx-E44+A_a z2KC>ILHgQw!vh8`F!F$D-a7DrfnQB?*MYara)61$TPK#cPU8mdx*%MDvdqCv^DA1u zI&cB5C2rtYWV~s9#VEv_=BguZcgU8unp@Fu0D`M74Lo%kx2}d)5&VCMH}d~6-oUHa z_xF<3=TX^{vclma^I>o!|1AbP*Tl;pf4(mn1}-(t^##7K4=mRg_`V#jFL624$e-rm zM*cKnr*U)m(=>M)IMf1h11Ft;lTPEd0I{~ni8pZ4>6o+Jl#Dse^GDpkO$lB~ad{~n z+`vl-{O*w5o0mKOYpy6A2gUs#t>d4*TiXHuEf*bl=)~ordox7(z$^zH`O-93n!`b- zdD6;W!649oaPh-`U;Y&_;Q4R)#@(=cBFtO&@0Av%e<96E z|4N#d{-uOtJEHW@rDf@RC93q#q;=_gq)q9&r5&t8>AR$3={u!!={uxb>D#53#SI*O z#0|WNGQh*#Hz*ixPRudhy!>+G9Nfkmo=MBuC*VRf*D5e0Z=e79H_r-qhxEJt>AyF> z%KBfm>XUvPSYAG?pSJz9Q~|GCjY@wYcOUusBn%vVB`TwbjA z4Zq`Zqj@;wbPVw4^pkvN+D~wV{Xjp#4<-#eR)CMyr5Ct;$mcU^Y$SL{d>l~Zt%;k` zO4iQ^mlcC5$-#^*p1Bi)!T0&k7&v)wmsCgpG)Emc@8}=6+Q7$FjKj>2hsixhzLW{*B@I=bw{%^3X165Wv9|*gx*K>`_&~KPXK)R}yl# z1^b;J^I7e7Wu$%In)3dLX5g!89n@cP*UbY@+j{b}&54kYJsfS;ceXikE#$=EVEzyH zAOGRM$-VVq@O}Q1LyYIddp^js2fj9a?S)5&O5G0S$Z7Y3FlpMkqV#>gk>>64erMd| zC|No^65M0qk~JIt%+(?=3cui21*u{(CW? z|MjnP{-bcd!L8`$ySLBYZE}l^85gO!_XZ6QlfDCLBCbknOlpDmZ^%1%=bKy$oMH`S z%dBRyBc`eBi)$js;v36Zmp{zm5p(&&$RlPr#K^s-Z5~>1uN8n-=JPFs>wn;oM&u5Z=HOIo0q!_*&JFvZ#SikE7|fm=37)K`k}<2H9F40d z`E$T?1j~!9B`FiC%gI>s9$DTn!xg4E!xHL&6U^AfMG^AXt?$V{_Dup$R!4^`%;8#d z_|`sI)>b~>+@E}5;Ovw(Wlh59fc@q!K#DX$r^c{tknb_G{dK6T40iZci82v>$}nt&Uty?nK$ zk9?akObQQ90uRa*$G~fKc$&j)H61NDj=*PS%-}+7igIGX_Y~*YY_xMEf8$WeJ;LkX z&Lx{RnExi1+=qcV|K@(f`%CJA&T=`Ww|te>Pp+o+l_P6c--~e#U+2JQaC*@S@Y%Ih;KJM5Pjh+|9RYun=JSHjIq+8- ze9o~3zscow6n<-i-{kT-#&b`D?=*5(fyYZ5c&pBD9;W>dTwA%G|4u%=uIr)yi)XZy zX}AWCt_G)uhnGroQn|cTeNm?iZUqmI7rDHO_6z|}0P2|GTOsVbLlbqY`F^Z_;Og@7 zbQK*Ve-#aW8r~|j@J}24vp&*K$5+kOH3ytTG+YO{xCR_MziF`JzyEydjr_M5(En>| zTg!JlqTxHZG-#S{2{qZ|6d}jRuHKFr4h`~X6uI171Hgd*4xb~ae%oIZ`TsB4Ldc@u_UvPzt3OW$IpKo2jAyEF`)mS zt^-Gl7+V-HQKu6PH`E#MLuq~~a!gsCDRNCYMlL1S7GfJl{wZR^xH&WdoE2jve^ob+ z|0V{AK{5Zwj!CA^UOROd=RdhM&ZpyNCeC#x{M1}pIL{8Jmf=fz+wdKc^N6N7q;URs z)7~{)Q3r7?>;=b$<&GjgI}+ajDP-XOz?k1!1xdUSz{CE|J7yST}TK2ispyH zHJ(L3Vg4LZK0ggdlsWG__vFW-zr=voh4z1tiKFe{9dY=e$O%=ny%YM4-`PI|=WjIP z1F?a4(dQX_P~?O%22QB6xWDuJI3|Gy$`~+A$N6#i1vwt&bm)Fbdozu7N*AX&a1oFn%BBbt~d06_yfVEUhE_gs+;{ zs1;fmf1cXLv9|adTyxsm!#|8Y*&}eSV@2_r&@qqan>~o5G>pk<;MYn6M*?jJ&J)L~ z9T=x*h^_o3E#d#ZVr%X<_TR*T_CKkDAIFpCBqF~P_$bKl-gxS(&m-grH6 zj0IOy(M}pZcX^NKGce~Et+D7T=N5-M{+qQ{8wWS?-^9STath<$)xcoqB_Wx=OGD+eoY zjJzA*AJIM|7K)O=KcaC8z=#|};Ak>d1Ne~N1(q6#bAUFJptrQRJ~9*rwq;Fh+A6xpsK{ zXv6gmJ|%L3X(Q(ed2+NN-oOpx8hDuW_=E9Mb1rfG<$Wq0=RY+{@)K)HUNQealVJWk zb(tRj5&yAIi{=Y*xNeF(+!*A#DO!g3SWbHlMvP$B#RxdLapc4jIfJ%Ff&-|Z@h=C@ z2}dUyJBIcc?g4&==LC*Ba$8!Mv4__gEI%O>{_oe^6W$oOp8sA9 z^!PXHad3zLgGGOWkrT-90%=a5#m@s98e(M0pFKFe1a2Uh!v~}>(l`af=ndfIiK7km z5D!Cf-f>>@aPP~DgJJAH0dB;jz=p8`zNDgbjQxxu;-?MQ-&$U4_Iks$25!FmITc+0 zz4zr#?M?l+nfS_CgcAA zuKS(17p#Y09EbFn#29koh~tsAifDPQnd>b-uC(L7;UBRWe4qcs;Pes1|FnmsNORKw zhj}m$FHKR>AN=@{{%siXT1)0Q0iSSfXrteZp`dZZamgD;zA-63=2gi%%J}!s$3tFX zvGI>Sd+qcQjQ>;a^W*R_{5`QPuQjBG41j%+MFWn#&V zBYV9)>+tnF=egFL>+ObP60fz_B!A|g<&>ZQCJugx|5q>NOV)}HW$)?<#cdTn3$Q)d z547F*teCCDXWGU)?F7lfzOnIW9b19VwD~^E#J z=XTuexDu$1C=ZU+p_m_=$9KZ-voV-ADrQ(q;d+YKMq__8)>!=vIXBF^@!BZt8ykhz zG2~`5Kig}l*GM+@0b0jCKpSAFSxKf19z1wnj~+dSM&P^$^F0uYoBKBrxQW0`1a2bm z-;IF$$bSyU#+~^FmfO-yd&|vM1MwfjA>W*b+kWKf6!Jv81ZxAcJP|{m#LmrsHxamr zKu`q0ad}6Bh7BHU)Tq(#n}juaG%PIa(XghprcR4(e)a+kbjUh#_ze- zxbdTnJ%&C#+Mq#$-+^=Uf%gUuyfx4Pa4p{V(n~M(j*N^<=+dRj8r1!+rFC(w3$|fh zu5X?3Gh?06!a4`HPWarbJU!o-PpSRdjO z5^e|f(@@LwKYZWwa&H>mP49e%;cO+ht)2VE`VTqnowYz}BG|f1Y9KK;#AuD#Truh% z+I&g2s2!lDxUQu^9i850Jss*vm8Zs5**en$+1X#VYuB!=?f<*)zWYQ@PR?apTZ@`v z@~-OoavyJ~t*Q3)pWM902h)G!gVl7<{r2m>&GBLXz4i0#zpVkV{delZocZL!7A}c6Hr@Pu8-$V8%^wf4>Zf}*H z*juva^_7G3`l>@oZ_ATL{-lkCNsZi^wHnqM(rL?_EZE1IpLVc{-*74^GHJ)lm zm-|(E^siM$_Xic~V%6^6k0{hAD%8ZP{rw+T+3!A~4h?)-9e)2Al{4fyg<4p3e8fxY z#0Re^)WND#W8YAxKP;_K1FOzXs-RH+s!;!`3T9MOsC`waeMLH06P17FBx1;13mAjY z|G5GEH+8-TcO)xY!-+aX<*lVd4WeQl9qJDi>*$uEW^-B75T$E2o8KbzJ30JTf#32` z%iGlk)CI$D)CFt5of^$w!0%tl&aS8lj{Y_3f#G+rk^;YFPe1tm&SP?*|KqG@rQZU- zC39$5_8(&`uLt5Etp7TOR5tpL+Cqg|FNK;+h59%(x=M%|Q#C}5s}`bAi>W454^fk9 zgecUnD%4=A>9s=?Y6eQdAS*Y1{YA6-!C!Km-#d=-VPR?)r zh=af84^Y|O{!g7!-P?cSU$4S%QOEaNL96PZp08HL-|O1Gnw9>bYE^nvYFGTds#EcI zQn%tG`ga=OcNx{*$V4LEC zk7o__h^l$FP=%UAh59G=bNllfwdlM4yKepKs-Yh=SK~g6ay8f|O>Cu5+ox8}Y^iq6 zj#NkIhO7LfaCI)Jg|>r9-POf{b9~OzF~t6ZS6#=y?Y~`nVgKu**34qXmKKKdI%0IV zVqFI?!tqyuSo<@iVA(f{*Kz1|gd@X(=aiSy?9 z_1~@^<)1vH!n;lO3 ztyQF4Th~+lEo-8#w>p_JP4}PAO?-YW-hb-K=xac+|I;V6QmEflh)Fdb{bL`4*$g}n zZJORl9gC@@^5d$jbF*nR9IJ^IHm8|cocfwM`xps zWR9HNI8I%*wI`5XJ=peI;{`tdwQ#H zcJ!0)()+1@?&u@`*w$0N+1f*Wo!U#j+}s`YS6$Q>8@lRk>e2r*8~sK7PGJtTd0Ddq z?Rld?KLgt{wG|#ipPhOgpVs_r=*~mG*Qs5}+r<7~uumC!jW#Xx?lYiwuWL%6*$ORpT~9(ya%v!>cBCkKq}GnsbvCFeDLM*G z$y0NMH6vPc+t!O%jdG_>r06vCxT!iLta*}sL?^D-DAg6iHAn1P%(sdHlurJz?;4bN;vKa5`ZGATN@Tv02$2(>cMVuzk6aM(Kp$Aoq*>#Z{S%gI&!)F+oN zxN{kY4j&HIf9ja$>s$|{cB^C1F3o~=DfC;ZSy~94 zYUEc_gW027Z8fW*&Ah!6^oa4D^!YfhTk2GwU5q$FY%x}$vs{=)eQIh`+t}@)POj*M z{uf|A!01xz{wJC7f7)~tKg>5^ZiVjuqKZ1VyfB#>z_pR{TNhaOLtH>-I(suP?!cESYyFj1D@k7#2;%5kXO&^&DMhP zdNVZ#T_taMclO_@H@T(`6aS1_4$0{Z6a@#TC*l^6?vc3JEa~m zb&ogHS2m~D_*hft{c5dk>O-TRqLA9;%!SUv^^%1+WUUS`&>F|A#bB)tw2qC&@c?YU zi*1}2t>F$`W9pdGKjh2jE$!s=|1-vrI(*~?{Xd2NC%%L{%h!eay51aAt#7LJiOWHg z6Ey4(w#%^8oeeiCAzW36M<1Kz_J>IzNUFk>4V;reS%jax;X@4N+(=>J8| zC+Rt{!$*AmpFVxMjvwYD@fy(mk9|z%Vizu?4l8nKo%~s=cS+4qo1;!2jb`mj(7JqC z+5B|sgxdW5!WFM8=2$CguA<*M|2k)!$-ho(uZmdffqZivuTGA&doH1Eo`+{S^xw(1 zXZ)c5(6ZtDmAC)&;R5lWh5TXURTn1xUU~C{sg+tZ|8Z!}mV(x&$q}YTs`Zijs3sr( zSKZH&+GWeeCf@Nfiw>^W5s^Som(sDju(JN6>lmsCOA%i8u$ zucNM9zQ}oQJsC3lM2RGJ~@ZEr*pYzwW&+_x#BT(@ocVKJbQwM?GsW!`}nvjID1?! ze0&`HC-oe?oufRGljGvg`!BJ#{SVycH9>Q7(DZYLd0sWodwlM;?+$#2<9jsCJEvjh zC(Znrcdpns$7<*6&3r5QP&waCE>ttmYUWtYeDP;W_umcL(}n-$R}L7t?&>T(R-N=)IYFd);sJ*I(O>J{Z&ecjxO7KUeMi3G&?Dz?#K3 z*TbKm`_6&;oaa98Ilj1>k@h{5{ddj-b3VN~Z0=m~jpn<3YbWMhnDb!fyLa!|ofjJ$ zdq2k?%%7LUeD3iZ_22ry^I&4h^}|nRj`*8cV*K1FmcF94oHplNxLSn1wV&(95}rMm zLKnB?#*b<-TpPsrPTTE)HqHg81aK1#aJmFY~k>gH?jLd0M~1&dq=S z*CBxCq&q8BsuYPFoKeWd85hjzW`~m|Hf7iKi5{T-Z*?;P^(g<$^hi`yZ2et z3A~5r|3c66MF3a7%_lLnkftu$E8JVr^gV9F_?1L}wK<7=^^#GU0mN^o}e0{+Eyf%-YnwpyHJTEfG zL+97vIfeN`8VCD)=w}Z4A@k?Y54XqXGvAd<=OlZ@ zI61iTLpiu=yc}9hn<$6YOq9cGC&4Dmk>n|`sgkp9n&hmXCP&v#mt!BzkYgKW!e+_w zjj&BIa$<8VEKYJ$X2USgy(L~wrY1<(ksU7Z>ZQ!3KhjMy1uFpTD*XGI7jeG<-2!3v^$>$7xL6Cx8!S&3w zW#kfQZfEinBac9kL!h~w$>Yp^a}7PNp5Y!&9?{f^hsy$;U+w?aZNB4ICf8>m|7WoM zDo+d6i=`HMaj{Ub~t@E(7uk(;}toJ!g=#`v{Y~Qidmz@`YhK9Yhlf>{#)hs zb`|o2a^05eyx6wuk8G>9enY~et4J@bDPs+k>v>pHY$c1PM@edIq~y#s9G}NFOm(kK z=rC*lw{75L_ItxKR$?Hqr5u0H;S(?XumxM^)=>%z{mA*quroAZ{WFX||H^P9@0q`Fd& zfa5vqa0T<~frGD|e7)^$`JX)>aQzMIZd`ktZn)>jxpy=M7K`aqrtp5*JsF2#q}0) zb8%g1?_g|$dnzwpG}oBsTOz;MBD0Urbzcro04L3GIlVnrueI===^j7LIex(z`8pYM z`Q*{;-d*$5ko$*g4D1`Zu(q~^wbyg;SUUo58s=Wl;`ry5;CMr^76B~D zapdq`o!&a#IsT^t{c?T&x9j77E0=lvr4JK$&gXt_`DJ7+cwbLQH4{AGT}|Lp2T z@B%lG3yT}U8pE167KRqK1Y_9}aOf@pckWUecypJ6H(49T*QGG5$)8`=QqC=la;%k{ z123tuHj9p5w0=FH3b`1LqG(d-&wndcu2^o5>uqn`2VYG*F({6MsrSC#^DLfOzr!5Xi#-0!Su;zq z55$47=rxWFu3?w(Y9(!-MTe570;2{@I1|D>Mf~Tw54p>l4~p_cXLWg zZt}Y1tcepRc3-o04c=&P{`*fNVCE6b|3fiV0Mm00|9`gLV{)G2VHj)5>^w!AyRq|M z_z!h2kB5hcw`twFb!V@&!alSlJGW}(vnXswwTkKtjYU6eiG6J?TXv3!jO>W|olx)w z+=4mrd$M+Cow3(D*O%-XlUW-N0 zmFiT+Ds?(@wZPPwtTpQF@%_5i=A#WC4PUl=St-8bp36I;-x-&L-6G4I--`F#+a z9r97@yJT~_pGoRlzmV;nsjYhwvtP|_Rja~pSDEt$@%z<=jT?t!ZKM>&czl13suB7}sb2Yys%mH{8s7tvH~dFc zqw-@?yYi!o?}A~-mu^wv*DA8Y{i=1v`=ou<`&E}(52$Fo1NNwWpXyud7b-dSeZC92 z-_LvM#r!<;4oJ-kzSq(C9$4Gas_^J-RCe?>m@`W)jkb8#>+x=Vd4E_Fi5nLtyVlRv z@0uGoZ5+O0#fnn+es%Se^Qs2k*O<>*139nJ&}m@aYD9Dug&bj>m&y0JYRGAgimt4{ zC$C~AM#%E%kt!u7TpfrHmyhSQP!|?Psnfex^Ib}9+_Y&p?q8*Nf5!JqPvjO;%VQ++ zc5NNj9oVt<^KKM`9b(1f*U|wQL6!?3i!Ph-Z{+Sam zXR|l!cQw!Vt83{0jLEHJ$D+<^&+@Kn=aMdxx3Yt}w!DS9x-48SFKMo>u85Mqru0_d z?jE6ZP9oli3Ug*4k8T$74r8S77;-3&&r$i=8~84yHf`QCeC5iO=>OlMPR)ZQ@_h%tGhOBHTjPBH z=HV+>tt`bgJ%0b+H@3v{Ir4sX_eXw-e#c;oW8s}^S8wE7b(6wv9hhH-oUvgz4&LMP zm*6{bOmYxs^h3U2AC+%@Sw%dfS4BQWQ@lIi{e|46$e}Wv zrg(qYg6Cz;V~TeZ%MneEV4V-w7w=ivCKu=K#rj>lf>YD{G3Ug3& zeg?QB3s=0Ub8Gm%P`J7Ra%-yNSs(pBfE={LV~_(n4)3I6k(Y+NpLFDA?d+n8Qd_EX zne+HAqV)H#HsAl*ReXQ^qf$8kaaFkB37tPuxaetR@?)MuzQ_wYCr0PPFo$Uuz6-f8 zMJY`c_)L+zWct8-mvg(~`K+%}wxIv`em>iM_2p-Bar1j}dCNe@aE(KI;gc=z!v<@+ zv}K4~N`-A1igu`6OdaOfaJ0jvAa#Vcb4Rx6XL&qZar}9l_|SM9w$7TavktBE0hqsF z>q)p)u8q&k&baQ3?e5w>pVc)!iSrVFjdT5#_xqh=@cG!T73=SJp3Qa5gmVn8VcQx& z&a3*}JMbLdiMM;?T{YOTbI0t=tjwgWtgIxq+A=efGBPu??aJ7dL`&b5ZY(`LX{WZG zNjrAZb|j_kprs|@S#=)9%|V!F()Eb{n;$9g%)~VxcRlFe;mc5biTz$ahjDr6F_?W0 zt8_bd{>}fuqjgJ*7A@Xv+pcXj)Vfw{tF3Ldwr!2IY1^h+n>Idcjcq(DRl{>rCDa(- zgWRe{j34t1;#(K+tp}L;N!%CQc~(BpaLygi8Iutg(O-P=nVdbi6}C;z9-?iRd~Iox zf0(wzv7M5CgqAKB@=r-dX6A~W={ut@oj)V7n9ogUc#AA(a+@q|UP4wy+$HN;{Y*Bt z|AnM>x?grgL(8)F?_?jI9S#k8n$IhenU%EyaT|RJ^GuD)KggOU39E?t+KLZKM5W(I z>q_@a$4bADZk6wqURCau{BF;Xkvs|g=IwZd^2Y7p57Vr-H-gMmotW-pZt%1`~LyOOSgUi literal 0 HcmV?d00001 diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..5688455 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,340 @@ + + + + + 图像处理工具集 + + + + + +
+ +

将不同比例的边框图片调整为 800x1000 尺寸

+

支持批量上传 PNG / JPG / WebP 图片,推荐使用竖图(比例 9:16 或 3:4)

+ +
+ + 拖拽图片到这里,或点击选择 +
+ + + +
+
+
+ +
+ 正在处理,请稍候... +
+ + +
+ +
+ +

批量移除图片背景

+

支持批量上传 PNG / JPG 图片,移除背景后可下载结果

+ +
+ + 拖拽图片到这里,或点击选择 +
+ + + +
+
+
+ +
+ 正在处理,请稍候... +
+ + +
+ + + +