From 06a19f9d9b282d7b5854db413b52a16b8bab5001 Mon Sep 17 00:00:00 2001 From: Aman Sharma Date: Fri, 9 Aug 2024 23:58:36 +0200 Subject: [PATCH] test: add another case for StackMapTable --- .../diff/visitor/ClassFileVisitorTest.java | 17 +++++ .../EQ/SameMjCompVer/161875/README.md | 2 + .../EQ/SameMjCompVer/161875/diffoscope.diff | 68 ++++++++++++++++++ .../JsonFactory.class | Bin 0 -> 28267 bytes .../JsonFactory.class | Bin 0 -> 28267 bytes 5 files changed, 87 insertions(+) create mode 100644 src/test/resources/EQ/SameMjCompVer/161875/README.md create mode 100644 src/test/resources/EQ/SameMjCompVer/161875/diffoscope.diff create mode 100644 src/test/resources/EQ/SameMjCompVer/161875/ecj-3.15.1_openjdk-11.0.19/JsonFactory.class create mode 100644 src/test/resources/EQ/SameMjCompVer/161875/ecj-3.24.0_openjdk-11.0.19/JsonFactory.class diff --git a/src/test/java/io/github/algomaster99/bytecode/diff/visitor/ClassFileVisitorTest.java b/src/test/java/io/github/algomaster99/bytecode/diff/visitor/ClassFileVisitorTest.java index 361680cea7..0b24891b5d 100644 --- a/src/test/java/io/github/algomaster99/bytecode/diff/visitor/ClassFileVisitorTest.java +++ b/src/test/java/io/github/algomaster99/bytecode/diff/visitor/ClassFileVisitorTest.java @@ -340,6 +340,23 @@ void shouldShowDiffInStackMapTable() throws IOException { List rootOperations = diff.getRootOperations(); assertThat(rootOperations).size().isEqualTo(1); } + + @Test + void shouldShowNotDiffInInvokeInterfaceInstruction() throws IOException { + Path oldClass = EQ.resolve("SameMjCompVer") + .resolve("161875") + .resolve("ecj-3.15.1_openjdk-11.0.19") + .resolve("JsonFactory.class"); + Path newClass = EQ.resolve("SameMjCompVer") + .resolve("161875") + .resolve("ecj-3.24.0_openjdk-11.0.19") + .resolve("JsonFactory.class"); + DiffImpl diff = getDiff(oldClass, newClass); + + // assert + List rootOperations = diff.getRootOperations(); + assertThat(rootOperations).size().isEqualTo(1); + } } } diff --git a/src/test/resources/EQ/SameMjCompVer/161875/README.md b/src/test/resources/EQ/SameMjCompVer/161875/README.md new file mode 100644 index 0000000000..9d774b7d4b --- /dev/null +++ b/src/test/resources/EQ/SameMjCompVer/161875/README.md @@ -0,0 +1,2 @@ +If we don't want to show difference in `StackMapTable`, then the diff by +gumtree is perfect. diff --git a/src/test/resources/EQ/SameMjCompVer/161875/diffoscope.diff b/src/test/resources/EQ/SameMjCompVer/161875/diffoscope.diff new file mode 100644 index 0000000000..5303ffb47f --- /dev/null +++ b/src/test/resources/EQ/SameMjCompVer/161875/diffoscope.diff @@ -0,0 +1,68 @@ +--- ecj-3.15.1_openjdk-11.0.19/JsonFactory.class ++++ ecj-3.24.0_openjdk-11.0.19/JsonFactory.class +├── javap -verbose -constants -s -l -private {} +│ @@ -1,8 +1,8 @@ +│ - SHA-256 checksum 5ad3d88ecc88f93b24f2c4abc555060f0acddd438bf671447c4336f5f2e05592 +│ + SHA-256 checksum 94e5c798e948d2c5670cfa44006721587874662fdf6eb8de2cddf5ac7838c430 +│ Compiled from "JsonFactory.java" +│ public class com.fasterxml.jackson.core.JsonFactory extends com.fasterxml.jackson.core.TokenStreamFactory implements com.fasterxml.jackson.core.Versioned,java.io.Serializable +│ minor version: 0 +│ major version: 52 +│ flags: (0x0021) ACC_PUBLIC, ACC_SUPER +│ this_class: #1 // com/fasterxml/jackson/core/JsonFactory +│ super_class: #3 // com/fasterxml/jackson/core/TokenStreamFactory +│ @@ -352,18 +352,18 @@ +│ #343 = Utf8 (Lcom/fasterxml/jackson/core/io/OutputDecorator;)Lcom/fasterxml/jackson/core/JsonFactory; +│ #344 = Utf8 setRootValueSeparator +│ #345 = Utf8 (Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonFactory; +│ #346 = Class #347 // com/fasterxml/jackson/core/io/SerializedString +│ #347 = Utf8 com/fasterxml/jackson/core/io/SerializedString +│ #348 = Methodref #346.#191 // com/fasterxml/jackson/core/io/SerializedString."":(Ljava/lang/String;)V +│ #349 = Utf8 sep +│ - #350 = Class #351 // com/fasterxml/jackson/core/SerializableString +│ - #351 = Utf8 com/fasterxml/jackson/core/SerializableString +│ - #352 = Utf8 getRootValueSeparator +│ - #353 = InterfaceMethodref #350.#354 // com/fasterxml/jackson/core/SerializableString.getValue:()Ljava/lang/String; +│ + #350 = Utf8 getRootValueSeparator +│ + #351 = InterfaceMethodref #352.#354 // com/fasterxml/jackson/core/SerializableString.getValue:()Ljava/lang/String; +│ + #352 = Class #353 // com/fasterxml/jackson/core/SerializableString +│ + #353 = Utf8 com/fasterxml/jackson/core/SerializableString +│ #354 = NameAndType #355:#197 // getValue:()Ljava/lang/String; +│ #355 = Utf8 getValue +│ #356 = Utf8 setCodec +│ #357 = Utf8 (Lcom/fasterxml/jackson/core/ObjectCodec;)Lcom/fasterxml/jackson/core/JsonFactory; +│ #358 = Utf8 getCodec +│ #359 = Utf8 ()Lcom/fasterxml/jackson/core/ObjectCodec; +│ #360 = Utf8 createParser +│ @@ -2056,29 +2056,29 @@ +│ 0 22 1 sep Ljava/lang/String; +│ StackMapTable: number_of_entries = 2 +│ frame_type = 73 /* same_locals_1_stack_item */ +│ stack = [ class com/fasterxml/jackson/core/JsonFactory ] +│ frame_type = 255 /* full_frame */ +│ offset_delta = 7 +│ locals = [ class com/fasterxml/jackson/core/JsonFactory, class java/lang/String ] +│ - stack = [ class com/fasterxml/jackson/core/JsonFactory, class com/fasterxml/jackson/core/SerializableString ] +│ + stack = [ class com/fasterxml/jackson/core/JsonFactory, class com/fasterxml/jackson/core/io/SerializedString ] +│ +│ public java.lang.String getRootValueSeparator(); +│ descriptor: ()Ljava/lang/String; +│ flags: (0x0001) ACC_PUBLIC +│ Code: +│ stack=1, locals=1, args_size=1 +│ 0: aload_0 +│ 1: getfield #104 // Field _rootValueSeparator:Lcom/fasterxml/jackson/core/SerializableString; +│ 4: ifnonnull 11 +│ 7: aconst_null +│ 8: goto 20 +│ 11: aload_0 +│ 12: getfield #104 // Field _rootValueSeparator:Lcom/fasterxml/jackson/core/SerializableString; +│ - 15: invokeinterface #353, 1 // InterfaceMethod com/fasterxml/jackson/core/SerializableString.getValue:()Ljava/lang/String; +│ + 15: invokeinterface #351, 1 // InterfaceMethod com/fasterxml/jackson/core/SerializableString.getValue:()Ljava/lang/String; +│ 20: areturn +│ LineNumberTable: +│ line 973: 0 +│ LocalVariableTable: +│ Start Length Slot Name Signature +│ 0 21 0 this Lcom/fasterxml/jackson/core/JsonFactory; +│ StackMapTable: number_of_entries = 2 diff --git a/src/test/resources/EQ/SameMjCompVer/161875/ecj-3.15.1_openjdk-11.0.19/JsonFactory.class b/src/test/resources/EQ/SameMjCompVer/161875/ecj-3.15.1_openjdk-11.0.19/JsonFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..9eb62e754b2c785e1dffca301cb5a952422e013a GIT binary patch literal 28267 zcmd6Q3wT^rwg1{XlR0T}`bhdrY1$N8noN=wYJoN>&?HUT&?iY+NDHLX$)ue&nMr3R zeL$50f`EXCJOqS`JTC}ZfhL70sJs*u_4-0VMe&7Kul}#7_j*z8Z|$?^oHLJ{N$~&w zzCYjBIg^>Q*Ymg6T6^t%hL`{G^fN@XO#aFsDd^--tba*wFp&($5BB#h*%J)yO~j&0 zLa}&w$vJq}8Vn_4@k0jr1l4)m+Zo#%j&>yD;b6Z##4l)p$B?bzcp?&uhIdy<6H=3lirDn%EqRCX&Hua%-?}FkA?Q_&?|~ zrFB#LhQ`kBjg1>xy3gs@v{6vmdPTY~7~Qo55=NrC8j7e?kk9(MVs%Sv>pkq`Hi(uVN~KtyyJb^nOLz0yMvxKB1+c=2utIk{7E3no z4#qnU_3w=JB?PVTVv#u1zl85jbjCIY`@_w_Xe=5Du@}Pe20^pBcOFWHEmCRU2|6Pm z*(QuUcQDwKNE-;EQ@VRCY_*1i$-#ISGEVLufDGZd^GR9vu5dIQ4+4YEhh}$d=bmsV z*&OQ$hXhr5iLlAJ6Ff`1L(mdz!||3xC^*1OPw^TKJhENfBS24i&|RtunvNX zyY~&ol40wQqLrb(NHmf>OHe^o^;S#=HfJ%NN*^$2DKzpxq$@Bi&~7nl8Jz~pgkpVt zaLwv)Z*Z_L3G;$@+XMnoOe&+P#k7Ly*Lw#OroUMsAw`}ktTbsFQ#gw$oDIk2k#J24 zIc_42CQYZQ6R4S53_>tj=0RjI8R=W1HQ5{wCzFRZBYFTkCe5JM{K!d7+;EScwyeck z9y}A4S|5pqHxBmi497dIP*=7-hAFo-i13Hdr$6+sR8A_!$PFf~BgC_sF#}$?HMu(i zH+YV5`Lm&z3aFhqEiR@`+G@}i_|C&fUZKOJ^XPowE`+p@47VdB32LaS_L?hR=_G#FZ&EFl3z9KJu#Pc%$IEo?P*=T`nd~#^WLm`U5++qqHNP7) zX#p+dcLz+Wp{bami8y2^3|Y~1=~!iH8jSSyAU!av!xS>;gZU@5E)Dch9(SopM_7od z-3e7Zw1xX4N?_pSX**}+%0S?(28^CSH?rYAE@+_#ik)$M|E2tLIln;j z8wpc;krybO!N?bdJ7c>BF+yw;G$TFQ92!VPoSLzbQ#uGT;^CbP1VPo_b16-by0PA? zxD?U92wJ1DQyJ+W=nMCUqsd?r)njFEEYAP>gUQOOg^B9Q4O==oD`We^@pz;sT)9Jw zS5>{EvOk>M9qZvp`e~EyrTbL=4DTC^#KT+(YWjkvS7jHB)mw`JsRuYNK9~<7E>K}| zz(mSG;W$%3k>(4<1`Y`dc$>gYghhVTq{ry9Rs|Cd?QM(hM|IZItVm6B3*6inOeDaU z2OVX3V}fR8-LMh>B0gxmIMZy5F3nJAK^W~nR?&j zX`No>z$I$Y)EEkd6Nwn=46nSTM{EctL%X3?IJzsj8|;hiAe1nKKnzns1Z%0bP4+ji zy(ln+kNyGMLqr89B>=D*452hSbqt)-Wd*0y1ZW;iBxC(*sah;1hyp_t3##|<?VfIP<*d|_3ssI67uN{(*6Q#;JRCyqK#(qPAB-j={o$>V zLrWxr8%{22qyNz1(8IHQU`YV!1(pSTZApntDk2sPw(iCTi<%n_p97j@%Easor zL>W@&X?JBY#?)r~rT4%vNxT_zl+Ns$l_s*uobPGBY$|!R)e8YgEim6M^d!$%uqT5( zo5vpX7}|{t?IuANybn%eR)!g^W^{wm(tIH~TO)Mc7~rS99}$6Z?}=dn#$8bkF(P5SE>Q?Xi*{!}_^;`7wv?<&S1esQ&*Gd;?8*3-PT&-B&=a;}5*kB0M zJYEK5Y1O@HMSQ<0qJp~}-If^GB21!9)E@2)V?hu?`MTPTiqz7^D;PrZOe(6%+-Hio zKp{HG&FUb!+ukue7dh`-fe~$+ln4itiu0f;_KO2*_Y5Xg3DOEn=nZ6<+g|N(9<^>$ zL=KtaVsQ!T%5H3+@fH?rv&9+hqS}zhI*xFCtd<$(Hu@V@5h><&T)+YHV$|+3v4$J?hrRCF`(%X>+MBq#!T!BBU&`L z=~{_?95d(7;;1P;&y4^-sG*;QvmHl><$ltnpVOO$7{VGp6$vcz7BGv&F?yD7e99EN z#r4JFUNK^dF9>wnrv&@@Vj*={r)jVki4l#5s)6HqC#ieP9G8!<;;}=jBZr_$ ztA4}rl_r37FY04^0;g(+Je!R!CPf0<1ZRR)-A+xcGNBr)Y7eFAP&j#Zb!B33U?3Jp z-%)KR@`(xeo+4Z3=caf|`~q!BUBtMA)8!esxaa#A%S*>6IMN_~Wr|;m-=Hw-5AMYd zh}u`J$NcniET5Pd<&c6Qev2sN;fy^fq?ZJFQ)P)uA;)^f;%)IehVJhL^^863c*X_~ zd3m?A0NW^n=I4Zf6|yW07y^4DE#uaWEoG5$Yxzg2ivPlHBa%ppM!ub-bbebWh`)(<4e>wT+15SC z6n_`k`tWV(Y(;l4uf!?2cp)JP(MSr;2=+uCv!UD>ABIXLvb6Ecqrj9tS%_4pXCBLG zo9+GiD1)^Jh%$TxaST%y$qCMCMzyVwMlXIJCUCpK6I2-jr)*{MR-PzfPnc;{w*J;D zcI2l!$&`~NwvDD}>$@!PN)qE|HD;S5BE$w!Qt3S(NSuZce2uj|TD80;wn3!j5!5t_ zSMtK#)>Bz`mMQ)u-bqW}n#DK>;h2~sjarC$xh4%81(u*d6+g^N5 z!M2i;VU(F?$VyjrnNA|&kl?g!ed&qce@2;;Ou0ZV1@Vi=mcO}2WM$>L_9ltw;-`&dZmh!v% z`Q0*p_gR!j4mlf-{QVh#qb$dEvRr}WEb9d|jy*ZsO1hVWDDXjTr76#pI1r3eyf|GS z9}MX|LqX3~wRwTn-3Ii!&m;He8^%R-&g1Fc)sf>0&aiToDI59RNNFU&M_71+eM2yc zP4b>%*(_TOxf)haVaa76Q?}A#J|x)}ON5K%T6vBk@mzp)t6DeOtw>X@lk1Tmf;~MQ zC@XQWJ;D3gvoyNY&7HgBu>;)x#UU(1ZWJ_I@l@aGeQ%o{VjJ3Xy7QFI3cVQ_UTVk= z?_;ogxXQEEB27UEY%p5lc?Oa3 zfNWGj0d$DEokhJs(0%_ui^_{^b;Pt7hawJz`WP=fOS@V49lU?)HD}UNyXvNFEs{77 zTdz>ffp7flATaMSWmsZCUXs`w8Q@Z^X%lwaW~7Hsy{v6BGBT-cPm z-)@B^pml<7Riu2{+eCL$1_us~|P(#JJiyKq*UbD~B zwFuh=Kc9tXb_{tLc3M4LrU>y2NwaFPJR+}PaC}%$-~UT+xC_4q1(72%$=na}%OyCD zl-CMb!Z#T5T0D^Ap)_I_kFtIs~^i}ti>ngZD``lPpUn( zaf`2_qV795wYvLL05TF?%6#r*KG-b4R?E2g=mhMr&>t{eY!uunu~C4gyC|u_hVBXS{)|( z100mVbB#%>57n-cJ9pyq92!xNqot3*V@RjUM@{*dz-n*dmX4P0&b93=jjOxYZ)$E_ z-;HNsyPLMOw&ID^_LkX$b}+g( z8an{h^4K*83AO0|vMC>ykMOGDIiB~==WBuHP{gzH$i>&H_w+6ZPA=p*N}7uVmTy>d zxR*B07O)CUx-;#)Ed$C0NId2~-)*%vXg(qHkfcH~ zXe!O73A{N;CHx#dnN&`bXtMqH6q>`2|Khtj{1C6Y;yGMg%lUCwb)ALxsqwSvW`4{Q zpWn>SSmNsACoI(!&sVDJe0{|emFjOi)~K#{-w zpwJ9=SJUgq&o`Nw<*dGwXwBDiN=TAk08e>{_&?ef9J9+d*ys}U?VYI}x zJ}^w@298t5G3vr)`!U)Pc$`i@Mmuq7I7U6VtU5-$xU4xwy8|`HXis3uiN~nV;TV8( zNSp~XegiIg4N|`aGyDb*tNxxAiCJiF;IV3PHqJ4xQc}&ZIBTgO14UtGqzQhaOw0EV z+`~UOaCn^Z)v|mwPts1-0M{N?0oPvE0oQ?JG{D#RF^cmwd5n^L-K~^+lJ*~?{rq=d znug~qhlcB+;U;Pjo2glxi%qR|>JS~YU2LV0IFI&<^YJug7hQsreC*3gOE=pB zhv^_Z#NIqihhPi#>^izw+u|Mk&AuA1EwELuY;lRU#fP*lF4MO7u(rjO+7?%7TYN;@ z;%aS+YjW5k32lj+wIyz0OW@`tzw8baumNna7pN&} zLE*56`X7Y)mqPs`Q2#Qhe>v2@0_tByJH$sQEUuHee2dK_DdF@VIa z~`Mh`u*WuRY7L%I8E_@fG|k%yTqPJP%hrM`wr^ zl^j-FT5h{yIsK4+1YH~l@F%b1lQ%#Q<~{>Ne@s8oit}Hr_(Y|0;7Qt(rnP0W*IXJ; z)SLwUl-|@tYH?*EvfxpERWe&6-*JtU_DEDh`9?~A&XG9glR46t!Bfu6Ir1%gW3f;2b9X1 zm#DDdQ9$Q+8){#qvf7%b=nn$VDZg_&75W}k&amcx8N5sqsX(qHzuZ72a--s5h4e}r zJeBk}`X6v9!Eb`Ri)uwG&`codf0t$&cw|!WBbi!^Hhj%qpTtlu6AzNVY|2q(4vXm| z7E%Ujg4{`_>~SeINi)=ly7EIVfm43;@l%mma;^Yzmb0+txG2hm!{siS zQh>s(S|-6yO=CE#%QX_))AzV2$)s|dO z`U=4DoQshg9G04;;v}&Eda>y?fGCrlf^evW|4`<9vJCgCi()DfV3ZbJ!)+3NS!*Gk zrb#=o2UT8X?D>wO$Fl(dv7LN!&cVHzgWWMYHCTv6_TbTh{u3A56wrmJ8pFt6xzbZ<(Fvu1IibumBtHnM`LtGCKcM1^KlZm*30-9LhQ@pGwk&Za! z9e&_Z6HUXHBC7C}O?C=RE+}=8O~)6LWqh5g$-42SsOH93L4}KAI=+~q3tuORrJD3+ z4c)1LE|dNM3^5AzfQ$N6d)iM0dO4nH>ZO?I^;nl#MppJ=aDw`PGnv(FC|IWGrK4Af zl~`hp7NXA9!Wz6l8_4oi6OvoAOGv{O(!knm5oBVlovmfd!rCg0wdM@06>L>Bb78Fo zv^=oZq**fVN| zxKK5x*cIg@+mPbl<7AI3mwoCgE&}TvcKNrSMZxXU5e#-)%uRm#ltAyz;cNwmZ@A1f zU2|n#U{SJG6_$9kIINXQ^WL5;3;i4xdMmeubWcX$CkJ+EV(yr=C)0bsa*5?6O&m@_ zWa3)X&%dB4_NWZQrbZP_6#=fI`g}uTU<1EPZVUwKYKO!@{5$M0P}Q%mkV<@hD)kwP zQNSW#TfG9o_6X!GL4LaoOKwS}I6!)Z_%O;RffG+xjzf&Ayu_FXF)AU({87ZXR&euT zG%>iLk!g)CsKVvtOv@St${K;1Y&$6A`5GX=O2yoYyEAPY%vAa^b5q-ZHNSpbEN=kY zk2|KfSZ)T(b4Ou$v$#d+>t=at4wiSL4r8A$bNd{*??pO+Q($dPLCrHm;>HG+^4>{t-i3l z@I^8M<%Q+Ahqahf!S7sJ%*A9SUz`kIf~NZhX^w9{G&n#@dCp??$EQGD`qk(GB7S6+a7UE&4L7=u$dCsaJp> z_?#wQ5?=+7bi{j?W((vl!2D}kJ7>+y4QaL#mbwaCFFUYSk<@pm;%`;26Kwty#0%iS zxd9LOWD&g+TM-Q7r4|gnVF92FM*4Oa96c<)qs)Z2ZlJ(ESyp)f?thRb`5vMQ-@`QD z_XyRY|FRhGxkGFLd8sYcQY{rY+wNbg-Osi_l&er8e=keq(c{baF}Z%|SjC#`Ph)b8 zC>e6amp3vd`;Wy>vKa1zM>(J^3QQG0MK3adr^$Y{9+ujHe>;c7FE@;cx4UZaM^Ejr z_;*JD)m!oX5Qg~?P4vA^<-Rvuf-KU;mL4S2S-BlKfF&t{%8yGpP7QZ z13~@_LH+_k+^Z^YL2#Hm%OZ~fGd#^!So4QN{6*IW(oPf@T)ZrIQLPskYF{NY->(VFPD{ER|)j z6`0GZf;%oH*pOlS6;Lgj2GitpJ)KmvILV3@f08^c(tAkUVb=2rQV+?Qj=j`;DqNg< zK4}32pDWHHIx0A2ajn+dYJw_o7B)d|Yax>bPNhkD^81sVoyG7KXv^`u6$OVpfiu0X zKq=Tei&#l4DfbFqp&=5pQm zxv0*KtHWRTgHd$hDi-+&T&^EC7vyZ%&ducyqj0ebIp%WfxVgwB8C)>KIEz`i)on4W z9Ahr`kBQ4>+{O78{Z^D+^3+T|(-a>oTNc^=FS3iJB0F0a>1@foKRYJgX~_FPCg+n! z(a@@1gggy-z{0mGNk&0;i=L}!+~k<2{&k9p73*9}YaLRt=u6F0c^ZOies*apot~+Z zyT#&i8n{hY06Yy@AwQ3NdBVTnWjR;frIqsGG2u(ILe8&sp;|v8CUn)-49n$QKH%RT z{NuW!3;%Ww$%dmFVaKy?r!qu~CM@FXeH_Q-n!0CIOsu5&oC^t8Y~EDkn8qn`ExzF$ z(vwl!k^dH&=)aXJaGmeJjZXC6PSyT9sm}i?TI#=xmizBf(pzb^-bP%#UVGs*g9_V{ zPNZ3KliUp2OR-UOF5X#HYXubq4Y~F`oMFLQRv5AwksKfJTddz%{ZC}6AHqt7Lwd!C zZ11Xtsy$pjvF=*$&S80;<4(0=_8+H7{->xMSLe(@g)MP~ux31nYKfWk^I5E~N5Q}e zb0M=X=M_(n$lzTwXHLbA>4n2`ns@C)WoeV4&O#}6=A?YNe01H;>l6A2y>tfj_xIhO-?NaQp$@&J?q-rHNBBM&AUN#-0tZ!HjY{Yf{-DKABbx0=8!!?OjF8`ez zk_Y(j-CRN8n9u`Mtft(>=ehPK76V0OR8pZapUQBZVVp=6#z}Otu@KeF$#l9=MJtVJ zT5SYqol)yjZ-cGg1|5j7T-EB$pfltLvAtM8E2&goio;me9Ggr9?}D_9PJWlB8R)k8 z_&HxMosVSce0he>S7zvZRW6-BlC5(ibZ&yqjnKInIYw0m@L|)TXhj{wYqa*T$E>1!>4$Dt423=dv zMh7t1Nu|blN=Pf+&b1vg*Um?Cbv^=p<)Q+$P{-o56f1Z9E>xB{7lRFpQw{*3lfs)V z=mibQTe%TbSa(#FVwNQ8aGVi@Bs(EVh^8Ao*h$~zlBnF4sN4?6x)u_B6cSwriLQr4Rx>KgMs~xj+k1mSWEB`@WO_R(4etfblgje;GQyLX+^`DMVbyBjnfQ%SwncErgGM z4@Iln4oxz@L{BU!6MRD@+kNIi(sjWAhjFDf5s|p?> zpAU)pRmV}PyJ5K3O|FeX`EQCOy9$Dqtir)X{^ci4J*uPa)HLdIDvrzVIP{gLiu`02 z88jJJr~l{L;M05v|HG10`*$jS!iiJ6i+35}e?Fmk_wbew#G1#4v+khTBl7!QHNG#> z6I}&-&Z*pb~m)t%MQoQpmMek@;eT&2N3 zk?EIBc`)PXl(J*dB1PBQa7^_DG_?|v@+Xj3%Ad+Nah(n2u+uMpwyK=Yl0R4174jE+ F{amUJ=;TnWe@SmJkqpNV_V+E>6AbN5#G*?= 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