From 5f843038fbc274615ddc113e421c379552e212c8 Mon Sep 17 00:00:00 2001 From: Michael Kuperstein Date: Tue, 23 Sep 2014 08:48:01 +0000 Subject: [PATCH] Ensure bitcode encoding stays stable. This includes constants, attributes, and some additional instructions not covered by previous tests. Work was done by lama.saba@intel.com. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218297 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Bitcode/constantsTest.3.2.ll | 124 +++++++++++++++++ test/Bitcode/constantsTest.3.2.ll.bc | Bin 0 -> 900 bytes test/Bitcode/conversionInstructions.3.2.ll | 51 ++++--- test/Bitcode/conversionInstructions.3.2.ll.bc | Bin 996 -> 1180 bytes test/Bitcode/highLevelStructure.3.2.ll | 86 ++++++++++++ test/Bitcode/highLevelStructure.3.2.ll.bc | Bin 0 -> 1220 bytes test/Bitcode/miscInstructions.3.2.ll | 127 +++++++++++++----- test/Bitcode/miscInstructions.3.2.ll.bc | Bin 908 -> 1540 bytes test/Bitcode/standardCIntrinsic.3.2.ll | 16 +++ test/Bitcode/standardCIntrinsic.3.2.ll.bc | Bin 0 -> 444 bytes test/Bitcode/terminatorInstructions.3.2.ll | 44 ++++-- test/Bitcode/terminatorInstructions.3.2.ll.bc | Bin 568 -> 816 bytes 12 files changed, 390 insertions(+), 58 deletions(-) create mode 100644 test/Bitcode/constantsTest.3.2.ll create mode 100644 test/Bitcode/constantsTest.3.2.ll.bc create mode 100644 test/Bitcode/highLevelStructure.3.2.ll create mode 100644 test/Bitcode/highLevelStructure.3.2.ll.bc create mode 100644 test/Bitcode/standardCIntrinsic.3.2.ll create mode 100644 test/Bitcode/standardCIntrinsic.3.2.ll.bc diff --git a/test/Bitcode/constantsTest.3.2.ll b/test/Bitcode/constantsTest.3.2.ll new file mode 100644 index 00000000000..b4973cf7a83 --- /dev/null +++ b/test/Bitcode/constantsTest.3.2.ll @@ -0,0 +1,124 @@ +; RUN: llvm-dis < %s.bc| FileCheck %s + +; constantsTest.3.2.ll.bc was generated by passing this file to llvm-as-3.2. +; The test checks that LLVM does not misread binary float instructions of +; older bitcode files. + +;global variable address +; CHECK: @X = global i32 0 +@X = global i32 0 +; CHECK: @Y = global i32 1 +@Y = global i32 1 +; CHECK: @Z = global [2 x i32*] [i32* @X, i32* @Y] +@Z = global [2 x i32*] [i32* @X, i32* @Y] + + +define void @SimpleConstants(i32 %x) { +entry: +; null +; CHECK: store i32 %x, i32* null + store i32 %x, i32* null + +; boolean +; CHECK-NEXT: %res1 = fcmp true float 1.000000e+00, 1.000000e+00 + %res1 = fcmp true float 1.0, 1.0 +; CHECK-NEXT: %res2 = fcmp false float 1.000000e+00, 1.000000e+00 + %res2 = fcmp false float 1.0, 1.0 + +;integer +; CHECK-NEXT: %res3 = add i32 0, 0 + %res3 = add i32 0, 0 + +;float +; CHECK-NEXT: %res4 = fadd float 0.000000e+00, 0.000000e+00 + %res4 = fadd float 0.0, 0.0 + + ret void +} + +define void @ComplexConstants(<2 x i32> %x){ +entry: +;constant structure +; CHECK: %res1 = extractvalue { i32, float } { i32 1, float 2.000000e+00 }, 0 + %res1 = extractvalue {i32, float} {i32 1, float 2.0}, 0 + +;const array +; CHECK-NEXT: %res2 = extractvalue [2 x i32] [i32 1, i32 2], 0 + %res2 = extractvalue [2 x i32] [i32 1, i32 2], 0 + +;const vector +; CHECK-NEXT: %res3 = add <2 x i32> , + %res3 = add <2 x i32> , + +;zeroinitializer +; CHECK-NEXT: %res4 = add <2 x i32> %x, zeroinitializer + %res4 = add <2 x i32> %x, zeroinitializer + + ret void +} + +define void @OtherConstants(i32 %x, i8* %Addr){ +entry: + ;undef + ; CHECK: %res1 = add i32 %x, undef + %res1 = add i32 %x, undef + + ;poison + ; CHECK-NEXT: %poison = sub nuw i32 0, 1 + %poison = sub nuw i32 0, 1 + + ;address of basic block + ; CHECK-NEXT: %res2 = icmp eq i8* blockaddress(@OtherConstants, %Next), null + %res2 = icmp eq i8* blockaddress(@OtherConstants, %Next), null + br label %Next + Next: + ret void +} + +define void @OtherConstants2(){ +entry: + ; CHECK: trunc i32 1 to i8 + trunc i32 1 to i8 + ; CHECK-NEXT: zext i8 1 to i32 + zext i8 1 to i32 + ; CHECK-NEXT: sext i8 1 to i32 + sext i8 1 to i32 + ; CHECK-NEXT: fptrunc double 1.000000e+00 to float + fptrunc double 1.0 to float + ; CHECK-NEXT: fpext float 1.000000e+00 to double + fpext float 1.0 to double + ; CHECK-NEXT: fptosi float 1.000000e+00 to i32 + fptosi float 1.0 to i32 + ; CHECK-NEXT: uitofp i32 1 to float + uitofp i32 1 to float + ; CHECK-NEXT: sitofp i32 -1 to float + sitofp i32 -1 to float + ; CHECK-NEXT: ptrtoint i32* @X to i32 + ptrtoint i32* @X to i32 + ; CHECK-NEXT: inttoptr i8 1 to i8* + inttoptr i8 1 to i8* + ; CHECK-NEXT: bitcast i32 1 to <2 x i16> + bitcast i32 1 to <2 x i16> + ; CHECK-NEXT: getelementptr i32* @X, i32 0 + getelementptr i32* @X, i32 0 + ; CHECK-NEXT: getelementptr inbounds i32* @X, i32 0 + getelementptr inbounds i32* @X, i32 0 + ; CHECK: select i1 true, i32 1, i32 0 + select i1 true ,i32 1, i32 0 + ; CHECK-NEXT: icmp eq i32 1, 0 + icmp eq i32 1, 0 + ; CHECK-NEXT: fcmp oeq float 1.000000e+00, 0.000000e+00 + fcmp oeq float 1.0, 0.0 + ; CHECK-NEXT: extractelement <2 x i32> , i32 1 + extractelement <2 x i32> , i32 1 + ; CHECK-NEXT: insertelement <2 x i32> , i32 0, i32 1 + insertelement <2 x i32> , i32 0, i32 1 + ; CHECK-NEXT: shufflevector <2 x i32> , <2 x i32> zeroinitializer, <4 x i32> + shufflevector <2 x i32> , <2 x i32> zeroinitializer, <4 x i32> + ; CHECK-NEXT: extractvalue { i32, float } { i32 1, float 2.000000e+00 }, 0 + extractvalue { i32, float } { i32 1, float 2.0 }, 0 + ; CHECK-NEXT: insertvalue { i32, float } { i32 1, float 2.000000e+00 }, i32 0, 0 + insertvalue { i32, float } { i32 1, float 2.0 }, i32 0, 0 + + ret void +} \ No newline at end of file diff --git a/test/Bitcode/constantsTest.3.2.ll.bc b/test/Bitcode/constantsTest.3.2.ll.bc new file mode 100644 index 0000000000000000000000000000000000000000..8454befe72bdc50181ba2317d4955574b5f9653e GIT binary patch literal 900 zcmY+DUr19?9LIn6-m|+qz0Pyzs129g{ZS+o#xznp`*yB?%$$u^@Vwx^#h7ReZXKRD<2JLmlPe);^k*X>Dc zS$Tjh0LTuDK$C1BOB=G^l~c&iVprt^73B*xoVftqX;+N3w0k1kJ&Rq&3eM!ua(NxT zthm*lJge|#Yo9}#@(Jy8({s}DE=6=kM1VsiyKFw4*m(=xv&}}y_9Z$KHyY|kW7*N! zdfeHM0+OhqM+C)&rHdvRMkW1BB^_-xb1lh}QfduW1yl!4O~RPK2@6#o6I+%zM0Bfi zy*|<5W~vlT0ZU3(!6Y^d_3@al=)^Me&~_-4 zXblI0CIErFmvM?EnYMHpshVL=MRY0VR>@0JWU%I6-E8OG90RECjJ6BN7 %vecPtr){ +entry: +; CHECK: %res1 = ptrtoint i32* %ptr to i8 + %res1 = ptrtoint i32* %ptr to i8 +; CHECK-NEXT: %res2 = ptrtoint <4 x i32*> %vecPtr to <4 x i64> + %res2 = ptrtoint <4 x i32*> %vecPtr to <4 x i64> + + ret void +} + +define void @inttoptrInstr(i32 %x, <4 x i32> %vec){ +entry: +; CHECK: %res1 = inttoptr i32 %x to i64* + %res1 = inttoptr i32 %x to i64* +; CHECK-NEXT: inttoptr <4 x i32> %vec to <4 x i8*> + %res2 = inttoptr <4 x i32> %vec to <4 x i8*> + ret void } diff --git a/test/Bitcode/conversionInstructions.3.2.ll.bc b/test/Bitcode/conversionInstructions.3.2.ll.bc index fabf7dab6fb876c375e394b5a54ca7ec09bffddd..a6f8a47736acecfd113881a582705a950964afd1 100644 GIT binary patch delta 570 zcmaFDK8KUb$@#!NMIHtQ6~>8NQHq#O5!(@3zUqq+N7#*Uc{I0lFzXVHo+#A9>$%$Ca!4-BIloYbSO#)8Cf1p zW_A1M!`FJF(NS@7u+6m#3TI6$&x?SR0WC^YU|`?`(!wkUSw#(GI6#)O2MC-MNqlDD zF)@MP#l^!ED8w*Xf=NKc42y!v0!$JjVYnoooYj5O^|QF z!NLoqfx*IQ>VKdUq>ls0hXl>HgpigAeiJQu&WlL02nq(}3IcVTOA#^GVw?O^MrQB$=-~< z^`Z<63}yu)=S2d06Sz1o`Aq)oGm%q3sL(epLFD`sj}Ao%AtTG9$t*C^J3KW{$&Lk*efJJ_C1CxYE0CovAHi#KuH7tghhJz#~ ze_-N6Qa4$K8O}9eMls#$%)jH6ga;3PNN*eRqN8$Ko?We;`GwGZpt zO}v$i<{^_Ih3(?fd?#g8e~YRBuSx*EA_Ex!I`Q)qPJNVISH{}(`1yIsQv2MbE27+*GW8KTHSbGV zdOSExLSx=|`gF!yiJn?}(^R{n@1ORp6aUn*z0B_)A|;H40Q|W7EH=p$_7x|#JH-Zc zdAgvRYjPBBx>HbOq$u>abtO4f(5tDsRKNPxBi^%QRDs$>`?E zXd_Brq-rEZ?(@?dCvzJGiUmApZv3B06I5JagtR-5d>4yn$Fg3H>@W=*+_lBILLw|l z_puj#ED^SkSzJ4o4%;>t z59vXc=5+crrv3Sl;$Qs7zT$t74_}XDDtt6!!WYHpMM>d!C!k)^87QdaN=1-j!ex9c z6K5bpcNm8tdaAlxlB*&%*H3itpb|?bP2i}QQLn6UF~1I#fIC$8Pyr*T5NJasbf;g~ zf@(y}CoovhQF)^TA+s-y{?1;IbM1ccR@_MDMo2tzJJ{tPuaw(gxo}@GisF6Tz`6F} zZdiSje9t()zWTcAU&yZ<(!a9Qus)lNJzPzEw@PX~wZ)!|{00!k$q{d1h?wEE-@})K zQlexGTdU=i>ACTN=i2S7>J!ioblNoOkeZ6rR(c*RhA+q54s5o2)0J2^5@lBcIj%B% zv$&7iOI(T7UmN-MrT#OzR6aLx>Akj#-Zb2ucx!2^FfaS7@BS1#cxHl6&a7p-6?uR# z|LlyP++${1{br0+i_kf^eXigDD&56a%HIn|%-^3GXfaQ0)mqWVUk@HRXFi$Dle5u@ zwruED;L*?ar(mdOpXu}Nqk3lKRz1^OW-I+y$YcEk>klX^ %cond2, <2 x i8> %x1, <2 x i8> %x2){ +entry: +; CHECK: %res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 + %res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 +; CHECK: catch i8** @_ZTIi + catch i8** @_ZTIi + ret void +} + +define void @landingpadInstr2(i1 %cond1, <2 x i1> %cond2, <2 x i8> %x1, <2 x i8> %x2){ +entry: +; CHECK: %res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 + %res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 +; CHECK: cleanup + cleanup + ret void +} + +define void @landingpadInstr3(i1 %cond1, <2 x i1> %cond2, <2 x i8> %x1, <2 x i8> %x2){ +entry: +; CHECK: %res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 + %res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0 +; CHECK: catch i8** @_ZTIi + catch i8** @_ZTIi +; CHECK: filter [1 x i8**] [i8** @_ZTId] + filter [1 x i8**] [i8** @_ZTId] + ret void +} + +define void @phiInstr(){ +LoopHeader: + %x = add i32 0, 0 + br label %Loop +Loop: +; CHECK: %indvar = phi i32 [ 0, %LoopHeader ], [ %nextindvar, %Loop ] + %indvar = phi i32 [ 0, %LoopHeader ], [ %nextindvar, %Loop ] + %nextindvar = add i32 %indvar, 1 + br label %Loop + ret void +} + +define void @selectInstr(i1 %cond1, <2 x i1> %cond2, <2 x i8> %x1, <2 x i8> %x2){ +entry: +; CHECK: %res1 = select i1 %cond1, i8 1, i8 0 + %res1 = select i1 %cond1, i8 1, i8 0 +; CHECK-NEXT: %res2 = select <2 x i1> %cond2, <2 x i8> %x1, <2 x i8> %x2 + %res2 = select <2 x i1> %cond2, <2 x i8> %x1, <2 x i8> %x2 + + ret void +} + define void @icmp(i32 %x1, i32 %x2, i32* %ptr1, i32* %ptr2, <2 x i32> %vec1, <2 x i32> %vec2){ entry: ; CHECK: %res1 = icmp eq i32 %x1, %x2 %res1 = icmp eq i32 %x1, %x2 - + ; CHECK-NEXT: %res2 = icmp ne i32 %x1, %x2 %res2 = icmp ne i32 %x1, %x2 - + ; CHECK-NEXT: %res3 = icmp ugt i32 %x1, %x2 %res3 = icmp ugt i32 %x1, %x2 - + ; CHECK-NEXT: %res4 = icmp uge i32 %x1, %x2 %res4 = icmp uge i32 %x1, %x2 - + ; CHECK-NEXT: %res5 = icmp ult i32 %x1, %x2 %res5 = icmp ult i32 %x1, %x2 - + ; CHECK-NEXT: %res6 = icmp ule i32 %x1, %x2 %res6 = icmp ule i32 %x1, %x2 - + ; CHECK-NEXT: %res7 = icmp sgt i32 %x1, %x2 %res7 = icmp sgt i32 %x1, %x2 - + ; CHECK-NEXT: %res8 = icmp sge i32 %x1, %x2 %res8 = icmp sge i32 %x1, %x2 - + ; CHECK-NEXT: %res9 = icmp slt i32 %x1, %x2 %res9 = icmp slt i32 %x1, %x2 - + ; CHECK-NEXT: %res10 = icmp sle i32 %x1, %x2 %res10 = icmp sle i32 %x1, %x2 - + ; CHECK-NEXT: %res11 = icmp eq i32* %ptr1, %ptr2 %res11 = icmp eq i32* %ptr1, %ptr2 - + ; CHECK-NEXT: %res12 = icmp eq <2 x i32> %vec1, %vec2 %res12 = icmp eq <2 x i32> %vec1, %vec2 - + ret void } @@ -51,55 +110,55 @@ define void @fcmp(float %x1, float %x2, <2 x float> %vec1, <2 x float> %vec2){ entry: ; CHECK: %res1 = fcmp oeq float %x1, %x2 %res1 = fcmp oeq float %x1, %x2 - + ; CHECK-NEXT: %res2 = fcmp one float %x1, %x2 %res2 = fcmp one float %x1, %x2 - + ; CHECK-NEXT: %res3 = fcmp ugt float %x1, %x2 %res3 = fcmp ugt float %x1, %x2 - + ; CHECK-NEXT: %res4 = fcmp uge float %x1, %x2 %res4 = fcmp uge float %x1, %x2 - + ; CHECK-NEXT: %res5 = fcmp ult float %x1, %x2 %res5 = fcmp ult float %x1, %x2 - + ; CHECK-NEXT: %res6 = fcmp ule float %x1, %x2 %res6 = fcmp ule float %x1, %x2 - + ; CHECK-NEXT: %res7 = fcmp ogt float %x1, %x2 %res7 = fcmp ogt float %x1, %x2 - + ; CHECK-NEXT: %res8 = fcmp oge float %x1, %x2 %res8 = fcmp oge float %x1, %x2 - + ; CHECK-NEXT: %res9 = fcmp olt float %x1, %x2 %res9 = fcmp olt float %x1, %x2 - + ; CHECK-NEXT: %res10 = fcmp ole float %x1, %x2 %res10 = fcmp ole float %x1, %x2 - + ; CHECK-NEXT: %res11 = fcmp ord float %x1, %x2 %res11 = fcmp ord float %x1, %x2 - + ; CHECK-NEXT: %res12 = fcmp ueq float %x1, %x2 %res12 = fcmp ueq float %x1, %x2 - + ; CHECK-NEXT: %res13 = fcmp une float %x1, %x2 %res13 = fcmp une float %x1, %x2 - + ; CHECK-NEXT: %res14 = fcmp uno float %x1, %x2 %res14 = fcmp uno float %x1, %x2 - + ; CHECK-NEXT: %res15 = fcmp true float %x1, %x2 %res15 = fcmp true float %x1, %x2 - + ; CHECK-NEXT: %res16 = fcmp false float %x1, %x2 %res16 = fcmp false float %x1, %x2 - + ; CHECK-NEXT: %res17 = fcmp oeq <2 x float> %vec1, %vec2 %res17 = fcmp oeq <2 x float> %vec1, %vec2 - + ret void } @@ -110,13 +169,13 @@ entry: ; CHECK: %res1 = call i32 @test(i32 %x) %res1 = call i32 @test(i32 %x) - + ; CHECK-NEXT: %res2 = tail call i32 @test(i32 %x) %res2 = tail call i32 @test(i32 %x) - + ; CHECK-NEXT: %res3 = call i32 (i8*, ...)* @printf(i8* %msg, i32 12, i8 42) %res3 = call i32 (i8*, ...)* @printf(i8* %msg, i32 12, i8 42) - + ret void } diff --git a/test/Bitcode/miscInstructions.3.2.ll.bc b/test/Bitcode/miscInstructions.3.2.ll.bc index 9d479b506171764b8fd87e9611ce20bbf34e761a..ed63d7059faeb720db83d064f1de9b3a47c21001 100644 GIT binary patch delta 1122 zcmb7CT}TvB6ux)%?l|hGGmdLxYc->*NEB>pmJv16PU~u$?CM&W7CUC)LnA^z5LCP6 zCK6`Z3K{kgAwds8g^Mo*D&|9FKWeE3fduu?Ls+=4b?=N1_E6A;Ip>>u&-u=G&b>V; zF*a?FXY`ZI0&oHLrM1JgeP^Y}xs!;2X(v%Q(5befaIYkKxn3Q?lFOAPMRi5)i8i*7 z@l?JPUp=krpu?hiy+$9p9dC1Zr6#(JS}f>MKQMZ0bbtaovNWGm=u*HJxDjlO$~6#} ziw)*lAl&`f0>IO6x6l#sZn=dzM|Mi~K;;KpHp^EU{Susw*+Q|-;J4YoP_U-`KtdvPtmp~^89)!bSDq22i zV_ORMzcqk*B7IVjr$PhD((4D?MVky>w7_S(M+ztq0lEZ0Di$FibrXj@5nk>EATMTv z6vin5ZYoE|054qvAQO85jorC8rYgWEW+MF0;LnOn2AJBiSvrXAe6HM_sAg^&f=Bb= z0K9YwfDG(OJ{(hFbTOj*S8}$QYzZaeX1_9|KIo*GHIQ=KVV4d5TTIR$VjK~Z&|`K^ z2yy2%gs_Nl@8j4IOS_SS#W1{`GpCetr@!}S47s_!YSC8~Qd)%?PqQ%1I=Duy<1h&B zcx5B$W~T!7tEY z`uXDyLf%No&tT3|PRyCzo)>pfZILcgq{%F@mJ~5ak)+g|Q1M;n@6~);jdj?bHr8XC zFg9SjZ1CD%CQ;2f0#$`az1cRk%xid0mDSDJVw!pl?wF%$_&LU2@Z)8jvS{LodlA2l#Ce;b2J5V zC7iKrdB!0S6w1*ZA?XnDq)UM5pk-5ngyRGTAaI_-1fm!iBo?Va7zYHFGBPQE*lim8 z5FrDXP6(sH252dRAP^gKG{_uzD3d0_Xxrgz(QBDkFS8B;@2_rjI@o zb6F3C&TcHY=@#hH5^^~VL|#t=k+-KggtP?AW(pK+s%2ok=p&fM4b;BX5UBm;H3yfL zlG)6HfV26aWCyYmSxx diff --git a/test/Bitcode/standardCIntrinsic.3.2.ll b/test/Bitcode/standardCIntrinsic.3.2.ll new file mode 100644 index 00000000000..09f2378a221 --- /dev/null +++ b/test/Bitcode/standardCIntrinsic.3.2.ll @@ -0,0 +1,16 @@ +; RUN: llvm-dis < %s.bc| FileCheck %s + +; standardCIntrinsic.3.2.ll.bc was generated by passing this file to llvm-as-3.2. +; The test checks that LLVM does not misread standard C library intrinsic functions +; of older bitcode files. + +define void @memcpyintrinsic(i8* %dest, i8* %src, i32 %len) { +entry: + +; CHECK: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 %len, i32 1, i1 true) + call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 %len, i32 1, i1 true) + + ret void +} + +declare void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 %len, i32 %align, i1 %isvolatile) \ No newline at end of file diff --git a/test/Bitcode/standardCIntrinsic.3.2.ll.bc b/test/Bitcode/standardCIntrinsic.3.2.ll.bc new file mode 100644 index 0000000000000000000000000000000000000000..3ffb1af4fa7cb98cb61f24e7d5420f9055471acb GIT binary patch literal 444 zcmZ>AK5$Qwhk+r7fq{X$Nr8b0NDBcmd!zD1#}h1`Yyw7>lNeigR9QJBVJ3|N$HBrf>~Uh?QjV7$30r02Xq&xeG6&dPiKU*LGJyqz}@s2}8CVHQUn5Djv* xiK;^wGmuth<6w|sHRNDyV`c<}nVADmi;1j*qe*a!P1|coF;KQEfFvhvEY#K3Ms8Dla-dV0Ex#f3nz#O`E>Pgw=D4y z@F-?UFmM+TVPp|fWpH`MAzC`7GFfecetrKQ()B#xw@->SW1A}A>Gb0m_%^o0dRwNO~ z0D?pX1_m}DEzH8$#tc-5OfH}$$&p0H2;)hMN zIaaM^uvKUlU~v*)X_??I6$!MGfq?@kDW0I?;GpxBQN+dA^#-p5w}8OuTBc)6EJu=V KI~IUk2n7K7MrEY{ delta 239 zcmdnMwu6P!$@#!NMIHu*?uncl^#ZO;PLsHuS_F(lEI1@Qxr|&?Jh&z(Djx}I;E_}; zQei*AA(*sc!3u|C9~c=J7&;Xg82Ev-krD@|LP{%(u+owiAn~|m;RF#OpN<~xmKGlY zi(-}p19t%t#-=4K4kqpm6GR#N3Ro7fcv-UowK6zQ0ht5@5{pD8?vP}j(9SsVgO3I$ zP(*Ek!r2Cw76aCaj1oWYy#5|aESU?s404ypzWdHyG