From 14bd36e714ed2b5f0432378028ad2952d9515baf Mon Sep 17 00:00:00 2001 From: Ding <3206166307@qq.com> Date: Tue, 5 Aug 2025 21:39:50 +0800 Subject: [PATCH] =?UTF-8?q?docx=E7=94=9F=E6=88=90=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 ++++ .../framework/generateDocx/generateDocx.java | 28 ++++++++++++ .../generateDocx/styleConfig/labelStyles.java | 28 ++++++++++++ .../styleConfig/paragraphStylesTesting.java | 20 +++++++++ .../styleConfig/styleDataWrapper.java | 42 ++++++++++++++++++ .../resources/docxTemplate/resultDocx.docx | 0 .../docxTemplate/spiderFourModel.docx | Bin 0 -> 11380 bytes 7 files changed, 126 insertions(+) create mode 100644 src/main/java/com/zsc/edu/dify/framework/generateDocx/generateDocx.java create mode 100644 src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/labelStyles.java create mode 100644 src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/paragraphStylesTesting.java create mode 100644 src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/styleDataWrapper.java create mode 100644 src/main/resources/docxTemplate/resultDocx.docx create mode 100644 src/main/resources/docxTemplate/spiderFourModel.docx diff --git a/pom.xml b/pom.xml index e315e9e..b5a4aaf 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,7 @@ 1.6.2 2.0.53 0.44.0 + 1.12.2 @@ -131,6 +132,13 @@ provided + + com.deepoove + poi-tl + ${poi-tl.version} + + + diff --git a/src/main/java/com/zsc/edu/dify/framework/generateDocx/generateDocx.java b/src/main/java/com/zsc/edu/dify/framework/generateDocx/generateDocx.java new file mode 100644 index 0000000..5614844 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/framework/generateDocx/generateDocx.java @@ -0,0 +1,28 @@ +package com.zsc.edu.dify.framework.generateDocx; + +import com.deepoove.poi.XWPFTemplate; +import com.zsc.edu.dify.framework.generateDocx.styleConfig.styleDataWrapper; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class generateDocx { + void generateSpider4(List> rawData) { + String resource = "src/main/resources/docxTemplate/spiderFourModel.docx"; + String target = "src/main/resources/docxTemplate/resultDocx.docx"; + + Map data = new HashMap<>(); + + List> styledData = styleDataWrapper.wrap(rawData); + + data.put("context", styledData); + + try (XWPFTemplate template = XWPFTemplate.compile(resource).render(data)) { + template.writeToFile(target); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/labelStyles.java b/src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/labelStyles.java new file mode 100644 index 0000000..3a38c24 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/labelStyles.java @@ -0,0 +1,28 @@ +package com.zsc.edu.dify.framework.generateDocx.styleConfig; + +import com.deepoove.poi.data.style.Style; +import lombok.Data; + +@Data +public class labelStyles { + private final Style titleStyle; + private final Style textStyle; + + // 私有构造函数,强制通过工厂方法创建 + private labelStyles(Style titleStyle, Style textStyle) { + this.titleStyle = titleStyle; + this.textStyle = textStyle; + } + + // 工厂方法:初始化默认样式 + public static labelStyles createDefault() { + Style titleStyle = new Style(); + titleStyle.setBold(true); + titleStyle.setFontSize(11); + + Style textStyle = new Style(); + textStyle.setFontSize(11); + + return new labelStyles(titleStyle, textStyle); + } +} diff --git a/src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/paragraphStylesTesting.java b/src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/paragraphStylesTesting.java new file mode 100644 index 0000000..4ad5b7f --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/paragraphStylesTesting.java @@ -0,0 +1,20 @@ +package com.zsc.edu.dify.framework.generateDocx.styleConfig; + +import com.deepoove.poi.data.style.ParagraphStyle; +import lombok.Data; + +@Data +public class paragraphStylesTesting { + private final ParagraphStyle commonParagraphStyles; + + private paragraphStylesTesting(ParagraphStyle commonParagraphStyles) { + this.commonParagraphStyles = commonParagraphStyles; + } + + public static paragraphStylesTesting createDefault() { + ParagraphStyle paragraphStyle = new ParagraphStyle(); + paragraphStyle.setSpacing(1.0); + return new paragraphStylesTesting(paragraphStyle); + } + +} diff --git a/src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/styleDataWrapper.java b/src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/styleDataWrapper.java new file mode 100644 index 0000000..1b37d4a --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/framework/generateDocx/styleConfig/styleDataWrapper.java @@ -0,0 +1,42 @@ +package com.zsc.edu.dify.framework.generateDocx.styleConfig; + +import com.deepoove.poi.data.ParagraphRenderData; +import com.deepoove.poi.data.Paragraphs; +import com.deepoove.poi.data.TextRenderData; +import com.deepoove.poi.data.style.Style; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class styleDataWrapper { + static labelStyles styles = labelStyles.createDefault(); + + // 定义标签与样式映射规则。标题用一个样式,其他标签用一个样式 + private static final Map STYLE_MAPPING = Map.of( + "title", styles.getTitleStyle(), + "*", styles.getTextStyle() + ); + + public static List> wrap(List> rawData) { + return rawData.stream() + .map(styleDataWrapper::processMap) + .collect(Collectors.toList()); + } + + // 为每个字段绑定特定的样式 + private static Map processMap(Map rawMap) { + Map styledMap = new HashMap<>(); + rawMap.forEach((key, value) -> { + Style style = STYLE_MAPPING.getOrDefault(key, STYLE_MAPPING.get("*")); + TextRenderData textRenderData = new TextRenderData(value.toString(), style); + +// ParagraphRenderData paragraph = Paragraphs.of(textRenderData).create(); +// paragraph.setParagraphStyle(paragraphStylesTesting.createDefault().getCommonParagraphStyles()); + + styledMap.put(key, textRenderData); + }); + return styledMap; + } +} diff --git a/src/main/resources/docxTemplate/resultDocx.docx b/src/main/resources/docxTemplate/resultDocx.docx new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/docxTemplate/spiderFourModel.docx b/src/main/resources/docxTemplate/spiderFourModel.docx new file mode 100644 index 0000000000000000000000000000000000000000..98e375321c08692c78d17c01820e14ed40563e10 GIT binary patch literal 11380 zcmb7qWmp}{(k|}q?(V@MxI+l;L4!NNHMqMw0fGm2cXthL3kdG+7q*?gJZR{B3Uc}H|I-vd#vm<0m z)&m9tasmMYLi)Fuo{bHIv!zA4f}nLL5mpQ1yr+q)wdn*mThJGWjD(RK2Lkx4ZwbZV zASM^9k$ZqWhq~hyOoGT`!C%|8&@#Hka<&+GUr->38jAdQhC4qtg!Jm^;>V(!$N8x{ z1LKbFo};Sc=5}xbv!7s0j&?3^@rw4J;b<7?Gkz#Lh&N3>AIFPYI0g^Q1@vL$2y;q` zL5(69fGg)52ds~LakYJBD?vLxn=d=d_Ry7*GI8j_8;@j=K~){B0b5qDG=eN=CEsC> zDq)V#6_#D1h?yN`I(o=9;g*Kl(>r6x;XfEyTpNLVkCnGiJ1?B06v38j;+==;`G_Cw zQw3p5n0%zJ@14n?UG-dxt5sxp?WOY=ebBQAql%ewdc+ke=mw*1vJ5qvW}R*|D|+H$ zX_N?<^Yq5jPcv##zGH7^EOYS_kLAHZsHD-z!H$Tb8w(iVl(cCjDmWH#uK_>#j(jwE z_#N@l>==BC@ON`SVB6qGzL-Pv#T>~0Hiy2ot>LRZ!eazwx|oneuO*g<&-f~0<)~C* zq`VrlQBXvQ920mgNk8{h!kdJ6!oEnG0pgVlt9wCgZ8qiSbfW`XslScfD zh#XMJY_`%6-ttKPIu`iPcjRiywEYthbSY?k;@Gosvk+F&B^~uB7Hg7&3Z-_{wla!g z^g7-K>}LpDJ))Lmc26b=YAjFP30|l|G8JHbV0LhI?Q)1B)1=^pQFrr7_yRU?=n`_H z0M3xp$XV~`t1%y$dAq?$%j$21kxgS5?z9L;HT01BQ>^l_j_=%`u=s~dt()Y#6l$z{ zfYFoJwB8TGGeMG^05w|HDIQG?{kTO#hn5s0#tz&xAjpqPlNTajX|}t(q_-I=`beB4 z5&M&Qsd~R4$$_P7{rC7%^;fZ&Ok3WzEV03DF4 zvlU#x0h9hzp&BrIz7aGwTunEd9+rl}pGFFpUH#`g=S15p^9HivmFlF$((nzW@IK&5d6O~mQp?B<&ZIDkb7EUh zqKAwqhp+yL;_1AguSWduE)V?0h)&kF25;OQ9pTnh?u$EIF$4la{9DA%-o?Vu?$yRE zT8p;ddoeutm2V+K@;5sYtSeYbCvuG3xiUg{w-hU5w=t@7Mu9%!lpoyQRW&sPMQ4h) z=xq;RpqN`;8BVA=Ki`|)(E$u-+ z=_}AnJ=CKqLgJa4hKHYij~}9L?*1gfSbHcl z$R!51HyD6CM-*#8K3OalT47=n`~zpR#}S$Fi_)`I3*x*+5tB0WnmWY0;O~<+Nx?bZ zTzrebW_V6e5vg&B{1b9Ecc;;}WrlsH(IbGt!@GkN=1@nh_t{!vr`p5liiSzVz#5ME z^UBd%%&kUT<|jY*FW0$85PWl(o6u`Erl8$xxCX8PYiH-o(IF$G5~G)=$}0}l=Hk{K@h9}>WYcmxMQ1n7YFkMv`p30u{7J-OS~>4x}?d}`X7 z3nO+}eCe!#zoKNFP!g`lhEZRxCP)!sLzbBR@Ha9kG0IsKtao_uvCS1~4bJp{0 z^)dM4<6XO5B?|Ggc~9(iSfJd`8AM|q3?~w}28PSMx$|vt@*E$bw7cUKWyoX0llZ_Y zydbusE7drEjxu0bhXJ5NezyD$>RPC9V*fd!R8aNM6+DR~$2&|*j~slFfl7dMXo^!a z;zaFMZWdejfKAZUI+Af0@mG9=FMN1_&z#-XUBoL6LU2+R(S8p#l1W=UQMxf zU~5Nl_`vn=qs3pkj$gaJzH}*I0Vib&*ka4Y1qP5)A;5o-!@)_&WMZWgR5wxc$sR8U zBhS)7*~MoqS3+%5wY31pM zn125Jr|_L472|g4)FxEjsN(I$sm%fZI;0^X!M4^P;Cw;el#Dz+5m|kmNKjPRXk&V7 zx(^>rLc~tNRhd{j`?gJ#5r{vKp&XHm^5pkl#?kM#yP)7Kli16A6eJD*m|H=jv)fvm zSx}qQp*w#wpZww1yog1V&{AmFno5p*i>xTx7n&1B5eEZ0N|PoWO`qN$9lW^wyKoGG z=QC>w$$}H2CS8gyO_dpgyXZXe$3vaO=N{m)TlX*-gV*Tpb;or$p~7OC-$V$ItMyAs z3b(0xReh7yDBu>Hmf7|36cKh*gilsT6)g(Y8qY3r+HbBrW7bozMJD&nG6x#N#imNz z8A+%cL7D2o*Je%(8po03sD*_Ea^c|x>$u@UIzTT*>_MMO+XBO>D>H60)ZdMnf|>MY zXXE)`wFT(K#1P$cY`M{*v1%0derhN&Z5-(3S%TuiwR%qK0!)uv^tZoIc?_rJ(KQ7-ls|dSp zpFEu)BvpeFiWB94EFUC0I|%O;ydE;keA;fic}P6LsCTB7+h}g6qS7v#80eCc<{d+2rl%w=Q3WK((!e#)6TLhA*!F zj2iTe(moR=-nS9@6_$CUA$zM|GHIWs;oGazRSiGC|7Fl9y|-V177F$6b-iC=y+j zSr%$>EzQITll?W|P!PTtgIm27cX8lsIWu;vNsw~L$yX-f7$Ti+75?SMH*Gif3a=}^ zb&uvA!GwEygi4rkJ5nAQJ=`eQ{e$K3Oe79u9p;dM4h1iQc+DMpZRXv17?w`*onXvK z0_|Yg1SzH^v01>xT22D0!80XmxMD%l@?O{ocaPSqza+ZkOk7K#)7DH#Mi4|9#C=-4?0;$i6{$eXM{se=DQvm_y zV91T-1H!_r0SH{79JR>0uv4YZ`sxavJiGMBb!zSH|8j11CdR`P0)Bmx#f(+}l*LJ=-Yht?gW&IXs z<485HI$&7oSN4wpgd0|Xo2WKd(ADl-1al<7lD=rkzQ zh5sn5j@YMfuI`&e8R4RpHaPHpwC!9M*X7jR7jD;J6rOL|{6TH5Yt6Uo#^(~Q9vLfw z&}}YyCw$&l`fERylZ?I}{CanG$rw54|K()bJ-h-VOLHH+T}tdz+s*p|#9{L04B)l) zt36g{YA?P|kN0K3YC2!Hr1*tbH67W)qdd$JlxRCEtyS+X!L}mz7!Z9a=T!TgZBKZn z2ugLtm@eB&5K3EjgzcO++NX{8bgwEJ&FmU%E-8STh+$QbssxT({HxrA9L-ih#}Seb zZzWT6^(jK!M5kbV1D$N30)jKteLYsJ_M$Zd|QEs+F#3w*mxMGLUEWGQS zl3Z?>x4TqT&P3d!6ITfcu}hZk2$+$zT_!wRnax$<-7$eU3oWH@<#8KMwI6k^)}Mcm z+$UQvEcwBJfD~Wiz}JlFkD$-a(B9tE%J`3%u14jP^&&gkSHkjV-JRu%txq^vGJ1Vq zVmnQJY34Ji_vQedp#lmj={jw~^3}}^@F582p@nw0qmNO?{O+jDb&!@xG3QjRSYo_U zN?X!Lzb4M78lM^Vus;~c)WYwaUP$g?`QpM4BY?8U5b5z>EzCM=yY6 zmn9X|zeGbH)Fa!13ze-?R4E%z6>NyTF-!pQeccA5hRKXTS%ZRJM2D#;UjEa*5=zZ7 zGt8mR_&C4*ta&L~37Ev98lK78j&Dq!ZZ5P5Ky`wto5bs273MRebJUNG^-nRD^)-{X z@*BoWb}+drXki^7&_`Y9egmY^JY1mMd3PX+yeGAg2rx4ndUks}91qgZ?`N)*m&&D4 z4~N3wZ2+RCRy6wYYRDfVoE@}urgIxID;)qiW~a_x#WK`;&?!sDIg?}?a~Tdi!KD=( zI`Jqi+|+`Kbk{tMIAWmUkkNt}1YzJ6Dw8PzNqS+Nz_gd@^VO3Y%FJz`KCFIos9~&E z3#+J_w1#6~=e1)5Y|MrG??ga?eFZu$S9#1H2lPJBSbdX7&`^f3i*Fz`iOa5odI8oPm)H;z-B}D2z)x{ zFcG39U|QxhKd9}KQuxFsJhR7Ucf@QxZmmZ9*nG-GnI-{49nh)gQeLirt}>qfWY9p5 zleMI50BV5vK}ZLVGEc3ZZJLSpDF@p8Y#loM;;;@SQCXwBTwA$#OM^!{n>!@>n>_rnAT*9 z{D#{)V*i>>Tj32|Geo>t3d=!lJ>qj&EbuP$9hQfEg61tCiNqAf`o?bv&Uh4eglRv1^w_hv@Xj_gYxaEKD#o8tOdq^)IWfl}w7Qf{ex3p&w+P!~VGnhRLDx9_&4#kmk)YRausF;}=#f%*j) z$m!8X*;WHVN?)XM?U zB|iGOQp%Q6go4tHc-pQX_`V+Bk|r{& zj+xkmH4xER`^TTlW39P&e~zInIr*u3y<~(16?}#zpRl3A*+tUa{CFy!IG!N=B>*&P ztOvu)zc4PgBpm*oj~>}*74+!(V$vy`r1RE**zg4O&d81!TL=y=Hi-+?CKYIn6T#ijKtw-9P3NZrN(m(UP5hbX*P5`i|P-mbD)~-%{g@-Aq zCAyGOX>`q|<7HVCEg0Z?QAR9fm+hoRiMIJc+#Q?Opt5G!y!i!AE+4$WcjS6gi!b(8 z?B?l?-ZcWhCcZb-sh1paJAZigM^AP7ahP7Px5n1LQ&zH;dg)mA3&7UDwoiKlD^F=Q zi}#3Qa1xI0UZ%Z2?S`Q3s~~mu9o-&H8MnpNn}Jwg?7I2HsI0PSihd0itvo9yA?5S1 z?Jl`Sz|p%_SRM2b63H`xQ3~fUF@Z&dY=eHua@iQABCc@^v7b&XtSGd?W{m=2oXPzv z&JI4ANEjMAyw9gI=lLDGzQ*~8U%5PPPA)pe#G*-S0?)b=TyGySJ^7zlZ}xYc7zsVL z`e1RN?`6L|UhOA-B~lviOvBXSzulOR#awlN+D44zIl+$zV0RZ_rt{gqA*&x?wviU^ zslh|M-Is(@5U~hO=Ru|tH^Yd0%8D`RXZY08Uyq~kh3r|k#OKg*eu={L2V;GP~ue?3j`}jOEC{^ zr_+j1zaoKY{RbdL$}rV&rR?E+TQ6oaNO!`4X=4M=UUBwPN-_iPjyUiZEZFtfhK>#$ z+TGbq@0+Qw0>;Uqn=yE|_D7_>76ys<4hnG}-RJlQ6mjo^IYC0Q*PhsPYIh8;TYHN2LG7!6dMxkGVGoR1tQrN>&DLir zx87V;^c^|X7#`aIN|IZ0#aa;RmNMRl^=&R6k7}`wAihKE-b1;};_@^ZU3Xheo1Hmd zv>pg$fP>etgc#BObllAH-0LPybvT6Gb1!t<0#3(s$^b`0>@nEAMQst&`JG08{Adj& zLMmAVEd>QxI?1a_uU;koP9T3i{B$mjo_53)ZG>`sTRurnHgQLPPt&jmk7IU^je-Wd zyqXp23JCZBPeZT9baUOriz*^M*x&Ck@bMvqFIQ3X&c0M5(C+3vAR)U)q0`hV|J$z) zXid2SDE|(qj~eS(GWsV;ABkjy4i%9;t|91?H4N;ho)~ueACN?+6r0l|&k&QMoO{I- zqg$omC3lZ&DsHtfAGM){3zw(-noa969C<=?P&}O;!QH}e-aSK#>~kiwG}0gqf&Eou z!e#+ey_v%d0ACQ@ij(s<&GXapCnvB6SXI)8Ve>ZxU&V$ zyn2l4vu8`Pe+@R&=#Rpkk5cuV5*mbAW6?dW54IRLnit9NS(8!|~)0+B)0D`%6(wLWC^Qaag zqF?GrZS~wr4}?3Y6#qW4(y3&%!E1@xT+f7O^~tn$=Nawb-jlrm=>(P9UxE+aXLrfiA*`C z{~oN7JnEpKpQTdVKnx}3K(dmK?qa->j^2>^lT>DId18VPV(zDuNu8?6>yW4sC! z+ZkqY8)8Wb_F>N$!iDhZ!frj*0IpnVx7zW z7R=gWi8{s9-z&OQR9eijYD<9N3L+}d17ZVyL?5_L9@|O81vzr;Gm{$R0#rt7P)|%^ z&oJkTtHn+8!+tR7L-R8kAlh2b9ny$xfX%LS&SyPDYSzB+>;kMW>h`945(&j)MM>i|Nd{;_bv68X z(wTZdZlT3y#FYm=>`3~M?z2%Y`FA7hPBlHz0{7aB1x}D!#^ct#!Z+UIq#}1XOhpF7 zX19JtwcgQ6_>xh2M;58OM9#)`N9^y+3ezcN9ktYezZK-mvSmxzY*6aNPuD^?_7q*M z2Iqtn0BxgA9bLICYgnpFb3@0Hl6SCrfu?6?TE<-niqY>ZURQdmxYmb4D_w&-gMldx zAr;01Y>)!)Vb*zw^nKZpx)&FbxJ1r!=A+Wy_9R2Mr`7(v(||Cn01*caKRimHyg4bLk3Mvz|0TUGU_M59HBF_ic1Rbv+LEP zan+b-+T%ml!Hl(P+1F(xV`0E0(;0}|0`8J&T~CC=pj|A72hsq@~+Z}Q>EQ7`cRp-X4{2s9d9jlnu?A>33WDvj% z1~>|4D-79S;yy$u9y<;q9eG6*6^bX@OA+o= zveiDPKddyj7{$#gOP2KX1vVlCuZ4`6?Jd5eGFWf=S-={T?H5T%4D5-%anhy{UL_^i z%Qvl|@*RyMP+CyFbw`G#qIfni2fb@cy{ne>A?RIh>WGm#M;|IW$CS{Rp?9e_nK*-A zjM@B8{Y(JRi3mZx<`SyNtlM5(7g9PxS1wLD3?ZaQ1JT!>kSwi&X9UztEPUsFc7$(| zxrl`G4qKz1zq_y0yc4W8KUgg?AuVI>;Da4m zN)~Ql2yJEt?RSdGgB669nub&coj}IK01S_(nl54RLt-rY1f#}!<2YHYS5ha!%1V#H zBXP{=6q&_$Sp|{fMbM>>Y%k2KQrv~29n>(AXeI5c^D(p-SK6A)Sky!5+19Xt1FF@3 zNJh|X+hg=4C@JZ_M-Rg?RNl=K308|ICuOyYrv`+QeQcz(M9caKG76snUt17}x@{t* z2;CrM20AlvV-%!)-bJsSC{e}SZu3+op~SnqnHpM8LZ!(eh`x}4Z#2| zNn*&fkJPMT82nbdpya1_9#N+ntWj$4aVhyCtUiceOJt0VZ^Z`2b~`55Ff_gZ@%Xys zV2MJZ@Jx4HUysiO2AQ74CAE?geBM04gURQDqyS;z>TE7$?d$Q6b{@KZoGH+Vv}bk0 zUC>wwSNqDW(@vM{6zfDc(h9X^VehG;HWeLF%TePXMOV>9YPDE9rLssJ{Yb!xlW`#o zmnV!A0ygmTeIeY6?fB2Us(#N!6JR$;>k^ivdcv9@nU$ZS5iz5p8Y*5T9X#SgjD(D_ zF0R3!3F*v^=A0JfTIbEVZ*C5|Or7wT(#GAHGC)pxak23Duz9$XJhAQ}OaeB`8NzXW zro14VY{`3vEJwH;IzR+)UHMa<9&g{Tc#?v`qX}qU514iQNCA(n z>l`E<3AU{jbGOT}gm<@;Iv5k0X^kswz0KhCO<{d%uLo-QWl#QmIVSqgo;0$yvRBgk zZ1G2By+v8@bx$^9?ht~lphkz_QH#Y9eIdonkgbMVIuB`+f({i~cCiFL%Ll znANruQ@z2N0M{fT)Dcjv!I1DhdH#HeF&pM6iCuF5E?PefgaVdr-8LmFvhG$s1Y}B% zD=R*RP8il`e5+?)b^EYfsq!80L81{=2;4|Y9zj4BwUM-(U9lO(x?y2;COprcDOJG} zPgx`kx!JoLf%vX*7*vi+@(NG3EexN zp*6=5$kCCSw|tV<@XdX%rQ~)|%xL2Ez-*69;)(G(971GIfcj2C*BHdIN|c5R*ozxv zyZJN~I)3!f6lrNC>YV2#l>nTS>=u(&^>5I$hexoCq4=O>N+-c?p$6n&ked>sp;FFZ zch()#m&7$?*7xesVz${KN#u+hhAy#PVJwNyw)giNfj1 zO!jm8>kaW^!>pg0-jrleAnU?6B-Qq*B2<4U9ZJj%A zeZm7xLI(pP;spLIauRoA$D4tZjxoW(=Gc^*TkhnCc@>0Qa-()mAhu~`!R-lTbfgJvbI=NG2_;MRw99 zJiLgLm*JNmqNHm)+v*IjIU=oz!eVP$^?_@g8kMzF4 zlCZe?3ZLYxiD0vjZ1vm)Lu@j~x#3n(G4RpuByXh0sb6n0sS?L9rn8d;Y7R~h1i41y z4=8J`_FqharbOq@;eeZ(mkJ)pR9HMMzOOEsu_wIfh~5rHw=Jd`P2&CxUPg><$_M$w z2hKLd$boOYDP%mIg-o(tXBt=2opY92xp_Xi~&dxNupVIGuT zPI3FoZz6Y5T=gy)h$EOWcpk&Q{x`=z|4p4A=x(I0Uerhr3Iv4ra{c2}`cJ`s$MJvZ zcf{<4(&KmR-|9Q(M*sdXE3UsGPN=lU1E@#)Sx%jK;bY-yYbdb{NJq;J$sBUZE!Lsq z_2T#RJtj^kLC~&P*!V4J&=T7Ut97tAIbWOXXKNTpV}7_J_sUrq zCybDMnsgP^aet*CB@>-Y5gG7cqL%&@=*ZjYW;t}tH$ zN?v%|J%(P(>wMi({Bo}<7+uVG)cD9!jr|?JpJ!v{UTd9})`CO27~2PdoDIvt;t%XX zi&q7BKUz+yc9=%Hn;%4v-SF{(>?c}KYMJezay(BXIiq&6-N=zXlYu|D1+q8j5L-#z zAbL~OVG{0UgRbxdV%Cj!S4*sD7H_;9X99zu0sTW1d~2Z>BLM*e5xxADQv6qY{W-wP z=k}$&B_zIjp+DOz=Ma|cZ-4W4(zjme74zq$jQ_#>@ecjJCVOQ+{@Gq9du{*XLjJzU zw`|B);Xmi2{5R|`ZsgmieM{c^2VMKJwf{5e-&DT0@V6Yaf8Y!+UgRJ6e;8^1uSLJ| zpZ;vGi#~rjO!$ip^}68yZj@KI|7UxJD3kx@wcbALTL8;@>7K|KQyS{=)y3y1d1|tv~*Q-$D2b|L18{~P`!fw4+n!9)c^nh literal 0 HcmV?d00001