Changeset 0b7a8a6 in git


Ignore:
Timestamp:
Jan 21, 2014, 2:35:27 PM (10 years ago)
Author:
Oleksandr Motsak <motsak@…>
Branches:
(u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'c5facdfddea2addfd91babd8b9019161dea4b695')
Children:
14086c27fce747357cca9d5e71f0bc75f2331f09
Parents:
e82b5f24416c3e4012e8327bb435a9438a1d18216ad45ecb1e4b83e70dc5eb5f944786e3d2f9a25d
Message:
Merge pull request #486 from mmklee/factory_flint24_sw

Factory: replacing NTL via flint24
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • Singular/links/ssiLink.cc

    r6ad45e r0b7a8a6  
    826826          d->fd_read=pc[0];
    827827          d->fd_write=cp[1];
     828          d->r=currRing;
     829          if (d->r!=NULL) d->r->ref++;
    828830          l->data=d;
    829831          omFree(l->mode);
     
    863865          SI_LINK_SET_RW_OPEN_P(l);
    864866          d->send_quit_at_exit=1;
     867          d->r=currRing;
     868          if (d->r!=NULL) d->r->ref++;
    865869        }
    866870        else
  • Tst/Long/factorizep_l.res.gz.uu

    re82b5f2 r0b7a8a6  
    11begin 644 factorizep_l.res.gz
    2 M'XL(")Y225(``V9A8W1O<FEZ97!?;"YR97,`G/U+KRU-<AT(SODK+FI$?B=/
     2M'XL("";1SE(``V9A8W1O<FEZ97!?;"YR97,`G/U+KRU-<AT(SODK+FI$?B=/
    33M(OSM7NSDH%$3`8V:J&8"4U"K28$`(0J\V5WG?(W^[^UK+3/SB+VO5`*1R,P;
    44M?F);^,/<W9[+_OW_\;_]N__]QX\?Z>]^_#_^W?_]Q__REY]_^>,__]/_\W_Y
     
    12231223MIO?E3P]J9NAY+L=Z:8LUOGZQF-<[VUR_8)KKT1,9=9ZO:?Z>7^7LH0A?>V2:
    12241224MK3=.6^^KN=YY;+TSV/K%(L[W)9QO[#;?EW2^K\I\7^/YSF+SG;_F+0;\EIV_
    1225 M_JTHH9^IE/*K0H$G"/S_W]J[[4B2(]NA[^<K^N$\S$14#IQW$@=;?Z(2!`@0
    1226 M!FI(&Q,94D9\_7%>S&P9S;-GJZ<P@Z[T17,ZG4$WVIWOJYS?5Z^L_N5?]Z^W
    1227 MO[_.OWM1<\=9P"7[8U5C/QEY\K->05=6R^%61=%[+S4ZCS\>E11Z.:Q>9[23
    1228 M/L)';"VO$@R]K$*<?W^X<O2P:HH`K^<K!+^*8-4/=\328[?K/->PQ-9+M)=W
    1229 MO7_5'GG>0^I'?84^VB/5^M4CUGO1T1S<*[U'"09_=C$*L]^#.\KY7'I8^SY8
    1230 M6X=LQT,2M^.QBHJNL&KR7"[#&,1QD^F:8K9U`=HO8MQ0TVR)(5<AUR;:VY3V
    1231 MI^#M<7Z`-B<.I>ED">8,ET/C)`CL.*I!'=YL=TU3TZ:YX-U.5^TSLX6Y#A[!
    1232 M$-H:!=_M<D2.P4"<=`LXE[&[H.>D6R?U72GI)V_T:/[9A\E)M]MS\P6.5A7L
    1233 M1R5-.Q4,(LG=QZ8Z$+I[9)W7.,\.-9C3>!9^<7"0H++*O'TLYW9V>LJ$5;H\
    1234 M=!2N\0U5J;#IHINXXYOP>_78B`^`26;?QCYM!1HNS]]4OTJYZD:9*&"<<<>O
    1235 MCD["K&7].1_&=G4U3HU+>%NTX^</>L=!QMGGOUB89/2F'\H_(^$0]0?P;G3:
    1236 MJ)DO[#@<5;WW?@'S5%*2!]9W3A?TQ$>N<$KCVV888.X>@W_VM[K",2YH?VRR
    1237 MCV4VM>,D\N6+:2@7.%:^P7[0B@XKD],^5XH\NH:Y_D53+N@+F)G=ECC/GV$P
    1238 MO5S`\KE-G+A1T[#EC1<X^XZ;>E6`5=9_`?*=-VI8]`YOGPJX-J%M0Q'&Z.VT
    1239 MLP-ZFYEZ@:NREFT_U\WISA7S;I9I.1RXL""WO4^\>AYSX6;L0QO,HSC4*'A+
    1240 M.+:>+2C;V;$-38['V:T\S8RA`*U\^EG04!NYOO/>[Q7&S+R9:4B&%FM'-\.N
    1241 M=4H/UL1OAH?7;0Z*N9^79C7#M:C?T&T+4$]C5E_-NR73!6U=NH>HT*MZ_TVS
    1242 M^&)A8ALZ`TF5/6AFTRIVBJ+`,&:;#<0,)MMQ%(8I1I\91C;CL"AO&]F^>;+4
    1243 MM+=E^V-1['ZS6T8R[U@L,;HF+Y;2EBB$CLAF-[N-&F,H-'\NM(E4M5EPZ&"U
    1244 M['G!9N/2..]SP73.T4=5[3C5PK*?>=6+;%S>]'X!\V[IS1`E5DF3-X'58*K@
    1245 M*TP-3$YF+!>P4]R_VCUW(^<]U]EIY^"C>K%Q'>9=ZP6YVC,N?FS=BU-[2;W8
    1246 MBS=ZWG9U568R$,Q<%_"ED--!E74..X@!,E):&@-D*OIX@I#"\\D*;HI0^_W^
    1247 MR"`Z@X)!,;*\*%^0'%$/3B8#8L!WV4>5]ML-2$.=(+H$XTZ*!<842#ZCHEX*
    1248 MT-4KA@"4_6=1H,XQ@4=%\RBL6*;GCWQ!ZEWS#FZ)*^O^+7%E*W`^H^.W^N8)
    1249 MP;UZB_Y5->IA7E6OY+;+IA"Z1M%%E_<?-NZ]&A`-;WI4Y'A3I!!8#\^78'GR
    1250 M'Z/C+.]K4($8"IS-&E2DM`:#F5>)G]]^;6]>*^^DZ,DR/Z&^'^.`\[XR-2FM
    1251 MS%62D<YZI>V-S[BY0;FJA.FT!KQ!9?($1]5Z`2&Q%4$Z9Y;E<?6@G\'"E,?"
    1252 M,"?C`KC5O%UG"FTU;Y-"D37I^/IH:#&4*9E*N!/%D%B)=-_KXVK:"I]!VJOF
    1253 MKHCT_;#<8)Z6#6U2*![6(O'O^\&ZNM\&BSZ9XV.\>8ML4!W4KDYTD?CU^6MR
    1254 M6;>HLJ>YK%M<B^$">DN=MVA74E`W&P@6UX3'2M;0]AE,<#NWA2KYP^,CPN,=
    1255 M$9+D\V!NOP1_<O:I?93?'\4?G8Z*)9?8"DO'@V4@6AU_@(1P5<QP@[G(DNZ$
    1256 M$NBV1W)`S@HRA]-T(")]#SQ9,,P]A)CCVT`L^1[\T;`+K&HOQ4[18"@H?>LS
    1257 ME!R/2;`HVO)T!'TTM/159].O1>FK7L6[%A<*&H442RGTA<'SR?0;+VGQF`Q-
    1258 M2[JBGC-!:604!Y3,[`BZ\Y!%6TK%BI3)C"&;'HC?+!2RL9(9;]*T&S=.YI>7
    1259 M0'O\+2JC^[%9$VU8#S.J89&^M#KU>55!1E2=5)$NGR4H)DU$@^+A=7K&BD%9
    1260 M&PJJ"U:&D`/2E[GB8Q>C"P)!!6].\^-PT4M0F.J"%_...\2,,L##@2,B_&4?
    1261 MPXS"^6U,%R@O@@4OAN4U:CBJ5V^0!*)])FZ0[%QX*VQ3ND<#O87O;V_*R4Y!
    1262 M?CH$UQM)#I$S/\H5KA+3]2/;_D1AY$XMEXP0_;))0)F9")2K!@SOH4[-C(%@
    1263 M!W7J)_"6$LH_J!4L25IZ84B2EIX8V>),,#51[YOM87[VN%-OT+;_'ML\!OLP
    1264 MWI2/_:TUK$2)!4(:-YPW";M`870_ZM&<"BF9&[CM58/2AK$Z@.TT"^VV36<S
    1265 ML+0/@5/75H:#G$$)21K;$9+)#!>.(8+]N#**.V\QM%&ANTROGY8N4:_0??=/
    1266 M9B*3H<4\^>V`33E,"0_8-,=N<CQ:-+..,!Z\B>=QRN`$W;,1HYDV07&KQRR4
    1267 M&7N6%+H+6+H'/'5#:+-"=[%+CY>$$/L6R?0;+VFQD$`P::_!K'9!+\[SW)9/
    1268 M-3UXA>(\%--#OD2#0BE'E?BZ?IH^+PMG)YM^XR4MRT+!_/3)/"YIVDW*"^:+
    1269 MD7R6BZ-,MQ^C&%J6F[SY-;+I@J4I;\:6##'Q?,RJX>U%!9GS9J0CK&7W5F'/
    1270 MO$LCBK*+ZI<W2H_BC\@0'M4XD15L`+Z&+T$1`IT>FN1/;V_G!<=A.($I7%VG
    1271 M27LC^.G.59:T-X*?)F;![]BGF5.GO94<VO:*SI"J!.F+GW4=RU920E[1S-C:
    1272 M]C1FI)0D-3DT[X'K[&"I\F)1/+W:FVVBF`X,RIO'.GQM;L-%HYO48$#(<((B
    1273 M:@J>_7(,<]Y?PJ(2W)S-\P[S//3];E,)F4[PSGY'G2H%#^=TJ%+PVQNNM#4U
    1274 MQRNUS+Q=&>'LVV^,8);Y51TNMX[Z<;S&L":G^6GSUM^&0=%:_7)++%$OLB93
    1275 M/7=-)5=.PM*79O4!)K]PVM[NT(10:];^M'%[8RJS;%9BW)_L-(C%92]^_:C'
    1276 MP]B^`D^,8]#CX2'.^<^?I)QBN@A!AP.0_RC</(TCE^.,^%Y%OGO@^3AL[[PG
    1277 M].+?XS0^B28?A_2]Z62^@=_'F7_^[-RO$_]>_1G]N+\WQ[VO$YCCJ[[KH]S[
    1278 MV7_OULN"C_.4>R'T'H0^SF7N\>9Y'JY<7N7]F*<OAU'SO!_0W(_E&X<VCY'T
    1279 M6NG]H.8^P,1A]"\.<O\^[MQ#U'F$7V.=P(R^(XX,=.C1X;@]M[N4LJ'E&L=.
    1280 M>3LA<AE<31"W?)7[IY]7#8JF+>@"K5@`D\"\XCG1.<5!Y,?NW],H39%&\4Q/
    1281 MW8-%:<@+1<=A,<0)?Q&%0BUM?#V$5\^DP&3S(A;%8T3U\XI]'NJ_VW3R7J'?
    1282 MNQD4#QV%/O#440C459$U$KZE8F($5C$QFEJ$0PE[4U$K$N03-,RGSJA@EJ:&
    1283 M*#*?'HQ(=Q(0&39<]=\L?=0PGW:CPE:V[DF<DQ!2ED";HH9#-;89<%1O4(^$
    1284 M-O^M#Q;2I!-=^QN7K(0/7E0`:?MZ+>I^6IG%])KW#E0!CZ:^NV90^J`S]D!?
    1285 M;MZ[-2#:@/2P6+A2M/RYZ!%(R6H*)*!O.>U#,"!]R<F\;=E)T:S3[&<<]SF0
    1286 MLM0[YXG[".H.1@7NGWO<AU4,*9I"9/ES3;H9$(4GGX^/A4KNRN'I%S!S%PW+
    1287 MEQM,+U>X?+D+7_RE:I@^#+]1[\S+PJ)?5S4!B//!6RQ?4H/A@CJF+^[X^JS]
    1288 M-_U(8JTW`VVVFZ!A9E\J`E[_@*+V;W,LBG^U3&G#_8:KX5_%,*8-)\X9-ER=
    1289 M6=:N!_0-+!8#O1H0QU-I95NIEK]ON)21.^QS#_M<962H>/JWI>4J<LW.F#<P
    1290 M:SU-=<)?3UL/G"X`.K!.HPWJQR,EE<NMRT/3;E@]'D]:`U#.-2=?N'H01R#J
    1291 M#GYZ@->)9PX*P*L/\2`N4C2W</1!EXOO<.*&=6F8&=V$E46[V-Y93Q[?55&\
    1292 M2-A%T<O/67KA@5[U+[S.F^<"C"IGM=15PT2MTESD!+]R=7HA*^;.V>GU@BM^
    1293 M`+AZ46?IPX93K@7P5V=G'G#+7S6]\%%GIJS9<=:->M],5N'X=1*J2L8I=H_1
    1294 MCU0I.C+O]'$Q/#^.<@U7+&"O9IWMI^6"S:^S)Y'97IU)*>S_L,O`V8[BCEOV
    1295 M?]@/"AOL]WJH5TO?X'[#[7YQF$7?[&/;1KUOIX?Y!>O%,P^-\\NJ)--BN.$&
    1296 MEVN8N>3")TNN&M0<G8:-W(=RC+9O#TX@Q=]4SB-8V02J.'RQ^[^&5<WX8C=Y
    1297 M38TA7'J6(J!R;(J@ZW!/.L97=U`O44=G^]JG>?.TM<4URVK@((5]GZYV\KVA
    1298 M1A/O%3_4G3#7JV;B`,;3-IKI(RD4N4\"%-9<M#"=:*S[<!1@L(9Q=7B4P!AA
    1299 ML!&3H;[H`UX.AJ^.8=+OS<9W_4#6#W4?K"!*)Q@04)0%=GS),X)>F7!9M\EH
    1300 M++:H"!,:9M84]CXL*BQHPK03'1HV6_V$H191OB86822K=U?X>J:*D<IV9]6P
    1301 M"IW2#ZWVF;)9+AQJ-UW`*K]J^WE$O-"S*-*"'F03F/M1\4UZ-``O%Z)*L!)B
    1302 M%1"5%4,+`L-/Q!M0YL69-(RO7RVLDJ6X:Z=RHK+:?J*%B8LRO$DMQ_XV=M1*
    1303 M)\G\`:9K&)V<>G2)4=D#XX;1WJKOYCW4=FK1"J>-&!Y2[2M86+E9,S.SK.&=
    1304 M(5:S+C*@\FLD1N65X=23%3['FV(UKVQ1WA3K-KW>D#8X#\6<557,:@78'&%5
    1305 MS.]^`2LO\O;(PSP2_<C9;'(7)X5'0UPV=-OZBOD]@NF"-\2R3YU"E8RAWX/U
    1306 MKFP7EC>P\GU+)TZYN?->F=%1)HQV,J[C/:#H=1%TKQ:\P;RSK'2:S5N\DI+,
    1307 M3A'40&1/"*KS>@UG#9\SPD7!BL!;@=Z+KK,9H#8*)K79RH:8E#K8`(;.`=[C
    1308 M1;V:$Y5XDN[M"!3<4&W/98-SRJJXVL5`BAF(JCBDEX-H\LFZMQ>.+R];JEH_
    1309 M"),C7]OU9.Q-PT9Z6-0E'U7)/1-OYYLJN<?9E27Z:KJ0!PX["8>E5_KAQ8+6
    1310 MO8CXH,F=AJWL,W'%3DG72GH/(CZ=+#NMJA.E220C6%3;-;&WI/<Q;V",1H%.
    1311 MU-&RR>[^Q0R["8JO3BDKVSL&AM5`/,-4?T$=+IOL'JYA=8ILLGNXIH9`EWVR
    1312 M*48H62Z>[$MZ0ZU.>[WX?74GPIR2&2#"VWZI4R4QB5B?Q603'?5!/TAKTQ3U
    1313 M,3T8)6H3$C'A5C_-)B1NY^EL"9^&[;)JIH^`X*TH6@:KD@-5U:)HME5[E(9L
    1314 M%A$WHF909;&-5I#WINL+F#=AOP]/^+:F%@:M1@(IA11BJ4R;T>[!&I:-R.WO
    1315 M7BPU;\)NGVQAP7I.(*7P*@MC&TBU>-$P:4A89W8;8#'4O'\N8@A19NU&9Y<Q
    1316 M6Q98J08;-7%:2;]3HK)0*YE8\KLHUZ38\1'OW`;B#:SB**43%3$I3Z3O7*<=
    1317 MADL4RU!$\YTGTX-%Z>O7Z8'Q=I4(B+4H-"J9?#AO-K\/'>71\#N-8L*X?II-
    1318 M[\-Z%'HF;7H?QNOKI]GL/DP-UZF/\M4'E3(N`I*.V;_"]V0HLXR:[<;"ZJPI
    1319 M2<1(&C;?R@5,JJW.I`"8^F89H=KWL3"+#M4^TIE'*AEKFULY;D>]?#`P"PDZ
    1320 M$XNE@96*!6M5LJ/P>[%)2/H$FOV;3:;?:'H@:5SGV.BS8G#/M]DT.F]FYQ#1
    1321 MC-?FS9`('@RMS7K1![!0)HO.3MEYC,V\L<DI\7:5AD(\)ICYM6DH.N%DYSQ_
    1322 ME&^R_YJZ!YUNLG,>F_0B22CJNX'<"_4)DX7-VP]GP3L_T;"*D]OZ)E.6UWP@
    1323 M&)AYC#ZN19GJO.5@U8Y;<A_4`,EDM%%'AM5(`L.4H*;,8MXR00WOJ14[$]34
    1324 MRKGB+8_)=D[D"!G#&[,=B3=PVN"=(V4[0&>HE4/'__7VEUE3&[_P686;DG7I
    1325 MBW,%+F=9[I5G/0E&&>X'%_4>'^`JN[U*?'-9;LJY]E2&>UY#:'V&8.[RIT/K
    1326 M6XOU(K;^#R/JXW_^MQA"Z7'TC_Z)^IQ[D/KY]]<KG/?-':R'P8?NV6MM5'0_
    1327 M_W8UGA2/@;K48^\_2BFY5W8_I?=6VH-#]C]".Y_0*[6G1_IHU<>O?%Z41_AP
    1328 MX7SZ5SJOXL-_N%1S^ZJO?)*=6G0,O7S[^WS(AS]B\U^M!_O?3W+_?I0/YV*M
    1329 MKW1V&L]^BG=?X2UEZU\<6?_FR/K'/ZWM[L?_),J^P@_39I0]+2`Y=%%^9UWJ
    1330 M79+PHRPJ/B)G+H61%?W@BNU,3DMNK<I1^7VMT]"7H*H#/Q9?7]N2)T*B5@^;
    1331 MUT=[NT/!X$'1M,1S>ZESJ92D8$ES\8)*8@E00@(+E&+'G'.`(8DE6.*D8<AC
    1332 M\4`L!K7KQT'A]^E]H%VT:%J:B6)G`FO!P]B2A>FUL^Z$7C#K,2<I,C'.T=#G
    1333 MG3NJI*X/EM_@+,%5`BK7G^X"8<C7OR+G2!`BGZL@;[!>7@84UU]/(LA<%Q;A
    1334 MR^(%\D3E*52OKN#+P@9"KAR+>H@(0Z[6!8K>0GADNH:#AF%>HR7.&IZ+-6H0
    1335 M7B5<CP)A#(WRU^20&H.K`>`Y#BS#NTWU!4P_>[4/C/:!]#MN,*8*;-.4+4P_
    1336 M3-&=8-3HEJYBDVG09BDH6::2H744;0_).Y!1!]1L)HIV'$.6">:1H_-@>VD"
    1337 M4R]L[]\X"7_OJP2X<`$HL+U_3!,US$C#23YVU2]4TL;EA+`PD6A0%:C6#!\Z
    1338 M]L=9-,M7JT;[4VIIX\<I*$Q#,J11HS+8"*2R:@4EIQ1&C+6='3<S7X84@\C:
    1339 MSH@59>'=N*GL.DG:P?>72M[";J0T]\[TD#(I;.-L^D%9H_"C6-J@T(W=U:L%
    1340 M6\TO%<RSF`/6;:H`U'Q?9SW11ZWRD\H52(REF-\441FKY$+)M$HF%(5<T*HL
    1341 M9JXLBE$&;=M%-"6M/_4"RCNEWM6BS(]T+E95Z,9%L_E:"J":Q6<SB=G0TMK,
    1342 M9FJ3Z8&69S;3$`TM+2_S$NP:T]\7PFL>M,>LF9U#H>SC3_L#FWD>[R;)K%*N
    1343 MOZ-_).<,C#GBV#>YSW6^EN*VDHV#+$Q09$R:ECYMR7?"SUBG:DE>B)IG,DU4
    1344 M+,D(*(XX,8I#BP:E?4?W0/O.1/%+(.M#U>4V!-Y_:DV<-;QSF6Q>NNX=LP$H
    1345 MV5$(C!\DK\^*YW4"B@(,+\]JO7FJ@CES@+2/SH`5UNSVDTJY<_Q)31%TMAY%
    1346 M.YL"J_=PAKIHF/(TY5M5`ZD:W;FA0OD+CF;RVTY+W#":!>#HT+AJ/^!@I\X9
    1347 M:OZNP^5*U'WPUQ[VT35+2UPGJ*]$59F5U`4E3TI:1+R&5='78KY6=YA.+N`M
    1348 MS8$X3-K@C4DM>#_PMAGBQ"B^NJ#T/)U(L',_C>I,`GR:H&B[#V8,:),IQB6_
    1349 MPNGW\D$:5I9J_0MF1G&2DT%1\"O*XQ%-ORC-%>5M"&9H*B!H>Q$+JSBA@F<S
    1350 M`VJ8<#%C3H*"/R8:6A2@MH[E5`-<6'#6@00LL.6[6#ZN815GM#W0[0_<$ARN
    1351 M_'EZ]I-!43(JRJMC7@]K[^R_2#"PBE,J&.\`Z11\3*I$1:[4!'62+(=10L.>
    1352 M<$!!2:HFZMX1\Y^LSZ7%,']U5JRXN;,])6_"%"2E+&R9I])KF*A5V=&\302&
    1353 MS*OW]1<-DAYZZ*YT%8M\?496-MQKP7LX%U'#VP),R\GO\+93K"&N>+BH8?P^
    1354 M@WVDDD^SW9SL6Y+JG]5&(9D`^Z?1S$JRM%[3@H@;#6U2*/[T0+O83]"TVWYG
    1355 MDQ\`+=DYF$W]%BBH9[,93Q3YEP3MXP071J_._<K&H5S--R`HSIFD(^QA?M4L
    1356 M"4$IT1=MD%FYQ07%V8GF+3!A/=]3:ZCQ:%*:R)71@-L4!/'OW+W@!&]9"KL\
    1357 M4LR'5QC==^QB%IJ@^SY>S/0DTV]4Z+[GZY'I)(>=?^A^,7D_&^E'TY*<4^P,
    1358 MTQ:5U8X?=E0%H&4K-&3;LX595LKF5Y(C<Q2QG)F#XY`S<R@`4JETV8HZ&E8J
    1359 M73:BCB9F42>9!2<'ZI@M.YHW#(98J607*USUH32R;,471:QTK*QC`L:^M7),
    1360 MU('N8Z?3AZBT;W"0*F8#\41UBDBZVF.#?<`%#GOOBC_&$^JQX4)L"6I(O!4N
    1361 M>'%Z?PVK\TGVWMD=D/24`L[CE)(+_F+JKAJDZ(*_>+:SSP8YRJN78,G"FU>^
    1362 M@)6C0T+J@X:->.4OEA`+;_LO&2X:I-R!TUWIJC;ZT0E@6',`T_B5IR99\4K#
    1363 M2N/6CPSVD4KCUDN-8X[U!">!<>].EEJI[3II`0YK0J&)A+%D-O6F'HCB43)B
    1364 M=#/]DFB2E"B5#8I^3)N!4$V_%J6U5LW(R/"O:8N@,(;,*,42HADS&4%3HVC<
    1365 M3$9XU+2T+(J97[+'V]R(;-XM&UJ2(/+EKZE[(%DAFY%%0TN?>+:\B[EUU$R9
    1366 M>6.\8ETZ;!DXE&[0*891?;+1/J`Q#YDY$IKIAXL&V5>\'JHN[1,O=C1_\6Z0
    1367 M$(),,UF8V8A7+\;\PIOWQ5'B]."93VHP<.J3?M\@#133"-N-L^][@<-NXR[F
    1368 MVEW<H5,)]0Q!@@CN'\G"2L>/=A.R?5_`O$N[BW7(S'-?#@$:S/9]7$R/OV@X
    1369 M]@:[:QT7\^8N[MA/Y<+5`@DM^-*8T0(3F@2FM#IE=(A6!M"P,B-$*P-H:F48
    1370 MB&;[:^:738)NFW8SPX@&#1K=-L1FAA8,+2KE417I9&X65`T8_H8%5I%EFAJ.
    1371 MR:&:.BJ(3*A55%A0(X'C:/"1T<(JHDLZ42%:0168&?"J?0ZU:P+Q?J_*Y5S`
    1372 M/%4:Y@$&T\D%S..>,$U5UK"9;PLS/_;J+0&FODG-)NK]1]-PPU]>/S+81U9<
    1373 M$'IBF1WJET\6;KA\I!-WX/K1KQG7[Z"F.ZV9LJ\XP/U'1S#!1*L^*5M1_5)I
    1374 M!PO,I?VI_=:G`3/,HAH2I2(J2II8]72:5BJ*56%.[9I$L,$LV_6(E!C*97_J
    1375 M8WOUQ."^/(_MZ7$'LP+-<CBV,86=%..])'3>'1*A[=S??OM\?/Z7Q^=__7P^
    1376 M_@)$4+K>A;_]]C_^_OOOO_U#FN-_^NT??_^?__VW?_S;;_['7[Y^O'Z\?SQ_
    1377 M_.\?_^?'X\?G7W_\MW\7T@0]Y;_]]OO?'Y^__2[-Y3_]]N__Z_?7"!3?I*-Z
    1378 MWW;]#JC]GBB8,W9`;4E$01L,=1'A&C>*?HU;1+_>\CYT<!)=0]Z%R;C0H3Q$
    1379 M4+=V.*L"9:^$),=.4G<*,D3Q,`(`(K(PPB))Q%[<WLNQ]]+V3NK6QU`R[O()
    1380 MIKM\9.DN'T>\PZ*.=\DR#G>I"Q.(*-(%57OI4?SZ^.ITIY/3PKKB!).QY],"
    1381 MF$.%A(,[))@XR&-P[4\FF#C)+9EG,*2>5!)Z_L5(%AE`&.<QW+]ZN[^_)`FE
    1382 MO<9Q"%]Y_OO*CWK_>F<Y]X'31=X7.1Q7^1HC4T-R-3QP`N_^MCY!3F5?9PAL
    1383 M%9D'XE3552;B=/E)I,J8,I'H#=)5TY"JVCDA59IS0`&7I2`<!.SN8/4/BF:D
    1384 M%A'"EFBO:$;."/3BY9JLPW1-9F&\EGC"/0QO#[63%,.TKNG+2-`NI<,E.S\"
    1385 M?89K/`BMW5%5G%DUJ!T%0E@M"HI&DA%)$PJ(#)J\,KRHER3783V'KJ-,;;B#
    1386 M:$$LC'=[^CQYIX]`P8O1W[=:>40!1VM![0,/MQ0$5'4ZOS@*F?G7D9C,62@3
    1387 M?F4:K;\GCQFO!2R9^-+LE[F+A^W5_]F3882["--XI9.7Q)-7]$-3>MY73TN;
    1388 M)[A\^7<\6=S)<5[OAQ<NXE_N.!E,NW_U8UO.5N=&RMB)#!95Y""9P5*(U;R9
    1389 MU3SD(!:3(!9^Q/-_B5\6#F'QZQ`6.BHSK1G&VB;GJ\SY)=:_%@[S]_O*[N)=
    1390 M@&5Y_I19U.:/.=YV1L+*-'_@42%D:6S8349`9:X0%X@(L'P:X#OF58<?/@.J
    1391 M#@=^V@RH^AC41T%`5;]HQ'$3(ERJG3;$2A=0A0"_+'?'BLMW/,C\#BX_=]Q5
    1392 M'>`[EO^X2RXX7\S\9&"QX\+CA=06P#V`IJ*MOR/\31RCP?<'Z:/^SZ:/RO?W
    1393 MD$V[GZX4YT<7WWV;CSWU\OR>1@[H^?]'P(.;^E?V?IRS]I7Z1Q<OMG3XZ@IO
    1394 M^K5_]/NWYL?7Y@Y^,Y!A?,/]??P"(Y4GJUTY$R2[<E94CICUI.)Z:DE1L7E`
    1395 M^A+7H=PI7L.)\8H2**W]9>RE+C'$A_(,*!-5UE2<;32@0E1)4W&6D?15%53H
    1396 MB0)5ZDL@2<<?W,?C=K>XC>=G>HVQ^WUR',\#\1IC_WC3W44%L6-<(':*-]N_
    1397 M9RXG=SKF6G(K8.SR=I4Q*3A?-5WBQ2;]18VQ^@.8K"3&F!W.\!#@?F4!S/T*
    1398 M4/`ZI@5:$)#R2@DZ:0BP`$R`R+\36<VS0@%\7O[^QA'V-OG0%+/-U,Q?V+Q7
    1399 M1D;D#8&`(YN""S'5&?Q'V\[\FS3=N(26F>65UJ:ZG'QWECYAC_)H0@B@.`3W
    1400 MKRM'/2<]/G)G@J7_DT]F6>X]X?WDFVEJ08$8:WHE8;?IY<+;#>FEO5UZN'"?
    1401 M`DU[N#AHWRX^SOVE2S5EJ%U.\OB!M2;FXEJ+VIAL&"RV\,N#'!>"B#.1Q<(E
    1402 M`"[!D/[NO^V+A)>EPFZ%[H$MMP4P4VY((7'(P)`K4DB`+S+C@O=``"\PX@6`
    1403 M>C&E8:K4DN_B\@G<2C54,LA6GEO;F(`L:Q\H"U\M\6I=)7AOTN<YT#J!5%&1
    1404 M0`H=ZAPS)I`"A%OL+]W!`4IDK^`"@O`M@$0;TJ\P%.1WG0O^_"CN(%K,XA)?
    1405 ML:_B82KH4KT<`_GZI[+#]W+Z-`RD'YG?!`2D4,;"UJ>+)1"*:88PQ3\!<THP
    1406 MZ7F[3G"-AVE1?Q6N23F,\)OEK3UO[>GB_@`_<;II,Q$M7KJ_P#66]T$+UKQ&
    1407 MQY0$08CJ4E<+S2`IC1&N_<5UX&N9[<@?98:>TDVIINH:"RJ("4S3[^UAZU\*
    1408 MNTG_=$VF?[JFG2;!_5*J;2_2)FPD0G\)KL-V35;%",_#:R@,POU+63.9V7IC
    1409 MA9(#3\/V2X2[&)4+M-/\AFT^`[P_79,)<EP+\P`)/?P"*V,_H'7RA:^360CK
    1410 M.'6/CE^8#E_?\HH_-!U&D``BFPXQMF0:UBF25S.#_`=+'W\0G,`5YS.V2A:_
    1411 MAD3*`AFE9HN&411"VR<K/FQ5+(J&V;Y6<K*ZK2H$6:&;&YV#LB;C&DY\73IM
    1412 M`N2&.@9;(1,@MZ68!-5'N>W6S7S;+:`)$16PUN!387.`RNAJ\%NUFQ@=/%SK
    1413 M'/8]45W7I2$;A8=K'N0ZQ7"I-1F12*^V#BE<>WA"Q"GS824-1-T5:=+6^8)K
    1414 MZT^(.&5DK*2U9$0B_1SLJF+%E!'62QDI_"R/SVH*4?9*?KKJV2F+925)CZS(
    1415 M+/K1]BFB7T&$S<`1;Z*412$I!DF(\/%%`;KQ9%.79S=$'(W/JVZ*H<F(D$%Y
    1416 MHYF2H_22Y9J^([HF7;M?BQ@709*/_[I%]JN^IV^G&U"G$:A7_AH%PE*_7@+<
    1417 MI"%S[#0@G9K*J;/<OUSH?YZ,>Z@QK>LX+KW>]?S'OT^5IA,,8V_II<#^T"VD
    1418 M>;L<G&VY?%=P\H_*4P'2;4Q+#DQ<V0&=:R059CXL@5HEW)#*:F1H):F!)"XT
    1419 M!1.CH>O*^BK)A[2G?B=S^)N625!&(#Z',H048I71!:`/<$VC"]OS40:@MPLP
    1420 M%PG:I9BF]!^A70I="IL-0(]&\0+C0QEFEG`4F:7>Q'@0X9ID,')K8[(FM=,F
    1421 M1_=GN,;D1P_SMZYO[!5#Z57+4JQ>IJ4=@RWBQMH`C"4R7>8KF%=^4N&>46D5
    1422 MA35!+XD4519,ZOJ;"P[#KQ.%AX#2%/]UJ[+4(WR+DC>-R>?_I5C@X"PG&_D/
    1423 M.H&7&8,'"B)H;"#)[0(`;O@9BN/H5*[&WWB]:>$!O:$!KC$AJ?$W3E?*]$9;
    1424 M"QN)>6NIB.A08]XD*B(Z^%>VJ$-!ZKP0WEW@Q$ZLZ8N5?&G9I=4BM7BUJA/N
    1425 M6".7%B-^P.6FO%Z*(8AWAA;DBKPF:>2@*S!.W\&'(CZ>::2F^SQ=L5F$[:_+
    1426 M&W09=;%^:F"'7OE'E[+,K/+<VCHBNW`"M2+]`L.BIZB+\)I!%WTC3MW)^1YF
    1427 ME.D2A=VWO-JYTYZ_:^L%-N_G[=U#\Y70:_.M[G2QE_++@'B1PMI'5<4\,D5+
    1428 M<JD^$YC:4:?"4W^I7?(+]\S"/4]P+7D/@%(%<(MC`%6!N`T9]TBZQE?`95!O
    1429 MVFY0M_[H&E\1[1#EINT$!9Z/US@%^+P"_8>-'J_5%*$APAW;+DB[+.8Y4SOI
    1430 MH7Z;`33AXZY;X!K?V&]OZ)G1#!>JC(UWNX8C!.;3<*3,>"J.%^ZL.&[>'0N.
    1431 M'G;*@F\!/19\&]A!"[Z5\`(0/=._;EA]RV[:0R.ZB80_Z<D,@@0Z?"LX7[E<
    1432 MV1N08/]/Y6\0TL@1T.P19QV0?[BH$)5)P?[QJ!"5',#]9(6HE("!Z.`&["<C
    1433 M`)4:=9EZ!B3XBNYI"-`*B.H>J-&XAV>I8(&`=[7]IHH`FG7E01SC1202X\4T
    1434 M*\8+HP_4'4ZN,<;K&)L?67[)VAO6=DXQ17&&J.#6!QL=2%WI7S?\00#0N5OE
    1435 M]XCYD1TK34TSC>K38P><\8=]!R3-\3\4<[#KBS;F(,,.GIU2&%$-(K4KL#`9
    1436 M;UI)`J7FIE4@TOY19?)"_=/#]10FL967/@6"(:_&BK(86T:\&@]RQ$`R#`1&
    1437 M7HW'&G+D+*I4:.4DYH^!Q'BZ@[]KE9;:285$E0VCY3``&%5>W+PPF,[#-9OA
    1438 MW!#;..I_7K*Y[6!?<9)+CKOA6PM?T<3.JRH_PUV\?75<P?''_/5DD*;R+S#6
    1439 M\-<CWK3A?F/W6AJR9!<;[VQ7_Z9B^O=UTD$<S+"W93"K\&)"=Q2Z*-'=1O.$
    1440 MQI)RT^:1W=W&/!N]IA$Z0'\;!5.@/PZO=W\;<F;TSP5H)Q/@G_&WH604X'GH
    1441 M8RDW;7^A"0K0/]I?>$("S"@:9%!SP\!;]%&LS)RM8`]]C^&V28O(<>@#11N-
    1442 MOVGI$3D0)EBCC86NL0PDAK>CM.FW=F1(Z.="F]'.D/+V@FCS008F^1OP,-Z!
    1443 M`UUPB@9TB>)JA:DCZWL$P72\HO`'$,3R+S#$<`C?75EJAS_^%?]0,X1=])N`
    1444 M?#@\(8-4D)<M!HL>2C#GO`992:3R`*0%KAV=*AWH7K>^+<J1:7!-=A=V.#CX
    1445 M&,?=4UB:SUV2$G6T!"7JI_%54%=DN<%'%+E<OST_A!/3*&#8>38%<MH8>=MA
    1446 MPPIRB<E#;)!<VY7*MM)I1?<MP4IGP\)7`UW)?@:U"8$I5K5E5J:,:N=;GRX'
    1447 M=DD<NN>_)@OH?Y.DH_=X8AD0M%)`2BO_NIWE=;6!IFYC2=-YT2TO_2B3'IP5
    1448 MN^=CN$%>_@$Z5YR&EU=YY_M7.?]\-1!(_ZE)$SZC`N)!06,+J=G$R\FKNR1%
    1449 MM9G0YY.!GM.O.!T)MQ-5$96Z5/L+FRI5'@;N**I@/=_2$,`:]9QS@59">A-9
    1450 M4\OI#9_UO.)7*+PT*08*AS\O>:Q9B)<H2L2.+XN^Q%JXV'.2GJM<>IE8>A!E
    1451 M:*&9-NJNH_35Y-+?T&O`?OHH72\/"@TZ\"6;B,/VX"`OL72/.T3:>:!V<LU1
    1452 M=AX$V0)R8/D%P6/GI^$OOL41$?(:>UBXV*.TM@>B[*6VE\7@46"?+06C0*0\
    1453 M&-J!T<5'84SLGKNA,XSLR%[?,:,_V,S%"4YL]Z#4"L=VCX`T[$,?B$H49QI.
    1454 M/.-^5`:&0Y5H(J@5L=-"152J?%#M;,A((J4\<<4HCSYI<]*+1T2E<XH__&`$
    1455 M2_QA/3MPSXV6`K\@"H$4["RY446N6%ZC:W#@2;#UV#A)0)1P<)7&&A"1J`F3
    1456 MV<H(1_=S'ECENP+>%1%Q4DZ&((F!9[M/O$F&B2/1E,-&*HY9A7T4''LALK@N
    1457 M^!T@#*&`!%C^=;L01H^.0.H1'IWF5CR0816:/L5A!>U9*R/(5)A'>;LPTL/.
    1458 M#;F,K+*Y4_>3QO+]]<C?)(C)GFWMICW8E)/"*D@CE8/)Y!,>$5R!OL;Q&Q>&
    1459 M^",NBHI#_"?$GVA65.Q9E+Z*ACA^2"`V<RSHB\?HE^0UQS*,\W"U),:\VG[.
    1460 M<\KH>DF;B>_\&?!:I%Q&9@X<W@$)-9[E\F5XIC[$,4HT.F=%"MIZH-$Y++K"
    1461 MD-SF%`2Y8P2Q_6M+)19K..?_ZCP^5EZVE&"=R2=I&8?J2V?W.55M;4)*<6=?
    1462 M)W%6!L@P.0!R;06D(.,DISNK7./"(CSW$.5R"?SJ;2#M&%5SVE=I)R7GW;[O
    1463 MDNTPW\7VEZ"==ER,R(Q`'^`:9R2S1D)/).<.<7MRZE"`RAX`+LXX-L:PL#1^
    1464 M66&*%>3Y^BNS9;_BR0)'@%8:?W2K>,^<+9TYAJF^]&S]833O.?K@!8XO%WN<
    1465 MUJ!M;W=TXM933QXG4W0CG>5DEVD:VB]<2[MEX(]L[$/NXBD`H;%2#JU20;49
    1466 M95P[=64C.K!R[Z2&`,Z;CN_`(KWH1RQ\+V:__[/X#[]=ZW@0E3D/8@C=&>$:
    1467 MC>F8"DLAI*08H3&EP#6I2LIB@B84UEO02H)6$U;PE-FD`(`GI*!+`M50'?8L
    1468 MGQ0IB!A#1C92U#DQIHP\%DH%Y2"S\RM68?PW"H8CKXE$9HOW6Y2<A$>R5E`&
    1469 MZB\PNIV?Y(C8F`GM,YEVG*3:PS<&]L9$L'?M%H651_::__7O\NM"WBN(9I4#
    1470 MI42@Y1ARD6@Y/EQ$VJRH1(S@W-F@()%JH^HK*4CDVBWI-BB,-[DQ5!7,D`EA
    1471 M+W-&&I&`,`9$$-:M(O:3%<*"&B-L<6.$5B]+:>108^FKP??`%.QFYA6>$*'O
    1472 M/F`G!0%E&W5L9DF(8'4J%O-5:2(L#,44JC21.H&/*+`T$9YY0C=@:2(\OV[9
    1473 MOF_:PT,[M(3BHKN&!!@)Q<6]F807U-/1&>/A6CRKG$DMADQ6DI>="6)64,Y>
    1474 MAB6HAT*M8`T"KPT19[F$6BD<DD9"6>$IH'3$PA*6Y(>AV]GF_DS9=CE$5=`;
    1475 M4=+?M`&'P4:7>Z@_>ZD!4R1^W;^$9390?-HO"'=#;2^\PRPV%*<P0R4(7ATX
    1476 M_^JQZ!`",R/DNN;W*J-]QL=UW;#;<'N<W%<8641!,F:_G'^Y3NJ&.NG\R+^-
    1477 MO:>NT<23MO][:I!=R.J,_-L859%^QE^MRT??.%%%<6P@&+:@6+)C/L?&`<]L
    1478 M396Y$DAX.>M86]$#;;"(JJ^@H*T.@M@:G,)8O22AGE:[2D_/"'!V"*:K9P2X
    1479 MQ@9*[A4!3I,G@(N$(.#@7!.8"HI&%!M60Q(,2!0;%H8LPE$.:,,JZB:'""NN
    1480 MH/O<M%,4G9:)0XBO7)294Q`P8@(C++`0&VI-GKEF@KL;<R-T*-^5.YD:Q9Q,
    1481 M/U*01A2LE/&8XW4]VZF7U'ER),D_Q7Q-6EA^N];YB#:LV&O:P?$\1S(M?M?%
    1482 MPW'U6G=WGH=\#324]@O,VLC7!B,;["P,;M8O3TU+&%D^5;A5-RV_5S&!8?C*
    1483 MHYQ19U33#G9RJ9Z#\P#ES!V=GX59D*7_Z:=6MRQF]>1^5]$?D%@MS.Q;%C9"
    1484 MIGAZ0&IN!92YVS*2Q-LG*UE2-WJ!20XM1SJ62@C,<LPPTK%L`OU)N`+<##'`
    1485 M"RR2(#`A+,)U`O6.);8&P*&J'FC8VKYH=.`C47%=!.FI;I".AB10!43NC\@+
    1486 MP]R6!!CG@VQT7.EP89P)LM&1+HG]U0TC6R5B";_'C@TUC</<;D\*KY\NDGD]
    1487 M?\[S[UE;XHFL;ZEZ]"6?J_[^U<=X=_#-@GK3?D$JLGRSP_O4O]/SL5![XQV?
    1488 M<=8Y>,Z"2;.\1WP_3^JG1"7.]+;/8:0IGZ-(B.=O\,'?X.<WWZ"U/>_?8#I$
    1489 M#$N'P[C=N:G/\]3/'T*R;D6-8IR+XVTX9_I.08-Q2;O(EEX4+MU_LKC4#M)X
    1490 MTM(,X1WE--'Y,7>($T77]\VYF%'3<6[HH@M$%Q2=)']B?VT#`ST904[017#(
    1491 M!"S`T8?,14!=0E29RA4MBVV,<D1(W&G%<X3]1H-R*(A"F5TCJD2W\8L8<8U1
    1492 M);,I6K#@$TP:KD8E><?O/8.%'_MH!N7\*X6*H?T<W8EQI@0-@C`N`1HT'3V(
    1493 M,&;>7M.Q_P`[;!O&.5F`L45",!*MS_T*?HLPKBBR+W#;7*N?("Q[;AOQ371;
    1494 M6W^OWV#\O0P,MT\VL,W/XXEJ^CFPYX@>)_M</:^[.^D4<6_/.^Y1SUV,[<@2
    1495 M<I]**T57T=@),,RX7Z]V-N;!'I`.#XSP5QK:WZAG=BUT9$8/X]XTZ@W_XS"S
    1496 MGR(=[1(G\W^*K>[4)I_+W!Z?OM?"]:>`%V>9RR'PG7KGLVNHY7TGIZ3>&)SK
    1497 M1ON'.SY[^G3NZ=6I7Z7[:Z14SVW&I=>C?-8A`?9"4I^]Z!39&AMO;>[X/AAI
    1498 MS[),1X2999L]?W+3(-<Y-%G!G-3C8YQ3'[,E%QV5<?G0DJ47U51U#^JI[@=<
    1499 MB]+`'R/B+$%^=@\ZF;/&!3D2&K5-B]&GQ(`&`<B`Q'<FN`0;S:<.)V6`V5S4
    1500 M8JODH!"HSG16E&3P(I"U8K]33BE+]>@51+,+$$\L8K*=3Z\A;BAR0(S@7/]O
    1501 MPZ5>QJ%P*=UW6'HI<:JZSP;FX`<-LVU$P1)1,8VI)TS>07A3@L4*XPVUO#_!
    1502 M8GIQAEK>7O6=#%SUG!"L3X1AV(%>_Y/C!G34'FCW0$(!MQQ&T!!(LFBXC[5B
    1503 M^(:U6L;UXAXLW+-G]=Q&Z&4Y+G!L+1HK6DF8IH&QU=#'%7CSX>ILXRHMN_+8
    1504 M>M3&PQO0V&SZ?]W\:^*PU61@B+_`6]2WE;X#K+)H7_.JJQVR"SUE%RH]"^K9
    1505 M=Y/YUXSD/E62/#(!1QGED^V7]V/D##^FT0&B57,O/%@?+GYVEG=N+'44&G1]
    1506 MWW#'J[WSPX6^FY1>=O!S9&6YX4G.Y^;SQQDDLM-\&^OJU>9282Z59XK]+<BK
    1507 M6$]';I5V4)6<02:6=I`E5;?U67:0K8P(2@"(VSJ-.'HI90D#I8\W[J`JK1SA
    1508 M>XX[6/:!4I]Y!]L^3@[!BY>HL(Z@8.*/C')Y]F9H*5:/4=9*JZ&E6#[=;]I1
    1509 MUE\5RMJKH543SO*VFER6N)-!_3Z]D3:;9%"6XX^]WV)0]B\JE'V,B,KVX]>[
    1510 M<9@?_W"$RN;C=MJ$OZ:V^A\[;88?4P4PMOW^N(%M7PO#^+-X<3HY-CERR<D%
    1511 MYJ#!P=/B]'Y=$^?'S+^\.#\7QR&ST8P-(E,1N;.6BXN5"G%LT4CZ7\+;X829
    1512 MY'Y)%8<P]82N,DPGUO)NG4,(8FCJU1[R8.4GLXW/,*(:.^ESI+L^IU7X[9^A
    1513 M!PKX9Z^5E]Y8VJ&]XV>/V#F5A,Z[>X#CX]-W"[`?(0B?B7>`SW^:+"LVJ(=H
    1514 M#-]5[<X05YW@])WDV*_%RG1;AA%]6$95*'UWU=!R85=&.3_?T$J$LNJX&91,
    1515 MFQHEXZ9&V4XP'.FX"_`Q((RJDT`4K3BG&%;\0Q.3WTIUS+XKU4/;07HW!+'H
    1516 M%7%++'6%<JC?,"QZA8*IWS!B9G'K+VX8A10A5N%KGQBG3'URK=(AH">)-76K
    1517 M;7&ZSY5G!`I=NE/:+MV8Y(K%1KHFE8RN>:\L:R99NZ28#P;)6)=W2A)R&?0P
    1518 MFXJ2([NPS[R#'B:9P7!#H\P)JA-!PN+"9.+SBX.N*9`KD:`7!WX-[NSOY'JC
    1519 M\$Z_..X*%E@<]>P+C3,.3`CN%SC53G;*I4+)XC)/$.F<<K+7DXOV(*P>*/X<
    1520 MA/,RO(FYCO\B!\V]XO;QJ)\C\\N_G7N4SDJ'>>54!D\1N-M37NGS(B3RNS)U
    1521 MG]\P3;;@.]`F7$'S"BTB-@O@X3H,-EA$BI+6"X.\AN-.BD9P[C3O("]WC=)Z
    1522 M5RCSLQ'!@V@CF8Q1SEP).ZV8>AGFT'=OB.6L;>Q9PKA5'\V@7#A3H1SV-(J$
    1523 MW\3>S%(9@7QPI=\H65(CD**C-8HG[JE.XPYR(*1&V<]P;+VJ"(M_'C^A+/+\
    1524 MO(R(,K@;6[LVLS/"X>R>)#60!>,R*).K,"[9<,IR+.<MC?^I$K;G4B#M?Y8K
    1525 MZ<9KT>DYE*F'^$+D9X*STM*O."O-OZ9?G^.3PDAA._7U-'C/"$UZ^?'O$.,B
    1526 MGW%T,BR/S*@.2V\<^G@W#)_B7.[,Z!0%60W_#YZV(L+<-\R(XY(2'*R6O'(H
    1527 M2O#?N;0P@JP!1N)]V^@H(ILPVH#J1D<J'_87-XR,/HBA4+,PD9WX<CY1GN:<
    1528 M`*)$RI-7)`^W3XX,]P<`N'1/AG&NS+G/L6.R*-?=,1!N-+PS,AQNIY><WALO
    1529 M`V(*+F=`/00$?GH9$D%!!C4@E0Q!/GK\=0G#DB\S"N+)XE=<QK49F/$$D6`)
    1530 M!#>)NG$JCC#!<6+I%QPG]L:O;FSSPY;VFCY\_KR>XJ(_=;*I=YU_/=>_TVC6
    1531 MXP8]*6F9U::^O9\4=2A7[_%?*JU@//A??Z0]R2ECF6<`!"4^8XSM/&@W43GA
    1532 M(#F7#5.YXF`-*ANF<\2AP[9AQ.D18V9_13AX1EK?!/F!&F"L5;6-D*/OF!(5
    1533 M1D7)!V9@GQQVI^YO.^AA*@ED=S<6T.4=+\(/P(#XM]U-"O)5!,2KC44*11V,
    1534 M,.<,J'F,\+VR`>6F32K(<_WPU**I?*I59!CG[;='XRUC]]?]C<(['#B6?L&!
    1535 M8\.\W3\2$-R[U2(\>VF[,`)K7F$(Z:]U;$B7YG%O')D4_I3%W\/2D:#2D<KB
    1536 M?%S(X_AM7AWXEWZ4'XU?%Z0#ST5-)(BA+W7'G)UM="Y`2J-7="SU$1W(N4Y1
    1537 M*NN<@PU,@2#Y*CBH=<6P6"37)C*56Y;`,Z(J%U71RCE.A*KT4T4KWE?5<3,H
    1538 MR]\*Y:!B1-D./(.1<4?FO`="N>IZ,+049,HH.S"]H9W%772O66/DYD2,7)R7
    1539 M3W'$+CW</=^44'&1QITVXRK49N&PTQ9<B=QOWE$Q%B,J4>.F!W;=\[NR<YZX
    1540 MJ+CEF8;]J>36DUS?H-X92^6!&?P.+FY&))1@($N]F#^\F)[)7I*8<VX(1D02
    1541 MS4V9FMGBXT$-&1HXJC3WX:F_B^@L:=,2V^*U,@)GDZ5?<#:9R$*#@PXKM)^.
    1542 MQJ_A;#S%(F&JZ<2?(VTTOP8;[D:0`?1$C.<0B7H)XI[7]AP9:D^,/QZ'F87/
    1543 MD4S1'I^=AY4>I!*'$;J<C-P=GR/#8D2N7/!HG4SQ^@,^[=:13VQTAK/,$I]E
    1544 MQGL@EH$@VUY<?W-!Z[N$%9/:66Z<"S.-(7>HLP^_^UIKR\7\@M/F$IRPE7[%
    1545 M"5OO)^R:4N?@_<T&^'T9@\T(!6=FI5!4-HJDBXQ=A&MILV]-\*H8T$;/S$;P
    1546 MIC[TC9X];UO_V>*-QZ-Q\5GN#1(@.X_=O($1'0)2&9<`V63I)3.0<0F0C9:>
    1547 M&??6?[)XU#/*N&:C&STYZ[H34<?35$3Y#)IJ:$F)8)0WAF)HR76B^RT[JLXY
    1548 M9917$J+R,X_H971L.Y9='+JV739PI;%)Q)EV-VM\D.N`,W40C88='T>SX7SH
    1549 MB\:QY/!-'`P4S;4@+"F,5$LS7Q#6`T:J$<6%/7D`I"3P`J0F,(A462UPVKR*
    1550 M6L;($#7*)M^`*#N[PTXK`;O8;S4HBZ$*Y5)&@JY((BC$.3;^J2K5Y>6`A,VQ
    1551 M@2=^2PEP78MW"02DZ$DX*WFR"L00D8\Y\#8?[A)=1%YG]CC?OD@`@,T"M(U?
    1552 M<*+:"[?_,)(F1X31\CY_O<X_AE>:"V]%WE/2JKR<GWF6V\GO\DR4F52>*W+U
    1553 MG8:<X$?AN[.]C@R'9Y(-J*SH5!>[\;+G*,497A1[$1YWC'3+'GC4$Y7<J>V-
    1554 M@%8W3D"-[T]_%6.D+"R?$-%Z:6&9>9>LTL'I;TE.?R.#/@GD'&R*#DN.-`T[
    1555 M2*;[@"!;Z<-.2GJ'ZC3M(+MK-$IY`PJ5\S,*:1I2QP:21PD7X3U;>D@C)5P$
    1556 M^63I(:%4]1\LSI7W-ER4`(T'2=5R%!.#)F8&(Y_JHN@HVHA!.?])T9&)&?MC
    1557 M&S/>S$9F!R$Z.Z0"P);Y60>`$:@"P)"261N!*@`,*:7"&_29=U`%@!&H`\`F
    1558 MJM;%,70]^LF20&^]'IA.?O)%!_:)J"A%J($>PPZ*!5O#4K))P9+\0E6-Q>E$
    1559 M58QU"26FH>`43^(85CI6=D?N!$_&<'NQ8XX3&P#G.9#[-JU`5PQ7#6L+`@L[
    1560 M1RV(B^R]2A\\><LDSI-6*!24XAZV^*5Q3LL[39]L.W!\7/H5Q\?)MC.VFJEG
    1561 M7MK>1_VV,+>8TL.9AN.]6P+'.7-#'QW)K\]>WVC9!D_]]2E)="OM-8[$"#]W
    1562 M&#=M\V'4?"N?(U^V/GJPZZB4=.XWXS2=_';NGZ;!7EOM50H>G#.7(MOL\9#8
    1563 MBNR/B_(@[\L[2/9GCR#N'8IRU27&'JN&EFL`H>7W%8CX6+G-S%4NCW5;B:OJ
    1564 M6C;,U;[$G@04&&Q0T5N$]W"P#V&!2W_@2,BC2.%`E:_)YE*!`GV&!9Y3@`8C
    1565 M=PI77\[;76'#:/M!C((2YI<M&%>HOTE85-TP=9`(@9+AM1%2&#[VR%D=>'?;
    1566 ML`(+BC#VL>3)_N_@3$D,B2LE:3+ZW189AZ5%348B$/;F-<95$P!3QZFTY:BD
    1567 M/9U8*(9JS0"-)V\;$-]TU^X/K]P?>!X%L]Z[JC&G$I"E),IP9P(C!2/*KSA#
    1568 M;WHP9UZ95]Z2\'[.<U!.5CCE<R+USU'FY'$?KLRWF(@@9FD4T_SL=0+:>4?K
    1569 M'977>PCHKQ[CE'NI`/]9F,G^<5`!,,PNA=L8`Y+!I0Y<@I/[$I_<=Q-/Y3+T
    1570 MX\)#VW_3&*T>=!$$^/R`C`\(@=YXY>&]O/0(I.]YQ]C2L?$!$A@+7"-/T&F=
    1571 MTB[97'<IPX%>R`K7F!,3V>3-;L"YHOGO51]M?AEDM)3U"R?8I5]R@ET/M1N[
    1572 M[UJK09U7YT]5K_OQ+JR88A[^+JQNU_7\?II/@F/K4F*;\%+$R27MD*.[ANBJ
    1573 M8]%V2DZK9W15LJ@[)2?:8Y\_@T%)K=!HE@*LC(F];!5CZPV9&\1^(PU2<BU=
    1574 MW"&V'6D0:VJ\N$,L/-LSRD6#V.9T@^<$D;V!;A"#,WK@?@8%DQ-N@SV-TRN8
    1575 MK:#>4D\!:NNY;B"91A5(CC0%<B@>2W\<EDX[E:"<K6!H2?D7%&H8;K1))#FL
    1576 M,&ON#ALF%<X94TFV"B3]C$"I%!4V2E)5^3F\[2,JB]-MG<8-A*PD1!WWBJA8
    1577 M0\9/'6_@=Q8/O.!B#7&67I(H&==A'!L]IY#J[H.!V1:B83:%*%C\G7R.G>3[
    1578 M1(*V]&BF`F5[_]6`2BH9'_O/"#<&!>G?]><Z7PY/*^HB&1U[(Q5I!)N+M$#B
    1579 M)\7B4#(H^>4H)6CNO-+3-*O)!CC$O+NN=*>JV]V48?9GX,H"0<6J?6%B$!SI
    1580 MF'[!D8X0'2HNV/"*[SNE#,TJ`^$5[BM!=-:/&D;<,#)$1:*KO4S=<Q0X+R,]
    1581 MJ/8=-[_2LW9-]UFF0IU/J?'4@9_GA/&IZT.'CL-*FQXN?;IIIJWO41&O^W/=
    1582 M,-%VAVZO07"\<Q<=7RZ?N_JG*Q-U\ZS97ES]$[3J_YOZ>$Y+B'`@99(#*9T8
    1583 M?K+FN$%_(-(@S"!=W"'?CS0(.X@7=VS^S:`91;CHRE\T"`O!!G"@+!,HN$G(
    1584 M*'H#)PE32001VTZQM`@0,M^"_B122-W=#,H>&H6*D6T4^KM!)1KVD3&J'$V*
    1585 M5LK\$:H<38J6LPA4O]6@'.^D4.64(A3+2H]\(CQ5N"*(1:05)9N1"<2"T(J2
    1586 M*\5BGW$'*3U*@921H$`V-]*N@:]9`<,C?)&.3(:$X5&]2$>>,.RO;!@6[",,
    1587 M_6Z$\1KCHKZB]4L17XDXRYH,ZH;0Z)J&Q'H<56_P=?.M6"6$7@P*A/"^%F%G
    1588 MFLH5%*R_B5F"=BVRW))BB15UI@I'=X6UKPV1G].V`MNW=#4<VK>&1D-V7=BO
    1589 M0,/^!:>TSNUHYJZ>?]Y71%$'AY57U+I$M6[BV)+BK*7Z7$>8]S]2SV;H_QV)
    1590 MKN>_SPQIK//,#N=6"-'<B$;L4>D96;$["\,H6.`_^QX7N]VW;S^?<)C'17C1
    1591 M=P[$JZQ6K_<B.!@V98=G!8FOK"J%@+T_#$L(6S34K`@Q++)=,-3L&M)])P/K
    1592 MN#V&19)7<%CVW25$BW5L`7%9=Z%]VM,60(4UH'TN?[E_*3]RP])[%I"79P/:
    1593 M>5.A"!<59TJ@.N@$*54&FJHA$3=*E95&?=8=9'\;@NQOVV_G-(O!I;FT"]D<
    1594 M&<4#QS9:LE@RRE&.T=!RC*OJ-^PHZP@*Q0/#!!6!AXQRK!RS2>$ZJG6/D_W)
    1595 M\;OV&U&T/+VJW[RC^KLA5$?`#G0D@DW.G%>-,DDP6R$:\^J^"L/<)29TFMSX
    1596 M8*_^<PX=@Y)=B0-SJ9B[*A0#9_VF7WK6[V#!KU5T[`M+Q8SC/4ZNVFVXLW1L
    1597 M/SF[F]^&#^TK/,?%.-H#'''.O]K(:>DI9Z>,/QAP7&7$_".-X(WPZF7&[I_U
    1598 MRC"L)/W//_2?35LP^\_@0.&4D^*N;$'+)&K*[YX1SFJA:FHE;&YEL).AEM1(
    1599 MU7<VL#[8B^&JEC;#G.LMKW,0K%_G("$E6MC(SA/F>KC)4.O7X;ZSA;FNB8;Y
    1600 MP`0%DW2X'$>*"R?`\`@0I".C-V%X]`?2D:T;^RL;1OP7,0IW0&R3!CU)SA(+
    1601 M&A`6A3(8:MY4&1;3DC?4$I"@^HX&%C52P:)$(BSCJ\/TQ1@9F!<F(RN:CM87
    1602 M:"4<*H1TQ.FQOZ@Q)0J!0L,*.6+(GXWPXKDVI9ID]1DZQNH^CT2'Q93O&(!\
    1603 MZ'N3QL3TN##.MEH%BI;<3\J:G]+_*)P@T1M?;-'BY.,;1V<H[S87).L]<Z5D
    1604 MD?@QF%#7QB0GCNPU8"_Y%>=&K\3)D2@P$@9X\Y%29!`LF(<%*L^28^_TG)5H
    1605 MQG%4/8ZC'XG;TRM/>,9T]`-V+Q(K9_S&V'&&D<F]V_GG.,"O]G*6:40-^F&6
    1606 M.L;9##V&\=RWZC?2/3@F*1?3_7$NIASNE^!,ZY2;VIDX!8P%8K$:>80E*]`;
    1607 M:OZF&99T0&>HV1"M^_8&EF`Z!4MI3@.SW4R%VK.VH@+MO4%5$)L.OO<&YBH'
    1608 M?N\X&E3J'&B8"QUHF#F3U`SEG<WQJ3J"LX@1+^C9K22XEK(W>HHYWOO/%F>.
    1609 MM^',]12."^5&@2J\&&X2J,(K0:B6+P*E>8\0#:3JCJ*">%,1B/<4@2#TG4/R
    1610 MV!4F^6>"2RJ$M_1LMQ1<-`EGZ=E2N?5?+2Y:AL:WHJ.$D_R#"A">%8BJ1]PP
    1611 MTF!1R:'8T%T=PD+ZU%_>,)*F$*./#Q4>.-#G)J&&)/?YM3EEVEQ6I/N+E2+4
    1612 MWB7MK=RHO+.\69FQ,;!=A;5=2<6-L07*1@7GMZ=?<'X[)+EQ;/N%3I1'GG_N
    1613 M1ZN-@X6F9:KO6FD:J%81@![;GN:>=<Y(CU]`)6E8ID9I3!>[9>IXK*TI#KM4
    1614 M5Y;*PZ\ZFOESG$*$&YWD8TF\X;>!-+9RD)BFN'XFG!>?2L!P=JB7?)]N4MX#
    1615 M>%LB*7L04.H-EZV91RG2%K%H/5=$G;?K7'$X%#S]BD/!77SWR?3CO\?Z[_D;
    1616 MUG$ZRFSKEL8Z8CSO[ZZ^CK_/<9T4<113[9GF,)4\/I"8Y`1P7:6^*260=W>&
    1617 M=3UZ3<V[.\.R`SM#S;N[[ML;6/)<%:P//5*=P.Y!.A1L'Z1">0W!:6Z@4WF%
    1618 M$#^JJJ.H$,J7$(0%`X!423LV/TE<8%4P.PFJI5;>%BD/>AB8*Y=FV[<WL"J;
    1619 M(C`[#A1,DYYY=Z0Y3XS0E"=%LW:&FQCEO$)@!X!^HD)HQ@7A&0]ZG^?*>1P'
    1620 MLW0?L,<%1%B=I0P"UE@;4DR?TV8LQ.H]2\(`4QX53Z?MBRI7Y#MMJ\\5$"?9
    1621 MVK1-2O[@D]E4(HO?78X#7#1WK'?S5"E<<$BHUK<H7H`\+L#Q0$?X!:>>3X<_
    1622 M'2LP8C^ISMUE,>@TZMM1X>=1`;K_,\Q_:0:'QE=\CK/SNO=_;$@Z<"`^VM2P
    1623 MPJEA#;/?.#-JF/S<*W7?RF>\V,+^`QE9UP?8;/8_.$(]]2/4_\???__]MW_P
    1624 M!/<3E#\?G__E\?E?/Y^/O\C,UP#WQ;_]]H^__\___ML__NVW&([D?OSVEZ\?
    1625 MKQ_O'\\?__O'__GQ^/'YUQ^__;=_EYL3W)S/G^WOC\_??I?F`LWU;[_]^__Z
    1626 M_34VB)J.?%,.R&.R6I_2*6TB`VE;`[.0O<'C!W`VE%83W^`%YQLXI&$UJ$%-
    1627 M#^+%H\-%`POR1??$RNS"LTOE!LF<O,<<=U=C<3>)A6VVB:3%BR9R*5=I"KE%
    1628 M?Q.IN-J[2#B&)A@A%?BY&$6];B*39#']D<,(;\JY'C3=NY$VM]JHC5TD6QL;
    1629 M=R_:V,(+YE876N&?<3?1THUL`\8;<:0J"F(;3?ZFC6W"X:)3M@Q#8W0EAML;
    1630 ME\EJ"<WY<GO#(M$-/STL$G,/+1%J2/X(-TE/KK8[S,<R@Z,5<C&$>MV$=89U
    1631 M=V@>E#FJI3=QQ"<<FE12KM3$Q@?=1&DG%TWJ:-_9Y)(+&==CL+=AC@3=AF-D
    1632 M*X4=2+INHD7L+WHD5R^T>9?]6%('_V0]L-&[.L=^\-0KV/&T&^J9*M#A[!W1
    1633 M5@:9EM8(P3".E5M@GM@L3$LCZ5YH64S8A1K3ZIP^C)D3&ET*U"*FJZW-Z1,1
    1634 MM[O8+[#:CL,U&K#?VN@^K\].C&J$/]G0;<?!"L)%CZPI['U"LNYJ:><F?:/S
    1635 MEAT?"A/.-7NRF!LH'LZV-1G\Q5T2ECO;PLDE\PU,E(>]CWX7;)(ADKIS,8Z?
    1636 MX;J)?\YF>UP_)[2$DI._B4%OY=+=?:XIWL2LES0.QKUD[V">WW%WY$2,3()-
    1637 ML"_Q&E$+C(I9O7EZO&H1_2#HOL#GQ/=$Y_(-O1_M[IMOQ%LY(8S1R$=\:TIB
    1638 M+.W\%1(S8,\HT28^/;OATU<L@'K.B@%0]ZZ@>+DW+[].ISIB4V\YSQEVQ_@.
    1639 M0"<"E`W^S=!2;=232Q[MN"F-"&C9J+!H<104J:<?%W>4+0U%=<&6A@F?XD9H
    1640 ML.>=([Z'X%RZ20!H!8PDO[K1K5WV[H,K--*UO3(="7D#@^>24JT>TC:,)+H,
    1641 M-Y,H-P\`CH<KL&;R\-%%[]:*]QP7<O+T7!)UFB"2+SI_T(^"4><GNX\ASGX"
    1642 M8#Y&6+T#\[72^T]3<M==?0D^<D[M3%R,1RHT>UZ>=;[PT3H[[/6EO"\)Q^/[
    1643 MR]?6W(UBUF]_"<YG=UN9XOW-AE1/"8S>AWJC+,9<?;\8^.$&DU\\?C#]@^;I
    1644 M?@H[CCJY+W'I=;YOS>-K.=\R'WZ._5QNI0W!#;2U)AI5._ZLGES/_UT4.)$R
    1645 M9J[DEGJ"Y$<X-<=9\<R=+-F/Y,B/''T>U>-K;JY#'^[4`,*JB18^RE%<5[KK
    1646 M<:J^)[VK+;>O4R]RYS\2</]Q,EK?ALJ=>EF4#^=];>/T^![?^.%2'3533L7[
    1647 MHV^/L:OR9\OY(;9P-IR*>1X9<1W*AZO#))T^DG?E:U2Q?_A[R[&.T/_T^,CG
    1648 M`'H^72_!XDM_L3ZX\\;V%.ORAVOM:.,P^QXIF5<PSTAT[T&2YTA\&&5;PJGR
    1649 M=S&UM9Q'_+Y_E,]3^2O]+*C2C0"A_[*E]+GJU5N.S_SAS_O;.*]P])QC*_W>
    1650 MWEOG7,FG5^O9I)_QGF*+/33SW3[31\A''+7U_>.CBQ&]J&>[R"C]_D!"+_;N
    1651 MYF`9^6FTI1V7>9YG5VOAK9H#A[RSC>S9NVH4-QYD#9*X(;Z\P]XI#CULQ-$.
    1652 MI:Q],Z#\3:-$'C7;K81$8.,0T?:`_K+$.C"]*IPT)=,`1EG"IS1*7573U4^*
    1653 M]88F&A5O/>;ISEVV_&0#<-E[4SL/-TW%A"8<$R&G.G/[DE.$=<M/3CVT;;<O
    1654 M.5.86D@98^]CL%VR!U+=R&/D\X>O1M*NVRA?4;61/J;]T]S8U?BU5BB,Z\2'
    1655 MZK_65]I@%CCWAB])VESPLEE03W'O2<1*O(G&A"%>ZN'YJD',TF'O:RO_2FTI
    1656 M)](5)`-O+);4-?YR@URW:MLDZ>VBD6.("K25&B+?&+9&ZE7[+U:C&BLG4%R-
    1657 M)W[3J!T=6[>;OV.UBJ5$CM5<*4IBDW%DE-F:Y).Y:*0U7+`)K#FN[HU@@.&Z
    1658 MA-0HX_3LA+D:3/NFD3^;;#N5ST8U'D=PLMZGC2ATZ8N7+6"P9C7E_%0'YF,+
    1659 M3N;:J_O%G[)P?OXXNGE[4MTP_B7P7JA=O)X_]!M:!IZ9!*M#M'[&YJB;1#>]
    1660 M:%2[WVHBG8TU5&Q$-6]VBHTR3M[[K@83OVD4;;693D&5@T;29G4@[3SED71@
    1661 MG7:VM:GDLXO[I)[\G)NEO3M5!W&[3U5#C':<XE^^&$S[IHT/U7&V4\ZX@#91
    1662 MU&@D@W,4I?Z)74>W1;#KV+O$KC/;4'GT6QOH@7L+J))LUC'#$+..Z>^GWYI$
    1663 MO=0-I$.+_YTVTT):MQQ.G?8F,4/:-DG3CMRT#`2.#X:#-NJ2?>EX'XZ23387
    1664 M0_'7;>R(AS;J$Y:=-)YMPT!6III)0='G7<4-!=F1D]P[VS8-AE<MK,T?W.:<
    1665 M#V7=]=/K-KZO2=T/OP_P)[,,.XR?X9LVMC.VO4M_2.40OFF:"]6Q2=T"GD_5
    1666 M?3)$IX-#ML:&'^_5C1P0LAKC,>VU.BQ$W^GYW$)I4T-EV>AB-%RBX*)/5B=T
    1667 MGYYLZ](4SRDKQ($<E<:99U>=FF)B+Y2GJCA;6T(A_.H^*IB5UU!R+G0?"]K;
    1668 M?1D%[6S'Z<EL9$;BW55+7L^RO17:R:EE>1VW0[V[]R.RLY(#UYMM8^'SHHW+
    1669 M*E=I(U\K2Y?5WB?2)33B0%DJNQA+OFYS7`"FF#XGLXFZC1S3*DO%CR;ES%:)
    1670 M8M#&I^M>M*DM=;:1"UY5&=YNH]`3:,-1JM3[;23EFS9.9'2F2RX?*DW=XL8&
    1671 M"LH?G$VA5!]O8'6.IHDCVFP3VY]ELH)/0XIB(W0P=W'8>;@>(7D++X81+IO8
    1672 M+.U-A\SSX'<AGQQS=%8_@OCQ>!K+12,'LE\U<NIHEL;E>>28]GQQ'X>VJT88
    1673 MJY01OQA._JZ1"[HFVZUG[YXT_O7V%[)-3]?X#`*NR[9,,154FR4>-7@6\0@O
    1674 MRVI-+GG*B"$+-Y0RFM2Y#'LV[=JS^F*/ZEJV<Q:UTHV"DGT,>6HI7*ROKXEE
    1675 MX:98KKAZ"FR?1]_0#&-NI=:;F-WG8`,;^J7"P>BF>PK(XC6CR\*YU8<;QX!,
    1676 MLLR32T/PY%#@2`":7#'H8T6$>9@:F?%)UE\5#<^?R8<Z+!=<L;`KZ\[!]$::
    1677 M)+XFX_LP=(`A?QQ$XL6L/[[!^W(/\!/()?#3"[!\!E1O8%G_EUQ/!OZY/,11
    1678 M(`Z!\Z^4NH5T.@M>YS-;)1TM+*\#UBMH$,W5XI_T#R27VS\OL=,GM(1I6^];
    1679 M4CCJR%KRW6)VN'$6M_]P+;HR_N[OY&>-Q8[68Q1#^#C[R-UNWRV/9P_]B.^/
    1680 M6GT9)7J<.WRO;GO>46K+HU#"N1R/GE.5O(OGI<OA*%^OCW.5N?1Z?YR_<FDO
    1681 M]C$\)>0NO,HHOWY^EM7[48(]/A_EP]4:VOG@Z84H']ZYZ$9,7\_$\K'3CB(,
    1682 M)VEQ1QUOWYT/]7QH:L?H*3\?H;L2<OGJ%Z5[,U(LZ>RG5\M-YRN'\_53K_'^
    1683 M])WE':,60S\2YN[*4>)7]P&,$\K/5PIAE')_]HLV8@_/I\56^K#/E^A>B"/Z
    1684 M6>1HC/(H1QB3VR/PXSF2F.LX#HQ+`XZ\L/!R]9UZ7EA?[<?YF.ZWJ.^'R]TW
    1685 M<?921[ABCV'TG\Y_I)I<]X7$MRL/=[YB/>?@RYVCZ+=TH)T?<^\XO^O#E<\/
    1686 M%]KY;CV<W]5'_3PINKFYWY+>/>S?'>=SSH5ZOJ#K=3/;9_Q(V9_/K;T>1?[L
    1687 M'#B$VH?E>AY`_(@QA_/%W=&K6/0*FRZ6FOI#?7?!G`O&G0LF#H)XWG&NS);Z
    1688 M&,8AGWVA'KX/:%8M_O"MCR=]=G-_.U_/':]S3OSGMY&8WZ6YB3\%XB!;7OX4
    1689 M#!(1K<\Y'9`BZ:[8(IKBWJ(JN(T6#&&1<'F\1\(L5XL>FXC(^PC"58O*DE*]
    1690 M25$8OF<:`=41?HT-A^J0/H'547V:FG6BQO9./`M1B#D4:L(X$/:ZZ">RRV7K
    1691 MI#%,G7",U(3104".D48N!9)A(X(DO,:=DE2PQAX0<LX'),4"V/KYCI0Q]:RV
    1692 M@U@76SH@,8HB0*9A(K&MIF)8!-GM*T1%"#3=:(C(G2S"D!V&"D%-</GG-#;O
    1693 M+GQ(`),M=_SJ3X;,V68X/HY?QZ>$G1#R#KI@MUR47J'TI,J"G8PH($83P4$/
    1694 M:N0<U:CN9E&.[_])96,&MGPR7/!T5N!'(RS[&\FW0_.N0)KW"0X5"0$,[1%_
    1695 MI(KN85<D/B<R2"&W-/6K@Z&G(;)N+K"L.+I:8S@D]FJR.9R=L$514R'O10S3
    1696 MEQB%*8G2P1IIW,E0$J=(<P710RHL8PD8]QK=K>?9S#/GS.B7XIP9Z00/JN7?
    1697 M-`D93VK<,5Z/<*NNT^[9?DNJVBSZ309?TK2B0DG%BH:6DS79/$V'J`=%.]AP
    1698 M$A@&04Q,/ZX8U-'9ZUYUP8'`"^8@/MH2(49PV8I41%_4V(V#I54,X;((J8B_
    1699 M]9'`(RE^"_O/&T:AZT7N1,6,55?BY!)Z2Q5!(R/T"T1%,W:@I9'3!(N^3),;
    1700 MU)/FIJ,Z;@JA#=W;`&8_PLN&>K?6B$1_8?EYCBR#U125UCJCS>)2(RD^,JA(
    1701 M+UF'I#DO%93U=WIF(AV=V6Q<^OF*#E^J[OR!>[#8<1SX;0\1O1Q\!=H=AWE]
    1702 M*3URTIVR)`2(S1BSEX2"<:P95JUHD&?3ZI^-"CMWFG!5)6FD47V<OTE7DKKN
    1703 M=APC#NPC)-=&S->Y%,O4ZW+I4"<J7:=Z?Y1RQ%-9.W^F`.=C?3@?\G%J0[$+
    1704 MWJ?&=2I<_>+1HYV+=^/\DE.-"7X$FL6>7CR&<2I2_LA^T':=*I^J1M?<SCYJ
    1705 MB%TK?7R4VL<0NSYV_@)=+^A:XG&J<8F&D&:-C)%[?(JIW5;P588&TS[.U=(5
    1706 MOGC^&5TH7W7TZC]"SG&,MY[JQJF(Q9/ZU(_.'^^D+J=JG^/72/GJO_SYP_7S
    1707 M`^J]YN)'A-OCHYZZ;!^7E(Q];86?+M.\^(>5T+]\''_#;"[WU__O__U__G_D
    1708 'A38(MM8#````
     1225M_JTHH9^IE/*K0H$G"/S_W]J[[MBR(^EA_^<I-@S_Z*YUJI&\DQ9&+V+,$0:6
     1226M9`S<EH2IVO:J>GHSOF!<F%R[1^XYZ,;9E9%<S$@F&??+]ZN<WR^JK/Z,7X_G
     1227M=WQ\S;^IJ'G0+.!6X[6JL4]"7B+7*R!EM5UA511]4*E1;G^,2@I4#HOJC-+0
     1228MC_2>QZBK!`.55<C\]WMH%X552P1XGZ^0XBJ"U=_#E1O%;G?N:]CRH!+M[;L_
     1229MGITBSRFD'O45"-NK]/ZDB'4J.EI3^"K?*,$0YQ0HS/Y(X6KSN?*P\>M@[3UD
     1230M.U^6N)VO551TA56+YW(9QEP<MYBN)69[+T#[%,+M:IHM,>15R/41[7V4]I?@
     1231M;?0/V,V)4)HF23AZN%P[7`2!.]RK002^V>[&/EJ8Y@+?[73]?&8]P5H'3\`N
     1232MM#4;_&Z7D^$^&$B3;AU<R]B]&*])M\'JNTK23[V-]^:?.YJ:='M[;GT!]U85
     1233M/\^6-!VV8!!+[KYNJH-`[Q[9$'>XKH[<.+KQ+/B+QD$&M5T6S\=J;B>-ETS8
     1234M39=W$Z77\!MT2X4M+Z;)=_A-^'WUV.P?X!99?1OW96ONQLO^F]M7::^FV4P4
     1235M#L]\A[]JG>2SEO?C?!VVJU=X[G`+;\LG_GJ@[W`GX]S7OYU@D=''_E#]C`)W
     1236M47\.?#<ZW48K7;C#7:OJ^^POP+J4DN3AZSN7%^.%CKR"2QK?;84=6*?WP3_W
     1237MMWH%]W%!]\>6\[%*INYP$?GJBV5H+^"^\HV?QUO1W<[4M,^5(N]=PUK_8FPN
     1238MZ!=@)7:WQ'D]ANF8Y078CAO#A1J-'7S2QA=P]1V/[54=>,OZ;V[XG3;N8-,[
     1239MXOE4!]]-:#=4C##&<]G5`7U;F?X"OI6U'/>^;F&??"/>XR1:P2-N)"C<WB>_
     1240M>IY2X7'8AVY@Q>+:L%"6<-UF/H'&SJX;:M8>YV[E&0<.S8VUHU\-FOH0UW>]
     1241MS_L*IL1\',M0CK&^=O0XR/6>TN-KXH^#AO?;&K3C][HU^X'N"8TWZ(T%;$]3
     1242M4M^/=RO'%,*Z]AGR!GU5[W_L)+Z=8"$;>P;25O9@'$RKG4N4#>QP/K.!E,#4
     1243M$X^F8(G15X)1#SQ.J+*->KYY.4<+;ZOGQY+8_7&RC'*\8SL'>]?DBZUT2Q3R
     1244MCLAQ,KO;:!]#L=/G)DRD;\Q"0P?[29X7^&!<.USY7#HFU^BCOG&<?H*-G\5M
     1245M%F-<\9C]!5BY93Q0M%BE??@P\(9,-_@*4W,FIP.7%^"P4?]^\MS;<.6YX5QV
     1246M#3[J+QC7=;QK?S%\XQDO/O8^2]AX27_!BV_CE>WN59G%0,"Y+LZ7(DZ'K:QS
     1247MN@-]@(R5EO8!,MW[>)(-=<\7*_A1A#K>?Y\5Z)U!Z8#ZR/*V^8*L1;US,AU`
     1248M'_#=[EB5^\\/H*#*0.\2S/>AOL#8!A2?4=M>RD'7K#X$H-T_RP;<<TS<H_+Q
     1249M*%^Q;%\_\05M[UKOP%OBROK]+7'E5N"<H^-O]<V+!]ZKM^Q?=8=&MZ[;K.*V
     1250MJT<A]!WJ773U_F'S?=8#Z`UO.U;B>-N&NL!Z]WP+EA?_L7><U?L>W(`^%+@>
     1251M>W`;*GLP'>MJ\?.WKQV/UZKWH=Z3=7S"_?<^#KC>=^8^5';F*LDHO5Z%O6F/
     1252MFS=7KJKX=-H#^.8JDQ?7JC8:T"6V>J#TF55Y?'O0[^D$2QZ+@C49UP%O-6]7
     1253M3Z%;S=NR03UIVN/K\S'6AS*5HQ(N0WU(K$6ZW^OC[F.[.P;E7C5W1:3?F^6F
     1254MXVGU&%LVJ&_68O'O]\:Z^[S#;?IRM(^)QUO4`[H'M6\=72Q^G;^FEG7+6_:T
     1255MEG7+:S.\`'U;G;=\[J2T_?@`N<W%8.SD'70[!@R\]6V12O[N\=F#\8X>9,GG
     1256MZ?CY2^#OFGUZ/BK>'Z6';H^*%9?8"DOWC65<M+K_`,6#^T8,;V`MLK1/(@ET
     1257MMT=J0,X*,G?==%Q$^CWP9('=VKL0<_\V+I;\'OPQ_!2^JKT5._4&0X/*6>=0
     1258M<M\FX81Z6]X>09^/L7*JZS'O"953O8IW+2J4=JA+L;1"7SYXOASSYI=C?9N,
     1259M?:SHBON:&50PDSB@<JR.0>\T9(UMK?N*E.7`H1XS"+U94)>-50Y\RS[V1HW+
     1260M\>4MT-Y_BZ[0>]LLA@Y?#S-O:(F^M":-=55!]M"M4T5Y^2R#^J2)?$!]\[I]
     1261MQ=H!56TH;5.H,N0IH)S,%1^["%TRD*O@K6E^&B[Z$FA$=8$7\<YWD!+*Y![N
     1262M**('/\_'**$(\8;3"ZAN@@5>!"ONT(.BQNT-BH&$S^0;R#B7_ZEC4_N,!^C;
     1263MZ/[M3379*=FG\\#U1I9#%(Z/\@J^):;OCQSW)QHA#]MVJ1XD7[88T%8FNY&K
     1264M!HSRT+"MS`%R'#1LGR">(UWYAVT'6Y+6OC$L26M?&&-Q1S"UC+XSV^OX[/D^
     1265M^@:Z\=_KMH[I?)@RY>O^UCMX$R46T*5QNWZ3C@LTA=Y;/1Y=(2USP[.]?D"%
     1266M8:P)'#NM-O;&INN!6+FCH*EK*\/!>E"Z)(U;"\ERH.O:$#E^W!7J.6\[QN8-
     1267M>I?I]Z>5E]"X0>_<OQP+68ZQ/D_^UF#3FBGY!IM'VTV-1\O'JGNP;[SI^W$:
     1268M<@:]9R/F8]D,ZEF]ST+AV+.R0>\"UCZ#[[IA8^L&O8M=.[XBA)QO48YY\\NQ
     1269MOI!`.M)>T[';#?JBG^=M^_1CAKA!_3JT8X;Z$IHVJ.2H"EW?G[;WR_*K4X]Y
     1270M\\NQ*@NEX].7XW%E'WN3\M)Q8BR?Y44KT]O':,=8E9OB\37J,85*4_'`K1R#
     1271MA>;[K!IE+UN0N3*C/<+:N/<6]JQ<VD.][++-JXPR>O''9(CHU3B3%<X`_!W\
     1272M$FA"8-A1L_SIV]M%@WLT@H$E7'U/DXZ'X+=/OF5)QT/PVP>KX'?=EUE3I^,I
     1273M.8S;*X9CZ)8@_>*SKK9LK11/*\:!V[@]30FI)$DQA58>N'H'6Y67$^J[5\>#
     1274M3;1C@@.JS&,U7V,VW';H36HX@"[#R151V\`\K\8PU_M+G%`+;J['\Z[C>=[W
     1275M>UM*E^GDWCG>H6$K!>_Z=&REX&]ON-+6MC5>J67'VS6$L]^^L0=66]]MPN76
     1276MV3Y.W&&^)N?Q:>MMOAO,%:W=7VZ))=N+K,7<GKN64BLG^=*7Q^YS,/O"Y?9V
     1277MUS[0U9H]/VV^O;&463YV8KX_.>Q`7USVQ=?/.SX*N^_`"=,8]'Q%%^?\]W=2
     1278M+KF\"$%W#9#_5KAY0<OES!'?J\@W!9ZCV=[\3:+BW^C&9]'D:-+W+9WY`'^@
     1279MYU^<D\?5\>^+GD'M_KXU[GUU8,Y?_;M_M`?U_OL>5!8<_92I$#H%H:,O,\6;
     1280M5VZNW+[:]P=W7TZH>4X-FJDM'YHV`Q.JE4Z-F@G!HF'T7QKD_NNX\^BBSK/[
     1281M&JL#L_<=:61@\!X=C=L+=Y=2/<9JC>.P>3M=Y+)S-;FXY5>Y?_OS^@'UIBTW
     1282MA;=B.;`(S"N>TSNG-(C\NOOW=J@LT0[U/3WW&4ZHH+R@WG'8CL'%?Y$-ZFII
     1283M^]?SX#6S*##U>)$3ZMN([L]KY_.\_GM;3N45^WN/`^J;CKHY?-=1%ZB[1=98
     1284M^-86$V/@+29F'VW"H86];5$K%N23=K!VG=F"6<:&HLE\.S(FW5E`9+K!M_G'
     1285M.3[O8.UVLX6MW*87<<Y"2%4"'=MHUU3CM@)!Z@WNF`CSO\VA0II-LM?^]EO6
     1286MP@=?5``9]_W:MM_+SFS'K/4^P5;`8VSG;AQ0.=#5SR`GM]ZG/8#>!K2CI<+5
     1287M-E:/RXZ!E:R60`(YR^6.P@&4DUR.MVWWH=ZL,\YCG.]K8&6I[Y0GWS'H=V#>
     1288M@/?CGN]HM6.H-X78]M>:=!P0Y3N?X[!(R5UKGOX"K-1E!]O)3<<LK^!V<A=\
     1289MT9>^@^5@Q-OH._$ZP:9?]VT!/%P;;ZE\*3<.*KC'].4[?!WK^(MY++$V'HB.
     1290M<YJT@Y5\;1'P^P<TM?^VQJ;X]Y,HW>#Q!M_0?Q7#6&YPH9SI!M]ZEHW7"/T"
     1291M;!:#?3=XN.]*:VREG_3]!K<R<M?YW.M\[F9DZ+[[]SE6J\B-<\7B`5:M9VR3
     1292MZ.D9ZX'L`I"&=3MTN/KQ?J24R^W+0S/>?/5XWVG-`:VON?C"MP=I!.(^P>_1
     1293M@5?'L^`*P&\'\1(JTG9J$>1`MQ?GD.$'Z=K!2N@8O%FTVSF[ZLDX5VVC148N
     1294MVK[]PCG>:&#<YC=:%X_G.K!7.?LYNN]@&;VEN5@'O_:J>Z$JYB&<RQL-OM$#
     1295M!]]>-)SCTPTNN1:.OH9SY1W\I*_[>*.CX5BR<>+9;Z/OS&05CE^=4+=DG';R
     1296MF/V16XJ.K;L<+@7SX6BOP=T7L-]67>VG[0697[TG/;%]U9/2R/]U;H-P3I3O
     1297M\)/\7^>!\C?.\WIMKU9^`8\W^,DOKF/3C_.QXS;ZSDZOXPOV%\^\=KB^[)9D
     1298MV@YJ>`.WUV"ED@O.)+GOP)VB"]J>^DB.T>WLN0ZD_IM:/X*53;`5AV\G_]_!
     1299M6\WX=C+Y?;0/X=I7*3NHM4TQZ&KN*6U\]PGZ2VB0WK[GT^+QM,7BQDEJ7".%
     1300M.Y_NY^+'8[0W\;ZBA_LD2O7ZL7`.[+MMC&..LD$]]2D.ZO9</L'2T7B?(TB`
     1301MP4+C5?,H`_L(@]M@,=2WO<'+I>!7;9CV]U;C^_Y`U0_W.51!M$E\0$#;++`X
     1302MR1Q!OYEP5;>IWEA\0DV8V,%*FM)]CA-J)(C!PHFN'7RP>@:[6D3U]6`31NKV
     1303M[AM\/7.+D:HG9]W!6^C4_M!^/M.8Y8*[VDTOP%M^U>WSF'BQKZ))"SN2P\`Z
     1304MSQ;?M&/CP,N%N"58V>`M(*IN!"T9V'TB94!5-V?9P?[U^PG>DJ5TZK#E1-6-
     1305M_>03+%14P3>IY;J_S8GUII-4/8#E-=@[.7?LBD*-!^8;3'CK_FOEH>>D)[2[
     1306M;B,'#>GG*YS@S<U:E9C5'7PGB/W8%]5![6L4A=HKNZXG*WQ.F6(_7OF$*E/L
     1307MM^6-Q]#A^J$<O:K:L5L=^&AAU8[O_@*\>9%OC[R.1WH_<CV8W(M.X?D8W&[0
     1308M&^MKQ_=(QQ3*$-M]Z3;H)F/L[Z%Z5STW5CS`F^_;)@F;F[O>*S,&R839G8RK
     1309MO8<K>MT,>J\6?`,K9UGI-#=O\4I*.CA%VA`QGI"VR?MK<-W!<T6T*%@S\*U`
     1310M[XNIZX'@;A0L&[,UAE@V=7`XL)O<@>_QHG%;DRWQI#S&E22XH9\SMQNXEKH5
     1311M5WN!2#L0V2H.[=O!-/ERNK<7W+^\L=1M_WBP./)WNY[A/G;P(3VLT:U>?9-[
     1312M&#[FFVYR3SAWENFKY84\<)V+<)WC-_WPQ8;>9S'Q81\>=O`I^S!\(Z>B:Y6=
     1313M!PF=+B<Y[=LDFR91#L&BGU,+>2L['XL'V$>CN$FVUK+EY/[M0'L8U+^ZI*S<
     1314MWC$I>$,D*ECJ+VS-9<O)PW?PUD6VG#Q\'^T"7>Z++3%"Y:3BY7S)>(S>NKV^
     1315M^+[[)$:<RH&@!]_XY9XJZ9.(]UY,9Z+CWNC'CSW3%/<V/3Y*]$Q(]`FW^]/.
     1316MA,1;/YU;PN=!=E4UVUM`*"O*)X'=D@.WJD7Y8*MG*PUC%MDSHG%`-XMM/@7Y
     1317M>$S]`JQ,.-[1,[J]CS8"O6'B4@HEQ'(S;>:3!^]@8T3A_N[M'*U,.-P7VTCP
     1318MOB8NI?!5%L8-D7["VPX6#<G7F;TAV([1RC_78!>BK-K-GEVF9-G`FVIP&RV4
     1319MUM+O-E'91F\RL>5W2:Y)._$3VGE#)![@+8[2)MDB)NV)<L[WM,/T$NK+4.3C
     1320MG)=CAA,JIW]/#\QOKQ(!?2V*'6J9?'[=SOP^[RC/![W;H3YA?'_:F=[GZU'L
     1321M*WFF]_EX_?UI9W:?3PW?4Q_MU*<M9=P$I#UF_Q7\G@QU;*-Q3G."MUY3EHA1
     1322M=O!Q5EZ`1;7=,RD<6.96&:&?[W."573HYR/#\<A-QKJMK;7;V5X^'6`5$O9,
     1323M+)4&5BJ6VZN6'>7/RYF$M'>@N9_9<LR;CQE$&M]S;/9>,9[GG]DT>][,G4+D
     1324M`]\S;T9$\'2,/;->]@8LDLFR9Z?<:<R9>7,FI^2W5VDH0F/2L;YG&LJ><'*G
     1325M/'\KW^3^-?<9]G23.^4YDUXL"64[-R[W8CO"8F&+Y\%9X#L]V<%;G-QM;C%E
     1326MQ9T.I`.L-&9OU[*9ZN))P?J)M^4^;`B*R>@V.BMXPR0I6!+4-K-8/(G@#KZG
     1327M5MR)X#YZ<Z[$D\;4<TVLA<Q!&^N)23S`Y0:^4Z1Z(AB.T9M#)_[Y[4]<4]N?
     1328M<*["+<FZ<N)"<Y=<EGOE6?,`E.'^T*+>.("K[/8J\:UEN27G.DH9;KYVH?75
     1329M!7.WOSNT?HS<7\36_\V(^OQ/_YA3:A1'_T%'--9*0>KS[^=7FK]C#D9A\(D\
     1330M>V.@HOO\._0\1WP`&@K%WK^WUBI5=I_2^VCC0T/VW].83Z!*[>6CO(\>\[/.
     1331MB_:1WD.:3W^6>94_XGLHO8YG_ZISV-2B<Z+R[=_S(>_QRB,^!P7[/^;P^/W1
     1332MWD/(O7^5.6F>\[08GNG;RM9_:63]MT;6?_R;M=TC_F=1]MU]F,%1]K*!K.FB
     1333M?>>]U+LEX6?;5-HBA[<"LJ(_M&*[#I<MMW8E*K^O?9IH"VYUX+'Y:&];GHB(
     1334M6A0VO[?V#M<&=AZ4?:S07"IU;I62-K"EN42#6F*)&^D26%PI=I]S[L`NB26=
     1335M@\L.=GDLT0TV@]KKQ[G"[^Q]$"[:]K&R$NU<"5\+WN%63K"\=MTGD1>L.\[%
     1336MBDR@C\;>[SQ()?6]L?P-7"VXRH";ZV^?PH-=OOZKX1H)(L-Y%]0;>-]>!]!<
     1337M?Y1$4+4NK`>_+%Y@3]P\A=NK;^"7A0UL^.98W%'T8)>K]0+JO87ND>4U..U@
     1338MMZ[Y'%QW,&_6O`/=JZ376'BP#XV*KX>[U!B_&QR8\?!E>&]+_0(LG[V?#\SG
     1339M`^4[WL`^5>"V3/4$RX=I^R0^:O26KG(FTWB;I4'%,E6.L4&B[5WRCLNH<Z/5
     1340M3)1//"#+I..1F#R=LPP#RRQJ[[]1$CWOJP2X40%78/M^F!AZ$*,=7.RP;_.Z
     1341M2MI^.WFP$9%\0+=`M7'0H>O^N!-:[=1NV/YNM;3]X32H6X9R#,T[U)#-;JCM
     1342M6H.*4\I'C(T[.1['>AU#?1#9N!/B;613;CRV[#I+VO'O;Y6\C=Q8:>X[T?,C
     1343MRP:[4;;]076'NH]RCDT;]$;N^JL-VX\OE8YG*07LMZ5RP)WN[UE/<JBW_*3V
     1344M"BB$I1W?U$,-5\N%LF6U3"@)N9!=V8ZU.J$^RF#<N,@^4O;?]@*;=VI[UQ.J
     1345M]&C/Q>H;]$9%ZW%:FH/N)+X>BUB/L;(WZ[&TY9A!MF<]EB$?8V5['2^AKK']
     1346M?'GP6H?=8S8.SK%!U<=?[@\<Q_.4FY1CEVK]G?TCA7"`?8ZXGUO<YWN^UD9M
     1347M+1O'DS"#>L*TCY6C;?E._ACOJ5J6%[*MLY@FNB_)Z*`>XZ)0CUH^H,)W]AF$
     1348M[S#4GP2Q/O2]W(:![Y]Z'UQW\)W*U..E^WUB-0"5$PL#^P.I^[/[?IT.Z@48
     1349MW9[]].9M%<R5`I0[=@>PNSU[^Z16[MQ_TJ,(NEJ/\KF:!M[>(QRCVPZ6/$T[
     1350MJQLB?8?>J>$&U1.<C\4?][%"#?.Q`8(TC>OG`4[GTH5CM)[K]'(G[G/H:4]W
     1351M[,8Y5JA.VD[)5F764A<V>=+2(O)K\%;TM1VG-5S')"_`MS0'H3#E!KX1J06^
     1352M-[P=Q^"B4/_J!I7G[8D$=^JW0_=,`O\T@WK;?3IP\#:9=KCD5SC]O7S0#MXL
     1353MU?L7K`KUBUP.J!?\VN;QR,>\7IIKF[<A':AM`4&W%SG!6YQ0\[V9'?0@PNW`
     1354MN1C4^6/R,=8+4+>)K:N!WUBNUX$%+*CENYUT?`=O<4:W!X;[`V\)#J_\>?OJ
     1355MEP/J):.V>76.U_.U=^Y?)!W@+4ZI^7@'ETZA;5(M*G*E)FR=9#6,TMVX)QQ(
     1356M4-)6$_4^D=*?NO>E]6'^6Z]8<W/7LTL>@R5(:K.P55W*N(-E]%9VM-X6PH?,
     1357M;^\;7]RP]-!KGVJO8E%?]\BJ!_5:X'LXEXQV;^O`LIWB'7SC%`O%%0^7=[`_
     1358MG^E\Y":?UI,YG6\IJG_=&(5E`MR/QCAVTCDV[F.=B)N/L66#^D_OQB[RD_:Q
     1359M-WYW)C\X:*LAN-7<W\(+ZO5@Q@SU],N"]OT"-X6^ZOM5#X=R/\Z`0?V:63K"
     1360M/<RO'UO"H)+HZVV0=7.+&]2O3C[>PB>LUT<9PVL\^U!9R)71X-F4"^*_4_?F
     1361M%_B6I7"71]IQ\)I"[QR['1O-H'<^WH[E*<>\>8/>>?Z.V9[D<*<?^[P^>;\>
     1362MTL\^5N2<=JZPL*BZ<?QTAVX!:/44&NHY\PE66:D>7\E:YFR#K6>.Q\-ZYD@`
     1363MY*;2U5/4V<&;2E</46<?K*)..3:<-=0Y6'8^WC`=@S>5[,4.W^;8-+)ZBB_;
     1364MX$W'JGM,`/C6RC'9&KJ#T^U-5,8OX$ZJX!M"$[<N(N45CTWG`U[`'>]=\<>^
     1365M0[V_\4)L21M*R@H7>%'Z^!J\]2>YSZ[N@+(OJ8,KGE9R(;Y8NE<WK.A"?/'L
     1366M<#[;R5%Q>PF5+.+QRB_`FZ/#0NK3#C[$J_AB"ZGP=O^2Z<4-*W<0]JGVJC;[
     1367MHXL#NSWGP(+_YJDIIWBU@S>->W]D.A^Y:=S[5M.8XWV!BX$][R[GZ$UMWY,6
     1368M7+,F+S2),%8.ICZV!WKQJ!QB]#CF%=&D;*)4/:#>CWEF(/1CWA,J>ZT?F(GA
     1369M?Q_;#.IPJ`J56$)OQBR'H+E#O7&S',+C/E:V13O65^SQ9VY$/=ZM'F-%@J@O
     1370MO^8^@\@*]<`L'V/EB->3=BFUSCM15MJ87Y&N/6S94:C]QIYBF+<CF\\'#*4A
     1371MG".Q$_WTXH;QE;BCNI?VR2\X6GSQ;BXAQ!/-<H*5C,3MQ91>Q.-]/99^>7S/
     1372MIPT9U_5I?]]D-R2FT;&;<+[O"[CC-N'%6H<7O]A3"?<5<@DBGG^4$[SI^/ED
     1373M0N?<+\#*I<.+?:C$\[X=DKMQL._KQ?+$%S>N^XV3:UTOUBV\^,6]*Y??+2ZA
     1374MQ;^TSVAQ"UH,+&EUF]$AGS+`#M[,"/F4`?;1FV$@'^QO'%^V&/3&M,>!1CZ@
     1375M:8?>&.(X4$O'6*^4YZU(IU*SM-6`T3-LX"VR;!_MVN1(39TMB,Q&;U%A:</$
     1376MM:/QC\PG>(OHLDFV$*VT%9@!>-4^=[5KDM#^N)7+>0'6I=K!BF`Z)GD!5KP9
     1377M+$M5=_"QWB=8Z7'<WM*!96Y1LV7T_:/MX.&__/[(=#ZR^PVQ+ZR2P_WERPD>
     1378M?OO8).'R^V=_S;R^P[;<9:W4^8H`WC^Z!Q:WT-N<DJVX?:ER!S:WEN>GCK<Y
     1379M#V!UJ[BA)*F(VTA9V.WILJQ2%*N[-3WWI`<.M\KG?O0C?2C7^:FOVZL7!=ZW
     1380MYW5[>KX#ZP8\ML-UPRG=A_IX+PN=#Y=%:(?PEQ^?'Y__Z>/SGS]_?OS)#7*E
     1381MZT/ZRX__ZU_^^M<?_VJW\W_\\:__\M_^SQ__^H\_XF]_>O[V]=OW;S]_^W]^
     1382M^W]_^_CM\\^__>?_84.+FZG^Y<=?_^7C\\=?[7;[CS_^QW__ZQ<"Q6_247_<
     1383MN#X!-GXO(Y0R$F!C23)"&(Q,D=VU9Q1T[5D$7=_R/O;@)+EV>1='QL4>RB,#
     1384M^NV^ZU7A9:_BAUSW(?T^0@Q1BD9R`!-9%*(B2?:SA/LLUWV6<9^DW^:`DO&P
     1385M(U@>=LC*PPY'?KA-G1^699P>5A<FR:`L%U+MA:+X]_;5Y2&=T]*ZT@03\'S9
     1386M`(RJ2SAXN`23X/(8PO@[$TR"Y99P#X9"226)\B^0+`)`0C^&QY/NQ\>7):&,
     1387M+[1#>%;^]ZM^],?SNUK?!TT7^7Z1P_$J7P.9&I:K$1TEB.$OZPAJ*OOJ(7"K
     1388MR`Q(V*JNZB!-E^=!6QE3'61Z@TTU=M!6M9-!6VE.@)+?E@;1(.#P<%;_M(U!
     1389M:I%`U!(=MS'(&7&S1+L6Z[!<BUG87UL\X3T,[QYJ9RF&95W+R2CNOI4.M^S\
     1390M[,97=^T;H8V'5Q4YJ\9K1TD@JA:E;8PE(XHFE#P$8^K*\))9BEVG]1RYSK:T
     1391MZ>%$"R%ARNWE>"JGSVZ$;L;XN-7*DQ&NM9:K?1#=3YH';-7IXJ(H8N9?+3&5
     1392MLD@F_,HT6G\SC<%K.9(L=(GG5>H2'7N-?V]G&*,N1C2^RJ0E>=(*:II">5^4
     1393MEL8=7)[Q.T\2-RG.U_='-"H2O\(U"<QX/*EMR[P;`E+&)@0DJEDC&9`4(37?
     1394M2FH^K!'+D2"6?LOS?T5?UC5AB:L)B[3*+&N%?6V3^2J\OD+ZU\91^OY8V5W*
     1395M!526UZ.LHK8>YOQV)R2J3.L!SQM$+(W#3U,]8,M<$2J0/4#ET^3.L>XZ?_`5
     1396ML-7A\$=;`5M]#)FC><!6_6((Q2T>HJ7:A2%VN7!5"/S)"@]?<?GA&YD_G,LO
     1397M7(^M#O##E_]X6"ZX7G!^LB.QN(C^PFH+>!X@2S'6W]G]+11CN//GTD?CWYL^
     1398M:N?OPY@V=5?*?.CR-['Y3*F7\SPA!W3^_R/YQDUTRKX_YJH]"QVZ_(*ENU/7
     1399ME.EW.O3WLQ9QVL*E;^9DF#@\?\<70"I/W;AR%9!QY;J-"D*L>9364RO;*#4/
     1400MV%SF.K1?FM>08;JC#%06?P$O#45!VI0'H"JCZCY*LXT`:C*J[*,TR\CFZANH
     1401MR1,-U&4N`UDZ/JA/].QN49NHSXP[3-WO3'&B(A)WF/K'QSY=WD#J&#>0.L7'
     1402M.7]4*F>_#$JU[*<.IB[OT!5F!>?[/J[H9K/Y\@Y3]<?!;"<I3,DAAX<XZM<6
     1403M0*E?<R-T'\L&;1Y@Y96*FV1X@`K``C#YER'K-E<H<,<K/KX]AG3/#MI&;*O<
     1404MUA/&OS7,9/CP@.0Q8\%%B"H'_PG;X;]%T\U+:.$LK[*8ZG+R/53Z=#PJ>A-"
     1405M<HI#"O]^Y8ARTO-')2+8Z)\ZB65[4,+[I)N%M:`DA+5\%2.WY2ND[P#I97R'
     1406M\A'2@P6:\1$RQGZ'_#'Y"TDU#6I7L#Q^1UJ+4O%=B[H1V002V_3EG1R7DHDS
     1407M6<7")0`NP5#^IF_[)<++4F%OA>X=61X+H$1Y^!$6A^P(<O<C+,#7$^/F?^,"
     1408M>!TA7@"G7K`T+)5:ZL-</DGO2@V5ZF2KJ'<'%J#:WG<CFUXM\6I=%??>HL]K
     1409MH'5Q4D7W`ZS0X9YCI@.L`.$M]E=^H0%*8J_0`H+N+#B)-I4_PE!0OSMO^'DH
     1410M'DZTX.(2STR[&*8"DNJM#>37ORD[_%I.9\-`^:WJFS@!*35L[+V[6'%"L:R0
     1411M3_$OCC@5M^CU=EW<M6^F)?-U=RW*87;?K-[NU]O]\N+WR7WB\K:;B63SRN^;
     1412MN_;E?;P%BZ^]8\J"($QUZ>N.K*`HC=E=QQ?72:]MM;,>RNIF*F^;:KI=^X(*
     1413M9@+;Q]_OI]O\5MC-YI=K,?W+M7":XGYOI=KN1=J,C&0W7W'7Z78M5L7LGN>O
     1414M76$0G=_*FMG*]C=5*#7P--V^1'J84;FY^[*^Z;:>R;V_7(L)$M=&/)R$GOX`
     1415M*R,U:&6Z\)S$PDC'U#T(_L)T^/5+6O$W38?920!938<^MH0-ZQ+)NQ.#^C>V
     1416MOO\@?@%7G`]8I8I?D$A5()/4;-,PV@81]JF*CUH5VS9&R?ZNY-3M9WV#>%(8
     1417MF-$%5]8$UZ[CZ])IBX.\>1U#K9#%0=Z68I*V.=K;W;I9W^X6T.(A6\#:<$=%
     1418MS0%;1M=PWVJ\F=$ANNL]A_V>J+[7I1$;1737BN3J8KC4FNHA65YM-2E</+QX
     1419M2-C,AUTTD.U7619M]1=<K+]X2-B,C%VTENHA63Z'NJI4,56(ZJ4*:?JLZ)\U
     1420M-LAFK]2G;S.'S6+91=(3*[**?L(^3?1K'J)FX.Q_)"F+-J0=D.(AVKXHN6FB
     1421MV-3MV<-#@N`7MVG:,:9ZB!B4;V-8<K19JEW+.9)KT;7IVL2X["3Y_.^WR#[[
     1422M-_MVR(#*1B"J_(4"886NEP#'8\0<RP:DJ:E,G>7Q#(G^G(0;:LP@'2>4K^\^
     1423M_XG?4Z6A`3#V-BH%]C?=0CMMM\;9)Y4G!:?^UG4IG'2;RY(#BU9V\,XUD0JK
     1424M-DN0NQ9N*&4UJKLK4H-(7-X4+(1&KKOJJR(?"D_]E<P1WW:9Q,L(0N>\#&&%
     1425M6`V[Y,8G=RW8I=OSO0P@;Y?<6A1WWXIIVOS9W;="ET9FDQOOC>+-X>=E&"[A
     1426M:#)+?S/C07;7(H.)6]LG:\I]87+R^^JN??)C=.NWKM_4*^:EUUV64O6R+.W8
     1427MV2+>5!MPN&0=5_7*K:L^J>G,7FDUA;6X68HHJBJ8]/6W%AQV7R<;#7%*4_[W
     1428M6Y6M'N&W*7EL3)[_MV*!H"R3C/Q/.H&7&4,1=2)H'DZ2NPL`GN%75QQG3^4:
     1429M>L;[VRX\>&]H<M<^(6GH&9>KS?0FK$6-Q,I:NH?LH<;*)+J'[,&_QJ*N#;3U
     1430M"U'NXCIV^IJ^OI*O;+NR[E@MWEW520]?(U<VHS_`[6WS>FT$P;PSLB%7Y+5(
     1431M(Y=<.>/TP_E0S,?#1FKY790K-8NH_75Y@UY&7:Q/[<AAW/RC2UE64CE9&T&,
     1432M"Q>G5I0_P+`8)>HB?7'0!3'B0D[.;YA1V"7JN&_[&I/3SN\ZJ,#F8_Z</#3/
     1433MXKTVO]2=7O!2?1DG7I2T^.A6,4],T99<NO<$EOM>I_)=?^6^Y1?>,POO>8)K
     1434MRT<'V%0!S^(4X%6!?$/9\TBY]J_@MT%_V^T&_3:?7/M7]':(]K;;"9I[OK_V
     1435M2^"?U]S\Z3;>7V]+Y`T1X;IQ0>&R/L]9[HL>&F\KX$WXGNLV=^W?.-[>,"JA
     1436M@0O5<%-N-SR&CO@,CZD2GN[Q=;_L'F_ECLUC[SAE\V_A9FS^;1P';?ZMC!8X
     1437MT;/\^PVKW\9-*32"3"1ZI)D8)`MT^*7@_,KEJMZ`XOA_:7]Q(8T:`:T><=4!
     1438M]</E#;)E4JA_/&^0+3E`YZD;9$L)`&0/;O#S5`]PE1KW,O4*L.`K^<WP`-D!
     1439M>?N-J]%X#\_:@@62_]6X_ZA[@#?KVH,TQDN&6(R7CEDQ7C[Z8/M%L&L?XW6!
     1440M^8GE5ZR]:;%SB2G*'*+B69]C=$[J*O]^PY\+`)K<JGXCYL<X5F%-LZ#Z-#@@
     1441MQQ\2!Q3-\7\JYN"N+YXQ!]5Q\!HVA=&K0:)V)14F\]NN)#FEYFU7@43[]RI3
     1442MM-&_1W?-PJ2_JUM?`L$\K?8597ULF=!JW\C1!Y+Y0&!/JWU;0XV<]2J5MW(*
     1443M\?>!Q+Z[0WSL*JW<%Q72JVP^6LX'`'N5US,O'TP7W;6:X0+$-HWZYTLUMUWJ
     1444M*RYVJ7$W^M.F5[*P?-7M,SS,V]=QY=H?Z^FI3IJJ?X"Q1D^/>=/@?E/W6H$L
     1445M26+C0^WJOZB8_NLZZ4X<K(ZW56=6T<WDW5'>1>G=;;).WEC2WG;SR-W=IC3;
     1446M>TVSF\#[VR28POOC_/7=W^8IL_?/)7=?3(!_C[_-2T;)/<_[6-K;;G^1!4IN
     1447M?F]_T05);D6]0<9K;C[PUOLH5F;.K6"/G,?T=I,6/<61`^IM-/%MEQX]!?()
     1448MUM[&(M>^#*0/;_?29KS=]P3)^[F\S>A.D.KM!;W-QQ,PR]]P#U,.G.1"4S3<
     1449ME%Y<[6[IQ/J>G6"*5S3ZX`2Q^@<88C2$[[%9:N&/_\I_4S-T7/07`?FN>4)U
     1450M4D%=MAA?]-"".?G:R4HFE2<WM+GK(%VED_PVK+,E.3+#78O=11T.P1U&_)J%
     1451M)7[NDI1DHB4HR3Q#K])V)98;_XAFE^O;ZT,T,4T"AD-44Z"FC8FWW3&L9)<^
     1452M>4@-DHM=;=E6>UK1XY9@M6?#NE/CIC)^YFH3.J+8-Y;9=63>.-\ZNAK897'H
     1453M4?]B$D!_BZ2S\W@A&2YHI3DIK?W[[2Q?KQAH(1M+8><%65ZHE0D%9V7R?,`-
     1454M\A4_G,Z5V?#RU;[KX]GFGU_#":3_IDG3':/FQ(/FC2VB9@LM%Z_NDA0W9B+'
     1455MI[KQFGZEZ4B>G6P5467*C;^HJ7++P_`<92M8KS\9'N!KU&O.A;<2RIO8GEI.
     1456M;W>L^4I?H>G6E!@HCSY?*J[5!B]15`8'O6S[I:^%ZV<N-G.WRV@+*P^2#"UO
     1457MILW[U-GF&G89W[S70/WTV:9>'A1!.NFEFHC3[<')7F+I'@\7:1?=Z&#7&F47
     1458MG2#;G!S8_H#@L7DTXHNSB(B0+_"P]()'[=J>$V5?:GO5#![-\=G6?!2(E0?S
     1459M=F#OXI,P)G7/O7EGF-B1X_X+COY0,Y<F.*G=0U(K@MH]DA^C/G1`MD1Q':.)
     1460M9SK/EH$1O$K$$*\5J=-BBZC<\D%W9T/U0ZR4I]\QFT=?M#F;)7K(ELYI_O!+
     1461M(;[$GZ]GY]QSN-/<%_1"H`0[6VY4LRN5U^3:.?`LV!J,4P1$"P??TEB3AUC4
     1462MQ)'9JA"-[M<\L*Z_2OY7V4."E9,1D,7`J]TGOUF&21#15,-&NL=Y"_MH'O<F
     1463MP_*ZT'=P80C-28#MWV\7\M&C"*1&>'1A5@P(K$+L4X05E+)6$&1JQ*-]AX3T
     1464ML,F0&[+*F%-3I['Z^/JHOT@0,YY]VDTIV%23PKJ31KH&D]D11@17DM.(;]P4
     1465MI(>X;:,TQ)]!>D3K-DH]BS97VT$:/V0@-7,LT%-QC$OR8EQ@G'=72V*LZ][O
     1466MW*=,KI>T6?27OR=_;5*N0C@'SO_")=1$E<N7X5GF,,>HC-ES5JR@;71C]AR6
     1467MO<*0_2QL()<[)B"U?]U2B<T:KOF_>QZ?*B^WE.`]D\_2,JYMKCV[+VS5UABT
     1468M*>[JZQ3*J@`Q3`(@KJWD1XAQ4M.=MUSCIB*\SI#M<@G\V]NXM&.OF@M?%4XJ
     1469MSKL[WQ7;87V8[:^X^\)Q?41F=N.3N_8K4E4CD2>*<T>HO3AU)$#E'@!NSC@U
     1470MQJBPA"]K1+$[>;[_D=FRSSQ)(`*T"OX@JSAESC8BCHG5%\K6A]&<<O2=%SA_
     1471MA4QQ6A@[OL-%@P>EGGQ,HAB0SC+)96%#^PO7TMTR\+=L[)"[=`F<T-@EAW93
     1472M07<S"J[#=G5&=/C*O3S:!7"^[?$=ODBO]R,V_:W/?O^WXC_B[7J/!]DRYYT8
     1473M(K_,[MH;TWTJK(20BF+DC2G-78NJM%E,O`E%]19O)?%6$U7P-K-)<P#?(<6[
     1474M)+P:NH<]VY$2!=''D(F-U.N</J9,/!:;"JI!9O,4;V'\;Q(,)UX3B\PV[[<I
     1475M.<6W9.U.&>A_@-%M'DE$;'!".R?3HI,JA6\`]NT3P;X[6116'MD7_S=^MS\N
     1476MY+T[T:QKH)0)M!I#;A*MQH>;2%NW429&:.YLVD`FU>9MKK*!3*Z])=VF#:9,
     1477M#JANP0Q5(.IEKGZ,24`^!L0@JEME/T_=("JH*40M;@J1W:M2FCC45/H:[CSH
     1478M"'4SZPXO'B+G/OE)F@=LMM&@9I;B(;XZE8KY6VDB7QA*1VREB;8.?#+"ER;R
     1479M/4_D![XTD>]?MVS?;[N'1SBTA>)Z=XT(,!:*ZWFS""]>3_?.F.BNS;.JF=1F
     1480MR%0E>=F97,R*E[.78<G50Y&[SAKDO#8RN-JEJY6B(6DBE#5=`DE';"IA67Z8
     1481M=SN?N3\LVRZ'Z!;T)B/E;V'`"61TN8?HV4L-8)'XZ_$TDCF<XC/^@'`WK^VE
     1482M[\3%AC(+,U*"X(L`\R^*17<A,!PA1YK?5\-]CH\CW9!LN!0G]TS((DJ6,?L,
     1483M\2O0T`!U,D3DWV::B32:/,?2OU.#)"&+"/DO8U1-^L%?@^2C7SA137$<3C`<
     1484M:2/)0>F<&@>BDK6MS)6!C):KCG4K>K`;+/(V5]I`MSH(9FL(&TS52Q'J9;=O
     1485MZ>G5`S0[Q*>K5P_0&AM><N\>H&GR`M`B(1X07%\3MQ02C6@VK.&'^(!$LV'Y
     1486MD$77RL';L-KVH^`AJK@ZW>=M=XIZIV71$.)7+LJJ*0@^8L)'6/A";%YKBDHU
     1487MB_OU4&KD'<J/S9TL-\V<+!\IV4TO6&W&8XW7C6JG7E+GI$B6?^KS-65CQ=OU
     1488MGH]XAA7'?2PH7M1(ID7O2#S$U=?Z-=$\3]><AC+^`+.VIVL@9"!G"=2,+J>F
     1489M982L3A5NU4VKWZN8``Q?%>6,B%"Q'6Q2*<K!^7#*6;B(GB4NR$)_1M;JEL6L
     1490M3^KW*OK#)58;,?LE"4/(E"Z/DYI'<\K<VS*2Y+=/5;*L;O0"%FM:[L>I5"+`
     1491M:FV&_3B53=Q\%J[@?NQB@!>P68(`@WP1K@GH#U]B"P`-58UNC%K;UY@]\%%&
     1492M:5T$FZG?0'LTI`"W@,C[(^J"^=R6XF":#W(;IY4.%TPS06[C1)?T\_4;3&R5
     1493M'E;\>208U#0-<WO[*>'U["+A:_Z<\V^N+?'3D[ZEZLE)GKO^\20<'\&=6:?>
     1494MC#\@%=G.++Q/=$[G8UWMC>_\,W.=@Y]<,(G+>^3OGW/T3XM*Y/2V3QAIVB>*
     1495MA$0]@Q]Z!C]_<09/V_/]#);+Q+!R!1^WRTR=^ZG/#V%9MZ9&*5R+X]W@FNG+
     1496M@H;"+>VBGN--X=KG+R?<:@?M\+)+,P(GJ*:)\F$FD":*KO.MN9AY'Z>YH6M<
     1497MDG%I&V?)GWZ^<0,F>;(':H*N!T(F4`%.#K(6`0W%0S=3^396Q3:%:D1(OH\U
     1498MSY&?-Q]0#079H$JN/703W?!%#G%-H9O,MHUU%GP!BX:[0RUY)]YG=A9^/\<X
     1499MH)I_M4'-T#ZQFS#-E!`D!*8E0-,^3AXD,"7><1^G_@,_X;C!-"?+P=0B83`1
     1500MK2>_<M\BX4HB^Y+>X[WZZ83EJ/<0WR0_&^OO]0WP]S(PO'VJ@8V/QT^OID_$
     1501M?B)Z7.QS?5Z3.VF*N&\_'YY'_;R+L0190N[/32OUKB)P`A]F3-?KOAKS'`\H
     1502M5W2$\(\TM'][/9.T4&1&P[C'1CWX'V%FGR*=<(E)_'^:K6YJDS^7N3W_C%0+
     1503M-TX!+W.92PA\4^_\21IJ^WZ(4W)G#"&0T?XC7)^4/ETIO;K057E\(:6:V4PH
     1504M7Q_MLT,"I$)2GU1T2FR-0UE;N'X=C'3/LBQ7=BNK-GL]<FR0(PHM5K!@]?@4
     1505MKJF/]1QN.JK"[:"5<[RIIMOT3CW=YW&N1;NAA]'#58+\)`^ZF+-P(8Z$(??8
     1506M8O1I,:#)`&)`TE\6=^EL-)][.*D"E,SE76RU'!0!;CV=MY%B\!*@:L7Q/I*E
     1507MK&W&N(%D=1U(%];#C)VSU]`S%&L08W"M_W>#6[V,:X-;Z;[K'&\E3K?IZP'6
     1508MX(<=K+:1#6P1%6Q,G6#Q#KHW%;!98>(QVMY?P&9Z"<=H>_MM[G*`^[XF`MX[
     1509MPB@X.+W^=XT;V*/VG';OADC`K881#`\HMFETCK5C]`=KM^!Z40\5[M6S.MF(
     1510MO*S&!8*U[+"V*PEL&@"KD<.5E/EH=39<E657!NO9&(\R(#`;^F_@OQCN6$UU
     1511M!/$/\!816R$.L,JB/?F*U`[C0C^-"S7*@OI)W(3_XDCNJ9)49`*BC/(D^^W[
     1512M`SG#'VQT<-&JE0H/]H^0/XGD3<;246@P$-\(U]?XKA\A$3=I5';P$UE9`9[D
     1513M.IG/W\X@,4[SRUC7N#&7[M9R\TRIO\73*M73/;4J=^!6<L83L7('JJ0:;G.V
     1514M.U"MC!YH`2#A-FGVV%LI2X>H'-Y\!VZEE;,[S_D.;'=$9<YZ!XX[GAJ"EU]"
     1515MC72D#2ST4:%:GGT<8R563Z&JE?9CK,3R[?.6.U3UUPVJVNLQ=EMPE;>WQ56)
     1516MNQS0>%_>+,RF'%"5XZ_[O.V`JG]Q@ZJ/T4.-_<3U;AKFIQ].H,9\PGUL\5]S
     1517MM_I?]['5?<PM@''<?Y]OP''?"S#^+%I<)L461ZXXN9PY"!2\+$H?U[50?I_Y
     1518M5Q?EU^(X8C;BV"`Q%8D[:[FX5*DPQY9@0G\9;7<=9DKX0ZHX)-832&5@)];R
     1519M;DT4DAF:J-I#!2F?Q#;_3(AJI*$_D>[ZDZW"W_%GHD"!^)-JY95O7]IA?.=/
     1520MBMB92@+1;@IP_/B,9`&."$'X+,H!/O_-9%FS07V8QO"KJMW5Q547UWVG!/5K
     1521MJ3(]EF%D;Y;1-ZB<NWZ,U<*N"M7\_&.L12AO$X\#*J;-'2K&S1VJ=@(XTCT7
     1522MT#8@"MTZ@6QCS3FEX(U^[(/%;[5-K+ZK;89Q!\J[>:`O>B74TI>Z\G)HO,%\
     1523MT2LOF,8;3(A9OLV7;S`)*?*P[DX[PS1EZE-KE4)`+Q9K&M:]1>D^5YZ14^C*
     1524M0])VY8?%KE1LE&M1R>1:>65;*ZG:I<1\*%",=?4^4H1<!4:WFMM(C>SR<]8[
     1525M,+I%5F!Z\T:9"=PZ@J1%A<7$%Q<%74M@5R9!+PK\!>H<'^)ZD_#.N"CN"A98
     1526M%'7.Y8TSP9D0PA_@5)OD5$N%BL6%.X@0I63R.JDH!6%1H/A/#.3+]"W$%?_U
     1527M%+12Q>WKHW\B\RM^A_#1B)3"O#*5P2D"DSWEJWR^"(G\59FZSU\03;7@!Z=-
     1528MA.;-*[*)U"S@F^LH<+A-M(V4_:)`W</Y/M0;P772>@?J=M^ALM\WJ-(S1/!X
     1529MZ!"93*&:N9+N8\W4JV`-?8_'8.NU[6>V,.YMCG%`M7#F!M6P)Q0)?S-[LTIE
     1530M`M3&E?$V4B4U`4IT]`[U'?>V2?,=J(&0.U3]#-=MUBW"XM^.G]@L\OJ\ZB&;
     1531MP?VPM>]F=H5H.'L42<W)@GD9E,55F)=LR+*<RGE+X_^Y)6SS5A#MG\N5D/':
     1532M='H-9:(07Q?Y65ROM/)']$J+7^S7U_BDA!2VJ:\7T!Z$)GU%_`LQ+FN/HTFP
     1533MHB=&'9;>#'V<#,-3G*M$C*8HJ&KX_V2W%1/F?D&,-"ZIN,9J)6X.10O^FUO+
     1534M1Y`-!Q/Q?MS&242VP(0!]=LX4?G\?/D&$Z./AWFA9L%,=M)+?J(]+00#F!)I
     1535M3UZ1/'J?*;+[?7(`+=U3'9XK<^X3'%-%.7+'N'`C>&<,';TO+\G>FV@(Z0@M
     1536M9R`S)`_X/1I*`DJ&%$!;,H3XZ/W7%9@O^<)1$#]5_,K+N,:!&3^=2+`$@C>+
     1537MN@E;'&%Q[<3*']!.[-N?.K!YV-*^V(>OQ^NGN>BG3L9ZU_SKY_J7C684-QA%
     1538M2:NJ-A%[GR,ZE*MO_%=**QP>_.??TIZLRUC5%7""DO884SN/MYML.>%.<FXW
     1539MV)8K[JQ![0;;<\3=A.,&$TKO84KL7PT$S2CK3(@?:#B8:E7C-E"C[W2D5QBW
     1540MD=HPP\^I87?;[\<=&-U2"E#=W;Z`KG*\[#Z``LR_'=ZL(%_W`/-J^R*%I@YF
     1541MM^8*V-8QN_.J!I2WW:3B:6Z$I]:;REFM$L.XLE^*QEO&[N?CVPOOKN%8^0,:
     1542MCL&\38?$">YDM4@_J;1=0F#-5X*0_K7:AI`T[WDC,BGBE,6_8>DHKM+1EL7Y
     1543M\4(>]V?S5<._\EO[;>CK.ND@:E$3"V*@K1Z4LJN-+B27TABW<2KUR3@GYX9M
     1544MY&:="XZ!;4`G^6[@M.TK!9M%<C$15FY5`J\>NN6B;F.MCY-`M_33;:QY7[>)
     1545MQP%5^7N#:E"QAZH=F(.1/4?6O`>!:M7U=(R5(%.%J@,S'F.YN,L^:]UAXN;T
     1546M,'%QOGQ*$'(9W:_Y305J+M)\'UO]+MS-PND^MOF=J//6.]2,Q1YJ4>/'#.JZ
     1547MUW=5Y[Q047/+ZQCUIXI;SW)]T_;.OE2>,X,_G(M;(19*`,A2+_C#F^E9["5%
     1548M*><-XB,B9<S;9FI6BT]T:@@T<*_2/."I?YCH;&G3%ML2=V7$]28K?T!O,I.%
     1549M0$%AA8[L:'S"V3C%(B.J9<)_(FVT?H$,DQ$$`$K$^`F1B$H04U[;3V2H_?3Q
     1550MQVAFECZ13#$^/HF&-0I2R3!"MTG(P_6)#`M$KKR@T7LRQ=??H--AM7Q2H[/K
     1551M95:TEYGR0%\&0FQ[>?VM!:T?%E8L:F=[TUP8-H8\7)U]]]W77ELNYB_7;:ZX
     1552M#EOEC^BP]?W3<4VK<_#]"P;XZS(&-R.4ZYE54MNR42Q=!%Q$:VFK;\W@?2-`
     1553MM_%*;`P^MH-^&Z^>M]O\]80/Q6>'F\_R?L,"9+GMYILSHKN`5(5;@&PYQUMF
     1554MH,(M0#:?XY5PW^8O)SSO*ZKPG8S>QHNSCIR(>SQ-]U#M0=./L:)$*%090SO&
     1555MBNMDG[?=H5N?4X7J3O)0^\R(7O:.[:"R2_"N[5`/<!?<+.)L=S?O<`S?`\ZV
     1556M1C0[.&@[FAM<F[[L<%]R^,T<#!+-M4"^I+`?M33S!?+U@/TH1''YF:(#6$G@
     1557M!;":P$ZDJML&%^;5MFWL">(.59-O\E!U=J?[6`O8]?/V`ZIBZ`;54D8&79%$
     1558MKA`G&#^K2GUY.5S")AAXT;>T`->U>9=`((J>A;.*)ZNY&"+Q,2=E\^EAT47B
     1559M=5:/\]M3!`#'+)RV\0=T5/OR[#\A:1(11LO[_/R:?\`KK86WLO*4LBHOUY^5
     1560MR^W4[_:S2&92^[DB5[\+Y(2(PG?S?D>&P\]B#*BMZ-20R7A).4J9PXLR%>$)
     1561M%](M*?"($I7"U/80T!K0`35_?\97,4:;A>731;2^M+!PWJ6J=*[[6['N;V+0
     1562M%X%<@TV]PU(C3=,=**;[Y(%JI4_WH:)W;).6.U#=-3M4\@8VJ/7/:*)I6!T;
     1563MESPJ<!/>ZSG>I9$*W`3Y<HYW":7;_.F$:^6]&]R4@!V>+%4K2$R,-S$K,&M7
     1564MEVV<1!LIT/H_;>/$Q.SG4QNS_[$:F8,+T;F#M@"P97[>`\`$N`6`^9%*V@2X
     1565M!8#YD5;AS<U9[\`M`$R`>P`80[=]<4'7DT]6#/2][P<=9Y]\C7/VB;R--*'&
     1566MS9CN0+-@[V`KV;2!+?E%JAJ;TTFJ&.\EE'2,!*=$$<=\I>/-[JB3^,X8X5[L
     1567M6./$`-`\!W'?EA7HZL-5TV)!SL*N40OF(OM>I0]^*LL4RE-6*)0KQ0U;_-(X
     1568MV?(NRV=LQ[6/*W]$^SAC.V`UK&>^M+VC?EMB%M,HG`F.=[($HL\<]%$DO_ZD
     1569M^D;+-CCUUY^61+?27C,2(R)SF,"V^82:;^T3^;+]@X)=42EI\AMTTZG?(?R;
     1570M:;"OK?9;"I[K,U>RVNQ]D]CNR9\6Y?&TK]Z!8G^.'NAYQS9RU27V,_8=M%P#
     1571M'K3\O@82.M;>.'-5RV.]K<35[=H8YKJ_Q)[B1OA@@^Z]1?XW&NPCL*2E/SPF
     1572MXE&4<*"NUV)SZ6Z$]QDV]YSFQOC(G:;5E^OM5^D&$_;C81*4P"?;8%JA_LW"
     1573MHOH-MC42$:!E>-T&2AB^GU&S.OROQPW6W(82F/I8*I/_AW.F%`69*Z7LP^2[
     1574MK6$:EI;W82("^=GB#M.J"0ZVM5,9RU$I/%U(J`_5X@"-G\HV7'S38W=_Q,W]
     1575MX?M1*.E];#7FM@1D*XD"=Z8CI,Z(\D?TT&,/)N>5Q<U;DKY_<A^420I9/I>A
     1576M\2?*G'P\X,K\-A.1BUE",<U/JA,PYB\&3=2^OB&@?U&,4Z52`?&S*9']VT$%
     1577MCF"2%'[&&(@,;G7@BNO<5[1SWYMY*I>AWV\\;_L?.TQVCW<1)'?\W#!M$.)F
     1578MTYWG?ZM;3X!RGN\PM73<Z(`(C,U=>YJPIW7:?<OF>E@9#N^%[.[:Y\1D-7FK
     1579M&Y!WM/Z]ZJ/QR1"CI>U?U\&N_"$=["C4#MQW[=6T]:N+4]4C/]X+*Z:9AW\5
     1580M5G?7]>*]FT]Q;>M*49OP4L3%)1T\10_#0U<=BW$?J6GU"EV5+/I]I";:^SE_
     1581M3P=4U(H=6JT`J\+,7K:*L=&-JC?,?F,WK.1:>?$+L^W8#;.FYA>_,`O/[1GM
     1582MQ0VSS>TWHB:(W&_(#\S@[#UPOZ<-+$ZX&S@*GG$#JQ4TGJ-9@+K-W&]`,8UN
     1583M0'&D;4`-Q5/I3\/2A5,95+,5CK&B_!O4U3"\C2TFR?D*L\>OTPUF%<X5MB79
     1584M;D#1SP1HE:+2;:2HJOH<9?L>:ILSW";--Z#+2O+0H+-ZJ%E#\*GSF_,[FP?>
     1585MX&8-">=X2Z)4^![&<1NO*:3[].D`JRUD!ZLI9`.;OU/[V%F^3Q;0+3U:1SEE
     1586M^_[5W"BK9'S=/Z/[8=I`^W?]??67\]V*2"23MC=6D<9@O$F;2_R46!Q)!A6_
     1587MG*0$,>>UF=BL9@P08MYCKW2W5;=[VPRSOR>M+)"V6+6G3PQR+1W+']#2T46'
     1588MF@LV?>7OAZ0,<96!])4>*T&4ZT?!B)N0(6H27:<R=3]1X+PA/:@3QZU?Y6<G
     1589M3?=G8X6Z3JEQZL`_YX)IUW7HT!E6VO(1RF=@,VW_1D4\\N<&F&C)H4LU"*[O
     1590M2J+C5ZB3JW^&QM#`O6:IN/JGTZK__]3'"[N$Z!I2%FM(&<SP4W>*F_8#8C>,
     1591M&)07O[#S8S>,'.07O[CY-]-.*-*+J>*+&T9"_`WG0%DF4.<F$:/HFW.2Z"B+
     1592M(%+;J2\MX@8JW7+S6:30]NMQ0-5#LT'-R(9"?V^N$HWZR!2Z.9JVL5;F3Z";
     1593MHVD;JUD$V[S]@&J\TP;=G%("]66ED4_DNPIW#_1%I+>1:D86H"\(O8W42K%^
     1594MSGP'2GK4!I2,A`VHYD;A&OXUNX/Y%KY^G)@,!>9;]?IQX@GS\[4;S!?L$YCW
     1595MNPE,]Y@6]36MWXKX6L19W8>YNB&"W=A!9CW.VVSN=.M/?940>3%7($3Y6G:<
     1596MB94K5[#^S<P2PK7$<BN*I:^HPRJ<_"HMO@:17].VDMJW]FHXPK>@T8A=U_$K
     1597MIV'_`5U:F1UQ[NK\\[$BB@@(*Z^I=45JW62PI,RU5'^N%N;T1Z%L!OHO$EWG
     1598MOS^K2V/EGATAK!`B9D2(/6J4D97)69A0L"!^$H_+9/<E]O/IFGF\""_ZE0/Q
     1599M559KW'F1:PQ;:O"]@LQ7UC>%0+T_"K80MGR,5D5(P2;;I6.TNH;VN<L!WN/V
     1600M%&R2_`9.R[Z[A&BSCBU`7M9==Y_M:0L@A37<?=[^]ONE_-@/EMZS`'5Y-MQ]
     1601M92H2X;+%F0IP:W3B1VX9:%L-B7P;N66ER9S]#E1_FP>JO^W^<TVS`)76TBYB
     1602M<U2H;SAV&RL62X5JE&,^QFJ,ZS9OND-51]B@OF&804W@$:.<*L=J4G@=U7J/
     1603MD_U=XW?/,[*-U>7=YJUWZ'YN!+I'P`**1#"FS'75*+,$LQ6BP5>/51CF83&A
     1604M;'+3QE[T.:%C2+*K4&`M%?/8"L6X7K_E#^WU"Q+\M8J./7VI&+3WF%25;+A<
     1605M.I8Z9Y/Y#3ZT9_J)"[3V<(ZX$+\&<EHHY6S*^"#`>941BQ\%P1OIB\J,/3[[
     1606M*\/P)NE__DW_&=N"U7_F&@J76C;JJA:T*J*F???JP77;J/OH3=B\E<$NQVA+
     1607MC=SFK@=X;^REX+YM;05KKK>]SB7@_74N$5+R"3YD9P9K/=QRC-Y?1^>N)UCK
     1608MFNQ@;9BP@44Z7(ZCC0H7!_,M0/PX,7H+S+?^\./$UNWG:S>8T%\/DW`'#[M)
     1609M@U$D9XL%31YL"F4Z1BM35;"9EN(QV@(2MKGS`38U<@.;$NG!AE^'Z4MA8F!>
     1610M,,.L[>-D?SFM1$.%_#BA]'Z^O,,V4<@I-*J0>YBGSX?P$K4VY;;(VS$,"NOW
     1611M=91QOICRPP<@7_MORPXST^.":;;5*E"TY'Y1UB)+_RB<8-$;3[5H:?+QFT9G
     1612M;-YM+4A&,VNE9)/X?3#A7AM3G#C&:YR]Y(_H&[T2)Y$H@(0!93Y6BLP%"U98
     1613MH"J7'/LN/[D2#=I141P'M<2E],H)YI@.:K#[(K&2XS?`<6!D"M]C_HD&?IW*
     1614M619$#4:8I2[T9J`8QLFW^B^D>^>8E%S,\+=S,:VY7W$]K4L=&V?2%#`5B,UJ
     1615M%#W8L@+C,5K/M((M'3`<H]40O<\=#[`%TVU@*\UY@-5NMH7:J[:R!=K'`[H%
     1616ML>W!]_$`:Y6#>)\X'U"K<["#M=#!#E;*9#5#E;,%[:IC<!4Q\HOQZE8R^"YE
     1617MW\9+S/%]_GK"E>+=X$KU-KC?*&\2J**;X<T"570GV*CEB_#2?/0@0:3O$^4-
     1618MI$S%0,I3#.1"WS4D3UUAEG]F<$N%B.=XM5L:W#2)<(Y72^5M_G["3<O8X;>B
     1619MHP(7^<<K0+Y7H%<]\@TF&JQ7<B0V]*X.^4+Z,E^]P42:\C`Y?%[A<0U]WBS4
     1620M4.2^N)A3%>:R(MV_5"GRVKNEO;4W*>]L;]8X-L:QJ[38E57<``LT1N7ZMY<_
     1621MH'^[2W+3V/87.E%%GG^EUFIH+,26*>):A0U4JP@`Q;87YEES12A^P2M)L$RA
     1622M-&;(9)FZ/A9KRK!+D;+4/N*JHUD_T87(,SK+Q[)XPU\&TIR5@\PTI?4S7;_X
     1623MTI(/9W?UDA_L)E4>H&Q)I&P,D-0;+5O#K12%1:RQ42NB\L_W7''7%+S\$4W!
     1624M0_ZFQ8SX[[7^.[]A1W<4OD>6QHX8S\<WJ:_X>^(U1V044Z5,<[>4BI^3F*P#
     1625M^%ZE?FQ*H')W!>_UZ/?1RMT5;!PX'*.5N^]SQP-L>:X;>&]ZM$WBN(?H4(Y]
     1626MB`H5=Y#KYN9TJKA!A![U;:*\021?PB`J&#C05M).S4\6%]@WL#H)^CEZ\[98
     1627M>=#K`&OETGK.'0_P5C;%P.HXV,"RZ%6YHZQY48@L>=G&+,[P9D:YN$$<!W#S
     1628MY`TB*VX07?&T\WFMG*=Q,$OW<?:XY"&JSDH&@6JLPX]@G]/-6.BK]RP)PYGR
     1629MI'BZL"^I7%$?PE9_KH`XR]86-FGY@S^53!6Q^#VL'>`:\_#U;GYN*5RN2>BN
     1630M;TF\@'A<',5S.L(?T/6<'?[25@"QGU+G[F4QZ(+Z=E+X&16@Z1^8_PH'A^:O
     1631M_!.]\\C[#X:T!P[DC\$:5IH:%LQ^Z!D%DU_X*N1;^<PO6-C_1$;6ZP8V-_N?
     1632M:Z%>J(7Z__4O?_WKCW_5!:8.RI\?G__IX_.?/W]^_,E6OB?WN_R7'__Z+__M
     1633M__SQK__X(Z>KA-]^_.GYV]=OW[_]_.W_^>W__>WCM\\___;C/_\/^W%Q/Z[S
     1634ML_W+Q^>/O]KMYF[WO_SX'__]KU]@$+U<]6US0%Y,:F,I4]KT!&3<;B@)N=^(
     1635M_@#,&VWTHC^(!M<?:$C#NK$AQ1[$%X].+VZH(-_VF5297?`:2GMSR9S*8ZY'
     1636MZ+F%-XN%'><MD19?W!*7<K=;J8X<WTPJ[N>O1#AVMQR&4N#G!1;]]2TQ2;9C
     1637M/G$8^1_5VB]9[KN1MHX^Y)ZZ2&[WU+C[XIY:>)VY-:31]#/>3;3R0[4!^Q]Z
     1638M3+<HB!LV]1?WU":<7DRJEF%W,X>6T]NWWR;K3AHAMK=OMTGV&[]'MTF.W\@6
     1639MD1LE7NG-TI/[.9W/QSJ0DQWR`H7^^I:O,[Q/Y\V#MD:]T2V-^'1-DUJI76ZI
     1640M\6&_)6DG+VYMK7WY5B@A5;\?T_DSGR,A/_,XJI7B1*2\OB6;.+Z845R][EX,
     1641M-6)+7?K)*+`QALZX7[KT&SCHLA^C.56`P#4&&=L5J&-ECPC8X;%R"XXGCA,L
     1642M6Z/LL\BV8'!(/9<UN1P,S@G-H22Y8Z:KV[VP=T2\_4K]`NO>=84A",?;/?E=
     1643MW'LGY@W#W]70?>*A"L*+&553N,_IDG77G3&9])OT6P[:%";-/3M)S)M3/,)Y
     1644M;QCR+WYE8;E\+TTJ6=^<B?(Z?R??Q=\R%$7=>8''[^GU+?V<XYQQ?4YW)[5:
     1645MXIL9]%8NW2/67O*;F?7*#G?&O7+^0FD^P<-5BQ`R"S;Q<YG72.XXK)34'T_/
     1646MK^Z8?I#VN9S/27^30ZAOWOLQ'G'$(;15$\(4FK7%]SY2",N87Z$H`8X*E;%%
     1647MNV</__05"[`]9\4`;+]=0?'VV[K\.C3JRF-[2^XS'"Z<`Z<3.:@:_,<Q5FJC
     1648M3BIYC>MMTXC<6#4JK+$>"XG4VQ^7[U"U-+1M"K4T,'B*&VDXGC<Q?J040GFS
     1649M`-#N8"+Y]=NXQ64?,84FF"[VJN-$R`/,/5>4ZNTAXP83B:ZZ'XLHQPV`\Q6:
     1650MVS,5/KH<P]KQ4>-")DVOK<BDQ47RY1`O^2@^ZGR2^YPRSY,<+.;L=B]@L7=Y
     1651M?S8ED^X:6XI9<VHY<3%?I<GJ17O6?.%K$#FD^E(QMN+QB?3R?8SP)C'K;W]*
     1652M(=;PMC+%Z<T@U4L"8XRIOTD68^V1+@"_`HC\HO$@^I>LTV,*.T$F>2QQZ6N^
     1653M;Z\X+?,MZQ49][G=VH#@YK2U81K5N/Y>/;G/_[TH<&)ES$*KHU""Y'N:FB-7
     1654M/`N3)$<D1[[7'"NJQ_<Z`H'>P]0`TJJ)EM[;U0(IW?V:JN\<'_JHXSGUHC#_
     1655ML8#[]TEHXX#*7:@LRGN(L0]TCZ?XQO=0.FJF3,7[G=AC)E5^WID'<:1Y8RKF
     1656M%1EQ!*I7Z#!)E_<20WNBBOU'?(R:.T+_R\=[G0A0/AV58(F-7HR0FS\</\VZ
     1657M_![&N`::V5.D9%W!/$ATIR#)B4E,*-N2ILI/8NH8M2)^/WZTSZG\->H%U<@(
     1658MD.C+MD9K1=5;KL_Z'N?O!_H58N::1Z/?TFQ$N4HL7X.R23_SH^21*33S>WR6
     1659M]U2OC-KZ\>.=Q`@JZCE>9)3^NB%A-'OW"&X;13;:"L=5FA?5U=J456O@4`SG
     1660M3?7LO;II;CR7-2CBAOGRKO.7YM#S-SVV4,K&+Q"JO[AID4?CG-9"(OQ-B&CW
     1661M@/ZVQ#IG>MW@HBD=-YQ15N`LC<I4_9CJ=XGU=K<$*V4]Q]-#>'GG=S4`M_ML
     1662M&^?16ZR8R(+[1$A69]Z>UD5XO_.[IAZ>]]Z>UE-8[H@RIM['=$ZI'LCMAXJC
     1663M]A]^A<EX?4_R%;=[HH_M_FF]26K\VBL2QC7A4/W7_BHWL`J<]QM/2]I<X&6S
     1664MD)GR?283*_V/!"<?XK4]O+ZZ86;I=)_K5OY5[I5:1%>P##QLED(:?WMSN6[]
     1665MO&=);R]N:@Q1<_=:3UE_F&XW9=;=?[%N;KAJ`L4K?/(O;NZ.CMNT-W_'NFN6
     1666M$FNKN5*4S"83Q"ASNV5'YL5-V</-WW+6G-#O-YT!1NL2RDW#,ZH3YA4RXQ<W
     1667M]=C4<U([-MO-ZTK!]CO;B!))7[IM'<SMV7TD'U7`8AXIV%K'[??F3UEP?3Y:
     1668M-]^>U&\P_1+^MZYV\7H^]!O9!E&)A*I#LG_`'/=;IIN^N+EQOW5+=#;54/U-
     1669MK^;QI/ZFX:F\[Q4R^1<W35L=QZ1.E7,W19O=`VFYRZ/HP'O:V>W>EGSVXG=6
     1670M3Y[79FGO8:N#>/O=5@TQGWB:?_D%,N,7][2I3C@GU8P+=\\4-<$$E*-MZI_9
     1671M=?9[V=EUSE^978?O>>4QWNXY/?!^QZF2:M8YT#"SSC'?[_%VR]3+_8;HT.9_
     1672M%V;:1.NVYM3E?LO,D.<]2]/.>FL9"((VAG/W9$KUI?O?>2S59/,"E?CZGCKB
     1673MW3V9TVT[NSGOP4#66,V4H.CYJQ:@(`=QDL=PWF.#X:L[JLU?>B^$F-KZU>]Q
     1674MOZ>_&U;W(]X1_%U)QHG&[^D7]]3...Y3QLLJA^B/V%RXM4TB"WB=JCL3Q+`'
     1675MA]QN#G]X7_U0`T+6S7RQO78/"]E_&;5OH=W;4%79Z`4V6J+@Q9RJ3NQS1K&M
     1676MVZT\EZP)!0I2&H=[5TU-L:@7*DI5G-N]XH7P5[^3@EEUH5)KD]^IH'W[7?6"
     1677M=CWQC&(V.C")X=6=NIYUSM:$D\N=Y76\-?4F[T=69Z4&KH_SG@J?+^YI6>5N
     1678M]\37JM)E/W]GTJ6[Z1%5J>P%+O7UO:`%8-HQ)Q.;O-\3Q_26I1)Q:W-F;XEB
     1679M[IYVUWUQ;V.I?$]<\%N5X=O/)/3$W?-8;JGW-TS:+^YI(F,XIM3RH7:++&YJ
     1680MH)#\0;Z56H_YS5F=\W%+(]K.6VI_ML5*L4"*4B-T.GZE8>?I-8;B+7R!1GIY
     1681M2\W2\9A0:9[[+N*34XJNZD<R/YXN8WMQ4P/97]W4U-%J-Y?G46/:ZXO?:6C[
     1682M=M/A:F7$7Z!3?W53"[J6<]JHWCV[^>>W/XEMFEWC'`3<EVU98BJD-DN^>HHJ
     1683MX@F\+:NUN.0E(T8LW*Z4$8^N#?9LX=I<?9&BNI;M7$6M\B9!R3&GREJ*%NNC
     1684M/;$LW!++E==,2>WSWC?$8<RC]?YF9G=&-JFAWRH<8!KR%(C%BZ/+TF3UZ4UC
     1685M0'A8U<45%*(X%#020!;7#/J^(@(W4Q,SOLCZJZ+A_$PQ=5@NM&(A*>LAN.7-
     1686MLDAZ+<9W&#J<(1^-2**9]7$&'\L]H$\0E\#OT0#+9R#U!I;U?\GU8N#G[6&.
     1687M`G,(S+]*(0LI.PN^YC-'%QTM+:^#KU<P7#37R'^G?Z"$.O[M$CNTH"VQ;9U8
     1688M4KHZLI8B6<RN@%[<\3V,'!K^IG>*7&.1H/U",83W.4<ENSU9'N<,U.+[O??8
     1689M4*(GA"M2==OYB]9'1:&$N1TORJDJ,>1Y&6JZVO/K?>ZR4+Z^W^=7;N-+?0P_
     1690M+>0N?3647Y_'LL>($NSYYT=[#[VG,1_,7HCV'D/(`3%]E(D5,XU%$88YM(6K
     1691MX^W)^=#G0\NX,%/]^9'(E5#;DRX:>3-*;F7.0]5RRWSE-%^_4(WWGY%(WH5:
     1692M#-02YA':U?*3?`#H4#Y?*264<O])%P.QA_-I>31">[X$>2&N'+G($;"\VI6P
     1693MN!2!GR<FN7:T`]/2@,@+2U^A?Q?*"Z/=?LW'D-^B?W^$2KZ).4M'N"+%,,;/
     1694M$-]++X%\(?D[M(\P7['/-7B&B07]A`!C'F::N'[WC]`^WT,:\]THG#_TC_XY
     1695M1Y"YF7Y2OBGL/USS.7.CSA<,5#=S?.;W4N-\;J=Z%/63*'!*G=`*E`>0WW.N
     1696M:;YXN*B*!578#+GU0@^-Y(*9&R;,#9,Q(,]?S)TY"N&`)I^T4:]("''5XO<X
     1697M")_R2>;^,5\O7%]S3>+G+R,Q?Y7F9OX4%P<YZO*G^"`1T_I"V`-2+-W5WS%-
     1698M\7YGJ^"&.SZ$Q<+E_6\LS'+=V7$S$?F.07IU9\N2VF:SHC#Z&S8";BW\AAH.
     1699MMR9]!MY:]>VC52<::N_TO1!ML(9",=@CHEZ7_8GJ<KE-,A0LDVB,%(.]@T`<
     1700M(T-<"B+#9@\4X37?1XH*-M0#(L[YY(?Z`MC[\X,H8]NSQAWHZV+;!")&200(
     1701M&R:*VFJZ#XL0NWUW41$&8C>:A]@O5801.XP4@F+@\L_M,/YUTR8!.FRYX]=\
     1702MAK)FFWG\-'[=/R7=![J\`Q+LEHLR;E!Y4E?!SC!*'B8+H4$/&^8:U;C]6D4Y
     1703M_?WO4C8&L.63T8*G7('?&V'5WRB^'5GW#2CKSD"H2![@0WO,'[E%]Z@KTC\G
     1704M*U!";F7IUP30TSQD_;BY;:71U3O,HZ1>336'JQ.V;:.ED/<:[):O*-0M2;8)
     1705M%J;Y/LQ+XA)IOH'D(=UM8PL8CSOT;CVOQSIKSLS^4IHS8Y/X1K7Z38L-TT7-
     1706M=YCN1_?3O4Y[5/NMJ&I<]%L,OJ)IY0TJ*E8^QFJRIIJGI8EZVL:"#!<#.R2$
     1707MB.V/:P<T2._UN$VA@<`+K$%\PA)=C."R%6T1?7F'O6FP]!9#N"Q"6\3?.B3N
     1708MD1*_Y>>O-YB$KC?[I5?,5'452FZAMU(1-"M$OD#>QH`#+8U<%MCT95G<M#V)
     1709MF<XV\=@@PM#C&<`<$5X&]6[M$8O^\N7G-;+,[::\::T<;9:7&BGQD6F+]+)]
     1710M*)KS4D%5?Y=G%M'1E<SFI9^OZ/"EZO('IF"QZ[K\V8:(WBZ]<MJ=AGD]-SV2
     1711MQTU9T@6(<8S9EX6"::R9KUHQ7)[-Z']O5-CD-.E5E22D4;W/;T)*$NENUX4X
     1712ML/=4PD#,U]R*C?6ZV@A$@QKI5-_OK5UY*FOS,R77'^L]Q%2OJ0UE$KRGQC45
     1713M+KKXH&CG%@/ZETPU)D4$FF5*+P8:4Y&*5XT82SI5G:H&:6YSCIXR::4?[ZT3
     1714M#IGTL?D%2"\@+?&::EP1%`K7R$#N\113R5;P;-!@QOO<+:3PY?EG#JD].V:-
     1715M[ZG6#'S[5#>F(I;GZ*D?S8\W1[>IVM?\1,H7??GYX:A_0'_TVB(BW#[>^]1E
     1716M"2\K&?MU*_ST,LU+/ZR%_M7K(AU#K\)??DQ9N+[]Z?GGN7'^],7__;U0VYM(
     1717M[=5T9/S+CPD"(6QS=Y4+V[6LZQHB'#)Y78_(5O?$URE3_`5;[NDZS-6_WG3N
     1718MA+G#&AO(12#>`=*T+G,(T*-#!V/K,E5M6DH]4HC2->9]G3O_Y<=RX%,`U]P]
     1719M;\OP3=<Y#S5VS^M2FBHO=#L,RP&C1X>4Z5KG+G_Y$03KV(,R5JS`5.*%G`%K
     1720ME?UI]#7U4*%C]`Y-TF5T[JD+8F!7'H:!4Y-?="3"*3I$'J)73T-#L6D=BQ"*
     1721M^<.6>].YVU]^"!X=;!KK0\%,'%!?^')2L:H?M=)R]*P?M4[N7U.5CZIS3R)"
     1722M8\O`2O-'K8^2HWY2BGLN21L^TG4MQ8K&DPDR-PN:JCKW^,N/1^Y9*U',H76>
     1723M+?VB$^4K-3-V$XZQJL\U(@VFJ0E]7LO481Z+-,5UM:'3.]2<U9>+Z]:$T6%U
     1724MIO8CG[32MM4X!3_Q/&%SE2]M'43K&)NP8[H<(ZMID#Q07:V`Y*D:0V1K?LC\
     1725M&CHWG<GU*WF_*Y6BG["0U0_/XF\X6=,4`8-^0V)5\_SHP2R&]CR2J>86]1O.
     1726MN4KK]A7G;W-M]A7G_>OB(]#Y.L^-IA_133U/9`XC:TTHH!F&NM7F]22ZEX;F
     1727MT_55DT6LS.O>JPJ]?FXZD>U*YIXHM`4L39R>U:<J*Y^Q/":749VVT,=H(M[0
     1728MY>1/.O<\D?(1*4(KJT\+"*:N1:D*:)8H3G390M#$9GJ[22QP,G7N>2+QN%X6
     1729M(H4I$W\W,K^O;Y'6=6G8U_S=8*$>YF[-MB"=]G4:]MWFV)"-H)+]]2J7?C:2
     1730M54+4V-AY/2G995%0;NIY&N=:9OMN)$&UH@%_\[K6H=5.::I)(]5R1=>!Y9QP
     1731MPSI>M$5J,A&1N'L-^MDRD>Y+O]N<*>6FG4<AEZJ_R,]+[*[TK!257'^7?3B:
     1732MIS7]<#3/E`'EPV6*_.XK-(*&%GIMG7L>1L8SEZ%?*CTF\V=6&?DZ@A3P=R+?
     1733M0"_&[.@Z=_TX.O4\C/3+*?EH5UVZGMJ7?J?YH!R3A4I3_'@:ZN6=UZ5WC<^*
     1734M2>>>IW&*L(L>+YQSC%T]E_.ZUV&?:3[IXK4/"VF2=\7>-2]U:CJ,M3>5X2D#
     1735M*TE&(5U-<4L<,WAJ*-J(<SXT9FW`2;Z@0.$+.O<\C+_+"I=KZ.FB]VYI?21"
     1736ME3@<_FS,^_D[3%FX..(6#>EY$OMP=(Y4OM(TS&%>Q]ZJ22"4MC&*AEQ&TG^S
     1737M-CGV,Q-G+,.XU9SY:LEBU*?TUV-5*RU=CY%,`)DS(PME?0<W\SR)<2R^*$C/
     1738M@ZC'!?:4+)XN?I#$QLVKG)+FH)+G9*H)RF/21;)9D3<O0]->R$<5BWK]2$-K
     1739M57D5*=!76O('/9",`AO6:1Y&XD[V%0+)C=V.0YASU*;UI>C^Q2('+WUX#!8[
     1740M>>6#33W/8JT:;S'OS&\_-$J9KOO\:KKR8>Z]*VJY7KI_M6@K[V:>1W%N_DN=
     1741M]X14"$5#L.BZCRC1A9AZ7!*D2'>G^J)K[R:>YW`^M*N<P.9YM3($HE2:\DT8
     1742M3N:K_L/P:'Q$%[HADWU4YRY+3J`%+H+F)$PL&N":<O&GRJ1K?3U&*A8J>]%A
     1743MM3Y#\=*YYT$DZ3)KM`F-G=POZ&I?DPT4(SW7(^>LP:#S<G(%JX,PKW5J8HJM
     1744MF6^`D,RIVUI3(GI.:J>>M^?1TVT^9VXE*C=W$Q-3+-DXQ`5[@[+SBT3;KFM]
     1745M0261I::;655U>E?L>IU[L&R-'Y7UX%C)6[R6-HRYU*XZ&CD-NA5%FY>385BQ
     1746MM:%HYWD4(YT06=EY;Z)IA7H'O7"V:D847LM[;X76TC<OUH_#33W/XE3)+7)Q
     1747MT%=I6M&?8F-'TE#;.5%*7=M+T`O%KG4,:/"49'3N"+EI(9Q*U+H%\XH2RMXD
     1748MR`^&&DVG'H_).E9*-OWNDO71B>=9[)>QQ-`G[6I-"<*\GOO.,GDZL9_+*L+2
     1749M\%"MG&JWF>DPIF::`_UVK)T7^9I,3^8=ZQ`5K3)E)QTFB+;@IRZD#X2NGJH.
     1750MM5+,8WA0J!KK0IZ.JI98>@Q55Y$%)&]"[<K+,TNH"^$0E1H#'8@]\D1*/N!1
     1751MDPXK\PJ-?.-6K+49VHTDLFZE$^>]^<W-"=@>(SL/(P5C7M8-B33-'*TNIIL8
     1752M^F)2UD790CE5#9:>$U6Q0-*]T#1DAZ)CHUAG`ZG<DUO12NG<?!:1N=6R5OUH
     1753MRK$7JFFJ%QK>C"CDE?H^WS%?\N0I75UVSLLE=H4`I[(5N0P5TKJ%$%8Z[\&J
     1754M_G.PID6\S_NM-S]WH+G#&CM8HUNQS8^2+!B5XBE98NAK\%621M,17C4LP[C.
     1755M'8'W7*R4+&R*^'/3N*WYD#HDZY[&EJMI'3/2SLEK\>0+G9<8XQ0`Y(VF^*X<
     1756M()"NR`=]%2Z>4YK`.2^7]K*2[">9(INEK4?6]9@Z4N`#L(*V'[S+Q_KA9`_J
     1757M,:9Y6&MJZ[*P=.'M+-1*"B.#*QE#BUZMJ#=MD*S[A5Z&[40+VQC)A_3D"YVW
     1758MDN)%IC6>@;7,52U@R@0YVOMGR.JN=QA1/J,MF0XIK8_.W6@].,*<D!EZ6EA;
     1759MT^A'7-H*S.=6"Z/+B+810X3./<]C('V3):N%;RQDKY.*M+";J0\QPWRUNB7F
     1760M1PEI@6-BK5>G'D15Z1Z9P)=MA>/=Z42X6`/2."Z+S$]$3+/N^BGBAU*8S<O<
     1761M=1Y''CF564O[F-\F5RWIDTAT[_J9YU,CL\.\'FJFEV!J##4<(7%12V5`&<GK
     1762M!*3'Z&T]+,WM9TD#)(/'8KD'\SJF]5(Z=P3:Y`B,RFQ)DLY=/V*<--GX`PGA
     1763MW>)4YZ2U)WTEDZZIW0&9I/3U2-M(2<08S#/L5).XWO,J5T(ISDU>8KYJ7\J?
     1764MSIV!-4O-UKJ')%;6X,:ZK$6[>%"LQ[@L]I;6OFETK\G!%><QV%<B)2`V4='Q
     1765MD-BT0DJ`^\6*+#Y*+HO-D8@\K]S>KI7LM21^&M)3.!O=<G-(GBM#20BE:,>J
     1766M6)-$V9(*.B914L'OR2#L0U"R5Y8*0S1-&T.;CU[D]HC*G$GTOE:B!LH:$7EU
     1767M6-.)I#%,4>&@GQ,PR^I\U=GLTOCJ8NT.Q9PFWQI-Y`<2$$-QTBH5U697))Q=
     1768MFI)#RRB+2@]+@PD<27JE\$/+J"+$]$=/2F9D[C:/9'_,TZA=L,A>'0673K:6
     1769M+DO4U0R5>&3O5J82-G^LC\Y-'))"9TOCY]>H]G1X$+J<$#)]QR)1ZYRE+-;6
     1770M1C81>:9:Q]L\DV0)U]9A1$0CT[=&PG_BWV9*JUA/J="WM<768XH#0CV-15)Y
     1771MV#JB1I/0AU*EK=)&+OP42EVH/?!?;(R#RYRD;CT)QFK:/(YQ,CZM<4E>J:KU
     1772M+>=D89WLR6@GI\$?4T\:6@&+C"%O$NPZR416HR?5D'T3+^94ZR[>IGE*>VD!
     1773MIV:@K87F\G1EC8DDLB5*$<4O')QN>,_CV+*:UR;6^%#X.XT*UCGI3TL!RT)Z
     1774MT=S\CSY/DG-,4>78N3YXJT2G!#.6R-=36H8N7L*ZGE(IUO/BZ]@C/EL>?$VO
     1775M.)30M4YSY[[&9A:9<EMCIQJ+Z[J>/<\X1/.RK@-;T7)>OY_DM]C<`W,GF8L5
     1776MF;SPGB.Q,W.0]TJ@.UGQ9E=46GA/23@8WAU&F[3PG@0%PD9:>$_>!3Z4%MY4
     1777M6X,N!>V+72I)T.[9DPRJ$/E[2KJ<J""0%.T+HGO2Y4Z<,;;03ITMT8)UKSCE
     1778M.O<\>E&PGLL%H5RPGB(T=I:L=@YL*A*T!]L6XT)[BOS@/CHWC*A\;S`-B`OK
     1779M><2:.JL*V#LLN++689G6%M:34BY[N<X-ADBWRA).98OT;#V8L05B5`6TX(`,
     1780MM9?3^%;*TM]U[K+FGJJJ>2-I@;+%>M)4;5DI+WG_4,0H6R@N0_6$H@HC%=ZD
     1781M'Q91Y?$*X1(9D3"*0[D:7B@54:1H(87D)')80"34N=G)R'NSLAZ/M4UUH52*
     1782M.ZHDGES)CBK))UD/*D5=]*1&)ZH(JH>6@N<KQ`X^J)%V,*@L'U2ZOPYY74_J
     1783M`TO#!Y62!$;).O?@N3/?&[SH?$Y),ENRB"`=.$XJ!QD.Z3M?BDEQSFBJN[..
     1784M+-UCG30MK/.4GO240E@$2TT+Z2GR0M9*19<'"K7.38[&A71<9J&TL%[G/<HO
     1785M![YP"O+Z;-U:.,=KN9Z,G@R(J?@ICG>4A8YL;HE-9HJL2"^<Y]9R9Q3Q8NJ,
     1786MU+GGN9RWZF4!`T""A3I9YE$X(&:AG#+;FZ*L<V,W`Q]1W8.4QT`A\E']6T!R
     1787MZ9Y-D2IJ\L"SKFP5..@EBW6><',7.CM7*6KT*)#XD_68XP50M0;/=LH\;9>8
     1788M1>PO)KM3'/B4)K.(H7CAKI%9=,6>^(7QY,JBQO%:)0D]Q">#X4?G;LMQ0K^K
     1789M38.6(LD<C:4\[',R(,MFPMKRN0SDVP1KXI-IDCN%#TU]`._/)Y-D]09#"Y],
     1790M$KWY>#2^G'L8[\$'DZ9.8$5\,-W4Y.`([+_A@QG`'^QD!NCH>C`I?GS`?)D%
     1791MZP+I.>](-PJ'F9SE,EX*VS\SQ(5T;$NV$JR7^38)U@7&GE1N4].!'*ETY:6!
     1792M*!'4T91D`3H?\H7U)+;#^.=\J2EB%CV;;NYY(`<KEU&PCNQ"CPOKJ8SP$5E8
     1793M3\W?V">[#_1DNHD3.65"T+@/FFD2)HW[P,KG9(=S3M78RAH%Z:MDXY]N;I)3
     1794M1V#F*5A7]MT%V2#\T]#D4<W<.-A/XU)#FY^:K*JYJB^-L*CY4H\./:FS!RQ$
     1795M_127)6Z&1V.1.=R1IK-8VA`G`V9F*TK7U]>81-YH39PX>,$2Q=V,%YBOH',W
     1796M9C6RS5H6982>4GH2%9$7=<4FTE`$E*P5&LU.XV5XS]-8.G@^'\:+[#$0UO@P
     1797M7H_!@55\&"\B,<P5Z[KN9=AA=#,/<H$E-@]EOC?5?BP^'\;KT2*?MLB7>3**
     1798MJ(=Q7C-OSS><$8336&!/@G1C=UE:2'>V%*8F,PW')<G3<N')Z89T@!%G0"5/
     1799M67Y;["S2^S=8Y5/4]<AV%JD*=&/,[EA'T#W6%Q?64Z(&88\+ZS98FY6EOBZF
     1800MO`OK$5ATO2.=$,W"<E66K](MO(">%%B/BPOKSDL;9:6O%7ER1YH\'/72!'C&
     1801M*E5CE.27BUD##+!>''P6%M9A;D,39MW<9,)A-(+LCQJ[VCMIZMPM$`1KZX79
     1802MB[Q-3IAU4[-5U9@FO7"23!>:.";-Z:57FE11#^-%[%H]JL!B\OXWG1N*9)9]
     1803M%-0QA7DXEDG0C?#8K'OCBO8:[-U"(85A:)/#<;Y1D].7R1*3(7;C^,WK,)03
     1804MTMW,-!6';UZ/WE25]!,/6/GX'">^1^4.E1/2Q)V]KSA\-/5@4SQ.']TO%;LO
     1805MW9"F()PI[D)&3POIR2C9?K&0E@"&)&@O]2`MM*>Z`R:4;GA3($Z^.A_E)`L0
     1806M^'@*WA2().=O7D_RGN7XX5$L2\0[VA&1?$GEU'FO,@./@G5D4U-<6`>*=Y'S
     1807MAQ5B#3C>L2:;ZA0655`EK*[!E2>B7.=+)56L/I=%65C/#=F5__FIYWF<JL*0
     1808MXT=#$VM>0;!NK``$6>M%&4.1;],N98!^:N*-L0XM*D"_K;GH^:/KTJRH2&:#
     1809MHIX_6L"J(7-^9HI1#>9QG[<*Q^DME+N&,]#*3#E*(^DGNHGCHK)L^)&=*:!1
     1810M'(YMZ$M#Z>>DU[(2T:^N2\[:G+VIJ)G[W)J1Y</&U[4TG7NICY7OD)4JZUGK
     1811MR(@->MA@I^2SF=;,O.?Y?,V)*PGJ.C<LJD%FXM`Y/FIDQTQ81SYJG70\DS0S
     1812MN6PSEB\MG..4-)+-G:`^"M:!O0)I8;W4_21(LVR?%L[S)FAWBO(.`TJ"3DW"
     1813MZL*:#/XJ=`+K?JG5AGX[(M8GZDJSI!4%ZZGT)C\W,<B%=9K\7>-3L;97T\!Q
     1814MO!4+L;+4DP5KT-:\;BL<+^C<"58&S-29$5Z"957FAA?F`,$@2$_%4T.,L?3Q
     1815M6J$".C>L.EB`,+3F)XV]8K;>A;AOP4/SFF)#U9LWK[LU#-&YYZ$D+,)(&G2!
     1816M]V6OP4*ZIJ)9H(R&.'=QV=2;F37`H%%`3KI8RI:M,;0F!]X\1'%ST<L,-DG)
     1817MQIB,FJW0>$3UP=V-(G*`);<Z`")D$A]LYZQ\G6H/*CAF,KE'MFWF=7\2FR[G
     1818M2:>>9Y+FFES!#A?YXC,+FF%==W:<\HEJ<*0V/5$-<69=3I3./3!WOU2+HR=U
     1819MMK"FA76@Y=7SU."C5]6-GD1E'/1$*2VAH)SYAHEYT\*:(Q=3$)R6-6;A/!EV
     1820MTN-$0?SK>'6^UIG!([FXL^`<EF8E*UVX7F<4G.4D+ISG%B]ZFMS,Q"(;6S6B
     1821M+'3H105'0OI*CG%1W9%L?*O!"V_'R4U-UIS1U;Y"0^<>,KY%J1#+*RK;8Q2+
     1822M8:+[5\IVFMS4Q"*OJ@Y6#+V*1H?1^T8+V*?;HR0]3?2%.?KRCG*AN,RH@:E8
     1823MYZRM(VD_YZK]L>GCYJ2>$]HG?6A1%-KL9"W7N2LR6]8.NH".H%J[;/%U//&X
     1824M.A51YAF%+S.E-.CIJ88V1<==S)>9,Y$3:GGM(U]3>).)?I1J4*-Z$>A1P[B1
     1825MFYD<CBMBC3E3I=W/-L3&UU.(+";X53VW:6%="ML4[TC/DSA1"GJ.D.'`)I(H
     1826M[Y#8O2LX=S;'I4O>@9,IX@UK"L@I'80H+J0G->7HTB9(%<UVH2>OSQP7SE,'
     1827M`2;QAC2%XTR!B!6\)%-I)3+\=#2K=D9(-M8MHR"=LE5*\U.3':<XQ@377S2Q
     1828MC[!B,3C(2O<KV/&AM^#,@W#'FOP=C86S(/MC2MQ6D:JB,HV)?0@*RAI=";3Y
     1829M*-ZQSJ`?0^(!,7)$,8)D>#:[^$;Y;E)^1$DX;8@385Z.;/'&C>)QUF&B=ZM%
     1830M'*3TNW:M]A6T#2[9,6)4Y1-#04`<V,HGIAC:%?O:>`^-G:N9],1P#DO7$U,>
     1831MC>5@/C"4N<%4DH^,FQKY&YT-]%VGNM14D2E,Z')'!B%!^'!IH4T.?CLS;FY2
     1832M'B]FH6FA3<9/];O-Z]$N-57,R]Z;6O3I22$W-17ZF8DOYJ)60T*"ER,*SK6P
     1833M([G*]?)8RU)/"J=.-S<SA>.$J<^HV9"6,EG\/>'(,9!QH5Q9&XZ"\M3RC=^X
     1834MB2F#H[H,P(QPK,L83H%,J0'XF7S>P?2D>7NLF-@[SB2FIC55DK&A&<.A1Z6H
     1835M1D/"VD)FZ2N,HJ?%S0O'(YM496N$7C2)FGSQ+4N\`O!OFJ&"/<=.E"S;9#(8
     1836MG3MKQ"=VV!*!!=FX`O!Q,:Z%]*1RIM[D*1:9Z2YG0[M`_$CJ[9KWRE"?=,[P
     1837MG9LLAMJ"W0X'E67B8"L^$&YF4AMK&>KMRA1O=D%HX,.1YV9AX:RLVY,_#ST;
     1838M<^J+P]'N.(,GCFYF!`IYR^KLHID:9]NEA71GPU,<^@YJM_,3DW0Z>9X:\3*"
     1839M\JH>#<K["9<9$0C%8-F3M%KS9"4]#FYJF'"Z&?$RJD(6M:C3.[1FLA@M_,7Q
     1840M]`OIQE)`N"%-`3B1-`H]&Q3(5R\3QC)XGG&3C/(&FA%+3[Z0=K,.A)L[L"'.
     1841MC`CH-I6MJ&%&Q(>>C@SZ)W%6M/"I:&4!-V^D&$'V3RK*.4H('R][$6\77;;+
     1842MXEAHU7L4(SI?]J)S)XMER:0@K^AR7'1Y8W)#%ST/"0%@:LN>UV54.P1)YR9/
     1843M8RP7DDKX0*!^'1:7#P0YO(>:LFEF\J3I&4APE@T]`\G6!`)J-2<3IFYZ'"B,
     1844M()A(10$+PQR^]*"+`U?X#+B)B2&N4.1TR6\3VYL7SHFB'_1$).3+Z2%`?E4T
     1845M4YJ;FLPWM4?U_F*J9DGB&<E@Q4QI"4?33@%B0JN9TMS<2*3*EE%,KU@N2VID
     1846M-(/:LK%"_-E"\^L7[EA3A.I(U91]9.2Y$X&(TF;J27K,=S(.@8B.2W/EW-04
     1847MDD,U+=3'A,6K54(T@%.-8LK.'!(D07UT.3B\\(8RA>/D965=&,?,=K<L&[@E
     1848M,67CKAG3:#>OF#/:?VEM&)V;(N&F8,<;'O<H)RVQMA_XFM)<;-/#-\VIKT.N
     1849MB[-Q19T[P7V>S)N3J4(--[/@$Q`?4R8P:W*<M#JI_R8CV@!,E;=]M"6A!./H
     1850M`I,(Z[:P"'+-;I2TL&YL\HJ"]&C5='(W]3R*K4:-2Z*9IOAA6@5EVK&6&1?2
     1851M9*$P$8GB=5>.RQUK&%.7?B]8!U8Z%M+D#-7L.+R$2Q:EJ2>IT&P8/S62-SB"
     1852M(BRT<PO61@&Y>\UV?:3L#;,E4_1-L>0./S/QQ6$J1;0,)%GHPB;.L'".G7G9
     1853M0CFP/+D0GII,M!W"@3BRS+EJ5@Q-DSG&=:$[2723@,O,5454)X^P,'`XI,P]
     1854M$"Z>$6?2ES690J"C[N):G:P3$$1BFC-?F^YL[F**PIF\Q%1G]K07W>0!;K.B
     1855MFQPI>5%=ECD@MB7J-G=3S]/8VV4[GL(#KF&$'D[BRW1G\GF'8<(.^92#DW;<
     1856MU.38&!Q6'1?:A5,>XL)Z$M1JIJ>`3`O3!,)*79=M[J:>AW%49]2E!6#U)$;#
     1857MTJ0=BN3@&*LH6'<V6(8[UO`SKC2CA34U\S#MF:(@.)HMR&)+C0)!>RD\X8XV
     1858M65$')].$A?=$>YB\$QZC5C,^T8IPP&%8:.>ISJG3Q,U,G#%QK%Z7%T:ZR^^R
     1859M0>;>4K\)?;05;[.P$&^$_'9^-YV[FSI`H0'A4G4@H-0X[W1Z1!_ZG2$K\,:^
     1860MX/PP\FV>UP&O?TAJ7,589K*\L\G-S^8EWMG4!26:@DLYEB%I8*E-W2D&)U4N
     1861MTL`[&[[F;%8AQ"IDW=@4/\_:PT*:BA-7W==NYGD:&_=KB8*SR#<+YU#9`A\7
     1862MSN2A2;JOK\>2E^,=YPC1J9E-B&+\.1,C1L&*<T]BD/LC:5P,7:=B]3/\W&1#
     1863MO:Q/38:7OVM<#%9ZV5`7UI4CD<-"FEKO&?EV,Y/AI@<KI4%3<[K\VM7TVS*,
     1864M@)-'?;GN=:VK]D[Q4R.OD:/=%M*K!E"3>?+074UOD+/$R^.SY*@FH0LF<PT_
     1865M[%=5FQ"E:V1)]L<^X2T-C[TL_)1_@SH%$E6IC%GW;1J&,[(V>E#JG+@'C&SA
     1866M>4FZ>)0]G)"^JGKHO*SL9\:N]1//<UB#.=P2,F2+[N!Y72)KL->ZG5UD-#TG
     1867M<C9NO*-,D7"-_4!14*90)MG"=%TRF_87SIWKH<0LK\2E">,-Z0!_?[,MG`8"
     1868M.G4+$UI<=B4*UF@ZL78P8YUUV_JIB2NRQ2H(TI6%W2`+':M%=M%U8;T]9%F@
     1869MRY+&_=3P9>2N,CC06/ZYA?6D)55+B6#!M&(JXC#4D#DOR6NJ<\^#^'L3N"9=
     1870M84DO"8K&,EQ6W8T"%S@^+LF6"4T"N=+0N1&:VN/*I"1$>FT+P2E1JN$DL>]2
     1871MZ6PBEQV;"WB3DK^1,])U;CJ+A>\-]K7QANT4><6&E,37RX3#NY0<?BLQ-JPG
     1872MC\HGY]*Y*QRN-+:OJ*4AOV6E*BZL8V'-*"ZL:=\II27,NLC).G<CJ2PAE]HB
     1873M$`F-PI0R+JS3I`^J*6+\"FX4M,.0JBHZ=U]SMQ7MN[!>P:Q!ECI5"^#'2W(\
     1874M65A(1W%FN0RMSI5P4"%!'5F$52Q-,\CI4=E*3]'MWJ,26IHZLY2*72I34Q`.
     1875M31W9I[:0GJ13J_N2;[\+G<5FX6!%03@P/UO;0><-G*XK>B*^%R_ZPK:T)*;W
     1876M><5=!F4-:I%7X#I=J7F4<2(1DJW"P+R>VGY6DUY"[;*F`0N)^DQ=02,6Z/>D
     1877MQLK6U+D3YDXK/8VW:4.E]:[4E'QR:^N-=1VXE@5O3?+E+@ETPSLSWH7Y8UQX
     1878M3X6^::D[NC\X<S4*WLL1$@5OMOK'#>V"J><!L=@@H,W9(E'0+L&<K'ATKFK8
     1879M2ZBBUU2XU;DK+TFHU@<2K[BJ>2RTJZMW0E@N73H(UJ689TBG;I@ZKY(`03Y,
     1880M=-04'ZY(="S6@_UY7=YQ9-V=S?9?1U)ME+HS^&A)TO2P%NR[EE4NG*2YT(U7
     1881M#9IF!A=SU8R93B$X3QD7QL)KRAN.LY/++FLZ1:(&W=T12LK&RT-5K20&]TXA
     1882M.&04->$TP849U/U"OXU^.U84:E+K`EVW,HQ2VMP!<[.8Q%03?3HNVXXH-9!M
     1883M.\(]BF,3%]Y3?F</S0UO,N4$5Z\/:'-P>0QRW2ZUJ=%4,5GQG7G=6!MBI/5+
     1884M)K@W5JV,A32)"<;<ZR3U28L!S,O2+#@4KU2K[44W<T8D7]?*`(03%4/5S4B5
     1885M`X?&J25VX8I%C1=+Z:2;ET[CRJ=;"',TJBQQX5I`LL*#O^;"-@>K'4&_Y".J
     1886M<Y,59_V.?%A,,RF-D[/$L:PAJ:L\D4]M66\S7T]%7(VYJ1C6=!BOFC5$.5G5
     1887M`MYX-!5K'+SQR%?$(8&\\<@)M&A;O\W=(?IUVWCE45+75)Z$$@@@('%A/2<V
     1888MH;)0V)#5%?0SL]K8-%\@<9$&=9;S=;5]1T5\<[)]1]7SKJ0Y`F[NC'!Q-HF%
     1889MA35EO6GMG'F=QU#?'V&=JOK*@76\5!?R,Q-WY-B1L)">\KCE\B<X2B^C@N51
     1890M>]*-![]H$KN6GQ>1<"U*%!?-.R[;>_3QJPJ65)VQJ59$+\/UB7]/,G8BJE0O
     1891M)PDUP8=>5BW"-)'_D"<P!W/*D))4YZ;K*0JIYRQEPSI3230N'1#XUA3.37NA
     1892M,GG!V"TY\\IE]`U%*)3;^GF1M,'69=YF>5**;KL,WIVD`4TI(ZO'F"T5OUB;
     1893M]HYR)1,P!S/$A7.(O#7BI:]O+F:ZCL'J(-)UT:),?F;2&>=0$PK)>\2.C+"P
     1894M)A>!;;.,+!XC</G1V`0:[DC3*8PK`506F@T;019ZRN,2T83EX$HY@O'%9_2.
     1895M\D#=*,W#Q[HV+;5'TY:FQ0KF95V9B&O6RAZB*#\EKYG,76!(Q3N.MK":RVR1
     1896M<HG\&ARQPOL*>=+9J!9R2IO&QR5U;?0"&96C?WAK4:V_4FUK)>0>J9F2KJ=4
     1897M;60+)0:#6N/]W)'HTK+'Y#6VL9$E+KSG(2JF#".WW,SQ='UQH'V\XTVE<)9+
     1898M=J$=(AMF@Z"=.1@B"-IQQ0<MM"FO4MVR?NH,LU/5^(6$E'O3,I`'S.*98%U[
     1899M-64X(5)'8WS\U'0:4];*2UC<H.UUL;8Q*\^DO/"ATAN<>UDI%V5ONS"X7JJD
     1900M5B24L90*FS2P7ZIFD`NT9ZXP,"]*&H+(%-BK[J!H.--AS!STQ;N)JJ6GI)X=
     1901MNKYZM!T443E5-U!$J28-7O93S\,XY=.B>XE^F<R?F<C5P:E7O'_(1;&2?M*Z
     1902M+M<PXN2F)IX8.(8E!D&CF3^3YI9RT@OKR<F')@?0>-ZZX88UQ=V4)9X+UM%*
     1903M7F.BI<`NI+74LB`=+S,'^ID#Q_IKEDZBHC5)73OSLK"_?V$<2]60%Z#!S&8A
     1904M'*@`L,X=M;(NC0R7T:;X&%PI6-98))SU2':@+ESS6&4Z/-ZH@T."['I=#N+@
     1905MW4*YGAQ?S+L%SIBNP;ET72I_X\[75-.RZ-P<?<-;ARK:+&FK\G5>\4]E77)X
     1906M&.\6*M$8BEJ/Z4E<9D?G)J=_7+=J2QHK10]*B^M=<IV'<3+RQ2SQ6Y"F\F=^
     1907M;O+[-WUL,UY&[@4NT!>*+$"RRE4T=PB6\3RO"X<:Z-0PJ:ZA;8G]0:>R$NF8
     1908MRBF.R!76@C*$]$K#;DI%*IMPPI2U-+@0GRR;,8Z>FH;42,':<4I6TN_;Q'R<
     1909M@NT2LN!0]^#G&D96']D`W72Y"X5!C9S0=>QF6J"DN;8"Z&3NQBR2D@"+;8]K
     1910MOD4U18YRRIR?.,'N7FU_D$F<L_@WPP+"<"@];523J"EI\K+]<:&JJF;'8^KB
     1911M5#GR@2RAP]L5*!(']Y+56Z??YFQ5A>=UT=@(&IR"E74CO%IWDHXY"R@2)T56
     1912MSL+">03KP$S/21SHOU"F6!*E)N1*X>2OMI8R:7'[WK(1$TK.8UE$%CD$K:&Z
     1913M+I6:()./<ROEF>"D?DT*+W?,,L'%WF[LA@A[.4=:=KY>_E=0B$C97QQ_R_7V
     1914M89E7#;UQ\48NW$[MMI+RED@V_1[5`DHSC:5_1;Z>BDRW>OM4O\EKI0UQ<>N7
     1915MJQA&&#+S*D6W4)Z[+FB@`(VO_$IAX9R70J5S=RYX2DW.:K:B[8-D,TOZI)D:
     1916MV\7#PKGS40E!$&E255KG'G1TZ-[4F;7"-#EIF&GI*A=QG](+!*ZKL?`MO8HR
     1917M'\UMT.%SY$B.A>[4Q(J(O5CA;)7WR:B/DK;VB#4]-6A87USG#L":#,*<?<J?
     1918M'\;EK*$BL6MY9_[F_=%-G*#1M5851W5N5,AYM&SE,6)'U27UH-/$5U/!=%[F
     1919ME1@XUF58CNO.USHWI1OG9"9&0B(TJT5+3ZJ7JV#-EG8M`DJ(<7`0?W(W-9ER
     1920M,E?="0OIM"JKA84T20A6P1I3"P&@J\9A_W><Z41.14[4'D)QF;5ED0L'/R^$
     1921M`Y<\S/(Z*_E`?DH:L,ZMR1MT*\,(L2XF[5H_:2Q]\R>F%AQ5:3RU_5A%8J5/
     1922MBD[=D!`<['M3>I+9D>FG)>XM4Y;2*6U20G!6$S\U+*LK3'FLL7$TE1[1(R6Y
     1923MTO%DF^>D>^F30MG8*C3ZN2D^[EK^X(7VU$`M0A0]5:(EOV%N=KY*HY0I0EX:
     1924M%NKFII"<N$JG#T&C:RW+>3F"U@^<5[6JW02K$2\]YI1CU%W=G4Y1.=(S99+H
     1925MK$7+X0H8DOY&/\S(:UD7"`Y>;]6S?5BS)5)0SJ2HP7IN4*^3KAG[U,+#)0Q3
     1926M"X_!SDG^KK!H=C53^)DYV;AJ5#QF+E8-O4XJ$(QR5U2%,,I-22C58E_\S*1$
     1927MQKSW35D>,^F;(F9HZ9L2TB+."^LIO29-:O1SHR4.AX%(WY2T.O@LK%=%TH7T
     1928MJ-9O@Q(^+NV$@VXMW?(Q^ZA:BKY20(@6Z*:!11DY;A8I?Q>1%;4,L83X9(;Y
     1929MAC/)K%-65=T._3R8SVG?E+;B0-*ZSIQ>*GU3)EULJL]90Y*.HCBK2-+J/S*7
     1930MSKP\]-/$A<VD;<KD&I=*8S0^1O/L^*GI,"Y/@O1-H8PF#6<"VD/+@:^W,A),
     1931ME0'K96=3IQY<%6=Y1J5MRI3');N!IEH=6Q;2>16-6SBO;*DJ6%W:M&903(ZV
     1932M35G:W,*6A:.%:S8/#Y[>N`H@YKNRK#.%I76;FYM48;J,Z#C[9NB98E'VZ$92
     1933M@\E,*&-;56RFZQ:CPQOV56F:$INKE4&-3RZV<6K3%,XCD)XI28JKEW6=8>?5
     1934MN5'@>*%-T=I6'I_&UF@$%6B[CX88]Z9J%?J20(/7N>>)E*8I*0W-@(PP^%9)
     1935MVL*#6A8;(3JL!`VTCVB8ER3(0><F;P=ZJ&BX981Y4SY<AA>D2\N4%&N2AW6N
     1936MKB)M4J@&N$M('Q2;HRU3YG?K^J$0PIS5DDL=/[A0#7\;JP2H?5(N;L6E4_>E
     1937M_LY[E7.NI&?*)#_1OA-%P[."L)JF3)'54458+MES%77N5?Z?K(E>O"%KX67)
     1938M0NCTPD5*!>G4M"9\1%W*(,Q.YD:`#JT&-U=8*!,_E?!`_'!D\591TY>J154)
     1939MI\$ZUUI7G3B``"X//W"CE-R%5[6(H!B)N=F9H2)V_3+B%JD*`?;]T+DC+P@9
     1940MYCBR4-JF3)6NJ.N&VH>DI5I4OIXT7`T1Z&!2XY(T=>X$09NL8=EU^8K()+`C
     1941MPY8ZM:K3_5A=`QMZ"XY9'UIA=E!\#F.9@AX9LEMU+4#/$S4E=%3",#:50B)4
     1942M)]<N1:<FT\[%]K^%,)7I464C$F,OTCDEH?45OT;F)=!N*?.(+A%0YZY8DO!@
     1943M=Y3T39DTQ5*$Z*X3\LG:$8N=`I2PLJ0@K;4P*#R'4HBM8B7&YJCV0[H>?6B9
     1944MK7E=V/HJO5(:5Z^7'B0Z-;')S%Z3(4BU)KX-;JHBRPX#F+5EG<]H$CA`]SIW
     1945M<,HZ]SJ2@=S04K`2F$<MDAM1?FL5/L#3<I%N+A>79I<V*8.<DS)WO(PI();4
     1946MI&P*?UW%_AI?1RX/JTU20K"F`30Q5Y+4J>E0YG6+@\VE80I5O+8UIB#(I$4&
     1947M&8VHIA2ZOC@X?AC:J.>(7VKL&P:VKOR`:D>Q1K+P+6Q36-BF&+04L;56&1$Z
     1948M)(?<+FS#9#IBI.5>*'%5^;V0PB$/E^58#4<HJ@3DH>O<F=LYC+D>UG")VH:4
     1949M8-X3[A5B4A'U$>'WD"8I%.$C)DR=F[@DAEX:;D!#5W+#:I<R2:\K'4Z!A54;
     1950MO=-SIWH>WK1'BLY-YM852"<8+ZJR$(Z)LY*+S!.J;Y(RE7"A%;CL;@,VT5'1
     1951MLB5+CP\JC2//"JM(`M"B8+K+Z&[0$$#ID:(S<^>X2XU]:"G2S7F`?BHKGSRM
     1952MZ[1<JG&-GT*26H#]W&A8M1SJE\Y=):X8+4JL<5B`,<#6CTK.#+$`TT_+%$!D
     1953M;HK0D:7LU-'3=TNIEXJ8:)Y25/>C::XA;0QHSM;BCC7%YZQN1$"CH:"_:EB!
     1954ME,EF05?<9R2K?31`H6PJ/U@3E)$XFKQKP$%`B]6F85=HH#*J\BSJ3,(E7E:3
     1955ME,F^U7CN)Z:2XRS5+917"SOIF4*EL*0B6K!VHPO?L"Q'"UU*Q%!U;%!XSM-Z
     1956MIJ05<4#/H(/`?ZX.$](H93*SIB7CJ)5(]3UDJN%-:F1VB79H.\*5[K1I2DBN
     1957MHPRJ`UA?D$KFLRS>!3\S>@!TZQ*"<"T-4:-Y4]7R^0'U***X%[AU2Q`QF"[#
     1958MI*TZ=[/^.Q2+5-6UR0U76I6N*93H)2NPFH=A?HK6X*ZBTBA%YR:AE7H]Z(J@
     1959MAKOJY-2'Y(J6D(*N)<'UU2$=-5BG$#<SU>3@R(^^<`A5VPG,R\%IOG7-6JO*
     1960MFW0S"Q<`0ER&0/=(YK8<A80YL:S3N!"E7TJL8^%3LML*U*6R[RU2+G8\Z=1A
     1961M>9H"!V`8G89*9&)&@/IE+1XH0('=R7W]^BHK&U_GYK8<W%):6""U3[F2&I.I
     1962MU4E4^W%`K(IP/310:=HE+&@LQJ`HG?E5I$<%H;XFH_*3MMVI5+CO$82,U:A<
     1963MGGJ@Y+JZB>C<BS]28JG[TI1)RA'_?5TV+@C8^'**.LJ*Z+%<;[+PI<Z-:@"<
     1964MSIP7`@@_>DJ[%)63UD,2RK?S14:'/!XVAH0GZ-QU-4$9JW&BM$NI,=I7)-^O
     1965M43QD+"9]*1*9E<B9I(VN52LCO/*MR@V"RIHR5VW4@+8GU3AMQ%I(Y`L-+E3N
     1966M0>?N'&4:J']B6TC59>+&&U`&%F<P2W\4*BPO-I3`A74E2LQ:H`S$ZY1A1Y!<
     1967MRT'#=]#S)&A+"VI"WH)1;?*`!K5PTETJ>BESETMSX&F>7E9%%?RL%^GCLA1J
     1968MZ9`R^=80M"\$G.CQ,=&OH+GJL+9P$/V,=%!%U:K-K&F>B[,1\[K;5G+CNASS
     1969MB.O<T=`F?)!TOL9=O2U,*.%-7`8#C;.DP@"Y@2[9\\C0T$SD49(Z#`<2($3*
     1970MI1J%W#4R\]55@^R.0>*ZJ-)CU47GQ\[-H")KX2-)S5*2L&=X=H((,R0D<2I0
     1971MQ57G,.Z""SZV&7_GE7"J&["@,0!U<.-@O,AS#]AT^._%9JC1'3NSZ(D(O9<'
     1972MHA6[)F*I$$4!.Y0KHDT021[ACC.)IY!@NC5A'-=JD$*Q"0R=$F@6XFD,&#$[
     1973ME:,V"^ZL'.","RJ[)HM,Q9!"DE6N4&S"ZI`RD4,&HYNXX[!7+?#ZD,=D7%&;
     1974M+O'U4,6<(N29.-PZ!F2=I;)P7]9>9:!M50])^!R%.^:LZ<5H+:IIEN1K7WLS
     1975MKZ)(]%?FZ@/P,^O$E3T>&L>.K,S5+85:A<!G377JJMK3*.!Q97$BK9E5/D2I
     1976M0+:PN>=A[,1`O\CB7:\_O_UIOE-YT)BY/(6N'TL.PM]4H";RW[^C!^R`!8+*
     1977MCW$)IC_KQJ-P'8P"%']1@D6]CZ<[S9[V_//O\3_H'.D__M"_YR'Y^/KX_"__
     1978M]X\__2_O[__ZS__M/__W__M_^8V:P[8_VR_*?_SQUW_\\5__^?_X_.__^B_?
     1979M_^7'G_[KG__#C\__\O')H(\??_KK;S\F[!_"/_SOX9_^MW_X\>/'?YI__&,D
     1980M)SLNXC_](U[Y^?AB0/JG?WPGR%!(_J=_?,;'5^2K,N\_UVH\OQ1<`7Z_@]O\
     1981M[5SBK]CXNM-<]2M"K$[XL[Y'*H[^C(7`5#@<?]9WVMKQ&?,7G(93F@&<(I1S
     1982M!7@.H=X;SYCFD/GHJ:H#3M+:9,2`U_>I?[9GC#0+-1#'B/Q..=(71I3W0+8E
     1983M#*'S%*X)#S1C+FU@2'X/5$8-0RB>>JKT&#(1H-Y)SWC1[.ARC?'IO4VM$,/S
     1984M>\4LX0L-S"/&HE17?89!3YGJ\\#0Q!W+,3;/&>K`X(D?'7F,IK7J=?ZR8ZT"
     1985MX3%_23G[';]+[W-3\.\FTGT*ZOC=G&,R]8'?T3O6UIZAT1S4\AF_C-QW&S]-
     1986MZ(>.7\Y9TEQ[_'+.0NF]^.5\]4D1GZ'RFT^%`+.$!S6*QB21&W=CEL2MK#`+
     1987ME1^Z>)(I]?:<,`FE&-#KA()O.>4Q7M;P3EW,,4F<+S^%?4R2N"4[9LGTZ3-F
     1988M*>0"S9BDHB-?>(:,14ZT-^9\U_M4&R[,%][#I)B\F&AY$3!=>B<6/3`?3=T+
     1989M8S7?/E9"A78>*=%S>,+;4Y-@S'AQ,V;,&+BC)J:,[]2?#C.F=RI>B`G)NW(1
     1990MXIDW89L+1S.2&C?H@T<L!55=H-G)QI,(QTX/HB[/F#N@MS;FCMS?').G]S@Z
     1991MIB;1OR:>NKQ3HD7!U!5-5N=C`K]$B#1U&.]YJLB8FIH4=\Q,,5^#US6B:3IF
     1992M3NAECXFI2E2GE:<3\CZN>2@"'Y`KTN[!`:'&M'@&6#*>0?8D:I2,IUS<DAJ/
     1993MF1^':O/C.?%]X`#@9%%6<,!S.!2^XT'$V'(.>!#(PFC/@?>B[K=X4G^G&@+T
     1994MH/F.<VM>O%`7][W&@P)W&\>3XGNC@X9S&:F.-)XS-P1Y1?$<>F9K>`Z=RRG6
     1995M/7$LT3X6CVQHMHM']CEB[>^`VM&\A!<M4,8#`\>^X)$1[>7Q1'IC6@><Z#Q%
     1996ML2>?YZO/%>QXVREHY"=.,W6JQ>/:>VFTJH46FSK?T-/F@ZG--)[&47O\M(`F
     1997MZGA:I$V>^8.1.E/GMB4J\&C7)`A,`VB3T>,JFEP^F0)0E3@\F?"A+UZ^T)HV
     1998M5'S#^?YDD2KT;%K^N<<:GGV]QTS/"_CDB>@8/7OB45H*3Z8=.5]X."F?8Q[D
     1999MQJ<Q9CR]XL_P!/]`VUD\O:(9+Q[>T(EXX.$3D1YH:2(0*6GMH(M[EN/IX9VR
     2000MT^CAI&'UN8$Z/@0UO:>'HXY;?59F-7$N`A.<26/;,S,:DY$`C4)L)`&-BG[`
     2001MP**]4S45(-$G<9H_FSC`N)HZXW#1=Y]G?&!G4*OZ)^A4HF4!F8I4<O_)5(JH
     2002M#ICC7*#)9,`<4YR4BUECCXE1*-QW%SA4]",&#NV=A"C@0!+VP$&:R]/6]R=D
     2003ML`@X(>D)FI9I6X&D334\8/WAJ9TD%4QX"O3Q"7HV-\RDYLSU,R@H^J<FQH-6
     2004MZ,)NP.:I$;1C?31L1?IHN>.HP5:=+RS&Q&HJ^-@.@2HU!<)FTMI)0@JC-9GA
     2005MDTG@Y+?ER13P(DF"F3?)'6`/$:>"[!?$@0F5PAV(@4J%*Q:8T&+6N>SC:UE'
     2006MX[/S1BJ\+NPRZ$]0S;G].Y"9!WI2',*%MM'4J9],-*>6FIYQ':O8GMA&;;XK
     2007M/MND![Q$B;OA`K$I44RI'7B5N8M&!5Z56T037O.'9#<FO/H4!^8[-/Z6O%NN
     2008M=ZI1]V0:.\\>OA9);B-=A!61NSA180I;8P]/?$T(4['2!HZ$$?7C!1:9^P\#
     2009MC8)>S(0%PE@(A\;-O`F)SDW1GR#!\RD!FW9^1@KZ)#0F1G6JBD^FOU-](2SF
     2010MBI6YP9]\[GH!%9J4*0*1N0]+XJV;N"DP$"$K$FW=N4;4JB80)A7<@!"9QZ]W
     2011M6@U\Q#GIL^`C4BX<X7&A0E$F/`(AVK%C(A<&>2Y:D'#TBBQ#1(->/'S>[E-G
     2012MHL?G]RFOT6XE1&()>'Q%EVYZ?.->YD_0:0HS?X),I\GUGZ#2C?A`Q,I<5Z#=
     2013M2B1ZU+ZDM,X[-,#NCH='VJ%7I(>S*(.OL.30AHU-+;"?3*NIE.Z3:36I*4\F
     2014MU=2W]4F4&I4&Z?E4%.6:J#`)*!=.VGP+L,+Y>&K62X^,W(B8'DE/[_S,*<Z2
     2015M0%>Q"A1[]`2!1@MR>B1)?*G2=Z>GUT0B.+-I6GILD50RY$OJ5(MG3LY!)WW0
     2016MT]$<F)X9N=DQ/3.ALS,]<[[[F%ND,/DC"1;$F.6SA'>GS4*TF';UW._T:%HZ
     2017M?G),^)07FO?24P+:#]-#2"8M'8N9N'<T/2;/<]GQ%+3Q'O00(C>CT[$"#2&"
     2018M22\[?X$OCE:V\RD037C]+FX/3(^!J)J(VM+GS:0:%%K@3!H24=-W*OJ$YY`D
     2019M.1J16[*WTV$$>:<2/_2\0CCTK\%-?&EN$D&8F\W'U!@P-7W;!&860$>GW)GP
     2020MF$X[+N(Q4YRK3_#9?.&<4_?;.7<G,86H,MAK(%)([T(-C&GJ``D"4T>TEWXN
     2021M`I<'G;)`NEF9?(E/3`<IH5:Z<\).&R+2A!3^G!+FFQ)]:]BX)#.V0&0^(*F'
     2022M="+^+O-</X'^/$/8!M0;=T[8T(MWSM>Y)_"<#^U*`DTW-UCK1!*Q_!>O*0CE
     2023M1;,EM/7&K"%5^C:3JDR>.^<@8:</PFEPEV.:9.(Y"N8([X,D3L*2&F73$M.[
     2024MU"\NDIWG#`U<@A@&"8X3M3G#>)]G$4MTH:7S$XA-`8:.'4DL],/*W7SG#]O2
     2025MN=)\.:H-,7\XN*OR$]^#&D&#<`3@7-"@=_ZNH@/P_-E4@$FLBA.%4B<UH^\Y
     2026M/SG>I&+%J=AO)$)5T1QX#FU04/.3%I2Z(L_?S*-%[T%[AW2S]$6?E39[_"+Z
     2027M,^;3Y\\FF2)$)Y&:(^;8$<@\,,>.00:%.7+*(HW6A:2P.2;1Q[YH.29Q&;2<
     2028MY;VE=F%HP":E(40MOC)Z_-(K9O`U(GMSP;\26O;B<?/,3#KS/E?_^DK<8/?Y
     2029M]4ZY\U\177:YR2Y;,099->9\J[?NL\2OU;L3?\YIYB$*$T;*<^"_"3C/2[D`
     2030MGN\2`49<!:!TL.=LSSPP,15A`3QPGT_`(]YH?MU.LTS.3`-(ZXS$/^>`R:TN
     2031M4J%H`#$"(K6Y`;M>>8ZYK>,D230B<%M0C)AR4Z7!%4^GIDTT.@^20N9^I^$7
     2032M>A5B-#T'R,[AD;O\/N=VFDBE.+?['$T-FO##1H\,4\YH&!W>IPP<,#AR.^!G
     2033MSEB3.0)H93H^Q$KG3^?SYSD.^.7%O1#Q4WH^D:>,UYSL<#XH898IKW3\DG()
     2034M@."<8XHY$;^#E#\%-?IA0"-3_(Z$QKG?,KXCN70Q`ZPCF(&4!C#G0K/%1E0W
     2035MTWLU>EC"9Z0*?9@AOM>IA#PS;X!&5)+F:-AU#7-T-*^B.=!LBB0EFN5"QT9,
     2036M$B"=%LP2N=7Q,V/OC#D-)JPDMN*UT/:AT3)EX$IB'4V8![K.84(B\\3Y`K\X
     2037M/69MNC;I9,*FHS8+F*]R@Q+,!U)4@."<&[:;.1]M#-*L:;X+G20Q7^#VKI@O
     2038M<@?F9\)FC22ITMSS^&=,7.=Y35C_C%(X/&_GYEPT,1HD=484P3"3N]+$@?O$
     2039M8N((8>69&@X$67EHZH*&.]@3\S&ACXI5I2]:I\)`<W<P=BSJ?)<I,`W,?7&K
     2040M2\R-WIP!<T?N$/U,?#Q*Y[5&Z67>`O.]"KAQI$>.&OD5&C<\PF,Z]Q6CY]#R
     2041M%=)=Z#D7[7<BC3A8<P'GNB8<+&I#_4QTKE"2',^9(B=9/>@YA;M9X$%U?IK(
     2042MKT-$F,RP]!QNBM3H.=0GBK2;A!-)VB,_)G`?73PG<JOK9\I"O7@1Y_<C&RD]
     2043ME"V""0\MW#X#3Z7MF/',1N]`?+WCG:D_&CUTOO-ZL0O]0?%`8JWX'9_D7`AO
     2044M)JUC;5V4Y+WPO(SF`WA<H4X=>%SE#C=X7.-^47A<7R:D!!)`@6@7'GF1UI3P
     2045M1-(W`DT#&C#%SOEG!!4C,9">'5'<&@^'[2GPRV9N>X#G%Q21"7A^I8XZ>#I9
     2046M[J8RCZ>3^DJ6LE1PWJGG(AX_O\+4%0<>'Q[87TP_QE0@4^!52!U4(!,YOS+O
     2047MI,2%Y?%X,DF1OD:/+Y`L\?Q*RMTD0_3\QIVQ\/Q.=(!$[<SGBT3@Q"0ZT.=A
     2048MVD.E"('!9%MMTIL$TH/7)%P"Q&/&A4[@W/G`A6-V^<MCGV1>#)+ZB1H3,I7;
     2049M"@&9AA9=P&7*.8$8>V*:/_77Q%2+VKX#E8"(>J""?M53+V%6275H@4J8XG3G
     2050M31%161R($+N=9`N(D'`Y%B)E$09"I)(-`GN"%JLV+`I82*!O%1<C8D2N]](+
     2051M(Q*X-30PB=R[_1D[^.U%/'LB=7%A7&`U$<QK>2+7.@=6),A/)9&0(DF^D*F"
     2052M*"5:Q@`I(F*TF4`KT;@,2'7N"$A8H7T<,:8$:DF=<(%5@",62$V5FH0TB`.H
     2053M:0J<*.LV\.[ER$Y0B/E9IY@0@5-"ZP&@E+DE!W"B5`7:;(GY19H",N'4WBFR
     2054M!"AU-"@DC-"7#HX8IK'4TPPX!6Z8#:PB-[0GKQ`Q#"J-2ABFR7')'DX8LF)>
     2055M@"'9"Z_**$;2W5L"CNF]$0<G%&DUVV3L"?1Y?OH$%-&;!Q@V[NP&%'%*,U"D
     2056MQ:1VI4"1%(QY8"*+/8UT.)9ZJ&0:^:30B#XR,4^#2\`"0^X'6H!A0.5N($B^
     2057MP0;\$`)_`;TIQ090'V(DM3-ZE1ME`3VBZG2(";W^3JG!A!VQ^$&;CH@Z&AH#
     2058M.U(,,KE0F*93]#\YOB:F5$<1B"*\,&`ITX`K!'A"U4[\M0/*BP/3B(+ZP#2A
     2059M0C2?BHPV*\"U<%LBX%K1T`NHDJFEX%"@>5O'!B1Z3/EWP)6_*5`-:(<.3"FV
     2060MI,U3%B'6%>*XA&F'@$&84AE)<)9"2'<P[4R[@AIN`M%(>R@RH@E-+X!H1B\8
     2061MX%FX=1(0)8,I+6\'[8Z5OCYS$=(:"5,2:0,M9&%A=#)?H!K0J1V8DD:7X?F#
     2062M<I`;#A-*Y)';@M">$XYT@?[19N%=GFFS4"5K(`YC#V^&R)T*@/A<AG#Q`I/2
     2063M"<\=^`\[)\%^J#L:\&[<<Q!X=V[G28C3SJ;VN4!\[NRI^@-QN*O@)^7V[@T>
     2064M3E#7WD":TER5LO"&K0KK/;=.)8<(H3WIXJB\W(&KRP/MB)JH3`82FHL`[?R@
     2065M/CM`>^YX4I,BV!:5'(I`>VJ%B5R]S+42]DZ&.!^(^(-KU<G@(WA6RD0Z("Y3
     2066M3!%Y^TKB$G=`O[Z71CNXT.>@$J!`OZ->+:%/;W(Q?;B("!<^@AP$Q*L>N50R
     2067MT,?G!8'@QB8)Z!<TU`+V)-XV;!:(T*/!ESW?9"JA\%FCGVLBYA&QGZAE.%X@
     2068MT&Z&NY+8;X!/!)R.ZO/A!6BO=AS,1+8=<"MZE<!\(4'W`@-'X6!:+L(_H*8_
     2069MT"<#3Y\2902#)#S!'2>G9+=\)B\>KWV5T\#,$90[,<.>6F>,$"Q)3H_@C537
     2070M!QY@]`$G`V``<XQDSPBL"UPC\(L4+C*(-R$GVI4@#<TO1"'8>)?.=8+I9>C(
     2071MDV!&[S)U+_*X17#5N1I\<B.:<>!E8`VN>!=Z+U@<H'[T/D!BJ,U6ROPIVI2>
     2072MB:!&O%<MV$FDZI$%GMZ%R&*?2QY8_VADOPVL?[1&/HVV]/H,<2;-Y2L%9(C*
     2073MWE'=3KP,$7'RM='+=!0\II>96R_#*T'L^)W2NO$R\W.1:!S!C4GH9BJ4N*\.
     2074MWF8J`R0;T]N4]YP2@A[F%YN;$.$*\X-!.(R!-:N`MP%[(T-08&Y,#>?Q-I-X
     2075MPM,*>T"&UQ@*3V:63S6M!K/\^8)Q\'&9'ZZ1=YC>:5)[<L[0.W4NX$PO1;6"
     2076M@3TX.%71QTL%;A2!EYI";XS@5V"*@4,\(&>7PF]5T&$.;T7&5-KK]%ITN.8;
     2077MX+V(6+>&KP064P?\Y62Y(%=/8`6KY8%P`9@.>H2;E#Y>@%@UWRW#/PP)-,%E
     2078M#OJ;2`@C[Q>]72./6,3^(XI.68/T>J#H(!$-9*0A&@+L'TTP\((PKG)H"YCI
     2079M)&UXP8Q^8'C!\CY58WZ_RGTG\7X-+5SQ>F0K*XCHH#>=M._"ZY%5'!$59&BY
     2080M+CC3Z3U3*@@'@/::`E,\,I?$`JTC+2,YO2>\R^L]IV`\Z1)>D_8NZ0+TFK!P
     2081M%O!R%*X>:V].1EP7T0M37>"=&:=`,_B<T2KC8T%VH'YG>,?"W0'QCA5]-?&.
     2082M4Y0DCVOH2^+!%YRO2SN"7I&TV,G40V$YL@3X%N?K%K(EAV40NA)_R<E[QB0(
     2083M](9$$,AL3V](!O-"A&+@"\^CS5^RT<DNV*F0E2)][0I9:=!QIG>\V"&%M\3[
     2084M(J2(7C@$?LFI-(';0NZ@AFYXQ\+=#_&2E1N'XBW;Y&<!L3'SA:=2#F<^G59J
     2085M*X_W1,1HPVLBC+7`GUQ0!8IC1LJJ#89WCEQ9#B^=4*(0[YRY#";>F1QDN?!G
     2086MQ?MC\]+K4^PQ7KES_71Z92K37B]F!E/+J(L9!&';)+*\(_"&7CFA31=>.4\I
     2087MNO#)I-#WQB]<']09%2_<N-\PWK@OZTA@@8682X"\4HD1T0N'J8,%!++,=\\D
     2088M4P065ZCT&5Z7"!B+>0E)JY"<Z<M/00S,@HXVF'4#C29K/MZVH0PW7K:C4#R]
     2089M+%=V;Q"6(->3"!E9TJ%/%EE#;_-KXW7)6#`&>!_8SXK:F@>[98[<H0\/FA<J
     2090M"_=D3PB%32;T<0);!VOL<`(3H>X4!A"BR/=P>]+I+HB18M-ROTCKGPM`E"Z`
     2091M\2=R4UU\BJ>N65ANF6LQ18?*"U"XJBX6@,SRJ2$B+S4N/(XEZ/!Z@E;1<E!K
     2092M!RP!BQB073(\$AR[A4XW%\>1D0Y)!KG`A@&JD8\U(&Z<$/U#DM_5./H'O79C
     2093M1M`*#!:)?@K+`#T)X3\PGG2:'1)37(YPZ`UD4V#3`)4RPPK,$3'R"DPUF&PG
     2094MM`)H$U:Q`!G57?'^A2L*X_TK%[?&^S<2W?CU(?P$Q.T1\RZ+CEW@/P5O'[@7
     2095M$=Z>;3?@11D!`)D/.7D>2)4*;(XH1*H"VU\A/H3,6V-PC!"M19V,F]X?^K[L
     2096M^VL*=A61,V3<C9E<L7,E*@4S=39#4W``+00),KE"Y:&*8G00:24BEXW$4J1W
     2097M>$%I*>!87$M1N+`REJ*":"#:D2@%44VL12<%&6N!'4(<)4)8F\R2#\,\N)&E
     2098M#19J!J+N:%5:SDSO,MI38B'*//&\#)6;(&,9R+;&D5*T(HV<9X$M().#(Q"!
     2099M38P(E@)KF,K!DZ6U23$I(`*;HT4F"L2H4X=\,C=*+@U"%TKR];4G$LJP8ATR
     2100M"OUB&0K7EL8R5)0YQRHTKKZ/9>BH_$RK0"M"[4VP##`-7`B'HS-#N@LM`YL&
     2101M:!$2R:F\&\B2AI"ES+N$3-@!5A?J_8QEH-PWQ(1D>%]Q%.BT7-=%43-$.7,B
     2102M#WD)*)G^;"RZDD+!)FVJVD6+@5)2<2T&2?,M\@$)#ZK]B,6([XC?HL5(7(\6
     2103MJT'^U<!1M:DLZ1OBX=SD+%%CKUR#EZ,_%AV`@%@NEM7H#'5A]0$]N;`>Z+)6
     2104MP>PS_*4([<()*AS31A)PN!"SA]UR%00W9NS/B.`(DIJ(#`W66::,W)?J%;`I
     2105MR(!8*6:`%N<*\(63OM)(>>NT-E3+#LL!MWGFS1'>YP#F&&QSP'(DLK3R$9F4
     2106MMC?>&Y/ID/$P+GF2=`=:C(8F#%@+(GADT@D0)]'F!HM!#N3,[`)!*8W91>1V
     2107M?%@-BOI,D`BP:7I#C`R)&R258C4J.H)C,1JIW40IX27@H"K2>2#EM>77:>1N
     2108MAXD#86[0"R;39_]`)`<4+4Q'63=:&*K31AY:6I<+]1ZQ+L07KLYTE.3!"@6>
     2109MUJB#!4$"G4P2G)06B4*&(@301H8G6IB&SA18%S(E)83_DCP&MD'2)_>RPK($
     2110M]&O#JB!(HS$%38@!8`I*C(AV-RT+XE(H#!2>C'E.(Q:FS><4.C=SB0KI0VR[
     2111M(G_<<YFN:"0<&8C2AN6*`C'F\F0:14M":@GM3`IW'RARB#6Y4/\22Q*X4BK6
     2112M)(+),6^9JOG%Y)16I_.2%`1"0T0&KYZ2.!:%O.BLBJ;.S61H5:@E#SDB`LNK
     2113M,%70J@3N8(=5B6C9B$5)W+,4BY(?E4,!(;`2]65Y%<'`7:06(B9S>3J"WF#H
     2114M+8@&)`X-[Q1[%"CB!9)JX4`/\C>";R+6;>KR'>L#D0NB)FK<D869%NCBXJ!8
     2115MH,!E9+%`D4L08XD2U[/&&F4NF8XUHAKG&2M4WWO@<&!6X`9B5HEK79D5B;F=
     2116M&H2R#%6<HAIH@28A&I`VP;1(C`\LWEZ%%RBCTS&M3WD'9^S81ZU'(BQLO$4$
     2117MU"30"7%O$&;(AY79`YAX?>9)(_=#7/[3&IY0P(GTQ15L3P8K6I^.BHA(:,"I
     2118MY90'%*3LS(X#@BZP.)%K,V-QH(6Q,+X*BH,ADRHP*'&!U@>Y#17GBM:*^I9B
     2119M?8CA9HY:)\F'9.D`VQ^%)?&Y"A+KNXQ_B463#,//H%@J%GQ`?K&U!J]21;&F
     2120M)SO+(YE;6!Q.%,^6EQ</D6GD>H\!VRB0G:T_V14\T5Q:0.;UJEQO;F674$`G
     2121M+5?GXI%(UAA<1A3K=;US\':$^)P3"_-41A?"ZV"B/BYPJGDD(>K2:DW6DUEW
     2122M`56/"(">ZY9)XPR9K2$7\RET;J(XPA!9AZK,IP(WAL124:`'F08A.5-;X"<+
     2123MSA2E^62'6IR:P9/#`$HGTDS>M!$HL`KQ"@'["=0*WYUM<Y0%PN$*\S68S?5U
     2124MW.KDJBSI(F&B@T)/VD7]CY%F0E-=G<_:9$:@VRQ:<Y#_P"ZCLMY8'JI,#BD?
     2125M]<_I8`8(U]3Y`LM3T8$%R].X,Q"6AS3?"L9%AS$7WDC7>Z?@]W"QO$1!URQ8
     2126MT[ZCU4$9[PO$:+);BF6L:W,E(M!PH<WG/2%25Q)'5T`#<6!6,XGG<#Q-O_JR
     2127M7[*<@^2=7CCM",4S..L(52>Q.$1#1N4LG(%JLUB<N4X4&Q$@;:-B-=8F<KES
     2128MK$[B.H98G8SN#%B=@IX@6)W*O6FP.@T]D[`ZL#M=(-4)!*`B1ADNG$ZB+QI)
     2129M#E(!,B)<*"@/DG:-%+*(4YA`J\D[-K\`\77RA08R74(-&]":0-^GA/B$]?U:
     2130M3CRJ![<2KC+T"(0(SS63A"M20!N,'Y%BT"#IT"Y*C;[O`%5/2#?H4$9(70@L
     2131M>"/<@%8D(0.&SU-&LPHL2>$6*5B2RJUZL":->TAA31"UTQ$M2J2*TA9@8,4"
     2132M0N[.I!["O$K]")YU68T+CE/F-O-/N#H'_+;LZ:28Z<AA#G/$$^+3%/W9YM@H
     2133MD(ASS,B&T5:.6:(/M5+,\+4CI]T@K/""B("`*DHCHF\)QL,2^"06T!:ILG2L
     2134MT`Y(1BAD,*-521!OH"5!!.^9SQ$L^(BKIQ8MR`QA";S3=PLL@2-J-R'J%,&;
     2135M4&')W,[V6>HP^X1YECP2;)RE[N)/MLUV6@J6O,E%!B6>Y"%F>)E=E64PWT9&
     2136M&F4&10YX[[UR8ESEPITKC2[#]C&82)-7,D#P1D%F+`,4A,Z<.Z!V+Y8!;J:*
     2137MM)JY)`AWHU7(Y/$$7TIXYD"Z!XSR6$RVY5X78N=AURS@WN1#H0#U)AY\2#?$
     2138M4,F3QE;<3D[.Y<8E1I\XP``&3@0AD6^41>X*<2DC)G5E"+(9%-D;%'J*%,%)
     2139M[\8E.8)4L70E"9+S`0N!\.C,F6J#*U%C(2@7`KE&A0G-DF%0=+[S?DAHLH&5
     2140M(,O/Q7'KW&T'A)4UM4'J$;6X(C<51&W$WH+"D+FLLN^E@6Q0``UI&9D5-.)J
     2141M::T'8N8A8W<*0H:O]4ILO*\4EQ@YMC^3<(J<QP='`EQ,;5D^H76`IYA3'E&+
     2142M%R_?WRMI990W1H)4X70;J/(4V4#O'B1?D87J0E:?$/G`0)P+8$W4M0:O7R:-
     2143MO(CGPKQ!/I$.@C+WTK/Q0@2*DZ;C0C90.)Y7<!P,&Y1:!VF:&HH_(X>>T'?F
     2144M=9AS,D>J;#A#EA.,_P'1_'5Y_;C0(-O`8T%)4\[<?(=Q.G!RR"0CG)S7'YE9
     2145M!E5VAA[(9;S9-)P"]R_`FT=N?8$W3VBD@A?/:-7S',OTA<].[#(@^GR>CTEK
     2146M\.(=71Z?RW.=(W;_!?V:(GN)8E!?Z><*G)H_6FN`V!L4RN-DT_>`W*.5;,H2
     2147M-V>;CLYN0M2T[.MU*P?H(=N4CDN!+$J'(;..1V>!"JWCC2]4X,<+(S7@@K1.
     2148M+T]]/O#&%-N6H?N2%%<CY8>0$$=N838'4R.V9V7_*IG["QLLKDXQTK`&PRL,
     2149M?E)PW@-WSG[2NU/?>+PZ^#9GQJ(NH*3&%K8-([EE>:DHOZ_GLC)C4:F64V/G
     2150MMF3]#9^=HF<#R[!43!S9?.-]\@L8Q!+WW.4W#FA'@1>F',I.HC<8:B=K&+P@
     2151M*9+$-+\[T4N27M%S[@GA-9`KB6571.Q#=*5>LT\(KM0\^4G[?G26]%%[C[-V
     2152M4?20LW97]`FR=LEJNI)VN8;KRMI%Z5U)V[U@\$8:'97.Q@M2"'K@]%*R:L%]
     2153M$-9IY_Q2XHZDC+$02EU:Z!41PYA!O\@@,@:^:>%^9D]XTJG$QC.SOX=L"I!`
     2154M&X7GPI$^?\P<8'(.B9!:J<144%`RB2E082427WCUADRJS@8;I'J5T221&#8P
     2155M)!)/*L8&F_EM.0\U0@<F,U.`*(E('WK!B[M#T!O"B0GU"49*2H1L3-<"4E[@
     2156MJ*TXJ(6;M3W9:-O@52>J1KTLG^)>IR0;4+4!%S0*^JV,YF5\I]R_]THQ?$AH
     2157M1I'0E=#<P&J1_8=:NRNA&;Z5E<],]:]7/O/4U?#MP-YIZ0/+A(@CA2TVD@H*
     2158M2RS5!\7VC.BL\ZQL;YPK26]&`E;B-R./)=)LT.VODGA%[T@=.I]@ZI/'L$F:
     2159M*NJM;&J*"%W9U'TQE?#.](NSJ5'Y=&53X^!S.C45$.9L:BX!S=G44^*X5C(U
     2160M\.8\ULYE^I^0ZBK93R'3P3,+B0Y-7YXLT5VD;T*@H_P#TE3(ZL/O5=!5[PE9
     2161M#JT=G_2"U'84[Q?ATD8FXH`GI'$V>EPY^@&E0U<"-RJXK@QN5-:5%&XJA<PI
     2162MW%S,>N5P1R)PG,)-!>B?+)M1OX$GBV8P")!DAC8D3UA$YXLA#Y.L?4B%F9^N
     2163M(IR:WFJ*P-A]A5L"/OG#S9_@K0),MT@4I[*&*U&<JN-)GCA5X^0\<2Z"RGGB
     2164M#Q;O(%_UO+*;\Y2I5IH[XJ5CDBSQ3'8JB%<E<GIM1]^$)V0KQ*JQ9#5U%'R8
     2165M@,X[3Q:K(M.*--5O\J1^H?4:D7_:C?,89K9=\HFAM+8&6P"GGP?D/W/Z.54/
     2166MY?3S=VI2OK+/,Q+`141:+T"IEC"!<EV(0-:2P44ND.;'#`+T+L)%=2$1=;Q3
     2167M'Z]G8>Z08'.BO4>EIND=(EI./2,?K_"$6$0M\F`[XX"0L$)R.)F]#796!A3]
     2168MX:((%Q<^Y61V"E5;N>SO18Y\XL+,DLQ.[A)(.%3^'+GLJ&>/5'9D72*]NZ-=
     2169MQ9/M@236$/)DJ*E(/2*Z7R%PD^U]"G9/B/_SZ+(VU)@"A[;\S\BTA`+/&?%4
     2170M1U0RXJE.*V?$D_S7."T]<IEB3HDG/VI(G!*/<M_(B4?%=DZ)IQ+\*R6>FBP\
     2171M(:542NW-\@)8<KCAR(M$+T!-FI[T&:B]%PX*:,G*T(R:34^E)CF;G@MV2C8]
     2172MV?XXFQZU926;_LHKDS]R965DTT^E$-8DJH&2X`BB;%I8^:&(S;E6)CWAD)>0
     2173M=2$U>.XC.M20,J@UT),/^L06]"N2TYA3[U'ED7/O:2=43KU'*5'.O$>!UI5X
     2174M3P5P.>^>JPZOQ'NJ_KP2[ZGS.R?>4Q5U)-XC@:$@\9[8'O8TA$,$^<)N53C1
     2175M>Q)>/I<HS\&.\4IDE=/SJ8@#HPJ2T-)*T!^PD"(I-"QM@9E&[)*@WTGM!O^O
     2176ME+[2(=AFLJ<A07^*!\`UH]H[Y^=3C7Y.SX\4>)K65H<$25256JH\O]"3)K,@
     2177M3\4/)7<_9U9G`G(>.N/7N*8H9^^3FL/J#"%+56Z?JS#)%)16!C_5:^84?AJ,
     2178M[9JXM#GG\(,LP*R#'@+/M)+EQY.-.E-)HB1H)C"L=N15:8'H!FJT<"9JI]/`
     2179MB?T1_`*)_7#[1DGL[^1>'[PE!L@`=8Q"A8F`U-3,:?V1?(B<UX\$+<)T9$[J
     2180M1W>#E=3?24C!LLZ-WGE1R=;+^?U4KE#R^ZE8)N?WOW.<-A+\N>HJ$ORGOIXN
     2181MY/=S'6#D]U-0*BH-(-VTX;O29P]\7)`N"ST0E6X@BD3D!M%WK8@QOUC:JUF2
     2182M^R\H:Q%IZU2QDK/[4;YS9?=3:5-.[I_<NW%R_P,5=#F[G^JV(KN?*C]S<O_<
     2183MUYS;CXKGG-I/]4K`$ZD0,_+ZT?QAU?-951C8Y%8YN9]X%0N@\X-6,G(C(Q?%
     2184M59'>_\Z)6<SC<`Z(Q:$T,F?WY\AXD.P<>N'D?@X\P,:C.JE([D</`RYX=+&J
     2185MCG3;%#6]GVI8<GH_'6'.L"]<LXL3_*FP*Q+\40X7"?Z4W)G22O"_D':'`CH4
     2186M=\+Y_>2(X/1^*OC.Z?U79F$/,5"<WH_JDBN_OPW."2?-^0HKO?_JG*U=5\$"
     2187MY/>C$"_R^Z=VA](8*/-!X9#,=*CD-C+\4>+\R=1ZDB[4UZ%@<N3WO]?.JBLM
     2188M25ROGKAL)_+[N4+I2O"G<JTKP1\)!F`?B*5#?O]`_#L0H4+4R.\G@R(9,[&M
     2189M,]=;RJL02$"=2:3WOW>*`*+L?JX1BNQ^E$/E[/Y",16%CU3D/.H&LP4>V%&I
     2190M>>7VUX:"%^0YFN0+N?W0BI';3W674%`@(-(&CYR2Q$27<_M1A70E]V<0!M01
     2191M29%S^U&E%[G]<-<-)/?3@P)G]T_9(J'XS!6Y5`*%PN?`R?UK#T64`45J__O\
     2192M1AF9_53<%8G]A&&+G-F?!^=E-ZZ73(G]1'`AC>?$6?V-;.H=K]8NI,?3JT44
     2193M+:%O.LA:4I!63M:0S,3J2IS3WQ$Y2,\:9)'EC=4:W@IZ>,<S+B[V<2&"``<Q
     2194MH+HGI_1'2M/*6+UV<4(_BM"N?/Y$2=WX<F-R.4[H3TCH1Z5(2NCGZI5/S@&G
     2195M&DO(($?%4,[G1P%4)/0O[QE>8Y)KD+/);FC^FA-MU,XU)RF;_QU,`,G\D\WP
     2196MMD$D&>_3*%HW<*=2L4^N\#'6^<^C(IL?=2,IG1]AU@7I_"BIB7Q^K@*Z$OKA
     2197MK@6%&0TI\=1O`U^82D%2-C_J3E(V/]>\I&S^N0'!<5"ILX"VA\!%4)]<>6,,
     2198M/AHMKX3^B@1QJC1`>:)?G4MF(IT_(4B47GKN,RIX$%`V%>M(91HIG9](,9+Y
     2199M,W+(YN^IR";E\I,)-P7.Y:<RI7Q4!H(1V.V3OU"7JM-!:%P3D[+Y.2$,E2:F
     2200M,L"U`+A<!2KQ()^?B!D6?"KL)'O-%9U[/*&"0$"M%B[3`%\L16A4I///[Q4H
     2201MFY]^31\852')2(;:DN2#Y(*5E-!?:),UE($D@9AK1I)E":4G*9U_?O^Y@E0.
     2202MDI/Y$]FUOC+7HZ3[&7%\7R#<I.BS)QFE!L@H^S6_[51VOJ!/T][F\I!?I"?&
     2203MOJI`KIJ(US_]XQ?5@I1"A2&LRH4$7(400YRP]6>:X]>?5!_Q\?4/_WOD`HOA
     2204MMU?_B_0_K=M87:7']I<?GQ^?_^GC\Y\_?W[\*?SY/_RO__#_`;/A,#\SJ00`
    17092205`
    17102206end
  • Tst/Long/factorizep_l.stat

    re82b5f2 r0b7a8a6  
    1 1 >> tst_memory_0 :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:648400
    2 1 >> tst_memory_1 :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:4313100
    3 1 >> tst_memory_2 :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:6451224
    4 1 >> tst_timer :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:846
    5 2 >> tst_memory_0 :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:668064
    6 2 >> tst_memory_1 :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:4501504
    7 2 >> tst_memory_2 :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:6605812
    8 2 >> tst_timer :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:2901
    9 3 >> tst_memory_0 :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:885532
    10 3 >> tst_memory_1 :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:6598656
    11 3 >> tst_memory_2 :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:14994708
    12 3 >> tst_timer_1 :: 1380536990:3170:3-1-7:ix86-Linux:mamawutz:6289
     11 >> tst_memory_0 :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:647736
     21 >> tst_memory_1 :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:4587520
     31 >> tst_memory_2 :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:6684672
     41 >> tst_timer :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:867
     52 >> tst_memory_0 :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:666760
     62 >> tst_memory_1 :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:4587520
     72 >> tst_memory_2 :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:6684672
     82 >> tst_timer :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:3067
     93 >> tst_memory_0 :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:1746692
     103 >> tst_memory_1 :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:11812864
     113 >> tst_memory_2 :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:18104320
     123 >> tst_timer_1 :: 1389285670:3170:3-1-7:ix86-Linux:mamawutz:12373
  • Tst/Long/factorizep_l.tst

    re82b5f2 r0b7a8a6  
    591591l= factorize (f); testfactors (l, f);
    592592
     593f=
     5942036*(x)^2*(y)^2*(y^55+x^27)*(
     595x^26*y^27+22502*x^25*y^27+26129*x^24*y^27+29216*x^23*y^27+34834*x^22*y^27+16100*
     596x^21*y^27+31667*x^20*y^27+1906*x^19*y^27+22185*x^18*y^27+16677*x^17*y^27+41095*x
     597^16*y^27+15123*x^15*y^27+14491*x^14*y^27+5571*x^13*y^27+11913*x^12*y^27+21343*x^
     59811*y^27+32816*x^10*y^27+29154*x^9*y^27+22111*x^8*y^27+30147*x^7*y^27+1673*x^6*y^
     59927+30810*x^5*y^27+16497*x^4*y^27+39798*x^3*y^27+4394*x^2*y^27+31502*x*y^27+17487
     600*y^27+3083*x^26*y^26+7510*x^25*y^26+3246*x^24*y^26+11984*x^23*y^26+25636*x^22*y^
     60126+15923*x^21*y^26+542*x^20*y^26+29538*x^19*y^26+26552*x^18*y^26+24474*x^17*y^26
     602+4843*x^16*y^26+6664*x^15*y^26+30375*x^14*y^26+25269*x^13*y^26+21676*x^12*y^26+
     60333967*x^11*y^26+16441*x^10*y^26+16777*x^9*y^26+32168*x^8*y^26+31612*x^7*y^26+
     60430808*x^6*y^26+11273*x^5*y^26+19942*x^4*y^26+6182*x^3*y^26+40996*x^2*y^26+31624*
     605x*y^26+63*y^26+20355*x^25*y^25+31973*x^24*y^25+22971*x^23*y^25+27166*x^22*y^25+
     60636472*x^21*y^25+35782*x^20*y^25+24678*x^19*y^25+30016*x^18*y^25+4607*x^17*y^25+
     60741947*x^16*y^25+31198*x^15*y^25+16004*x^14*y^25+10632*x^13*y^25+18864*x^12*y^25+
     60817038*x^11*y^25+25214*x^10*y^25+38756*x^9*y^25+7046*x^8*y^25+19978*x^7*y^25+1376
     609*x^6*y^25+41415*x^5*y^25+10386*x^4*y^25+19065*x^3*y^25+17113*x^2*y^25+16281*x*y^
     61025+13858*y^25+5491*x^24*y^24+38472*x^23*y^24+35769*x^22*y^24+15694*x^21*y^24+
     61133392*x^20*y^24+1146*x^19*y^24+18050*x^18*y^24+12125*x^17*y^24+29102*x^16*y^24+
     61238748*x^15*y^24+42753*x^14*y^24+6698*x^13*y^24+28160*x^12*y^24+21070*x^11*y^24+
     61341637*x^10*y^24+19616*x^9*y^24+14406*x^8*y^24+23476*x^7*y^24+21817*x^6*y^24+
     61425840*x^5*y^24+25086*x^4*y^24+23775*x^3*y^24+21227*x^2*y^24+27888*x*y^24+23515*y
     615^24+19459*x^23*y^23+36602*x^22*y^23+208*x^21*y^23+12857*x^20*y^23+12486*x^19*y^
     61623+22368*x^18*y^23+2551*x^17*y^23+34235*x^16*y^23+14390*x^15*y^23+5882*x^14*y^23
     617+33538*x^13*y^23+42285*x^12*y^23+8690*x^11*y^23+30406*x^10*y^23+27320*x^9*y^23+
     61816879*x^8*y^23+3731*x^7*y^23+38196*x^6*y^23+42159*x^5*y^23+8240*x^4*y^23+31121*x
     619^3*y^23+35093*x^2*y^23+14738*x*y^23+30083*y^23+7123*x^22*y^22+6572*x^21*y^22+
     6208982*x^20*y^22+39575*x^19*y^22+28765*x^18*y^22+20952*x^17*y^22+8540*x^16*y^22+
     6212594*x^15*y^22+30737*x^14*y^22+18260*x^13*y^22+19933*x^12*y^22+8099*x^11*y^22+
     62229843*x^10*y^22+37536*x^9*y^22+13943*x^8*y^22+1823*x^7*y^22+4331*x^6*y^22+11682*
     623x^5*y^22+28595*x^4*y^22+26253*x^3*y^22+21766*x^2*y^22+33032*x*y^22+18506*y^22+
     62419732*x^21*y^21+29287*x^20*y^21+33671*x^19*y^21+20636*x^18*y^21+9129*x^17*y^21+
     625668*x^16*y^21+12392*x^15*y^21+18209*x^14*y^21+42027*x^13*y^21+10723*x^12*y^21+
     62640606*x^11*y^21+21152*x^10*y^21+28922*x^9*y^21+42902*x^8*y^21+23603*x^7*y^21+
     62710788*x^6*y^21+40011*x^5*y^21+25015*x^4*y^21+16784*x^3*y^21+7690*x^2*y^21+14090*
     628x*y^21+29510*y^21+36673*x^20*y^20+18226*x^19*y^20+9351*x^18*y^20+38118*x^17*y^20
     629+17449*x^16*y^20+30651*x^15*y^20+6652*x^14*y^20+4443*x^13*y^20+28114*x^12*y^20+
     63027713*x^11*y^20+14382*x^10*y^20+35435*x^9*y^20+15403*x^8*y^20+27528*x^7*y^20+
     63135417*x^6*y^20+21835*x^5*y^20+25685*x^4*y^20+3166*x^3*y^20+2542*x^2*y^20+30766*x
     632*y^20+31657*y^20+26361*x^19*y^19+1812*x^18*y^19+3983*x^17*y^19+36023*x^16*y^19+
     63322928*x^15*y^19+6855*x^14*y^19+27546*x^13*y^19+24902*x^12*y^19+36654*x^11*y^19+
     6345191*x^10*y^19+28174*x^9*y^19+10932*x^8*y^19+33381*x^7*y^19+18283*x^6*y^19+10138
     635*x^5*y^19+3525*x^4*y^19+31818*x^3*y^19+26751*x^2*y^19+8791*x*y^19+35017*y^19+
     6368068*x^18*y^18+11779*x^17*y^18+6526*x^16*y^18+37302*x^15*y^18+11164*x^14*y^18+
     63713769*x^13*y^18+39382*x^12*y^18+40572*x^11*y^18+13765*x^10*y^18+24417*x^9*y^18+
     63830189*x^8*y^18+21349*x^7*y^18+39167*x^6*y^18+20606*x^5*y^18+14305*x^4*y^18+29683
     639*x^3*y^18+1266*x^2*y^18+24840*x*y^18+21656*y^18+16312*x^17*y^17+5217*x^16*y^17+
     64041816*x^15*y^17+8280*x^14*y^17+9410*x^13*y^17+9008*x^12*y^17+30427*x^11*y^17+
     6412633*x^10*y^17+14363*x^9*y^17+967*x^8*y^17+1177*x^7*y^17+1020*x^6*y^17+29630*x^5
     642*y^17+15743*x^4*y^17+20952*x^3*y^17+31064*x^2*y^17+3319*x*y^17+8408*y^17+12350*x
     643^16*y^16+14714*x^15*y^16+38478*x^14*y^16+18118*x^13*y^16+38544*x^12*y^16+17870*x
     644^11*y^16+39355*x^10*y^16+5319*x^9*y^16+27260*x^8*y^16+30534*x^7*y^16+14619*x^6*y
     645^16+29338*x^5*y^16+18577*x^4*y^16+5699*x^3*y^16+25077*x^2*y^16+24985*x*y^16+
     64641762*y^16+14161*x^15*y^15+24818*x^14*y^15+2538*x^13*y^15+5694*x^12*y^15+36797*x
     647^11*y^15+11305*x^10*y^15+266*x^9*y^15+34388*x^8*y^15+36472*x^7*y^15+35287*x^6*y^
     64815+36112*x^5*y^15+39364*x^4*y^15+31042*x^3*y^15+24571*x^2*y^15+22543*x*y^15+
     64933036*y^15+3046*x^14*y^14+42428*x^13*y^14+14398*x^12*y^14+8792*x^11*y^14+16394*x
     650^10*y^14+24593*x^9*y^14+29104*x^8*y^14+29172*x^7*y^14+4617*x^6*y^14+16803*x^5*y^
     65114+38129*x^4*y^14+25100*x^3*y^14+14495*x^2*y^14+16736*x*y^14+5132*y^14+23113*x^
     65213*y^13+40441*x^12*y^13+38512*x^11*y^13+8600*x^10*y^13+24449*x^9*y^13+11553*x^8*
     653y^13+20503*x^7*y^13+22462*x^6*y^13+28782*x^5*y^13+32654*x^4*y^13+8182*x^3*y^13+
     65418208*x^2*y^13+31145*x*y^13+9877*y^13+33439*x^12*y^12+37259*x^11*y^12+3230*x^10*
     655y^12+7924*x^9*y^12+21484*x^8*y^12+5249*x^7*y^12+28816*x^6*y^12+36832*x^5*y^12+
     65631614*x^4*y^12+30336*x^3*y^12+28977*x^2*y^12+33842*x*y^12+27712*y^12+11480*x^11*
     657y^11+42024*x^10*y^11+40159*x^9*y^11+4656*x^8*y^11+13905*x^7*y^11+32675*x^6*y^11+
     65815182*x^5*y^11+33276*x^4*y^11+40271*x^3*y^11+33097*x^2*y^11+5450*x*y^11+16545*y^
     65911+4444*x^10*y^10+29813*x^9*y^10+30598*x^8*y^10+19265*x^7*y^10+27733*x^6*y^10+
     66012332*x^5*y^10+4041*x^4*y^10+17994*x^3*y^10+37626*x^2*y^10+18017*x*y^10+41985*y^
     66110+18161*x^9*y^9+37064*x^8*y^9+38753*x^7*y^9+30823*x^6*y^9+12976*x^5*y^9+27156*x
     662^4*y^9+22754*x^3*y^9+5457*x^2*y^9+37393*x*y^9+18558*y^9+5969*x^8*y^8+8372*x^7*y^
     6638+5034*x^6*y^8+39726*x^5*y^8+23781*x^4*y^8+18050*x^3*y^8+38810*x^2*y^8+22187*x*y
     664^8+33578*y^8+6247*x^7*y^7+31686*x^6*y^7+17254*x^5*y^7+13842*x^4*y^7+5880*x^3*y^7
     665+7517*x^2*y^7+29126*x*y^7+25434*y^7+42719*x^6*y^6+37537*x^5*y^6+7149*x^4*y^6+
     6666926*x^3*y^6+30890*x^2*y^6+33056*x*y^6+35681*y^6+3125*x^5*y^5+33376*x^4*y^5+
     66724387*x^3*y^5+23868*x^2*y^5+35142*x*y^5+5143*y^5+40391*x^4*y^4+657*x^3*y^4+30346
     668*x^2*y^4+30607*x*y^4+9432*y^4+31094*x^3*y^3+25871*x^2*y^3+29619*x*y^3+40511*y^3+
     669747*x^2*y^2+23254*x*y^2+39636*y^2+17316*x*y+3609*y+8994)*(
     670x^53*y^53+18147*x^52*y^53+43022*x^51*y^53+40085*x^50*y^53+28237*x^49*y^53+30609*
     671x^48*y^53+24338*x^47*y^53+34438*x^46*y^53+17995*x^45*y^53+11285*x^44*y^53+23365*
     672x^43*y^53+34068*x^42*y^53+36580*x^41*y^53+18333*x^40*y^53+28343*x^39*y^53+10219*
     673x^38*y^53+41928*x^37*y^53+14530*x^36*y^53+8169*x^35*y^53+10664*x^34*y^53+28456*x
     674^33*y^53+40045*x^32*y^53+36063*x^31*y^53+40317*x^30*y^53+3892*x^29*y^53+18610*x^
     67528*y^53+42334*x^27*y^53+11181*x^26*y^53+14187*x^25*y^53+19731*x^24*y^53+15756*x^
     67623*y^53+9842*x^22*y^53+12573*x^21*y^53+3119*x^20*y^53+21843*x^19*y^53+2270*x^18*
     677y^53+25305*x^17*y^53+38419*x^16*y^53+23222*x^15*y^53+29693*x^14*y^53+37556*x^13*
     678y^53+16413*x^12*y^53+4411*x^11*y^53+27575*x^10*y^53+15150*x^9*y^53+6260*x^8*y^53
     679+27551*x^7*y^53+25107*x^6*y^53+32932*x^5*y^53+38353*x^4*y^53+9*x^3*y^53+5495*x^2
     680*y^53+10261*x*y^53+31369*y^53+5547*x^52*y^52+30032*x^51*y^52+284*x^50*y^52+14830
     681*x^49*y^52+22659*x^48*y^52+10626*x^47*y^52+22237*x^46*y^52+38950*x^45*y^52+40954
     682*x^44*y^52+9413*x^43*y^52+21276*x^42*y^52+31506*x^41*y^52+9404*x^40*y^52+10655*x
     683^39*y^52+10743*x^38*y^52+4401*x^37*y^52+32372*x^36*y^52+15524*x^35*y^52+28427*x^
     68434*y^52+26855*x^33*y^52+530*x^32*y^52+28907*x^31*y^52+4066*x^30*y^52+20491*x^29*
     685y^52+2863*x^28*y^52+12779*x^27*y^52+40264*x^26*y^52+27587*x^25*y^52+2553*x^24*y^
     68652+6016*x^23*y^52+2097*x^22*y^52+39570*x^21*y^52+34283*x^20*y^52+17879*x^19*y^52
     687+17020*x^18*y^52+40538*x^17*y^52+25557*x^16*y^52+39049*x^15*y^52+12516*x^14*y^52
     688+20550*x^13*y^52+37236*x^12*y^52+27582*x^11*y^52+40355*x^10*y^52+9244*x^9*y^52+
     68912348*x^8*y^52+3487*x^7*y^52+34984*x^6*y^52+6073*x^5*y^52+39538*x^4*y^52+28840*x
     690^3*y^52+6672*x^2*y^52+35673*x*y^52+21090*y^52+26879*x^51*y^51+19080*x^50*y^51+
     69120236*x^49*y^51+40752*x^48*y^51+4404*x^47*y^51+28484*x^46*y^51+19369*x^45*y^51+
     69221123*x^44*y^51+42333*x^43*y^51+3104*x^42*y^51+41974*x^41*y^51+1561*x^40*y^51+
     69311103*x^39*y^51+10769*x^38*y^51+27387*x^37*y^51+21812*x^36*y^51+1578*x^35*y^51+
     69439358*x^34*y^51+22262*x^33*y^51+28872*x^32*y^51+29393*x^31*y^51+37195*x^30*y^51+
     6959259*x^29*y^51+12198*x^28*y^51+33283*x^27*y^51+6171*x^26*y^51+1678*x^25*y^51+
     69619116*x^24*y^51+34014*x^23*y^51+42437*x^22*y^51+17526*x^21*y^51+30549*x^20*y^51+
     69729170*x^19*y^51+16093*x^18*y^51+4549*x^17*y^51+42768*x^16*y^51+40904*x^15*y^51+
     6983467*x^14*y^51+36407*x^13*y^51+18943*x^12*y^51+22205*x^11*y^51+7868*x^10*y^51+
     69915795*x^9*y^51+36617*x^8*y^51+17510*x^7*y^51+15678*x^6*y^51+16520*x^5*y^51+40409
     700*x^4*y^51+27740*x^3*y^51+35836*x^2*y^51+30552*x*y^51+20808*y^51+42970*x^50*y^50+
     7015860*x^49*y^50+23145*x^48*y^50+9906*x^47*y^50+34850*x^46*y^50+38599*x^45*y^50+
     70240329*x^44*y^50+15967*x^43*y^50+7261*x^42*y^50+41272*x^41*y^50+4284*x^40*y^50+
     70337022*x^39*y^50+27603*x^38*y^50+8694*x^37*y^50+42972*x^36*y^50+26061*x^35*y^50+
     70418941*x^34*y^50+4252*x^33*y^50+34789*x^32*y^50+34843*x^31*y^50+13722*x^30*y^50+
     70520217*x^29*y^50+16944*x^28*y^50+7910*x^27*y^50+30072*x^26*y^50+9131*x^25*y^50+
     70617095*x^24*y^50+38859*x^23*y^50+11391*x^22*y^50+8284*x^21*y^50+40113*x^20*y^50+
     70716017*x^19*y^50+30360*x^18*y^50+28241*x^17*y^50+42497*x^16*y^50+12082*x^15*y^50+
     7081284*x^14*y^50+16288*x^13*y^50+24860*x^12*y^50+13411*x^11*y^50+10975*x^10*y^50+
     70933044*x^9*y^50+8235*x^8*y^50+22317*x^7*y^50+31218*x^6*y^50+20511*x^5*y^50+24255*
     710x^4*y^50+26118*x^3*y^50+31607*x^2*y^50+12349*x*y^50+39022*y^50+13425*x^49*y^49+
     71139757*x^48*y^49+27451*x^47*y^49+194*x^46*y^49+24526*x^45*y^49+9875*x^44*y^49+
     71231606*x^43*y^49+38444*x^42*y^49+18652*x^41*y^49+29818*x^40*y^49+15631*x^39*y^49+
     71321247*x^38*y^49+10326*x^37*y^49+30737*x^36*y^49+28353*x^35*y^49+32283*x^34*y^49+
     71440894*x^33*y^49+19141*x^32*y^49+11212*x^31*y^49+4674*x^30*y^49+28404*x^29*y^49+
     71533933*x^28*y^49+6387*x^27*y^49+32050*x^26*y^49+14228*x^25*y^49+29664*x^24*y^49+
     71635576*x^23*y^49+40915*x^22*y^49+40400*x^21*y^49+1818*x^20*y^49+31280*x^19*y^49+
     7176559*x^18*y^49+33932*x^17*y^49+37524*x^16*y^49+27603*x^15*y^49+10707*x^14*y^49+
     71832695*x^13*y^49+26450*x^12*y^49+25719*x^11*y^49+38755*x^10*y^49+6656*x^9*y^49+
     71921403*x^8*y^49+5632*x^7*y^49+888*x^6*y^49+42735*x^5*y^49+13602*x^4*y^49+24940*x^
     7203*y^49+38405*x^2*y^49+8054*x*y^49+20049*y^49+27372*x^48*y^48+30233*x^47*y^48+657
     721*x^46*y^48+29614*x^45*y^48+20701*x^44*y^48+23794*x^43*y^48+3737*x^42*y^48+6648*x
     722^41*y^48+20102*x^40*y^48+22356*x^39*y^48+32369*x^38*y^48+12432*x^37*y^48+26613*x
     723^36*y^48+21249*x^35*y^48+5150*x^34*y^48+2672*x^33*y^48+15097*x^32*y^48+37938*x^
     72431*y^48+14805*x^30*y^48+22802*x^29*y^48+39201*x^28*y^48+30407*x^27*y^48+20653*x^
     72526*y^48+33705*x^25*y^48+23079*x^24*y^48+2198*x^23*y^48+38433*x^22*y^48+7227*x^21
     726*y^48+23891*x^20*y^48+3967*x^19*y^48+37476*x^18*y^48+36934*x^17*y^48+12206*x^16*
     727y^48+22197*x^15*y^48+10245*x^14*y^48+22127*x^13*y^48+41418*x^12*y^48+814*x^11*y^
     72848+31931*x^10*y^48+38041*x^9*y^48+6354*x^8*y^48+22194*x^7*y^48+22787*x^6*y^48+
     72930170*x^5*y^48+5917*x^4*y^48+36122*x^3*y^48+19222*x^2*y^48+32886*x*y^48+22622*y^
     73048+3812*x^47*y^47+25985*x^46*y^47+36819*x^45*y^47+13268*x^44*y^47+35718*x^43*y^
     73147+24087*x^42*y^47+33429*x^41*y^47+38428*x^40*y^47+42427*x^39*y^47+18508*x^38*y^
     73247+807*x^37*y^47+28580*x^36*y^47+12219*x^35*y^47+38548*x^34*y^47+41213*x^33*y^47
     733+13374*x^32*y^47+240*x^31*y^47+18855*x^30*y^47+3163*x^29*y^47+39802*x^28*y^47+
     7344065*x^27*y^47+21549*x^26*y^47+35680*x^25*y^47+30407*x^24*y^47+9345*x^23*y^47+
     73537516*x^22*y^47+31854*x^21*y^47+10318*x^20*y^47+2740*x^19*y^47+11306*x^18*y^47+
     7365988*x^17*y^47+16224*x^16*y^47+22259*x^15*y^47+19555*x^14*y^47+20347*x^13*y^47+
     7376069*x^12*y^47+20053*x^11*y^47+9241*x^10*y^47+29531*x^9*y^47+12594*x^8*y^47+
     73825231*x^7*y^47+2145*x^6*y^47+36468*x^5*y^47+24431*x^4*y^47+38896*x^3*y^47+13456*
     739x^2*y^47+40531*x*y^47+9268*y^47+33917*x^46*y^46+7802*x^45*y^46+43037*x^44*y^46+
     74020656*x^43*y^46+37129*x^42*y^46+11642*x^41*y^46+19623*x^40*y^46+796*x^39*y^46+
     74116361*x^38*y^46+41230*x^37*y^46+29857*x^36*y^46+24087*x^35*y^46+5566*x^34*y^46+
     7426421*x^33*y^46+40958*x^32*y^46+37371*x^31*y^46+18049*x^30*y^46+19808*x^29*y^46+
     7435885*x^28*y^46+38032*x^27*y^46+5553*x^26*y^46+42145*x^25*y^46+34158*x^24*y^46+
     74438717*x^23*y^46+5514*x^22*y^46+39714*x^21*y^46+17252*x^20*y^46+13415*x^19*y^46+
     7459576*x^18*y^46+35622*x^17*y^46+34212*x^16*y^46+28019*x^15*y^46+42386*x^14*y^46+
     74627403*x^13*y^46+38945*x^12*y^46+12139*x^11*y^46+29342*x^10*y^46+13347*x^9*y^46+
     74737592*x^8*y^46+13920*x^7*y^46+30889*x^6*y^46+13930*x^5*y^46+21793*x^4*y^46+9482*
     748x^3*y^46+42650*x^2*y^46+2703*x*y^46+19032*y^46+40355*x^45*y^45+34673*x^44*y^45+
     74916318*x^43*y^45+38013*x^42*y^45+30018*x^41*y^45+7755*x^40*y^45+16854*x^39*y^45+
     75025824*x^38*y^45+30004*x^37*y^45+22057*x^36*y^45+30486*x^35*y^45+18166*x^34*y^45+
     75130268*x^33*y^45+42335*x^32*y^45+9703*x^31*y^45+8876*x^30*y^45+31479*x^29*y^45+
     7524458*x^28*y^45+1013*x^27*y^45+26568*x^26*y^45+26890*x^25*y^45+37461*x^24*y^45+
     75316554*x^23*y^45+7323*x^22*y^45+8189*x^21*y^45+6451*x^20*y^45+33300*x^19*y^45+
     75426185*x^18*y^45+24508*x^17*y^45+23070*x^16*y^45+5113*x^15*y^45+29902*x^14*y^45+
     75523508*x^13*y^45+29179*x^12*y^45+24325*x^11*y^45+691*x^10*y^45+9957*x^9*y^45+
     75623116*x^8*y^45+31858*x^7*y^45+40746*x^6*y^45+23740*x^5*y^45+16587*x^4*y^45+18456
     757*x^3*y^45+22891*x^2*y^45+24232*x*y^45+24901*y^45+1581*x^44*y^44+8067*x^43*y^44+
     75840636*x^42*y^44+590*x^41*y^44+28238*x^40*y^44+18484*x^39*y^44+13782*x^38*y^44+
     75926591*x^37*y^44+38088*x^36*y^44+7380*x^35*y^44+35239*x^34*y^44+1000*x^33*y^44+
     76020981*x^32*y^44+4647*x^31*y^44+37942*x^30*y^44+8411*x^29*y^44+1844*x^28*y^44+
     76142980*x^27*y^44+1636*x^26*y^44+19108*x^25*y^44+10146*x^24*y^44+20133*x^23*y^44+
     76231891*x^22*y^44+36956*x^21*y^44+4778*x^20*y^44+28052*x^19*y^44+7656*x^18*y^44+
     76323804*x^17*y^44+25604*x^16*y^44+34159*x^15*y^44+39731*x^14*y^44+40121*x^13*y^44+
     76433040*x^12*y^44+19546*x^11*y^44+4051*x^10*y^44+22053*x^9*y^44+8357*x^8*y^44+
     76513907*x^7*y^44+25422*x^6*y^44+16353*x^5*y^44+17091*x^4*y^44+10820*x^3*y^44+10885
     766*x^2*y^44+26791*x*y^44+26814*y^44+30035*x^43*y^43+19261*x^42*y^43+5960*x^41*y^43
     767+25009*x^40*y^43+31459*x^39*y^43+5593*x^38*y^43+11908*x^37*y^43+40759*x^36*y^43+
     76825678*x^35*y^43+317*x^34*y^43+2911*x^33*y^43+21930*x^32*y^43+10338*x^31*y^43+
     76918544*x^30*y^43+21395*x^29*y^43+32184*x^28*y^43+2508*x^27*y^43+30020*x^26*y^43+
     77036827*x^25*y^43+32729*x^24*y^43+37356*x^23*y^43+37941*x^22*y^43+38560*x^21*y^43+
     77125442*x^20*y^43+15046*x^19*y^43+25010*x^18*y^43+29960*x^17*y^43+317*x^16*y^43+
     77219367*x^15*y^43+12431*x^14*y^43+22477*x^13*y^43+7299*x^12*y^43+29600*x^11*y^43+
     77318368*x^10*y^43+30660*x^9*y^43+31625*x^8*y^43+34063*x^7*y^43+39332*x^6*y^43+
     77442283*x^5*y^43+24888*x^4*y^43+19738*x^3*y^43+2405*x^2*y^43+5956*x*y^43+4332*y^43
     775+39260*x^42*y^42+19385*x^41*y^42+31659*x^40*y^42+34965*x^39*y^42+34569*x^38*y^42
     776+20394*x^37*y^42+29989*x^36*y^42+4513*x^35*y^42+8431*x^34*y^42+40216*x^33*y^42+
     77742045*x^32*y^42+17569*x^31*y^42+17859*x^30*y^42+7805*x^29*y^42+39762*x^28*y^42+
     7787624*x^27*y^42+12453*x^26*y^42+13594*x^25*y^42+42421*x^24*y^42+36751*x^23*y^42+
     77921549*x^22*y^42+1117*x^21*y^42+27687*x^20*y^42+17486*x^19*y^42+37758*x^18*y^42+
     78041570*x^17*y^42+4711*x^16*y^42+21777*x^15*y^42+9007*x^14*y^42+14510*x^13*y^42+
     781495*x^12*y^42+27546*x^11*y^42+15369*x^10*y^42+28778*x^9*y^42+1890*x^8*y^42+38622
     782*x^7*y^42+14667*x^6*y^42+24823*x^5*y^42+26179*x^4*y^42+37676*x^3*y^42+19558*x^2*
     783y^42+20984*x*y^42+33240*y^42+36690*x^41*y^41+17023*x^40*y^41+17026*x^39*y^41+
     7846811*x^38*y^41+16785*x^37*y^41+12085*x^36*y^41+29521*x^35*y^41+34282*x^34*y^41+
     7858706*x^33*y^41+37090*x^32*y^41+30501*x^31*y^41+18192*x^30*y^41+35111*x^29*y^41+
     78639271*x^28*y^41+5042*x^27*y^41+25069*x^26*y^41+34380*x^25*y^41+13858*x^24*y^41+
     7879698*x^23*y^41+12876*x^22*y^41+18196*x^21*y^41+31276*x^20*y^41+38122*x^19*y^41+
     78812008*x^18*y^41+24932*x^17*y^41+33107*x^16*y^41+20016*x^15*y^41+11013*x^14*y^41+
     78939534*x^13*y^41+28790*x^12*y^41+9663*x^11*y^41+34756*x^10*y^41+41666*x^9*y^41+
     79033575*x^8*y^41+31797*x^7*y^41+17028*x^6*y^41+35080*x^5*y^41+23794*x^4*y^41+31927
     791*x^3*y^41+42101*x^2*y^41+3694*x*y^41+17898*y^41+5030*x^40*y^40+20705*x^39*y^40+
     79240138*x^38*y^40+20010*x^37*y^40+41623*x^36*y^40+3326*x^35*y^40+21134*x^34*y^40+
     79336214*x^33*y^40+42448*x^32*y^40+9904*x^31*y^40+3791*x^30*y^40+38996*x^29*y^40+
     7947031*x^28*y^40+21395*x^27*y^40+16931*x^26*y^40+23563*x^25*y^40+5604*x^24*y^40+
     79518577*x^23*y^40+17832*x^22*y^40+38462*x^21*y^40+17939*x^20*y^40+13578*x^19*y^40+
     7965091*x^18*y^40+11389*x^17*y^40+41259*x^16*y^40+6438*x^15*y^40+35827*x^14*y^40+
     79738132*x^13*y^40+14738*x^12*y^40+35596*x^11*y^40+22288*x^10*y^40+38612*x^9*y^40+
     79830582*x^8*y^40+9216*x^7*y^40+22498*x^6*y^40+41447*x^5*y^40+21423*x^4*y^40+18859*
     799x^3*y^40+2943*x^2*y^40+42*x*y^40+26122*y^40+21917*x^39*y^39+16248*x^38*y^39+
     80012815*x^37*y^39+1065*x^36*y^39+23742*x^35*y^39+3529*x^34*y^39+6933*x^33*y^39+
     8016197*x^32*y^39+18254*x^31*y^39+5200*x^30*y^39+14892*x^29*y^39+32191*x^28*y^39+
     80227194*x^27*y^39+12220*x^26*y^39+15416*x^25*y^39+8038*x^24*y^39+23518*x^23*y^39+
     80321732*x^22*y^39+40262*x^21*y^39+3864*x^20*y^39+18543*x^19*y^39+32141*x^18*y^39+
     8046335*x^17*y^39+16625*x^16*y^39+22604*x^15*y^39+25647*x^14*y^39+14043*x^13*y^39+
     80537489*x^12*y^39+32245*x^11*y^39+24467*x^10*y^39+124*x^9*y^39+27492*x^8*y^39+72*x
     806^7*y^39+7216*x^6*y^39+8002*x^5*y^39+18089*x^4*y^39+11437*x^3*y^39+35176*x^2*y^39
     807+18285*x*y^39+28670*y^39+4532*x^38*y^38+37470*x^37*y^38+19891*x^36*y^38+41542*x^
     80835*y^38+9718*x^34*y^38+42839*x^33*y^38+8238*x^32*y^38+22952*x^31*y^38+39648*x^30
     809*y^38+28131*x^29*y^38+22317*x^28*y^38+25299*x^27*y^38+23511*x^26*y^38+9894*x^25*
     810y^38+13716*x^24*y^38+35578*x^23*y^38+31881*x^22*y^38+13171*x^21*y^38+31957*x^20*
     811y^38+7557*x^19*y^38+9080*x^18*y^38+33605*x^17*y^38+28061*x^16*y^38+26224*x^15*y^
     81238+38115*x^14*y^38+12579*x^13*y^38+9476*x^12*y^38+18826*x^11*y^38+24558*x^10*y^
     81338+32988*x^9*y^38+4475*x^8*y^38+1586*x^7*y^38+37795*x^6*y^38+21563*x^5*y^38+
     81441768*x^4*y^38+25716*x^3*y^38+5730*x^2*y^38+6989*x*y^38+2665*y^38+18474*x^37*y^
     81537+17873*x^36*y^37+37340*x^35*y^37+39770*x^34*y^37+23012*x^33*y^37+12488*x^32*y^
     81637+35457*x^31*y^37+24228*x^30*y^37+38299*x^29*y^37+31351*x^28*y^37+41876*x^27*y^
     81737+15132*x^26*y^37+29672*x^25*y^37+19441*x^24*y^37+27592*x^23*y^37+1004*x^22*y^
     81837+23100*x^21*y^37+24305*x^20*y^37+35140*x^19*y^37+29466*x^18*y^37+34872*x^17*y^
     81937+31689*x^16*y^37+41226*x^15*y^37+6209*x^14*y^37+18431*x^13*y^37+15545*x^12*y^
     82037+4217*x^11*y^37+12267*x^10*y^37+23055*x^9*y^37+27958*x^8*y^37+24946*x^7*y^37+
     82118221*x^6*y^37+3834*x^5*y^37+35345*x^4*y^37+25813*x^3*y^37+20611*x^2*y^37+16263*
     822x*y^37+20199*y^37+14465*x^36*y^36+3944*x^35*y^36+10818*x^34*y^36+33496*x^33*y^36
     823+40148*x^32*y^36+40913*x^31*y^36+32228*x^30*y^36+25515*x^29*y^36+27597*x^28*y^36
     824+40498*x^27*y^36+14302*x^26*y^36+14742*x^25*y^36+18012*x^24*y^36+20790*x^23*y^36
     825+1636*x^22*y^36+40195*x^21*y^36+40702*x^20*y^36+22371*x^19*y^36+734*x^18*y^36+
     82623769*x^17*y^36+38645*x^16*y^36+9831*x^15*y^36+5784*x^14*y^36+14661*x^13*y^36+
     82733984*x^12*y^36+24153*x^11*y^36+2695*x^10*y^36+34150*x^9*y^36+1475*x^8*y^36+
     82838333*x^7*y^36+860*x^6*y^36+15027*x^5*y^36+19228*x^4*y^36+41952*x^3*y^36+8466*x^
     8292*y^36+13330*x*y^36+31877*y^36+22137*x^35*y^35+26911*x^34*y^35+3921*x^33*y^35+
     83030649*x^32*y^35+36112*x^31*y^35+26462*x^30*y^35+18707*x^29*y^35+24132*x^28*y^35+
     83121788*x^27*y^35+5384*x^26*y^35+31009*x^25*y^35+7078*x^24*y^35+32871*x^23*y^35+
     83240177*x^22*y^35+34384*x^21*y^35+34362*x^20*y^35+14431*x^19*y^35+17033*x^18*y^35+
     83337687*x^17*y^35+15153*x^16*y^35+4993*x^15*y^35+7366*x^14*y^35+32202*x^13*y^35+
     8344531*x^12*y^35+21959*x^11*y^35+10107*x^10*y^35+6830*x^9*y^35+37430*x^8*y^35+
     83526724*x^7*y^35+29060*x^6*y^35+3962*x^5*y^35+27723*x^4*y^35+42152*x^3*y^35+39841*
     836x^2*y^35+2484*x*y^35+13587*y^35+466*x^34*y^34+31954*x^33*y^34+30801*x^32*y^34+
     8378936*x^31*y^34+5640*x^30*y^34+2119*x^29*y^34+38507*x^28*y^34+2916*x^27*y^34+
     83834260*x^26*y^34+9889*x^25*y^34+17037*x^24*y^34+41972*x^23*y^34+24788*x^22*y^34+
     83942342*x^21*y^34+12153*x^20*y^34+31900*x^19*y^34+32150*x^18*y^34+353*x^17*y^34+
     84013211*x^16*y^34+26356*x^15*y^34+22476*x^14*y^34+37191*x^13*y^34+7778*x^12*y^34+
     84122556*x^11*y^34+5996*x^10*y^34+29641*x^9*y^34+41363*x^8*y^34+30009*x^7*y^34+
     84222934*x^6*y^34+17759*x^5*y^34+25741*x^4*y^34+6401*x^3*y^34+36544*x^2*y^34+171*x*
     843y^34+37979*y^34+15313*x^33*y^33+31019*x^32*y^33+17942*x^31*y^33+38375*x^30*y^33+
     84441049*x^29*y^33+35567*x^28*y^33+17522*x^27*y^33+11884*x^26*y^33+38114*x^25*y^33+
     84540939*x^24*y^33+37389*x^23*y^33+24852*x^22*y^33+18117*x^21*y^33+10444*x^20*y^33+
     8464656*x^19*y^33+12501*x^18*y^33+14323*x^17*y^33+12415*x^16*y^33+27799*x^15*y^33+
     84718562*x^14*y^33+2589*x^13*y^33+27567*x^12*y^33+16865*x^11*y^33+13922*x^10*y^33+
     84833463*x^9*y^33+17112*x^8*y^33+11243*x^7*y^33+2891*x^6*y^33+32742*x^5*y^33+42456*
     849x^4*y^33+2235*x^3*y^33+4800*x^2*y^33+40847*x*y^33+5399*y^33+14186*x^32*y^32+
     85014885*x^31*y^32+41339*x^30*y^32+40829*x^29*y^32+3576*x^28*y^32+38477*x^27*y^32+
     8518225*x^26*y^32+35327*x^25*y^32+27970*x^24*y^32+14944*x^23*y^32+15098*x^22*y^32+
     85241185*x^21*y^32+38742*x^20*y^32+22816*x^19*y^32+18799*x^18*y^32+3939*x^17*y^32+
     8535267*x^16*y^32+3223*x^15*y^32+18224*x^14*y^32+24474*x^13*y^32+12038*x^12*y^32+
     85421401*x^11*y^32+7939*x^10*y^32+5051*x^9*y^32+25616*x^8*y^32+32954*x^7*y^32+11947
     855*x^6*y^32+31059*x^5*y^32+9947*x^4*y^32+16462*x^3*y^32+5660*x^2*y^32+4926*x*y^32+
     85631371*y^32+24980*x^31*y^31+10429*x^30*y^31+29583*x^29*y^31+25670*x^28*y^31+30325
     857*x^27*y^31+32707*x^26*y^31+4554*x^25*y^31+4824*x^24*y^31+14157*x^23*y^31+2480*x^
     85822*y^31+26739*x^21*y^31+33788*x^20*y^31+33490*x^19*y^31+13645*x^18*y^31+31574*x^
     85917*y^31+24871*x^16*y^31+23525*x^15*y^31+25346*x^14*y^31+11150*x^13*y^31+5930*x^
     86012*y^31+17831*x^11*y^31+25316*x^10*y^31+11055*x^9*y^31+40769*x^8*y^31+39049*x^7*
     861y^31+6889*x^6*y^31+29402*x^5*y^31+17396*x^4*y^31+26425*x^3*y^31+29573*x^2*y^31+
     8623048*x*y^31+2061*y^31+25688*x^30*y^30+10729*x^29*y^30+10281*x^28*y^30+2873*x^27*
     863y^30+7957*x^26*y^30+6862*x^25*y^30+12421*x^24*y^30+22267*x^23*y^30+18530*x^22*y^
     86430+31964*x^21*y^30+2708*x^20*y^30+29289*x^19*y^30+22534*x^18*y^30+16556*x^17*y^
     86530+16343*x^16*y^30+24490*x^15*y^30+51*x^14*y^30+13138*x^13*y^30+37878*x^12*y^30+
     86632475*x^11*y^30+9118*x^10*y^30+23428*x^9*y^30+36826*x^8*y^30+17404*x^7*y^30+6387
     867*x^6*y^30+39313*x^5*y^30+11115*x^4*y^30+11112*x^3*y^30+39059*x^2*y^30+36567*x*y^
     86830+3244*y^30+10546*x^29*y^29+40279*x^28*y^29+8192*x^27*y^29+31945*x^26*y^29+8036
     869*x^25*y^29+7530*x^24*y^29+15828*x^23*y^29+39078*x^22*y^29+22083*x^21*y^29+546*x^
     87020*y^29+32237*x^19*y^29+15428*x^18*y^29+26710*x^17*y^29+36279*x^16*y^29+493*x^15
     871*y^29+41644*x^14*y^29+17588*x^13*y^29+37437*x^12*y^29+8873*x^11*y^29+15706*x^10*
     872y^29+12130*x^9*y^29+10474*x^8*y^29+8157*x^7*y^29+21743*x^6*y^29+5867*x^5*y^29+
     87336624*x^4*y^29+29051*x^3*y^29+39496*x^2*y^29+11651*x*y^29+21746*y^29+30819*x^28*
     874y^28+38218*x^27*y^28+33643*x^26*y^28+19933*x^25*y^28+870*x^24*y^28+36669*x^23*y^
     87528+7497*x^22*y^28+25876*x^21*y^28+1074*x^20*y^28+4707*x^19*y^28+41663*x^18*y^28+
     87614372*x^17*y^28+31723*x^16*y^28+26094*x^15*y^28+31950*x^14*y^28+7385*x^13*y^28+
     87734842*x^12*y^28+39265*x^11*y^28+32953*x^10*y^28+3198*x^9*y^28+37808*x^8*y^28+
     87831909*x^7*y^28+21768*x^6*y^28+15479*x^5*y^28+1803*x^4*y^28+26958*x^3*y^28+21801*
     879x^2*y^28+24033*x*y^28+22473*y^28+7589*x^27*y^27+4367*x^26*y^27+20572*x^25*y^27+
     88039710*x^24*y^27+8092*x^23*y^27+25234*x^22*y^27+13211*x^21*y^27+11362*x^20*y^27+
     88118325*x^19*y^27+12979*x^18*y^27+41351*x^17*y^27+37022*x^16*y^27+34113*x^15*y^27+
     88210288*x^14*y^27+36321*x^13*y^27+14218*x^12*y^27+37248*x^11*y^27+40101*x^10*y^27+
     88328540*x^9*y^27+34804*x^8*y^27+9105*x^7*y^27+6660*x^6*y^27+11207*x^5*y^27+22855*x
     884^4*y^27+40243*x^3*y^27+41892*x^2*y^27+24857*x*y^27+28411*y^27+14847*x^26*y^26+
     88532215*x^25*y^26+5485*x^24*y^26+4576*x^23*y^26+39245*x^22*y^26+24182*x^21*y^26+
     88635561*x^20*y^26+5451*x^19*y^26+7418*x^18*y^26+20800*x^17*y^26+17607*x^16*y^26+
     88712464*x^15*y^26+31957*x^14*y^26+40498*x^13*y^26+13706*x^12*y^26+14134*x^11*y^26+
     88811623*x^10*y^26+31906*x^9*y^26+9172*x^8*y^26+9678*x^7*y^26+42073*x^6*y^26+21816*
     889x^5*y^26+9905*x^4*y^26+21512*x^3*y^26+9958*x^2*y^26+37130*x*y^26+18774*y^26+
     89017837*x^25*y^25+10493*x^24*y^25+27604*x^23*y^25+24967*x^22*y^25+26075*x^21*y^25+
     8912779*x^20*y^25+14140*x^19*y^25+23181*x^18*y^25+38206*x^17*y^25+12289*x^16*y^25+
     89217597*x^15*y^25+21453*x^14*y^25+2796*x^13*y^25+10492*x^12*y^25+35608*x^11*y^25+
     89311080*x^10*y^25+39047*x^9*y^25+11198*x^8*y^25+40664*x^7*y^25+8717*x^6*y^25+2104*
     894x^5*y^25+6462*x^4*y^25+945*x^3*y^25+4611*x^2*y^25+39716*x*y^25+20421*y^25+25068*
     895x^24*y^24+37094*x^23*y^24+35791*x^22*y^24+28613*x^21*y^24+16768*x^20*y^24+17224*
     896x^19*y^24+27360*x^18*y^24+40916*x^17*y^24+2844*x^16*y^24+35191*x^15*y^24+34962*x
     897^14*y^24+10333*x^13*y^24+34628*x^12*y^24+28608*x^11*y^24+10876*x^10*y^24+23038*x
     898^9*y^24+33994*x^8*y^24+30860*x^7*y^24+34744*x^6*y^24+14153*x^5*y^24+41239*x^4*y^
     89924+25076*x^3*y^24+777*x^2*y^24+13338*x*y^24+32637*y^24+38843*x^23*y^23+26338*x^
     90022*y^23+27918*x^21*y^23+24043*x^20*y^23+1599*x^19*y^23+19731*x^18*y^23+20154*x^
     90117*y^23+6166*x^16*y^23+20721*x^15*y^23+21112*x^14*y^23+8898*x^13*y^23+38361*x^12
     902*y^23+37265*x^11*y^23+10091*x^10*y^23+12686*x^9*y^23+13789*x^8*y^23+28215*x^7*y^
     90323+27651*x^6*y^23+40100*x^5*y^23+28948*x^4*y^23+5650*x^3*y^23+39475*x^2*y^23+
     90417889*x*y^23+12555*y^23+13632*x^22*y^22+5483*x^21*y^22+10809*x^20*y^22+5154*x^19
     905*y^22+41705*x^18*y^22+36857*x^17*y^22+23493*x^16*y^22+9585*x^15*y^22+13620*x^14*
     906y^22+39469*x^13*y^22+37948*x^12*y^22+27976*x^11*y^22+32606*x^10*y^22+10965*x^9*y
     907^22+36314*x^8*y^22+11877*x^7*y^22+32677*x^6*y^22+30277*x^5*y^22+36275*x^4*y^22+
     90820185*x^3*y^22+40116*x^2*y^22+7415*x*y^22+30632*y^22+24620*x^21*y^21+21412*x^20*
     909y^21+830*x^19*y^21+10356*x^18*y^21+872*x^17*y^21+20256*x^16*y^21+15659*x^15*y^21
     910+19693*x^14*y^21+15424*x^13*y^21+19893*x^12*y^21+5829*x^11*y^21+7319*x^10*y^21+
     91124476*x^9*y^21+20773*x^8*y^21+289*x^7*y^21+33710*x^6*y^21+574*x^5*y^21+38775*x^4
     912*y^21+9839*x^3*y^21+15268*x^2*y^21+27786*x*y^21+28450*y^21+20398*x^20*y^20+9431*
     913x^19*y^20+1699*x^18*y^20+33355*x^17*y^20+2995*x^16*y^20+31114*x^15*y^20+9506*x^
     91414*y^20+9026*x^13*y^20+30973*x^12*y^20+4232*x^11*y^20+16928*x^10*y^20+10179*x^9*
     915y^20+4292*x^8*y^20+10780*x^7*y^20+40092*x^6*y^20+5546*x^5*y^20+32176*x^4*y^20+
     91614031*x^3*y^20+13990*x^2*y^20+26324*x*y^20+40218*y^20+11114*x^19*y^19+30557*x^18
     917*y^19+9052*x^17*y^19+25115*x^16*y^19+35097*x^15*y^19+8092*x^14*y^19+15130*x^13*y
     918^19+8004*x^12*y^19+1495*x^11*y^19+27644*x^10*y^19+24610*x^9*y^19+38821*x^8*y^19+
     91919648*x^7*y^19+26314*x^6*y^19+23318*x^5*y^19+38165*x^4*y^19+33175*x^3*y^19+3381*
     920x^2*y^19+28440*x*y^19+207*y^19+21053*x^18*y^18+35057*x^17*y^18+8238*x^16*y^18+
     92133300*x^15*y^18+12824*x^14*y^18+37945*x^13*y^18+33900*x^12*y^18+13601*x^11*y^18+
     92229959*x^10*y^18+12862*x^9*y^18+21879*x^8*y^18+31948*x^7*y^18+3099*x^6*y^18+15507
     923*x^5*y^18+5575*x^4*y^18+26045*x^3*y^18+29592*x^2*y^18+10936*x*y^18+15772*y^18+
     924713*x^17*y^17+32307*x^16*y^17+41726*x^15*y^17+20941*x^14*y^17+28478*x^13*y^17+
     92518581*x^12*y^17+22577*x^11*y^17+30966*x^10*y^17+8170*x^9*y^17+17869*x^8*y^17+
     9266744*x^7*y^17+27888*x^6*y^17+32051*x^5*y^17+30810*x^4*y^17+14707*x^3*y^17+38126*
     927x^2*y^17+33384*x*y^17+23882*y^17+6803*x^16*y^16+30672*x^15*y^16+26280*x^14*y^16+
     92814477*x^13*y^16+24391*x^12*y^16+11327*x^11*y^16+2705*x^10*y^16+36645*x^9*y^16+
     92911888*x^8*y^16+32246*x^7*y^16+13623*x^6*y^16+37322*x^5*y^16+38519*x^4*y^16+31179
     930*x^3*y^16+34600*x^2*y^16+29376*x*y^16+2154*y^16+26152*x^15*y^15+13168*x^14*y^15+
     93113683*x^13*y^15+4036*x^12*y^15+20263*x^11*y^15+31133*x^10*y^15+26193*x^9*y^15+
     9326801*x^8*y^15+11653*x^7*y^15+9040*x^6*y^15+36600*x^5*y^15+946*x^4*y^15+4003*x^3*
     933y^15+9589*x^2*y^15+412*x*y^15+2699*y^15+5480*x^14*y^14+11828*x^13*y^14+10150*x^
     93412*y^14+26355*x^11*y^14+10819*x^10*y^14+35113*x^9*y^14+15186*x^8*y^14+20558*x^7*
     935y^14+19722*x^6*y^14+40367*x^5*y^14+5224*x^4*y^14+1701*x^3*y^14+38742*x^2*y^14+
     93613350*x*y^14+265*y^14+34787*x^13*y^13+23544*x^12*y^13+31722*x^11*y^13+14630*x^10
     937*y^13+30193*x^9*y^13+34518*x^8*y^13+37652*x^7*y^13+8454*x^6*y^13+23095*x^5*y^13+
     93840459*x^4*y^13+19841*x^3*y^13+20398*x^2*y^13+33334*x*y^13+41152*y^13+29967*x^12*
     939y^12+9540*x^11*y^12+36229*x^10*y^12+1670*x^9*y^12+21738*x^8*y^12+744*x^7*y^12+
     94040820*x^6*y^12+6388*x^5*y^12+14649*x^4*y^12+27675*x^3*y^12+23094*x^2*y^12+15691*
     941x*y^12+4379*y^12+6842*x^11*y^11+42560*x^10*y^11+31197*x^9*y^11+34010*x^8*y^11+
     94225953*x^7*y^11+32134*x^6*y^11+33154*x^5*y^11+27110*x^4*y^11+17143*x^3*y^11+20511
     943*x^2*y^11+38503*x*y^11+17850*y^11+4599*x^10*y^10+22849*x^9*y^10+25896*x^8*y^10+
     94425981*x^7*y^10+13940*x^6*y^10+34610*x^5*y^10+20111*x^4*y^10+37706*x^3*y^10+39941
     945*x^2*y^10+22020*x*y^10+30878*y^10+42108*x^9*y^9+39357*x^8*y^9+5802*x^7*y^9+11442
     946*x^6*y^9+22956*x^5*y^9+13392*x^4*y^9+10615*x^3*y^9+9505*x^2*y^9+2863*x*y^9+33798
     947*y^9+5939*x^8*y^8+36618*x^7*y^8+13200*x^6*y^8+8689*x^5*y^8+518*x^4*y^8+4026*x^3*
     948y^8+16640*x^2*y^8+39860*x*y^8+32154*y^8+11496*x^7*y^7+3970*x^6*y^7+16147*x^5*y^7
     949+42885*x^4*y^7+22064*x^3*y^7+32153*x^2*y^7+39290*x*y^7+37882*y^7+20742*x^6*y^6+
     95016687*x^5*y^6+1890*x^4*y^6+38545*x^3*y^6+35135*x^2*y^6+16921*x*y^6+42898*y^6+
     95140861*x^5*y^5+16687*x^4*y^5+22548*x^3*y^5+9752*x^2*y^5+9003*x*y^5+14580*y^5+
     95218136*x^4*y^4+21446*x^3*y^4+12391*x^2*y^4+29220*x*y^4+13920*y^4+4960*x^3*y^3+
     9532851*x^2*y^3+1789*x*y^3+33655*y^3+28567*x^2*y^2+24794*x*y^2+19511*y^2+25676*x*y+
     9548828*y+18760)*(y^55+x*y+x^55)*(y+11888*x)*(y+31162*x)*(y^2+11695*x*y+43050*x^2)*
     955(y^2+x^2)*(y^2+31356*x*y+43050*x^2)*(y^27+x^55)*(y+x)^2;
     956
     957system ("--random", 1977);
     958l= factorize (f); testfactors (l, f);
     959
    593960tst_status(1);$
  • Tst/Short/absfact.res.gz.uu

    r6ad45e r0b7a8a6  
    1 begin 644 absfact.res.gz
    2 M'XL("(:2UE(``V%B<V9A8W0N<F5S`.V<6V_<N!7'W_TIB&"!E4:231[>Q#5F
     1begin 640 absfact.res.gz
     2M'XL("%M1WE(``V%B<V9A8W0N<F5S`.V<6V_<N!7'W_TIB&"!E4:231[>Q#5F
    33M'K9%BP6*/L1Y6\2!QAEO!G7MP*/44CY]#^="<BQ*\KB;/#1RD+'$VT@Z__/3
    44M(77DJW=__>V?A!"V(/_X[5?RIM[4YW?KY9O+LZM]#2P(%GY8WZ_K)+T\L[_)
     
    4949M2"B5P!HI*%4**#+*R:D0'/M2H-@)0QXM4)'=LC929H,<+90HI>*`-QQ%-1.`
    5050M7V'#7Z!:":/!4+S!V:ZEH*7"@V.E.2$J`JDJ4=A/7FANOP?#:&,8I8;9&;W"
    51 M,94L%0,3":[+P&<?_4S+)NM%[6'8%%&]1N`&^BYH+/V:F?&$@S#4X@4KK=E1
    52 M204PM4=FI[2-EIX4CJ'21,7MVQPHX5+9U0`PL2F\\?G>S(1_&V6_9I1_W:\:
    53 M=23SUDKFT//P:L8M]FP%,KAH89:PHH'@$O:]JC'QME>.)K)*!/2DY4N[@->*
    54 M8GMG?*E\NO=EH,';'&_]H<#$F5<8%F@,)T!/P<F?9EA/`*!(@`!_++W\Z>R_
    55 (-K".YKE)````
     51M,94L%0,3":[+P&<?_4S+)NM%[6'8%%&]1N`&^BYH+/V:F?&$@S#4L@&,9:C@
     52M58&"VB.S4]I&2T\*QT3!46B9*)6-S,QV#B<51)1E?,(W,^$?1]DO&N5?]\M&
     53M'<V\M9HY]#R\FW&+/5N!$"Y:F"6L:""XAGWO:DS`[=6CB2P3`3UI_=*NX+6B
     54MV-X:7ZJ?[HT9:/`ZQUM_*#"!YA6&!1KC"=!3>/*G&=83`"@2(.`?2R]_.OLO
     55([:LX;KI)````
    5656`
    5757end
  • factory/FLINTconvert.cc

    re82b5f2 r0b7a8a6  
    4646#include <flint/nmod_mat.h>
    4747#include <flint/fmpz_mat.h>
     48#if (__FLINT_VERSION_MINOR >= 4)
     49#include <flint/fq.h>
     50#include <flint/fq_poly.h>
     51#include <flint/fq_nmod.h>
     52#include <flint/fq_nmod_poly.h>
     53#include <flint/fq_nmod_mat.h>
     54#endif
    4855#ifdef __cplusplus
    4956}
     
    7380}
    7481
    75 CanonicalForm convertFmpz2CF (fmpz_t coefficient)
     82CanonicalForm convertFmpz2CF (const fmpz_t coefficient)
    7683{
    7784  if (fmpz_cmp_si (coefficient, MINIMMEDIATE) >= 0 &&
     
    9198}
    9299
    93 CanonicalForm convertFmpz_poly_t2FacCF (fmpz_poly_t poly, const Variable& x)
     100CanonicalForm
     101convertFmpz_poly_t2FacCF (const fmpz_poly_t poly, const Variable& x)
    94102{
    95103  CanonicalForm result= 0;
     
    104112}
    105113
    106 void convertFacCF2nmod_poly_t (nmod_poly_t result, const CanonicalForm& f)
     114void
     115convertFacCF2nmod_poly_t (nmod_poly_t result, const CanonicalForm& f)
    107116{
    108117  bool save_sym_ff= isOn (SW_SYMMETRIC_FF);
     
    125134}
    126135
    127 CanonicalForm convertnmod_poly_t2FacCF (nmod_poly_t poly, const Variable& x)
     136CanonicalForm
     137convertnmod_poly_t2FacCF (const nmod_poly_t poly, const Variable& x)
    128138{
    129139  CanonicalForm result= 0;
     
    188198}
    189199
    190 CanonicalForm convertFmpq_poly_t2FacCF (fmpq_poly_t p, const Variable& x)
     200CanonicalForm
     201convertFmpq_poly_t2FacCF (const fmpq_poly_t p, const Variable& x)
    191202{
    192203  CanonicalForm result= 0;
    193204  fmpq_t coeff;
    194   long n= fmpq_poly_length (p);
     205  long n= p->length;
    195206  for (long i= 0; i < n; i++)
    196207  {
     
    226237
    227238CFFList
    228 convertFLINTnmod_poly_factor2FacCFFList (nmod_poly_factor_t fac,
    229                                           mp_limb_t leadingCoeff,
     239convertFLINTnmod_poly_factor2FacCFFList (const nmod_poly_factor_t fac,
     240                                          const mp_limb_t leadingCoeff,
    230241                                          const Variable& x
    231242                                         )
     
    238249
    239250  for (i = 0; i < fac->num; i++)
    240     result.append (CFFactor (convertnmod_poly_t2FacCF ((nmod_poly_t &)fac->p[i],x),
     251    result.append (CFFactor (convertnmod_poly_t2FacCF (
     252                             (nmod_poly_t &)fac->p[i],x),
    241253                             fac->exp[i]));
    242254  return result;
    243255}
     256
     257#if __FLINT_VERSION_MINOR >= 4
     258CFFList
     259convertFLINTFq_nmod_poly_factor2FacCFFList (const fq_nmod_poly_factor_t fac,
     260                                       const Variable& x, const Variable& alpha,
     261                                       const fq_nmod_ctx_t fq_con
     262                                         )
     263{
     264  CFFList result;
     265
     266  long i;
     267
     268  for (i = 0; i < fac->num; i++)
     269    result.append (CFFactor (convertFq_nmod_poly_t2FacCF (
     270                             (fq_nmod_poly_t &)fac->poly[i], x, alpha, fq_con),
     271                             fac->exp[i]));
     272  return result;
     273}
     274#endif
    244275
    245276void
     
    255286
    256287CanonicalForm
    257 convertFmpz_mod_poly_t2FacCF (fmpz_mod_poly_t poly, const Variable& x,
     288convertFmpz_mod_poly_t2FacCF (const fmpz_mod_poly_t poly, const Variable& x,
    258289                              const modpk& b)
    259290{
     
    266297}
    267298
    268 void convertFacCFMatrix2Fmpz_mat_t (fmpz_mat_t M, CFMatrix &m)
     299#if __FLINT_VERSION_MINOR >= 4
     300void
     301convertFacCF2Fq_nmod_t (fq_nmod_t result, const CanonicalForm& f,
     302                        const fq_nmod_ctx_t ctx)
     303{
     304  bool save_sym_ff= isOn (SW_SYMMETRIC_FF);
     305  if (save_sym_ff) Off (SW_SYMMETRIC_FF);
     306  for (CFIterator i= f; i.hasTerms(); i++)
     307  {
     308    CanonicalForm c= i.coeff();
     309    if (!c.isImm()) c=c.mapinto(); //c%= getCharacteristic();
     310    if (!c.isImm())
     311    {  //This case will never happen if the characteristic is in fact a prime
     312       // number, since all coefficients are represented as immediates
     313       printf("convertFacCF2Fq_nmod_t: coefficient not immediate!, char=%d\n",
     314              getCharacteristic());
     315    }
     316    else
     317    {
     318      STICKYASSERT (i.exp() <= fq_nmod_ctx_degree(ctx), "convertFacCF2Fq_nmod_t: element is not reduced");
     319      nmod_poly_set_coeff_ui (result, i.exp(), c.intval());
     320    }
     321  }
     322  if (save_sym_ff) On (SW_SYMMETRIC_FF);
     323}
     324
     325CanonicalForm
     326convertFq_nmod_t2FacCF (const fq_nmod_t poly, const Variable& alpha)
     327{
     328  return convertnmod_poly_t2FacCF (poly, alpha);
     329}
     330
     331void
     332convertFacCF2Fq_t (fq_t result, const CanonicalForm& f, const fq_ctx_t ctx)
     333{
     334  fmpz_poly_init2 (result, fq_ctx_degree(ctx));
     335  ASSERT (degree (f) < fq_ctx_degree (ctx), "input is not reduced");
     336  _fmpz_poly_set_length(result, degree(f)+1);
     337  for (CFIterator i= f; i.hasTerms(); i++)
     338    convertCF2Fmpz (fmpz_poly_get_coeff_ptr(result, i.exp()), i.coeff());
     339  _fmpz_vec_scalar_mod_fmpz (result->coeffs, result->coeffs, degree (f) + 1,
     340                             &ctx->p);
     341  _fmpz_poly_normalise (result);
     342}
     343
     344CanonicalForm
     345convertFq_t2FacCF (const fq_t poly, const Variable& alpha)
     346{
     347  return convertFmpz_poly_t2FacCF (poly, alpha);
     348}
     349
     350void
     351convertFacCF2Fq_poly_t (fq_poly_t result, const CanonicalForm& f,
     352                        const fq_ctx_t ctx)
     353{
     354  fq_poly_init2 (result, degree (f)+1, ctx);
     355  _fq_poly_set_length (result, degree (f) + 1, ctx);
     356  fmpz_poly_t buf;
     357  for (CFIterator i= f; i.hasTerms(); i++)
     358  {
     359    convertFacCF2Fmpz_poly_t (buf, i.coeff());
     360    _fmpz_vec_scalar_mod_fmpz (buf->coeffs, buf->coeffs, degree (i.coeff()) + 1,
     361                               &ctx->p);
     362    _fmpz_poly_normalise (buf);
     363    fq_poly_set_coeff (result, i.exp(), buf, ctx);
     364    fmpz_poly_clear (buf);
     365  }
     366}
     367
     368void
     369convertFacCF2Fq_nmod_poly_t (fq_nmod_poly_t result, const CanonicalForm& f,
     370                             const fq_nmod_ctx_t ctx)
     371{
     372  fq_nmod_poly_init2 (result, degree (f)+1, ctx);
     373  _fq_nmod_poly_set_length (result, degree (f) + 1, ctx);
     374  fq_nmod_t buf;
     375  fq_nmod_init2 (buf, ctx);
     376  for (CFIterator i= f; i.hasTerms(); i++)
     377  {
     378    convertFacCF2Fq_nmod_t (buf, i.coeff(), ctx);
     379    fq_nmod_poly_set_coeff (result, i.exp(), buf, ctx);
     380    fq_nmod_zero (buf, ctx);
     381  }
     382  fq_nmod_clear (buf, ctx);
     383}
     384
     385CanonicalForm
     386convertFq_poly_t2FacCF (const fq_poly_t p, const Variable& x,
     387                        const Variable& alpha, const fq_ctx_t ctx)
     388{
     389  CanonicalForm result= 0;
     390  fq_t coeff;
     391  long n= fq_poly_length (p, ctx);
     392  fq_init2 (coeff, ctx);
     393  for (long i= 0; i < n; i++)
     394  {
     395    fq_poly_get_coeff (coeff, p, i, ctx);
     396    if (fq_is_zero (coeff, ctx))
     397      continue;
     398    result += convertFq_t2FacCF (coeff, alpha)*power (x, i);
     399    fq_zero (coeff, ctx);
     400  }
     401  fq_clear (coeff, ctx);
     402
     403  return result;
     404}
     405
     406CanonicalForm
     407convertFq_nmod_poly_t2FacCF (const fq_nmod_poly_t p, const Variable& x,
     408                             const Variable& alpha, const fq_nmod_ctx_t ctx)
     409{
     410  CanonicalForm result= 0;
     411  fq_nmod_t coeff;
     412  long n= fq_nmod_poly_length (p, ctx);
     413  fq_nmod_init2 (coeff, ctx);
     414  for (long i= 0; i < n; i++)
     415  {
     416    fq_nmod_poly_get_coeff (coeff, p, i, ctx);
     417    if (fq_nmod_is_zero (coeff, ctx))
     418      continue;
     419    result += convertFq_nmod_t2FacCF (coeff, alpha)*power (x, i);
     420    fq_nmod_zero (coeff, ctx);
     421  }
     422  fq_nmod_clear (coeff, ctx);
     423
     424  return result;
     425}
     426#endif
     427
     428void convertFacCFMatrix2Fmpz_mat_t (fmpz_mat_t M, const CFMatrix &m)
    269429{
    270430  fmpz_mat_init (M, (long) m.rows(), (long) m.columns());
     
    279439  }
    280440}
    281 CFMatrix* convertFmpz_mat_t2FacCFMatrix(fmpz_mat_t m)
     441CFMatrix* convertFmpz_mat_t2FacCFMatrix(const fmpz_mat_t m)
    282442{
    283443  CFMatrix *res=new CFMatrix(fmpz_mat_nrows (m),fmpz_mat_ncols (m));
     
    293453}
    294454
    295 void convertFacCFMatrix2nmod_mat_t (nmod_mat_t M, CFMatrix &m)
     455void convertFacCFMatrix2nmod_mat_t (nmod_mat_t M, const CFMatrix &m)
    296456{
    297457  nmod_mat_init (M, (long) m.rows(), (long) m.columns(), getCharacteristic());
     
    311471}
    312472
    313 CFMatrix* convertNmod_mat_t2FacCFMatrix(nmod_mat_t m)
     473CFMatrix* convertNmod_mat_t2FacCFMatrix(const nmod_mat_t m)
    314474{
    315475  CFMatrix *res=new CFMatrix(nmod_mat_nrows (m), nmod_mat_ncols (m));
     
    325485}
    326486
    327 #endif
    328 
    329 
     487#if __FLINT_VERSION_MINOR >= 4
     488void
     489convertFacCFMatrix2Fq_nmod_mat_t (fq_nmod_mat_t M,
     490                                  const fq_nmod_ctx_t fq_con, const CFMatrix &m)
     491{
     492  fq_nmod_mat_init (M, (long) m.rows(), (long) m.columns(), fq_con);
     493  int i,j;
     494  for(i=m.rows();i>0;i--)
     495  {
     496    for(j=m.columns();j>0;j--)
     497    {
     498      convertFacCF2nmod_poly_t (M->rows[i-1]+j-1, m (i,j));
     499    }
     500  }
     501}
     502
     503CFMatrix*
     504convertFq_nmod_mat_t2FacCFMatrix(const fq_nmod_mat_t m,
     505                                 const fq_nmod_ctx_t& fq_con,
     506                                 const Variable& alpha)
     507{
     508  CFMatrix *res=new CFMatrix(fq_nmod_mat_nrows (m, fq_con),
     509                             fq_nmod_mat_ncols (m, fq_con));
     510  int i,j;
     511  for(i=res->rows();i>0;i--)
     512  {
     513    for(j=res->columns();j>0;j--)
     514    {
     515      (*res)(i,j)=convertFq_nmod_t2FacCF (fq_nmod_mat_entry (m, i-1, j-1),
     516                                          alpha);
     517    }
     518  }
     519  return res;
     520}
     521#endif
     522
     523#endif
     524
     525
  • factory/FLINTconvert.h

    re82b5f2 r0b7a8a6  
    3535#include <flint/nmod_mat.h>
    3636#include <flint/fmpz_mat.h>
     37#if (__FLINT_VERSION_MINOR >= 4)
     38#include <flint/fq.h>
     39#include <flint/fq_poly.h>
     40#include <flint/fq_nmod.h>
     41#include <flint/fq_nmod_poly.h>
     42#include <flint/fq_nmod_mat.h>
     43#endif
    3744#ifdef __cplusplus
    3845}
     
    5764/// conversion of a FLINT integer to CanonicalForm
    5865CanonicalForm
    59 convertFmpz2CF (fmpz_t coefficient ///< [in] a FLINT integer
     66convertFmpz2CF (const fmpz_t coefficient ///< [in] a FLINT integer
    6067               );
    6168
    6269/// conversion of a FLINT poly over Z to CanonicalForm
    6370CanonicalForm
    64 convertFmpz_poly_t2FacCF (fmpz_poly_t poly, ///< [in] an fmpz_poly_t
     71convertFmpz_poly_t2FacCF (const fmpz_poly_t poly, ///< [in] an fmpz_poly_t
    6572                          const Variable& x ///< [in] variable the result should
    6673                                            ///< have
     
    7784/// conversion of a FLINT poly over Z/p to CanonicalForm
    7885CanonicalForm
    79 convertnmod_poly_t2FacCF (nmod_poly_t poly, ///< [in] a nmod_poly_t
     86convertnmod_poly_t2FacCF (const nmod_poly_t poly, ///< [in] a nmod_poly_t
    8087                          const Variable& x ///< [in] variable the result should
    8188                                            ///< have
     
    98105/// conversion of a FLINT poly over Q to CanonicalForm
    99106CanonicalForm
    100 convertFmpq_poly_t2FacCF (fmpq_poly_t p,    ///< [in] an fmpq_poly_t
     107convertFmpq_poly_t2FacCF (const fmpq_poly_t p,    ///< [in] an fmpq_poly_t
    101108                          const Variable& x ///< [in] variable the result should
    102109                                            ///< have
     
    107114CFFList
    108115convertFLINTnmod_poly_factor2FacCFFList (
    109                    nmod_poly_factor_t fac, ///< [in] a nmod_poly_factor_t
    110                    mp_limb_t leadingCoeff, ///< [in] leading coefficient
     116                   const nmod_poly_factor_t fac, ///< [in] a nmod_poly_factor_t
     117                   const mp_limb_t leadingCoeff, ///< [in] leading coefficient
    111118                   const Variable& x       ///< [in] variable the result should
    112119                                           ///< have
     
    127134CanonicalForm
    128135convertFmpz_mod_poly_t2FacCF (
    129                           fmpz_mod_poly_t poly, ///< [in] fmpz_mod_poly_t
     136                          const fmpz_mod_poly_t poly, ///< [in] fmpz_mod_poly_t
    130137                          const Variable& x,    ///< [in] variable the result
    131138                                                ///< should have
     
    134141                             );
    135142
     143#if __FLINT_VERSION_MINOR >= 4
     144/// conversion of a FLINT element of F_q to a CanonicalForm with alg. variable
     145/// alpha
     146CanonicalForm
     147convertFq_nmod_t2FacCF (const fq_nmod_t poly, ///< [in] fq_nmod_t
     148                        const Variable& alpha ///< [in] algebraic variable
     149                       );
     150
     151/// conversion of a FLINT element of F_q with non-word size p to a CanonicalForm
     152/// with alg. variable alpha
     153CanonicalForm
     154convertFq_t2FacCF (const fq_t poly,      ///< [in] fq_t
     155                   const Variable& alpha ///< [in] algebraic variable
     156                  );
     157
     158/// conversion of a factory element of F_q to a FLINT fq_nmod_t, does not do any
     159/// memory allocation for poly
     160void
     161convertFacCF2Fq_nmod_t (fq_nmod_t result,       ///< [in,out] fq_nmod_t
     162                        const CanonicalForm& f, ///< [in] element of Fq
     163                        const fq_nmod_ctx_t ctx ///< [in] Fq context
     164                       );
     165
     166/// conversion of a factory element of F_q (for non-word size p) to a FLINT fq_t
     167void
     168convertFacCF2Fq_t (fq_t result,            ///< [in,out] fq_t
     169                   const CanonicalForm& f, ///< [in] element of Fq
     170                   const fq_ctx_t ctx      ///< [in] Fq context
     171                  );
     172
     173/// conversion of a factory univariate poly over F_q (for non-word size p) to a
     174/// FLINT fq_poly_t
     175void
     176convertFacCF2Fq_poly_t (fq_poly_t result,      ///< [in,out] fq_poly_t
     177                        const CanonicalForm& f,///< [in] univariate poly over Fq
     178                        const fq_ctx_t ctx     ///< [in] Fq context
     179                       );
     180
     181/// conversion of a factory univariate poly over F_q to a FLINT fq_nmod_poly_t
     182void
     183convertFacCF2Fq_nmod_poly_t (fq_nmod_poly_t result, ///< [in,out] fq_nmod_poly_t
     184                             const CanonicalForm& f,///< [in] univariate poly
     185                                                    ///< over Fq
     186                             const fq_nmod_ctx_t ctx///< [in] Fq context
     187                            );
     188
     189/// conversion of a FLINT poly over Fq (for non-word size p) to a CanonicalForm
     190/// with alg. variable alpha and polynomial variable x
     191CanonicalForm
     192convertFq_poly_t2FacCF (const fq_poly_t p,     ///< [in] fq_poly_t
     193                        const Variable& x,     ///< [in] polynomial variable
     194                        const Variable& alpha, ///< [in] algebraic variable
     195                        const fq_ctx_t ctx     ///< [in] Fq context
     196                       );
     197
     198/// conversion of a FLINT poly over Fq to a CanonicalForm with alg. variable
     199/// alpha and polynomial variable x
     200CanonicalForm
     201convertFq_nmod_poly_t2FacCF (const fq_nmod_poly_t p, ///< [in] fq_nmod_poly_t
     202                             const Variable& x,      ///< [in] polynomial var.
     203                             const Variable& alpha,  ///< [in] algebraic var.
     204                             const fq_nmod_ctx_t ctx ///< [in] Fq context
     205                            );
     206#endif
     207
    136208/// conversion of a factory matrix over Z to a fmpz_mat_t
    137 void convertFacCFMatrix2Fmpz_mat_t (fmpz_mat_t M, ///<[in,out] fmpz_mat_t
    138                                     CFMatrix &m   ///<[in] matrix over Z
     209void convertFacCFMatrix2Fmpz_mat_t (fmpz_mat_t M,      ///<[in,out] fmpz_mat_t
     210                                    const CFMatrix &m  ///<[in] matrix over Z
    139211                                   );
    140212
    141213/// conversion of a FLINT matrix over Z to a factory matrix
    142 CFMatrix* convertFmpz_mat_t2FacCFMatrix(fmpz_mat_t m ///<[in] fmpz_mat_t
     214CFMatrix* convertFmpz_mat_t2FacCFMatrix(const fmpz_mat_t m ///<[in] fmpz_mat_t
    143215                                       );
    144216
    145217/// conversion of a factory matrix over Z/p to a nmod_mat_t
    146 void convertFacCFMatrix2nmod_mat_t (nmod_mat_t M, ///<[in,out] nmod_mat_t
    147                                     CFMatrix &m  ///<[in] matrix over Z/p
     218void convertFacCFMatrix2nmod_mat_t (nmod_mat_t M,     ///<[in,out] nmod_mat_t
     219                                    const CFMatrix &m ///<[in] matrix over Z/p
    148220                                   );
    149221
    150222/// conversion of a FLINT matrix over Z/p to a factory matrix
    151 CFMatrix* convertNmod_mat_t2FacCFMatrix(nmod_mat_t m ///<[in] nmod_mat_t
     223CFMatrix* convertNmod_mat_t2FacCFMatrix(const nmod_mat_t m ///<[in] nmod_mat_t
    152224                                       );
    153225
    154 #endif
    155 #endif
     226#if __FLINT_VERSION_MINOR >= 4
     227/// conversion of a FLINT matrix over F_q to a factory matrix
     228CFMatrix*
     229convertFq_nmod_mat_t2FacCFMatrix(const fq_nmod_mat_t m,       ///< [in] fq_nmod_mat_t
     230                                 const fq_nmod_ctx_t& fq_con, ///< [in] Fq context
     231                                 const Variable& alpha ///< [in] algebraic variable
     232                                );
     233
     234/// conversion of a factory matrix over F_q to a fq_nmod_mat_t
     235void
     236convertFacCFMatrix2Fq_nmod_mat_t (fq_nmod_mat_t M,            ///< [in, out] fq_nmod_mat_t
     237                                  const fq_nmod_ctx_t fq_con, ///< [in] Fq context
     238                                  const CFMatrix &m           ///< [in] matrix over Fq
     239                                 );
     240
     241/// conversion of a FLINT factorization over Fq (for word size p) to a
     242/// CFFList
     243CFFList
     244convertFLINTFq_nmod_poly_factor2FacCFFList (const fq_nmod_poly_factor_t fac, ///< [in] fq_nmod_poly_factor_t
     245                                          const Variable& x,     ///< [in] polynomial variable
     246                                          const Variable& alpha, ///< [in] algebraic variable
     247                                          const fq_nmod_ctx_t fq_con ///< [in] Fq context
     248                                           );
     249#endif
     250
     251
     252#endif
     253#endif
  • factory/algext.cc

    re82b5f2 r0b7a8a6  
    239239}
    240240
     241#ifndef HAVE_NTL
    241242void tryDivrem (const CanonicalForm& F, const CanonicalForm& G, CanonicalForm& Q,
    242243                CanonicalForm& R, CanonicalForm& inv, const CanonicalForm& mipo,
     
    345346  }
    346347}
     348#endif
    347349
    348350bool hasFirstAlgVar( const CanonicalForm & f, Variable & a )
     
    972974}
    973975
     976#ifndef HAVE_NTL
    974977void tryExtgcd( const CanonicalForm & F, const CanonicalForm & G, const CanonicalForm & M, CanonicalForm & result, CanonicalForm & s, CanonicalForm & t, bool & fail )
    975978{ // F, G are univariate polynomials (i.e. they have exactly one polynomial variable)
     
    10411044  }
    10421045}
    1043 
     1046#endif
    10441047
    10451048static CanonicalForm trycontent ( const CanonicalForm & f, const Variable & x, const CanonicalForm & M, bool & fail )
     
    10911094}
    10921095
    1093 void tryExtgcd( const CanonicalForm & F, const CanonicalForm & G, CanonicalForm & result, CanonicalForm & s, CanonicalForm & t, bool & fail )
    1094 {
    1095   // F, G are univariate polynomials (i.e. they have exactly one polynomial variable)
    1096   // F and G must have the same level AND level > 0
    1097   // we try to calculate gcd(f,g) = s*F + t*G
    1098   // if a zero divisor is encontered, 'fail' is set to one
    1099   Variable a, b;
    1100   if( !hasFirstAlgVar(F,a) && !hasFirstAlgVar(G,b) ) // note lazy evaluation
    1101   {
    1102     result = extgcd( F, G, s, t ); // no zero divisors possible
    1103     return;
    1104   }
    1105   if( b.level() > a.level() )
    1106     a = b;
    1107   // here: a is the biggest alg. var in F and G
    1108   CanonicalForm M = getMipo(a);
    1109   CanonicalForm P;
    1110   if( degree(F) > degree(G) )
    1111   {
    1112     P=F; result=G; s=0; t=1;
    1113   }
    1114   else
    1115   {
    1116     P=G; result=F; s=1; t=0;
    1117   }
    1118   CanonicalForm inv, rem, q, u, v;
    1119   // here: degree(P) >= degree(result)
    1120   while(true)
    1121   {
    1122     tryInvert( Lc(result), M, inv, fail );
    1123     if(fail)
    1124       return;
    1125     // here: Lc(result) is invertible modulo M
    1126     q = Lc(P)*inv * power( P.mvar(), degree(P)-degree(result) );
    1127     rem = P - q*result;
    1128     // here: s*F + t*G = result
    1129     if( rem.isZero() )
    1130     {
    1131       s*=inv;
    1132       t*=inv;
    1133       result *= inv; // monify result
    1134       return;
    1135     }
    1136     P=result;
    1137     result=rem;
    1138     rem=u-q*s;
    1139     u=s;
    1140     s=rem;
    1141     rem=v-q*t;
    1142     v=t;
    1143     t=rem;
    1144   }
    1145 }
    1146 
    1147 void tryCRA( const CanonicalForm & x1, const CanonicalForm & q1, const CanonicalForm & x2, const CanonicalForm & q2, CanonicalForm & xnew, CanonicalForm & qnew, bool & fail )
    1148 { // polys of level <= 1 are considered coefficients. q1,q2 are assumed to be coprime
    1149   // xnew = x1 mod q1 (coefficientwise in the above sense)
    1150   // xnew = x2 mod q2
    1151   // qnew = q1*q2
    1152   CanonicalForm tmp;
    1153   if(x1.level() <= 1 && x2.level() <= 1) // base case
    1154   {
    1155     tryExtgcd(q1,q2,tmp,xnew,qnew,fail);
    1156     if(fail)
    1157       return;
    1158     xnew = x1 + (x2-x1) * xnew * q1;
    1159     qnew = q1*q2;
    1160     xnew = mod(xnew,qnew);
    1161     return;
    1162   }
    1163   CanonicalForm tmp2;
    1164   xnew = 0;
    1165   qnew = q1 * q2;
    1166   // here: x1.level() > 1 || x2.level() > 1
    1167   if(x1.level() > x2.level())
    1168   {
    1169     for(CFIterator i=x1; i.hasTerms(); i++)
    1170     {
    1171       if(i.exp() == 0) // const. term
    1172       {
    1173         tryCRA(i.coeff(),q1,x2,q2,tmp,tmp2,fail);
    1174         if(fail)
    1175           return;
    1176         xnew += tmp;
    1177       }
    1178       else
    1179       {
    1180         tryCRA(i.coeff(),q1,0,q2,tmp,tmp2,fail);
    1181         if(fail)
    1182           return;
    1183         xnew += tmp * power(x1.mvar(),i.exp());
    1184       }
    1185     }
    1186     return;
    1187   }
    1188   // here: x1.level() <= x2.level() && ( x1.level() > 1 || x2.level() > 1 )
    1189   if(x2.level() > x1.level())
    1190   {
    1191     for(CFIterator j=x2; j.hasTerms(); j++)
    1192     {
    1193       if(j.exp() == 0) // const. term
    1194       {
    1195         tryCRA(x1,q1,j.coeff(),q2,tmp,tmp2,fail);
    1196         if(fail)
    1197           return;
    1198         xnew += tmp;
    1199       }
    1200       else
    1201       {
    1202         tryCRA(0,q1,j.coeff(),q2,tmp,tmp2,fail);
    1203         if(fail)
    1204           return;
    1205         xnew += tmp * power(x2.mvar(),j.exp());
    1206       }
    1207     }
    1208     return;
    1209   }
    1210   // here: x1.level() == x2.level() && x1.level() > 1 && x2.level() > 1
    1211   CFIterator i = x1;
    1212   CFIterator j = x2;
    1213   while(i.hasTerms() || j.hasTerms())
    1214   {
    1215     if(i.hasTerms())
    1216     {
    1217       if(j.hasTerms())
    1218       {
    1219         if(i.exp() == j.exp())
    1220         {
    1221           tryCRA(i.coeff(),q1,j.coeff(),q2,tmp,tmp2,fail);
    1222           if(fail)
    1223             return;
    1224           xnew += tmp * power(x1.mvar(),i.exp());
    1225           i++; j++;
    1226         }
    1227         else
    1228         {
    1229           if(i.exp() < j.exp())
    1230           {
    1231             tryCRA(i.coeff(),q1,0,q2,tmp,tmp2,fail);
    1232             if(fail)
    1233               return;
    1234             xnew += tmp * power(x1.mvar(),i.exp());
    1235             i++;
    1236           }
    1237           else // i.exp() > j.exp()
    1238           {
    1239             tryCRA(0,q1,j.coeff(),q2,tmp,tmp2,fail);
    1240             if(fail)
    1241               return;
    1242             xnew += tmp * power(x1.mvar(),j.exp());
    1243             j++;
    1244           }
    1245         }
    1246       }
    1247       else // j is out of terms
    1248       {
    1249         tryCRA(i.coeff(),q1,0,q2,tmp,tmp2,fail);
    1250         if(fail)
    1251           return;
    1252         xnew += tmp * power(x1.mvar(),i.exp());
    1253         i++;
    1254       }
    1255     }
    1256     else // i is out of terms
    1257     {
    1258       tryCRA(0,q1,j.coeff(),q2,tmp,tmp2,fail);
    1259       if(fail)
    1260         return;
    1261       xnew += tmp * power(x1.mvar(),j.exp());
    1262       j++;
    1263     }
    1264   }
    1265 }
    1266 
  • factory/algext.h

    re82b5f2 r0b7a8a6  
    88
    99CanonicalForm QGCD( const CanonicalForm &, const CanonicalForm & );
     10#ifndef HAVE_NTL
    1011void tryDivrem (const CanonicalForm&, const CanonicalForm&, CanonicalForm&,
    1112                CanonicalForm&, CanonicalForm&, const CanonicalForm&,
    1213                bool&);
    1314void tryEuclid( const CanonicalForm &, const CanonicalForm &, const CanonicalForm &, CanonicalForm &, bool & );
     15void tryExtgcd( const CanonicalForm & F, const CanonicalForm & G, const CanonicalForm& M, CanonicalForm & result, CanonicalForm & s, CanonicalForm & t, bool & fail );
     16#endif
    1417void tryInvert( const CanonicalForm &, const CanonicalForm &, CanonicalForm &, bool & );
    1518bool hasFirstAlgVar( const CanonicalForm &, Variable & );
    1619void tryBrownGCD( const CanonicalForm & F, const CanonicalForm & G, const CanonicalForm & M, CanonicalForm & result, bool & fail, bool topLevel= true );
    17 void tryExtgcd( const CanonicalForm & F, const CanonicalForm & G, const CanonicalForm& M, CanonicalForm & result, CanonicalForm & s, CanonicalForm & t, bool & fail );
    1820int * leadDeg(const CanonicalForm & f, int *degs);
    1921bool isLess(int *a, int *b, int lower, int upper);
  • factory/cf_chinese.cc

    re82b5f2 r0b7a8a6  
    161161//}}}
    162162
     163#ifndef HAVE_NTL
    163164CanonicalForm Farey_n (CanonicalForm N, const CanonicalForm P)
    164165//"USAGE:  Farey_n (N,P); P, N number;
     
    190191   return(0);
    191192}
     193#endif
    192194
    193195CanonicalForm Farey ( const CanonicalForm & f, const CanonicalForm & q )
  • factory/cf_factor.cc

    re82b5f2 r0b7a8a6  
    632632}
    633633
    634 #ifdef HAVE_NTL
    635 CanonicalForm fntl ( const CanonicalForm & f, int j )
    636 {
    637   ZZX f1=convertFacCF2NTLZZX(f);
    638   return convertZZ2CF(coeff(f1,j));
    639 }
    640 #endif
    641 
    642634CFFList factorize ( const CanonicalForm & f, const Variable & alpha )
    643635{
     
    657649      if (ch>2)
    658650      {
     651#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     652        nmod_poly_t FLINTmipo, leadingCoeff;
     653        fq_nmod_ctx_t fq_con;
     654
     655        nmod_poly_init (FLINTmipo, getCharacteristic());
     656        nmod_poly_init (leadingCoeff, getCharacteristic());
     657        convertFacCF2nmod_poly_t (FLINTmipo, getMipo (alpha));
     658
     659        fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     660        fq_nmod_poly_t FLINTF;
     661        convertFacCF2Fq_nmod_poly_t (FLINTF, f, fq_con);
     662        fq_nmod_poly_factor_t res;
     663        fq_nmod_poly_factor_init (res, fq_con);
     664        fq_nmod_poly_factor (res, leadingCoeff, FLINTF, fq_con);
     665        F= convertFLINTFq_nmod_poly_factor2FacCFFList (res, f.mvar(), alpha, fq_con);
     666        F.insert (CFFactor (Lc (f), 1));
     667
     668        fq_nmod_poly_factor_clear (res, fq_con);
     669        fq_nmod_poly_clear (FLINTF, fq_con);
     670        nmod_poly_clear (FLINTmipo);
     671        nmod_poly_clear (leadingCoeff);
     672        fq_nmod_ctx_clear (fq_con);
     673#else
    659674        // First all cases with characteristic !=2
    660675        // set remainder
     
    682697        // return converted result
    683698        F=convertNTLvec_pair_zzpEX_long2FacCFFList(factors,leadcoeff,f.mvar(),alpha);
     699#endif
    684700      }
    685701      else if (/*getCharacteristic()*/ch==2)
  • factory/cf_gcd.cc

    re82b5f2 r0b7a8a6  
    528528//}}}
    529529
     530#ifndef HAVE_NTL
    530531static CanonicalForm gcd_poly_univar0( const CanonicalForm & F, const CanonicalForm & G, bool primitive )
    531532{
     
    612613  }
    613614}
     615#endif
    614616
    615617static CanonicalForm
     
    796798#endif
    797799#endif
     800#ifndef HAVE_NTL
    798801        return gcd_poly_univar0( pi, pi1, true ) * C;
     802#endif
    799803    }
    800804    else if ( gcd_test_one( pi1, pi, true, d ) )
  • factory/facFactorize.cc

    re82b5f2 r0b7a8a6  
    129129    iter++;
    130130    CanonicalForm contentx= content (iter.getItem(), x);
     131    if (degree (contentx) > 0)
     132    {
     133      result= CFList();
     134      eval= CFList();
     135      LCFeval= CFList();
     136      E.nextpoint();
     137      continue;
     138    }
     139    contentx= content (iter.getItem());
    131140    if (degree (contentx) > 0)
    132141    {
  • factory/facFqBivar.cc

    re82b5f2 r0b7a8a6  
    163163          "univariate polynomial expected or constant expected");
    164164  CFFList factorsA;
    165   if (fac_NTL_char != getCharacteristic())
    166   {
    167     fac_NTL_char= getCharacteristic();
    168     zz_p::init (getCharacteristic());
    169   }
    170165  if (GF)
    171166  {
     
    178173    if (getCharacteristic() > 2)
    179174    {
     175#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     176      nmod_poly_t FLINTmipo, leadingCoeff;
     177      fq_nmod_ctx_t fq_con;
     178      fq_nmod_poly_t FLINTA;
     179      fq_nmod_poly_factor_t FLINTFactorsA;
     180
     181      nmod_poly_init (FLINTmipo, getCharacteristic());
     182      convertFacCF2nmod_poly_t (FLINTmipo, mipo.mapinto());
     183
     184      fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     185
     186      convertFacCF2Fq_nmod_poly_t (FLINTA, buf, fq_con);
     187      fq_nmod_poly_make_monic (FLINTA, FLINTA, fq_con);
     188
     189      fq_nmod_poly_factor_init (FLINTFactorsA, fq_con);
     190      nmod_poly_init (leadingCoeff, getCharacteristic());
     191
     192      fq_nmod_poly_factor (FLINTFactorsA, leadingCoeff, FLINTA, fq_con);
     193
     194      factorsA= convertFLINTFq_nmod_poly_factor2FacCFFList (FLINTFactorsA, x,
     195                                                            beta, fq_con);
     196
     197      fq_nmod_poly_factor_clear (FLINTFactorsA, fq_con);
     198      fq_nmod_poly_clear (FLINTA, fq_con);
     199      nmod_poly_clear (FLINTmipo);
     200      nmod_poly_clear (leadingCoeff);
     201      fq_nmod_ctx_clear (fq_con);
     202#else
     203      if (fac_NTL_char != getCharacteristic())
     204      {
     205        fac_NTL_char= getCharacteristic();
     206        zz_p::init (getCharacteristic());
     207      }
    180208      zz_pX NTLMipo= convertFacCF2NTLzzpX (mipo.mapinto());
    181209      zz_pE::init (NTLMipo);
     
    186214      factorsA= convertNTLvec_pair_zzpEX_long2FacCFFList (NTLFactorsA, multi,
    187215                                                         x, beta);
     216#endif
    188217    }
    189218    else
     
    210239    if (getCharacteristic() > 2)
    211240    {
     241#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     242      nmod_poly_t FLINTmipo, leadingCoeff;
     243      fq_nmod_ctx_t fq_con;
     244      fq_nmod_poly_t FLINTA;
     245      fq_nmod_poly_factor_t FLINTFactorsA;
     246
     247      nmod_poly_init (FLINTmipo, getCharacteristic());
     248      convertFacCF2nmod_poly_t (FLINTmipo, getMipo (alpha));
     249
     250      fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     251
     252      convertFacCF2Fq_nmod_poly_t (FLINTA, A, fq_con);
     253      fq_nmod_poly_make_monic (FLINTA, FLINTA, fq_con);
     254
     255      fq_nmod_poly_factor_init (FLINTFactorsA, fq_con);
     256      nmod_poly_init (leadingCoeff, getCharacteristic());
     257
     258      fq_nmod_poly_factor (FLINTFactorsA, leadingCoeff, FLINTA, fq_con);
     259
     260      factorsA= convertFLINTFq_nmod_poly_factor2FacCFFList (FLINTFactorsA, x,
     261                                                            alpha, fq_con);
     262
     263      fq_nmod_poly_factor_clear (FLINTFactorsA, fq_con);
     264      fq_nmod_poly_clear (FLINTA, fq_con);
     265      nmod_poly_clear (FLINTmipo);
     266      nmod_poly_clear (leadingCoeff);
     267      fq_nmod_ctx_clear (fq_con);
     268#else
     269      if (fac_NTL_char != getCharacteristic())
     270      {
     271        fac_NTL_char= getCharacteristic();
     272        zz_p::init (getCharacteristic());
     273      }
    212274      zz_pX NTLMipo= convertFacCF2NTLzzpX (getMipo (alpha));
    213275      zz_pE::init (NTLMipo);
     
    218280      factorsA= convertNTLvec_pair_zzpEX_long2FacCFFList (NTLFactorsA, multi,
    219281                                                           x, alpha);
     282#endif
    220283    }
    221284    else
     
    251314    if (getCharacteristic() > 2)
    252315    {
     316      if (fac_NTL_char != getCharacteristic())
     317      {
     318        fac_NTL_char= getCharacteristic();
     319        zz_p::init (getCharacteristic());
     320      }
    253321      zz_pX NTLA= convertFacCF2NTLzzpX (A);
    254322      MakeMonic (NTLA);
     
    761829  adaptedLiftBound= 0;
    762830  int d= degree (F), l= 0;
    763   bool isRat= (isOn (SW_RATIONAL) && getCharacteristic() == 0) || getCharacteristic() > 0;
     831  bool isRat= (isOn (SW_RATIONAL) && getCharacteristic() == 0) ||
     832               getCharacteristic() > 0;
    764833  if (!isRat)
    765834    On (SW_RATIONAL);
     
    13561425}
    13571426
     1427#ifndef HAVE_FLINT
    13581428long isReduced (const mat_zz_p& M)
    13591429{
     
    13721442  return 1;
    13731443}
     1444#endif
    13741445
    13751446#ifdef HAVE_FLINT
     
    14091480}
    14101481
     1482#ifndef HAVE_FLINT
    14111483int * extractZeroOneVecs (const mat_zz_p& M)
    14121484{
     
    14321504  return result;
    14331505}
     1506#endif
    14341507
    14351508#ifdef HAVE_FLINT
     
    15651638}
    15661639
     1640#ifndef HAVE_FLINT
    15671641void
    15681642reconstructionTry (CFList& reconstructedFactors, CanonicalForm& F, const CFList&
     
    16461720    F= bufF (y+eval,y);
    16471721}
     1722#endif
    16481723
    16491724#ifdef HAVE_FLINT
     
    18311906}
    18321907
     1908#ifndef HAVE_FLINT
    18331909CFList
    18341910extReconstruction (CanonicalForm& G, CFList& factors, int* zeroOneVecs, int
     
    19091985  return result;
    19101986}
     1987#endif
    19111988
    19121989#ifdef HAVE_FLINT
     
    19912068#endif
    19922069
     2070#ifndef HAVE_FLINT
    19932071CFList
    19942072reconstruction (CanonicalForm& G, CFList& factors, int* zeroOneVecs,
     
    20392117  return result;
    20402118}
     2119#endif
    20412120
    20422121#ifdef HAVE_FLINT
     
    20912170#endif
    20922171
     2172#ifndef HAVE_FLINT
    20932173void
    20942174extReconstructionTry (CFList& reconstructedFactors, CanonicalForm& F, const
     
    22182298  }
    22192299}
     2300#endif
    22202301
    22212302#ifdef HAVE_FLINT
     
    23492430#endif
    23502431
     2432#ifndef HAVE_FLINT
    23512433//over Fp
    23522434int
     
    24712553  return l;
    24722554}
     2555#endif
    24732556
    24742557#ifdef HAVE_FLINT
     
    26092692#endif
    26102693
     2694#ifndef HAVE_FLINT
    26112695//over field extension
    26122696int
     
    28042888  return l;
    28052889}
    2806 
    2807 /*#ifdef HAVE_FLINT
     2890#endif
     2891
     2892#ifdef HAVE_FLINT
    28082893//over field extension
    28092894int
     
    29203005                                     gamma, source, dest
    29213006                                    );
    2922               buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, FLINTMatInv); //TODO
     3007              buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, FLINTMatInv);
    29233008            }
    29243009            else
     
    29293014                                    gamma, source, dest
    29303015                                   );
    2931               buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, FLINTMatInv); //TODO
     3016              buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, FLINTMatInv);
    29323017            }
    29333018            writeInMatrix (C, buf, ii + 1, 0);
     
    30113096  return l;
    30123097}
    3013 #endif*/
     3098#endif
    30143099
    30153100// over Fq
     
    37013786  CFArray * A= new CFArray [factors.length()];
    37023787  CFArray bufQ= CFArray (factors.length());
     3788#ifdef HAVE_FLINT
     3789  nmod_mat_t FLINTN;
     3790  nmod_mat_init (FLINTN,factors.length(),factors.length(), getCharacteristic());
     3791  for (long i=factors.length()-1; i >= 0; i--)
     3792    nmod_mat_entry (FLINTN, i, i)= 1;
     3793#else
    37033794  if (fac_NTL_char != getCharacteristic())
    37043795  {
     
    37083799  mat_zz_p NTLN;
    37093800  ident (NTLN, factors.length());
     3801#endif
    37103802  int minBound= bounds[0];
    37113803  for (int i= 1; i < d; i++)
     
    37273819  CFMatrix Mat, C;
    37283820  CFIterator iter;
     3821#ifdef HAVE_FLINT
     3822  long rank;
     3823  nmod_mat_t FLINTMat, FLINTMatInv, FLINTC, FLINTK, null;
     3824#else
    37293825  mat_zz_p* NTLMat,*NTLC, NTLK;
     3826#endif
    37303827  CFArray buf;
    37313828  while (l <= precision)
     
    37463843    }
    37473844
     3845#ifdef HAVE_FLINT
     3846    convertFacCFMatrix2nmod_mat_t (FLINTMat, Mat);
     3847    nmod_mat_init (FLINTMatInv, nmod_mat_nrows (FLINTMat),
     3848                   nmod_mat_nrows (FLINTMat), getCharacteristic());
     3849    nmod_mat_inv (FLINTMatInv, FLINTMat);
     3850#else
    37483851    NTLMat= convertFacCFMatrix2NTLmat_zz_p (Mat);
    37493852    *NTLMat= inv (*NTLMat);
     3853#endif
     3854
    37503855    if (GF)
    37513856      setCharacteristic (getCharacteristic(), degMipo, info.getGFName());
     
    37843889                                     gamma, source, dest
    37853890                                    );
     3891#ifdef HAVE_FLINT
     3892              buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, FLINTMatInv);
     3893#else
    37863894              buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, *NTLMat);
     3895#endif
    37873896            }
    37883897            else
     
    37933902                                    gamma, source, dest
    37943903                                   );
     3904#ifdef HAVE_FLINT
     3905              buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, FLINTMatInv);
     3906#else
    37953907              buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, *NTLMat);
     3908#endif
    37963909            }
    37973910            writeInMatrix (C, buf, ii + 1, 0);
     
    38043917          setCharacteristic(getCharacteristic());
    38053918
     3919#ifdef HAVE_FLINT
     3920        convertFacCFMatrix2nmod_mat_t (FLINTC, C);
     3921        nmod_mat_init (FLINTK, nmod_mat_nrows (FLINTC), nmod_mat_ncols (FLINTN),
     3922                       getCharacteristic());
     3923        nmod_mat_mul (FLINTK, FLINTC, FLINTN);
     3924        nmod_mat_init (null, nmod_mat_ncols (FLINTK), nmod_mat_ncols (FLINTK),
     3925                       getCharacteristic());
     3926        rank= nmod_mat_nullspace (null, FLINTK);
     3927        nmod_mat_clear (FLINTK);
     3928        nmod_mat_window_init (FLINTK, null, 0, 0, nmod_mat_nrows(null), rank);
     3929        nmod_mat_clear (FLINTC);
     3930        nmod_mat_init_set (FLINTC, FLINTN);
     3931        nmod_mat_clear (FLINTN);
     3932        nmod_mat_init (FLINTN, nmod_mat_nrows (FLINTC), nmod_mat_ncols (FLINTK),
     3933                       getCharacteristic());
     3934        nmod_mat_mul (FLINTN, FLINTC, FLINTK); //no aliasing allowed!!
     3935
     3936        nmod_mat_clear (FLINTC);
     3937        nmod_mat_window_clear (FLINTK);
     3938        nmod_mat_clear (null);
     3939#else
    38063940        NTLC= convertFacCFMatrix2NTLmat_zz_p(C);
    38073941        NTLK= (*NTLC)*NTLN;
     
    38113945        NTLN *= NTLK;
    38123946        delete NTLC;
     3947#endif
    38133948
    38143949        if (GF)
    38153950          setCharacteristic (getCharacteristic(), degMipo, info.getGFName());
    38163951
     3952#ifdef HAVE_FLINT
     3953        if (nmod_mat_ncols (FLINTN) == 1)
     3954        {
     3955          nmod_mat_clear (FLINTMat);
     3956          nmod_mat_clear (FLINTMatInv);
     3957          nmod_mat_clear (FLINTN);
     3958#else
    38173959        if (NTLN.NumCols() == 1)
    38183960        {
     3961          delete NTLMat;
     3962#endif
    38193963          Variable y= Variable (2);
    38203964          CanonicalForm tmp= F (y - evaluation, y);
    38213965          CFList source, dest;
    38223966          tmp= mapDown (tmp, info, source, dest);
    3823           delete NTLMat;
    38243967          delete [] A;
    38253968          delete [] bounds;
     
    38303973    }
    38313974
     3975#ifdef HAVE_FLINT
     3976    nmod_mat_clear (FLINTMat);
     3977    nmod_mat_clear (FLINTMatInv);
     3978#else
    38323979    delete NTLMat;
    3833 
     3980#endif
     3981
     3982#ifdef HAVE_FLINT
     3983    if (nmod_mat_ncols (FLINTN) < oldNumCols - factorsFound)
     3984    {
     3985      if (isReduced (FLINTN))
     3986      {
     3987        int * factorsFoundIndex= new int [nmod_mat_ncols (FLINTN)];
     3988        for (long i= 0; i < nmod_mat_ncols (FLINTN); i++)
     3989#else
    38343990    if (NTLN.NumCols() < oldNumCols - factorsFound)
    38353991    {
     
    38383994        int * factorsFoundIndex= new int [NTLN.NumCols()];
    38393995        for (long i= 0; i < NTLN.NumCols(); i++)
     3996#endif
    38403997          factorsFoundIndex[i]= 0;
    38413998        int factorsFound2= 0;
    38423999        CFList result;
    38434000        CanonicalForm bufF= F;
     4001#ifdef HAVE_FLINT
     4002        extReconstructionTry (result, bufF, factors,degree (F)+1, factorsFound2,
     4003                              factorsFoundIndex, FLINTN, false, info, evaluation
     4004                             );
     4005        if (result.length() == nmod_mat_ncols (FLINTN))
     4006        {
     4007          nmod_mat_clear (FLINTN);
     4008#else
    38444009        extReconstructionTry (result, bufF, factors,degree (F)+1, factorsFound2,
    38454010                              factorsFoundIndex, NTLN, false, info, evaluation
     
    38474012        if (result.length() == NTLN.NumCols())
    38484013        {
     4014#endif
    38494015          delete [] factorsFoundIndex;
    38504016          delete [] A;
     
    38584024      {
    38594025        CanonicalForm bufF= F;
     4026#ifdef HAVE_FLINT
     4027        int * zeroOne= extractZeroOneVecs (FLINTN);
     4028        CFList result= extReconstruction (bufF, factors, zeroOne, precision,
     4029                                          FLINTN, info, evaluation
     4030                                         );
     4031        nmod_mat_clear (FLINTN);
     4032#else
    38604033        int * zeroOne= extractZeroOneVecs (NTLN);
    38614034        CFList result= extReconstruction (bufF, factors, zeroOne, precision,
    38624035                                          NTLN, info, evaluation
    38634036                                         );
     4037#endif
    38644038        F= bufF;
    38654039        delete [] zeroOne;
     
    38834057    }
    38844058  }
     4059
     4060#ifdef HAVE_FLINT
     4061  nmod_mat_clear (FLINTN);
     4062#endif
    38854063  delete [] bounds;
    38864064  delete [] A;
     
    45004678
    45014679//over field extension
     4680#ifdef HAVE_FLINT
     4681CFList
     4682extIncreasePrecision (CanonicalForm& F, CFList& factors, int oldL, int l, int d,
     4683                      int* bounds, CFArray& bufQ, nmod_mat_t FLINTN, const
     4684                      CanonicalForm& evaluation, const ExtensionInfo& info,
     4685                      CFList& source, CFList& dest
     4686                     )
     4687#else
    45024688CFList
    45034689extIncreasePrecision (CanonicalForm& F, CFList& factors, int oldL, int l, int d,
     
    45064692                      CFList& source, CFList& dest
    45074693                     )
     4694#endif
    45084695{
    45094696  CFList result= CFList();
     
    45194706  CanonicalForm primElemAlpha= info.getGamma();
    45204707  CanonicalForm imPrimElemAlpha= info.getDelta();
     4708#ifdef HAVE_FLINT
     4709  nmod_mat_clear (FLINTN);
     4710  nmod_mat_init (FLINTN,factors.length(),factors.length(), getCharacteristic());
     4711  for (long i=factors.length()-1; i >= 0; i--)
     4712    nmod_mat_entry (FLINTN, i, i)= 1;
     4713#else
    45214714  if (NTLN.NumRows() != factors.length()) //refined factors
    45224715    ident (NTLN, factors.length());
     4716#endif
    45234717  Variable y= F.mvar();
    45244718  CFListIterator j;
     
    45264720  CFMatrix Mat, C;
    45274721  CFIterator iter;
    4528   mat_zz_p* NTLMat;
    45294722  CFArray buf;
    4530   mat_zz_p* NTLC, NTLK;
     4723#ifdef HAVE_FLINT
     4724  long rank;
     4725  nmod_mat_t FLINTMat, FLINTMatInv, FLINTC, FLINTK, null;
     4726#else
     4727  mat_zz_p* NTLC, NTLK, *NTLMat;
     4728#endif
    45314729  CFList bufUniFactors;
    45324730  while (oldL <= l)
     
    45484746    }
    45494747
     4748#ifdef HAVE_FLINT
     4749    convertFacCFMatrix2nmod_mat_t (FLINTMat, Mat);
     4750    nmod_mat_init (FLINTMatInv, nmod_mat_nrows (FLINTMat),
     4751                   nmod_mat_nrows (FLINTMat), getCharacteristic());
     4752    nmod_mat_inv (FLINTMatInv, FLINTMat);
     4753#else
    45504754    NTLMat= convertFacCFMatrix2NTLmat_zz_p (Mat);
    45514755    *NTLMat= inv (*NTLMat);
     4756#endif
     4757
    45524758    if (GF)
    45534759      setCharacteristic (getCharacteristic(), degMipo, info.getGFName());
     
    45864792                                     gamma, source, dest
    45874793                                    );
     4794#ifdef HAVE_FLINT
     4795              buf= getCoeffs (A[ii] [i], k, oldL, degMipo, gamma, 0, FLINTMatInv);
     4796#else
    45884797              buf= getCoeffs (A[ii] [i], k, oldL, degMipo, gamma, 0, *NTLMat);
     4798#endif
    45894799            }
    45904800            else
     
    45954805                                    gamma, source, dest
    45964806                                   );
     4807#ifdef HAVE_FLINT
     4808              buf= getCoeffs (A[ii] [i], k, oldL, degMipo, gamma, 0, FLINTMatInv);
     4809#else
    45974810              buf= getCoeffs (A[ii] [i], k, oldL, degMipo, gamma, 0, *NTLMat);
     4811#endif
    45984812            }
    45994813            writeInMatrix (C, buf, ii + 1, 0);
     
    46064820          setCharacteristic(getCharacteristic());
    46074821
     4822#ifdef HAVE_FLINT
     4823        convertFacCFMatrix2nmod_mat_t (FLINTC, C);
     4824        nmod_mat_init (FLINTK, nmod_mat_nrows (FLINTC), nmod_mat_ncols (FLINTN),
     4825                       getCharacteristic());
     4826        nmod_mat_mul (FLINTK, FLINTC, FLINTN);
     4827        nmod_mat_init (null, nmod_mat_ncols (FLINTK), nmod_mat_ncols (FLINTK),
     4828                       getCharacteristic());
     4829        rank= nmod_mat_nullspace (null, FLINTK);
     4830        nmod_mat_clear (FLINTK);
     4831        nmod_mat_window_init (FLINTK, null, 0, 0, nmod_mat_nrows(null), rank);
     4832        nmod_mat_clear (FLINTC);
     4833        nmod_mat_init_set (FLINTC, FLINTN);
     4834        nmod_mat_clear (FLINTN);
     4835        nmod_mat_init (FLINTN, nmod_mat_nrows (FLINTC), nmod_mat_ncols (FLINTK),
     4836                       getCharacteristic());
     4837        nmod_mat_mul (FLINTN, FLINTC, FLINTK); //no aliasing allowed!!
     4838
     4839        nmod_mat_clear (FLINTC);
     4840        nmod_mat_window_clear (FLINTK);
     4841        nmod_mat_clear (null);
     4842#else
    46084843        NTLC= convertFacCFMatrix2NTLmat_zz_p(C);
    46094844        NTLK= (*NTLC)*NTLN;
     
    46134848        NTLN *= NTLK;
    46144849        delete NTLC;
     4850#endif
    46154851
    46164852        if (GF)
    46174853          setCharacteristic (getCharacteristic(), degMipo, info.getGFName());
    46184854
     4855#ifdef HAVE_FLINT
     4856        if (nmod_mat_ncols (FLINTN) == 1)
     4857        {
     4858          nmod_mat_clear (FLINTMat);
     4859          nmod_mat_clear (FLINTMatInv);
     4860#else
    46194861        if (NTLN.NumCols() == 1)
    46204862        {
     4863          delete NTLMat;
     4864#endif
    46214865          Variable y= Variable (2);
    46224866          CanonicalForm tmp= F (y - evaluation, y);
     
    46244868          tmp= mapDown (tmp, info, source, dest);
    46254869          delete [] A;
    4626           delete NTLMat;
    46274870          return CFList (tmp);
    46284871        }
     
    46304873    }
    46314874
     4875#ifdef HAVE_FLINT
     4876    nmod_mat_clear (FLINTMat);
     4877    nmod_mat_clear (FLINTMatInv);
     4878#else
    46324879    delete NTLMat;
    4633 
     4880#endif
     4881
     4882#ifdef HAVE_FLINT
     4883    if (nmod_mat_ncols (FLINTN) == 1)
     4884#else
    46344885    if (NTLN.NumCols() == 1)
     4886#endif
    46354887    {
    46364888      Variable y= Variable (2);
     
    46434895
    46444896    int * zeroOneVecs;
    4645     zeroOneVecs= extractZeroOneVecs (NTLN);
    46464897    bufF= F;
    46474898    bufUniFactors= factors;
     4899#ifdef HAVE_FLINT
     4900    zeroOneVecs= extractZeroOneVecs (FLINTN);
     4901    result= extReconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, FLINTN,
     4902                               info, evaluation
     4903                              );
     4904#else
     4905    zeroOneVecs= extractZeroOneVecs (NTLN);
    46484906    result= extReconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, NTLN,
    46494907                               info, evaluation
    46504908                              );
     4909#endif
    46514910    delete [] zeroOneVecs;
    46524911    if (degree (bufF) + 1 + degree (LC (bufF, 1)) < l && result.length() > 0)
     
    52005459
    52015460//over field extension
     5461#ifdef HAVE_FLINT
     5462CFList
     5463extFurtherLiftingAndIncreasePrecision (CanonicalForm& F, CFList& factors, int l,
     5464                                       int liftBound, int d, int* bounds,
     5465                                       nmod_mat_t FLINTN, CFList& diophant,
     5466                                       CFMatrix& M, CFArray& Pi, CFArray& bufQ,
     5467                                       const CanonicalForm& evaluation, const
     5468                                       ExtensionInfo& info, CFList& source,
     5469                                       CFList& dest
     5470                                      )
     5471#else
    52025472CFList
    52035473extFurtherLiftingAndIncreasePrecision (CanonicalForm& F, CFList& factors, int l,
     
    52095479                                       CFList& dest
    52105480                                      )
     5481#endif
    52115482{
    52125483  CanonicalForm LCF= LC (F, 1);
     
    52265497  CanonicalForm primElemAlpha= info.getGamma();
    52275498  CanonicalForm imPrimElemAlpha= info.getDelta();
     5499#ifdef HAVE_FLINT
     5500  nmod_mat_clear (FLINTN);
     5501  nmod_mat_init (FLINTN,factors.length(),factors.length(), getCharacteristic());
     5502  for (long i=factors.length()-1; i >= 0; i--)
     5503    nmod_mat_entry (FLINTN, i, i)= 1;
     5504#else
    52285505  if (NTLN.NumRows() != factors.length()) //refined factors
    52295506    ident (NTLN, factors.length());
     5507#endif
    52305508  Variable y= F.mvar();
    52315509  CanonicalForm powX, imBasis, bufF, truncF;
    52325510  CFMatrix Mat, C;
    52335511  CFIterator iter;
     5512#ifdef HAVE_FLINT
     5513  long rank;
     5514  nmod_mat_t FLINTMat, FLINTMatInv, FLINTC, FLINTK, null;
     5515#else
    52345516  mat_zz_p* NTLMat,*NTLC, NTLK;
     5517#endif
    52355518  CFListIterator j;
    52365519  CFArray buf;
     
    52565539    }
    52575540
     5541#ifdef HAVE_FLINT
     5542    convertFacCFMatrix2nmod_mat_t (FLINTMat, Mat);
     5543    nmod_mat_init (FLINTMatInv, nmod_mat_nrows (FLINTMat),
     5544                   nmod_mat_nrows (FLINTMat), getCharacteristic());
     5545    nmod_mat_inv (FLINTMatInv, FLINTMat);
     5546#else
    52585547    NTLMat= convertFacCFMatrix2NTLmat_zz_p (Mat);
    52595548    *NTLMat= inv (*NTLMat);
     5549#endif
    52605550
    52615551    if (GF)
     
    52945584                                     gamma, source, dest
    52955585                                    );
     5586#ifdef HAVE_FLINT
     5587              buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, FLINTMatInv);
     5588#else
    52965589              buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, *NTLMat);
     5590#endif
    52975591            }
    52985592            else
     
    53035597                                    gamma, source, dest
    53045598                                   );
     5599#ifdef HAVE_FLINT
     5600              buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, FLINTMatInv);
     5601#else
    53055602              buf= getCoeffs (A[ii] [i], k, l, degMipo, gamma, 0, *NTLMat);
     5603#endif
    53065604            }
    53075605            writeInMatrix (C, buf, ii + 1, 0);
     
    53135611        if (GF)
    53145612          setCharacteristic(getCharacteristic());
    5315         NTLC= convertFacCFMatrix2NTLmat_zz_p(C);
    5316         NTLK= (*NTLC)*NTLN;
    5317         transpose (NTLK, NTLK);
    5318         kernel (NTLK, NTLK);
    5319         transpose (NTLK, NTLK);
    5320         NTLN *= NTLK;
    5321         delete NTLC;
    5322         if (GF)
    5323           setCharacteristic (getCharacteristic(), degMipo, info.getGFName());
    5324 
    5325         if (NTLN.NumCols() == 1)
    5326         {
    5327           irreducible= true;
    5328           break;
    5329         }
    5330       }
    5331     }
    5332     delete NTLMat;
    5333     if (NTLN.NumCols() == 1)
    5334     {
    5335       irreducible= true;
    5336       break;
    5337     }
    5338 
    5339     int * zeroOneVecs= extractZeroOneVecs (NTLN);
    5340     bufF= F;
    5341     result= extReconstruction (bufF, bufFactors, zeroOneVecs, l, NTLN, info,
    5342                                evaluation
    5343                               );
    5344     delete [] zeroOneVecs;
    5345     if (result.length() > 0 && degree (bufF) + 1 + degree (LC (bufF, 1)) <= l)
    5346     {
    5347       F= bufF;
    5348       factors= bufFactors;
    5349       delete [] A;
    5350       return result;
    5351     }
    5352 
    5353     if (isReduced (NTLN))
    5354     {
    5355       int factorsFound= 0;
    5356       bufF= F;
    5357       int* factorsFoundIndex= new int [NTLN.NumCols()];
    5358       for (long i= 0; i < NTLN.NumCols(); i++)
    5359         factorsFoundIndex[i]= 0;
    5360       if (l < degree (bufF) + 1 + degree (LCF))
    5361         extReconstructionTry (result, bufF, bufFactors, l, factorsFound,
    5362                               factorsFoundIndex, NTLN, false, info, evaluation
    5363                              );
    5364       else
    5365         extReconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 +
    5366                               degree (LCF), factorsFound, factorsFoundIndex,
    5367                               NTLN, false, info, evaluation
    5368                              );
    5369       if (NTLN.NumCols() == result.length())
    5370       {
    5371         delete [] A;
    5372         delete [] factorsFoundIndex;
    5373         return result;
    5374       }
    5375       delete [] factorsFoundIndex;
    5376     }
    5377     result= CFList();
    5378     oldL= l;
    5379     stepSize *= 2;
    5380     l += stepSize;
    5381     if (l > liftBound)
    5382     {
    5383       if (!hitBound)
    5384       {
    5385         l= liftBound;
    5386         hitBound= true;
    5387       }
    5388       else
    5389         break;
    5390     }
    5391   }
    5392   if (irreducible)
    5393   {
    5394     delete [] A;
    5395     Variable y= Variable (2);
    5396     CanonicalForm tmp= F (y - evaluation, y);
    5397     CFList source, dest;
    5398     tmp= mapDown (tmp, info, source, dest);
    5399     return CFList (tmp);
    5400   }
    5401   delete [] A;
    5402   factors= bufFactors;
    5403   return CFList();
    5404 }
    5405 
    5406 #ifdef HAVE_FLINT
    5407 CFList
    5408 furtherLiftingAndIncreasePrecisionFq2Fp (CanonicalForm& F, CFList& factors, int
    5409                                          l, int liftBound, int d, int* bounds,
    5410                                          nmod_mat_t FLINTN, CFList& diophant,
    5411                                          CFMatrix& M, CFArray& Pi, CFArray& bufQ,
    5412                                          const Variable& alpha,
    5413                                          const CanonicalForm& eval
    5414                                         )
    5415 #else
    5416 CFList
    5417 furtherLiftingAndIncreasePrecisionFq2Fp (CanonicalForm& F, CFList& factors, int
    5418                                          l, int liftBound, int d, int* bounds,
    5419                                          mat_zz_p& NTLN, CFList& diophant,
    5420                                          CFMatrix& M, CFArray& Pi, CFArray& bufQ,
    5421                                          const Variable& alpha,
    5422                                          const CanonicalForm& eval
    5423                                         )
    5424 #endif
    5425 {
    5426   CanonicalForm LCF= LC (F, 1);
    5427   CFList result;
    5428   bool irreducible= false;
    5429   CFList bufFactors= factors;
    5430   CFArray *A = new CFArray [bufFactors.length()];
    5431   bool useOldQs= false;
    5432   int extensionDeg= degree (getMipo (alpha));
    5433   bool hitBound= false;
    5434   int oldL= l;
    5435   int stepSize= 8; //TODO choose better step size?
    5436   l += tmax (tmin (8, degree (F) + 1 + degree (LC (F, 1))-l), 2);
    5437 #ifdef HAVE_FLINT
    5438   if (nmod_mat_nrows (FLINTN) != factors.length()) //refined factors
    5439   {
    5440     nmod_mat_clear (FLINTN);
    5441     nmod_mat_init(FLINTN,factors.length(),factors.length(),getCharacteristic());
    5442     for (long i=factors.length()-1; i >= 0; i--)
    5443       nmod_mat_entry (FLINTN, i, i)= 1;
    5444   }
    5445 #else
    5446   if (NTLN.NumRows() != factors.length()) //refined factors
    5447     ident (NTLN, factors.length());
    5448 #endif
    5449   CFListIterator j;
    5450   CFMatrix C;
    5451 #ifdef HAVE_FLINT
    5452   long rank;
    5453   nmod_mat_t FLINTC, FLINTK, null;
    5454 #else
    5455   mat_zz_p* NTLC, NTLK;
    5456 #endif
    5457   CanonicalForm bufF, truncF;
    5458   Variable y= F.mvar();
    5459   while (l <= liftBound)
    5460   {
    5461     bufFactors.insert (LCF);
    5462     henselLiftResume12 (F, bufFactors, oldL, l, Pi, diophant, M);
    5463     j= bufFactors;
    5464     truncF= mod (F, power (y, l));
    5465     if (useOldQs)
    5466     {
    5467       for (int i= 0; i < bufFactors.length(); i++, j++)
    5468         A[i]= logarithmicDerivative (truncF, j.getItem(), l, oldL, bufQ[i],
    5469                                      bufQ[i]);
    5470     }
    5471     else
    5472     {
    5473       for (int i= 0; i < bufFactors.length(); i++, j++)
    5474         A[i]= logarithmicDerivative (truncF, j.getItem(), l, bufQ [i]);
    5475     }
    5476     for (int i= 0; i < d; i++)
    5477     {
    5478       if (bounds [i] + 1 <= l/2)
    5479       {
    5480         int k= tmin (bounds [i] + 1, l/2);
    5481         C= CFMatrix ((l - k)*extensionDeg, bufFactors.length());
    5482         for (int ii= 0; ii < bufFactors.length(); ii++)
    5483         {
    5484           CFArray buf;
    5485           if (A[ii].size() - 1 >= i)
    5486           {
    5487             buf= getCoeffs (A[ii] [i], k, alpha);
    5488             writeInMatrix (C, buf, ii + 1, 0);
    5489           }
    5490         }
     5613
    54915614#ifdef HAVE_FLINT
    54925615        convertFacCFMatrix2nmod_mat_t (FLINTC, C);
     
    55185641        delete NTLC;
    55195642#endif
     5643
     5644        if (GF)
     5645          setCharacteristic (getCharacteristic(), degMipo, info.getGFName());
     5646
     5647#ifdef HAVE_FLINT
     5648        if (nmod_mat_ncols (FLINTN) == 1)
     5649#else
     5650        if (NTLN.NumCols() == 1)
     5651#endif
     5652        {
     5653          irreducible= true;
     5654          break;
     5655        }
     5656      }
     5657    }
     5658
     5659#ifdef HAVE_FLINT
     5660    nmod_mat_clear (FLINTMat);
     5661    nmod_mat_clear (FLINTMatInv);
     5662    if (nmod_mat_ncols (FLINTN) == 1)
     5663#else
     5664    delete NTLMat;
     5665    if (NTLN.NumCols() == 1)
     5666#endif
     5667    {
     5668      irreducible= true;
     5669      break;
     5670    }
     5671
     5672    bufF= F;
     5673#ifdef HAVE_FLINT
     5674    int * zeroOneVecs= extractZeroOneVecs (FLINTN);
     5675    result= extReconstruction (bufF, bufFactors, zeroOneVecs, l, FLINTN, info,
     5676                               evaluation
     5677                              );
     5678#else
     5679    int * zeroOneVecs= extractZeroOneVecs (NTLN);
     5680    result= extReconstruction (bufF, bufFactors, zeroOneVecs, l, NTLN, info,
     5681                               evaluation
     5682                              );
     5683#endif
     5684    delete [] zeroOneVecs;
     5685    if (result.length() > 0 && degree (bufF) + 1 + degree (LC (bufF, 1)) <= l)
     5686    {
     5687      F= bufF;
     5688      factors= bufFactors;
     5689      delete [] A;
     5690      return result;
     5691    }
     5692
     5693#ifdef HAVE_FLINT
     5694    if (isReduced (FLINTN))
     5695#else
     5696    if (isReduced (NTLN))
     5697#endif
     5698    {
     5699      int factorsFound= 0;
     5700      bufF= F;
     5701#ifdef HAVE_FLINT
     5702      int* factorsFoundIndex= new int [nmod_mat_ncols (FLINTN)];
     5703      for (long i= 0; i < nmod_mat_ncols (FLINTN); i++)
     5704#else
     5705      int* factorsFoundIndex= new int [NTLN.NumCols()];
     5706      for (long i= 0; i < NTLN.NumCols(); i++)
     5707#endif
     5708        factorsFoundIndex[i]= 0;
     5709#ifdef HAVE_FLINT
     5710      if (l < degree (bufF) + 1 + degree (LCF))
     5711        extReconstructionTry (result, bufF, bufFactors, l, factorsFound,
     5712                              factorsFoundIndex, FLINTN, false, info, evaluation
     5713                             );
     5714      else
     5715        extReconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 +
     5716                              degree (LCF), factorsFound, factorsFoundIndex,
     5717                              FLINTN, false, info, evaluation
     5718                             );
     5719      if (nmod_mat_ncols (FLINTN) == result.length())
     5720#else
     5721      if (l < degree (bufF) + 1 + degree (LCF))
     5722        extReconstructionTry (result, bufF, bufFactors, l, factorsFound,
     5723                              factorsFoundIndex, NTLN, false, info, evaluation
     5724                             );
     5725      else
     5726        extReconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 +
     5727                              degree (LCF), factorsFound, factorsFoundIndex,
     5728                              NTLN, false, info, evaluation
     5729                             );
     5730      if (NTLN.NumCols() == result.length())
     5731#endif
     5732      {
     5733        delete [] A;
     5734        delete [] factorsFoundIndex;
     5735        return result;
     5736      }
     5737      delete [] factorsFoundIndex;
     5738    }
     5739    result= CFList();
     5740    oldL= l;
     5741    stepSize *= 2;
     5742    l += stepSize;
     5743    if (l > liftBound)
     5744    {
     5745      if (!hitBound)
     5746      {
     5747        l= liftBound;
     5748        hitBound= true;
     5749      }
     5750      else
     5751        break;
     5752    }
     5753  }
     5754  if (irreducible)
     5755  {
     5756    delete [] A;
     5757    Variable y= Variable (2);
     5758    CanonicalForm tmp= F (y - evaluation, y);
     5759    CFList source, dest;
     5760    tmp= mapDown (tmp, info, source, dest);
     5761    return CFList (tmp);
     5762  }
     5763  delete [] A;
     5764  factors= bufFactors;
     5765  return CFList();
     5766}
     5767
     5768#ifdef HAVE_FLINT
     5769CFList
     5770furtherLiftingAndIncreasePrecisionFq2Fp (CanonicalForm& F, CFList& factors, int
     5771                                         l, int liftBound, int d, int* bounds,
     5772                                         nmod_mat_t FLINTN, CFList& diophant,
     5773                                         CFMatrix& M, CFArray& Pi, CFArray& bufQ,
     5774                                         const Variable& alpha,
     5775                                         const CanonicalForm& eval
     5776                                        )
     5777#else
     5778CFList
     5779furtherLiftingAndIncreasePrecisionFq2Fp (CanonicalForm& F, CFList& factors, int
     5780                                         l, int liftBound, int d, int* bounds,
     5781                                         mat_zz_p& NTLN, CFList& diophant,
     5782                                         CFMatrix& M, CFArray& Pi, CFArray& bufQ,
     5783                                         const Variable& alpha,
     5784                                         const CanonicalForm& eval
     5785                                        )
     5786#endif
     5787{
     5788  CanonicalForm LCF= LC (F, 1);
     5789  CFList result;
     5790  bool irreducible= false;
     5791  CFList bufFactors= factors;
     5792  CFArray *A = new CFArray [bufFactors.length()];
     5793  bool useOldQs= false;
     5794  int extensionDeg= degree (getMipo (alpha));
     5795  bool hitBound= false;
     5796  int oldL= l;
     5797  int stepSize= 8; //TODO choose better step size?
     5798  l += tmax (tmin (8, degree (F) + 1 + degree (LC (F, 1))-l), 2);
     5799#ifdef HAVE_FLINT
     5800  if (nmod_mat_nrows (FLINTN) != factors.length()) //refined factors
     5801  {
     5802    nmod_mat_clear (FLINTN);
     5803    nmod_mat_init(FLINTN,factors.length(),factors.length(),getCharacteristic());
     5804    for (long i=factors.length()-1; i >= 0; i--)
     5805      nmod_mat_entry (FLINTN, i, i)= 1;
     5806  }
     5807#else
     5808  if (NTLN.NumRows() != factors.length()) //refined factors
     5809    ident (NTLN, factors.length());
     5810#endif
     5811  CFListIterator j;
     5812  CFMatrix C;
     5813#ifdef HAVE_FLINT
     5814  long rank;
     5815  nmod_mat_t FLINTC, FLINTK, null;
     5816#else
     5817  mat_zz_p* NTLC, NTLK;
     5818#endif
     5819  CanonicalForm bufF, truncF;
     5820  Variable y= F.mvar();
     5821  while (l <= liftBound)
     5822  {
     5823    bufFactors.insert (LCF);
     5824    henselLiftResume12 (F, bufFactors, oldL, l, Pi, diophant, M);
     5825    j= bufFactors;
     5826    truncF= mod (F, power (y, l));
     5827    if (useOldQs)
     5828    {
     5829      for (int i= 0; i < bufFactors.length(); i++, j++)
     5830        A[i]= logarithmicDerivative (truncF, j.getItem(), l, oldL, bufQ[i],
     5831                                     bufQ[i]);
     5832    }
     5833    else
     5834    {
     5835      for (int i= 0; i < bufFactors.length(); i++, j++)
     5836        A[i]= logarithmicDerivative (truncF, j.getItem(), l, bufQ [i]);
     5837    }
     5838    for (int i= 0; i < d; i++)
     5839    {
     5840      if (bounds [i] + 1 <= l/2)
     5841      {
     5842        int k= tmin (bounds [i] + 1, l/2);
     5843        C= CFMatrix ((l - k)*extensionDeg, bufFactors.length());
     5844        for (int ii= 0; ii < bufFactors.length(); ii++)
     5845        {
     5846          CFArray buf;
     5847          if (A[ii].size() - 1 >= i)
     5848          {
     5849            buf= getCoeffs (A[ii] [i], k, alpha);
     5850            writeInMatrix (C, buf, ii + 1, 0);
     5851          }
     5852        }
     5853#ifdef HAVE_FLINT
     5854        convertFacCFMatrix2nmod_mat_t (FLINTC, C);
     5855        nmod_mat_init (FLINTK, nmod_mat_nrows (FLINTC), nmod_mat_ncols (FLINTN),
     5856                       getCharacteristic());
     5857        nmod_mat_mul (FLINTK, FLINTC, FLINTN);
     5858        nmod_mat_init (null, nmod_mat_ncols (FLINTK), nmod_mat_ncols (FLINTK),
     5859                       getCharacteristic());
     5860        rank= nmod_mat_nullspace (null, FLINTK);
     5861        nmod_mat_clear (FLINTK);
     5862        nmod_mat_window_init (FLINTK, null, 0, 0, nmod_mat_nrows(null), rank);
     5863        nmod_mat_clear (FLINTC);
     5864        nmod_mat_init_set (FLINTC, FLINTN);
     5865        nmod_mat_clear (FLINTN);
     5866        nmod_mat_init (FLINTN, nmod_mat_nrows (FLINTC), nmod_mat_ncols (FLINTK),
     5867                       getCharacteristic());
     5868        nmod_mat_mul (FLINTN, FLINTC, FLINTK); //no aliasing allowed!!
     5869
     5870        nmod_mat_clear (FLINTC);
     5871        nmod_mat_window_clear (FLINTK);
     5872        nmod_mat_clear (null);
     5873#else
     5874        NTLC= convertFacCFMatrix2NTLmat_zz_p(C);
     5875        NTLK= (*NTLC)*NTLN;
     5876        transpose (NTLK, NTLK);
     5877        kernel (NTLK, NTLK);
     5878        transpose (NTLK, NTLK);
     5879        NTLN *= NTLK;
     5880        delete NTLC;
     5881#endif
    55205882#ifdef HAVE_FLINT
    55215883        if (nmod_mat_ncols (FLINTN) == 1)
     
    56305992}
    56315993
     5994#ifndef HAVE_FLINT
    56325995void
    56335996refineAndRestartLift (const CanonicalForm& F, const mat_zz_p& NTLN, int
     
    56596022  henselLift12 (F, factors, l, Pi, diophant, M);
    56606023}
     6024#endif
    56616025
    56626026#ifdef HAVE_FLINT
     
    60946458
    60956459//over field extension
     6460#ifdef HAVE_FLINT
     6461CFList
     6462extEarlyReconstructionAndLifting (const CanonicalForm& F, const nmod_mat_t N,
     6463                                  CanonicalForm& bufF, CFList& factors, int& l,
     6464                                  int& factorsFound, bool beenInThres, CFMatrix&
     6465                                  M, CFArray& Pi, CFList& diophant, const
     6466                                  ExtensionInfo& info, const CanonicalForm&
     6467                                  evaluation
     6468                                 )
     6469#else
    60966470CFList
    60976471extEarlyReconstructionAndLifting (const CanonicalForm& F, const mat_zz_p& N,
     
    61026476                                  evaluation
    61036477                                 )
     6478#endif
    61046479{
    61056480  int sizeOfLiftPre;
     
    61106485  CFList result;
    61116486  int smallFactorDeg= 11;
     6487#ifdef HAVE_FLINT
     6488  nmod_mat_t FLINTN;
     6489  nmod_mat_init_set (FLINTN, N);
     6490  int * factorsFoundIndex= new int [nmod_mat_ncols (FLINTN)];
     6491  for (long i= 0; i < nmod_mat_ncols (FLINTN); i++)
     6492#else
    61126493  mat_zz_p NTLN= N;
    61136494  int * factorsFoundIndex= new int [NTLN.NumCols()];
    61146495  for (long i= 0; i < NTLN.NumCols(); i++)
     6496#endif
    61156497    factorsFoundIndex [i]= 0;
    61166498
     
    61266508    }
    61276509    TIMING_START (fac_fq_reconstruction);
     6510#ifdef HAVE_FLINT
     6511    extReconstructionTry (result, bufF, factors, smallFactorDeg, factorsFound,
     6512                          factorsFoundIndex, FLINTN, beenInThres, info,
     6513                          evaluation
     6514                      );
     6515#else
    61286516    extReconstructionTry (result, bufF, factors, smallFactorDeg, factorsFound,
    61296517                          factorsFoundIndex, NTLN, beenInThres, info,
    61306518                          evaluation
    61316519                      );
     6520#endif
    61326521    TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct0: ");
     6522#ifdef HAVE_FLINT
     6523    if (result.length() == nmod_mat_ncols (FLINTN))
     6524    {
     6525      nmod_mat_clear (FLINTN);
     6526#else
    61336527    if (result.length() == NTLN.NumCols())
    61346528    {
     6529#endif
    61356530      delete [] liftPre;
    61366531      delete [] factorsFoundIndex;
     
    61606555      }
    61616556      TIMING_START (fac_fq_reconstruction);
     6557#ifdef HAVE_FLINT
     6558      extReconstructionTry (result, bufF, factors, l, factorsFound,
     6559                            factorsFoundIndex, FLINTN, beenInThres, info,
     6560                            evaluation
     6561                           );
     6562#else
    61626563      extReconstructionTry (result, bufF, factors, l, factorsFound,
    61636564                            factorsFoundIndex, NTLN, beenInThres, info,
    61646565                            evaluation
    61656566                           );
     6567#endif
    61666568      TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct1: ");
     6569#ifdef HAVE_FLINT
     6570      if (result.length() == nmod_mat_ncols (FLINTN))
     6571      {
     6572        nmod_mat_clear (FLINTN);
     6573#else
    61676574      if (result.length() == NTLN.NumCols())
    61686575      {
     6576#endif
    61696577        delete [] liftPre;
    61706578        delete [] factorsFoundIndex;
     
    61976605      }
    61986606      TIMING_START (fac_fq_reconstruction);
     6607#ifdef HAVE_FLINT
     6608      extReconstructionTry (result, bufF, factors, l, factorsFound,
     6609                            factorsFoundIndex, FLINTN, beenInThres, info,
     6610                            evaluation
     6611                           );
     6612#else
    61996613      extReconstructionTry (result, bufF, factors, l, factorsFound,
    62006614                            factorsFoundIndex, NTLN, beenInThres, info,
    62016615                            evaluation
    62026616                           );
     6617#endif
    62036618      TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct2: ");
     6619#ifdef HAVE_FLINT
     6620      if (result.length() == nmod_mat_ncols (FLINTN))
     6621      {
     6622        nmod_mat_clear (FLINTN);
     6623#else
    62046624      if (result.length() == NTLN.NumCols())
    62056625      {
     6626#endif
    62066627        delete [] liftPre;
    62076628        delete [] factorsFoundIndex;
     
    62126633  }
    62136634
     6635#ifdef HAVE_FLINT
     6636  nmod_mat_clear (FLINTN);
     6637#endif
    62146638  delete [] liftPre;
    62156639  delete [] factorsFoundIndex;
     
    73027726  int l= 1;
    73037727
     7728#ifdef HAVE_FLINT
     7729  nmod_mat_t FLINTN;
     7730  nmod_mat_init (FLINTN, bufUniFactors.length()-1, bufUniFactors.length()-1,
     7731                 getCharacteristic());
     7732  for (long i= bufUniFactors.length()-2; i >= 0; i--)
     7733    nmod_mat_entry (FLINTN, i, i)= 1;
     7734#else
    73047735  if (fac_NTL_char != getCharacteristic())
    73057736  {
     
    73117742
    73127743  ident (NTLN, bufUniFactors.length() - 1);
     7744#endif
    73137745  bool irreducible= false;
    73147746  CFArray bufQ= CFArray (bufUniFactors.length() - 1);
     
    73197751  {
    73207752    int start= 0;
     7753#ifdef HAVE_FLINT
     7754    oldL= extLiftAndComputeLattice (F, bounds, d, liftBound, minBound, start,
     7755                                    bufUniFactors, FLINTN, diophant,M, Pi, bufQ,
     7756                                    irreducible, evaluation, info2, source, dest
     7757                                   );
     7758#else
    73217759    oldL= extLiftAndComputeLattice (F, bounds, d, liftBound, minBound, start,
    73227760                                    bufUniFactors, NTLN, diophant, M, Pi, bufQ,
    73237761                                    irreducible, evaluation, info2, source, dest
    73247762                                   );
     7763#endif
    73257764  }
    73267765  else
    73277766  {
     7767#ifdef HAVE_FLINT
     7768    oldL= extLiftAndComputeLattice (F, bounds, d, liftBound, minBound,
     7769                                    minBound+1, bufUniFactors, FLINTN, diophant,
     7770                                    M, Pi, bufQ, irreducible, evaluation, info2,
     7771                                    source, dest
     7772                                   );
     7773#else
    73287774    oldL= extLiftAndComputeLattice (F, bounds, d, liftBound, minBound,
    73297775                                    minBound + 1, bufUniFactors, NTLN, diophant,
     
    73317777                                    source, dest
    73327778                                   );
     7779#endif
    73337780  }
    73347781  TIMING_END_AND_PRINT (fac_fq_till_reduced,
     
    73387785  if (oldL > liftBound)
    73397786  {
     7787#ifdef HAVE_FLINT
     7788    nmod_mat_clear (FLINTN);
     7789#endif
    73407790    delete [] bounds;
    73417791    return Union (smallFactors, extFactorRecombination
     
    73507800  if (irreducible)
    73517801  {
     7802#ifdef HAVE_FLINT
     7803    nmod_mat_clear (FLINTN);
     7804#endif
    73527805    delete [] bounds;
    73537806    CFList source, dest;
     
    73647817    int * factorsFoundIndex;
    73657818
     7819#ifdef HAVE_FLINT
     7820    factorsFoundIndex= new int [nmod_mat_ncols (FLINTN)];
     7821    for (long i= 0; i < nmod_mat_ncols (FLINTN); i++)
     7822#else
    73667823    factorsFoundIndex= new int [NTLN.NumCols()];
    73677824    for (long i= 0; i < NTLN.NumCols(); i++)
     7825#endif
    73687826      factorsFoundIndex[i]= 0;
    73697827
     
    73717829    CanonicalForm bufF= F;
    73727830
     7831#ifdef HAVE_FLINT
     7832    extReconstructionTry (result, bufF, bufUniFactors, degree (F) + 1,
     7833                          factorsFound, factorsFoundIndex, FLINTN, false, info,
     7834                          evaluation
     7835                         );
     7836
     7837    if (result.length() == nmod_mat_ncols (FLINTN))
     7838    {
     7839      nmod_mat_clear (FLINTN);
     7840#else
    73737841    extReconstructionTry (result, bufF, bufUniFactors, degree (F) + 1,
    73747842                          factorsFound, factorsFoundIndex, NTLN, false, info,
     
    73787846    if (result.length() == NTLN.NumCols())
    73797847    {
     7848#endif
    73807849      delete [] factorsFoundIndex;
    73817850      delete [] bounds;
     
    73887857  {
    73897858    int * factorsFoundIndex;
     7859#ifdef HAVE_FLINT
     7860    factorsFoundIndex= new int [nmod_mat_ncols (FLINTN)];
     7861    for (long i= 0; i < nmod_mat_ncols (FLINTN); i++)
     7862#else
    73907863    factorsFoundIndex= new int [NTLN.NumCols()];
    73917864    for (long i= 0; i < NTLN.NumCols(); i++)
     7865#endif
    73927866      factorsFoundIndex[i]= 0;
    73937867    CanonicalForm bufF= F;
    73947868    int factorsFound= 0;
    73957869
     7870#ifdef HAVE_FLINT
     7871    extReconstructionTry (result, bufF, bufUniFactors, degree (F) + 1,
     7872                          factorsFound, factorsFoundIndex, FLINTN, false,
     7873                          info, evaluation
     7874                         );
     7875
     7876    if (result.length() == nmod_mat_ncols (FLINTN))
     7877    {
     7878      nmod_mat_clear (FLINTN);
     7879#else
    73967880    extReconstructionTry (result, bufF, bufUniFactors, degree (F) + 1,
    73977881                          factorsFound, factorsFoundIndex, NTLN, false,
     
    74017885    if (result.length() == NTLN.NumCols())
    74027886    {
     7887#endif
    74037888      delete [] factorsFoundIndex;
    74047889      delete [] bounds;
     
    74117896  bool beenInThres= false;
    74127897  int thres= 100;
     7898#ifdef HAVE_FLINT
     7899  if (l <= thres && bufUniFactors.length() > nmod_mat_ncols (FLINTN))
     7900  {
     7901    refineAndRestartLift (F, FLINTN, 2*totaldegree (F)-1, l, bufUniFactors, M, Pi,
     7902                         diophant
     7903                        );
     7904#else
    74137905  if (l <= thres && bufUniFactors.length() > NTLN.NumCols())
    74147906  {
     
    74167908                         diophant
    74177909                        );
     7910#endif
    74187911    beenInThres= true;
    74197912  }
     
    74237916  int factorsFound= 0;
    74247917
     7918#ifdef HAVE_FLINT
     7919  result= extEarlyReconstructionAndLifting (F, FLINTN, bufF, bufUniFactors, l,
     7920                                            factorsFound, beenInThres, M, Pi,
     7921                                            diophant, info, evaluation
     7922                                           );
     7923
     7924  if (result.length() == nmod_mat_ncols (FLINTN))
     7925  {
     7926    nmod_mat_clear (FLINTN);
     7927#else
    74257928  result= extEarlyReconstructionAndLifting (F, NTLN, bufF, bufUniFactors, l,
    74267929                                            factorsFound, beenInThres, M, Pi,
     
    74307933  if (result.length() == NTLN.NumCols())
    74317934  {
     7935#endif
    74327936    delete [] bounds;
    74337937    return Union (result, smallFactors);
     
    74597963    else
    74607964    {
     7965#ifdef HAVE_FLINT
     7966      int * zeroOne= extractZeroOneVecs (FLINTN);
     7967#else
    74617968      int * zeroOne= extractZeroOneVecs (NTLN);
     7969#endif
    74627970      CFList bufBufUniFactors= bufUniFactors;
    74637971      CFListIterator iter, iter2;
    74647972      CanonicalForm buf;
    74657973      CFList factorsConsidered;
     7974#ifdef HAVE_FLINT
     7975      for (int i= 0; i < nmod_mat_ncols (FLINTN); i++)
     7976#else
    74667977      for (int i= 0; i < NTLN.NumCols(); i++)
     7978#endif
    74677979      {
    74687980        if (zeroOne [i] == 0)
     
    74717983        buf= 1;
    74727984        factorsConsidered= CFList();
     7985#ifdef HAVE_FLINT
     7986        for (int j= 0; j < nmod_mat_nrows (FLINTN); j++, iter++)
     7987        {
     7988          if (!(nmod_mat_entry (FLINTN, j, i) == 0))
     7989#else
    74737990        for (int j= 0; j < NTLN.NumRows(); j++, iter++)
    74747991        {
    74757992          if (!IsZero (NTLN (j + 1,i + 1)))
     7993#endif
    74767994          {
    74777995            factorsConsidered.append (iter.getItem());
     
    74998017    irreducible= false;
    75008018
     8019#ifdef HAVE_FLINT //TODO
     8020    oldNumCols= nmod_mat_ncols (FLINTN);
     8021    resultBufF= extIncreasePrecision (bufF, bufUniFactors, factorsFound,
     8022                                      oldNumCols, oldL, evaluation, info2,
     8023                                      source, dest, l
     8024                                     );
     8025    nmod_mat_clear (FLINTN);
     8026#else
    75018027    oldNumCols= NTLN.NumCols();
    75028028    resultBufF= extIncreasePrecision (bufF, bufUniFactors, factorsFound,
     
    75048030                                      source, dest, l
    75058031                                     );
    7506 
     8032#endif
    75078033    if (bufUniFactors.isEmpty() || degree (bufF) <= 0)
    75088034    {
     
    75378063  if (l/degMipo < liftBound)
    75388064  {
     8065#ifdef HAVE_FLINT
     8066    result=extIncreasePrecision (F, bufUniFactors, oldL, l, d, bounds, bufQ,
     8067                                 FLINTN, evaluation, info2, source, dest
     8068                                );
     8069
     8070    if (result.length()== nmod_mat_ncols (FLINTN))
     8071    {
     8072      nmod_mat_clear (FLINTN);
     8073#else
    75398074    result=extIncreasePrecision (F, bufUniFactors, oldL, l, d, bounds, bufQ,
    75408075                                 NTLN, evaluation, info2, source, dest
     
    75438078    if (result.length()== NTLN.NumCols())
    75448079    {
     8080#endif
    75458081      delete [] bounds;
    75468082      result= Union (result, smallFactors);
     
    75508086    if (result.isEmpty())
    75518087    {
     8088#ifdef HAVE_FLINT
     8089      result= extFurtherLiftingAndIncreasePrecision (F,bufUniFactors, l,
     8090                                                     liftBound, d,bounds,FLINTN,
     8091                                                     diophant, M, Pi, bufQ,
     8092                                                     evaluation, info2, source,
     8093                                                     dest
     8094                                                    );
     8095      if (result.length()== nmod_mat_ncols (FLINTN))
     8096      {
     8097        nmod_mat_clear (FLINTN);
     8098#else
    75528099      result= extFurtherLiftingAndIncreasePrecision (F,bufUniFactors, l,
    75538100                                                     liftBound, d, bounds, NTLN,
     
    75588105      if (result.length()== NTLN.NumCols())
    75598106      {
     8107#endif
    75608108        delete [] bounds;
    75618109        result= Union (result, smallFactors);
     
    75648112    }
    75658113  }
     8114
     8115#ifdef HAVE_FLINT
     8116  nmod_mat_clear (FLINTN);
     8117#endif
    75668118
    75678119  DEBOUTLN (cerr, "lattice recombination failed");
  • factory/facFqBivarUtil.cc

    re82b5f2 r0b7a8a6  
    3131#include "facHensel.h"
    3232#include "facMul.h"
     33
     34#ifdef HAVE_FLINT
     35#include "FLINTconvert.h"
     36#endif
    3337
    3438TIMING_DEFINE_PRINT(fac_log_deriv_div)
     
    698702#endif
    699703
     704#ifdef HAVE_FLINT
     705CFArray
     706getCoeffs (const CanonicalForm& G, const int k, const int l, const int degMipo,
     707           const Variable& alpha, const CanonicalForm& evaluation,
     708           const nmod_mat_t M)
     709{
     710  ASSERT (G.isUnivariate() || G.inCoeffDomain(), "univariate input expected");
     711  CanonicalForm F= G (G.mvar() - evaluation, G.mvar());
     712  if (F.isZero())
     713    return CFArray ();
     714
     715  Variable y= Variable (2);
     716  F= F (power (y, degMipo), y);
     717  F= F (y, alpha);
     718
     719  nmod_poly_t FLINTF;
     720  nmod_mat_t MFLINTF, mulResult;
     721  nmod_mat_init (MFLINTF, l*degMipo, 1, getCharacteristic());
     722  nmod_mat_init (mulResult, l*degMipo, 1, getCharacteristic());
     723
     724  convertFacCF2nmod_poly_t (FLINTF, F);
     725
     726#ifndef slong
     727#define slong long
     728#endif
     729  slong i;
     730
     731  for (i= 0; i < FLINTF->length; i++)
     732    nmod_mat_entry (MFLINTF, i, 0)= FLINTF->coeffs[i];
     733
     734  for (; i < MFLINTF->r; i++)
     735    nmod_mat_entry (MFLINTF, i, 0)= 0;
     736
     737  nmod_mat_mul (mulResult, M, MFLINTF);
     738
     739  F= 0;
     740  for (i= 0; i < mulResult->r; i++)
     741    F += CanonicalForm ((long) nmod_mat_entry (mulResult, i, 0))*power (y, i);
     742
     743  nmod_mat_clear (MFLINTF);
     744  nmod_mat_clear (mulResult);
     745
     746  if (degree (F, 2) < k)
     747    return CFArray();
     748
     749  CFArray result= CFArray (degree (F) - k + 1);
     750
     751  CFIterator j= F;
     752  for (int i= degree (F); i >= k; i--)
     753  {
     754    if (j.exp() == i)
     755    {
     756      result [i - k]= j.coeff();
     757      j++;
     758      if (!j.hasTerms())
     759        return result;
     760    }
     761    else
     762      result[i - k]= 0;
     763  }
     764  return result;
     765}
     766#endif
     767
    700768int * computeBounds (const CanonicalForm& F, int& n, bool& isIrreducible)
    701769{
     
    788856  }
    789857  int k= 0;
     858  int* point= new int [2];
    790859  for (int i= 0; i < n; i++)
    791860  {
     
    834903      continue;
    835904    }
    836     int* point= new int [2];
    837905    point [0]= k;
    838906    point [1]= i + 1;
     
    840908      k= 0;
    841909    result [i]= k;
    842     delete [] point;
    843   }
     910  }
     911
     912  delete [] point;
    844913
    845914  for (int i= 0; i < sizeOfNewtonPolygon; i++)
     
    894963  }
    895964
     965  int swap;
     966  for (int i= 0; i < sizeOfNewtonPolygon; i++)
     967  {
     968    swap= newtonPolyg[i][1];
     969    newtonPolyg[i][1]=newtonPolyg[i][0];
     970    newtonPolyg[i][0]= swap;
     971  }
     972
     973  sizeOfNewtonPolygon= polygon(newtonPolyg, sizeOfNewtonPolygon);
     974
    896975  int minX, minY, maxX, maxY;
    897976  minX= newtonPolyg [0] [0];
     
    902981  for (int i= 1; i < sizeOfNewtonPolygon; i++)
    903982  {
    904     if (newtonPolyg[i][0] == 0)
    905     {
    906       if (newtonPolyg[indZero][0] == 0)
    907       {
    908         if (newtonPolyg[indZero][1] < newtonPolyg[i][1])
     983    if (newtonPolyg[i][1] == 0)
     984    {
     985      if (newtonPolyg[indZero][1] == 0)
     986      {
     987        if (newtonPolyg[indZero][0] < newtonPolyg[i][0])
    909988          indZero= i;
    910989      }
     
    9261005  if (indZero != sizeOfNewtonPolygon - 1)
    9271006  {
    928     slopeNum= newtonPolyg[indZero+1][1]-newtonPolyg[indZero][1];
    929     slopeDen= newtonPolyg[indZero+1][0];
    930     constTerm= newtonPolyg[indZero][1];
     1007    slopeNum= newtonPolyg[indZero+1][0]-newtonPolyg[indZero][0];
     1008    slopeDen= newtonPolyg[indZero+1][1];
     1009    constTerm= newtonPolyg[indZero][0];
    9311010  }
    9321011  else
    9331012  {
    934     slopeNum= newtonPolyg[0][1]-newtonPolyg[indZero][1];
    935     slopeDen= newtonPolyg[0][0];
    936     constTerm= newtonPolyg[indZero][1];
     1013    slopeNum= newtonPolyg[0][0]-newtonPolyg[indZero][0];
     1014    slopeDen= newtonPolyg[0][1];
     1015    constTerm= newtonPolyg[indZero][0];
    9371016  }
    9381017  if (slopeNum < 0)
     
    9421021  }
    9431022  int k= 0;
     1023
     1024  int* point= new int [2];
    9441025  for (int i= 0; i < n; i++)
    9451026  {
    946     if (((indZero+1) < sizeOfNewtonPolygon && (i+1) > newtonPolyg[indZero+1][0])
    947         || ((indZero+1) >= sizeOfNewtonPolygon && (i+1) > newtonPolyg[0][0]))
     1027    if (((indZero+1) < sizeOfNewtonPolygon && (i+1) > newtonPolyg[indZero+1][1])
     1028        || ((indZero+1) >= sizeOfNewtonPolygon && (i+1) > newtonPolyg[0][1]))
    9481029    {
    9491030      if (indZero + 1 != sizeOfNewtonPolygon)
     
    9531034      if (indZero != sizeOfNewtonPolygon - 1)
    9541035      {
    955         slopeNum= newtonPolyg[indZero+1][1]-newtonPolyg[indZero][1];
    956         slopeDen= newtonPolyg[indZero+1][0]-newtonPolyg[indZero][0];
    957         constTerm= newtonPolyg[indZero][1];
     1036        slopeNum= newtonPolyg[indZero+1][0]-newtonPolyg[indZero][0];
     1037        slopeDen= newtonPolyg[indZero+1][1]-newtonPolyg[indZero][1];
     1038        constTerm= newtonPolyg[indZero][0];
    9581039      }
    9591040      else
    9601041      {
    961         slopeNum= newtonPolyg[0][1]-newtonPolyg[indZero][1];
    962         slopeDen= newtonPolyg[0][0]-newtonPolyg[indZero][0];
    963         constTerm= newtonPolyg[indZero][1];
     1042        slopeNum= newtonPolyg[0][0]-newtonPolyg[indZero][0];
     1043        slopeDen= newtonPolyg[0][1]-newtonPolyg[indZero][1];
     1044        constTerm= newtonPolyg[indZero][0];
    9641045      }
    9651046      if (slopeNum < 0)
     
    9671048        negativeSlope= true;
    9681049        slopeNum= - slopeNum;
    969         k= (int) -(((long) slopeNum*((i+1)-newtonPolyg[indZero][0])+slopeDen-1)/
     1050        k= (int) -(((long) slopeNum*((i+1)-newtonPolyg[indZero][1])+slopeDen-1)/
    9701051                   slopeDen) + constTerm;
    9711052      }
    9721053      else
    973         k= (int) (((long) slopeNum*((i+1)-newtonPolyg[indZero][0])) / slopeDen)
     1054        k= (int) (((long) slopeNum*((i+1)-newtonPolyg[indZero][1])) / slopeDen)
    9741055                  + constTerm;
    9751056    }
     
    9771058    {
    9781059      if (negativeSlope)
    979         k= (int) -(((long) slopeNum*((i+1)-newtonPolyg[indZero][0])+slopeDen-1)/
     1060        k= (int) -(((long) slopeNum*((i+1)-newtonPolyg[indZero][1])+slopeDen-1)/
    9801061                   slopeDen) + constTerm;
    9811062      else
    982         k= (int) ((long) slopeNum*((i+1)-newtonPolyg[indZero][0])) / slopeDen
     1063        k= (int) ((long) slopeNum*((i+1)-newtonPolyg[indZero][1])) / slopeDen
    9831064                  + constTerm;
    9841065    }
    985     if (i + 1 > maxX || i + 1 < minX)
     1066    if (i + 1 > maxY || i + 1 < minY)
    9861067    {
    9871068      result [i]= 0;
    9881069      continue;
    9891070    }
    990     int* point= new int [2];
    991     point [0]= i + 1;
    992     point [1]= k;
     1071
     1072    point [0]= k;
     1073    point [1]= i + 1;
    9931074    if (!isInPolygon (newtonPolyg, sizeOfNewtonPolygon, point) && k > 0)
    9941075      k= 0;
    9951076    result [i]= k;
    996     delete [] point;
    997   }
     1077  }
     1078
     1079  delete [] point;
    9981080
    9991081  for (int i= 0; i < sizeOfNewtonPolygon; i++)
  • factory/facFqBivarUtil.h

    re82b5f2 r0b7a8a6  
    2121#ifdef HAVE_NTL
    2222#include "NTLconvert.h"
     23#endif
     24
     25#ifdef HAVE_FLINT
     26#include "FLINTconvert.h"
    2327#endif
    2428
     
    269273#endif
    270274
     275#ifdef HAVE_FLINT
     276/// extract coefficients of \f$ x^i \f$ for \f$i\geq k\f$ where \f$ x \f$ is
     277/// a variable of level 1
     278///
     279/// @return coefficients of \f$ x^i \f$ for \f$i\geq k\f$
     280/// @sa {getCoeffs (const CanonicalForm&, const int, const Variable& alpha),
     281/// getCoeffs (const CanonicalForm&, const int)}
     282CFArray
     283getCoeffs (const CanonicalForm& F,         ///< [in] compressed bivariate poly
     284           const int k,                    ///< [in] some int
     285           const int l,                    ///< [in] precision
     286           const int degMipo,              ///< [in] degree of minimal poly
     287           const Variable& alpha,          ///< [in] algebraic variable
     288           const CanonicalForm& evaluation,///< [in] evaluation point
     289           const nmod_mat_t M              ///< [in] bases change matrix
     290          );
     291#endif
     292
    271293/// write A into M starting at row startIndex
    272294void
  • factory/facFqFactorize.cc

    re82b5f2 r0b7a8a6  
    876876    i++;
    877877    CanonicalForm contentx= content (i.getItem(), x);
     878    if (degree (contentx) > 0)
     879    {
     880      if (!find (list, random))
     881        list.append (random);
     882      result= CFList();
     883      LCFeval= CFList();
     884      eval= CFList();
     885      continue;
     886    }
     887
     888    contentx= content (i.getItem());
    878889    if (degree (contentx) > 0)
    879890    {
     
    19701981    }
    19711982    if (!content(tmp,1).inCoeffDomain())
     1983      preserveDegree= false;
     1984    if (!content(tmp).inCoeffDomain())
    19721985      preserveDegree= false;
    19731986    if (!(gcd (deriv (tmp,x), tmp)).inCoeffDomain())
  • factory/facFqSquarefree.cc

    re82b5f2 r0b7a8a6  
    3030#endif
    3131
     32#ifdef HAVE_FLINT
     33#include "FLINTconvert.h"
     34#endif
     35
    3236static inline
    3337CanonicalForm
     
    6569    power (NTLA2, NTLA2, q/p);
    6670    A= convertNTLzzpE2CF (NTLA2, alpha);
     71    return A;
     72  }
     73  else
     74  {
     75    CanonicalForm buf= 0;
     76    for (CFIterator i= A; i.hasTerms(); i++)
     77      buf= buf + power(A.mvar(), i.exp()/p)*pthRoot (i.coeff(), q, alpha);
     78    return buf;
     79  }
     80}
     81#endif
     82
     83#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     84CanonicalForm
     85pthRoot (const CanonicalForm & F, const fmpz_t& q, const Variable& alpha)
     86{
     87  CanonicalForm A= F;
     88  int p= getCharacteristic ();
     89  if (A.inCoeffDomain())
     90  {
     91    nmod_poly_t FLINTmipo;
     92    fq_nmod_ctx_t fq_con;
     93    fmpz_t qp;
     94    fq_nmod_t FLINTA;
     95
     96    nmod_poly_init (FLINTmipo, p);
     97    convertFacCF2nmod_poly_t (FLINTmipo, getMipo (alpha));
     98
     99    fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     100
     101    fq_nmod_init2 (FLINTA, fq_con);
     102
     103    convertFacCF2Fq_nmod_t (FLINTA, A, fq_con);
     104
     105    fmpz_init_set (qp, q);
     106    fmpz_divexact_si (qp, qp, p);
     107
     108    fq_nmod_pow (FLINTA, FLINTA, qp, fq_con);
     109    A= convertFq_nmod_t2FacCF (FLINTA, alpha);
     110
     111    fmpz_clear (qp);
     112    nmod_poly_clear (FLINTmipo);
     113    fq_nmod_clear (FLINTA, fq_con);
     114    fq_nmod_ctx_clear (fq_con);
    67115    return A;
    68116  }
     
    195243#endif
    196244    buffer= pthRoot (A, ipower (p, k));
    197 #ifdef HAVE_NTL
     245#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     246  else
     247  {
     248    fmpz_t qq;
     249    fmpz_init_set_ui (qq, p);
     250    fmpz_pow_ui (qq, qq, k);
     251    buffer= pthRoot (A, qq, alpha);
     252    fmpz_clear (qq);
     253  }
     254#else
    198255  else
    199256  {
  • factory/facHensel.cc

    re82b5f2 r0b7a8a6  
    3636#include "NTLconvert.h"
    3737
     38#ifdef HAVE_FLINT
     39#include "FLINTconvert.h"
     40#endif
     41
    3842TIMING_DEFINE_PRINT (diotime)
    3943TIMING_DEFINE_PRINT (product1)
     
    4246TIMING_DEFINE_PRINT (hensel)
    4347
     48#if (!(HAVE_FLINT && __FLINT_VERSION_MINOR >= 4))
    4449static
    4550CFList productsNTL (const CFList& factors, const CanonicalForm& M)
     
    7984  return result;
    8085}
     86#endif
     87
     88#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     89static
     90CFList productsFLINT (const CFList& factors, const CanonicalForm& M)
     91{
     92  nmod_poly_t FLINTmipo;
     93  fq_nmod_ctx_t fq_con;
     94  fq_nmod_poly_t prod;
     95  fq_nmod_t buf;
     96
     97  nmod_poly_init (FLINTmipo, getCharacteristic());
     98  convertFacCF2nmod_poly_t (FLINTmipo, M);
     99
     100  fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     101
     102  fq_nmod_poly_t * vec=new fq_nmod_poly_t [factors.length()];
     103
     104  int j= 0;
     105
     106  for (CFListIterator i= factors; i.hasItem(); i++, j++)
     107  {
     108    if (i.getItem().inCoeffDomain())
     109    {
     110      fq_nmod_poly_init (vec[j], fq_con);
     111      fq_nmod_init2 (buf, fq_con);
     112      convertFacCF2Fq_nmod_t (buf, i.getItem(), fq_con);
     113      fq_nmod_poly_set_coeff (vec[j], 0, buf, fq_con);
     114      fq_nmod_clear (buf, fq_con);
     115    }
     116    else
     117      convertFacCF2Fq_nmod_poly_t (vec[j], i.getItem(), fq_con);
     118  }
     119
     120  CFList result;
     121  Variable x= Variable (1);
     122  fq_nmod_poly_init (prod, fq_con);
     123  for (j= 0; j < factors.length(); j++)
     124  {
     125    int k= 0;
     126    fq_nmod_poly_one (prod, fq_con);
     127    for (int i= 0; i < factors.length(); i++, k++)
     128    {
     129      if (k == j)
     130        continue;
     131      fq_nmod_poly_mul (prod, prod, vec[i], fq_con);
     132    }
     133    result.append (convertFq_nmod_poly_t2FacCF (prod, x, M.mvar(), fq_con));
     134  }
     135  for (j= 0; j < factors.length(); j++)
     136    fq_nmod_poly_clear (vec[j], fq_con);
     137
     138  nmod_poly_clear (FLINTmipo);
     139  fq_nmod_poly_clear (prod, fq_con);
     140  fq_nmod_ctx_clear (fq_con);
     141  delete [] vec;
     142  return result;
     143}
     144#endif
    81145
    82146static
     
    103167    i.getItem()= reduce (i.getItem()*inv, M);
    104168  }
     169#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     170  bufFactors= productsFLINT (bufFactors, M);
     171#else
    105172  bufFactors= productsNTL (bufFactors, M);
     173#endif
    106174
    107175  CanonicalForm buf1, buf2, buf3, S, T;
  • factory/facMul.cc

    re82b5f2 r0b7a8a6  
    5757                const Variable& alpha, const CanonicalForm& den)
    5858{
    59 
    6059  CanonicalForm result= 0;
    6160  int i= 0;
     
    6362  int k= 0;
    6463  int degfSubK;
    65   int repLength, j;
    66   CanonicalForm coeff, ff;
    67   fmpz* tmp;
     64  int repLength;
     65  fmpq_poly_t buf;
     66  fmpq_poly_t mipo;
     67  convertFacCF2Fmpq_poly_t (mipo, getMipo(alpha));
    6868  while (degf >= k)
    6969  {
    70     coeff= 0;
    7170    degfSubK= degf - k;
    7271    if (degfSubK >= d)
     
    7574      repLength= degfSubK + 1;
    7675
    77     for (j= 0; j < repLength; j++)
    78     {
    79       tmp= fmpz_poly_get_coeff_ptr (F, j+k);
    80       if (!fmpz_is_zero (tmp))
    81       {
    82         ff= convertFmpz2CF (tmp);
    83         coeff += ff*power (alpha, j); //TODO faster reduction mod alpha
    84       }
    85     }
    86     result += coeff*power (x, i);
     76    fmpq_poly_init2 (buf, repLength);
     77    _fmpq_poly_set_length (buf, repLength);
     78    _fmpz_vec_set (buf->coeffs, F->coeffs + k, repLength);
     79    _fmpq_poly_normalise (buf);
     80    fmpq_poly_rem (buf, buf, mipo);
     81
     82    result += convertFmpq_poly_t2FacCF (buf, alpha)*power (x, i);
     83    fmpq_poly_clear (buf);
    8784    i++;
    8885    k= d*i;
    8986  }
     87  fmpq_poly_clear (mipo);
    9088  result /= den;
    9189  return result;
     
    405403      if (b.getp() != 0)
    406404      {
    407         ZZ_p::init (convertFacCF2NTLZZ (b.getpk()));
    408405        CanonicalForm mipo= getMipo (alpha);
    409406        bool is_rat= isOn (SW_RATIONAL);
     
    413410        if (!is_rat)
    414411          Off (SW_RATIONAL);
     412#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     413        fmpz_t FLINTp;
     414        fmpz_mod_poly_t FLINTmipo;
     415        fq_ctx_t fq_con;
     416        fq_poly_t FLINTF, FLINTG;
     417
     418        fmpz_init (FLINTp);
     419
     420        convertCF2Fmpz (FLINTp, b.getpk());
     421
     422        convertFacCF2Fmpz_mod_poly_t (FLINTmipo, mipo, FLINTp);
     423
     424        fq_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     425
     426        convertFacCF2Fq_poly_t (FLINTF, F, fq_con);
     427        convertFacCF2Fq_poly_t (FLINTG, G, fq_con);
     428
     429        fq_poly_mul (FLINTF, FLINTF, FLINTG, fq_con);
     430
     431        CanonicalForm result= convertFq_poly_t2FacCF (FLINTF, F.mvar(),
     432                                                      alpha, fq_con);
     433
     434        fmpz_clear (FLINTp);
     435        fmpz_mod_poly_clear (FLINTmipo);
     436        fq_poly_clear (FLINTF, fq_con);
     437        fq_poly_clear (FLINTG, fq_con);
     438        fq_ctx_clear (fq_con);
     439        return b (result);
     440#else
     441        ZZ_p::init (convertFacCF2NTLZZ (b.getpk()));
    415442        ZZ_pX NTLmipo= to_ZZ_pX (convertFacCF2NTLZZX (mipo));
    416443        ZZ_pE::init (NTLmipo);
     
    418445        ZZ_pEX NTLf= convertFacCF2NTLZZ_pEX (F, NTLmipo);
    419446        mul (NTLf, NTLf, NTLg);
     447
    420448        return b (convertNTLZZ_pEX2CF (NTLf, F.mvar(), alpha));
     449#endif
    421450      }
    422451#ifdef HAVE_FLINT
     
    439468        convertFacCF2Fmpz_mod_poly_t (FLINTG, G, FLINTpk);
    440469        fmpz_mod_poly_mul (FLINTF, FLINTF, FLINTG);
    441         CanonicalForm result= convertFmpz_mod_poly_t2FacCF (FLINTF, F.mvar(), b);
     470        CanonicalForm result= convertFmpz_mod_poly_t2FacCF (FLINTF, F.mvar(),b);
    442471        fmpz_mod_poly_clear (FLINTG);
    443472        fmpz_mod_poly_clear (FLINTF);
     
    466495        if (hasFirstAlgVar (G, alpha) || hasFirstAlgVar (F, alpha))
    467496        {
    468           ZZ_p::init (convertFacCF2NTLZZ (b.getpk()));
     497#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     498          fmpz_t FLINTp;
     499          fmpz_mod_poly_t FLINTmipo;
     500          fq_ctx_t fq_con;
     501
     502          fmpz_init (FLINTp);
     503          convertCF2Fmpz (FLINTp, b.getpk());
     504
     505          convertFacCF2Fmpz_mod_poly_t (FLINTmipo, getMipo (alpha), FLINTp);
     506
     507          fq_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     508
     509          CanonicalForm result;
     510
    469511          if (F.inCoeffDomain() && !G.inCoeffDomain())
    470512          {
    471             ZZ_pX NTLmipo= to_ZZ_pX (convertFacCF2NTLZZX (getMipo (alpha)));
    472             ZZ_pE::init (NTLmipo);
     513            fq_poly_t FLINTG;
     514            fmpz_poly_t FLINTF;
     515            convertFacCF2Fmpz_poly_t (FLINTF, F);
     516            convertFacCF2Fq_poly_t (FLINTG, G, fq_con);
     517
     518            fq_poly_scalar_mul_fq (FLINTG, FLINTG, FLINTF, fq_con);
     519
     520            result= convertFq_poly_t2FacCF (FLINTG, G.mvar(), alpha, fq_con);
     521            fmpz_poly_clear (FLINTF);
     522            fq_poly_clear (FLINTG, fq_con);
     523          }
     524          else if (!F.inCoeffDomain() && G.inCoeffDomain())
     525          {
     526            fq_poly_t FLINTF;
     527            fmpz_poly_t FLINTG;
     528
     529            convertFacCF2Fmpz_poly_t (FLINTG, G);
     530            convertFacCF2Fq_poly_t (FLINTF, F, fq_con);
     531
     532            fq_poly_scalar_mul_fq (FLINTF, FLINTF, FLINTG, fq_con);
     533
     534            result= convertFq_poly_t2FacCF (FLINTF, F.mvar(), alpha, fq_con);
     535            fmpz_poly_clear (FLINTG);
     536            fq_poly_clear (FLINTF, fq_con);
     537          }
     538          else
     539          {
     540            fq_t FLINTF, FLINTG;
     541
     542            convertFacCF2Fq_t (FLINTF, F, fq_con);
     543            convertFacCF2Fq_t (FLINTG, G, fq_con);
     544
     545            fq_mul (FLINTF, FLINTF, FLINTG, fq_con);
     546
     547            result= convertFq_t2FacCF (FLINTF, alpha);
     548            fq_clear (FLINTF, fq_con);
     549            fq_clear (FLINTG, fq_con);
     550          }
     551
     552          fmpz_clear (FLINTp);
     553          fmpz_mod_poly_clear (FLINTmipo);
     554          fq_ctx_clear (fq_con);
     555
     556          return b (result);
     557#else
     558          ZZ_p::init (convertFacCF2NTLZZ (b.getpk()));
     559          ZZ_pX NTLmipo= to_ZZ_pX (convertFacCF2NTLZZX (getMipo (alpha)));
     560          ZZ_pE::init (NTLmipo);
     561
     562          if (F.inCoeffDomain() && !G.inCoeffDomain())
     563          {
    473564            ZZ_pEX NTLg= convertFacCF2NTLZZ_pEX (G, NTLmipo);
    474565            ZZ_pX NTLf= convertFacCF2NTLZZpX (F);
     
    478569          else if (!F.inCoeffDomain() && G.inCoeffDomain())
    479570          {
    480             ZZ_pX NTLmipo= to_ZZ_pX (convertFacCF2NTLZZX (getMipo (alpha)));
    481             ZZ_pE::init (NTLmipo);
    482571            ZZ_pX NTLg= convertFacCF2NTLZZpX (G);
    483572            ZZ_pEX NTLf= convertFacCF2NTLZZ_pEX (F, NTLmipo);
     
    487576          else
    488577          {
    489             ZZ_pX NTLmipo= to_ZZ_pX (convertFacCF2NTLZZX (getMipo (alpha)));
    490             ZZ_pE::init (NTLmipo);
    491578            ZZ_pX NTLg= convertFacCF2NTLZZpX (G);
    492579            ZZ_pX NTLf= convertFacCF2NTLZZpX (F);
     
    495582            return b (convertNTLZZpX2CF (rep (result), alpha));
    496583          }
     584#endif
    497585        }
    498586      }
     
    514602  if (hasFirstAlgVar (F, alpha) || hasFirstAlgVar (G, alpha))
    515603  {
     604#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     605    nmod_poly_t FLINTmipo;
     606    fq_nmod_ctx_t fq_con;
     607
     608    nmod_poly_init (FLINTmipo, getCharacteristic());
     609    convertFacCF2nmod_poly_t (FLINTmipo, getMipo (alpha));
     610
     611    fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     612
     613    fq_nmod_poly_t FLINTF, FLINTG;
     614    convertFacCF2Fq_nmod_poly_t (FLINTF, F, fq_con);
     615    convertFacCF2Fq_nmod_poly_t (FLINTG, G, fq_con);
     616
     617    fq_nmod_poly_mul (FLINTF, FLINTF, FLINTG, fq_con);
     618
     619    result= convertFq_nmod_poly_t2FacCF (FLINTF, F.mvar(), alpha, fq_con);
     620
     621    fq_nmod_poly_clear (FLINTF, fq_con);
     622    fq_nmod_poly_clear (FLINTG, fq_con);
     623    nmod_poly_clear (FLINTmipo);
     624    fq_nmod_ctx_clear (fq_con);
     625#else
    516626    zz_pX NTLMipo= convertFacCF2NTLzzpX (getMipo (alpha));
    517627    zz_pE::init (NTLMipo);
     
    520630    mul (NTLF, NTLF, NTLG);
    521631    result= convertNTLzz_pEX2CF(NTLF, F.mvar(), alpha);
     632#endif
    522633  }
    523634  else
     
    605716      if (b.getp() != 0)
    606717      {
     718#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     719        fmpz_t FLINTp;
     720        fmpz_mod_poly_t FLINTmipo;
     721        fq_ctx_t fq_con;
     722        fq_poly_t FLINTF, FLINTG;
     723
     724        fmpz_init (FLINTp);
     725
     726        convertCF2Fmpz (FLINTp, b.getpk());
     727
     728        convertFacCF2Fmpz_mod_poly_t (FLINTmipo, getMipo (alpha), FLINTp);
     729
     730        fq_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     731
     732        convertFacCF2Fq_poly_t (FLINTF, F, fq_con);
     733        convertFacCF2Fq_poly_t (FLINTG, G, fq_con);
     734
     735        fq_poly_rem (FLINTF, FLINTF, FLINTG, fq_con);
     736
     737        CanonicalForm result= convertFq_poly_t2FacCF (FLINTF, F.mvar(),
     738                                                      alpha, fq_con);
     739
     740        fmpz_clear (FLINTp);
     741        fmpz_mod_poly_clear (FLINTmipo);
     742        fq_poly_clear (FLINTF, fq_con);
     743        fq_poly_clear (FLINTG, fq_con);
     744        fq_ctx_clear (fq_con);
     745
     746        return b(result);
     747#else
    607748        ZZ_p::init (convertFacCF2NTLZZ (b.getpk()));
    608749        ZZ_pX NTLmipo= to_ZZ_pX (convertFacCF2NTLZZX (getMipo (alpha)));
     
    612753        rem (NTLf, NTLf, NTLg);
    613754        return b (convertNTLZZ_pEX2CF (NTLf, F.mvar(), alpha));
     755#endif
    614756      }
    615757#ifdef HAVE_FLINT
     
    634776  if (hasFirstAlgVar (F, alpha) || hasFirstAlgVar (G, alpha))
    635777  {
     778#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     779    nmod_poly_t FLINTmipo;
     780    fq_nmod_ctx_t fq_con;
     781
     782    nmod_poly_init (FLINTmipo, getCharacteristic());
     783    convertFacCF2nmod_poly_t (FLINTmipo, getMipo (alpha));
     784
     785    fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     786
     787    fq_nmod_poly_t FLINTF, FLINTG;
     788    convertFacCF2Fq_nmod_poly_t (FLINTF, F, fq_con);
     789    convertFacCF2Fq_nmod_poly_t (FLINTG, G, fq_con);
     790
     791    fq_nmod_poly_rem (FLINTF, FLINTF, FLINTG, fq_con);
     792
     793    result= convertFq_nmod_poly_t2FacCF (FLINTF, F.mvar(), alpha, fq_con);
     794
     795    fq_nmod_poly_clear (FLINTF, fq_con);
     796    fq_nmod_poly_clear (FLINTG, fq_con);
     797    nmod_poly_clear (FLINTmipo);
     798    fq_nmod_ctx_clear (fq_con);
     799#else
    636800    zz_pX NTLMipo= convertFacCF2NTLzzpX(getMipo (alpha));
    637801    zz_pE::init (NTLMipo);
     
    640804    rem (NTLF, NTLF, NTLG);
    641805    result= convertNTLzz_pEX2CF(NTLF, F.mvar(), alpha);
     806#endif
    642807  }
    643808  else
     
    679844        hasFirstAlgVar (F, alpha);
    680845        hasFirstAlgVar (G, alpha);
     846#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     847        fmpz_t FLINTp;
     848        fmpz_mod_poly_t FLINTmipo;
     849        fq_ctx_t fq_con;
     850        fq_t FLINTF, FLINTG;
     851
     852        fmpz_init (FLINTp);
     853        convertCF2Fmpz (FLINTp, b.getpk());
     854
     855        convertFacCF2Fmpz_mod_poly_t (FLINTmipo, getMipo (alpha), FLINTp);
     856
     857        fq_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     858
     859        convertFacCF2Fq_t (FLINTF, F, fq_con);
     860        convertFacCF2Fq_t (FLINTG, G, fq_con);
     861
     862        fq_inv (FLINTG, FLINTG, fq_con);
     863        fq_mul (FLINTF, FLINTF, FLINTG, fq_con);
     864
     865        CanonicalForm result= convertFq_t2FacCF (FLINTF, alpha);
     866
     867        fmpz_clear (FLINTp);
     868        fmpz_mod_poly_clear (FLINTmipo);
     869        fq_clear (FLINTF, fq_con);
     870        fq_clear (FLINTG, fq_con);
     871        fq_ctx_clear (fq_con);
     872        return b (result);
     873#else
    681874        ZZ_p::init (convertFacCF2NTLZZ (b.getpk()));
    682875        ZZ_pX NTLmipo= to_ZZ_pX (convertFacCF2NTLZZX (getMipo (alpha)));
     
    687880        div (result, to_ZZ_pE (NTLf), to_ZZ_pE (NTLg));
    688881        return b (convertNTLZZpX2CF (rep (result), alpha));
     882#endif
    689883      }
    690884      return b(div (F,G));
     
    700894        Variable alpha;
    701895        hasFirstAlgVar (G, alpha);
     896#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     897        fmpz_t FLINTp;
     898        fmpz_mod_poly_t FLINTmipo;
     899        fq_ctx_t fq_con;
     900        fq_poly_t FLINTF;
     901        fq_t FLINTG;
     902
     903        fmpz_init (FLINTp);
     904        convertCF2Fmpz (FLINTp, b.getpk());
     905
     906        convertFacCF2Fmpz_mod_poly_t (FLINTmipo, getMipo (alpha), FLINTp);
     907
     908        fq_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     909
     910        convertFacCF2Fq_poly_t (FLINTF, F, fq_con);
     911        convertFacCF2Fq_t (FLINTG, G, fq_con);
     912
     913        fq_inv (FLINTG, FLINTG, fq_con);
     914        fq_poly_scalar_mul_fq (FLINTF, FLINTF, FLINTG, fq_con);
     915
     916        CanonicalForm result= convertFq_poly_t2FacCF (FLINTF, F.mvar(),
     917                                                      alpha, fq_con);
     918
     919        fmpz_clear (FLINTp);
     920        fmpz_mod_poly_clear (FLINTmipo);
     921        fq_poly_clear (FLINTF, fq_con);
     922        fq_clear (FLINTG, fq_con);
     923        fq_ctx_clear (fq_con);
     924        return b (result);
     925#else
    702926        ZZ_p::init (convertFacCF2NTLZZ (b.getpk()));
    703927        ZZ_pX NTLmipo= to_ZZ_pX (convertFacCF2NTLZZX (getMipo (alpha)));
     
    707931        div (NTLf, NTLf, to_ZZ_pE (NTLg));
    708932        return b (convertNTLZZ_pEX2CF (NTLf, F.mvar(), alpha));
     933#endif
    709934      }
    710935      return b(div (F,G));
     
    754979      if (b.getp() != 0)
    755980      {
     981#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     982        fmpz_t FLINTp;
     983        fmpz_mod_poly_t FLINTmipo;
     984        fq_ctx_t fq_con;
     985        fq_poly_t FLINTF, FLINTG;
     986
     987        fmpz_init (FLINTp);
     988        convertCF2Fmpz (FLINTp, b.getpk());
     989
     990        convertFacCF2Fmpz_mod_poly_t (FLINTmipo, getMipo (alpha), FLINTp);
     991
     992        fq_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     993
     994        convertFacCF2Fq_poly_t (FLINTF, F, fq_con);
     995        convertFacCF2Fq_poly_t (FLINTG, G, fq_con);
     996
     997        fq_poly_divrem (FLINTF, FLINTG, FLINTF, FLINTG, fq_con);
     998
     999        CanonicalForm result= convertFq_poly_t2FacCF (FLINTF, F.mvar(),
     1000                                                      alpha, fq_con);
     1001
     1002        fmpz_clear (FLINTp);
     1003        fmpz_mod_poly_clear (FLINTmipo);
     1004        fq_ctx_clear (fq_con);
     1005        fq_poly_clear (FLINTF, fq_con);
     1006        fq_poly_clear (FLINTG, fq_con);
     1007        return b (result);
     1008#else
    7561009        ZZ_p::init (convertFacCF2NTLZZ (b.getpk()));
    7571010        ZZ_pX NTLmipo= to_ZZ_pX (convertFacCF2NTLZZX (getMipo (alpha)));
     
    7611014        div (NTLf, NTLf, NTLg);
    7621015        return b (convertNTLZZ_pEX2CF (NTLf, F.mvar(), alpha));
     1016#endif
    7631017      }
    7641018#ifdef HAVE_FLINT
     
    7831037  if (hasFirstAlgVar (F, alpha) || hasFirstAlgVar (G, alpha))
    7841038  {
     1039#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     1040    nmod_poly_t FLINTmipo;
     1041    fq_nmod_ctx_t fq_con;
     1042
     1043    nmod_poly_init (FLINTmipo, getCharacteristic());
     1044    convertFacCF2nmod_poly_t (FLINTmipo, getMipo (alpha));
     1045
     1046    fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     1047
     1048    fq_nmod_poly_t FLINTF, FLINTG;
     1049    convertFacCF2Fq_nmod_poly_t (FLINTF, F, fq_con);
     1050    convertFacCF2Fq_nmod_poly_t (FLINTG, G, fq_con);
     1051
     1052    fq_nmod_poly_divrem (FLINTF, FLINTG, FLINTF, FLINTG, fq_con);
     1053
     1054    result= convertFq_nmod_poly_t2FacCF (FLINTF, F.mvar(), alpha, fq_con);
     1055
     1056    fq_nmod_poly_clear (FLINTF, fq_con);
     1057    fq_nmod_poly_clear (FLINTG, fq_con);
     1058    nmod_poly_clear (FLINTmipo);
     1059    fq_nmod_ctx_clear (fq_con);
     1060#else
    7851061    zz_pX NTLMipo= convertFacCF2NTLzzpX(getMipo (alpha));
    7861062    zz_pE::init (NTLMipo);
     
    7891065    div (NTLF, NTLF, NTLG);
    7901066    result= convertNTLzz_pEX2CF(NTLF, F.mvar(), alpha);
     1067#endif
    7911068  }
    7921069  else
     
    8191096  int degAy= degree (A);
    8201097  nmod_poly_init2 (result, getCharacteristic(), d*(degAy + 1));
     1098  result->length= d*(degAy + 1);
     1099  flint_mpn_zero (result->coeffs, d*(degAy+1));
    8211100
    8221101  nmod_poly_t buf;
    8231102
    824   int j, k, bufRepLength;
     1103  int k;
    8251104  for (CFIterator i= A; i.hasTerms(); i++)
    8261105  {
    8271106    convertFacCF2nmod_poly_t (buf, i.coeff());
    828 
    8291107    k= i.exp()*d;
    830     bufRepLength= (int) nmod_poly_length (buf);
    831     for (j= 0; j < bufRepLength; j++)
    832       nmod_poly_set_coeff_ui (result, j + k, nmod_poly_get_coeff_ui (buf, j));
     1108    flint_mpn_copyi (result->coeffs+k, buf->coeffs, nmod_poly_length(buf));
     1109
    8331110    nmod_poly_clear (buf);
    8341111  }
     
    8361113}
    8371114
    838 void kronSubQa (fmpq_poly_t result, const CanonicalForm& A, int d1, int d2)
     1115#if (__FLINT_VERSION_MINOR >= 4)
     1116void
     1117kronSubFq (fq_nmod_poly_t result, const CanonicalForm& A, int d,
     1118           const fq_nmod_ctx_t fq_con)
     1119{
     1120  int degAy= degree (A);
     1121  fq_nmod_poly_init2 (result, d*(degAy + 1), fq_con);
     1122  _fq_nmod_poly_set_length (result, d*(degAy + 1), fq_con);
     1123  _fq_nmod_vec_zero (result->coeffs, d*(degAy + 1), fq_con);
     1124
     1125  fq_nmod_poly_t buf1;
     1126
     1127  nmod_poly_t buf2;
     1128
     1129  int k;
     1130
     1131  for (CFIterator i= A; i.hasTerms(); i++)
     1132  {
     1133    if (i.coeff().inCoeffDomain())
     1134    {
     1135      convertFacCF2nmod_poly_t (buf2, i.coeff());
     1136      fq_nmod_poly_init2 (buf1, 1, fq_con);
     1137      fq_nmod_poly_set_coeff (buf1, 0, buf2, fq_con);
     1138      nmod_poly_clear (buf2);
     1139    }
     1140    else
     1141      convertFacCF2Fq_nmod_poly_t (buf1, i.coeff(), fq_con);
     1142
     1143    k= i.exp()*d;
     1144    _fq_nmod_vec_set (result->coeffs+k, buf1->coeffs,
     1145                      fq_nmod_poly_length (buf1, fq_con), fq_con);
     1146
     1147    fq_nmod_poly_clear (buf1, fq_con);
     1148  }
     1149
     1150  _fq_nmod_poly_normalise (result, fq_con);
     1151}
     1152#endif
     1153
     1154/*void kronSubQa (fmpq_poly_t result, const CanonicalForm& A, int d1, int d2)
    8391155{
    8401156  int degAy= degree (A);
     
    8791195  fmpq_clear (coeff);
    8801196  _fmpq_poly_normalise (result);
     1197}*/
     1198
     1199void kronSubQa (fmpz_poly_t result, const CanonicalForm& A, int d1, int d2)
     1200{
     1201  int degAy= degree (A);
     1202  fmpz_poly_init2 (result, d1*(degAy + 1));
     1203  _fmpz_poly_set_length (result, d1*(degAy + 1));
     1204
     1205  fmpz_poly_t buf;
     1206
     1207  int k;
     1208  CFIterator j;
     1209  for (CFIterator i= A; i.hasTerms(); i++)
     1210  {
     1211    if (i.coeff().inCoeffDomain())
     1212    {
     1213      k= d1*i.exp();
     1214      convertFacCF2Fmpz_poly_t (buf, i.coeff());
     1215      _fmpz_vec_set (result->coeffs + k, buf->coeffs, buf->length);
     1216      fmpz_poly_clear (buf);
     1217    }
     1218    else
     1219    {
     1220      for (j= i.coeff(); j.hasTerms(); j++)
     1221      {
     1222        k= d1*i.exp();
     1223        k += d2*j.exp();
     1224        convertFacCF2Fmpz_poly_t (buf, j.coeff());
     1225        _fmpz_vec_set (result->coeffs + k, buf->coeffs, buf->length);
     1226        fmpz_poly_clear (buf);
     1227      }
     1228    }
     1229  }
     1230  _fmpz_poly_normalise (result);
    8811231}
    8821232
     
    9211271}
    9221272
     1273#if (__FLINT_VERSION_MINOR >= 4)
     1274void
     1275kronSubReciproFq (fq_nmod_poly_t subA1, fq_nmod_poly_t subA2,
     1276                  const CanonicalForm& A, int d, const fq_nmod_ctx_t fq_con)
     1277{
     1278  int degAy= degree (A);
     1279  fq_nmod_poly_init2 (subA1, d*(degAy + 2), fq_con);
     1280  fq_nmod_poly_init2 (subA2, d*(degAy + 2), fq_con);
     1281
     1282  _fq_nmod_poly_set_length (subA1, d*(degAy + 2), fq_con);
     1283  _fq_nmod_vec_zero (subA1->coeffs, d*(degAy + 2), fq_con);
     1284
     1285  _fq_nmod_poly_set_length (subA2, d*(degAy + 2), fq_con);
     1286  _fq_nmod_vec_zero (subA2->coeffs, d*(degAy + 2), fq_con);
     1287
     1288  fq_nmod_poly_t buf1;
     1289
     1290  nmod_poly_t buf2;
     1291
     1292  int k, kk;
     1293  for (CFIterator i= A; i.hasTerms(); i++)
     1294  {
     1295    if (i.coeff().inCoeffDomain())
     1296    {
     1297      convertFacCF2nmod_poly_t (buf2, i.coeff());
     1298      fq_nmod_poly_init2 (buf1, 1, fq_con);
     1299      fq_nmod_poly_set_coeff (buf1, 0, buf2, fq_con);
     1300      nmod_poly_clear (buf2);
     1301    }
     1302    else
     1303      convertFacCF2Fq_nmod_poly_t (buf1, i.coeff(), fq_con);
     1304
     1305    k= i.exp()*d;
     1306    kk= (degAy - i.exp())*d;
     1307    _fq_nmod_vec_add (subA1->coeffs+k, subA1->coeffs+k, buf1->coeffs,
     1308                      fq_nmod_poly_length(buf1, fq_con), fq_con);
     1309    _fq_nmod_vec_add (subA2->coeffs+kk, subA2->coeffs+kk, buf1->coeffs,
     1310                      fq_nmod_poly_length(buf1, fq_con), fq_con);
     1311
     1312    fq_nmod_poly_clear (buf1, fq_con);
     1313  }
     1314  _fq_nmod_poly_normalise (subA1, fq_con);
     1315  _fq_nmod_poly_normalise (subA2, fq_con);
     1316}
     1317#endif
     1318
    9231319void
    9241320kronSubReciproQ (fmpz_poly_t subA1, fmpz_poly_t subA2, const CanonicalForm& A,
     
    9301326
    9311327  fmpz_poly_t buf;
    932   fmpz_t coeff1, coeff2;
    933 
    934   int k, kk, j, bufRepLength;
     1328
     1329  int k, kk;
    9351330  for (CFIterator i= A; i.hasTerms(); i++)
    9361331  {
     
    9391334    k= i.exp()*d;
    9401335    kk= (degAy - i.exp())*d;
    941     bufRepLength= (int) fmpz_poly_length (buf);
    942     for (j= 0; j < bufRepLength; j++)
    943     {
    944       fmpz_poly_get_coeff_fmpz (coeff1, subA1, j+k);
    945       fmpz_poly_get_coeff_fmpz (coeff2, buf, j);
    946       fmpz_add (coeff1, coeff1, coeff2);
    947       fmpz_poly_set_coeff_fmpz (subA1, j + k, coeff1);
    948       fmpz_poly_get_coeff_fmpz (coeff1, subA2, j + kk);
    949       fmpz_add (coeff1, coeff1, coeff2);
    950       fmpz_poly_set_coeff_fmpz (subA2, j + kk, coeff1);
    951     }
     1336    _fmpz_vec_add (subA1->coeffs+k, subA1->coeffs + k, buf->coeffs, buf->length);
     1337    _fmpz_vec_add (subA2->coeffs+kk, subA2->coeffs + kk, buf->coeffs, buf->length);
    9521338    fmpz_poly_clear (buf);
    9531339  }
    954   fmpz_clear (coeff1);
    955   fmpz_clear (coeff2);
     1340
    9561341  _fmpz_poly_normalise (subA1);
    9571342  _fmpz_poly_normalise (subA2);
     
    9621347  Variable y= Variable (2);
    9631348  Variable x= Variable (1);
    964 
    965   fmpz_poly_t f;
    966   fmpz_poly_init (f);
    967   fmpz_poly_set (f, F);
    9681349
    9691350  fmpz_poly_t buf;
    9701351  CanonicalForm result= 0;
    9711352  int i= 0;
    972   int degf= fmpz_poly_degree(f);
     1353  int degf= fmpz_poly_degree(F);
    9731354  int k= 0;
    974   int degfSubK, repLength, j;
    975   fmpz_t coeff;
     1355  int degfSubK, repLength;
    9761356  while (degf >= k)
    9771357  {
     
    9831363
    9841364    fmpz_poly_init2 (buf, repLength);
    985     fmpz_init (coeff);
    986     for (j= 0; j < repLength; j++)
    987     {
    988       fmpz_poly_get_coeff_fmpz (coeff, f, j + k);
    989       fmpz_poly_set_coeff_fmpz (buf, j, coeff);
    990     }
     1365    _fmpz_poly_set_length (buf, repLength);
     1366    _fmpz_vec_set (buf->coeffs, F->coeffs+k, repLength);
    9911367    _fmpz_poly_normalise (buf);
    9921368
     
    9951371    k= d*i;
    9961372    fmpz_poly_clear (buf);
    997     fmpz_clear (coeff);
    998   }
    999   fmpz_poly_clear (f);
     1373  }
    10001374
    10011375  return result;
    10021376}
    10031377
    1004 CanonicalForm
     1378/*CanonicalForm
    10051379reverseSubstQa (const fmpq_poly_t F, int d1, int d2, const Variable& alpha,
    10061380                const fmpq_poly_t mipo)
     
    10721446  fmpq_poly_clear (f);
    10731447  return result;
     1448}*/
     1449
     1450CanonicalForm
     1451reverseSubstQa (const fmpz_poly_t F, int d1, int d2, const Variable& alpha,
     1452                const fmpq_poly_t mipo)
     1453{
     1454  Variable y= Variable (2);
     1455  Variable x= Variable (1);
     1456
     1457  fmpq_poly_t buf;
     1458  CanonicalForm result= 0, result2;
     1459  int i= 0;
     1460  int degf= fmpz_poly_degree(F);
     1461  int k= 0;
     1462  int degfSubK;
     1463  int repLength;
     1464  while (degf >= k)
     1465  {
     1466    degfSubK= degf - k;
     1467    if (degfSubK >= d1)
     1468      repLength= d1;
     1469    else
     1470      repLength= degfSubK + 1;
     1471
     1472    int j= 0;
     1473    result2= 0;
     1474    while (j*d2 < repLength)
     1475    {
     1476      fmpq_poly_init2 (buf, d2);
     1477      _fmpq_poly_set_length (buf, d2);
     1478      _fmpz_vec_set (buf->coeffs, F->coeffs + k*j*d2, d2);
     1479      _fmpq_poly_normalise (buf);
     1480      fmpq_poly_rem (buf, buf, mipo);
     1481      result2 += convertFmpq_poly_t2FacCF (buf, alpha)*power (x, j);
     1482      j++;
     1483      fmpq_poly_clear (buf);
     1484    }
     1485    if (repLength - j*d2 != 0 && j*d2 - repLength < d2)
     1486    {
     1487      j--;
     1488      repLength -= j*d2;
     1489      fmpq_poly_init2 (buf, repLength);
     1490      _fmpq_poly_set_length (buf, repLength);
     1491      j++;
     1492      _fmpz_vec_set (buf->coeffs, F->coeffs + k + j*d2, repLength);
     1493      _fmpq_poly_normalise (buf);
     1494      fmpq_poly_rem (buf, buf, mipo);
     1495      result2 += convertFmpq_poly_t2FacCF (buf, alpha)*power (x, j);
     1496      fmpq_poly_clear (buf);
     1497    }
     1498
     1499    result += result2*power (y, i);
     1500    i++;
     1501    k= d1*i;
     1502  }
     1503
     1504  return result;
    10741505}
    10751506
     
    11921623}
    11931624
     1625#if (__FLINT_VERSION_MINOR >= 4)
     1626CanonicalForm
     1627reverseSubstReciproFq (const fq_nmod_poly_t F, const fq_nmod_poly_t G, int d,
     1628                       int k, const Variable& alpha, const fq_nmod_ctx_t fq_con)
     1629{
     1630  Variable y= Variable (2);
     1631  Variable x= Variable (1);
     1632
     1633  fq_nmod_poly_t f, g;
     1634  int degf= fq_nmod_poly_degree(F, fq_con);
     1635  int degg= fq_nmod_poly_degree(G, fq_con);
     1636
     1637  fq_nmod_poly_t buf1,buf2, buf3;
     1638
     1639  fq_nmod_poly_init (f, fq_con);
     1640  fq_nmod_poly_init (g, fq_con);
     1641  fq_nmod_poly_set (f, F, fq_con);
     1642  fq_nmod_poly_set (g, G, fq_con);
     1643  if (fq_nmod_poly_length (f, fq_con) < (long) d*(k + 1)) //zero padding
     1644    fq_nmod_poly_fit_length (f, (long) d*(k + 1), fq_con);
     1645
     1646  CanonicalForm result= 0;
     1647  int i= 0;
     1648  int lf= 0;
     1649  int lg= d*k;
     1650  int degfSubLf= degf;
     1651  int deggSubLg= degg-lg;
     1652  int repLengthBuf2, repLengthBuf1, tmp;
     1653  while (degf >= lf || lg >= 0)
     1654  {
     1655    if (degfSubLf >= d)
     1656      repLengthBuf1= d;
     1657    else if (degfSubLf < 0)
     1658      repLengthBuf1= 0;
     1659    else
     1660      repLengthBuf1= degfSubLf + 1;
     1661    fq_nmod_poly_init2 (buf1, repLengthBuf1, fq_con);
     1662    _fq_nmod_poly_set_length (buf1, repLengthBuf1, fq_con);
     1663
     1664    _fq_nmod_vec_set (buf1->coeffs, f->coeffs + lf, repLengthBuf1, fq_con);
     1665    _fq_nmod_poly_normalise (buf1, fq_con);
     1666
     1667    repLengthBuf1= fq_nmod_poly_length (buf1, fq_con);
     1668
     1669    if (deggSubLg >= d - 1)
     1670      repLengthBuf2= d - 1;
     1671    else if (deggSubLg < 0)
     1672      repLengthBuf2= 0;
     1673    else
     1674      repLengthBuf2= deggSubLg + 1;
     1675
     1676    fq_nmod_poly_init2 (buf2, repLengthBuf2, fq_con);
     1677    _fq_nmod_poly_set_length (buf2, repLengthBuf2, fq_con);
     1678    _fq_nmod_vec_set (buf2->coeffs, g->coeffs + lg, repLengthBuf2, fq_con);
     1679
     1680    _fq_nmod_poly_normalise (buf2, fq_con);
     1681    repLengthBuf2= fq_nmod_poly_length (buf2, fq_con);
     1682
     1683    fq_nmod_poly_init2 (buf3, repLengthBuf2 + d, fq_con);
     1684    _fq_nmod_poly_set_length (buf3, repLengthBuf2 + d, fq_con);
     1685    _fq_nmod_vec_set (buf3->coeffs, buf1->coeffs, repLengthBuf1, fq_con);
     1686    _fq_nmod_vec_set (buf3->coeffs + d, buf2->coeffs, repLengthBuf2, fq_con);
     1687
     1688    _fq_nmod_poly_normalise (buf3, fq_con);
     1689
     1690    result += convertFq_nmod_poly_t2FacCF (buf3, x, alpha, fq_con)*power (y, i);
     1691    i++;
     1692
     1693
     1694    lf= i*d;
     1695    degfSubLf= degf - lf;
     1696
     1697    lg= d*(k - i);
     1698    deggSubLg= degg - lg;
     1699
     1700    if (lg >= 0 && deggSubLg > 0)
     1701    {
     1702      if (repLengthBuf2 > degfSubLf + 1)
     1703        degfSubLf= repLengthBuf2 - 1;
     1704      tmp= tmin (repLengthBuf1, deggSubLg + 1);
     1705      _fq_nmod_vec_sub (g->coeffs + lg, g->coeffs + lg, buf1-> coeffs,
     1706                        tmp, fq_con);
     1707    }
     1708    if (lg < 0)
     1709    {
     1710      fq_nmod_poly_clear (buf1, fq_con);
     1711      fq_nmod_poly_clear (buf2, fq_con);
     1712      fq_nmod_poly_clear (buf3, fq_con);
     1713      break;
     1714    }
     1715    if (degfSubLf >= 0)
     1716      _fq_nmod_vec_sub (f->coeffs + lf, f->coeffs + lf, buf2->coeffs,
     1717                        repLengthBuf2, fq_con);
     1718    fq_nmod_poly_clear (buf1, fq_con);
     1719    fq_nmod_poly_clear (buf2, fq_con);
     1720    fq_nmod_poly_clear (buf3, fq_con);
     1721  }
     1722
     1723  fq_nmod_poly_clear (f, fq_con);
     1724  fq_nmod_poly_clear (g, fq_con);
     1725
     1726  return result;
     1727}
     1728#endif
     1729
    11941730CanonicalForm
    11951731reverseSubstReciproQ (const fmpz_poly_t F, const fmpz_poly_t G, int d, int k)
     
    12051741  int degf= fmpz_poly_degree(f);
    12061742  int degg= fmpz_poly_degree(g);
    1207 
    12081743
    12091744  fmpz_poly_t buf1,buf2, buf3;
     
    13261861}
    13271862
    1328 CanonicalForm reverseSubstFp (const nmod_poly_t F, int d)
     1863#if (__FLINT_VERSION_MINOR >= 4)
     1864CanonicalForm
     1865reverseSubstFq (const fq_nmod_poly_t F, int d, const Variable& alpha,
     1866                const fq_nmod_ctx_t fq_con)
    13291867{
    13301868  Variable y= Variable (2);
    13311869  Variable x= Variable (1);
    13321870
    1333   nmod_poly_t f;
    1334   mp_limb_t ninv= n_preinvert_limb (getCharacteristic());
    1335   nmod_poly_init_preinv (f, getCharacteristic(), ninv);
    1336   nmod_poly_set (f, F);
    1337 
    1338   nmod_poly_t buf;
     1871  fq_nmod_poly_t buf;
    13391872  CanonicalForm result= 0;
    13401873  int i= 0;
    1341   int degf= nmod_poly_degree(f);
     1874  int degf= fq_nmod_poly_degree(F, fq_con);
    13421875  int k= 0;
    1343   int degfSubK, repLength, j;
     1876  int degfSubK, repLength;
    13441877  while (degf >= k)
    13451878  {
     
    13501883      repLength= degfSubK + 1;
    13511884
     1885    fq_nmod_poly_init2 (buf, repLength, fq_con);
     1886    _fq_nmod_poly_set_length (buf, repLength, fq_con);
     1887    _fq_nmod_vec_set (buf->coeffs, F->coeffs+k, repLength, fq_con);
     1888    _fq_nmod_poly_normalise (buf, fq_con);
     1889
     1890    result += convertFq_nmod_poly_t2FacCF (buf, x, alpha, fq_con)*power (y, i);
     1891    i++;
     1892    k= d*i;
     1893    fq_nmod_poly_clear (buf, fq_con);
     1894  }
     1895
     1896  return result;
     1897}
     1898#endif
     1899
     1900CanonicalForm reverseSubstFp (const nmod_poly_t F, int d)
     1901{
     1902  Variable y= Variable (2);
     1903  Variable x= Variable (1);
     1904
     1905  mp_limb_t ninv= n_preinvert_limb (getCharacteristic());
     1906
     1907  nmod_poly_t buf;
     1908  CanonicalForm result= 0;
     1909  int i= 0;
     1910  int degf= nmod_poly_degree(F);
     1911  int k= 0;
     1912  int degfSubK, repLength, j;
     1913  while (degf >= k)
     1914  {
     1915    degfSubK= degf - k;
     1916    if (degfSubK >= d)
     1917      repLength= d;
     1918    else
     1919      repLength= degfSubK + 1;
     1920
    13521921    nmod_poly_init2_preinv (buf, getCharacteristic(), ninv, repLength);
    13531922    for (j= 0; j < repLength; j++)
    1354       nmod_poly_set_coeff_ui (buf, j, nmod_poly_get_coeff_ui (f, j + k));
     1923      nmod_poly_set_coeff_ui (buf, j, nmod_poly_get_coeff_ui (F, j + k));
    13551924    _nmod_poly_normalise (buf);
    13561925
     
    13601929    nmod_poly_clear (buf);
    13611930  }
    1362   nmod_poly_clear (f);
    13631931
    13641932  return result;
     
    14342002}
    14352003
     2004#if (__FLINT_VERSION_MINOR >= 4)
     2005CanonicalForm
     2006mulMod2FLINTFqReci (const CanonicalForm& F, const CanonicalForm& G, const
     2007                    CanonicalForm& M, const Variable& alpha,
     2008                    const fq_nmod_ctx_t fq_con)
     2009{
     2010  int d1= degree (F, 1) + degree (G, 1) + 1;
     2011  d1 /= 2;
     2012  d1 += 1;
     2013
     2014  fq_nmod_poly_t F1, F2;
     2015  kronSubReciproFq (F1, F2, F, d1, fq_con);
     2016
     2017  fq_nmod_poly_t G1, G2;
     2018  kronSubReciproFq (G1, G2, G, d1, fq_con);
     2019
     2020  int k= d1*degree (M);
     2021  fq_nmod_poly_mullow (F1, F1, G1, (long) k, fq_con);
     2022
     2023  int degtailF= degree (tailcoeff (F), 1);;
     2024  int degtailG= degree (tailcoeff (G), 1);
     2025  int taildegF= taildegree (F);
     2026  int taildegG= taildegree (G);
     2027
     2028  int b= fq_nmod_poly_degree (F2, fq_con) + fq_nmod_poly_degree (G2, fq_con) - k
     2029         - degtailF - degtailG + d1*(2+taildegF + taildegG);
     2030
     2031  fq_nmod_poly_reverse (F2, F2, fq_nmod_poly_degree (F2, fq_con), fq_con);
     2032  fq_nmod_poly_reverse (G2, G2, fq_nmod_poly_degree (G2, fq_con), fq_con);
     2033  fq_nmod_poly_mullow (F2, F2, G2, b+1, fq_con);
     2034  fq_nmod_poly_reverse (F2, F2, b, fq_con);
     2035
     2036  int d2= tmax (fq_nmod_poly_degree (F2, fq_con)/d1,
     2037                fq_nmod_poly_degree (F1, fq_con)/d1);
     2038
     2039  CanonicalForm result= reverseSubstReciproFq (F1, F2, d1, d2, alpha, fq_con);
     2040
     2041  fq_nmod_poly_clear (F1, fq_con);
     2042  fq_nmod_poly_clear (F2, fq_con);
     2043  fq_nmod_poly_clear (G1, fq_con);
     2044  fq_nmod_poly_clear (G2, fq_con);
     2045  return result;
     2046}
     2047
     2048CanonicalForm
     2049mulMod2FLINTFq (const CanonicalForm& F, const CanonicalForm& G, const
     2050                CanonicalForm& M, const Variable& alpha,
     2051                const fq_nmod_ctx_t fq_con)
     2052{
     2053  CanonicalForm A= F;
     2054  CanonicalForm B= G;
     2055
     2056  int degAx= degree (A, 1);
     2057  int degAy= degree (A, 2);
     2058  int degBx= degree (B, 1);
     2059  int degBy= degree (B, 2);
     2060  int d1= degAx + 1 + degBx;
     2061  int d2= tmax (degAy, degBy);
     2062
     2063  if (d1 > 128 && d2 > 160 && (degAy == degBy) && (2*degAy > degree (M)))
     2064    return mulMod2FLINTFqReci (A, B, M, alpha, fq_con);
     2065
     2066  fq_nmod_poly_t FLINTA, FLINTB;
     2067  kronSubFq (FLINTA, A, d1, fq_con);
     2068  kronSubFq (FLINTB, B, d1, fq_con);
     2069
     2070  int k= d1*degree (M);
     2071  fq_nmod_poly_mullow (FLINTA, FLINTA, FLINTB, (long) k, fq_con);
     2072
     2073  A= reverseSubstFq (FLINTA, d1, alpha, fq_con);
     2074
     2075  fq_nmod_poly_clear (FLINTA, fq_con);
     2076  fq_nmod_poly_clear (FLINTB, fq_con);
     2077  return A;
     2078}
     2079#endif
     2080
    14362081CanonicalForm
    14372082mulMod2FLINTQReci (const CanonicalForm& F, const CanonicalForm& G, const
     
    14992144}
    15002145
    1501 CanonicalForm
     2146/*CanonicalForm
    15022147mulMod2FLINTQa (const CanonicalForm& F, const CanonicalForm& G,
    15032148                const CanonicalForm& M)
     
    15292174  fmpq_poly_clear (FLINTG);
    15302175  return result;
    1531 }
    1532 
    1533 #endif
    1534 
     2176}*/
     2177
     2178CanonicalForm
     2179mulMod2FLINTQa (const CanonicalForm& F, const CanonicalForm& G,
     2180                const CanonicalForm& M)
     2181{
     2182  Variable a;
     2183  if (!hasFirstAlgVar (F,a) && !hasFirstAlgVar (G, a))
     2184    return mulMod2FLINTQ (F, G, M);
     2185  CanonicalForm A= F, B= G;
     2186
     2187  int degFx= degree (F, 1);
     2188  int degFa= degree (F, a);
     2189  int degGx= degree (G, 1);
     2190  int degGa= degree (G, a);
     2191
     2192  int d2= degFa+degGa+1;
     2193  int d1= degFx + 1 + degGx;
     2194  d1 *= d2;
     2195
     2196  CanonicalForm f= bCommonDen (F);
     2197  CanonicalForm g= bCommonDen (G);
     2198  A *= f;
     2199  B *= g;
     2200
     2201  fmpz_poly_t FLINTF, FLINTG;
     2202  kronSubQa (FLINTF, A, d1, d2);
     2203  kronSubQa (FLINTG, B, d1, d2);
     2204
     2205  fmpz_poly_mullow (FLINTF, FLINTF, FLINTG, d1*degree (M));
     2206
     2207  fmpq_poly_t mipo;
     2208  convertFacCF2Fmpq_poly_t (mipo, getMipo (a));
     2209  A= reverseSubstQa (FLINTF, d1, d2, a, mipo);
     2210  fmpz_poly_clear (FLINTF);
     2211  fmpz_poly_clear (FLINTG);
     2212  return A/(f*g);
     2213}
     2214
     2215#endif
     2216
     2217#ifndef HAVE_FLINT
    15352218zz_pX kronSubFp (const CanonicalForm& A, int d)
    15362219{
     
    15622245  return result;
    15632246}
    1564 
     2247#endif
     2248
     2249#if (!(HAVE_FLINT && __FLINT_VERSION_MINOR >= 4))
    15652250zz_pEX kronSubFq (const CanonicalForm& A, int d, const Variable& alpha)
    15662251{
     
    16412326  subA2.normalize();
    16422327}
    1643 
     2328#endif
     2329
     2330#ifndef HAVE_FLINT
    16442331void
    16452332kronSubReciproFp (zz_pX& subA1, zz_pX& subA2, const CanonicalForm& A, int d)
     
    16742361  subA2.normalize();
    16752362}
    1676 
     2363#endif
     2364
     2365#if (!(HAVE_FLINT && __FLINT_VERSION_MINOR >= 4))
    16772366CanonicalForm
    16782367reverseSubstReciproFq (const zz_pEX& F, const zz_pEX& G, int d, int k,
     
    17862475  return result;
    17872476}
    1788 
     2477#endif
     2478
     2479#ifndef HAVE_FLINT
    17892480CanonicalForm
    17902481reverseSubstReciproFp (const zz_pX& F, const zz_pX& G, int d, int k)
     
    18982589  return result;
    18992590}
    1900 
     2591#endif
     2592
     2593#if (!(HAVE_FLINT && __FLINT_VERSION_MINOR >= 4))
    19012594CanonicalForm reverseSubstFq (const zz_pEX& F, int d, const Variable& alpha)
    19022595{
     
    19352628  return result;
    19362629}
    1937 
     2630#endif
     2631
     2632#ifndef HAVE_FLINT
    19382633CanonicalForm reverseSubstFp (const zz_pX& F, int d)
    19392634{
     
    19732668}
    19742669
    1975 // assumes input to be reduced mod M and to be an element of Fq not Fp
     2670// assumes input to be reduced mod M and to be an element of Fp
    19762671CanonicalForm
    19772672mulMod2NTLFpReci (const CanonicalForm& F, const CanonicalForm& G, const
     
    20332728  return A;
    20342729}
    2035 
     2730#endif
     2731
     2732#if (!(HAVE_FLINT && __FLINT_VERSION_MINOR >= 4))
    20362733// assumes input to be reduced mod M and to be an element of Fq not Fp
    20372734CanonicalForm
     
    20652762  return reverseSubstReciproFq (F1, F2, d1, d2, alpha);
    20662763}
     2764#endif
    20672765
    20682766#ifdef HAVE_FLINT
     
    20822780  if (hasFirstAlgVar (A, alpha) || hasFirstAlgVar (B, alpha))
    20832781  {
     2782#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     2783    nmod_poly_t FLINTmipo;
     2784    convertFacCF2nmod_poly_t (FLINTmipo, getMipo (alpha));
     2785
     2786    fq_nmod_ctx_t fq_con;
     2787    fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     2788
     2789    A= mulMod2FLINTFq (A, B, M, alpha, fq_con);
     2790    nmod_poly_clear (FLINTmipo);
     2791    fq_nmod_ctx_clear (fq_con);
     2792#else
    20842793    int degAx= degree (A, 1);
    20852794    int degAy= degree (A, 2);
     
    21092818
    21102819    A= reverseSubstFq (NTLA, d1, alpha);
    2111 
    2112     return A;
     2820#endif
    21132821  }
    21142822  else
     2823  {
    21152824#ifdef HAVE_FLINT
    2116     return mulMod2FLINTFp (A, B, M);
     2825    A= mulMod2FLINTFp (A, B, M);
    21172826#else
    2118     return mulMod2NTLFp (A, B, M);
    2119 #endif
     2827    A= mulMod2NTLFp (A, B, M);
     2828#endif
     2829  }
     2830  return A;
    21202831}
    21212832
     
    24823193    else
    24833194    {
     3195      Variable y= Variable (2);
     3196#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     3197      nmod_poly_t FLINTmipo;
     3198      fq_nmod_ctx_t fq_con;
     3199
     3200      nmod_poly_init (FLINTmipo, getCharacteristic());
     3201      convertFacCF2nmod_poly_t (FLINTmipo, M);
     3202
     3203      fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     3204
     3205
     3206      fq_nmod_poly_t FLINTA, FLINTB;
     3207      convertFacCF2Fq_nmod_poly_t (FLINTA, swapvar (A, x, y), fq_con);
     3208      convertFacCF2Fq_nmod_poly_t (FLINTB, swapvar (B, x, y), fq_con);
     3209
     3210      fq_nmod_poly_divrem (FLINTA, FLINTB, FLINTA, FLINTB, fq_con);
     3211
     3212      Q= convertFq_nmod_poly_t2FacCF (FLINTA, x, y, fq_con);
     3213
     3214      fq_nmod_poly_clear (FLINTA, fq_con);
     3215      fq_nmod_poly_clear (FLINTB, fq_con);
     3216      nmod_poly_clear (FLINTmipo);
     3217      fq_nmod_ctx_clear (fq_con);
     3218#else
    24843219      bool zz_pEbak= zz_pE::initialized();
    24853220      zz_pEBak bak;
     
    24873222        bak.save();
    24883223      zz_pX mipo= convertFacCF2NTLzzpX (M);
    2489       Variable y= Variable (2);
    24903224      zz_pEX NTLA, NTLB;
    24913225      NTLA= convertFacCF2NTLzz_pEX (swapvar (A, x, y), mipo);
     
    24953229      if (zz_pEbak)
    24963230        bak.restore();
     3231#endif
    24973232    }
    24983233  }
     
    25413276    else
    25423277    {
     3278      Variable y= Variable (2);
     3279#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     3280      nmod_poly_t FLINTmipo;
     3281      fq_nmod_ctx_t fq_con;
     3282
     3283      nmod_poly_init (FLINTmipo, getCharacteristic());
     3284      convertFacCF2nmod_poly_t (FLINTmipo, M);
     3285
     3286      fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     3287
     3288      fq_nmod_poly_t FLINTA, FLINTB;
     3289      convertFacCF2Fq_nmod_poly_t (FLINTA, swapvar (A, x, y), fq_con);
     3290      convertFacCF2Fq_nmod_poly_t (FLINTB, swapvar (B, x, y), fq_con);
     3291
     3292      fq_nmod_poly_divrem (FLINTA, FLINTB, FLINTA, FLINTB, fq_con);
     3293
     3294      Q= convertFq_nmod_poly_t2FacCF (FLINTA, x, y, fq_con);
     3295      R= convertFq_nmod_poly_t2FacCF (FLINTB, x, y, fq_con);
     3296
     3297      fq_nmod_poly_clear (FLINTA, fq_con);
     3298      fq_nmod_poly_clear (FLINTB, fq_con);
     3299      nmod_poly_clear (FLINTmipo);
     3300      fq_nmod_ctx_clear (fq_con);
     3301#else
    25433302      zz_pX mipo= convertFacCF2NTLzzpX (M);
    2544       Variable y= Variable (2);
    25453303      zz_pEX NTLA, NTLB;
    25463304      NTLA= convertFacCF2NTLzz_pEX (swapvar (A, x, y), mipo);
     
    25503308      Q= convertNTLzz_pEX2CF (NTLQ, x, y);
    25513309      R= convertNTLzz_pEX2CF (NTLR, x, y);
     3310#endif
    25523311    }
    25533312  }
     
    28713630    if (hasFirstAlgVar (A, alpha) || hasFirstAlgVar (B, alpha))
    28723631    {
     3632#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     3633      nmod_poly_t FLINTmipo;
     3634      fq_nmod_ctx_t fq_con;
     3635
     3636      nmod_poly_init (FLINTmipo, getCharacteristic());
     3637      convertFacCF2nmod_poly_t (FLINTmipo, getMipo (alpha));
     3638
     3639      fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     3640
     3641      fq_nmod_poly_t FLINTA, FLINTB;
     3642      convertFacCF2Fq_nmod_poly_t (FLINTA, A, fq_con);
     3643      convertFacCF2Fq_nmod_poly_t (FLINTB, B, fq_con);
     3644      int result= fq_nmod_poly_divides (FLINTA, FLINTB, FLINTA, fq_con);
     3645      fq_nmod_poly_clear (FLINTA, fq_con);
     3646      fq_nmod_poly_clear (FLINTB, fq_con);
     3647      nmod_poly_clear (FLINTmipo);
     3648      fq_nmod_ctx_clear (fq_con);
     3649      return result;
     3650#else
    28733651      zz_pX NTLMipo= convertFacCF2NTLzzpX (getMipo (alpha));
    28743652      zz_pE::init (NTLMipo);
     
    28763654      zz_pEX NTLB= convertFacCF2NTLzz_pEX (B, NTLMipo);
    28773655      return divide (NTLB, NTLA);
     3656#endif
    28783657    }
    28793658#ifdef HAVE_FLINT
Note: See TracChangeset for help on using the changeset viewer.