From 709c4d66e0b107ca606941b988bad717c0b45d9b Mon Sep 17 00:00:00 2001 From: Denys Dmytriyenko Date: Tue, 17 Mar 2009 14:32:59 -0400 Subject: rename packages/ to recipes/ per earlier agreement See links below for more details: http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326 http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816 Signed-off-by: Denys Dmytriyenko Acked-by: Mike Westerhof Acked-by: Philip Balister Acked-by: Khem Raj Acked-by: Marcin Juszkiewicz Acked-by: Koen Kooi Acked-by: Frans Meulenbroeks --- .../debian/libjava-loading-constraints.dpatch | 431 +++++++++++++++++++++ 1 file changed, 431 insertions(+) create mode 100644 recipes/gcc/gcc-4.3.3/debian/libjava-loading-constraints.dpatch (limited to 'recipes/gcc/gcc-4.3.3/debian/libjava-loading-constraints.dpatch') diff --git a/recipes/gcc/gcc-4.3.3/debian/libjava-loading-constraints.dpatch b/recipes/gcc/gcc-4.3.3/debian/libjava-loading-constraints.dpatch new file mode 100644 index 0000000000..85f13ebe41 --- /dev/null +++ b/recipes/gcc/gcc-4.3.3/debian/libjava-loading-constraints.dpatch @@ -0,0 +1,431 @@ +#! /bin/sh -e + +# DP: Reimplement loading constraints (taken from the trunk). + +dir= +if [ $# -eq 3 -a "$2" = '-d' ]; then + pdir="-d $3" + dir="$3/" +elif [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +case "$1" in + -patch) + patch $pdir -f --no-backup-if-mismatch -p0 < $0 + uudecode $0 + tar -xv -f class-loader-classes.tar.bz2 -C ${dir}libjava + rm -f class-loader-classes.tar.bz2* + ;; + -unpatch) + patch $pdir -f --no-backup-if-mismatch -R -p0 < $0 + ;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +esac +exit 0 + +2008-03-13 Tom Tromey + + * java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader): + Check loading constraints. + (_Jv_CheckOrCreateLoadingConstraint): New function. + * java/lang/ClassLoader.java (loadingConstraints): New field. + * link.cc (_Jv_Linker::find_field): Use + _Jv_CheckOrCreateLoadingConstraint. + (_Jv_Linker::check_loading_constraints): New function. + (_Jv_Linker::resolve_method_entry): Use + check_loading_constraints. + (_Jv_Linker::append_partial_itable): Likewise. + (_Jv_Linker::layout_vtable_methods): Likewise. + * include/jvm.h (_Jv_Linker::check_loading_constraints): Declare. + (_Jv_CheckOrCreateLoadingConstraint): Declare. + +--- libjava/include/jvm.h.orig 2008-03-21 22:09:54.249100837 +0100 ++++ libjava/include/jvm.h 2008-03-21 22:10:20.739500439 +0100 +@@ -1,6 +1,6 @@ + // jvm.h - Header file for private implementation information. -*- c++ -*- + +-/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation ++/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation + + This file is part of libgcj. + +@@ -265,6 +265,7 @@ + jclass, jclass *); + static _Jv_Field *find_field(jclass, jclass, jclass *, _Jv_Utf8Const *, + _Jv_Utf8Const *); ++ static void check_loading_constraints (_Jv_Method *, jclass, jclass); + static void prepare_constant_time_tables(jclass); + static jshort get_interfaces(jclass, _Jv_ifaces *); + static void link_symbol_table(jclass); +@@ -557,6 +558,9 @@ + jboolean is_jni_call = true, + jclass iface = NULL); + ++extern void _Jv_CheckOrCreateLoadingConstraint (jclass, ++ java::lang::ClassLoader *); ++ + extern jobject _Jv_NewMultiArray (jclass, jint ndims, jint* dims) + __attribute__((__malloc__)); + +--- libjava/java/lang/ClassLoader.h.orig 2008-03-21 22:09:54.249100837 +0100 ++++ libjava/java/lang/ClassLoader.h 2008-03-21 22:10:20.749500589 +0100 +@@ -86,6 +86,7 @@ + void checkInitialized(); + public: // actually package-private + ::java::util::HashMap * __attribute__((aligned(__alignof__( ::java::lang::Object)))) loadedClasses; ++ ::java::util::HashMap * loadingConstraints; + ::java::util::HashMap * definedPackages; + private: + ::java::lang::ClassLoader * parent; +--- libjava/java/lang/ClassLoader.java.orig 2008-03-21 22:09:54.249100837 +0100 ++++ libjava/java/lang/ClassLoader.java 2008-03-21 22:10:20.749500589 +0100 +@@ -1,5 +1,5 @@ + /* ClassLoader.java -- responsible for loading classes into the VM +- Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -45,6 +45,7 @@ + + import java.io.IOException; + import java.io.InputStream; ++import java.lang.ref.WeakReference; + import java.net.URL; + import java.nio.ByteBuffer; + import java.security.CodeSource; +@@ -130,6 +131,15 @@ + final HashMap loadedClasses = new HashMap(); + + /** ++ * Loading constraints registered with this classloader. This maps ++ * a class name to a weak reference to a class. When the reference ++ * is non-null, it means that a reference to the name must resolve ++ * to the indicated class. ++ */ ++ final HashMap> loadingConstraints ++ = new HashMap>(); ++ ++ /** + * All packages defined by this classloader. It is not private in order to + * allow native code (and trusted subclasses) access to this field. + */ +--- libjava/java/lang/natClassLoader.cc.orig 2008-03-21 22:09:54.249100837 +0100 ++++ libjava/java/lang/natClassLoader.cc 2008-03-21 22:10:20.749500589 +0100 +@@ -1,6 +1,6 @@ + // natClassLoader.cc - Implementation of java.lang.ClassLoader native methods. + +-/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation ++/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008 Free Software Foundation + + This file is part of libgcj. + +@@ -41,6 +41,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -143,7 +144,21 @@ + // them later. + return; + } +- loader->loadedClasses->put(klass->name->toString(), klass); ++ ++ JvSynchronize sync (loader->loadingConstraints); ++ ++ using namespace java::lang::ref; ++ ++ jstring name = klass->getName(); ++ WeakReference *ref = (WeakReference *) loader->loadingConstraints->get (name); ++ if (ref) ++ { ++ jclass constraint = (jclass) ref->get(); ++ if (constraint && constraint != klass) ++ throw new java::lang::LinkageError(JvNewStringLatin1("loading constraint violated")); ++ } ++ loader->loadingConstraints->put(name, new WeakReference(klass)); ++ loader->loadedClasses->put(name, klass); + } + + // If we found an error while defining an interpreted class, we must +@@ -156,6 +171,46 @@ + loader->loadedClasses->remove(klass->name->toString()); + } + ++// Check a loading constraint. In particular check that, if there is ++// a constraint for the name of KLASS in LOADER, that it maps to ++// KLASS. If there is no such constraint, make a new one. If the ++// constraint is violated, throw an exception. Do nothing for ++// primitive types. ++void ++_Jv_CheckOrCreateLoadingConstraint (jclass klass, ++ java::lang::ClassLoader *loader) ++{ ++ // Strip arrays. ++ while (klass->isArray()) ++ klass = klass->getComponentType(); ++ // Ignore primitive types. ++ if (klass->isPrimitive()) ++ return; ++ ++ if (! loader) ++ loader = java::lang::VMClassLoader::bootLoader; ++ jstring name = klass->getName(); ++ ++ JvSynchronize sync (loader->loadingConstraints); ++ ++ using namespace java::lang::ref; ++ ++ WeakReference *ref = (WeakReference *) loader->loadingConstraints->get (name); ++ if (ref) ++ { ++ jclass constraint = (jclass) ref->get(); ++ if (constraint) ++ { ++ if (klass != constraint) ++ throw new java::lang::LinkageError(JvNewStringLatin1("loading constraint violated")); ++ // Otherwise, all is ok. ++ return; ++ } ++ } ++ // No constraint (or old constraint GC'd). Make a new one. ++ loader->loadingConstraints->put(name, new WeakReference(klass)); ++} ++ + + // Class registration. + // +--- libjava/link.cc.orig 2008-03-21 22:09:54.249100837 +0100 ++++ libjava/link.cc 2008-03-21 22:24:51.692638568 +0100 +@@ -246,13 +246,9 @@ + if (_Jv_CheckAccess (klass, *found_class, the_field->flags)) + { + // Note that the field returned by find_field_helper is always +- // resolved. There's no point checking class loaders here, +- // since we already did the work to look up all the types. +- // FIXME: being lazy here would be nice. +- if (the_field->type != field_type) +- throw new java::lang::LinkageError +- (JvNewStringLatin1 +- ("field type mismatch with different loaders")); ++ // resolved. However, we still use the constraint mechanism ++ // because this may affect other lookups. ++ _Jv_CheckOrCreateLoadingConstraint (klass, (*found_class)->loader); + } + else + { +@@ -269,6 +265,23 @@ + return the_field; + } + ++// Check loading constraints for method. ++void ++_Jv_Linker::check_loading_constraints (_Jv_Method *method, jclass self_class, ++ jclass other_class) ++{ ++ JArray *klass_args; ++ jclass klass_return; ++ ++ _Jv_GetTypesFromSignature (method, self_class, &klass_args, &klass_return); ++ jclass *klass_arg = elements (klass_args); ++ java::lang::ClassLoader *found_loader = other_class->loader; ++ ++ _Jv_CheckOrCreateLoadingConstraint (klass_return, found_loader); ++ for (int i = 0; i < klass_args->length; i++) ++ _Jv_CheckOrCreateLoadingConstraint (*(klass_arg++), found_loader); ++} ++ + _Jv_Method * + _Jv_Linker::resolve_method_entry (jclass klass, jclass &found_class, + int class_index, int name_and_type_index, +@@ -359,6 +372,11 @@ + throw new java::lang::NoSuchMethodError (sb->toString()); + } + ++ // if (found_class->loader != klass->loader), then we must actually ++ // check that the types of arguments correspond. JVMS 5.4.3.3. ++ if (found_class->loader != klass->loader) ++ check_loading_constraints (the_method, klass, found_class); ++ + return the_method; + } + +@@ -891,7 +909,8 @@ + continue; + + meth = NULL; +- for (jclass cl = klass; cl; cl = cl->getSuperclass()) ++ jclass cl; ++ for (cl = klass; cl; cl = cl->getSuperclass()) + { + meth = _Jv_GetMethodLocal (cl, iface->methods[j].name, + iface->methods[j].signature); +@@ -913,6 +932,9 @@ + itable[pos] = (void *) &_Jv_ThrowAbstractMethodError; + else + itable[pos] = meth->ncode; ++ ++ if (cl->loader != iface->loader) ++ check_loading_constraints (meth, cl, iface); + } + else + { +@@ -1467,6 +1489,11 @@ + sb->append(_Jv_GetMethodString(declarer, super_meth)); + throw new VerifyError(sb->toString()); + } ++ else if (declarer->loader != klass->loader) ++ { ++ // JVMS 5.4.2. ++ check_loading_constraints (meth, klass, declarer); ++ } + } + } + + +begin 644 class-loader-classes.tar.bz2 +M0EIH.3%!62936;AC>/P`$B'_____________________________________ +M________X!6?>GEKK>IQ%5[=.%0070O6<+;>];;V[[P&^V:]RKXV;8WK.('; +M!H:"@#;-,'G=N]V!J:30!&B:8AJGFF0-)HGFI/0Q/5/*;3:IY3U-M1,FI^J9 +MXE/`U/5!^J>IYJ>IIIM)LBGIE-IZ)F13]3U3>I-/94:>4>F9)IZDT]0]IJ@V +MIXH&TGE-/3T:HTQ/4]&C1IJ/4:`T031-,"9":8FIZ&2GM)IZ3$TR:FU&C(GM +M*/4]1F:4]$>H>4]1X4-I!M1Z&4-!ZC1D]1H]"!B:'H3`:3(,F:FT0>4TQ#0! +MB-/2:;4T&Q)IZ@:$:!!-11ZGA1C4](V4-`]3(/:H]1Z@`!D`!H:`:`#3T0`` +M!H`!H````]0#30T``]0&@-`-`--`:`)-20C4*>1HRIZGJ#3:GFE,F::@PAZ0 +M'J#)Z@TTT!D;4/1-J>IH!ZAH:`T/*`-#0```!Z@`&FC0````&@!D!H`$```` +M``````!,```````````F``````````````````$P$P)$DT)IH),-)IDTT(VF +M(1Z*>TIZ3R3PIDT&(#33$T>D&C0R-`-`!H````!H`:``&F@````````:`+40 +MP,AXAHV[384=&=*:I_H[F;&$@=O37@`S\@]IP%T.,X'0,ER*QC?1QSRUW6N" +M,PD32^QGX&7VT)L,"HQLLV_A$&=,*!-;&"*90NL**ZQZ$2E+7^&68,XD +MZ2L-J&VEA="HDKM#=(RL%]F7&*"*JQ;(5';J(%2;Q.A.*U0,-@1P8$.WD]@LZ*(+8/Q +MM2^67GXUDF$[MV*91J,-Q06UU8-K,$JF";`4%N=>X=8:D)$PT3#&JK1PF +M`6FCDVM\`OR89!US!(FP$DN'GR:J3I?3Z^*W$,PN@9,1IT2%8*V!L&,O3JI5 +M9V7FG=(-/TD2LS&X4'>0H"1[(-_EJ1(\?O,8Y'5]&9\O%]=JW;YJ->]TMO&3 +MUW0O>4K#;_1LB0M"2)(89D*IVLG-0=09=D.?N@!8^15(J,.O%"N5XG;T:=]U +MW"WV<%9HYM;QMB!+Y"WJQHK6!K:^WW/3,V*>OSZ"6BLCN=38I2D'=Y:$6$(:)"SOK,X#:Q[ +M+:)P*%QZF^?P"D*K7+,D3[+;EK-FHG=U,%,@9&1F0,#/U#$`.FFE[,JK"!;O +M:9GS/GY-9C;[R4!XZB(Z7S3,MV8K7!X,$95GI;Z8J?DZ'P>+Y7?/6?7?`%9* +M`^02!IR^$4LLMO"VFI?+^O'W_728W=<'7?#F4``8K;#,EEEHL;,OS_V0!U'X +MYR=^^ALB"$9<.8A)%`^@O/])`I]DQ+I`.X^K==RM9DILN(F?W,LG(DP5'`39 +M$54$10]$AH`8>^6;0K'NX(6U0;O<1<#[O)=MYKUGIFC`-RI-]Z5NE8I*`7N\ +MP.=_L@H!(;5?#6K\UD`25NI!)WMYH^/Y7=]5%:<=$_ZZM,#Q$C&]ER8U+I;GC=BY\)=H@!G: +M*::N"G;4X5`'0PN6Y<5VGN=;P,')31=0`V9$D"%)UM2:R&$8"]5YMORU$"HS +M/7UO=R$Q$,I:0QD5]=7*Y2''F17^;O;,JK@Z,(C62SN+OL]]M(NSD4%Q[B&2 +M&2JIK]V"1%2$IU5[:31T2H]L.3$83K6I3-D=3N=JFGTF`V`>"N?&!Q.>X?6?KJ..`4;;$P#0"V.W"?M+'?RZ%:A<*Y@_/`-1 +M!U]#N0@!1Z5JU84FUAMJ`C_Y")13(2'H+#8C>@3]R@@4/L(:^!\1'5FJ5""% +M5/?77,VOVZ+Z7SJ,D9`S`Z>`8PI`;JTREAX/[GX:)_=[$[<-,U(C#>L,/.[I +MXST?5M/GS,HN_X!^9_R3$X5;-TNB<<6FZ7C9DRXX^PX2A78UNM=M?^U9U/:- +M.BGXEFIAAS7^1P98&8F<.(/@68-LRLL`6'LGE>BHD.V)--&1CAQ`5<*>UII3 +M;XKW@2D6QLG#4MJX-TGPEENNNFN2Z:E*I0*&>SH,:=!$0,`E+UVIY/I['V)F +M%@TN]]O*>QD]2OR:[I]7UK/;V/8Z=%Z6_I_^M7'7]#2N#>(0,!RGW+Y'6]6^ +MP*;^-[NI.7#\YE(OUB-8VVHLD2-)U):CBZ/3>2,X&+^D\COQG4]".VQ-`W7L +M&77M;=\/N2ZO?FUO7_2QWP=O&YIZ')R88;Z]NHM#E7[*!USJT=0I/%4I7'3FT[A+(F7#4WU'Y>'8F5', +MIRIO=[CWCAV69]2KI4GO%JIWS)^:?)DSJ +M'!)&7"9$,C'XF[0&Z6. +MIL,Y:JX1*?TR(3\U!)1HCQ-A0C]'W]I+W2GJ-3&NB;I6+UGQV/_$[UUM(?(AT56-55502B4 +MK>G@+3QZ44!S.&(-9,W;..KZW'+.G,;]92Q-69=O$!?631=T6+'<.,GG:6HO +M!D':\:*DSJ#RL!`2PQ-1MFA4%)53Q+;RJYJKXF(=))L0%:%@`Z!5,1MX"Z2B-3Z.V,[R[:(T5:)0 +MKAA$^LR-1M)C@J+XG7_)Z4'N0%P/NY;N#UJ-%#I>^=G!W5S=*O369O/^]VVE +M'%CECI^"]&+I:WL02,K2))",3$77FCNYG&8Q=)IICOX>P-YY?.6.L(MY9V/B +ME2H0;X3J';+6J>JVK4?RX$EV>\C9^KQXJ]W#QE#/"+:C`S6M#WP;.FX0[8/V +MZ^JNNY/B3]F!6S""+$0S3"]]@-4YZ6, +M.VB_>LTJJK`0(?B!@B#?>N)(N>\E4J@,._BEVJQH9UZGF6D$'Z#F]QO]_?IQ +MD076O?U[W!?)[*^XF<8A0H4U;M^"K7K0:I7F-^'G-9I]G:Z/9;9T``*$C`%! +M2;9@IRZ9_ORUU7;3?U+.EI<'D\[?+[=5MCM.-MU1[19N^%0*[>MOVF$EIN!E +M4)@+'!I4N40H0,$69!5%!8+)39(%1#]OD];SUTGE,O9K;7LG-Q;^V%>5+&P4 +MF&C+VR7:33*+2SR5DKOJ]'B=NGV/CQ4C&@D`8:(C&#;%REE^6Q>SZ/&Z9V[X'(8^BP +M_?G0U6+-"Q/,W-I6=R$@*MV07$R:%`Y:XT2B=!LL*]WAE43PQ%#1*?<.L^]< +M-!U=/D6T79D]QDY5_#6A71[3:$)$M&(8KHX:0`$1M!JM;9N=-:UG-K9MG6EI +M"VFV_U;S6E2[>$MRX9RAE#RTU@:[M1(^/X[-(XL#+X!!=EV9,%11E[0.WL^? +M_Y^OYWVR$\,1T)*#`4`%O&**@W(KLFW59#[ +M9&;C5/=5^%MKY3,.9S65O+I#`7MA0O([NRNY6NW(=8FU2HZ^$:)+Y_1R6\G] +M[PJKY*'40F!3\;NY>'NI:'J'6_D#X[#">A'G"C&;=-WNHY9KDTO6PYR>C?;) +M@:F(];UJ![&U]?D*$^!#YF>;0CS;"`_!!@%[DM=CSW8"K\A.2,L$@U'2C9>- +M5U575S2TLO.YZ/4(,'1GA&">8.($J#2U]5>*=:;XW/)_3D;UA-IM=$O)'&1V +M^`2*P^&2C`L,NI&@8270C`)Y9+P&O3Y;2__9DF=-^6E20`RC"8,D#)O!-F/* +M=K*U3"@::!=GY60I$QD',R(TZH1S]9!40-03/9=02"G/IC.QOAE:2+WQDMB4 +M%PUB9.PWWK@TS-F9G%HC0/J((+8(+ED28-HK)E2K*%,8QHO/_G_O\=@_EYWD +MWF8O)Q,9\+A,1=91HR-U

K7WK^Q#N@,&K&/#80>J*$8\G+,<`%BB,$D8@9F)-945F%4)"HG$G(=$Y[Z@6L,"]6]YI8:0M@9F4>JJIJH +M+;X`!(-#C"%NV-BP]W:.DD*#HJ.@HZ7.I73:LUN0G.$QK%!%!T,=KE4U,%4(NLA`W +M(=)+=M10:LDP9%I8I6GL5##!R;6-CTXFMM%DU1VUG<$1#/A?V.-PXIC*\2O= +M[,8=GI0@A@8Y&9@QLJG<>A.I5XL,<-VPI<7W%.XOO1## +M;):P\/79[M>6Y+$S%&118"CL#8B6L#.9HV7GX`"HZQ&EV0^,HIZD%SC3>X$E +MH4&V0J1-&J(P3OTEA4BYS9>D;V&&$WB2`-%6T".>F5<.I +M8L3-XI&_Q4^P%0"07]E9EMV!;<&-(VN/"#I`R^,@`5)H;,><7Q;+GTD=B +M`V+"<<"JMZY5JF.>NF$:&PXB6?`9-&=S&ERO,W0UR0;N$=?-'D;YZW%+FCQU +M=*Y>NRA"2[[KA8EF;_-=)FLIG`M=*(<)M$\U%D>N#0=N-5;Z2*DP"T9$1F"> +M(X152$R3EWXM--C#,5S%E**K76.*W%^I;$O]+8VF.6^ZR#5R61E0S,VK[RQM +M7=L"9>=^]K7H10F33U0JZH93NDD5(O@22#V(M=041?=BK)1%QG0,*JA$\`1* +M]GSC6*)"I:+F.E!F&-=64T,:>\Y*0$-R@;1!A.^BNH)7]^EC4F$OSULI!%J@ +MH@>8Y/3UQE()$44V`.&-IM`V$I85S"6`T\[9:&^P,HV>X16A[4I1N,?DM+1[ +MCIQ<"]=BB@$4CR8D@`B(.1``F<[G,Y$_S2)RS0,*3'QM?T:9Q?(U_1QQLG9Y +M>8S2S((#CDN/YUA)=61F['.V:"P6[/I$7AJ_E +M,21@U*X.$6W:IM'75C&!M-H!M#30AL#6-IO4J0->7T"JO+-ULS,XAIZ.(VSW +M+$+H9G0F30-I<*N.9XG*DD(NM&F;F"A`A>TEZX4BCEZA17:T&7(HD+= +ME9L`,-P9DD`$DAD<;X43%3,PB*0Q@%C,@F.L%%=5B,*#?F'&'GE(#,XVK8-C +M:`>?"V:6=OC"=>5",XU\^4`M2!;%4JV2%'=C@UE+K'P,/)W>S;!`4@0D,P"%T!/8%JOEJ$58`J;,#4,AMC;:8$T$!)I4F_,[D+YA0V"19 +M4D8UEQ(+!BTC(P8KB)_!$Y]E`5,\1*A`Q11=(!R?EH(BI7!`%A&1((!QKJA/ +M!MT(QC)R8R:T`"N9NGE%*$%=6PPE`()2&]1)R,.;=MP4J>^B:0.3A7&BEG+9 +MYF#;#8(IM!)KP85"ABP515%5B**\[J^!="W'!=JO+Q4%0>F[;:RF +M^WU6;_GRVY#D^OFGDO5A-"FJ5C37(Z95Y=0JBJGVL..V%W@61Z:"IXVX?;*A +M6\XAKU*F2D@F0"Q'2(2`\08UB^U]YL'NZ*)JW]"RYCB;U=S"<2EP+&689, +M)&JJKJMCURP6,1@ZAD1$1$``\(`E9&+=K5NV_R>85'/^FVXP5V&ON2G03L:#C.+,)EBMYTS[M-_Y!*X$F-D-?<]=X4WUL\JN7'<&"=IUNFD5! +M"/6'D.?C(^=%^9R`)4GE,Y#JIN&&;EW&A0TK&M.)18\?:!RN)([P%E%<()W2 +M^ND/$6-[M7U1G[UDX7.K8\YLL<_/3.KB*EO[;JKT1XLJN(%K2AYZ.SD\LM`: +M)RT%&#?Y!_Q_T'*;9T0\/O]JT-.PO'!$8&CE_^+N2*<*$A<,;Q^```` +` +end -- cgit 1.2.3-korg