qt-assistant-qassistantclient-library-compat-version-4.6.3/ 777 0 0 0 11410372725 17131 5qt-assistant-qassistantclient-library-compat-version-4.6.3/assistant.icns 777 0 0 475410 11406632726 22163 0icns{is32Pstt}}ttt€tt,tܨttttttttt tttttjW5&t^&ttttf&&ttB&&t¨t\&&%tC&(&( &&'&˽eܹӹܹ๻ܹܹܹܹܩS9傁:ӹ幟::˃g::ӂ:j::9<@::;::9((5^5((((C(,(k^yy((((((((( (((((5O{(PyCw((yy(k(=(^^(j(yy(I(js8mk@@@@@@@PP0`PpPil32 NhfdeeffjfeSkfe bhfbgfhf_]_cfhbgffjVYr^efgh]bfhbgfkEWހ`g_R|cfhbghW.bCU]fhbgl)]"u#SdffhbhebrsF,5674+17685667&a.61?S268567->,$j)68567.$A3768574)u+ liƆI36857-CZ/+IɁn,6,57'XO1/<>iG/%57$fJ206$ 0O58$kI212***57%eJ205)**57'YP1/:'*.z57,E[/-D$*72(V573+u,&Y#$267'567$R'IN355567(Su/!Ȁ*,5667!H1,OǞJ2/56'e7/771-/*24B567K=761M565$S06/X567,EO16,Y5670.=8562;5644676565657756677665l8mkrd>.ݼmE$ ĞuM+ꔫz4[BbrhMV13WװCtoDu߾mE# { ݼkC! &2mih32 -bgfgbe-Xfdffeg?nifeg(mgfefgfPjfe agfdbgfhbgfghdbcefhbgf hkXSkzxj]afhbgf i`)^Á^efih]]dfhbgfi[ _efj hdjQ!jdffhbgfl$4beh[YjdfbgfkO_fga*hefebbgfjb^fgd fW^fd]\bgfh m]fgfl`fcsbggh r]fggl`f_Ǽbggh o]fggl`f_¨bgfi g^fgfl`f_ƨbgfjX^fgdl`f_ábgfkC`fgal`felp_׬ʨbgfl-)eeh[l`ffedf`˫bgfjG mcjRɀl`fiɧbgfh] `l>sm]_efgbgffj\Zi dd_Wsdff`ʩbgffkG36f*3zbfecͳbgfiR_hWtcf_϶bgfha { fdfjP9ýseff^ܙдbgfib(Xccfii^]]^cffegޤҴbgfhlWVbf cuԑbgfm"4lhfb}bgfjQ́_f`ᦰbgfj":_f`bgf gg-Vaf\bgfgl_Zefbdf `sbgfeef egdbgfgěbgfggƝbgfggbgfeg򡍓c MHOwMKJvLKJOLFrLKKLIWLIYLIYLIY LIY vྫྷLIYW Ԭַ LIY[ Ѭ_­ LIYV~R LIYWӪO ۵H LIYIрZ{κ LIYY 򱯴J`񲯰LIYqn뮰IǀLIYd䬰NṟLIY]߬S^LIYYܫUbLIYXܫVbֻLIYXܫVbLIY[ެUbѿLIYa⬰RaLIYjx魰NaLIYzfﯯIƀaLIYSI؀bLIYI€ UdLIY`۪XgڗLIYN~owlLIYdެRɁLIYY 尯̷LIYu̯LIYS種 ׼LIYpmͲޫĿLIYKہ­LIYopĭLIY z콮LIY ̵LIY ԶȵLIYھLIYMIYι͵JZö '567746'26567,87676&86760765564 568 56312468 56 77+-ERN;+068 56 73fY+5674+*468 5672 -567'HG268 56} *67vc.68 567(/u3qP05a.68 567$2 .&[(268  56671ƀJ08&3+qPK68  5667(2 947/<:4668 5668M0573k;4665 5667d-665,9564/ 5667u+665 yX",63*' 5667~+6~a.63G 5667+6~a.6-o 5667+6~a.6-l 5667y+6~a.6-l 5667m,665~a.6-k 5667Z.664 ~a.65>@* 5668"C5473 a.66546- 5667+'@370πaa.69 56673 Y.7(,B_(,46  567p%6w-sFyF366- 567,#n#La/ LQ1662 567i-60ÁI26. 56746367-2~G466+ 5674d22674+**,26646 567*!06 2E 568M?9561P 567/Ӂb-6.a 567Sh,6.[ 567 [W067) 568.,56046 .I 5656 574 567 5656775677 566576h8mk .XnjD$;žjE#hhE':ƠyH' ß{W/Ҏ  Î7 n~\RhnaAbN qlH$'9B2'^ ޷dAg/‘iAi๔oI mq@ x;—gC% !>{$it32B16PcffeefgeeMhmjgfafggdnOՅeefgjfj=`fj8sNՅeefdZjfggHafj"/yNՅeefc_]`gjfgeSafk%+~MՅeefes̀jfgdWafk(,LՅeefco׿jfgdcafk(#LՅeefcqш|jfgdbafk(LՅeef"cqqjfgdcafk( LՅeef#cq~»jfgdZafk(!LՅeef$cqýjfgeSafk(+LՅeef'cqÍýjfggMafk(,LՅeef'cqčžjfgiB`fj"+|MՅeef'cqČƿjfj8`fj"4wNՅeef'cq|ūƿjfj$+_fj9rOՅeefcqͤ鲗Žjfl,^fiAnOՅeefcq́Ô¹jfl5^fggLhPՅeefdpδsb\Žjfl?щ]fgd[cQՅeefb]_ceg딫jfkJ\fga laQՅeefefgjfiU^fi\`QՅeefg¹jfh_ r`fiVbQՅeefgƓ¹jfggIgefkMeQՅeefgœ¸jfk'#qcfl@ΆnhQՅeefgjfl=ֈafl1ajQՅeefgǿjfjR]fj3]jQՅeefg䍩Žjfgca]fhbe_jQՅgefg¹jfk&#hdfjPndjQՅkdfgʍžjfkE_fl0^fjQͅ yaikie]agfgیjfh` k]fh` j^fjTĆVG#)pbfg⎞Ļjfl-}_fm3߆ idfh\rw\fg㐚ŽjfjU cbfmN \ffgd]fgߍƿjfk%%h\@ncfk%I]fgڋjfiW77jʈ\fkE]fgى»jfl5ۙcefgeu]fg܈ĽjfgfCz`fkP_fg䉔Žjfj[ q]fkK ܫycfg󒎧ļjfkT ]fk`; Mռ|d]bfdûjflUv]fhljcWS[flga]^aef_ځjfk_%FՎq^fghgfedef]jfijJtފÂ^bfea݀jfkhP, RV`fdfĸjfgjn_xcefcsȼjfi@~`fcr􅉘ôjfl2Zfct~jfjOY_bbdf_y~jfgeWxzrdf_w}jfl4]f]ntw{ujfiZ]f\첀jfl0]f_jfha\]f^jfkQ]fdjfkN ]fejfk]-<]fgjfik^F( E{˾pdfdèjfhkljc][]__]]^`dfc }}jf}{jfed~jfg~{jfe~jfgfggfƿ~jfƼjfgffʿjfgjfeȽjfg~jfgg}¾jf~jfgよjfe Ղjfggfe }kӪށ LMMLLHJaNLJGeMLIMKLIPLJMOLGPLGeOLKJNMLHbKLFưMLKKʰLJVҰLH`ӰLGf԰LGf԰LGf԰LGf԰LGf԰LGf԰LGfLGfLGfwk{ŷLGfsLHʹLGfsJ;u׍ԲLGfXBEëLGfNEIҬ fZTLGfNGD٬IGEׂ𯯍LGfVHAԫFH]LGflFEjǬpFC~LGfGKF΋\IALGf^HB•X@UޫNJF΃LGfGJHՉ 簬kC>pGIWLGfdGDv ]H?ᬁvFDtLGfKKBΫIKCdžaHALGf}FIVeGDu ԭOICĄLGf_HC߫GKJۆ 﨣JELLGfNKAˬPKAHI~񺵳LGfGKJۈbHC}@By޲LGfuFH_uFG`CCzLGfbHD|FJOPAzLGfUJA䬅HKFΆf>zLGfMKBܫMKC;zLGfHKFЉիQJA2xLGfGJOάWIAp~ LGf|FIWɬ\IC긝@>D릩LGfsFGcŬaHD~KIOLGflGEn­eGDvKIOLGffGDviGErKIOLGfbHD}lGFlKIOLGf^ICoGFjKIO߀LGf\ICrFFjKIOȿLGf\IBrFGcKIOⳮ»LGf\IBrFGaKIO"ԤɿLGf\IBrFGaKIO#׭LGf\ICrFGbKIO$׳ŹLGf]ICrFFiKIO'ٶĺLGfaHCrFFjKIOٶɁøLGfcGDylGFjKIO'ٵ³LGfhGErlGEoKIO'ثɼȿLGfnGFiìhGEsKIOμŵLGfvFH_ǬdGDyKIOٺʽLGfFIU̬`HCKIOŶͽ÷LGfGJM߉ѫ\IC籛KIOƶLGfHKE͉ثWIAޯKIOǶLGfMKB߬QJ@ԯKIOӻȷLGfUJA譅NKBɰKIOںɸLGfaHD~𰯄IKDɆKIOڹȷLGfqFGcGKK܆KIOһǶLGfFJN{FIXꮴKIOķLGfKKC̬iGEnثKIO̿LGfXIB߫XIAŬKIO𰯍ȻɸLGfpFGd󱯂JKBKIOݶõLGfGKG҉¬zFHX⬰KJL܅ɹLGfUIAુUJ@ǬMJHՆ٦q\mLGfwFH\}FGT QJDŇ͙֫ƵLGfMKA ꮮMGB ԫ[IAӫ붽ȸLGfoFFdⱬK=JoFDӫ赽ʼLGfNJAooوЫGISӫ洽ͿLGfEHS믯]GBի鳼LGfcGCzLFLЊˬξLGfUGAŬW@OԺ̻LGfSFDɫdV̻ʱɸLGfYCC« 篼ȶLGfoGrҫLGfukLGf ̱LGfΰ︬LGfͰLGfʰƭľ׀LGfİꭶĽLGfͮLGfļLGfƾLGfƾLGfżLMLGfɯºNKLLGf䬸žLGf΀LLGfÿNHf 䰰Hf ɼ !)056755#/687656775+776577/86576/8676+86755 "7677650767"765677*767176755673!67#767#767#767#767#767#767#765567#767871+(+-0/.+*-2567#76785-367"P *77604567#76!^*67,҆ր2;<.134567#7672z+673 GVOE?92..567#767-шU06"ZzWǩ;467#768'4?368'5W@367#76"Y2568+ ܆!W?367#764,67/= W?367#7672*672^W?367#767.É)673Y?367#768+ ډ+65{;~ ?367#768)*w,6 k1. ؅ BKSYail9567#767&9l-6"\5/ څԀ0/.--67#767$Fd.67#R=. څ4567#767#Ra.67$LB- څ45654&#76"[Y/67$DK, څ4562,*.7f#76!dW/67%AR+ څ4565Ho#76 hW/67&AX* څ4562Aрր #76 sW/67&:X* څ4562E#76 rW/67&7X* څ456"2D#76 sW/67&7X* څ456#2D#76 jW/67&8X* څ456$2D#76 dW/67&@X* څ456'2D#76"_W/67&AV* څ4562Dׂ#767"V^.67$AO+ څ4562Dˀ#767#Lb.67$HI, څ456'2D#767%@h-67#MB. څ4562D#768'4q,67#U<. څ4562Dϻ#768)(}+6"^4/ څ4563CjG1(#767,։*6 l/0 څ45671*-257#767/)65{,0 څ456567#7672+673 +1 څ4567#764.672u-1 څ4567#76!\65670Y01 څ4567#767&:D267,ӆ@41 څ4567#768+ڈ\/68(+061 څ4567#7671~+67$H)71 څ4567#765q*65uj,71 څ7467#767&:84670A271 څ=367#767.ƈc-67(*+671ӅO/73+1767#764z)675 zr,671ʆ%#-qj067#767'0U-68)% :4673|)67#7672 20680)6 *67#767%;8)& A267%\*67#7673xILwψ*67.%*67#768)%ߙ246 *67#76"VP.670Êy,67#7673k*67/$ёO36#7671u*674+Vȧ}R3*063#7671 d*6 775+(/9>8/*+056-#7674% WَD+6543456*#7677/""[,165/#76771$%b!.646#767841562F#767"TU.62D#768(('62H#7670k%-0036-g#76 hdRUG46-i#768)'*6*ɿ#7673*6)܁ #768(,*6-#7675 m*6,#7670*64#7670*65#7674'R*67#76774-CuxbC464#7677861+)+--+*,.363 #76#764#767#765#7676776#76#76766#767#765#767#7677#76ۀ#767#765 "767765 8t8mk@ 7]xа^88ղc<ٷg@ 9ܺkC" ;߿pH& ÜsK* ŠxO,Sɤ{S0˩V45Ϭ[6Ӱ_:մc<  >iʶl>l": Sne9eȽ7a8 U|_$&iEb TwTT[``U(B9%@G~@<<>+MfpX{Z-0!+*****)(()*****'( Pȵ?mnQ ^ ܱfMݼkA ߿kC" s<࿖nE# pH& ÜsI& ƝsJ( EŞuM* 8ǡxO,-ɤzQ,L"˦zQ.+ ˧}S0hͩV2 ѬX2<=|+ܳkic08; jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 N9Yczfg/l?m“`"P.BzFT>B B 3f_hrf8ŏkr sI,RjLs~lrwfu&_snmmY>>|iR| SKrmַ*Ϣ>B> KHQ8xI|-BxDc%5rK{jKX;O0lS3^ʪ3Ieߔ o7A;3ԳWV$ &Wag ?$ cD˒xfhD\EY*,I h( n .qlpm>R>2qF^΄SxbQa C~dn,#Ҟ6v dhcmbfTҪF\QuQ 4C$M0!&#^QPHYJA}5kd>4[)U 6 yipsS:o%vy R2E. ?)tgfym/40z,JY8~r_roڀi^twQ.fCV2WOuJn՝[ MꈽHJ T6I%FKa猋XKN!N:*gҁ947$_Nu-"; $[-3%i r~G +O7j-.G0c΁fy?x9n!oC* ˅:I`?W}\Q )!.2J.$A P:W8gPR*ybI-Y5+c?3X~-#[Ji른vU{z/@j4,Ms:6ax2N,ḽH`fhb&b IvYDtcns3̔qECՋmHKY@`ݽ-Y蚮2nI@kBZKVLFTck7?IVh\ ƯH_7+:}LY'$=\Ws6+iӽ,Ndž5ڰfYL~RыmT+vTzprM| ۗTJw2>h&<Zj~5N2v[Yh>)EZs%!lC%XQS1%?IWvҺ ׋-i̒ };|a8D&h!/I\R;U쉦^]-RgmH:JR1HMje҅IsT{h/v/5fjv<φƧ yܟ*[KlwhYYݭLE*};h)jGר 9nct"rGb­p{ f_sjqVQl!˼Fj-Yְ [ 0[!:R-* 'GR?j3NɱO$3 ׿U@Y.4 }G XLb~nt^k.w`ɼleAi' Քt60K x8vM9-bpxkjϾ 6Lő7u5w/>@jVeLNbRB|_o*̠'znyF>$݅|ϋ0јĔ99_ak{\HPӀ,j$r?`I=vl?يxLhu:;~ۿǫL87^Q&Q#lB3k^Zl?kpcgL%M\bHk:APh~I᷈<S b`UjF Aʯ>N<ԣ_]HMNtL//J %3[)oJ/;U)GV~V0.ؙԧ> lZH\ͯCO㷥 Q]UU[YW[ –9XgX`^+Tpj>t U_7*"`6dP-UjՋ)vݰ_/sr#8g[n*SH^!n{";޿3i5u6ZJm)n"A`RK`,>(9s⛵\j(S!oB2l x%͵ x;'/ŃyFm#.Qn:R@yS# kS$338q Cge]Až941ڡ,Pq|Ec:pWVw.ClFumH!}i;ng vi\]'F+cEUۖ]4,K{Zgك3TQM\wjR?:?7M3 s}qjfFK~(_d۠mfdNor1kklך.-CPkus;b㣕9k0oIXJ} \}ˌ '-׽Óx l*D6b#٠v@AFWlsv7X\rj#2z2)bժm4@ғ] JܜΦhFx >kݤ.0,E.3AxaiCIAⶭdTC-+o)5:go+s*z)IE13|~rftv0t/!mu7E=YYž%$W~m|~LT*j0H;E VuK.xb(mTh>=#m ڸ bnkqNٿGrkq=OlA#P[4f$d7}"h&̴i.,]RM*RbkS%d'i8"őLXjtkU[vtSJDI͇Bb܇fC@;A8__gYZ35V51JinT'Ғ'GwDIL!K'wtu2KLxNK}ЀĸlÉ]~b8aTu%2^H?)SJR=8Qsh]ra6Ci䣜 cҖx)JwԬG^T?:,*Y25Uү栝Մ-+h]Zŝ?ԫ$j:R8^' SckQMZ$^=&G{ϕL<94`"к16+k`{6[(}GLN_P':kSRa94l;@]ME>tWX~)eT C1 fca<}q$} %iD(Ye> OxJ>v)=bzs='@/LUMv*OL'IԴaΚ;Y|/s{%sWC?넟<Gvur`֟; $ܜO W>PbFJm'9=4K_R?; \ N[^ȽpmhnF63 YKSs]r9ZHY_(_we#m~9sͬe\' 4@R`ӧDǿmgYъovF8ZS[ ߁; JM蜻GuFKT'2xae5T*BBybfZwȰ]{qj gAU rBcl#3 A#H}K۲ 4DפG2FF˝ₑjR-8ҼRDaW_F@9>xb PIfd X-=b" R*D<!o獆ᒀ⹩pͭŜd[c*_~SGQZ'll*_ Zxgk5I}qH\X zsv+8O%jx@uPssgc$MtPkns<k2\ʹ@t.\Y5leݲV`u x 2|VW Nn2{Ɵ#aPX3g:󬕀X|W>4<,S2\*t'pFG٣x)| 'ӛ||e8 } Le<j1!m=v2 6[M^&dYo=m H5Y,}SUQ't^k=kӸ*tMKA(@6^bK(ߛ]h Kbٞ-f% &Odo*]K=GD YD#kX@ąH/޺jYs{BmmckVeT(6Fr@|'H|B$7 ,rr3 m6sl1?w^)%C[9  65?&IW^YfۧnC:QdҐۆvW`"vػyk ̭IhIVWĠ~$lVF?J̞3;SpŚR{~{?dwɻC&^j/NM}-W{2Fr蓛B3L01Po=jhwoSyWOa~f8}M 'J͍}tQWz*xh\PsA&&"^`%zi,bW 1sO?>HR0 :9ЪϠX;&CMۮupF 䞳Wo|IOuߒ46HqfP%in]Z ZED3 dԂo)ZH(^I0Vffݧnwbչb- ٲ-Zk7R&vt0/1-I|ǯ$q^R|>Z _~%E؂LG0 `62%kd%ilGxHXjۘ>{@۷w74)tdZ&@eM'!I٤q*1,ą{.b|YWKG0̛ģ #h9]6؊QUˆPN%](돌Wyʒ| ׫)RSˊH.c01Y8:#}O#*y94iVJM8 L%l)o&HS$~9cJdVe~.h(t*@2*=1{vֶn`'sF`9H:b$A;7スPLGBMiɜz#N[3α[hs|+* Pd1{vߎ WV Nlɚh$4t{BI:P:[t yK[a~,>BYȪT_;Ug/6Q~ʿDV(`Td-?%⪑~Ш7RUKy ^!v=S:9ttǶ3pZcW3w풳D%gt`X0(7IS'C Py x"䰄Sjm/6wqfY< 7_m(mm@xQ!|B0Λ.s`þ ]Ǎ=fCH܍*i# 2wqkmLkpyG6}Gkn̿x#yT `T5*KPLsMucHYQ܇Tr" X] %!žRpo1g(,t6n>#셇UMcr_ ["R"i5|AQGToYcL~lx \"Z JPIb?9= @c⦖Tw} phЙhi1"J/H֔)(sg's;4o%:OLh ,J&RåOv'6\Jvm;&|*jh3pԠY/TB& n TM|2ZڣO0 q.^ŕU%C:Ӗcnk< }ĥ ~31i ~w?-|M\.ҟG81]2ZcrY ֽzL321WPĔ8Lzg fc kfIiټ|rjj^T AJ 3޸3jVT7R K\e`gIApA| ؋ w-ֳ?hIU+1"zW@z2_/"5/A9*@&VM ݘPU7.m w<x",YM1F%,iH{zs! Ch'hN%,Hw+:KJn'B@6S6td}5u>@|0שRr5 ؿX::{tXT<=XhvO ʹcuzk OC]}>drFh~,㾢w BsHL{Lz0@џGaTZ AEy0#)34:׸%Db 1Xޙ^)u^O(bEo:p dٚxȔpergUE_AفH:PV3<>BGzl;zJ~cFb]c'7?~U~%J;pB6;h 'hxI%MIiTk (5WA*L#gՙNdϝ&wwh.aHAHa~IJ۩V'|~#GSrGS+,=/V 37D㭪#xʀWrm m^OXΩ0jO(F  Voo+ "L.kZy@Yݩ{||몚aVZh,xYY6tG'\ mZ?։-eh{"x:Vz#N<) ,&(Hg^ }i_6[ W= @4Y<^`j32$A8m`GBzRb 3΃'%GG՞%NYdjY|>aUyG%h0g밎?T  &9yʬ!s4#`zq6㬿6} NvS֏яu?0 >P/,3О7O/ٍ ~ŵH\y@ ہMmuM #sVU)A(afIΤD#~dӖ)M`={]G:DX}3l6K32<~wyi^mBr.-_UJ /dt9B6ڃ]v=s[|EgB47P1 =rcN:9X&;{0CSsk:= *[!9#~.F22u>\"#Ⱳ:9>h-4G)2~ U=Z0ݢW |zT4E1fluW"6cU!IsscVSӴ7_{(oiL4zs{lJ/0fjMeB!) e*%"i 䕓XK>)xÞ~N8NTu.*ޝGEfIF$R4GJxvJH:*nDdZM*pnBhZXw fVuX*eKu%StD'5*ś{8Ura2q#f[hp sA vf bTX\&"̯"_ݭ9{)4#9VUAċ+^L`{b{}l[%ȈonkO6>$2.WK Ԇ[č`#6}Kd!Ӷrs`/2"&&Z#S@AY+O_Q@PzJr{};@]tᄷ͵2L)W0ZEh5X!?SHէ1ĺruLܽCy1vXU'+rm<')U6 Lj'JaITG,,ČDR7%1FXQ94׽s?ndլq~|͗6ڙn< 1vSϦFQޟ$S<ڨzbrbX#0$}^a،iA:Q0b$RA?lR)8 q,عzidlSe^ķM֓3} zЌbgNLa"Ŗe]T,{t :/k:] &9 9aHs?eD'vO%O#4hO9T5fPP 90p?{_ ]Wel J F2/_r=EV>jd*-4e2K>|c$΃z$?#kyRJ|/-!ڤrc:vG,cwYѬ-XEyu= * h5>FNoܮNVe=bB/ 8b^V~ qC;.^5$-zh9sDZ-#3qh`[ RGsZs-yP9⎊?|P1%SHk@Sǿ0_B;{@jaHIv֡^b(c!y6LX*x+Ƽ%ȇ\ 0MH\y3v !%j0$ 8\mZkNP>5K<~3;!rUgE\ nͲyuQ,9{0H]*n|4 q[\wHZ bwN2,SVa8* pL7w5 Zjf_S`nr]*o/ft-"T9^9 ܼ;{QD0 d)}9XB<\-Y}ZxczmT`4rMgMF?]&k"&UJ`E[(vLs4(Ky&O'Xڟԇg&>-=AݹE> ]-o0+vU0FCт >iTFND C~nj׶D@ҭ<+0+8*}^*;}*K3 <2]Lv ApUp=\ GYNgi؁s8'Y&䒵IŠWCi+\p%q)6:s>5b ?Zu .O7iء`p"*|>(AȢ~E HܸN<ےH>C 2lUD_!H١&m+Ȥ|}r`bj 6("OD')mi7B `w"p}-qp\IlNed @E:p} N7áKkoBJ`j%7 CqQrV? D @3e/7&w4L]ͤda3ڟ@蝰`Ͳ$G42/,{$>׀Ej9h $p2E(~!8{ V~T&%ڧo|c- ۽t] O戾ͿkF!@O.3".8Rsua {7*^S94omqklMh`vml{Y`|]&B@`& KY5@dB%7y_ =;ٓbf_nՎӅq^[ 3yj ׻X^L0+_YQ(eVsZ{P$d` Po'<0ˣ]K#uN>mVd"@Wia, ;`G3Ԁ)D-As`nQ0md%8qcbFVkĤi=j *WXsr>5`+"-Ø;eȗq *vLG'{&\x>C ՐQkl C#XE(=Dl9DT߭b>E d)"HjNshSĵ#]iÛձ,FWv2zcN4r m>uWnbfFoI"kQB>7l3@D4F}?{O[k -Y+iHW(H:'K)1(_*4@B]ԗ6ݣ!63.AZY*Epe/WQX/L+:2XT/@p\~ƣo .xC.vrmzYONzj,꤂S?' w}^q{njh5`z*]릳Nxe Ǜ2 )%%"X K2/U)oOb@^+n.$6KaɦJ+("^< ຈbjUֈ;OAʼyѾddhw\˛f;O"7r$iQ h@DJNa&TNd0枉s?+batP.[Yv׋PMH#X3rB?h]v 'd % jKn"9K\o,zj&DgQc)LC q @=%{c2wlB5"k2Y`q;#_y -ڗjRw|Lj U}4ל (Ԍ/-!V+fcikFu(=&FUyHxwåԔ9F)xJ Q8K{^ǣX=/JwߔVd.@K \LJ\creoZȷUXA&;7zA`,+}1q d/t^ĺ\*y6$`c+iyK4)PQ˒|>F6{vwErx p u3{iC yJot:w5#4-<#( .40aƧM7Ю^qerpͲT=PXM`~1$i+ߟOi+?'i v)B38^ps"jGQ"&.[>{=8`+돠KWM4HkIbW/uɴ=S0٣)K[(+sJnfQRz[L}aU^wSg>ziបG¯SXw04*[}S>fB[6ݳ+Ն`-Rsa牅Moͩ.j;&<6"H(ݠ ɟ|?kDGmT"dIKMTͮnM%0YÂ<sTeU5Y9Sw3J+f ܵZo?}cE2L z9s|9v3ªw0dТe;†ˎ茢rB[9pX͸k=djc{0ûqGZ[H5z^vcHY0&<-;nfy}UT9ӯ5:,J[/hC#Y ]ȟ]l&Gz,,+5͒n+DGAV}KgoL9QdVIPz.B EQw>B HgO4BM̱QS-+1!#q. 5V?)6-}rb'DrVszضMO]g(;_]_b5>^ʗkw=$mͼ%_Fh^ ({q_pI: ]iʌ~Vzo&7=ZGչ(VՠSEZ81k:IeՐE/de7U,8>4Zp"T1®q'FBd0"WR09\][L>LÃ%oHI :4:|1WZ?itHѩܶETĩW6M:ĎMvJM5ʰFɓi*,aJTvd:AwgyJvӋ_7ck6g.vBp&ī /Uk/'@oC# ta#b 厅'?PSOC%WAV ʑez(Dn,IP9V*BSbO / =A:v-D K śS- ۾"!iDTMO! T\$v?!ю8|!\vD%ӊ9ѥT`N}/UM;m I Fkb^3+=@3,C( |cYdG>nv$O> zPX1@[,} }Euhn}sc";"a(_WfL+?O!~a1p&xXX LX4fDٞ&9 ;OϋibɯGp,=3dxL/?^PPʁq1 P>;nx8췖8]Ns([O aQx=;Clyg.OLw%N4qq Jhꧦ4?tOy<ɿ@qaq@G$Χ'}Zgt1yےyRmU_o~ڏ_q\0^a2sIj7s 9l8W+Vt:NMyӬ\EZ"hrm4#xoHdZ>[!(,]0H t8#W'#ad\uo}9FזGtK|@#% OZ PXҥ*àd=?t +BUsoMbe3^o0iB+Nzro@hgª0{ogo@3/̇;Pƴ#2C0/ qdWrg%N[[;_ ̲}Lp\ CI-|)Jl(a&Kɟ0=W</WUc\]p+xfFěrJL}!wݱIQѼߤW-?3*հ }yqWcQDD+X@#u$T.90QJ{I⤑t ̒j2WD>d;6uDGOZecD\M`9Y1t. K8ܡSJd.]q` ljɶ~rw,PQTieL$2/6hX}@~bjG(qkv x8ϡ:&sx B@ǧS=0M_eUDo; &P0#<άޞb:c3 E0p9*ǂ ^*~qE:-wv>{* 91r̶,uyN3FuH ÜD=-HAW~!)cBEYvd{s7TЃyN_$v? o]wL|- o YX:M[7g+n a5#<4+j F\h8Փv]3+r RՏ/*JKhrJ~ܚ%N8{P8lI6 X+nPWe1Tͻ'WʻBċJW<(TUp8Np/4%z b04_3JSTYO"9HV$y8% }*r]"h- [Q,zOEQXȳuZtr'Ck_ĴI¾^4 ,qb)ZxRO5g3~RAeJ֯*-V PCV)\~5pBrs5%cP'YjF=萇5~,>k]"mxn-ktRj?SQT,aJӤȲCesde@r6 b:ubv,w("1+"] MQK4,Ճcm$.@r'OSXBtRTK|Q~o`-eFS~߲OG2E:e{ۓ̵j,RoX՛~},Lڣ|sl}ey5?X9@I.#Y|~z#u>ȴިVQ iu<' %?ޥTOTCE[1`R8 ŢUj`WMs`>ϳkm(.F< XpTwíc[<(i'(ݔ`=mdVE+_ #c%DtA8ohu(^aHgTfR~Wlꂴw\i KWraCJ*G1[ SI+~h< tk-dwH'rٵzv7KXϠzwzG1w;ն/rթmopYA: uz\T丹O!I?4W& L ~^l0A<ԩF>BZZ+Vhxf! /pq3^#2'.X'}\\k&c IcԥŴԐuJ&gEAgϛa=fj+S`Nn{n9 =(Gs¥_8i3# T gO-3bWw0SF?B 8~̱{lp"iר({c'p7A\O7]6d=z _k6)ͯ ĎoCoQiK;ucrX 99O aU,Kc|gjWRŁm#f\4qfҫ JA٣~Qoú*f ɒ}2_gRHw ɬ.V %9-BA8[A~.vaAܒl%6RNeR$5>i}/\?lvQl!MeY0Gz/(ن^we~ Ĥ2V{!E,,)ٌ,JC0}spgr2c)U}Ƨ}."ݵH(ANK-+dߖM/|U+)ӧ-M\Cv`". bi7#,;[7kXeSy?< =SPg<*#ZbW뺨][CQσ wX]Nٴ?6sp)oa?ըRtM ^ۑkO^ A4mم r1Z1 xM!k0L&+b_&n46DnEXVJL^\ ᓾj uWR $o#QJ~SOx *HV40,U}#̾ Uw~bAn0Swr axl!9RiV4G[3wGņmW~ݞ7G|=X6m]ʰ}ڗޱ'0B).3y75zSJDzgƈWe͢7! n}x%6P)zUx}#ajyP +;m&Uaٳۜo3?~^+d8nC/<;8+v.*8UӢ"-IjGִz"a!"loh/q )cTbBa5 R Í;1Tѱ2] .<'OUu[<37,xpe( Ǥ^(Vo3af|ujzG C@=lVti{-5U,w'(/VOFA@g-u@C`Mt?~ٸG" rn Do+GGB*??'Mehx"=APKL! ԈT30vڕfnm/_fB9luIx~˼iu׮tkq|࢔X$ד~!:ѦaC!pa=_mF*,hڷ(.!nPؤ`1J:C/ s@>|y|z*dGS^a7ޘS`ǚ`гP{vbBN/PsXV){f q?E-.NPpFդuIxJlR>giSumÎХoð~!tU;"֨ssWpt1eB6PqrۿP#sqcdkzEJ+hfJeZ#PIn\}B0ig5j謕\C}KF.<:g9[M%%nP!gAX|Ҫ]Er |&U^#֙@tםYdGc<E_NHquo¬$鼯@S4n|Sd$sGVr\1BwYzt;Hԝ A_pkr҂1$IGd$|V=$igaBМ@<jSČI;ic5L96KXHiQͩ6bsB&j(lQ{7p5m8Wf%+ԣ& ZIьG`مI|t,Yqkyh*(4ffigq`˸SdMoAa"%7HC(JrN.2+TDR9) 4Y ed/?㱼F#<]jv*gΙNbU(jE}օM>HDl?f4l 8RĺRxcM%bJ-c"T-@Sm@BD m;Q5zCGQ٢&\$jrG FpNރMs(Y;pfȆ+1kuBa5*bh7~tΝhHhG9>\>f6qACT%9W+ז gMvV@ p#F{F72=Ԇ!n RBN<9d.}[[XWftgL) _ٞ_=T S-;AI% >)2= wܿ5(-Pe{4c?p&eJ X07FX܃ISvT3]*&jޙDI:\2 E"  'sV`V5ns 4-30Xh~C v& hչI|]ܳzUft a1\#5b MpfLQ3'fY u< b+?a.e3(l@k=Wo^EjnP"Xʗ00 `JĆXK aĶY4 Wi(BFw˦`DߝSF*es2ssYPWqY-;#cdl_9XmAy 9;a^,p桭5"]4ؠޜ|G{YxOy`cWV;5vD+3hkd}]j/L$~a%N 3΄,:Rx=DgYv_b%ØRsC>7lIe&cčmcy;sʊO3U"؏\{b-:RЄifcAx.D kuUsfkoS#3 T0jj f/8] Y`(ǙUh }OoL~~7 3aBER LYϕUg M=~,2j3X#]3x'+f+/}1V[`:L j*O@$rx6qcM S:`>E./ eZ}bI=I$_~V+K'?e6jYh+ 'O+)sUY,TT.sz=Bz|}nyx4mNtR+'738bH8ʠENh^G|# Ɲ̜%_ N-㨄;ŷ:z<#%7=!!N_q jZA ԛ__ƃ)6T`wCbgEDBR{Y_r uvEopu1cJ==dM/(\FyTYa](λ>#\83YmFcC+y2ů"3/oؓ7PqZX뎙U'ybkQR#Sf G mL(NXF3L%K䡯tCQH,npbaBM3\f.#3]Kx9&@K8}i$}+Wʟ.@^d[FX P=qK۱!j |YR]!ހT%2FaL 0Bk"cʦ3j@ت'd͘Ip/,!h_<+324ߓ=$#)kCe_/#a 1m @yr+>~e5no@ݠ3?r7jDnO!-myaqnB 턄 rO_BƇ3Ё060xaDTvt?Ռt7IXh8r\$@wp xld#~X{m?*}H~#P)Sl=$us>}a2'SoR 2q7옲AHG4Y>,Usidށ\Aɰ޾y%38ȉ>W) U. ?m]5sO? ˕1dg,[}S@VJzN%=)]LobK2ЧrSJ] f2d!?+},:zDŽk$JO)5ޙ NOP6lr y $#2B&Kۓ${^++ i{\J_+lɃVձ{?lݿk<79P6UrN2fӰ-Xź^P T3TUQ eKIW/PAK#\)usiVK!"L:}iכ5n "o^5x6xeQ7FB%J>FɖqņLR֚8ҳC2Q>wP= +-NվK y߀C1?xE%Ƌ^VmcqM?C"Dhv& <+^܍+ ;$+%(~B`SpὨ@=IK!DYE:a&g0\t)o23yѽ˲a8ha 7.pHmNeG':hE*8=5=7Y*h澤h\;U Ʉ63?B(RAzĆ.칲JN}>њkY&7ꇩmD24C%,Кa" 5cRnuWv#2lSFzbݿPSp˶KM লFpa.&?'P.hϿۘ"9e8 g~141uMr2J#*#SLE'v!sr'׋^DR+;#cRջ~[65mJ0TٱMryݠˉuÛ0MqS݋,]`͖ۗU*{ē86i`JQ?KQd2J=+0tdjgl͡kLG=kg=E] <1zG?b$v ٳpC9D]DaM9Z\mO")KۙDi(۫ԨQ>I.05Cw}]"W[8}[?}]!['l.4ז]Q}GOze+08H,P8aR~j(x#N),aQCijk r9tsЍ5QP{P1xi̼|c${M$Ǹ1}1-nxy$r; d]"#_6c#ŖБ us5E4K6NMW}8aj֢Xt)9|,9xI$Tɳ`3tqIX~/ )懌I&wBе.t8eG-!=Ov[79[{ޚ䇨ҒDQbD ʘB%4w (t9e 4}b-oD^b߆ 5_J?{# $P3L>,FV٢b̅,6)ڐj3_g3SY.?/o <%a搈)zCMX[x1|9Fn6O ֯&j%hT[R5Uu;ǗFN.nz]a 1v˺AOBE rTjQޕ>ޡEzZ$fX,-:et67bwDg:7wHi? xzhQyWzW95RF;^CD{zŅ%9dSn^Kc5s>+W֙ IJsmQ&~1TKo=--#yb䢆1OjO4cS?9dYU:~@O,Q4Ʋl@ÊGdxVPno 8{\C5n z܉뼢F!Q"sGpǩ*MHIE6&UҢ6pwcvuwUL;޼+Xiz*.KB|gME *4y;#|ȓ7`2w-S-?klsH|`u+ lc3{G ,H_[@=xӂ)Tx}}i{ e +5|*eϮ{`?b]e5xrdQ0c Àyy8J6+qa`͓0*0j HAO Bbs>H\SLj` K'‹zZg8kL `wJÎ]m4 ؄kgj7Fܞ*"/SA&h Nd%] v)DD #ika\˃0(FPl|Isz\ֽн= Х[8a N@NEYJBX_I1ZC~|0R%tf5KrrΉXŬcp&Z5[j AfؼPh2%xz52Xm%ݬ]C=>Nb;/nGOޒ=B>z əȱlܟuz[ϡ0گpw b"J ))tŽũ9{){mAX[c nlF sMTב-D` $~s~%dH|}~Ԍb'瓖Т}:XXc$ܩl}4n]`k 9x m?#,>F,zWKlx|\ϑpseWTCst6%`MUI}`Wϐ~'`\܍đ@j$tb݂mPjdanl x$K7Ķd9-,-8JBd.Vݶ} C>Gp?[]qB0"'&~E"[h\ؗlffRce!R_WxL3B,2REԞۖB-r,OC){fv,$r)r}+o (ja}QEё>WXj}8+\qKpqPMD@PoU>ӯa:ì+a󲌤bdWe 5vp] {P.қ7E IefBCt2G eVj6kv}f|CJGd,)ztEkկS@JMJK Ő0,"X3NErY23<=4?6R5w)eWm]<xYbh85GL׎GkuD< QRAE59M(5e|d*,eLo#ω]w}a"`aIug£h46ш.969DKH-B+^Õd|?^*1р $qN#>:1^ @ DfK>Ű<_Og;gGU#5@q .y+1/REǣɚJ.)oh./CLw=JE4+4EQhQR=ji~Y mѧ5c_/ϕ9l)o:Ev;zpH|&9Y\%gNӯ;ޫ(nJ(NHc+ϻH!Fa'+d W#}cUHP$VO{bBzQimF` t/H$@RdܵZSEds6<K PeN_%.ϴPͽ#0({n9G\#sx=%w,%Z?9uSc;%ӭ>"x]-&CG=,sYI{M zar" /FvgO"-$ Xj>udM_ŗ>VPH249;JYxttڼMs :;EK%SyW&T$-6{1}YX +]g>vg @QiX5PL.KX9Z;']ځbS*n-'w#&n݄-RQL_Bw+ :Xk/NE͘RFsU QDna5f:'ל2/E^:2 Qpi^YWj7/ M51l Z]9̀Q,hω M1J41o+ނ4'E%M ݆2u9ٯ 1Y\BPn~5>uʙy Q!@=mIgĨ耜z2ZٟUq)t7 tUd|P^ HgLTԈnA(@QAuE7xo~O]k?^l,إUfJQP(!(BCvꦀNcT;{pFPӮBBANM8xA̐/{سKD^I 014 @Pm>w]Sh2{HWٛ>Q`h@QKr`+et +v9z3myaq;ʯ0E2+*k}KjNETx!.8:[c+cLC9x<%f'J/Xn7zq!>II7<ԘUq`,Cp Ԗ<ڿ 20P\,D UmTvd:1gvpA2QRepr(Sݩè=29/Wj a;+/|cp"mu=;<`] &ht@u5MchYla<lqϱ4A<3,ڂ3/'IsXz2 =,7 dݑە!1 yN᳌Z,8ȌiB'iE)lw@MtQc1`A@'CFUZdpWD5e#Wa`O4j-I~t )+'j\>cB"|̾g[6@>g<oW]Qz$sh|܌5D}%*9 `x[wDyF mdD痆"|ꚇ3NK hQѿ3s6aMf {A &aFZ)N?u8iN&` gn-X3@uu&|]ۺ4eR庲LNW#I,JkK\JƁ-e(2cvF8j!riЀ8kXHՙ:xtоa6p0:R^3:"`LtqK_sf&W (xUu5bMؙ C{(Fu/y8e+= j΋ԠƴpXN` yõnTv8ؑ'qѣ;){fC4X[XyLGIⱾglh(eZg%?x )%]W}֎H5( xעrN}KU!tō-X:aA.o,GJKttwQc#-.(ďT2/qu3}&/ &]Xڻ3;]6-0ǗEy>E8}Ê)`N]d?ȷ큉_'=ZD_vMlcl|2#0fhs?E0a gz-H@ ܕȣaIPKj8vGT"eAA0I7OT5啨ķRxV-ˢzwG0u_Qt#OJJaM\UO_Tt餻LS>{h nT;=ye]wHk pepW֝By S >c+H/ 'Пj_[lk^wbhV,=){$a0*'Q($E+1ss`,*5Q<$"yhgY=C-\Oɽ{ Z5-vod_{4 #ꙶ~ J g 9Q)Ш-~SC/z“8#t_ʙAaGX=ϡ1v'@jxWR9qX&ǝhXI]aPI̤kP6m#p$ 0xc%Cgc:RinrwKl(}*^L`Kd9SZ!X/\C0លtOG}5 Vwd~9|4yMgN<(^N3,nl50c/JUJӏ72J>kuTQzy E{#lz'J߼|.[ ^)mW\sYwK[!*iBu-)j/?+S2`^YIS:^ij/ⴽ7'I 9nms3 X(NdFΛux^ BH yR޶/_׷^4b`ͽ]*2Z(o Ha@w˽8hdP2SC++KiH덲2HѝJnxkW[EWb1J@1]G6b7{) &D2V.TDOV$gpI .KHF K8^(9xGFWmhgS}c v(ȥ W i|gc8q I#bEE3x^WAhU.l48 c F$W߽'P$@@M1ԭ|xCz9!I4Aۣ>,fe+F;p-XҭG1$$bb0ZE*'lpFd){)%$B C劘L1.1Z ^"Q7]^Qj,\@* I"tjn;k*1ĀẑL |w4Xp2-"0(;z+$ӡE9250Ad/3kX:oڴ)Waׅ6?_=.iB@b'i1*دI+d@V~\3 kM /PPE{KZQl&D+Hdצ|FIf9OMkѝPdi3DgQ35<(h-?H FH1g_|XZl27จF͑W`q3^hI"4j/eQY`¾z5a7FS,(PPFPjd+ʙ .wd`~ȅ}Jdd+hU)t VI[ҿcyѐ^]+}0;iFNR.x'{i"绉_a|I'FOZ\&-=)vJESd҈.bf $`_eCFz/g(t@Y3M۲/|֭?8!Ƃp\,4i@yl粋<2ti;M:|N0j,\BZ{rES9,=9ʄJHx᭻h Lp#˽ jN ǥS9cE썵1tOP\ɞ{ ͉ (_.G `K`AGR{s$P}7\sq?W iGCܭ{lّ7d)hs q+6Lfw3NGFK |~zX\ 0^6WҚWŰ-=H]iQsFFD6^,CJpZ(r}xa*:RIDj6ez`Nv> <Ùk #KtMBӼW>88PNzƛlf.^BKmzM2AzE[Yv{ȐszO[x hVYIL{$ViU~x0Ff_jp㙴xjΘjn9Lz;(ŹYF%jle5B8Ym9N-/ttcn->جsJ} 6v]UY3yǔ+H89h$yW;pe0 ;9A6 ]׶g5U }kb_!8Cd~ɤ R`#TQC*5"y1j/N뗷Gʱkf׬1v1r;H#u~Vϒ3c p!,kpjxdicgU0.Fx7l] *lB *Eԅ[s $4n衽^v wCx]fLEnJհRbуl`Bݧ F'4slu5+ 8/ ȃ_L b""v^$~{9)#47hL{v\ڒա,4sV'cFYxbHG[d, IHSv7GhC(;wfx)CʻSce%.=SRyq;mjځ[{Ak e!~BjRz')ya "C~ѷPϩo^?m7iI~vDKOKtRS'_RS뫸XhWlg%o;F G9ة5#CiL"XA{Q.̶]Q"B7{.Blz`噘oc$ "s#O39;Œu` 63et(j+ol`l0U]s܎r+Y7^&b)y[2[hg٘S}kzx M1T9Jm;gǴy+%ҭ5\-P.'v@A4cwK+1D5KhBw-m4cCE$c^K ٦l ~j KuT@7d2"$OBI9ͰǢC#~;!$딈[9ƺ$.zϝ* Q%[cLd\]~2L Y?rb3qu..D1jF;N!pTz6OGA+2tgԓ鬇n @L9[w݌87Aun.ePG8oPmn-iBFC״YC i>X0|4"_k׹܊ϊRHZҁ L-WIINjVca`PSM 00V 1A`DOk$k+Ps㉠_rsK5)t@6j{ͦ+퍊-G8RN$mfn*Kqoslχ +􋞪9 (QƷ|59b@8ƣl`FjԀ\ X9&6ɔ-ƻHڿ,3 ;)2J@6$T)5ώ$;ϱT&`wMot q:5h"Io΀Sbui["}6?O _ +%{=mن<9ീR8X-(yɢ;ŭP3ct1j r;'栮W3~BVx996q:Xr9@i {)"ic095 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 4A=bry3wVO { 1|<4T!^|K2 Og&Lݴ!mS^ϯUZoţߪ9X*0yڕlGԘTyT-5R7FN`O@=[kK)vc{]_kH%IzncXݓ<9NeBS-9 |4*a6q4 4xj :5[HfwM)Fq5nK .?2 WPjM9KGPWBjjZsI?i1q_/u[8J]8'a{1T4jl(?Ѽ#qLb :.e-Z`@-5?{~첁E^2E;E\=qPf#RBN^_D%o&hx@Ѧ e|]`NB&J*ʲ ̓nI_|\'M>Ou9H0hq&,c7>t*5( 2Y.{?.ٜ Fvh 9FFDz/m8zF S2S*=4߁L^: qT>cl-m',2fB^zΓPm`R,*ہEj*<J|yӝs_*_DeaX"sy]>Qߞ&}Rg.b9&uEۣ[|?@YtY 8%[XY9fPD-Y k"U{kg"PǨmٝ<7]W)^H'ȁME>VlVh1>tMD-URjbwE+CZ?D&mTbr m~U~5S:DTݸ9G|Gk ~V"ͷYmb 9۝ܲL|qkGҔ]^`oam2*.kj00~tbL N>8y]p(nksFM(  9T+pYI 8%RT}TmoC `;k*]{Cgx%sfb)|+N2S2DIHfgP% Λ7wge_O6yF1ٌ+Ƭ/pU7ʈp}?SoV 3hq `HZB[ g>%C}0{}&)kqM/&%-ya[ds:FczT}0%\XFsξӅxP;+Qb/Dɲ*cv]G]Eސ~7?:?7M3 s}qjfFKBnGzl\$M6sߢd+zDt6v. {S LH MSYH#t2 ٗYb V?:e'-׽O|X:\[چ+*>OO/.X؂ɫ=2CZn+;W3TV ڮewKv_ dj6鄔o~{|N"Z֒sE#Τ:>o1n\a@Rh. ~|܄7xX#҃1!IRlQ^Yܔyz~"[&Ċ!&/C-}:q9VsBi}`є~vfnEiLI,3^hx5b'R&#+TY|zߢiMs4>O PfRIXk*"$kC|Aݨ#ֲVk^(sҔ5 '7c@|hu&ZzVm˞=U Ҙ5\-po{Wjٶ:pE x\ &࠵;C(a8tyySߏ-xF2\.>ZƏdF[uʃl_1]J8wX+x%\谜oQ@HHmOY4,ݩ)nƕ>;AvqBNZj)"ߔ@$UslRJ4x2G~&: "d NcrY=RF:8n&8(e c@ȖŠ%T~d;53AA-X"Xbq:c{GV63; )˽%|ֺ?I9394ΘqHT/J!CxLpsMP0SwUʔN|r<%Ys`Sq@ϗ)֕D%Ӊo-8w\BWQxA &hOυ0}X=Lx|Tt",峰ͧB8;K$b:!1%mNe*D{+qȏƸVc/m-۸t#]+LSY ~bW?6uGHNjOm!`3Ů:9z, Zi@? ;Aэs_`{: WSaP}UFMtW?j㹇I)=¦`Tyq#h#ҀF*,.V[ԍ\nq\$|d^tR$A^~>b *npplibA_/j~~Nb,ϳ-E0gQ1rU!e(/]I$rf^76>R61:@(T~y`E##H95]ެblrD` ZFTpީ @tY6- |zy⡷*ͨ*eL67}J%s'f󡩲}}3M_&ӆOހg])j>c$0##լ/G&e7-gwG]rI$rn Xe1<}Xg S((Q FNpRh IJ6YGbO=͕7N`K2o\ |Q+6qB*u ̀GvswZ@X+ɊiͳV|K0!hr:8@ S 智 š+%䒶1x)[zdaԄ{ηP%HĔ0q7M?Ba nV=gʈ0[R|H' nXgڻ>l!֯L׷$JC+g'V]-\"<1r鮫FuKg!M0{] M魿/Ŭ.H ?K,J?i^xq-W7ly&0sy }Æ).PU S9kUR,LV;^@k *(&%滶Q)|0vPuw%--#Bd/797ha/h_ B^+U=lVA똤l4? 4oK8ub}AyK֍6n}SDHY8NʇWjOD-x yu`߶=MT#bQxriu}B5"; m.ҟBQje >naww$D~<iLʭ9Fd4kr!/h(ϐZQlmb3rOA?Ÿ *5b-oX]tHx/yT`%\_B)T^J4A*8nun!KiN8y^"] 0"ަH`[@]:Kˆcl4FDxpB4 }#s]Gq`)n0Gnܖntν<}` 1-Q[]OS69(^AE˘6~Voj9B/!Nda[׿q]IW'%eK~y#cWC2d U)mرgQ$jmXH7?H FnGqT Orf돩MOrH|Պ2]ZH_ŨZ,X-i.LӰsG2rC~hnjքVXtn`ԇX#Zѫ gIӯBY c5=F4n_)yY=ԙB=Fz6a@㓫?g- N]ۗU=+BtlBׇ9^uQFxf~"LbZf'p&~  N=zP3yQ(feT=娛鎟Do8QWEk ++6MU]Q*/Mwl`hW*i *7G-3`I@UC?)1^OJ`ϙiloh-żWKRn6@_\FYS;/ tzML9 [-Gc`8p`'d6rL( XhtQ%/S\T#)ulGcBcѸv?V4"H!#)( iy9XYLjl4r.m`!-7X=\ĈZvR=9^D=m"o[ 2S,w:MCaK6ktǴp"е2Oo-S2f5.3Xءd>1Cwm_~cpXh4I ^OZ%?'D(;-T$t@){U1heg ݘPU(UÛf]H᫩ʸ *jn]AV& > MMB~5,| ֟bCfN:|pW:Z`N(? wgnrԘRf7 Ԉ^k1j6B`~(s|侲4җ6a@M:VP{Jt.ړܿ#l s xC.KT]o6饧ϜfmQ4\Zv$ إER UFsxGVO[o?dz}Fp=[$ts^}O7: y &{|p/He&9_-Mf_;p( yA.M*C]fz"kX68~Е˔h6^~4tMq2yҥd8NQqpQU"VUmQ#̞faby@EM5WĴ-⟵)z3o (4{i$%ޏ\Z`+HTt`Our\Zъo|y?+nڅ-$jVI ] G1+wPItyFΐPokA/* UQLQó"Ʀ H4ɩr9EiF}/,mFwL> l+5V>N4G,E_cY8u{f{˛*U.NckI^bIR.Ww2PSb'X_qNI53i  0|d28vFpDP4"W`ȑLj@أGljhېʼn1f("Tx0Ձ]}ɣ{D˔RFWN93OxSy~RC@ns[ <'^ ^Pْ˂,D p\ǎ6o^ u*L4*q9=5 7Hy;c`U&aB5d' #琶Ku>hڢD*tw!ߓj–G}!Ĵ'1Ϡv*nj^n| A'ݎukssp*0~%؇M\Z^Vu?)ɓk蚉AMz(ۨ6^Q1, <$U99Og($PhհY~:P] N){h{EX4]JC)WwfcoqK4,F1b_h(-ug-ҹz`H1rԈX;PHL[6tEFybdkM8']lw]Tq`#m5| O' m t"&O(Q-v[@ApV;{2M[ar-a'Ǘ(=ރ/I |qS59'hLB0k6U7ȼVt0-wJoSd$4*%y,MꙠР%!Ro #D~Jؘ 64ߝ@3)ZRi]Hx.Z0Eᤍ.3VخgUN$ȿ}H# i، WJud,,=WKY^`Cg)%%rX_d H(Xp%E 7e_Dx_@*Ȥ4q)4/=$Z vI*H ;1' ~KT5&.>;LZ˸F9N'qpyA%(W|LYo{j_&`/_?o()x_ V"߄,U % S~uM04 e>&gLPkxx9&hBBC )4jw|^Ƒ 4taA{?o}} 1W ڑYl4ΔUYe{#*yqsME $s?݆J/ň"c]5˦dЩD:`V yH}:f7h1NГcVe`RA@!uptNӻ^d&#?NʇymW#[[xE5Ks|,zV[ c-qR\-g39P?N|fꙓabOkB'lNM!5#ٗkj3mnUc'J3S_`P! 8GtZM3;O|^Z e]|#~:u{A>3e:<յh ψA@0!7& n5>/sYw8O_43 t\ѱDtr 8NsUVZbOV=}U/`S-mS7| $$߯mVyvTLQd%!i*\CAmlhcUV!cuEFŋ.ݤVn <~o-^Bї$v壘9nnN.|-[ |MK kjDޅAny[*ʽnCϢybIa? ve_p|z_EGj_L4`pFeͿ) ,STB6o\ 9yn:> 2nM{4sQn[Z0 FPrfZԲ0?vlh,B':}%U }XeQL2Zz+-8oK#:7 FEov7# |& ZMk1_ʹn>5l?Z}CLntLPiK{#?mь33w4:t- &`҂p]+;+iX&˜aa c$%yD3ni+ @_76EE!fu{F<{^]^bZ9^ak  wu=iŤxPQ_jQEY\OBg!\:xj}d'x `0宎H4 x1`O^ [@ofB-*L3K|Oӵb@U['.לJb@F;jUq bvLZ;|tJi)[q!wCXR-g'6.l 0}:?Nf9SG{qͺdIy6|s5AXt-]LGUӧd/ H!l%slSӭc"]g֚[,G|DfߦRnU C'?rmz6m_9ӿt( AOGKW* i{|rK8.ה m_4 nِ:,PCp y ~ PC k+c[R&?7X3&oq^;}g(Dboo}ГCsj('it=1DQ^A2R|Gb>}srM#QC41Sӭ*w׎|[ekUhvǪL5qEOME%S0+fNp n6 h$!<e㙩춁A7LC*^=hE3H ÂJ" .̉Qlωg-<5C ESK+wʙdβzajkTk=J/҉oEGEvНZwMk!U+Y+;q y,:;J&/jCJlگic؀;!҃_U6eKA2Gq̈́irI4')խdtENg1ۉ!b2ir4Xֻ G@&y+(Y?=@=/v"ߤ2<@W{a} JKgƺ+ĸ hӠ%|*=xx6w9ʠJW!yQEcH2#:= Z0U#trZ5S#w@Ff*h3[%mCrf #Ss# EgjiYz**Q{789`$Zr 1!ކ `-p:]|¯/U|'AEGu"XUTv_65 -LpvA @|0>QΤSJ0IE=VZ6:~}V`EY!+>' gsS1i#Qcgǯ1V̿1lDjY I_'Q,GrK<&E% 9P焧*gY; &Wd}a,b۶Qby>Lfm 2@%vm$qCi쟅V})oq ##**F.@g\Wxr62#c@0 C?Jp7($K&RD #>nnE;ʗB&pgU 9) Νh|5K~z|AvD/lnvbTx>dHo`:~ 7sX:cmEJ ZP +2/QLHԾ]t:g=vJ{ 2k7I _0:kQ]ZdBۉGc7'¤U=,`/v(+FDvteO|> 7;sLM0&D <*t'~u2\<81X[)#aˉ@3=~&n_M!utҺNGr9:b64vIGIZ⒣͠c]mC7-WSS3)gYt0ԼzYlR쳟L?OmJ^aW;>B)bOWX0S<ΒC{2 "e@HA$FNrcB9#QFv#ڊ,M/ԔvE^s^'P3Ceّc(&R,41 ⺢hh}-YMRjB܆8؝TK)q =X\EB⯂ljmC _Ǥ?6R4%j%ʸ#"@B뻹)Ӷ/=Z{1QOʖmFs<x<%&!VP9_LD37^4,iѧzGf9RG=Z{y'gGH ( xdC?je Z^{IGu$lV|h@݌;"1%d]ڥK@27% Z#H鸔}GX%,N<*ƨ%iÿBpjj ďX刃k"S#3Q*l^1GX{@@nd@x\\AdI?WtNq r))C;Ϳ I*" jSe e8Va1hry/vOmӧ#r,#-x@)(5ʞމ,s]<98ȫ6']UtXL[Ep[ vZ*jtᙇE!]>;EnU[p0:*E]f#AMA{~#nְu>$(a-B#ԁo3|M8̻Sa.w9,q_ CZ­m@s&CAs<2͘#2,fjdZDlVv=&O,l[D2 =? #qE8ԾXYI}`&g&,{wt{g2iU@+Cn?2.o-d[@AT5tP{vv>%NG45{ dh](=4 Zki[B4 鰟'X,z 3tIhG}+Z+ג io Gi>Gc]M]fNVZŤ+_BYġdn g9i醂a c\$2g"LktӜG2Nl= oǚu|LGY򑲬l 3% *,S끻xl$ta` pE2VQO25^9[arl:RJr*cx@?}tIb*w5}6oY䰌%?W`_}P.%;ݧwm{hH&ފTHnz>V%X=eSW1ҫ+ ®ubKl^JFqX.°W:P &K$-,|~{IS0hTtP6G)sNx,1e~!mBMAy j)(%ا' m<}7q]e;xD4Q=QA]v ? OT @ObTSRb0^RXrei5RSѣW l$Lf+DoYPu:I:DͨN+Њ:)Q<;RjJ+:[6-'Jm9:(#}`04'O d YgGE7jjr$l*F3{%^=5;Zc|čKIv`JSp59)d%i'1v2h]VɱÐ}^RX[}"pN1 (US8$"tDE@ɠ^w֢#Nyc? tlܽXq*lST|5.(,$`gtuJV. w77`cDڼO trTBOsü# S9lhb?YmL>/6VAP1|I'̬29lNd~"pnVwGR3 #{w+?:?mFt ]8=.UԴ(K Û$8Ԝw޻%4]ʼn"'pxNPv!^W"9stf)O5ITvB8`{p`L]s0u*{x|p |y_kҒS͉??E!э< z91(;\d@0%dD"% +Exr4NUcpސ-umV]c8 ]|l!g[:/U9 \G1"&Hu@ 8a,jXhlsnpYѬ%I6ɣNCоy"1V ; 9y4:<9`> ƞO%_IXw.A 1/F`T'$oS`\sOBgMqb'\v$xv0X}:S2kGi{5#O|e=hͭ'ITq N=%xoB;y4PRcF)x;91L#4jGE'9H<9ڐ8zČ+S\DCGa2^LU iB?}zCܮ5.B:Y@In(4kjt^"z]0ಶ?Q$'G*s?Y.h%^2@( bT6Xb\c4|O O #VS_ K}z޿<:}o[ '.0tn_\Cýđ~ w\ISci@U79e,B}@| c>Hw0i+Pq Q1wi}xG!aއ4M%44*% H iAQ]* ䷿(ÝGU4(ʞLO"^+z0O*ȧ› Q7?|u KNTNOZԺ++_[}lnP=]MJk.=s}xUBD{f&@xv5Ycs<˳ġ7=>#aYx0i}~-t3P:ķ`B4]<.hn m] Nr%eOEdEAcTfx%5YKLS3CՖ)f%Gcit [l_F "KNՋ^,VlOCxej SFΑb3u}:t6st:rut:"B77h?J}HUӀN+ok,#E:TjXg+ b{x" 3w3QRփ7&MֲRϓIArLoSתfl,Y5.Cg<<ֹW(b ,H-SrHĖ{?,ߺz|5.Fr?дx"Bpp8,Q(h΄fO6JFJυo*9Ji!dcEs~_ 3\/c7B5dBd{@3С=<'97N@i;hvBy/Ҷ' wAF Eo/ D@ᜲ~-]Wxi-) "03l&|pZwa" i}f&ouXVCtTќ[2"FnIdHY#Lmұ|> 'uoZg"^Bsx;0,z951v !i:_򮻞y̌͜"j/aN.pzGM1PyFߤYWJq)1"6hJίL*ZQ?]7ڝ#MyvoCFK Vaot,e:pLZ/]DpA*{O 3sS t! Ԃg 49rISh,,/%ng)c"I1IzWAc#ǣyzZK#0*Q8lFsPV)mj5 !eޯg2 g_ٮ؇:ʖ::rJJU6G9gaLBLΆPۓvk4,_S fz߻`͏N0/qA;?p 3t[ҋwaK7,^*xrp̤` OP I-Z/:Qv.+7f7L(Z'k@fj[F;ܠ 5a崃Qc=tsM{8.ce #ƹ^ľ?&:iɠDs ZT)֞Bϑy^a=7E?'w$t|Gzh1g5|f0|cN pZ2?^Ի22Ϭt^6}/&AOt/ t8X$\O78p-GYuUbyP&uv3,r<ExspPW id'O{\ ^e*Qm %hst3zrxW 4βNM ɲ\?W‡XEjb gv}ӥ^mI5Rr<_'72걄PYɫN(Y.A1i`/[ػ3zB3CR%EB!ƿȠ1ypWnJifmb =Nv,GiweU@iSlW&A lAsGCU4GBe^ 4N`/8^l4mh>(UgEG{%ܲ?J0s5-Yn\VDHI²%]l8[Q-@1E&v:m6ڍysOu[hyɠ._^9HW< %.4wyv#ty;#<5e`6҄bF. i?~4 3Qq9K.y`e [4QfT}b@TģR&@!"ä\&'b L2د,ߘ 4< cT Q;|*@=&C~VM1fLq ESYI :|7 lL-&Ǹbx9cꍢk@*XWsėY,rqzM7֚ɷU}Tmd 3ϯ%$*&Np_FMWMG*BIW 3-U:fNn/F})'6Ådb S+dO:8/B1H>?ORoKu׫ND;9bVfsHERnA4@4B]o3B92z"Q qS 6)-ըU8ix1 k+̰.3 Dhʞ5h49gӽ944*>΋pdi$kS*='X*L aRO jq G!=Bƅ]GDpyaX}?`^ξT8|_uo i.aN-J&S4͔߬iHO.Ki>d=vDnv:T#鞹>.}=£٣g=P (lzJK~MsU׏r"]E P6{~0]Pǟp?6S*.È$YZ7 Kk,s|fONľA&$ y'+pzd窱7Aq =tkiōH/6xh43rrʶ_mWZ"zRDД3Ȇq&q$'m)RlX?( LR[ [ ((ZދJĒU3f .2Tj)*{UO(ìϡV$V%b~5.]!p |fK lHmoH3X UYLeH7z^g_2·Ui('63-b;^"~{)n#S<Fp YgRu^{]]U:۠7!xV`YlvG 39$9Y3`] %V(ޕ}p;f쮕g^E!:Fu_Ǎ :6ȃ v}$$aP8AKeSDuGqȕb%`Qq-=_1xb@h䚏wۡTGOrMo<","vo\ӢWAs#vٌ5%T+؀ͤKᮯCY5i tJ*|@5 W%Z$/ O_ַtWKLˠ2Y"S,^)qV}XMeh2n,b2X:1!(}gbBa*Pq>|_rFQ\([ kh}bj8\ .Ggn [w;|;tQ$I1º%W]8vP5Hvr_Lw&O~xaIeqWbX0W:X(Ц"QEa1!x)F4z&,bZm])̔5+*~ѡ7D ygEܹiݶScȣjXPNE״ EzفhK]K6{_{bVgOwF#DGkv_\SA ܌L`'f7oV+d}݊uA>[vB*'#AߒQið"ϓ vK&pBB9,6׫i#[o~wy7g\!{RLm# ٤ih9A/jiCk-LSS*>|&{9mhp:ii;ʼnMfǿ pB:~1䱝fV3J#ed/l=cJ ^(2b;Jn/݃|W;0#MZ*oo~l(z!ѳML\Y)YR 2IDdE܉o44dW񈖬ң=]/՟n&ڴߍivz(UK@9x1/4#V4mojT%zCpǒz܇s(̲'t`xn+ =vIt"(ʁ 2߲I\j5"^-mrzz=K"sYI$$&Žu ħPդt,:!Awwx* >z'"]9TμՅ0q-3RÐm>}_R[~YL/P=0iI@*. k_j|bnKo_gPD*Jc}iy,˸Aglp=A-hH!Q8 E m4Q TRåbή_BPNdTW40Oڝ1Im9p~=3qA:'+82.;vF|H\c)T[tp_N*/K/cnS|o;NY{ g4OL}o-X_(, 11^ RcYn 9}TovAb%^c{0Bɱ~ $>;%qZd{$57݀鮾hU5QODyQP'J#;?~p<-7)ȗO(th?xLz'`k%_蔞Ma,Ā_Uk_,"e ,3+.*Dk8];TSLL ŐZmCZ.aw'gGG5  3ZcC88ZOJ4G^5_ w00l:;Rݾ`(X`&DlqeA*) ߁l hNeaf 9"?D/ZBK"Ev_G @8w7V /F-kL} 5HNH. ^´%ZcӋףs_'|GYNLa|V^9Y n?UDnyi~U/+^O2zJj4!V]=z T[z ErJ[ʭz%B%RF@V?HDWSKÃHP23-L7Ѯ*dyM=_]iva*s})櫞82{iiqARjF pfzt !A\$$~{+\?rI}t`[f$(|!@(W2 zRlvZXf"Z+ rs hԅziC2(J(ʚ4dػ4u EW8,BOZ5)w qlۅ}eS{ݶ(baMZbVN%}^y;zRH?͋kjmyvRO t WtoUzMzKwg35:5z(yM |?U ؛Q)԰?!D[ƣu7xo6`cw[pu9j<~`>ep ЙoxZ="ⲊҾdANM&q{ږo#wdcLꢤ>١Z͏PK|kK[uDX} ef?fG6ץk3fe}-q!n֍qoLxܪͦyHK8HS=v,C|CKխqttYl'A%h `4LBqoN(fc$h?Hr&ްRp V@^Q-qf[%^C>3J] ЖYOg Ъvi`_9=er [&N7.BvE+u@qjȜ븗0Ri2 NwfVpԇ>5STL?f@{Wp8,oRQH6pZ?$6s$\b.[_ ^X㋳*Փi+o #톣ytb}iL gqE<T 7 97=dLC[(ZMDjX֛ Q]\9CyDrSu!3!;@>Rcab,S$ǿiYplQIN* :"d™^4?yRbeg$pu&pܲ0d20d2 sJTwE6^88[0 \lq>27E#ɂpb% LIa,F3(V7bD:Be ,DŽϓ^Jΐ+3z`^{C5*ѫ;7xzS-]ٛVUo d* 8k:gM 42Ye_2ΘLOn &(ė/*nk:Zd=aJ16__?]A(KVNzi'z=-lGdX./JwfOy#e_ڐ>'c-Ls"'/ᘺήN*hpzƲ[dcUHN \#gȈ2,EP*7=s 3<&a~LmN6(٫fD`hE+~0՜\M➿^7vGͦC4 `=ևS]RP3Ᲊ^)-c  ȘGMldaOXM}>O&#_|kTV}Gk o ]f87S^K``nkT33"HO?" 3Je;żl`Hf< znb TD'4 6 jsF<>3qJRQ29N^M ҅vӡ/CG(CG4W_n}=eC{GSJ5ۇH 'EȗqsXXJ$@9xa8n4mWA\i7q/ :`ӠV&-Ʉz`9.+&(S}7R/NH͜.W;$F[o9tlq䥵ZW=˙>,& Y4`x!!jMZ=GXgB4WD-Jy&{/;j oWq sb3Z q/F;#Fa6/i~8Aq [cQ)kBv VttxG nJEq2 DBUky:⟇\XV[GsP7SNݤʗLm tDKeHQ-="S=W:ghld2$]Vr/Km)ɋeJ4y+풕jYh/N0 ތARߡ}Nf CxU^ќrRay4=6։I.E5\ rU/?^oZY L@^67=Ye{+b>JӅژ.1h1.wemq/oI7#ݬq pcs>$3?%34W0LGR/FM]8k QpLЏČGsI\[|mGp DVCvMXeg8( U%^T(127!d*Or@ƦM,ꍞQt`ԡ6W ^"6שHEmD0u7/- 7F\R,؋ Ԫ:FWe5.St297FC gT^xCٴ-\O*iD#<`ALi7}Ӝ Sꗃ>[66m M#-"d Cp/-߯q-g_0-(X{HݬX6"Ro-rDÞt4ric-x,rT\e1`3-V:fUޞ xTFq3g<%DFT(ä=~%N8ypYәCa-1ϮZ+?^PuDcx$#I^>gǤu;D 憎;"50UK R9 d48^Evd;yk}Mۡ2iM-"=Tyߩz64][kӍB+6^(SJ%],Gh)fELSqn3_*Ek]hd gɸ1?4EG e>/[?܀P 3W@% N,QaBxFHb\$|j sr+t-~5v?9oǃm §lař[\1V)֒_?]MR;?9|9QLXv?Tb^LM˖DgADdx (G# @ޖBٲ, ֜ ^q"eGHEHe"Ȫ"K~Lzjz&LF98OЍ{"i(׵D ߺ}%~ jQR(BJH z:|.]ckj&6!;*8ߵ;[,F9Y&S(}q#O*c ÎOM%5m`ʔ4a}/Cz_Î"t0*J4̒xCE?N -<L⨞WJ9Zѯj1,x1CX^ qq'FX?|WHհ"=vCou`-rQN=*A 5=Hy$ 56UKvEqmZ+\5J{4uhu 2:"XA‰]inRjM8 Ft|TX>=ಹthDJ*՘vlf6X;Ls[^8P9ˇjullFE\f5tSIXN$~p-f0|>'KǴ- a3ܣ2"C61 V8h,!B/C<Ҝ)\jLZAJ'\)mTu[%2ȻHǏ( %/`_A3S`9 OvIrX Pn&ز'-R>v|ڴlwә`n?1Kf|%WhJȧto/dDFl ,+LA131b,(>,TIch_L97Og_4,9~emC-&E'yjٳ7>4~ mm}tdr SNr=̔)uSݢhA&u ƃiY&W5vq?Br@('q{%dz/Uw9$>_O_GT]7JBX]l)sL s.qp4|P\A;~[z= d["{zʓ@T ғϨ/ tn9 պtcf V "i`BiX_͹-w#*x)_Z@@,Ӕ8&AeMgm{K *4dm٘־s q713"i-41>Hܥ-H&o37Q%EAaLP'LAXQPH<|Yir+R86f&=Gꃙ "^f9Ҁ=GWA3GS#?+ΫuW:Ԍ?' \S~ 4x!ʩpf1u '>8ֱlX?mΪiLbs-cdGi6Jo~,Dg*.)Ԭ 6ӎ"Y(`kg ۹Чl45yg!&>϶'AND>N6EYnVβ7:M]\oNw-?/gAšЩz5w) x+Uu-ڀ pU$S6}q7 wgKt o3T#9j ǻhb 7Fr@BYY]vz}R^O`,fdrrQqJykRm}"' ;{W tʰB-\LƬɻfX:^uckנI4?A`i+B[amֿը_c+/_J?n_WI@UoL=vmQo,3LM \Lv;:p_k#zފqwHq#rne09 ,7x=)3.BD>T̑.9 Dwa3G+xrg ι.# M炓IO}{Z_Ѕ1 (GZ%pTm;h$N*Huy?X/创,Ǚ{4LoMVqFCG;/ oŀ&)  V#BvJp ebgLӯi1`k]6dŕz!YapUMB@$' (bJ]}EEO\#Á 'aW4&v,uH^է0>Eol9EvĐW%&L+AB7{Fif }|#{kl1[&`<&9S͉ӑE=V=6 چ) z3jU ?k7BMp%9 ԮӇNϳ0?N&ǿ%OسtP !S؍n s}!̏i 4[.:@{pSݱjR+7s*@CnMXMz-:_p|ޥs:o&7^X^Bv!-p$q `v\$^PP*4|QWtsw %/tXVcɃ&*ipd8  vör,2M[=<>>;Eޣ$zH0K)ҞUir dIB؂WX86@x{zFicOrA2(TFȳ[mMM$pD01-Tt^n)F02ͬ@lhTU4tȜdjՅl{!d~jUF [ƨ-$ h U#N <(F鑙HtlB"}ԆyzI`2S(;Ï' ZW(iLNDp+,ՒFWK]a:f >XAϲuATLxhHC*q!PdP* ex#*߄O1BBwŒ!H)c1K+_;)`Z<@6۰D\(-DU=E]Jld; u)՛UcfT8ȻL{xN~#RPFmgs(Ւ|m2RĽJMl]Y0J~kLѮ"IVϩU检/☀8_-t|/:ʄ/ mn’gxc;>ic|o0_ӞnoԒjrCj,TFQ|)r# Q)˅QꦀΤU2۰ZKa-'N> Y>ܳO*_/&ے9Xx݈' } YPђsVgR2c1úT9F!"N90:g=S1!зa|U~Tcg/Wv0(([]/VvjseZS(Iz:"_uUR"] OT~7x=Vf)mEǻ m3\ %0 9+ 򛦍NupS|Y M#'Do ; 1GFθ?XZ$GƐp^@rwj\RR@L'Q\6vu^!6~dG.1RjờDD~!G`?#KB$@,OZ6YB>bl(S+*97O*B8Ӄ̌ fH͏_!yo;E!K%w[&j\K8p/90&h:)b$yNCl(T-|R|3+-_dx@Ҕ% PE&q9/+/v=74mS|svWQ'FaCt,(C3<[QyB_8Q*T?[(TRZ.Qsrb@UҏvZ@=ָ#S h1>CG RsXݵBF>Qn.+Ca[.ifh,_19kv3p?#j ߞ59 6X` G`NB`~gp( IVe@K%uљɅ\Һ$(di3Ҿ!j܂4%zC kFr5:8@]>/μH`m4ER{uت-aTZtk  @6}`r5 -)ኴY~Rq-i~c#ZWr?~#B,nmKֽ* h |f3N^ЅhACBhߎϑ2-TW(hʒ^XRA]#ŅOj/:Y1T\*ACH742}`>{RfIZq"y>,3\Hdkzקˍ7bhk ӖFG8DH{8K CkA ?q݄]B{$0]2emn}t?w- (K(]Qˬ纈L}ӓ;Pؾ[OzYf3Hs!ȷxx8ȧ0y}kJ"s` s $ma# GiL80'n)޷(?S@-]"cDOyѝfd8ٻd9Ob5jq}lf<+<Ir_]r.YUL]9[IZ/,UXc&_0$[Q`@A)N_Cu&> hs=k) Sגvt'U5oq{b'rGgmdmpf+Z푥J(G{wJ}ؾh;*y:+mTLON=5fA^ ;rUUF0 $Q HMQvPb"|7xҲn `Gk .WF ˘McLbhɬt!|'SYjU[=C`fOɌ9h 4jufuP6l89"? Gzf_y8T:6EaS&lowM6hB<Pܾ伢]?{[jD(&c+m`c<\8yiˁXP*HCOLwbMeQ"@&X·%.k8᏷^cc'k16_ CT]B1򙚊 Y JG%&)% SA߉B)݁".M Z"hBuIu_fbmh)Ui@fOlg%Z}k"]Q"ӑvc%ArCN<*V81:|EhKTg 봸ha=!Ur _;i;?82|Us'x+ cTSIcc>Xfs4_,܅Y]a7=lV$}QfӗßoD @zM: G~ xjC'뗫K*O|S߂Tod4HPel?T'[$J: N&. Ы]ƳW̕<U>OF zP‚jP/lP+s"5ҙѣi|b8u _2+XӵavvF qR#Ӧ'GrjP5:ggC~h\"34V0-h|I<)f&_RjbmiYW`B) gl^?æ.u(Rzp̌$,7*cc7b&tuYW8=xB9' !5*%}tJhG3_]XD*_2?hEl Yahݙ1=N=^\s,e+.]]'ϓ~9@iaArvYmub94gq PVܗޤu4|,q2ғY(*ʰZ;z"im&Z4b3:Csa xצ}ʆ66ο @gq&2ںfCM4!گA{i DVV 3l\u7mdDH(Vu _tyR]HVNG@=X=Qש16x9Y{? I$]£V]ڣi&s؇49L1Pb=n9ciԃ!d~׃!Dt5S'| GWcz].s z$HX!eh'knԥU xkb %͠N;U<1GmQq?htJG0=KcѤUtj:p&+ߏg K-#/y5avނ\a4R CL}qpw-.ŕ<&yF0թe5:q7OSoc^t ٦-JC41+H4j}VJtvvghN)w~H6'y}h߻q^nۖC_Uw ~1OHVػ2*.vW~&LWh~׫0/?";Mb{0՞7Aͮ^wG^KbsQuPgpE],[NMK6 SdP恌N-W 1[5p^sHu1:q|p8%f;eP`#uAdMm'eSqW?xJF_V~xy43'uoaAlC;1dŘ_ /=LJ{SNܨ玺:rx"gg2V~k8dRhw$1j}&G6eOR7A['BBzDls(d[Fްod/,D(oX\ Y&d߀\sq|cuzOQf7k1gTJ ^ œ9TFkD"W{cwL&}-'ʲJoFvk 6TR@!.t%`,>QVm8FQ_Fr B o6T8X7{~;c{KX>qL2=nJaE2d٣*]uo@sG"N _=Μ0:M܁𽛔]?¦EũyK^#EjCXfX&v֐ʔ4{W[S3ژGk1.b1( $Rc4`Ęǥtr/]Pg2]GoPUmJ_S6;6TI%lZ*qُ_<8!ĺΎ D$5\T4^ՠj^j!?`hݏ$}@ K6"\9Azp§^6b6Guox8NUig:=0H^A‰k~Q_H3x7}5_^!',-zr*5tsB77-3v=[-fQATY o_6j)P7+Ka/z+ Dۈ$5(OD[* 5h]9n| *,'BIhlsCbN17p_ۄW &ycC\Yrv;V=ħA]8e] .]ر}ϫ4:p ?|M1 BPQ_E҅VAvLca0{/$U&K{Sg@L܄gVh T?¢f,:֚5,/> \ HnkKV8dXOH9F #_8*8?~Ɛ.}^jvaȡA,@Cd"K$)r!ѡ"RfxIS^e5𽷰"q^x 솮GO*T3~"@K\>ןvW {WI( zshVےJS( ^)8E~GvY ֕2T,㠞M=쉇qI62R0AO`L=(/%ߴ>路9zwDi&X),3fŚg`Om Y;meY$ݝ$}LDvT_9V$޶C q:=P?ؑ3HC{ KtH89T!B4'6f0K(Wc{[s- |9GGR9}˪~Cx?.l/2%&FYk7vyVk#vY^N0I M̮S~C"WFY%5^ׄr;Ma}ix]PD3V1mJ\DhFy[KA^ cc\zMF` gL O;&=PN чJ[CY:_ow(S)j6>FMZb$12/wC>G"'Y D͍)w{m[Dl{Ҏ|AQ);o*vao?NT1j3P*3›os|AL(,sw tRLY kRY(r`!,O?;Nj4,U*Fq6O ҴA:Bҩo U~sJY cKtؐ j/`֍D0QnZ<|V `?&~$7qXUZ GF[le߲T5v:Nik'8E~CO|3Qʌ$ n]2J*vte' S8St$te͖VtU]wݮ|ኰ= &g|tC;㕼\\DT8dO3jYbg^lĪp|"\R`gLLx"ϊ:J8:Q㨫kRV5p߭ NU#W4ބ Oҗk$K,͌S%UpiJ5բQ1H~H {i( vm8ywzQ51 Ϳ/"zHvVGI28DyHSM1S3rjFVN1-^&L?A2h^\YddUyֲp3VޢdJ{mvGVsH k&~ 4t23P О۟t & JrJs[^Vlerr\|7>@Ez8j98Ќ(WEƕ@*>J3lх kŰ8\t1'6-B5މ OXI ҽi=UhiGޖhf:0Je x{i$9>CdnG 9_jWw ˼ڊI2zυ*d%Gr o  Ajb8R gdj%ө>]C9 zhHR)FsG'16[n,yU:Q&̈́w@*m@H6E5p{[dT1zBiH 0-4(n%RdzkM z[l{Թ >Ze%u@P/^YD%Y@R IWVWʧ!12+1W{Lcȗ C`tD'Z3ђsƋgh8#T-lTS6JIwI+95p>Y"bQx$j'ᰌ.EtU=2h2pRyn61l4zjE)TZǺ/z!GuOVS:~` 5XU|^Ko'i9iLgԯ@_vҲ~\}x0[S5;Oߒ 9˰U_e-o~bӽǰE)OFzLc,7!\|+BG<@AD9p"BÜ~l2@<; E@pZl$NJfIuxEK sZ<Lj<5W1j } *Y~*kڝ2\-f VU_MS'<[)4*te\)2fҬ _=f_^{4/MBgwH' *i2n&Ln}\94XlW\4ن _(0Ol7}@;hfSk{:6]:A.X`g@Hi8Ы=|Dl2Ln3= xQT=Wd\3\S`2Jø1iUҐg?g*T"<ë[T`;i?eQ E,DQN=Itxþ7c6~ Hֺ>`0z.l e@x?ʖx;3}O}٧9JՠYkf#C am]V<|3jrV}й0W'X4j/Dh|r^H# 3RO5p-'#|;X<Q(z`m*eDJ݀u1|3Uϡ,_e>Gi3RZp $4뻹( Z}K$AVr bDJ[mܿHUr9C6yz4{+(2W |1T-;&Rea"[iˢDTA{ఢT)-9Y,VSew TD_)wXH@Š8DCs^g?ҠϹց:$%A{_gQLW4xCMC8+ Y,#ݬ];]4 S"|~ eO2V̐"mL_yȗk;ٝ])U0#[]=:Ѡ3L4?mN$>ft;w]#&XˍF'Ӭ\T @JDc ^-$Qk>+z>=th:_[|i͢n}BbnUb2AV.%qѼ@`7TA>Kaqn hr2ʾr$ʯiTD^qg=jH'4QAFuGx5q^EG`E--7WkH"&iTs U%yB5UC *MaS i䗕h//! 2t1n ma@dtp'8"S7S%4nk:\4_:OJfMHE:u)xSp ۞ٜ4zw8Ja+lukT٧PZ z7*JCᱍXjO/ 3HfwQA=q_kbQԏ8KZ1R)Ѹ.=|16W̐L qY4q3X@hf'N~ӥw-bC0Z/`N$Ѱ07Sؘ݈7V!!gdH^Eޟ{n=qr ^J,APDlz8xF#X)l0Wx[ΙDbG~J}5ԖaROf0rH4d?l,mdٍ- q%NLFP EL%at{0r.S&q+jС"4} G0@ʛ6_zePz$KPk akFVcq/#(7oF#6vC֛t(; <6ɍ_0j_0ģ6 ER^ʎBJQ`:#ݧNK8 *v-F/.pr20p,bnt)x%M r$҆uQ;KēɏKo:3N)FT5еǘMlLNPZeU/ .)`tz%>eu_-Rqu٧pX%T^9I. 8-S6E(fs8V)@]M)}Ϋ|(C8Bo/B2V{ԵY1Ɋ^Ȱ>Q0 0Ooh006PAAH<$ZDZ̍n>uBÓm_OGe0;kM eÀy(x}@ Bp̤פ2@䪭|~z sV.1#udA,(Lf#l3]Yj7Q$F"#pQG: JOx Szk)=rYkYdaJ| [J8TQ.~s@@ i蠉#CcIy3-a/ͣk$zskG\wS($XW \)蒺2}AmFՍRFu>Vw/MUQyr&z]k1;:Naeoi!eq&ɜv%.ڷZp4T٫'IWfl.,>ӽ*TNlm9\ 9$ /:q_F*xR rõiZ$%&̜Id=>sBS QmWOrҭ9q#5U2A/79?řG)qcR4 ]=~u>bHfsř (a U=]gFL+ٻN?u'U-mԂbco^A&^_o?MRǓʄ3ė>N,vyZ hvr4'{ [0m0М=rq%:>JxbcOډ7<4.9q*UzZy?]UME]Ϻ!__MeZJ[<| U;&r)R3t/zN8$d˻s qFlR[(R__18E8豧K.fT]q}DfQXќ^’c6;pSM>:[EḀB$VU[,-,)]RIпG'-Mn2Mc' 9J8M(r ?+=s|4:m[6A[îKÉ΋y{@ Q73!?[ 0% 2|9/];Q`M֚E~vcs(+Cr"hs?"? ' l6nk*ӍK PntnT]O}R`ewKha&?E70;"aܵ-sHr}pGQcWI\c}&{H+nF 9\#yͤm0-pkbtY3{ZhfC3|DnκB&%XT-8$0ܴ7AFi!UifD+^]1x{n`ܡ|Qvi*;|6Rx{$^{eE.gc _R*$Q!?jb~ ԯ UiGGJ0^D1׀<͏!y'x~+^\tL`S֑VaZ, mp$nOѫo9`6S^-(FffɿO$C+Fr\Jjd1+fn;e{Võj2qbH1\&ޘo_OσK.?NQLAU`ڿ,:L/ak] e?!\<|$']nv3S֖m[5tX!$1>›1nzcv1>@y4L}RGLL=a?' c_9h|2p*}M ӆ[aPPQ㴅b3kހa%UQMi7NT+@D-6`u *^zZR>3`0=\/[3A9IZOo?ڹ[_} e8ӗ2ѝ4zVc"BxjIp7~v^:3_D}&&@B6;g$ AzAeaI[a DӜrW1DD ko7b4ˆ|&# 'ٷq6 Ku+5a؍ځ{'EM, -G/ Dz 0'\icONR$~N6*Exj0gk1=F=ݏ#~@=uw3 %C'P_0ߑ!gA@@oߺFM%jeџo$R-^yvNKa|xg8: |.-`I!jh-kE;&ű>M!]La1sd3WX0W&T%vU~j>PfVP_x!tbfv&HW!V5=`O~(eST~ sCp&GCP%+o@"~QJK$~^f(_SmΌrF$M~47q`BI$1xڒt\ꇿ秚^ӇyU)#id߅%/EbT4II{gϷ]/'H yu4_Fqj'F6)ci,hQddsGb>#gO!}ݍ{v:.+ߚBC~jT 9^Cud*Ln;,9I4(M=XXVLY-ı+#nxUFKkƪUXG9#Q{̔بGO+<8kX9y0WkRUY| n^H&AHS껿nVGɵwVR#*|/oov[P>M}ZUl7>Տ{o?Kn?m}״h|׾>OA/AGMjE1$7'OvYU7R]}gZ߫=Hen KqşoJ/уCʏ!a$BKP \ξ{H0DlՃ~vZ3cyk\ ;%@ӄClJ4 !w9`"NNB{kw80DF<_lAݲA3~2^-e+$N q$^QU)TSK<.,ª?oxx+e}|'XQo6J yl7JŁ/, 修nƘ9t٢6L^ƁxA]0P]dUafWy<c#Fx"|~♵a8(庩jOrlX#[ 0h &o %?zףqV|'&LY^PYTNcՁ%4!~8O\8֫Jr B.$¹=z=*j#z=545>/MU9mr 0X/Ca*KO.5e:0_{RArCÄ4>PGѶ^ $KbĴUy1| s$p;ދk\ ׻3`s}W][AW]c؃jLπ9TNT/aF/HJ]cOHn#>Q `d:j+Wbd=j Y/DcVFf&CE67j̟Z6Nl\TU!<#>.Jk$@{^k$5^QE'dRS/iuGϛn`T勀/^,M”]6Rfʦ:zVCf?jM'yQp-OP+/<y?IGC M. ezn |x]`Xb6DtlnӴħtr] 6H^WSkl;ug%NnDz0|EX}H޸#DjGVFAe-Ba X1ޙd L˓2HNRu"y7,eYҸ!G0@:䊹_7UʻM*u*^>=YH8CyoT7BK/9N ef6Ec\ʪyvmy@)B cyTVEq>\Xwsn⩟~LzVg*@Chz'hԂs:6͌EF-p |ts'UVSAܜ8# ݤ҅ToM69s!-8A/?`?O(9ĠE2Үbmqc%裂4V-sSB7CKOԔ?^ dbW6uvYu~>Q'ѐWe<8 5]5-"EJC 9]l(6[rV6XhfKfFP\SRo [MӃm"l\]lUu줆3ܞ_)5l9.N32:2Tƌv5P3[#SڎP87zja@k i+7\4#8;d>Fln|]\wr+a)Z~&'H/G8vnH+Y򶢣?_iԁb1/!ȧYY<4J\IJ]REVm!\!m qd~b}jtӀGHa ut^j0 > \GrNmش5< |h j&E#2G-ė̬=4Qwwrx$D2nhc)2 p盾>ݶ!)8Xh3pF1ÊPi0υwjJ:@dJ@ax1#gIDwfa]p ܅9]^L#˂lUx " b|ڊЕ@iiKVO%*pRзzkF^UG4nOθ#GjaWqu?;`(^# )L #斵@ItW+NQCA27k7BUq+8k8`i{G@eqAщRY0D2@.h<`!W?1 J凫lB{G3n}4`C̮ѫ]g==Rg*[a>OX8E1 9&BxDc/`w(۸an8.kF۽N|P8(Qj{/I_&$#s^W ZЪ"6@a,@.;8!m4.G\'.x`;jEiLv#vfPTR?>hL ܲ^I,࡯ڟDYHNȜl 9&:pij|AR?{<~x|Ot'kA/2 Pwo2 A]"CK_RUlsLGd`lclʊ%s#`+Me 7ת̗ (jf E<׽T}=ńi=@E-tU|kgPCOS&Zqv<_pc8?1;-'՗hpv:G%cwe4 B]T}Ro=8Mhwʋ@KEXI(cp)^YQn@" ㊑ vs Čh^HS: Go~(0ct&-ws&[8W 0XⅶM(,4e$"V q=c2])L6ot\'t&Pc1o3fiT R*}/ VMt6.9Œw0RJm1H1ΎRDbE!@%n>i9jQJh;dΌcL:Bݵ'EOo]+\=o  `˝D&<2:k7un&MAh΁ltjZ{10HkA1-:) 4fM=?}uˏ0ڶGeTv_`bYODpxD)_0sX ơ?s}ʉh ,ߧ2XKpA=@(;??`tB9Sy(+ bΕ\gjż(0/n'k݂ŴhãxH'Acmq*x8Zĺ> ?Bpl7Y'i%zJѦ[DZSf$EɎ7LS(}^=y 8B a7> :AoV&A{Q'~}Lߟ5+*om5wVSMH }2b 1a&{jJٻ(x::+ʑ K6ȂG'0f2d>\PsH9RE '],捋cL2HS@6h-HYC&dU.@ vJ6ևP* `S++$_sWϫ8$nj抣 P-.]̹U80Fdcc"s);ȳ*bO*$7KFEgneHߞ8\%9{ Ӂg?i]RהxoI2Ρ,D<5 _;&j‘o:Cr]% +tp8<>p ?=&3Dr0VeRa"b _JVtS|] ;>Cj{/t{ZCthT/Z{\[6mZ'BgEuVTcI@yno,壢y6n_şq-wSuĆ Y ^,d7G[kMZ$~e@ٛyjۭ ~oY` DEU_{CImq*ApY=7XpP UGcI!'l1!D xJr=@R4֋w8EGx_AH7>4;,Kݧ8&ų;0_ \1tHxd3}f ZdS_d9U.OO0Pb+d'Ib|Ĩ!}$얏pt}E."m?g;je}sZ՜yG" "ER4POyl}Z @<~ 4>s6wmD`6`Co%,=95_h̻;@ʾCZ{|eOsxp0әH6xMv,оIEtL|RCabtŤ>QV /'M6Am1u 窳 ⠠L0ٶZdj]N[Zb#GQ!JJgbf9J-a2ȷL9JzE!M'}@xw|&,[:J3ڥ 5^)ȮrVfS4[6Ŵ䑖 |Z;;K:;-[F?$cB+4'HaIÝYZ7Nl!;bk)<$LOu-,@"LHDU"o\'.)WH'fk؊:ܓI; Btmw_/_K' *ƓͽZ@Aw~!89-2]~"F(w8OM`R)رHc##sۧ5/ :^f/6Vpd {*7Zak/1  u<>VK*,0LPM,Eп PV ,wT'n&,Hs i^ǒ]/1D'#ӥQ7o+=̹?(kB[9L+یyU fa^~D3Y ߏPť"iխAf [wd>#KӶYvr/w ):_u*Z^gxrG_l4npdD\k]{O9^HKa?ȥ4plh7/GFE4 |S4;>GNRuCeMQzAa !SG?ZL6(K0. 8y3B hlx"WXֽn[`vd[^P&*raKX6eE2 +NMՈEVm.2C,[%Xy ?6ߑ>ssE gԭ90jeG5'# O!z&  ${cb0GTh&fnzL(ԫ hSK-9/$44WgDCG#&PEQo<ʲ$d7RRp/Gh1Gdw r.gЬK#/P2d n#YK \.m?UẘBd dt.>~KNzjZiȲ4t (ҥ|f$D(S4P#6 gKY5 k+^ך[27l_9 q7^[4*RM][ay]EQv ٘vP`#%E㻙Q-%7U HϢΪumC6pl*N1.b,6ſ%r՛bGIF_z:I|h6yH96@[(gM ,eZz=;}jw&a#|,xaW?&245U[շc@|1̆)bCQ]~[OF`ttb<LkXCirn|u<+,OHTrƥX0QOYOkhhǑ/Ѭ7ivW hKZgJb_O[̶=  !%XR>]ޭ;MVlߎ ѷ%EP3zVpMbͧG yk0\*T28t  ewҵZJLl,aFM4w(X-@J[s#Xf갮Efv@nL`UA2&}<&j} E5-Ds$ xc+H؜-1" UjڜZ.N"Ƥ>h8K6/ֵ$va ;/*NXJ鐥{̱C8C0^)xja!I s݈+/uGnClo!7gn?hǂ~}W\gYP#&c5Hݤ3o>tf\/vD4?e:Hp©^:S@=Zj+*4>SZ1`6ؿ鈎$qL1^dNFp"h$9hK6D ']/uS_^3VMX="LtϹ0_ǘF>@CgvQh1O4Qlo_c[\j-!z ~s8+vU%`+3R/dÇ{zC"vCʎw18'~u6Ij:3qv (e$g!Pڵ?1WM;tߒFOouEL1Da^B$’`R՞2&3YqL>'ajIJ==,dܮw'3kNbGSACa-fMSn9@XpDI"/gFwr@>$-v6#W℔s9ӎ[0!@a{l' + 0amwW%|Mޮ~ EU^&.\\" 5"aHCxV̮KTv!z"dD,Yק=.y!/PEW[%3b=۱bz-z.(&.D/5䂂J:7;+ )Ui'+QjӇo}_ _ꤿUD%CZߪ~RZY~OX~"Tʾz'ɧ+I?D?Խ/|oR P٩R.>L'ǔ}䡢LyOy>dusg*V}8NHV;\?p1& p˦} ,GI6d%F]͚I'0k#4l G-e]QdíΜvK2bvnj26V!Nb8$}@jK,Bv5pnPTKpu…B#&_ζN5 Ҳ +ѷ%+QaOρIM3pE>__, Lv CdC\Xb%giF_>u7,^T_s|.Kf1,GL)LR˳qЎlXBЇb&JKˊ:n+rZZքyd27MڟWF6q]ɫ3V`V14ϡ^_;{qЌQA_׎ΧKy͔9AV,io&URaErtk:K[.xlfkǧ_Q 7s3l b e\uflub!Л69!l2<;Ua>p[f[QԲ{&U|*5r{l|Q:cD̟jnH+HΘ0 f%6v~k3TEH^T7#. #Xpx#xeLlCR:h l]rz>Bx^8L)bǂ!:i Ohb!#E7!^燷-Ҁc)Lgc78*)^bQ"`2äh'`Ku/\ D6G!ޡ7Jk兼NdxZ3-u [!D:w:rJXb{.{Ư%)8,tUZ:X3Cn9긻:˲ǘc}UYr6T/YF뜐\/۔ ak3A׊O&:TB0\3G_ :h6H_T4RGGq @*;n!Y TMlX.*>LxC|Hay4GN(4r'&@sSRKC2WLjG/ZVkOzʠox͋"٠!oz&?`~UVp_IU7",y'fad(qtaTqa#&B!P^Zb3֢|D7QbgSP!U|x ,khfx?r;RߤMvpn#0Q DEF@YPt2/WDPQt}m򘥰k<nH0|l(y}9U\kېhbCPck諁@cc#Ry[rzcI2!>%"n s<(V>Y]A jqI!W4Gcƒ{ [2K9kztOo6/)NC/M3;F蔚h#a-K\rlR}/]'1[!KFOIUKVg^s˘4<$=Yk(sVa} qJ2Ὡ=VN&")^]S9yN m*#aBU:N|~ !xGxN Pe!Cors{:˕/M{HQcc&5 z]S~+ rHscv'.BCf Gug=[X4 y}f(8.RKk(5kRCE' !xsi`?:xŷ1 4e5wt1mEM9dJwH)QX5૚KL9~/bE`ϑ#zl|6X#.`^_kj߁,8gJiuc  >V D!M9ʫ1`2 T'X'OCbxEBݵ!]㊑ vs Č+ԉn`z[  xE"~eQ,&5qW~g _}wN5|dJƤ:zUP5uJ5{!T% ("n6RMo+}*=|nhPn"v-~i)~}SS1+,:Z}y,f #y ^Xh)^Eq_<ӧ 8!kf#V6(6/O_Z1=j{nH3nY95濲Qtσc!"GBϷ#[ Gl'sn6ъjm G.f=1&eQ&mϜ΅kC\SύT|~wl kxR2nRʔTw~lwn CYndU`GM69}hte{LW{BT ~' u; URϓZl .6jT\JI1* L5V`|+j?BGm\oô-ۂ4<͛x}PZ*㟅P+;wo.IwϠ(GicQ 3_Αoir<}Ph>++(Z٘2mgV3&a }:a[`=/,W%E1WIJ@Uiv2yTƏ7sM4$['y TcB̟5DکшH3n.GaŃF|P6gk kSq=w^2i*N[%٘yGחц t /\(|C:+jڵbmYl*E_nx/ :=uDU]9Łvo]kǾ#Iex CAo7D f;obf6cmPE@Ұ#E OQ+<ڄ:ѾÁ OQC#qVpZ5/qGFmasUM _,. XVWXLԦv 7w`1vGpP9$wgj/9&®fR\DM@[r`L`F Neu)S{Зdx8HGM8P`N3`&XLj6JY݅ 3J+/i\{%%fZ[-mZ4MmxaOnה)0†}%G< )]&M Rg).m4NH L^Sk#a%ē'|mq0v?\lʄt;O鼰,tv9 MT |R,:*ohbK9$,m-Ƴ˅{-QG$]|]e!cSl,h&~>kgKw{M̾noh*ޓw~n@^Qpz3+ 37OiӟVU,x !Q5Hd/0e^ف9]-slqD J ˥kڥEAuD-3&I4<`2יZV|2ħ:GRגMQ xoPp< J'KƄR[PPߓ_,7qD~F ]Z0V'17W2~E*UyH5O߬ܔ]ǤcFl a ρ)ܚHD#Ddkq F8J6f\2(S^RXIF(0|#*;Ϻͤ!Xa$#/3 J&ܥł]x )?:sRya4Pz:j{Ul߱P5(g_d(!k(0=&@[ӫ?@>1uiPrPؿn+%-)'dԑG-Ec+*s•]یܱHn)(tJGIߜFDV%==, H<Ȟ9^zZzi7f"lE{A`p$M'U,s;n\.@#9k^^KCxعzl[?`,8<5bj K9^ٷߙmJ0)kMQ``۠QyPiauW>FK s/~_,U1)KZJN2dA61 i1%@ۑHD{4St 6c:ճΆ"}^zE9PzN<捶5hS>ghR=gXN% ~ghQ7P05u ),Pd ^HRgaJU|Mv)xGsɿ(:QsKbRИBPil{'~!eȆΏP}{W{ Y=7(;q{=1WL64k92;8Jx3p:u`3)X$2VH|&Zvg2OiLS [0mqahH5ڀq1*}7HS}쵀D0b,DU4ˆ\:Y5,sG}*EͣJƶ9PXJ7`cF~"p|$lurK>ZZl|U7lѣWHGa豧K.fT]q}Df,+cy.Z%>|Vͩ-Z Eԓ6M;zƮ k7Bs0hic1|-mȣ)J"*%]51ᙩZOk\O5h/ >êAat&PT8Qtr*? Z#mfdh\IW =y/m|G]XKT}[UXqz7Q_.?Uձ$kP@g^͝Cpf)IفɐCeyak33tz aaݚ^Ok,0k Y`ĕlylu]bn`䍽$Kygou?bdmrݭ4]V wǎ?56T;gk30`c`E@ָGG 3YY#?1p `njfzu^+-l5%4l=loͼ%Y@\O]i&΄m019a(Uz*iX3v:sf7x: sRUalf O X'"#rh{ C˾ms$m-'Zج%%iյɶz7XA0nZS 2[8&{x$?}a. c }(M~cAmEiaH<ޅ5ӯtdh13ܣ 7Kilb:G\ Sc_1KCcLQUR1u!oxsh0 W_Iw빳NR`Nꬠ: ;#kWamJCνB܎,B *k==v0!])τ8,5[1'˸?i ?/?o̢"Κ+rTcpCԤ5@!t8{Amel$)gZ+W)D!B@/N3|V\CZ^҉q:o6͖#EM,s oel `ܞlpșOH̫^}MT JB-ꙛr/%7G!4xB} d:7|!Mڥxakн~mdj E7f؄lFq{LOs>4JfN}m(^IlV(&I@hCRw|9U~N*gM5K4Ϗ ?>KO"'GGi+F!gb=MvW N[4IIzsH@|5akLHt' bqALtSzJR8$Z.י/^K2}&?d,"ͻLր7tA dyQfcߝG+lddäM }ЁBG?q ~3!ϱ@[T]ў S|W&h-\ ])q:v f[}u}0[l^,Dd ]>DT,upmqR~@'SouFqqn8JFD{⹢o6WN\8eUFW]ej-`x]Ab0lZ1e=U*N#uLiߩk ):d;s*CJw]5~:av VB'}ۭkܿL8m}K:CsP;_R՗g2 XsL{k|L9Otcv,qr<=p\gI:-ࠋ&rR[(*,+g}[ LqF p]|U.\TR.gvJvTѣCõ)ECV,r.$fj!d)]D N!GK^ h'8E93,D8cPió?-f-Ǝ!\} QtO]fi w:@¾P!gI0PjMnY<9{,l\k:9eQ&id[%S +DSbw\NZtzlՒѥDa`C@@BpXN7e{^zfN؅[7ꢽī ;UwxɎ+1pNXeܘ`kg3!n&Fga 쫻iԦ heQt>(/f?(uswˮoŻK@g?TF!>~!Yeٻ-y=]Ȩua\8u5Vk\ǭq?zG򨶉P_Ø.)M>KSe'B^ +yQEwNTzfTeA.orgE" cŜbot%;Ǩ [k?!fjاGml!οFMH]>}_M "\_F'KG`&vc=݇=Y (3qK> 꿷+ػ+V4vNx"ThJ<ί$p od6tZ8X%09byGRfASQQHLV< w۔ JWUycKM/:Ͻ)pVM6"M PK~z=F.ª#05rY\X`WG!(3M?r|dkd|ҪnXT ط%_lvCOO45%h"!"#QcBm9-DbX$̽GOF} )= xލ}Vc!$LJфm }2bwd4U;cN$X iWv fM_n{6VQ[αX4/-=H/P3$8 gM2[Z[aYo~'7FD1Gh7RXӴ+`o]z-=%yĎÀdD'LB7Z24anՙ~ v鿭Xrg_`_L2s1{杇6s>nʷ'IuTZIT佰/TԇY{rRE4!d=>,/zvPaxL:Kǫ'O HdՅXMG +3$' *]#̓8cA,Z֠ Ϫ#i9骅MЋw҄AyТ4T>SHc)VČ"eL% +_ $}+ǐ(16qի !+><>Wv?&`P7$JہrWv~?Ci{y\TZ~i2X7i' =Y1֝FT1N ~c_f{Hԥt[yXxw^^XL^ȃfOuwX[o߇54N@rlkڇV7z;(O@F(U_dT|1PB:od&<\ +>tvvTv,cfGåxDzihUB@,=}.*϶I\m-A2\cOn>HEczE|?ϞtB5 %WX <ӦOD'DT>ݫRpz\zx*$!w64^I zrl_3{[̀%]S]I >wb]`Vq =и.Xaf-CVjB*-Ɏt2kfȍ!P%ET},c4< u{ǯako _ 9/jNjGg YF>^$[hGIWLv:֗FhUڧx)3'Oo9NX< |"H d2 h]BIcpun?8~cNv?Ї.EEg6pi]D6EkQHՍc^gR'SRUٷ ?[kQ2L5s ThOwDU8CU-Bm]Z2_X79cjUUv,b훑T =#g?r`S$&X*` ;hdp.í ֬+MJ$ ur&!bЩxy xbVVѢ~#v5X닕T ɧ+[A&5zf^gXD1 uGnzG!Dv$/>6ֳUe_zOx *f>Ο$9zQ3W)6@ >-=m;.\ӈl\Z_=w#\V[3U5·₞CySУ..z+*_gs+qj]TfcHpQ ^hLl0uE+PP^{$4 rZ;Mj0!w mP KNWkMiSZtF07@P+@-~oזqR>Z:G/;+}RΝ^ -±of3kG~KIٯmGƌp'}.@e2DٌY~M678Rpq?I6O+ 2ϖQPYLDxwV2#ٳ6 9޶S G9c&-n7 |q @?\BKn[`a/4!_G<~*|wmnm~55G|7zFR-qd뫷rJ܁t"^±Da۹᭑Q 3#5O@>GuIM (Th3L U5_kq:v8\[cHrNB% D߬R\A?XumZdRxֈ/x),cD鋲ny n>cpꆢMZ :yE2ʡL~w.F7؂Z ˆJ:N|L݊SXBKH D͸nDtӍ'r,l?h*9+n.k($Fnl[Fh-mMч,9E,d|N)UM|)I2pИz Ƃ{VĿ"\59'/= m-3fa1Wx޺- Apրvd8 iu2'q#IU;&Ba~SR+TL@KrhVޞ ͪwEyaUcdJ?ЗG%+} sT$w_־*"-U%KU$E~!"n9mIlx:U̟VVE%?=f'F#~ uۖRGRWb/*D+ eg#ԓN*>vs,iqt-assistant-qassistantclient-library-compat-version-4.6.3/assistant.ico 777 0 0 1266366 11406632726 22032 0 ( f ( 00 %(  ^N _ hh( 1rWwNNX" ɪо̹ȲɵλŸдK8mμĮy«{ĮůưƯŮĭ}«yì{ȳɩlE )48m7g5er6fM8h$5e ˷xĭ}ƱȳɴʵʵʵʵʵɵɴȳƯ«{í}ǥsK.E)~48m6f6f6f6f6f6f7g5fn6fH5d!4e Ǧ«yĮ~Dzɴʵ˶̸͹͹͹͹͹̸̷˶ʵȳƱ«zDZaN8LE)~48m6f6f6f6f6f6f6f6f6f6f5f6f6e5fn7gH5d!4e ̹xDZɴʶ˸͹κμнϽнннϼϻκ̹˷ʵɴĮyѶ7ODLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5f6f6e5fn7gH4d!5e Xɵ¬{Ȳʵ˷͹λϽѾ¡¡ѿоϼλ̹ʷɴưxͰ LSLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g6fk8hB7g6f ̸«zȳʵ̸κϽѿ¢ĥŦƧƧƧŧťä¡ѿλͺ̷ʴǰªyռK[LLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g6fk8hB7g6f ǥxȲʵ͸λоâŦƧȫɬʭʮʮʭɬǪƧĤ¡ѿмͺ̷ʴưì|+MoLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g6fk7gA6f6f «yƱɵ̸λѾģƧɫʮ̱ͳδδδγͲ˰ʭȪŦâϽͺ˷ɴí~̷MwLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g6f6fe7g>5e6f|ʷĭ~ɴ˷κнĤǩɭ̰δзѸҹӹӹҹѸ϶γ˰ɫŧãμ͹ʶȳxֽKLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g6f6fe7g>5e6fxDzʶ͹ϽãǨʭͲ϶ҹԻվֿ־սӺѸϴ̰ɬƧ¢ѿμ̸ɴůɵm PLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g6f5e_8h97g5e;μí}ɴ˷λѿâƧɬͱжӺվ׿ռҹϵ̰ȫŦ оͺʶȲz PMLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g5e_8h97g5eyĮ~Ʊʵ͹Ͻťȫ̰ϵӺ־սҸδ˯ǩãѿϻ̸ɴì|àJMLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g5e_8h97g5exȳ˶κо¡ƨʮγҹսԼѷͱɬŦн͹ʵưdzDLKLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e6f[6f43c6fǨ«{ɳ̷ϻѿãǪ˱϶ӻֿҹδʯƩ¢оκ˶DzĮjMMLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e6f[6f43c6fоĭɴ̸ϼťɫͲѷսԻж̱Ǫãѿλ˷ȳ«{MLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e6fZ8h06f7g!˷ůʵ͹нŧɭγҹֿսѷ̱ȫĤϼ̷ɳxֽLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g6fz7gV8h06f7g.DZŰʵ͹нŧʭδҹֿսѷͱȫĤϼ̷ɳy־LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g6fz7gV8h06f7g,DzŰʵ͹нŧʭγҹ־սѷͱȫĤϼ̷ɳxֽLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g6fv7gQ6f*6f 7gͺŮɴ̸нŦɬͲѸսԼж̱ȪĤѿλ˷ɳyLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g6f6fv7gQ6f*6f 7g ì}ɴ˸μĤȫ̱жԼӻϵ˰ǩâѿλ˷Ȳí|}LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g6f6fv7gQ6f*6f 7gϳxȳ˷λѿâǩ˰ϵӹ׾սѸͳɭŧн͹ʶƱů^LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g5er6fM8h$5e ªyDzʶ͹нŧɭͲѷԻ׾Ӻе̰ȪĤϼ̸ɵį̸2LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g5er6fM8h$5e dƱƯɴ̸ϼģǩˮγѸԼ־ӻжͲʭƧâпλ˷ɴyͰLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g5fr6fJ5d 4e Ȩªyȳ˶ͺоťȪ˯δѸԻ־׿սҺжͲʮǩģϽ͹ʵDZì|LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5f6f6e5fn7gH5d!4e «{ưɵ̸μѿ¡Ŧȫ˯γжҸӻԻռռԻҺѸеͲʮǩĥоκ˷ȳì|оILLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5f6f6e5fn7gH5d!4e Xţyȳʶ͹ϼҿ¢ŦȪʮ̰γϵжззжδͲ̰ɬǩĥ Ѿλ̸ɵƱ«zLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5f6f7g6fk8hB7g6f ůĮȴ˶͹мѿ¡Ĥǧȫɮˮ̱̱̱̱ʯɭȪƧģѾϼ͸ʵȳxɩnLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g6fS8gZxŰȴ˷͹λѾâĥƧǩȪȪȪǪƨŧĤ¡нλ͸˵ɳ­|˷ LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e6f:ϳvűɳʶ̸λϽѿâãĤĤã¡оϽͺ˷ʵɳĭ}ƱLLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e6f&'ʪwůɳʵ˸͹λϼнѿѿѿѿѿонϼκ̹˷ɵȳì|ưLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g`Yӹ«yí|Dzɴʶ˷̸ͺͺλλλλκ͹̸˷ʵȴDZx˷LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e4ds˷wĮDzɳʵʶ˶˷˷˷˷˶ʵɴȳƱ¬|«zɩ"LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6g7i7j7k7l8l7k5i4g2e/c-`+^*]+]-_.`0b3c4d4e5f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5eսɴxì{ŰƱȳȳȳȳȳDzƱŮy¬{о/LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g7j7l6g5b3W/L,C'91!3/B8MJa]vl}ɚУΡsȕhČT}Bo:i3d,_)\+^/a6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f0`lDzĭ}«zwwwxì{Į˷ΰ$LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h7l6f0P)5$iXMDD1YlY޾Ԭ}̜_6f5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f4dCռսռLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g7l5a+=!aLFGBHY{Gg(=k3d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f4e4eqռqì{ì}ĭ~ĮŰDZȳɵ̸λѾ¢Ĥťťãâ¡ѿμ˷ȳì}ͺLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k'v,FLLLLA}۹}ɚm_za|on9i5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f&Zռrì}íĮưDzȴ˷ͻоťǨɫɬʭȬȪǩƨƧ¡ϼ˸ȴĭ~ͺLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h5aXILLLJNoǑ7g*]+^-`/b/b-`.`6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f([ռrĭ~įŰDZɴ˷λѿãƩɭ˯̱ͲͲ̱̯ˮʭǪâн̸ȴĭ~ͺLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k/IJKLLLENs9Ao*]4d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f'[ޜٴջrĭůƱȴ˷κоãǩ˯βϴжѷѷеϴγͱɫĥп̹ȴĮȳLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8k'v,FLLLLALw-_6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f)\կ uĭŰDzʶͺо¡ƨʮγзҺԼսԻӺҹѸϵʮŧѿͺɴůůGLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h6d \ILLLKKϢ(\6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f2cIu{wĮưȴ˷μťɬβѸԼ־׿־ռҷ̰ǨͺʶƱ¬|LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j1SMKLLLH6a;j3d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f3cBplzĮDzɴ̸Ͻ¡ǩ˰жԼԻγȫ¢Ͻ˸ɴyдLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8m+:FLLLLBn]Ҩ*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f3cDqMîĮȲʶ͹оĤɫβҹֿֿзɮĥͻ˶Ů˸SLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7h%n$GLLLKCNx1b6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f3cDq#,ŰĮȳ˷ͺѿĥɭδҺӻ̲Ʃãо̹ȳªzLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h5cZJLLLJM1c5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f3cDq' Ͻí}ȳ˷λѿĦʭϵӻվзʮŧϼ˶ĭμLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h7j9o2WNKLJG =,XԬ*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f3cFr(αxDz˶λѿĦʭϵӻӻγɬŦͺɴ«zELLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g7j7k5a/L)5"bJGAKl-_6f6f6f7k5b$l#GLLLFFb-_6f6f6f6f6f6f6f6f6f8m+9FLLLKGëHLLLKE{˛*]6f6f6f6f6g7j8m8m8m8m8m5j0d5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,/νƲϾŦ˯ϴԻվҹγɭŦ˷DZLLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6e"bHLLLKGĬkĎ-_6f6f6f6f6f6f6f6f6f6f6f6f6f6h6c [ILLLKJӪ*]6f6f6f6f6f7l,?HLLLKHêLw1b6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,/˸ɴǩ̰жԼԼз̱Ȫ¢Ͻů̯7LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i2VNKLLLH1];j3d6f6f6f6f6f6f6f6f6f6f6f6f6f6f8k(y/FLLLLAu4d5e6f6f6f6f7l,?HLLLJKκlβġͻʵʶʵʵ˶̹λн¡ŦƨǨǨǨŦĤĤâоλ̸˶ʶʶ˸ϼǧ־,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6f#iHLLLKEoƑ-_6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j/JLKLLLD\~Ia/`7l,?HLLLJK͸.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e=ka‡ӪԻе̯ȩ쟠áϾŤɪϳԺ\LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j&r(FLLLKEoƑ-_6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k-AILLLLD\~IW0a7l,?HLLLJK͸.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f3d/`)\0aس([6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j&s)FLLLL ?1b5e7l,?HLLLJK͸.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j1PMKLLLFAi*ڷ*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j&r(FLLLKDܻ+]6f7l,?HLLLJK͸.`5e6f6f6f6g6g6g6g6g6g6g5f5f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7h3YPKLLLI+X.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6f#iHLLLKFծ([6f7l,?HLLLJK͸,b0d0c0b-_-],[*Y*Y(W'V'V-\/_6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h4`RJLLLJ$S /a5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6f"fHLLLJJ˵Ο,`7i8p,AEJJIGG˶ϳ0CK^RcR^hugqmu~} âҶЭ9h4e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g5c!]ILLLJN4e4e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g5c!^ILLLJMh*P2U2W'x.!N"Q $R )W'T3^8g4e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i2XOKLLLI/[w @LLL ?UxAELLL ?^WKvAn=k:i6f2c.`*]([*]+]/`6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i3XOKLLLH-Z6f4e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k/JJKLLLFHo3NbLNOOO B̷y&Z/`1c3c3d4d4e5e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6f"cHLLLKIɲLw1b6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8l(y/FLLLLA|3`0T2U2U2U2U0SDjFu)p'FHE @=L.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7l)}3FLLLLA{l͟*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h5bYILLLJLԬ+_7i7i7i7i7i7i3e4j(6EKKLKHƮ.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j0PMKLLLF?h(/`5e6f6f6f6f6f6f6f6f6f6f6f6f6f8l-EHLLLLDQuABK>g+:i2c6f6f6f6f6f6f6f6f6f6f6f6f6f7i3XOKLLLBo^.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7h5b [HLLLJIѿêytdsczkmƐ+^6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6d ]ILLLGAi+.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7l-CHKLLLDOu;޾-_5f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j&s)FLLLJ"P.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6h%k!FLLLKC@n0b6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7l,=GLLLKF.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i3YS ILLLG)V`,^6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i1SMKLLLA~o.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7l-AHKLLLCSx@~͝+^6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h5bW JLLLENt:.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g7j'u+ELLLLCv֯,^5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7h%n$GLLLI&T .`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7h6e#eFLLLJGۻ/a4d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8m*8FLLLKIȱ.`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j4]!^FLLLHMͷۺ/a3c6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j0MLKLLLAz-`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k4\!^FLLLF&TмӪ.`3d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h5`REHHH?YyCٵkŏ2c6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k4\!^FLLLE'Uʴvɗ,^4d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6f(z0"e#h#h#h e4u0޿ײϣrȔ_Lw>l:i4d.`)\.`7f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j4^#gFKLLGMT|*]5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6f6f6f6f6f5e3c-_([*]-_/a1b3d4d4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j6e(y/JHLLHEwhԫ6g.`6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6g6g6g6g6g6g5e5f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h7k.HZFJLKBEl2ϻU}+]3d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8k4`({1QFJLEKqab/a/a6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7h7k3Y'x.S GHIA(U~o۹Y/a-_5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i7k3\+;#fOGC? N_Moƒ@n,^/`5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8h,LLLLLLLLLLLLLLE)~48m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7h7l6g2W,>%p& ^NDC(R Xu@zĮФ]8l6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5f6f6e5eo7gM8h$5e OcLLLLLLLLLLLLLH#e6g6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g5e5fn7gH5d!4e P LLLLLLLLLLLLLKK0N7k6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6d7g7g6fk8hB7g6f NbLLLLLLLLLLLLLG%m#7i6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6e6f7g6f6fe7g>6f5b PLLLLLLLLLLLLLKJ/K7k6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g5f_7c:4Y7hN6LLLLLLLLLLLLLH!`6e7h6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e6f[8h87g5eLuLLLLLLLLLLLLLG)58l6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g6f}5f[6f43c6fNMLLLLLLLLLLLLJM0O7l6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6c6gz7gV8h06f7gMKLLLLLLLLLLLLHX3\7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6d7f6f6fv7gQ6f*6f 6eJKLLLLLLLLLLLLF"b5a7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g5er6fM8i$5c 7fJLLLLLLLLLLLLLF#e5b7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5f6f6e5fn6fG8h$5e MLLLLLLLLLLLLLF"c3\7l6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6f6f6f6f7g7g5fk6fH5d!4e MVLLLLLLLLLLLLGX0O7l6h6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6e5a6gk8hB7g6f LLLLLLLLLLLLLHM*86f7k6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5d6f6f6fe7g>5e6gO0MLLLLLLLLLLJG"c/K7i7k6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6e6f7g7g5e_8h97g4bKMmMLLLLLLLLLGK$l"/K6f7l7i6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e6g[5a50S6hLMTMMMLLLLLKGJ!a*:2W6e7k7k6h6f6f6f6f6f6f6f6f6f6f6f6f6f7g7g6fz7fW7f33c6fMLLNL)L4NFMVKdHuGN!`(w-.H3[6e6f6f6f6f6f6d6e6g5cz6fV8h06f7g???????????????( +k|8k=ɪμʶ˷оαH "f7j6f7g7gX6f25e<оí}ůȳʵʵȳŮĮǦNH#f7j6f6f6f6f6f6f6f6f5eV5e25eưư̸ϼоѿоλ˷Į˸LLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f7g7g}7gS7g07gŰȲλѿĤƨȪȪƨãѿͺƯ̹hL"LLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6fz6fQ6f.6f+оưκƨ˯δззδˮƧ͹ĭ~α N-KLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6fz6fQ7g,7gì}̸ѿƨͲҹֿ־Ҹ̰ŦоʶDZLL8MLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7gx7gO7g,7gɩůϻã˯ҹѸʭ¡κĭ~LELLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6fu5eM5e*5e λȳоƧδֿսͲŦϼưʪLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gs7gJ7g(7g ʶʵѿǪжϴƨоDzàLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7gs7gI6f&6f ʶʵѿǩж׿δƨоDZáLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6fp6fH6f&6f ϽȲнŧͳսԼ̱ĥϼů̮LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g6fn7gE7g#6f ͰĮλâʭѸֿжɬ͹ĭ~LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6fk5eC5e"5e sĭ~˶оŦ˯ѷԼ׿ֿԼжʮĤϽɴɴ<LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6fk7gA7g 7gƥĭ~͹ѿťɬ̱δδ̱ɬĤѾ̸«{LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6ef4dʶů͹о¡ĥƧƧĤϽ̸ĭ~àMLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f^ ˸ì}ʵͺϼннϼ͹ɴ¬{ßLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7h7k8l6j1c+])[+]-_-_+]*],^.`3d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f3c ̯Ʊí}ƯDZDZůì}ȳֿLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i7k4^-Fu(k CEu{ɥػݾԭxʘbCp4d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f4dȨŸà˭LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k4]'v-Q>Rr<Űҧ*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gmnQLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k0NU BDӪ*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e( P?LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k0QNGDө*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f4dLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7h5a YHBm\ө*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f,^0!+*****)(()*****'LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8l(z0EH,Yө*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f-_LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i3ZPJAӪ*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f)\ٜ״βеееѶѷҸӺԻԻӻӺϴLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8l)~4EI'Uҩ*]6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f*]ө-ntw«{ůɳ̸ͻλͺ˸ɴuLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6e [IBhWٶdRxUzGr4d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f-_ičZwĮDz˷ѿŧʭ˰ʮɬŦͻí}LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j0OJKCêkŏ%Y-_0b0b3d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f-_gÌ{ªyưʶоǩγҸӺѸϴǪμí~ռLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f8l(|2FI(Vݽ'Z6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f2cHtí~DzͺĤ̱ԼԼʮпƱŤXLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i"cHDTx@U~.`6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f2cDrƱȳϼǨжδä̸ȳLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g7j8n4_PA8x1c5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f2cFsfλDzϽǩѸԼʭưдpLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k7h1P$w,S%R bRܻ!V.`6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f4d6f+βĮϼǩѸѸɬϼůMLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i7j/J"d@"Lt[,^1b6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5e/aĮλŦжѷȪ̹ȴ>LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k4_%o%G <WzFDq+^6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6h6g5f4e3d4e5f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f*]ȳ¡̰־ѷǪ˶̸<LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7l1U YCCvd‰*]6f6f6f6f6f6f6f6f6f6f6f6f6h7l7j5c+W(S/[9f>l8g/a*]+^0a5e6f6f6f6f6f6f6f6f6f6f6f6f-_ůμǩҸҹȫʶκ<LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k1TS FDuɗ*]6f6f6f6f6f6f6f6f6f6f7k4`+;dV VMݼ}̜R|3d*]0b6f6f6f6f6f6f6f6f6f6f3d~ʫƱ¡ͱ׿ӻɭ̸λ@LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j3[U GAqkŏ*]6f6f6f6f6f6f6f6f7k/KW@$O ԫOy3c6f6f6f6f6f6f6f6f6f6g̺ʶƧжԼ̰λͺGLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6f"cGCVzCPz.`6f6f6f6f6f6f7k0PLFLмy˙,_6f6f6f6f6f6f6f6f7g%ɴͺɫҹսγоλ@LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f8l)5EH%S2c4e6f6f6f6f6g6e ]GBuլ*]6f6f6f6f6f6f6f6f7gBȳμʮԻսδϽ9LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f7i3WNJAxIo7Lo7wjУ*\6f6f6f6f7k.EGI%Sө*]6f6f6f6f6f6f6f6f7gUȴϽ̰ռӻͲп(LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f7k%o%FF;d%8h)\&@K =JAn2c6f6f6f7k%o%FD\Iө*]6f6f6f6f6f6f6f6f7g`ɵϽ̰ԼҹʯμģLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f7j2UMKA2c0b6f8m0NMGBԬ)\6f6f6g6d [IAө*]6f6f6f6f6f6f6f6f7g`ʶϽ̰Լ׿зȬ̸ˮLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f7l'w-FH0\U}-_6f6f6f8m)}3FG%T:i4d6f7h3\QJDŭͰ|rw֮)\6f6f6f6f6f6f6f6f7gT˹Ͻ̱սֽδƨɵ[LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6h4`U IAzk)]6f6f6f6f7h5`U J @zjrǓ,^6f7j1TMJHٵ%V#Gq#\-m)qpj0b6f6f6f6f6f6f6f6f7gTʷͳֿӻ̰˶LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f7k.EGKGc‰-_6f6f6f6f6f7l(z0FH*X+^6f7j1QKJLOy/a7i7k7i3e+]1a7g6f6f6f6f6f6f6f6f7gTʶŤжѸɬ̹ʫwLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f7k&p&FG:d#8h4d6f6f6f6f6f7j0PJKBAn2d7j1QKI O=k3d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gbʶɬҹ־ͳäɵ LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6g5cXIBqa*]6f6f6f6f6f6f6h5bXIAuejŎ,_7j1QKI O7g4e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gȨͻͱսѹɬ˸жELLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f7j1RKKC~̝+]6f6f6f6f6f6f6f7j$iGEHn3ش)]7j1QKI O4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gɶǩҸԽ̲ѿϽLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f8l+=FJN\/a6f6f6f6f6f6f6f8l({1FI+X0a6j1QKI O4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gi ϵֿϵĥʷLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f7k&q'FG:c#Dq2c6f6f6f6f6f6f6f7l,@GKK@n4h1QKI O4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g&ҸλγֿзǪʶLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6g6g!aHD\~I6g5e6f6f6f6f6f6f6f7k0MIKDɳY0e1QKI O4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g̹ͱսѸȫ˷LLLLLLG#f7j6f6f6f6f6f6f6f6f6f6h4_U JAr.`6f6f6f6f6f6f6f6f7i2VNKBuɖ-b1QKI O4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gͺͱվҹɬ˸LLLLLLG#f7j6f6f6f6f6f6f6f6f6f7i2UMKB+^6f6f6f6f6f6f6f6f7i3\QJ @ԫ+`1QKI O4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g$ӺͻͲ־ҹȬ˷LLLLLLG#f7j6f6f6f6f6f6f6f6f6f7k/JHKE͸س)\6f6f6f6f6f6f6f6f6g5aW IA{l,a0QKI O4e5e6f6f6f6f6f6f6f6f6f6f5e6f6f6f6f7g_ƧϵѸǫʶLLLLLLG#f7j6f6f6f6f6f6f6f6f6f7l,?GJMѧ*]6f6f6f6f6f6f6f6f6g6d \ICl[/c0QKI O4e5e6f6f6f6f6f6f6f6f6f7f1b*]-_2c5e7gͺȫҹ϶ƨʶLLLLLLG#f7j6f6f6f6f6f6f6f6f6f8l)5FI(U}̜+^6f6f6f6f6f6f6f6f6g6g"`HC^L4h/PKI O4e5e6f6f6f6f6f6f6f6f3dCpشjŎGs1b(\ͰϽγֿսͳâ˷LLLLLLG#f7j6f6f6f6f6f6f6f6f6f8l'v,FH4_qǓ,^6f6f6f6f6f6f6f6f6f7i#dGDUyAil>LLLLLLG#f7j6f6f6f6f6f6f6f6f6f7j#fGDRv=a.`6f6f6f6f6f6f6f6f6f7j$iGELr8Bs-NKI O4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f5f4d&Z  LLLLLLG#f7j6f6f6f6f6f6f6f6f6f7j$l"GEFn1d‰.`6f6f6f6f6f6f6f6f6f7j#eGDRv>=n.OKI O4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f7k&s)FG9c#lŐ-_6f6f6f6f6f6f6f6f6g6g"aHD\~J5h/PKI O0d0c0c/b.a-`-`6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f8l)|2FI*Wwɗ,^6f6f6f6f6f6f6f6f6g6d \ICk[1i.Q@ >DBdKjSpYta}il9h5e6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f8l+=GJ OΡ+^6f6f6f6f6f6f6f6f6g5aW IA{lǨp+;~<~oy?m3d6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f7k.HHKFмխ)\6f6f6f6f6f6f6f6f7h3\QJAp2YxB?m3d6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f7j2TMKBܻ*]6f6f6f6f6f6f6f6f7j2TMKC^K;WzC?m3d6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6h4_U JAq,_6f6f6f6f6f6f6f6f7k/JHKFι=f' >WzC?m3d6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6h"bHDY|F2c5e6f6f6f6f6f6f6f8l+;FJ O!PAWzC?m3d6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f8l'u+FH4_?m3d6f6f6f6f6f6f6f8l'u+FG5`êCCWzC@m3d6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f7l-AGKJU~0a6f6f6f6f6f6f6f6h"bHCZ}Gzl@BWyB޾;j4e6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f7i2WNKAz˚+^6f6f6f6f6f6f7i3[PKAGCHIV~FѿOyEq?m9h2c.`.`5f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6g6g!_HC^L*]6f6f6f6f6f6f7l,AGKJ2]2Y2Z;gl3c6f6f6f6f6g7i"eGDPu;Ԭ*^7i7i6i0XOICĬ4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f7j1SKKBΠ(\6f6f6f6f7l/KIKCǰNx0b6f6f6f6g!aHAr4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f7h"dGDQv=Bo/`6f6f7i5d!]H ?dR+^6f6f6f6f8l'v,FDOt;4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f7l-DGJH5f+^6j6e$k!C >Ip7W/`6f6f6f6f7l-CGI)W4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6g6f!^HB^Ka‡*HX @'Uzm޿+^6f6f6f6f6f7i2WNJFι4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f7l.FGKFκ͹Bo1b6f6f6f6f6f6g6e \IA4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j%l"FEBj-oǒ*]6f6f6f6f6f6f6f7k%p&FC[~H4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i4]V HA|lԬ*]6f6f6f6f6f6f6f6f8l,=FH2]4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k0ONGDٶ,_4e6f6f6f6f6f6f6f6f7j1SIGE4e5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7l/KNEIҩ,_4d6f6f6f6f6f6f6f6f6f6g5b#f ZTܺԫ{˚^5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7l1PXBEgË)]5e6f6f6f6f6f6f6f6f6f6f6f6f6e6d5d5d2c-_*]*]+^/a6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7k4_&s)J;Su@Ԭ;j,^6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6g6g5f5e6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7i7k1S&s)LHdOŰ͞An*]3c6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7j8k5`-Hw)k <{;jjѵ޿ҩjŎGs/a+]2c6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6h7k8l7j1c+[(W+Z-\0a/a.`+^*]-_2c5f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6f6f5f5f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLG#f7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLH!`6f6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7gLLLLLLJV 5a6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g7gc7g<3cMLLLLLKK1S7j6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g5d_5e:5e5eK5LLLLLLF*97l6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f[6f66e7fNMLLLLLH"b7i6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f5eV6f47g7gOSLLLLLKJ0N7k6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6e{7fS7g07g PLLLLLLG"e7i6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g7fx7gO6c,5`O LLLLLLG+;8m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6e7g7gs7gK5e*5e L;LLLLLJM/M8m6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7g6ep6fH6g&6d K9LLLLLIP/M8m6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6fk5eC7g"6f MLLLLLIM+<7i7k6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6g6f6f6f6e6f6f6eg5c@7h 7gN8LLLLJG#e/M6h8m7j6g6f6f6f6f6f6f6f6f6f6f6f5a6fc7g<7g5dL M7M]LxLHJ!a)60P5c6f6f6e6e6f7g7g^7g85e5e????~>?????????????(0` >{$6c!J Z5b6g6f5eg7gC7g%7g áʶ̹ʵѷMIY5b6g6f6f6f6f6f6f6f6fq6f@7g 7gxβ͹Ѹ׿Ͳɵ;LI Y5b6g6f6f6f6f6f6f6f6f6f6f6f6f6f5fo6fI7g 7gλȫͰmLI Y5b6g6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6fi7gA7g7gϽǩоβiLI Y5b6g6f6f6f6f6f6f6f6f6f6f6f6f6f5e5e5f6f6f6f6f6f6f6f6f6f5ed7gA4dgԼʶ̱ҹȪɵ/LI Y5b6g6f6f6f6f6f6f6f6f6f6g8l._,Z5e6f0b4d6f6f6f6f6f6f6f6f6f6f6f.`Is ̯ʵʶ˷LI Y5b6g6f6f6f6f6f6f6f6f6g7g z-[VվW0a6f6f6f6f6f6f6f6f6f6f7f)\^LI Y5b6g6f6f6f6f6f6f6f6f7jo"Sp:hČ,_6f6f6f6f6f6f6f6f6f6f6f.`[H$'9B2'LI Y5b6g6f6f6f6f6f6f6f7j/QKbˆ-_6f6f6f6f6f6f6f6f6f6f6f.`aÊǦ̰ҹϵlLI Y5b6g6f6f6f6f6f6f6f8mp"Mm4͞?l9h5f6f6f6f6f6f6f6f6f6f6f6f1bPū}¢ϴĤѿqLI Y5b6g6f6f6f6f6f6h7l*WS!V0b6f6f6f6f6f6f6f6f6f6f6f6f6f2cEuηѹϼ LI Y5b6g6f6f6f6f7i4bu(dX̝2c2c6f6f6f7i4i+^*]*],^2c6f6f4e6gކĤ̱δģLI Y5b6g6f6f6f7h4aY {6f3d6f7j-P29Üݽ~̝Gs4e6f6f+^ʱϽϴȪLI Y5b6g6f6f6f7idiR޿-_6h0WRɷIt2c6f._NĤжˮLI Y5b6g6f6f7k,G#Nnȓ#~3Lo6a/f w*Ll3Qz1b6f6e2cbֿǧγ̱LI Y5b6g6f6f7j`p\۹%Z6iX wd-dgs_ںFWyFs3d6f6f-`aʬǩALI Y5b6g6f7h3]IªY.`7l(>,UBsdm_(],_4e6f6f6f6gnϵѷãLI Y5b6g6f7j+G'S @m3c7j0RIaŊbla.`6f6f6f6f6f9iǨƧLI Y5b6g6f8l"z-Cf)5e4e7h3[IưԨ ala.`6f6f5e4d6f-`ǨȫLI Y5b6g6f7kjZxC.`6f6g4aN a~la.`6f5e>l@p*_ʬǨLI Y5b6g6f7jamX,^6f6g5dRa~la.`6f-_kŏ~\Rhʮ¡LI Y5b6g6f7i[ yg޿+^6f6g6fUb~la.`6f-_lǒѺֿȩͱҹӻѶǨʭnLI Y5b6g6g7hX oܼ+]6f6g6gVb~la.`6f-_lǒѹƦԼƨãLI Y5b6g6g7hX rܼ+]6f6g6gVb~la.`6f-_oɕջŦϵռ˯ƨ LI Y5b6g6f7hY ~mܼ+]6f6g6fUb~la.`6f3cGsԬ۽7LI Y5b6g6f7j]ub+^6f6g5dS ^ yfX"W,^6f3d*]'\  LI Y5b6g6f7kddO-_6f6g5aNӱ,r*Աɞ̠9h5e6f4e/bLI Y5b6g6f8lq$Mn40b5e7h3[IǰkY;j4d6f6f5fLI Y5b6g6f7k(>2Y9h4d7j/QJ<`!:j4d6f6f8hLI Y5b6g6f7i1XIѾJu0b8l&83Z+{1qsΟPzKv6f6f6f6f8hLI Y5b6g6f6g7hW qө$Z2b O{ۺ.g&IH[([2c6f6f6f6f8hLI Y5b6g6f6f7l(=/Vuɖ3~:q^Pz0b5dRa.`6f6f6f6f6f8hLI Y5b6g6f6f6g6g[}iѥ*]6f7k_v^cˆ.`6f6f6f6f6f8hLI Y5b6g6f6f6f7i2[W Ԭ-_5e6f7j'x8ݿiGr/a%[IX5b7j-VCp3Z/c+RIs7nŐ,^6f,_IX5b7h4e)guɖ+b n.Π,b$CjU֯)]6f6f6f8hIX5b6g6f7k&EaWҧ.`6g1_?RΠS|2c6f6f6f8hIX5b6g6f6f7j*V>Yr΢sȕFr,^5e6f7g4h+]1b7f6f6f6f8hIX5b6g6f6f6f7h3f,_+],_2c6f6f6f6f6f6f6f6f6f6f6f8hIW 5b6h6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6fLL1S7k6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6fu6fM6f+5eO.G#g6f7j6f6f6f6f6f6f6f6f6fm6fE6f$6e MHr!^0N6h6f6dd6e>6e6f@`(0 ;'p:&:&9&P:&:&:&9%:&:&:&<(@ ;'p:(`*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*vmd@9%9%:%0(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(t(tVR:&:&9%(t(t(t(t(t(t(t^˗kϟyӨ(t(t(t(t(t(t(t(t5jB+:&:&:(`(t(t(t(t(t5}(t(t(t(t(t(t(t(t(t?cߑ:&:&:&:(`(t(t(t(t(tرPƎ(t(t(t(t(t(t(t(t(t(t9&P:&:&:&(t(t(t(tܺPƎ(t(t(tܺܺ(t(t:&:&:&(t(t(tPƎ(tPƎOWI\ϐ:&:&:&:&(t(tyӨ(t^˗(t^˗(twZ::&:&:&:&:&:(`(t(tkϟ(t(t5}^˗ܺ(t images/assistant-128.png images/assistant.png images/close.png images/designer.png images/linguist.png images/mac/addtab.png images/mac/book.png images/mac/closetab.png images/mac/editcopy.png images/mac/find.png images/mac/home.png images/mac/next.png images/mac/prev.png images/mac/print.png images/mac/synctoc.png images/mac/whatsthis.png images/mac/zoomin.png images/mac/zoomout.png images/qt.png images/win/addtab.png images/win/book.png images/win/closetab.png images/win/editcopy.png images/win/find.png images/win/home.png images/win/next.png images/win/previous.png images/win/print.png images/win/synctoc.png images/win/whatsthis.png images/win/zoomin.png images/win/zoomout.png images/wrap.png qt-assistant-qassistantclient-library-compat-version-4.6.3/assistant.rc 777 0 0 55 11406632726 21520 0IDI_ICON1 ICON DISCARDABLE "assistant.ico" qt-assistant-qassistantclient-library-compat-version-4.6.3/compat.pro 777 0 0 3417 11410372602 21220 0TEMPLATE = app LANGUAGE = C++ TARGET = assistant_adp CONFIG += qt warn_on unix:contains(QT_CONFIG, dbus):QT += dbus build_all:!build_pass { CONFIG -= build_all CONFIG += release } QT += xml network PROJECTNAME = Assistant FORMS += helpdialog.ui \ mainwindow.ui \ tabbedbrowser.ui \ topicchooser.ui SOURCES += main.cpp \ helpwindow.cpp \ topicchooser.cpp \ docuparser.cpp \ index.cpp \ profile.cpp \ config.cpp \ helpdialog.cpp \ mainwindow.cpp \ tabbedbrowser.cpp \ fontsettingsdialog.cpp \ fontpanel.cpp HEADERS += helpwindow.h \ topicchooser.h \ docuparser.h \ index.h \ profile.h \ helpdialog.h \ mainwindow.h \ tabbedbrowser.h \ config.h \ fontsettingsdialog.h \ fontpanel.h RESOURCES += assistant.qrc contains(QT_PRODUCT, OpenSource.*):DEFINES *= QT_OPENSOURCE DEFINES += QT_KEYWORDS win32 { LIBS += -lshell32 RC_FILE = assistant.rc } mac { ICON = assistant.icns TARGET = Assistant_adp } TRANSLATIONS = translations/assistant_adp_de.ts \ translations/assistant_adp_ja.ts \ translations/assistant_adp_pl.ts \ translations/assistant_adp_ru.ts \ translations/assistant_adp_zh_CN.ts \ translations/assistant_adp_zh_TW.ts unix:!contains(QT_CONFIG, zlib):LIBS += -lz contains(CONFIG, static): { win32 { exists($$[QT_INSTALL_PLUGINS]/imageformats/qjpeg.lib) { QTPLUGIN += qjpeg DEFINES += USE_STATIC_JPEG_PLUGIN } } else { exists($$[QT_INSTALL_PLUGINS]/imageformats/qjpeg.a) { QTPLUGIN += qjpeg DEFINES += USE_STATIC_JPEG_PLUGIN } } } qt-assistant-qassistantclient-library-compat-version-4.6.3/config.cpp 777 0 0 36461 11406632726 21224 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "config.h" #include "profile.h" #include "docuparser.h" #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE static Config *static_configuration = 0; inline QString getVersionString() { return QString::number( (QT_VERSION >> 16) & 0xff ) + QLatin1String(".") + QString::number( (QT_VERSION >> 8) & 0xff ); } Config::Config() : profil( 0 ), hideSidebar( false ), rebuildDocs(true) { if( !static_configuration ) { static_configuration = this; } else { qWarning( "Multiple configurations not allowed!" ); } } Config *Config::loadConfig(const QString &profileFileName) { Config *config = new Config(); if (profileFileName.isEmpty()) { // no profile if (!config->defaultProfileExists()) { config->profil = Profile::createDefaultProfile(); config->saveProfile(config->profil); } else { config->profil = new Profile(); } config->loadDefaultProfile(); config->load(); return config; } QFile file(profileFileName); if (!file.exists()) { qWarning( "File does not exist: %s", qPrintable(profileFileName) ); return 0; } DocuParser *parser = DocuParser::createParser( profileFileName ); if (!parser) { qWarning( "Failed to create parser for file: %s", qPrintable(profileFileName) ); return 0; } if (parser->parserVersion() < DocuParser::Qt320) { qWarning( "File does not contain profile information" ); return 0; } DocuParser320 *profileParser = static_cast(parser); parser->parse(&file); config->profil = profileParser->profile(); if (!config->profil) { qWarning( "Config::loadConfig(), no profile in: %s", qPrintable(profileFileName) ); return 0; } config->profil->setProfileType(Profile::UserProfile); config->profil->setDocuParser(profileParser); config->load(); return config; } Config *Config::configuration() { Q_ASSERT( static_configuration ); return static_configuration; } void Config::load() { const QString key = getVersionString() + QLatin1String("/"); bool isDefaultProfile = profil->props[QLatin1String("name")] == QLatin1String("default"); const QString pKey = isDefaultProfile ? QString::fromLatin1(QT_VERSION_STR) : getVersionString(); const QString profkey = pKey + QLatin1String("/Profile/") + profil->props[QLatin1String("name")] + QLatin1String("/"); QSettings settings; home = profil->props[QLatin1String("startpage")];; if (home.isEmpty() && isDefaultProfile) home = QLibraryInfo::location(QLibraryInfo::DocumentationPath) + QLatin1String("/html/index.html"); src = settings.value( profkey + QLatin1String("Source") ).toStringList(); sideBar = settings.value( key + QLatin1String("SideBarPage") ).toInt(); if (qApp->type() != QApplication::Tty) winGeometry = settings.value(key + QLatin1String("windowGeometry")).toByteArray(); mainWinState = settings.value(key + QLatin1String("MainWindowState")).toByteArray(); pointFntSize = settings.value(key + QLatin1String("FontSize"), qApp->font().pointSizeF()).toDouble(); rebuildDocs = settings.value( key + QLatin1String("RebuildDocDB"), true ).toBool(); profileNames = settings.value( key + QLatin1String("Profile") ).toStringList(); m_fontSettings.windowFont = qVariantValue(settings.value(key + QLatin1String("windowfont"), qApp->font())); m_fontSettings.browserFont = qVariantValue(settings.value(key + QLatin1String("browserfont"), qApp->font())); m_fontSettings.useWindowFont = settings.value(key + QLatin1String("usewindowfont"), false).toBool(); m_fontSettings.useBrowserFont = settings.value(key + QLatin1String("usebrowserfont"), false).toBool(); m_fontSettings.windowWritingSystem = static_cast( settings.value(key + QLatin1String("windowwritingsystem"), QFontDatabase::Latin).toInt()); m_fontSettings.browserWritingSystem = static_cast( settings.value(key + QLatin1String("browserwritingsystem"), QFontDatabase::Latin).toInt()); m_fontSettings.browserFont.setPointSizeF(pointFntSize); } void Config::save() { saveSettings(); saveProfile( profil ); } void Config::saveSettings() { const QString key = getVersionString() + QLatin1String("/"); const QString pKey = (profil->props[QLatin1String("name")] == QLatin1String("default")) ? QString::fromLatin1(QT_VERSION_STR) : getVersionString(); const QString profkey = pKey + QLatin1String("/Profile/") + profil->props[QLatin1String("name")] + QLatin1String("/"); QSettings settings; settings.setValue( profkey + QLatin1String("Source"), src ); settings.setValue( key + QLatin1String("SideBarPage"), sideBarPage() ); if (qApp->type() != QApplication::Tty) settings.setValue(key + QLatin1String("windowGeometry"), winGeometry); settings.setValue( key + QLatin1String("MainWindowState"), mainWinState ); settings.setValue( key + QLatin1String("FontSize"), pointFntSize); settings.setValue( key + QLatin1String("RebuildDocDB"), rebuildDocs ); settings.setValue(key + QLatin1String("windowfont"), m_fontSettings.windowFont); settings.setValue(key + QLatin1String("browserfont"), m_fontSettings.browserFont); settings.setValue(key + QLatin1String("usewindowfont"), m_fontSettings.useWindowFont); settings.setValue(key + QLatin1String("usebrowserfont"), m_fontSettings.useBrowserFont); settings.setValue(key + QLatin1String("windowwritingsystem"), m_fontSettings.windowWritingSystem); settings.setValue(key + QLatin1String("browserwritingsystem"), m_fontSettings.browserWritingSystem); } #ifdef ASSISTANT_DEBUG static void dumpmap( const QMap &m, const QString &header ) { qDebug( header ); QMap::ConstIterator it = m.begin(); while (it != m.end()) { qDebug( " " + it.key() + ":\t\t" + *it ); ++it; } } #endif bool Config::defaultProfileExists() { QSettings settings; const QString profKey = QLatin1String(QT_VERSION_STR) + QLatin1String("/Profile/default/"); if (settings.contains(profKey + QLatin1String("DocFiles")) && settings.contains(profKey + QLatin1String("Titles")) && settings.contains(profKey + QLatin1String("ImageDirs"))) { QStringList dcfs = settings.value(profKey + QLatin1String("DocFiles") ).toStringList(); foreach (QString file, dcfs) { if (file == Profile::storableFilePath(file)) return true; } } return false; } void Config::loadDefaultProfile() { QSettings settings; const QString profKey = QLatin1String(QT_VERSION_STR) + QLatin1String("/Profile/default/"); if (!defaultProfileExists()) return; // Override the defaults with settings in registry. profil->icons.clear(); profil->indexPages.clear(); profil->imageDirs.clear(); profil->docs.clear(); profil->dcfTitles.clear(); QStringList titles = settings.value( profKey + QLatin1String("Titles") ).toStringList(); QStringList iconLst = settings.value( profKey + QLatin1String("DocIcons") ).toStringList(); QStringList indexLst = settings.value( profKey + QLatin1String("IndexPages") ).toStringList(); QStringList imgDirLst = settings.value( profKey + QLatin1String("ImageDirs") ).toStringList(); QStringList dcfs = settings.value( profKey + QLatin1String("DocFiles") ).toStringList(); profil->props[QLatin1String("name")] = QLatin1String("default"); QString filePath; QStringList::ConstIterator it = titles.constBegin(); QStringList::ConstIterator iconIt = iconLst.constBegin(); QStringList::ConstIterator indexIt = indexLst.constBegin(); QStringList::ConstIterator imageIt = imgDirLst.constBegin(); QStringList::ConstIterator dcfIt = dcfs.constBegin(); while((it != titles.constEnd()) && (iconIt != iconLst.constEnd()) && (indexIt != indexLst.constEnd()) && (imageIt != imgDirLst.constEnd()) && (dcfIt != dcfs.constEnd())) { profil->addDCFIcon( *it, *iconIt ); profil->addDCFIndexPage(*it, Profile::loadableFilePath(*indexIt)); profil->addDCFImageDir( *it, *imageIt ); profil->addDCFTitle(Profile::loadableFilePath(*dcfIt), *it); ++it, ++iconIt, ++indexIt, ++imageIt, ++dcfIt; } #if ASSISTANT_DEBUG dumpmap( profil->icons, QLatin1String("Icons") ); dumpmap( profil->indexPages, QLatin1String("IndexPages") ); dumpmap( profil->imageDirs, QLatin1String("ImageDirs") ); dumpmap( profil->dcfTitles, QLatin1String("dcfTitles") ); qDebug( "Docfiles: \n " + profil->docs.join( "\n " ) ); #endif } void Config::saveProfile( Profile *profile ) { if (profil->profileType() == Profile::UserProfile) return; const QString key = (profile->props[QLatin1String("name")] == QLatin1String("default")) ? QString::fromLatin1(QT_VERSION_STR) : getVersionString(); const QString profKey = key + QLatin1String("/Profile/") + profile->props[QLatin1String("name")] + QLatin1String("/"); QString path = QLibraryInfo::location(QLibraryInfo::DocumentationPath).replace(QLatin1String("\\"), QLatin1String("/")); QStringList indexes, icons, imgDirs, dcfs; QStringList titles = profile->dcfTitles.keys(); QStringList::ConstIterator it = titles.constBegin(); QString filePath; for ( ; it != titles.constEnd(); ++it ) { indexes << Profile::storableFilePath(profile->indexPages[*it]); icons << profile->icons[*it]; imgDirs << profile->imageDirs[*it]; dcfs << Profile::storableFilePath(profile->dcfTitles[*it]); } QSettings settings; settings.setValue( profKey + QLatin1String("Titles"), titles ); settings.setValue( profKey + QLatin1String("DocFiles"), dcfs ); settings.setValue( profKey + QLatin1String("IndexPages"), indexes ); settings.setValue( profKey + QLatin1String("DocIcons"), icons ); settings.setValue( profKey + QLatin1String("ImageDirs"), imgDirs ); #if ASSISTANT_DEBUG qDebug() << "Titles:\n - " << ((QStringList*)&titles)->join("\n - "); qDebug() << "Docfiles:\n - " << dcfs.join("\n - " ); qDebug() << "IndexPages:\n - " << indexes.join("\n - "); qDebug() << "DocIcons:\n - " << icons.join("\n - " ); qDebug() << "ImageDirs:\n - " << imgDirs.join("\n - " ); #endif } QStringList Config::mimePaths() { static QStringList lst; if( lst.count() > 0 ) return lst; for (QMap::ConstIterator it = profil->dcfTitles.constBegin(); it != profil->dcfTitles.constEnd(); ++it ) { // Mime source for .dcf file path QFileInfo info( *it ); QString dcfPath = info.absolutePath(); if (!lst.contains(dcfPath)) lst << dcfPath; // Image dir for .dcf QString imgDir = QDir::toNativeSeparators( dcfPath + QDir::separator() + profil->imageDirs[it.key()] ); if (!lst.contains(imgDir)) lst << imgDir; } return lst; } QStringList Config::profiles() const { return profileNames; } QString Config::title() const { QString s = profil->props[QLatin1String("title")]; if (s.isEmpty()) s = QObject::tr("Qt Assistant by Nokia"); return s; } QString Config::aboutApplicationMenuText() const { return profil->props[QLatin1String("aboutmenutext")]; } QString Config::aboutURL() const { return profil->props[QLatin1String("abouturl")]; } QString Config::homePage() const { return home.isEmpty() ? profil->props[QLatin1String("startpage")] : home; } QStringList Config::source() const { return src.size() == 0 ? QStringList(profil->props[QLatin1String("startpage")]) : src; } QStringList Config::docFiles() const { return profil->docs; } QPixmap Config::docIcon( const QString &title ) const { // ### To allow qdoc generated dcf files to reference the doc icons from qmake_image_col QString name = profil->icons[title]; QString resName = QLatin1String(":/trolltech/assistant/images/") + name; if (QFile::exists(resName)) return QPixmap(resName); if (name.startsWith(QLatin1String("file:"))) name = name.mid(5); return QPixmap(name); } QPixmap Config::applicationIcon() const { QString name = profil->props[QLatin1String("applicationicon")]; QString resName = QLatin1String(":/trolltech/assistant/images/") + name; if (QFile::exists(resName)) return QPixmap(resName); if (name.startsWith(QLatin1String("file:"))) name = name.mid(5); return QPixmap(name); } QStringList Config::docTitles() const { return QStringList(profil->indexPages.keys()); } QString Config::docImageDir( const QString &docfile ) const { return profil->imageDirs[docfile]; } QString Config::indexPage( const QString &title ) const { return profil->indexPages[title]; } void Config::hideSideBar( bool b ) { hideSidebar = b; } bool Config::sideBarHidden() const { return hideSidebar; } QString Config::assistantDocPath() const { return profil->props[QLatin1String("assistantdocs")].isEmpty() ? QLibraryInfo::location(QLibraryInfo::DocumentationPath) + QLatin1String("/html") : profil->props[QLatin1String("assistantdocs")]; } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/config.h 777 0 0 12006 11406632726 20656 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef CONFIG_H #define CONFIG_H #include "profile.h" #include #include #include #include #include #include QT_BEGIN_NAMESPACE class Profile; struct FontSettings { FontSettings() : useWindowFont(false), useBrowserFont(false), windowWritingSystem(QFontDatabase::Latin), browserWritingSystem(QFontDatabase::Latin) { } QFont windowFont; QFont browserFont; bool useWindowFont; bool useBrowserFont; QFontDatabase::WritingSystem windowWritingSystem; QFontDatabase::WritingSystem browserWritingSystem; }; class Config { public: Config(); void load(); void save(); Profile *profile() const { return profil; } QString profileName() const { return profil->props[QLatin1String("name")]; } bool validProfileName() const; void hideSideBar( bool b ); bool sideBarHidden() const; QStringList mimePaths(); // From profile, read only QStringList docFiles() const; QStringList docTitles() const; QString indexPage( const QString &title ) const; QString docImageDir( const QString &title ) const; QPixmap docIcon( const QString &title ) const; QStringList profiles() const; QString title() const; QString aboutApplicationMenuText() const; QString aboutURL() const; QPixmap applicationIcon() const; // From QSettings, read / write QString homePage() const; void setHomePage( const QString &hom ) { home = hom; } QStringList source() const; void setSource( const QStringList &s ) { src = s; } int sideBarPage() const { return sideBar; } void setSideBarPage( int sbp ) { sideBar = sbp; } QByteArray windowGeometry() const { return winGeometry; } void setWindowGeometry( const QByteArray &geometry ) { winGeometry = geometry; } QByteArray mainWindowState() const { return mainWinState; } void setMainWindowState( const QByteArray &state ) { mainWinState = state; } qreal fontPointSize() const { return pointFntSize; } void setFontPointSize(qreal size) { pointFntSize = size; m_fontSettings.useBrowserFont = true; m_fontSettings.browserFont.setPointSizeF(size); } FontSettings fontSettings() { return m_fontSettings; } void setFontSettings(const FontSettings &settings) { m_fontSettings = settings; } QString assistantDocPath() const; bool docRebuild() const { return rebuildDocs; } void setDocRebuild( bool rb ) { rebuildDocs = rb; } void saveProfile( Profile *profile ); void loadDefaultProfile(); bool defaultProfileExists(); static Config *configuration(); static Config *loadConfig(const QString &profileFileName); private: Config( const Config &c ); Config& operator=( const Config &c ); void saveSettings(); private: Profile *profil; QStringList profileNames; QString home; QStringList src; QByteArray mainWinState; QByteArray winGeometry; qreal pointFntSize; int sideBar; bool hideSidebar; bool rebuildDocs; FontSettings m_fontSettings; }; QT_END_NAMESPACE #endif // CONFIG_H qt-assistant-qassistantclient-library-compat-version-4.6.3/docuparser.cpp 777 0 0 27270 11406632726 22124 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "docuparser.h" #include "profile.h" #include #include #include #include #include #include QT_BEGIN_NAMESPACE QDataStream &operator>>(QDataStream &s, ContentItem &ci) { s >> ci.title; s >> ci.reference; s >> ci.depth; return s; } QDataStream &operator<<(QDataStream &s, const ContentItem &ci) { s << ci.title; s << ci.reference; s << ci.depth; return s; } const QString DocuParser::DocumentKey = QLatin1String("/Qt Assistant/") + QLatin1String(QT_VERSION_STR) + QLatin1String("/"); DocuParser *DocuParser::createParser(const QString &fileName) { QFile file(fileName); if(!file.open(QFile::ReadOnly)) { return 0; } QString str; int maxlen = 1024; int majVer = 0, minVer = 0, serVer = 0; static QRegExp re(QLatin1String("assistantconfig +version=\"(\\d)\\.(\\d)\\.(\\d)\""), Qt::CaseInsensitive); Q_ASSERT(re.isValid()); while(!(str = QLatin1String(file.readLine(maxlen))).isEmpty()) { if(re.indexIn(str) >= 0) { majVer = re.cap(1).toInt(); minVer = re.cap(2).toInt(); serVer = re.cap(3).toInt(); break; } } if (majVer < 3 || (majVer == 3 && minVer < 2)) { return new DocuParser310; } return new DocuParser320; } bool DocuParser::parse(QFile *file) { QXmlInputSource source(file); QXmlSimpleReader reader; reader.setContentHandler(this); reader.setErrorHandler(this); setFileName(QFileInfo(*file).absoluteFilePath()); return reader.parse(source); } QString DocuParser::errorProtocol() const { return errorProt; } QList DocuParser::getContentItems() { return contentList; } QList DocuParser::getIndexItems() { return indexList; } QString DocuParser::absolutify(const QString &name, bool makeUrl) const { if (!name.isEmpty()) { QString s = name; s.replace(QLatin1String("\\"), QLatin1String("/")); QFileInfo orgPath(name); if(orgPath.isRelative()) s = QFileInfo(fname).path() + QLatin1Char('/') + name; if (makeUrl) s.prepend(QLatin1String("file:")); return s; } return name; } void DocuParser310::addTo(Profile *p) { p->addDCFTitle(fname, docTitle); p->addDCFIcon(docTitle, iconName); p->addDCFIndexPage(docTitle, conURL); } bool DocuParser310::startDocument() { state = StateInit; errorProt = QLatin1String(""); contentRef = QLatin1String(""); indexRef = QLatin1String(""); depth = 0; contentList.clear(); qDeleteAll(indexList); indexList.clear(); return true; } bool DocuParser310::startElement(const QString &, const QString &, const QString &qname, const QXmlAttributes &attr) { if (qname == QLatin1String("DCF") && state == StateInit) { state = StateContent; contentRef = absolutify(attr.value(QLatin1String("ref")), false); conURL = contentRef; docTitle = attr.value(QLatin1String("title")); iconName = absolutify(attr.value(QLatin1String("icon")), false); contentList.append(ContentItem(docTitle, absolutify(contentRef), depth)); } else if (qname == QLatin1String("section") && (state == StateContent || state == StateSect)) { state = StateSect; contentRef = absolutify(attr.value(QLatin1String("ref"))); title = attr.value(QLatin1String("title")); depth++; contentList.append(ContentItem(title, contentRef, depth)); } else if (qname == QLatin1String("keyword") && state == StateSect) { state = StateKeyword; indexRef = absolutify(attr.value(QLatin1String("ref"))); } else return false; return true; } bool DocuParser310::endElement(const QString &nameSpace, const QString &localName, const QString &qName) { Q_UNUSED(nameSpace); Q_UNUSED(localName); Q_UNUSED(qName); switch(state) { case StateInit: break; case StateContent: state = StateInit; break; case StateSect: state = --depth ? StateSect : StateContent; break; case StateKeyword: state = StateSect; break; default: break; } return true; } bool DocuParser310::characters(const QString& ch) { QString str = ch.simplified(); if (str.isEmpty()) return true; switch (state) { case StateInit: case StateContent: case StateSect: return false; break; case StateKeyword: indexList.append(new IndexItem(str, indexRef)); break; default: return false; } return true; } bool DocuParser310::fatalError(const QXmlParseException& exception) { errorProt += QString::fromLatin1("fatal parsing error: %1 in line %2, column %3\n") .arg(exception.message()) .arg(exception.lineNumber()) .arg(exception.columnNumber()); return QXmlDefaultHandler::fatalError(exception); } DocuParser320::DocuParser320() : prof(new Profile) { } void DocuParser320::addTo(Profile *p) { QMap::ConstIterator it; for (it = prof->dcfTitles.constBegin(); it != prof->dcfTitles.constEnd(); ++it) p->dcfTitles[it.key()] = *it; for (it = prof->icons.constBegin(); it != prof->icons.constEnd(); ++it) p->icons[it.key()] = *it; for (it = prof->indexPages.constBegin(); it != prof->indexPages.constEnd(); ++it) p->indexPages[it.key()] = *it; } bool DocuParser320::startDocument() { state = StateInit; errorProt = QLatin1String(""); contentRef = QLatin1String(""); indexRef = QLatin1String(""); depth = 0; contentList.clear(); indexList.clear(); prof->addDCF(fname); return true; } bool DocuParser320::startElement(const QString &, const QString &, const QString &qname, const QXmlAttributes &attr) { QString lower = qname.toLower(); switch(state) { case StateInit: if(lower == QLatin1String("assistantconfig")) state = StateDocRoot; break; case StateDocRoot: if(lower == QLatin1String("dcf")) { state = StateContent; contentRef = absolutify(attr.value(QLatin1String("ref"))); conURL = contentRef; docTitle = attr.value(QLatin1String("title")); iconName = absolutify(attr.value(QLatin1String("icon"))); contentList.append(ContentItem(docTitle, contentRef, depth)); } else if(lower == QLatin1String("profile")) { state = StateProfile; } break; case StateSect: if (lower == QLatin1String("keyword") && state == StateSect) { state = StateKeyword; indexRef = absolutify(attr.value(QLatin1String("ref"))); break; } // else if (lower == "section") case StateContent: if(lower == QLatin1String("section")) { state = StateSect; contentRef = absolutify(attr.value(QLatin1String("ref"))); title = attr.value(QLatin1String("title")); depth++; contentList.append(ContentItem(title, contentRef, depth)); } break; case StateProfile: if(lower == QLatin1String("property")) { state = StateProperty; propertyName = attr.value(QLatin1String("name")); } break; case StateProperty: break; default: break; } return true; } bool DocuParser320::endElement(const QString &nameSpace, const QString &localName, const QString &qName) { Q_UNUSED(nameSpace); Q_UNUSED(localName); Q_UNUSED(qName); switch(state) { case StateInit: break; case StateDocRoot: state = StateInit; break; case StateProfile: state = StateDocRoot; break; case StateProperty: state = StateProfile; if(propertyName.isEmpty() || propertyValue.isEmpty()) return false; { static const QStringList lst = QStringList() << QLatin1String("startpage") << QLatin1String("abouturl") << QLatin1String("applicationicon") << QLatin1String("assistantdocs"); if (lst.contains(propertyName)) propertyValue = absolutify(propertyValue); } prof->addProperty(propertyName, propertyValue); break; case StateContent: if(!iconName.isEmpty()) prof->addDCFIcon(docTitle, iconName); if(contentRef.isEmpty()) return false; prof->addDCFIndexPage(docTitle, conURL); prof->addDCFTitle(fname, docTitle); state = StateDocRoot; break; case StateSect: state = --depth ? StateSect : StateContent; break; case StateKeyword: state = StateSect; break; } return true; } bool DocuParser320::characters(const QString& ch) { QString str = ch.simplified(); if (str.isEmpty()) return true; switch (state) { case StateInit: case StateContent: case StateSect: return false; break; case StateKeyword: indexList.append(new IndexItem(str, indexRef)); break; case StateProperty: propertyValue = ch; break; default: return false; } return true; } bool DocuParser320::fatalError(const QXmlParseException& exception) { errorProt += QString::fromLatin1("fatal parsing error: %1 in line %2, column %3\n") .arg(exception.message()) .arg(exception.lineNumber()) .arg(exception.columnNumber()); return QXmlDefaultHandler::fatalError(exception); } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/docuparser.h 777 0 0 12200 11406632726 21554 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef DOCUPARSER_H #define DOCUPARSER_H #include #include #include #include #include QT_BEGIN_NAMESPACE class Profile; struct ContentItem { ContentItem() : title( QString() ), reference( QString() ), depth( 0 ) {} ContentItem( const QString &t, const QString &r, int d ) : title( t ), reference( r ), depth( d ) {} QString title; QString reference; int depth; Q_DUMMY_COMPARISON_OPERATOR(ContentItem) }; QDataStream &operator>>( QDataStream &s, ContentItem &ci ); QDataStream &operator<<( QDataStream &s, const ContentItem &ci ); struct IndexItem { IndexItem( const QString &k, const QString &r ) : keyword( k ), reference( r ) {} QString keyword; QString reference; }; class DocuParser : public QXmlDefaultHandler { public: enum ParserVersion { Qt310, Qt320 }; // Since We don't want problems with documentation // from version to version, this string stores the correct // version string to save documents. static const QString DocumentKey; static DocuParser *createParser( const QString &fileName ); virtual bool parse( QFile *file ); QList getContentItems(); QList getIndexItems(); QString errorProtocol() const; QString contentsURL() const { return conURL; } virtual ParserVersion parserVersion() const = 0; virtual void addTo( Profile *p ) = 0; QString fileName() const { return fname; } void setFileName( const QString &file ) { fname = file; } protected: QString absolutify( const QString &input, bool makeUrl = true ) const; QString contentRef, indexRef, errorProt, conURL; QString docTitle, title, iconName; QList contentList; QList indexList; QString fname; }; class DocuParser310 : public DocuParser { public: enum States{ StateInit, StateContent, StateSect, StateKeyword }; bool startDocument(); bool startElement( const QString&, const QString&, const QString& , const QXmlAttributes& ); bool endElement( const QString&, const QString&, const QString& ); bool characters( const QString & ); bool fatalError( const QXmlParseException& exception ); virtual ParserVersion parserVersion() const { return Qt310; } virtual void addTo( Profile *p ); private: States state; int depth; }; class DocuParser320 : public DocuParser { public: enum States { StateInit, StateDocRoot, StateProfile, StateProperty, StateContent, StateSect, StateKeyword }; DocuParser320(); bool startDocument(); bool startElement( const QString&, const QString&, const QString& , const QXmlAttributes& ); bool endElement( const QString&, const QString&, const QString& ); bool characters( const QString & ); bool fatalError( const QXmlParseException& exception ); virtual ParserVersion parserVersion() const { return Qt320; } virtual void addTo( Profile *p ); Profile *profile() const { return prof; } private: States state; int depth; int docfileCounter; QString propertyValue; QString propertyName; Profile *prof; }; QT_END_NAMESPACE #endif // DOCUPARSER_H qt-assistant-qassistantclient-library-compat-version-4.6.3/features/ 777 0 0 0 11410366600 20742 5qt-assistant-qassistantclient-library-compat-version-4.6.3/features/assistant.prf 777 0 0 320 11244537266 23537 0 INCLUDEPATH = $$QMAKE_INCDIR_QT/QtAssistant $$INCLUDEPATH mac:!static:contains(QT_CONFIG, qt_framework) { qtAddLibrary(QtAssistant) } else { qtAddLibrary(QtAssistantClient) } QT += network qt-assistant-qassistantclient-library-compat-version-4.6.3/fontpanel.cpp 777 0 0 24656 11406632726 21750 0/****************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "fontpanel.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE FontPanel::FontPanel(QWidget *parentWidget) : QGroupBox(parentWidget), m_previewLineEdit(new QLineEdit), m_writingSystemComboBox(new QComboBox), m_familyComboBox(new QFontComboBox), m_styleComboBox(new QComboBox), m_pointSizeComboBox(new QComboBox), m_previewFontUpdateTimer(0) { setTitle(tr("Font")); QFormLayout *formLayout = new QFormLayout(this); // writing systems m_writingSystemComboBox->setEditable(false); QList writingSystems = m_fontDatabase.writingSystems(); writingSystems.push_front(QFontDatabase::Any); foreach (QFontDatabase::WritingSystem ws, writingSystems) m_writingSystemComboBox->addItem(QFontDatabase::writingSystemName(ws), QVariant(ws)); connect(m_writingSystemComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotWritingSystemChanged(int))); formLayout->addRow(tr("&Writing system"), m_writingSystemComboBox); connect(m_familyComboBox, SIGNAL(currentFontChanged(QFont)), this, SLOT(slotFamilyChanged(QFont))); formLayout->addRow(tr("&Family"), m_familyComboBox); m_styleComboBox->setEditable(false); connect(m_styleComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotStyleChanged(int))); formLayout->addRow(tr("&Style"), m_styleComboBox); m_pointSizeComboBox->setEditable(false); connect(m_pointSizeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotPointSizeChanged(int))); formLayout->addRow(tr("&Point size"), m_pointSizeComboBox); m_previewLineEdit->setReadOnly(true); formLayout->addRow(m_previewLineEdit); setWritingSystem(QFontDatabase::Any); } QFont FontPanel::selectedFont() const { QFont rc = m_familyComboBox->currentFont(); const QString family = rc.family(); rc.setPointSize(pointSize()); const QString styleDescription = styleString(); if (styleDescription.contains(QLatin1String("Italic"))) rc.setStyle(QFont::StyleItalic); else if (styleDescription.contains(QLatin1String("Oblique"))) rc.setStyle(QFont::StyleOblique); else rc.setStyle(QFont::StyleNormal); rc.setBold(m_fontDatabase.bold(family, styleDescription)); // Weight < 0 asserts... const int weight = m_fontDatabase.weight(family, styleDescription); if (weight >= 0) rc.setWeight(weight); return rc; } void FontPanel::setSelectedFont(const QFont &f) { m_familyComboBox->setCurrentFont(f); if (m_familyComboBox->currentIndex() < 0) { // family not in writing system - find the corresponding one? QList familyWritingSystems = m_fontDatabase.writingSystems(f.family()); if (familyWritingSystems.empty()) return; setWritingSystem(familyWritingSystems.front()); m_familyComboBox->setCurrentFont(f); } updateFamily(family()); const int pointSizeIndex = closestPointSizeIndex(f.pointSize()); m_pointSizeComboBox->setCurrentIndex( pointSizeIndex); const QString styleString = m_fontDatabase.styleString(f); const int styleIndex = m_styleComboBox->findText(styleString); m_styleComboBox->setCurrentIndex(styleIndex); slotUpdatePreviewFont(); } QFontDatabase::WritingSystem FontPanel::writingSystem() const { const int currentIndex = m_writingSystemComboBox->currentIndex(); if ( currentIndex == -1) return QFontDatabase::Latin; return static_cast(m_writingSystemComboBox->itemData(currentIndex).toInt()); } QString FontPanel::family() const { const int currentIndex = m_familyComboBox->currentIndex(); return currentIndex != -1 ? m_familyComboBox->currentFont().family() : QString(); } int FontPanel::pointSize() const { const int currentIndex = m_pointSizeComboBox->currentIndex(); return currentIndex != -1 ? m_pointSizeComboBox->itemData(currentIndex).toInt() : 9; } QString FontPanel::styleString() const { const int currentIndex = m_styleComboBox->currentIndex(); return currentIndex != -1 ? m_styleComboBox->itemText(currentIndex) : QString(); } void FontPanel::setWritingSystem(QFontDatabase::WritingSystem ws) { m_writingSystemComboBox->setCurrentIndex(m_writingSystemComboBox->findData(QVariant(ws))); updateWritingSystem(ws); } void FontPanel::slotWritingSystemChanged(int) { updateWritingSystem(writingSystem()); delayedPreviewFontUpdate(); } void FontPanel::slotFamilyChanged(const QFont &) { updateFamily(family()); delayedPreviewFontUpdate(); } void FontPanel::slotStyleChanged(int) { updatePointSizes(family(), styleString()); delayedPreviewFontUpdate(); } void FontPanel::slotPointSizeChanged(int) { delayedPreviewFontUpdate(); } void FontPanel::updateWritingSystem(QFontDatabase::WritingSystem ws) { m_previewLineEdit->setText(QFontDatabase::writingSystemSample(ws)); m_familyComboBox->setWritingSystem (ws); // Current font not in WS ... set index 0. if (m_familyComboBox->currentIndex() < 0) { m_familyComboBox->setCurrentIndex(0); updateFamily(family()); } } void FontPanel::updateFamily(const QString &family) { // Update styles and trigger update of point sizes. // Try to maintain selection or select normal const QString oldStyleString = styleString(); const QStringList styles = m_fontDatabase.styles(family); const bool hasStyles = !styles.empty(); m_styleComboBox->setCurrentIndex(-1); m_styleComboBox->clear(); m_styleComboBox->setEnabled(hasStyles); int normalIndex = -1; const QString normalStyle = QLatin1String("Normal"); if (hasStyles) { foreach (const QString &style, styles) { // try to maintain selection or select 'normal' preferably const int newIndex = m_styleComboBox->count(); m_styleComboBox->addItem(style); if (oldStyleString == style) { m_styleComboBox->setCurrentIndex(newIndex); } else { if (oldStyleString == normalStyle) normalIndex = newIndex; } } if (m_styleComboBox->currentIndex() == -1 && normalIndex != -1) m_styleComboBox->setCurrentIndex(normalIndex); } updatePointSizes(family, styleString()); } int FontPanel::closestPointSizeIndex(int desiredPointSize) const { // try to maintain selection or select closest. int closestIndex = -1; int closestAbsError = 0xFFFF; const int pointSizeCount = m_pointSizeComboBox->count(); for (int i = 0; i < pointSizeCount; i++) { const int itemPointSize = m_pointSizeComboBox->itemData(i).toInt(); const int absError = qAbs(desiredPointSize - itemPointSize); if (absError < closestAbsError) { closestIndex = i; closestAbsError = absError; if (closestAbsError == 0) break; } else { // past optimum if (absError > closestAbsError) { break; } } } return closestIndex; } void FontPanel::updatePointSizes(const QString &family, const QString &styleString) { const int oldPointSize = pointSize(); QList pointSizes = m_fontDatabase.pointSizes(family, styleString); if (pointSizes.empty()) pointSizes = QFontDatabase::standardSizes(); const bool hasSizes = !pointSizes.empty(); m_pointSizeComboBox->clear(); m_pointSizeComboBox->setEnabled(hasSizes); m_pointSizeComboBox->setCurrentIndex(-1); // try to maintain selection or select closest. if (hasSizes) { QString n; foreach (int pointSize, pointSizes) m_pointSizeComboBox->addItem(n.setNum(pointSize), QVariant(pointSize)); const int closestIndex = closestPointSizeIndex(oldPointSize); if (closestIndex != -1) m_pointSizeComboBox->setCurrentIndex(closestIndex); } } void FontPanel::slotUpdatePreviewFont() { m_previewLineEdit->setFont(selectedFont()); } void FontPanel::delayedPreviewFontUpdate() { if (!m_previewFontUpdateTimer) { m_previewFontUpdateTimer = new QTimer(this); connect(m_previewFontUpdateTimer, SIGNAL(timeout()), this, SLOT(slotUpdatePreviewFont())); m_previewFontUpdateTimer->setInterval(0); m_previewFontUpdateTimer->setSingleShot(true); } if (m_previewFontUpdateTimer->isActive()) return; m_previewFontUpdateTimer->start(); } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/fontpanel.h 777 0 0 6727 11406632726 21374 0/******************************************************************* ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists for the convenience // of the Qt tools. This header // file may change from version to version without notice, or even be removed. // // We mean it. // #ifndef FONTPANEL_H #define FONTPANEL_H #include #include #include QT_BEGIN_NAMESPACE class QComboBox; class QFontComboBox; class QTimer; class QLineEdit; class FontPanel: public QGroupBox { Q_OBJECT public: FontPanel(QWidget *parentWidget = 0); QFont selectedFont() const; void setSelectedFont(const QFont &); QFontDatabase::WritingSystem writingSystem() const; void setWritingSystem(QFontDatabase::WritingSystem ws); private slots: void slotWritingSystemChanged(int); void slotFamilyChanged(const QFont &); void slotStyleChanged(int); void slotPointSizeChanged(int); void slotUpdatePreviewFont(); private: QString family() const; QString styleString() const; int pointSize() const; int closestPointSizeIndex(int ps) const; void updateWritingSystem(QFontDatabase::WritingSystem ws); void updateFamily(const QString &family); void updatePointSizes(const QString &family, const QString &style); void delayedPreviewFontUpdate(); QFontDatabase m_fontDatabase; QLineEdit *m_previewLineEdit; QComboBox *m_writingSystemComboBox; QFontComboBox* m_familyComboBox; QComboBox *m_styleComboBox; QComboBox *m_pointSizeComboBox; QTimer *m_previewFontUpdateTimer; }; QT_END_NAMESPACE #endif // FONTPANEL_H qt-assistant-qassistantclient-library-compat-version-4.6.3/fontsettingsdialog.cpp 777 0 0 12237 11406632726 23661 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "fontsettingsdialog.h" #include "fontpanel.h" #include "config.h" #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE FontSettingsDialog::FontSettingsDialog(QWidget *parent) : QDialog(parent) , m_windowFontPanel(new FontPanel(this)) , m_browserFontPanel(new FontPanel(this)) , m_dialogButtonBox(new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel)) { setModal(true); setWindowTitle(tr("Font Settings")); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); QVBoxLayout *mainVLayout = new QVBoxLayout(this); QHBoxLayout *hboxLayout = new QHBoxLayout; mainVLayout->addLayout(hboxLayout); QLabel *label = new QLabel(tr("Font settings for:"), this); label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); hboxLayout->addWidget(label); QComboBox *comboBox = new QComboBox(this); comboBox->addItem(tr("Browser")); comboBox->addItem(tr("Application")); hboxLayout->addWidget(comboBox); m_windowFontPanel->setCheckable(true); m_browserFontPanel->setCheckable(true); const QString customSettings(tr("Use custom settings")); m_windowFontPanel->setTitle(customSettings); m_browserFontPanel->setTitle(customSettings); QStackedWidget *stackWidget = new QStackedWidget(this); stackWidget->addWidget(m_browserFontPanel); stackWidget->addWidget(m_windowFontPanel); mainVLayout->addWidget(stackWidget); mainVLayout->addWidget(m_dialogButtonBox); connect(m_dialogButtonBox , SIGNAL(rejected()), this, SLOT(reject())); connect(m_dialogButtonBox , SIGNAL(accepted()), this, SLOT(accept())); connect(comboBox, SIGNAL(activated(int)), stackWidget, SLOT(setCurrentIndex(int))); } FontSettingsDialog::~FontSettingsDialog() { // nothing todo } bool FontSettingsDialog::showDialog(FontSettings *settings) { setupFontSettingsDialog(settings); if (exec() != Accepted) return false; updateFontSettings(settings); return true; } void FontSettingsDialog::updateFontSettings(FontSettings *settings) { settings->useWindowFont = m_windowFontPanel->isChecked(); settings->useBrowserFont = m_browserFontPanel->isChecked(); settings->windowFont = settings->useWindowFont ? m_windowFontPanel->selectedFont() : qApp->font(); settings->browserFont = settings->useBrowserFont ? m_browserFontPanel->selectedFont() : qApp->font(); settings->windowWritingSystem = settings->useWindowFont ? m_windowFontPanel->writingSystem() : QFontDatabase::Latin; settings->browserWritingSystem = settings->useBrowserFont ? m_browserFontPanel->writingSystem() : QFontDatabase::Latin; } void FontSettingsDialog::setupFontSettingsDialog(const FontSettings *settings) { m_windowFontPanel->setSelectedFont(settings->windowFont); m_browserFontPanel->setSelectedFont(settings->browserFont); m_windowFontPanel->setWritingSystem(settings->windowWritingSystem); m_browserFontPanel->setWritingSystem(settings->browserWritingSystem); m_windowFontPanel->setChecked(settings->useWindowFont); m_browserFontPanel->setChecked(settings->useBrowserFont); } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/fontsettingsdialog.h 777 0 0 5117 11406632726 23305 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef _FONT_SETTINGS_DIALOG_H_ #define _FONT_SETTINGS_DIALOG_H_ #include #include QT_BEGIN_NAMESPACE class FontPanel; struct FontSettings; class QDialogButtonBox; class FontSettingsDialog : public QDialog { Q_OBJECT public: FontSettingsDialog(QWidget *parent = 0); ~FontSettingsDialog(); bool showDialog(FontSettings *settings); private: void updateFontSettings(FontSettings *settings); void setupFontSettingsDialog(const FontSettings *settings); private: FontPanel *m_windowFontPanel; FontPanel *m_browserFontPanel; QDialogButtonBox *m_dialogButtonBox; }; #endif // _FONT_SETTINGS_DIALOG_H_ QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/helpdialog.cpp 777 0 0 123132 11406632726 22077 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "helpdialog.h" #include "helpwindow.h" #include "topicchooser.h" #include "docuparser.h" #include "mainwindow.h" #include "config.h" #include "tabbedbrowser.h" #include #include #include #include #include QT_BEGIN_NAMESPACE enum { LinkRole = Qt::UserRole + 1000 }; static bool verifyDirectory(const QString &str) { QFileInfo dirInfo(str); if (!dirInfo.exists()) return QDir().mkdir(str); if (!dirInfo.isDir()) { qWarning("'%s' exists but is not a directory", str.toLatin1().constData()); return false; } return true; } struct IndexKeyword { IndexKeyword(const QString &kw, const QString &l) : keyword(kw), link(l) {} IndexKeyword() : keyword(QString()), link(QString()) {} bool operator<(const IndexKeyword &ik) const { return keyword.toLower() < ik.keyword.toLower(); } bool operator<=(const IndexKeyword &ik) const { return keyword.toLower() <= ik.keyword.toLower(); } bool operator>(const IndexKeyword &ik) const { return keyword.toLower() > ik.keyword.toLower(); } Q_DUMMY_COMPARISON_OPERATOR(IndexKeyword) QString keyword; QString link; }; QDataStream &operator>>(QDataStream &s, IndexKeyword &ik) { s >> ik.keyword; s >> ik.link; return s; } QDataStream &operator<<(QDataStream &s, const IndexKeyword &ik) { s << ik.keyword; s << ik.link; return s; } QValidator::State SearchValidator::validate(QString &str, int &) const { for (int i = 0; i < (int) str.length(); ++i) { QChar c = str[i]; if (!c.isLetterOrNumber() && c != QLatin1Char('\'') && c != QLatin1Char('`') && c != QLatin1Char('\"') && c != QLatin1Char(' ') && c != QLatin1Char('-') && c != QLatin1Char('_') && c!= QLatin1Char('*')) return QValidator::Invalid; } return QValidator::Acceptable; } class IndexListModel: public QStringListModel { public: IndexListModel(QObject *parent = 0) : QStringListModel(parent) {} void clear() { contents.clear(); setStringList(QStringList()); } QString description(int index) const { return stringList().at(index); } QStringList links(int index) const { return contents.values(stringList().at(index)); } void addLink(const QString &description, const QString &link) { contents.insert(description, link); } void publish() { filter(QString(), QString()); } QModelIndex filter(const QString &s, const QString &real); virtual Qt::ItemFlags flags(const QModelIndex &index) const { return QStringListModel::flags(index) & ~Qt::ItemIsEditable; } private: QMultiMap contents; }; bool caseInsensitiveLessThan(const QString &as, const QString &bs) { const QChar *a = as.unicode(); const QChar *b = bs.unicode(); if (a == 0) return true; if (b == 0) return false; if (a == b) return false; int l=qMin(as.length(),bs.length()); while (l-- && QChar::toLower(a->unicode()) == QChar::toLower(b->unicode())) a++,b++; if (l==-1) return (as.length() < bs.length()); return QChar::toLower(a->unicode()) < QChar::toLower(b->unicode()); } /** * \a real is kinda a hack for the smart search, need a way to match a regexp to an item * How would you say the best match for Q.*Wiget is QWidget? */ QModelIndex IndexListModel::filter(const QString &s, const QString &real) { QStringList list; int goodMatch = -1; int perfectMatch = -1; if (s.isEmpty()) perfectMatch = 0; const QRegExp regExp(s, Qt::CaseInsensitive); QMultiMap::iterator it = contents.begin(); QString lastKey; for (; it != contents.end(); ++it) { if (it.key() == lastKey) continue; lastKey = it.key(); const QString key = it.key(); if (key.contains(regExp) || key.contains(s, Qt::CaseInsensitive)) { list.append(key); if (perfectMatch == -1 && (key.startsWith(real, Qt::CaseInsensitive))) { if (goodMatch == -1) goodMatch = list.count() - 1; if (real.length() == key.length()){ perfectMatch = list.count() - 1; } } else if (perfectMatch > -1 && s == key) { perfectMatch = list.count() - 1; } } } int bestMatch = perfectMatch; if (bestMatch == -1) bestMatch = goodMatch; bestMatch = qMax(0, bestMatch); // sort the new list QString match; if (bestMatch >= 0 && list.count() > bestMatch) match = list[bestMatch]; qSort(list.begin(), list.end(), caseInsensitiveLessThan); setStringList(list); for (int i = 0; i < list.size(); ++i) { if (list.at(i) == match){ bestMatch = i; break; } } return index(bestMatch, 0, QModelIndex()); } HelpNavigationListItem::HelpNavigationListItem(QListWidget *ls, const QString &txt) : QListWidgetItem(txt, ls) { } void HelpNavigationListItem::addLink(const QString &link) { QString lnk = HelpDialog::removeAnchorFromLink(link); if (linkList.filter(lnk, Qt::CaseInsensitive).count() > 0) return; linkList << link; } HelpDialog::HelpDialog(QWidget *parent, MainWindow *h) : QWidget(parent), lwClosed(false), help(h) { ui.setupUi(this); ui.listContents->setUniformRowHeights(true); ui.listContents->header()->setStretchLastSection(false); ui.listContents->header()->setResizeMode(QHeaderView::ResizeToContents); ui.listBookmarks->setUniformRowHeights(true); ui.listBookmarks->header()->setStretchLastSection(false); ui.listBookmarks->header()->setResizeMode(QHeaderView::ResizeToContents); indexModel = new IndexListModel(this); ui.listIndex->setModel(indexModel); ui.listIndex->setLayoutMode(QListView::Batched); ui.listBookmarks->setItemHidden(ui.listBookmarks->headerItem(), true); ui.listContents->setItemHidden(ui.listContents->headerItem(), true); ui.searchButton->setShortcut(QKeySequence(Qt::ALT|Qt::SHIFT|Qt::Key_S)); } void HelpDialog::initialize() { connect(ui.tabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int))); connect(ui.listContents, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(showTopic(QTreeWidgetItem*))); connect(ui.listContents, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showTreeItemMenu(QPoint))); ui.listContents->viewport()->installEventFilter(this); connect(ui.editIndex, SIGNAL(returnPressed()), this, SLOT(showTopic())); connect(ui.editIndex, SIGNAL(textEdited(QString)), this, SLOT(searchInIndex(QString))); connect(ui.listIndex, SIGNAL(activated(QModelIndex)), this, SLOT(showTopic())); connect(ui.listIndex, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showIndexItemMenu(QPoint))); connect(ui.listBookmarks, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(showTopic(QTreeWidgetItem*))); connect(ui.listBookmarks, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showTreeItemMenu(QPoint))); connect(ui.termsEdit, SIGNAL(textChanged(QString)), this, SLOT(updateSearchButton(QString))); connect(ui.resultBox, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showListItemMenu(QPoint))); cacheFilesPath = QDir::homePath() + QLatin1String("/.assistant"); //### Find a better location for the dbs ui.editIndex->installEventFilter(this); ui.framePrepare->hide(); connect(qApp, SIGNAL(lastWindowClosed()), SLOT(lastWinClosed())); ui.termsEdit->setValidator(new SearchValidator(ui.termsEdit)); actionOpenCurrentTab = new QAction(this); actionOpenCurrentTab->setText(tr("Open Link in Current Tab")); actionOpenLinkInNewWindow = new QAction(this); actionOpenLinkInNewWindow->setText(tr("Open Link in New Window")); actionOpenLinkInNewTab = new QAction(this); actionOpenLinkInNewTab->setText(tr("Open Link in New Tab")); itemPopup = new QMenu(this); itemPopup->addAction(actionOpenCurrentTab); itemPopup->addAction(actionOpenLinkInNewWindow); itemPopup->addAction(actionOpenLinkInNewTab); ui.tabWidget->setElideMode(Qt::ElideNone); contentList.clear(); initDoneMsgShown = false; fullTextIndex = 0; indexDone = false; titleMapDone = false; contentsInserted = false; bookmarksInserted = false; setupTitleMap(); } void HelpDialog::processEvents() { qApp->processEvents(QEventLoop::ExcludeUserInputEvents); } void HelpDialog::lastWinClosed() { lwClosed = true; } void HelpDialog::removeOldCacheFiles(bool onlyFulltextSearchIndex) { if (!verifyDirectory(cacheFilesPath)) { qWarning("Failed to created assistant directory"); return; } QString pname = QLatin1String(".") + Config::configuration()->profileName(); QStringList fileList; fileList << QLatin1String("indexdb40.dict") << QLatin1String("indexdb40.doc"); if (!onlyFulltextSearchIndex) fileList << QLatin1String("indexdb40") << QLatin1String("contentdb40"); QStringList::iterator it = fileList.begin(); for (; it != fileList.end(); ++it) { if (QFile::exists(cacheFilesPath + QDir::separator() + *it + pname)) { QFile f(cacheFilesPath + QDir::separator() + *it + pname); f.remove(); } } } void HelpDialog::timerEvent(QTimerEvent *e) { Q_UNUSED(e); static int opacity = 255; help->setWindowOpacity((opacity-=4)/255.0); if (opacity<=0) qApp->quit(); } void HelpDialog::loadIndexFile() { if (indexDone) return; setCursor(Qt::WaitCursor); indexDone = true; ui.labelPrepare->setText(tr("Prepare...")); ui.framePrepare->show(); processEvents(); QProgressBar *bar = ui.progressPrepare; bar->setMaximum(100); bar->setValue(0); keywordDocuments.clear(); QList lst; QFile indexFile(cacheFilesPath + QDir::separator() + QLatin1String("indexdb40.") + Config::configuration()->profileName()); if (!indexFile.open(QFile::ReadOnly)) { buildKeywordDB(); processEvents(); if (lwClosed) return; if (!indexFile.open(QFile::ReadOnly)) { QMessageBox::warning(help, tr("Qt Assistant"), tr("Failed to load keyword index file\n" "Assistant will not work!")); #if defined Q_WS_WIN || defined Q_WS_MACX startTimer(50); #endif return; } } QDataStream ds(&indexFile); quint32 fileAges; ds >> fileAges; if (fileAges != getFileAges()) { indexFile.close(); buildKeywordDB(); if (!indexFile.open(QFile::ReadOnly)) { QMessageBox::warning(help, tr("Qt Assistant"), tr("Cannot open the index file %1").arg(QFileInfo(indexFile).absoluteFilePath())); return; } ds.setDevice(&indexFile); ds >> fileAges; } ds >> lst; indexFile.close(); bar->setValue(bar->maximum()); processEvents(); for (int i=0; iaddLink(idx.keyword, idx.link); keywordDocuments << HelpDialog::removeAnchorFromLink(idx.link); } indexModel->publish(); ui.framePrepare->hide(); showInitDoneMessage(); setCursor(Qt::ArrowCursor); } quint32 HelpDialog::getFileAges() { QStringList addDocuFiles = Config::configuration()->docFiles(); QStringList::const_iterator i = addDocuFiles.constBegin(); quint32 fileAges = 0; for (; i != addDocuFiles.constEnd(); ++i) { QFileInfo fi(*i); if (fi.exists()) fileAges += fi.lastModified().toTime_t(); } return fileAges; } void HelpDialog::buildKeywordDB() { QStringList addDocuFiles = Config::configuration()->docFiles(); QStringList::iterator i = addDocuFiles.begin(); // Set up an indeterminate progress bar. ui.labelPrepare->setText(tr("Prepare...")); ui.progressPrepare->setMaximum(0); ui.progressPrepare->setMinimum(0); ui.progressPrepare->setValue(0); processEvents(); QList lst; quint32 fileAges = 0; for (i = addDocuFiles.begin(); i != addDocuFiles.end(); ++i) { QFile file(*i); if (!file.exists()) { QMessageBox::warning(this, tr("Warning"), tr("Documentation file %1 does not exist!\n" "Skipping file.").arg(QFileInfo(file).absoluteFilePath())); continue; } fileAges += QFileInfo(file).lastModified().toTime_t(); DocuParser *handler = DocuParser::createParser(*i); bool ok = handler->parse(&file); file.close(); if (!ok){ QString msg = QString::fromLatin1("In file %1:\n%2") .arg(QFileInfo(file).absoluteFilePath()) .arg(handler->errorProtocol()); QMessageBox::critical(this, tr("Parse Error"), tr(msg.toUtf8())); delete handler; continue; } QList indLst = handler->getIndexItems(); int counter = 0; foreach (IndexItem *indItem, indLst) { QFileInfo fi(indItem->reference); lst.append(IndexKeyword(indItem->keyword, indItem->reference)); if (++counter%100 == 0) { if (ui.progressPrepare) ui.progressPrepare->setValue(counter); processEvents(); if (lwClosed) { return; } } } delete handler; } if (!lst.isEmpty()) qSort(lst); QFile indexout(cacheFilesPath + QDir::separator() + QLatin1String("indexdb40.") + Config::configuration()->profileName()); if (verifyDirectory(cacheFilesPath) && indexout.open(QFile::WriteOnly)) { QDataStream s(&indexout); s << fileAges; s << lst; indexout.close(); } } void HelpDialog::setupTitleMap() { if (titleMapDone) return; bool needRebuild = false; if (Config::configuration()->profileName() == QLatin1String("default")) { const QStringList docuFiles = Config::configuration()->docFiles(); for (QStringList::ConstIterator it = docuFiles.begin(); it != docuFiles.end(); ++it) { if (!QFile::exists(*it)) { Config::configuration()->saveProfile(Profile::createDefaultProfile()); Config::configuration()->loadDefaultProfile(); needRebuild = true; break; } } } if (Config::configuration()->docRebuild() || needRebuild) { removeOldCacheFiles(); Config::configuration()->setDocRebuild(false); Config::configuration()->saveProfile(Config::configuration()->profile()); } if (contentList.isEmpty()) getAllContents(); titleMapDone = true; titleMap.clear(); for (QList >::Iterator it = contentList.begin(); it != contentList.end(); ++it) { ContentList lst = (*it).second; foreach (ContentItem item, lst) { titleMap[item.reference] = item.title.trimmed(); } } processEvents(); } void HelpDialog::getAllContents() { QFile contentFile(cacheFilesPath + QDir::separator() + QLatin1String("contentdb40.") + Config::configuration()->profileName()); contentList.clear(); if (!contentFile.open(QFile::ReadOnly)) { buildContentDict(); return; } QDataStream ds(&contentFile); quint32 fileAges; ds >> fileAges; if (fileAges != getFileAges()) { contentFile.close(); removeOldCacheFiles(true); buildContentDict(); return; } QString key; QList lst; while (!ds.atEnd()) { ds >> key; ds >> lst; contentList += qMakePair(key, QList(lst)); } contentFile.close(); processEvents(); } void HelpDialog::buildContentDict() { QStringList docuFiles = Config::configuration()->docFiles(); quint32 fileAges = 0; for (QStringList::iterator it = docuFiles.begin(); it != docuFiles.end(); ++it) { QFile file(*it); if (!file.exists()) { QMessageBox::warning(this, tr("Warning"), tr("Documentation file %1 does not exist!\n" "Skipping file.").arg(QFileInfo(file).absoluteFilePath())); continue; } fileAges += QFileInfo(file).lastModified().toTime_t(); DocuParser *handler = DocuParser::createParser(*it); if (!handler) { QMessageBox::warning(this, tr("Warning"), tr("Documentation file %1 is not compatible!\n" "Skipping file.").arg(QFileInfo(file).absoluteFilePath())); continue; } bool ok = handler->parse(&file); file.close(); if (ok) { contentList += qMakePair(*it, QList(handler->getContentItems())); delete handler; } else { QString msg = QString::fromLatin1("In file %1:\n%2") .arg(QFileInfo(file).absoluteFilePath()) .arg(handler->errorProtocol()); QMessageBox::critical(this, tr("Parse Error"), tr(msg.toUtf8())); continue; } } QFile contentOut(cacheFilesPath + QDir::separator() + QLatin1String("contentdb40.") + Config::configuration()->profileName()); if (contentOut.open(QFile::WriteOnly)) { QDataStream s(&contentOut); s << fileAges; for (QList >::Iterator it = contentList.begin(); it != contentList.end(); ++it) { s << *it; } contentOut.close(); } } void HelpDialog::currentTabChanged(int index) { QString s = ui.tabWidget->widget(index)->objectName(); if (s == QLatin1String("indexPage")) QTimer::singleShot(0, this, SLOT(loadIndexFile())); else if (s == QLatin1String("bookmarkPage")) insertBookmarks(); else if (s == QLatin1String("contentPage")) QTimer::singleShot(0, this, SLOT(insertContents())); else if (s == QLatin1String("searchPage")) QTimer::singleShot(0, this, SLOT(setupFullTextIndex())); } void HelpDialog::showInitDoneMessage() { if (initDoneMsgShown) return; initDoneMsgShown = true; help->statusBar()->showMessage(tr("Done"), 3000); } void HelpDialog::showTopic(QTreeWidgetItem *item) { if (item) showTopic(); } void HelpDialog::showTopic() { QString tabName = ui.tabWidget->currentWidget()->objectName(); if (tabName == QLatin1String("indexPage")) showIndexTopic(); else if (tabName == QLatin1String("bookmarkPage")) showBookmarkTopic(); else if (tabName == QLatin1String("contentPage")) showContentsTopic(); } void HelpDialog::showIndexTopic() { int row = ui.listIndex->currentIndex().row(); if (row == -1 || row >= indexModel->rowCount()) return; QString description = indexModel->description(row); QStringList links = indexModel->links(row); bool blocked = ui.editIndex->blockSignals(true); ui.editIndex->setText(description); ui.editIndex->blockSignals(blocked); if (links.count() == 1) { emit showLink(links.first()); } else { qSort(links); QStringList::Iterator it = links.begin(); QStringList linkList; QStringList linkNames; for (; it != links.end(); ++it) { linkList << *it; linkNames << titleOfLink(*it); } QString link = TopicChooser::getLink(this, linkNames, linkList, description); if (!link.isEmpty()) emit showLink(link); } ui.listIndex->setCurrentIndex(indexModel->index(indexModel->stringList().indexOf(description))); ui.listIndex->scrollTo(ui.listIndex->currentIndex(), QAbstractItemView::PositionAtTop); } void HelpDialog::searchInIndex(const QString &searchString) { QRegExp atoz(QLatin1String("[A-Z]")); int matches = searchString.count(atoz); if (matches > 0 && !searchString.contains(QLatin1String(".*"))) { int start = 0; QString newSearch; for (; matches > 0; --matches) { int match = searchString.indexOf(atoz, start+1); if (match <= start) continue; newSearch += searchString.mid(start, match-start); newSearch += QLatin1String(".*"); start = match; } newSearch += searchString.mid(start); ui.listIndex->setCurrentIndex(indexModel->filter(newSearch, searchString)); } else ui.listIndex->setCurrentIndex(indexModel->filter(searchString, searchString)); } QString HelpDialog::titleOfLink(const QString &link) { QString s = HelpDialog::removeAnchorFromLink(link); s = titleMap[s]; if (s.isEmpty()) return link; return s; } bool HelpDialog::eventFilter(QObject * o, QEvent * e) { if (o == ui.editIndex && e->type() == QEvent::KeyPress) { switch (static_cast(e)->key()) { case Qt::Key_Up: case Qt::Key_Down: case Qt::Key_PageDown: case Qt::Key_PageUp: QApplication::sendEvent(ui.listIndex, e); break; default: break; } } else if (o == ui.listContents->viewport()) { if (e->type() == QEvent::MouseButtonRelease) { QMouseEvent *me = static_cast(e); if (me->button() == Qt::LeftButton) { QTreeWidgetItem *item = ui.listContents->itemAt(me->pos()); QRect vRect = ui.listContents->visualItemRect(item); // only show topic if we clicked an item if (item && vRect.contains(me->pos())) showTopic(item); } } } return QWidget::eventFilter(o, e); } void HelpDialog::addBookmark() { if (!bookmarksInserted) insertBookmarks(); QString link = help->browsers()->currentBrowser()->source().toString(); QString title = help->browsers()->currentBrowser()->documentTitle(); if (title.isEmpty()) title = titleOfLink(link); QTreeWidgetItem *i = new QTreeWidgetItem(ui.listBookmarks, 0); i->setText(0, title); i->setData(0, LinkRole, link); ui.buttonRemove->setEnabled(true); saveBookmarks(); help->updateBookmarkMenu(); } void HelpDialog::on_buttonAdd_clicked() { addBookmark(); } void HelpDialog::on_buttonRemove_clicked() { if (!ui.listBookmarks->currentItem()) return; delete ui.listBookmarks->currentItem(); saveBookmarks(); if (ui.listBookmarks->topLevelItemCount() != 0) { ui.listBookmarks->setCurrentItem(ui.listBookmarks->topLevelItem(0)); } ui.buttonRemove->setEnabled(ui.listBookmarks->topLevelItemCount() > 0); help->updateBookmarkMenu(); } void HelpDialog::insertBookmarks() { if (bookmarksInserted) return; bookmarksInserted = true; ui.listBookmarks->clear(); QFile f(cacheFilesPath + QDir::separator() + QLatin1String("bookmarks.") + Config::configuration()->profileName()); if (!f.open(QFile::ReadOnly)) return; QTextStream ts(&f); while (!ts.atEnd()) { QTreeWidgetItem *i = new QTreeWidgetItem(ui.listBookmarks, 0); i->setText(0, ts.readLine()); i->setData(0, LinkRole, ts.readLine()); } ui.buttonRemove->setEnabled(ui.listBookmarks->topLevelItemCount() > 0); help->updateBookmarkMenu(); showInitDoneMessage(); } void HelpDialog::showBookmarkTopic() { if (!ui.listBookmarks->currentItem()) return; QTreeWidgetItem *i = (QTreeWidgetItem*)ui.listBookmarks->currentItem(); emit showLink(i->data(0, LinkRole).toString()); } static void store(QTreeWidgetItem *i, QTextStream &ts) { ts << i->text(0) << endl; ts << i->data(0, LinkRole).toString() << endl; for (int index = 0; index < i->childCount(); ++index) store(i->child(index), ts); } static void store(QTreeWidget *tw, QTextStream &ts) { for (int index = 0; index < tw->topLevelItemCount(); ++index) store(tw->topLevelItem(index), ts); } void HelpDialog::saveBookmarks() { QFile f(cacheFilesPath + QDir::separator() + QLatin1String("bookmarks.") + Config::configuration()->profileName()); if (!f.open(QFile::WriteOnly)) return; QTextStream ts(&f); store(ui.listBookmarks, ts); f.close(); } void HelpDialog::insertContents() { #ifdef Q_WS_MAC static const QLatin1String IconPath(":/trolltech/assistant/images/mac/book.png"); #else static const QLatin1String IconPath(":/trolltech/assistant/images/win/book.png"); #endif if (contentsInserted) return; if (contentList.isEmpty()) getAllContents(); contentsInserted = true; ui.listContents->clear(); setCursor(Qt::WaitCursor); if (!titleMapDone) setupTitleMap(); #if 0 // ### port me ui.listContents->setSorting(-1); #endif for (QList >::Iterator it = contentList.begin(); it != contentList.end(); ++it) { QTreeWidgetItem *newEntry = 0; QTreeWidgetItem *contentEntry = 0; QStack stack; stack.clear(); int depth = 0; bool root = false; const int depthSize = 32; QVarLengthArray lastItem(depthSize); ContentList lst = (*it).second; for (ContentList::ConstIterator it = lst.constBegin(); it != lst.constEnd(); ++it) { ContentItem item = *it; if (item.depth == 0) { lastItem[0] = 0; newEntry = new QTreeWidgetItem(ui.listContents, 0); newEntry->setIcon(0, QIcon(IconPath)); newEntry->setText(0, item.title); newEntry->setData(0, LinkRole, item.reference); stack.push(newEntry); depth = 1; root = true; } else{ if ((item.depth > depth) && root) { depth = item.depth; stack.push(contentEntry); } if (item.depth == depth) { if (lastItem.capacity() == depth) lastItem.resize(depth + depthSize); contentEntry = new QTreeWidgetItem(stack.top(), lastItem[ depth ]); lastItem[ depth ] = contentEntry; contentEntry->setText(0, item.title); contentEntry->setData(0, LinkRole, item.reference); } else if (item.depth < depth) { stack.pop(); depth--; item = *(--it); } } } processEvents(); } setCursor(Qt::ArrowCursor); showInitDoneMessage(); } void HelpDialog::showContentsTopic() { QTreeWidgetItem *i = (QTreeWidgetItem*)ui.listContents->currentItem(); if (!i) return; emit showLink(i->data(0, LinkRole).toString()); } QTreeWidgetItem * HelpDialog::locateLink(QTreeWidgetItem *item, const QString &link) { QTreeWidgetItem *child = 0; #ifdef Q_OS_WIN Qt::CaseSensitivity checkCase = Qt::CaseInsensitive; #else Qt::CaseSensitivity checkCase = Qt::CaseSensitive; #endif for (int i = 0, childCount = item->childCount(); ichild(i); ///check whether it is this item if (link.startsWith(child->data(0, LinkRole).toString(), checkCase)) break; //check if the link is a child of this item else if (child->childCount()) { child = locateLink(child, link); if (child) break; } child = 0; } return child; } void HelpDialog::locateContents(const QString &link) { //ensure the TOC is filled if (!contentsInserted) insertContents(); #ifdef Q_OS_WIN Qt::CaseSensitivity checkCase = Qt::CaseInsensitive; #else Qt::CaseSensitivity checkCase = Qt::CaseSensitive; #endif QString findLink(link); //Installations on a windows local drive will give the 'link' as //and the contents in the TOC will be . //But on others the 'link' of format //and the contents in the TOC will be . if (findLink.contains(QLatin1String("file:///"))) { if (findLink[9] == QLatin1Char(':')) //on windows drives findLink.replace(0, 8, QLatin1String("file:")); else findLink.replace(0, 8, QLatin1String("file:/")); } bool topLevel = false; QTreeWidgetItem *item = 0; int totalItems = ui.listContents->topLevelItemCount(); for (int i = 0; i < totalItems; i++ ) { // first see if we are one of the top level items item = (QTreeWidgetItem*)ui.listContents->topLevelItem(i); if (findLink.startsWith(item->data(0, LinkRole).toString(), checkCase)) { topLevel = true; break; } } if (!topLevel) { // now try to find it in the sublevel items for (int n = 0; n < totalItems; ++n) { item = (QTreeWidgetItem*)ui.listContents->topLevelItem(n); item = locateLink(item, findLink); if (item) break; } } //remove the old selection QList selected = ui.listContents->selectedItems(); foreach(QTreeWidgetItem *sel, selected) ui.listContents->setItemSelected(sel, false); //set the TOC item and show ui.listContents->setCurrentItem(item); ui.listContents->setItemSelected(item, true); ui.listContents->scrollToItem(item); } void HelpDialog::toggleContents() { if (!isVisible() || ui.tabWidget->currentIndex() != 0) { ui.tabWidget->setCurrentIndex(0); parentWidget()->show(); } else parentWidget()->hide(); } void HelpDialog::toggleIndex() { if (!isVisible() || ui.tabWidget->currentIndex() != 1 || !ui.editIndex->hasFocus()) { ui.tabWidget->setCurrentIndex(1); parentWidget()->show(); ui.editIndex->setFocus(); } else parentWidget()->hide(); } void HelpDialog::toggleBookmarks() { if (!isVisible() || ui.tabWidget->currentIndex() != 2) { ui.tabWidget->setCurrentIndex(2); parentWidget()->show(); } else parentWidget()->hide(); } void HelpDialog::toggleSearch() { if (!isVisible() || ui.tabWidget->currentIndex() != 3) { ui.tabWidget->setCurrentIndex(3); parentWidget()->show(); } else parentWidget()->hide(); } void HelpDialog::setupFullTextIndex() { if (fullTextIndex) return; QString pname = Config::configuration()->profileName(); fullTextIndex = new Index(QStringList(), QDir::homePath()); // ### Is this correct ? if (!verifyDirectory(cacheFilesPath)) { QMessageBox::warning(help, tr("Qt Assistant"), tr("Failed to save fulltext search index\n" "Assistant will not work!")); return; } fullTextIndex->setDictionaryFile(cacheFilesPath + QDir::separator() + QLatin1String("indexdb40.dict.") + pname); fullTextIndex->setDocListFile(cacheFilesPath + QDir::separator() + QLatin1String("indexdb40.doc.") + pname); processEvents(); connect(fullTextIndex, SIGNAL(indexingProgress(int)), this, SLOT(setIndexingProgress(int))); QFile f(cacheFilesPath + QDir::separator() + QLatin1String("indexdb40.dict.") + pname); if (!f.exists()) { QString doc; QSet documentSet; QMap::ConstIterator it = titleMap.constBegin(); for (; it != titleMap.constEnd(); ++it) { doc = HelpDialog::removeAnchorFromLink(it.key()); if (!doc.isEmpty()) documentSet.insert(doc); } loadIndexFile(); for ( QStringList::Iterator it = keywordDocuments.begin(); it != keywordDocuments.end(); ++it ) { if (!(*it).isEmpty()) documentSet.insert(*it); } fullTextIndex->setDocList( documentSet.toList() ); help->statusBar()->clearMessage(); setCursor(Qt::WaitCursor); ui.labelPrepare->setText(tr("Indexing files...")); ui.progressPrepare->setMaximum(100); ui.progressPrepare->reset(); ui.progressPrepare->show(); ui.framePrepare->show(); processEvents(); if (fullTextIndex->makeIndex() == -1) return; fullTextIndex->writeDict(); ui.progressPrepare->setValue(100); ui.framePrepare->hide(); setCursor(Qt::ArrowCursor); showInitDoneMessage(); } else { setCursor(Qt::WaitCursor); help->statusBar()->showMessage(tr("Reading dictionary...")); processEvents(); fullTextIndex->readDict(); help->statusBar()->showMessage(tr("Done"), 3000); setCursor(Qt::ArrowCursor); } keywordDocuments.clear(); } void HelpDialog::setIndexingProgress(int prog) { ui.progressPrepare->setValue(prog); processEvents(); } void HelpDialog::startSearch() { QString str = ui.termsEdit->text(); str = str.simplified(); str = str.replace(QLatin1String("\'"), QLatin1String("\"")); str = str.replace(QLatin1String("`"), QLatin1String("\"")); QString buf = str; str = str.replace(QLatin1String("-"), QLatin1String(" ")); str = str.replace(QRegExp(QLatin1String("\\s[\\S]?\\s")), QLatin1String(" ")); terms = str.split(QLatin1Char(' ')); QStringList termSeq; QStringList seqWords; QStringList::iterator it = terms.begin(); for (; it != terms.end(); ++it) { (*it) = (*it).simplified(); (*it) = (*it).toLower(); (*it) = (*it).replace(QLatin1String("\""), QLatin1String("")); } if (str.contains(QLatin1Char('\"'))) { if ((str.count(QLatin1Char('\"')))%2 == 0) { int beg = 0; int end = 0; QString s; beg = str.indexOf(QLatin1Char('\"'), beg); while (beg != -1) { beg++; end = str.indexOf(QLatin1Char('\"'), beg); s = str.mid(beg, end - beg); s = s.toLower(); s = s.simplified(); if (s.contains(QLatin1Char('*'))) { QMessageBox::warning(this, tr("Full Text Search"), tr("Using a wildcard within phrases is not allowed.")); return; } seqWords += s.split(QLatin1Char(' ')); termSeq << s; beg = str.indexOf(QLatin1Char('\"'), end + 1); } } else { QMessageBox::warning(this, tr("Full Text Search"), tr("The closing quotation mark is missing.")); return; } } setCursor(Qt::WaitCursor); foundDocs.clear(); foundDocs = fullTextIndex->query(terms, termSeq, seqWords); QString msg = tr("%n document(s) found.", "", foundDocs.count()); help->statusBar()->showMessage(tr(msg.toUtf8()), 3000); ui.resultBox->clear(); for (it = foundDocs.begin(); it != foundDocs.end(); ++it) ui.resultBox->addItem(fullTextIndex->getDocumentTitle(*it)); terms.clear(); bool isPhrase = false; QString s; for (int i = 0; i < (int)buf.length(); ++i) { if (buf[i] == QLatin1Char('\"')) { isPhrase = !isPhrase; s = s.simplified(); if (!s.isEmpty()) terms << s; s = QLatin1String(""); } else if (buf[i] == QLatin1Char(' ') && !isPhrase) { s = s.simplified(); if (!s.isEmpty()) terms << s; s = QLatin1String(""); } else s += buf[i]; } if (!s.isEmpty()) terms << s; setCursor(Qt::ArrowCursor); } void HelpDialog::on_helpButton_clicked() { emit showLink(MainWindow::urlifyFileName( Config::configuration()->assistantDocPath() + QLatin1String("/assistant-manual.html#full-text-searching"))); } void HelpDialog::on_resultBox_itemActivated(QListWidgetItem *item) { showResultPage(item); } void HelpDialog::showResultPage(QListWidgetItem *item) { if (item) emit showSearchLink(foundDocs[ui.resultBox->row(item)], terms); } void HelpDialog::showIndexItemMenu(const QPoint &pos) { QListView *listView = qobject_cast(sender()); if (!listView) return; QModelIndex idx = listView->indexAt(pos); if (!idx.isValid()) return; QAction *action = itemPopup->exec(listView->viewport()->mapToGlobal(pos)); if (action == actionOpenCurrentTab) { showTopic(); } else if (action) { HelpWindow *hw = help->browsers()->currentBrowser(); QString itemName = idx.data().toString(); ui.editIndex->setText(itemName); QStringList links = indexModel->links(idx.row()); if (links.count() == 1) { if (action == actionOpenLinkInNewWindow) hw->openLinkInNewWindow(links.first()); else hw->openLinkInNewPage(links.first()); } else { QStringList::Iterator it = links.begin(); QStringList linkList; QStringList linkNames; for (; it != links.end(); ++it) { linkList << *it; linkNames << titleOfLink(*it); } QString link = TopicChooser::getLink(this, linkNames, linkList, itemName); if (!link.isEmpty()) { if (action == actionOpenLinkInNewWindow) hw->openLinkInNewWindow(link); else hw->openLinkInNewPage(link); } } } } void HelpDialog::showListItemMenu(const QPoint &pos) { QListWidget *listWidget = qobject_cast(sender()); if (!listWidget) return; QListWidgetItem *item = listWidget->itemAt(pos); if (!item) return; QAction *action = itemPopup->exec(listWidget->viewport()->mapToGlobal(pos)); if (action == actionOpenCurrentTab) { showResultPage(item); } else if (action) { HelpWindow *hw = help->browsers()->currentBrowser(); QString link = foundDocs[ui.resultBox->row(item)]; if (action == actionOpenLinkInNewWindow) hw->openLinkInNewWindow(link); else hw->openLinkInNewPage(link); } } void HelpDialog::showTreeItemMenu(const QPoint &pos) { QTreeWidget *treeWidget = qobject_cast(sender()); if (!treeWidget) return; QTreeWidgetItem *item = treeWidget->itemAt(pos); if (!item) return; QAction *action = itemPopup->exec(treeWidget->viewport()->mapToGlobal(pos)); if (action == actionOpenCurrentTab) { if (ui.tabWidget->currentWidget()->objectName() == QLatin1String("contentPage")) showContentsTopic(); else showBookmarkTopic(); } else if (action) { QTreeWidgetItem *i = (QTreeWidgetItem*)item; if (action == actionOpenLinkInNewWindow) help->browsers()->currentBrowser()->openLinkInNewWindow(i->data(0, LinkRole).toString()); else help->browsers()->currentBrowser()->openLinkInNewPage(i->data(0, LinkRole).toString()); } } void HelpDialog::on_termsEdit_returnPressed() { startSearch(); } void HelpDialog::updateSearchButton(const QString &txt) { ui.searchButton->setDisabled(txt.isEmpty()); } void HelpDialog::on_searchButton_clicked() { startSearch(); } QString HelpDialog::removeAnchorFromLink(const QString &link) { int i = link.length(); int j = link.lastIndexOf(QLatin1Char('/')); int l = link.lastIndexOf(QDir::separator()); if (l > j) j = l; if (j > -1) { QString fileName = link.mid(j+1); int k = fileName.lastIndexOf(QLatin1Char('#')); if (k > -1) i = j + k + 1; } return link.left(i); } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/helpdialog.h 777 0 0 12654 11406632726 21532 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef HELPDIALOG_H #define HELPDIALOG_H #include "ui_helpdialog.h" #include "index.h" #include "helpwindow.h" #include "docuparser.h" #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QProgressBar; class MainWindow; class QTextBrowser; class IndexListModel; class HelpNavigationListItem : public QListWidgetItem { public: HelpNavigationListItem(QListWidget *ls, const QString &txt); void addLink(const QString &link); QStringList links() const { return linkList; } private: QStringList linkList; }; class SearchValidator : public QValidator { Q_OBJECT public: SearchValidator(QObject *parent) : QValidator(parent) {} ~SearchValidator() {} QValidator::State validate(QString &str, int &) const; }; class HelpDialog : public QWidget { Q_OBJECT public: HelpDialog(QWidget *parent, MainWindow *h); inline QTabWidget *tabWidget() const { return ui.tabWidget; } QString titleOfLink(const QString &link); bool eventFilter(QObject *, QEvent *); bool lastWindowClosed() { return lwClosed; } void timerEvent(QTimerEvent *e); static QString removeAnchorFromLink(const QString &link); signals: void showLink(const QString &s); void showSearchLink(const QString &s, const QStringList &terms); public slots: void initialize(); void startSearch(); void addBookmark(); void currentTabChanged(int index); void locateContents(const QString &link); private slots: void on_buttonAdd_clicked(); void on_buttonRemove_clicked(); void on_termsEdit_returnPressed(); void on_helpButton_clicked(); void on_searchButton_clicked(); void on_resultBox_itemActivated(QListWidgetItem*); void updateSearchButton(const QString &txt); void showResultPage(QListWidgetItem *); void showTopic(QTreeWidgetItem *); void loadIndexFile(); void insertContents(); void setupFullTextIndex(); void showTopic(); void searchInIndex(const QString &s); void toggleContents(); void toggleIndex(); void toggleBookmarks(); void toggleSearch(); void lastWinClosed(); void setIndexingProgress(int prog); void showListItemMenu(const QPoint &pos); void showIndexItemMenu(const QPoint &pos); void showTreeItemMenu(const QPoint &pos); void insertBookmarks(); void processEvents(); private: typedef QList ContentList; void removeOldCacheFiles(bool onlyFulltextSearchIndex = false); void buildKeywordDB(); quint32 getFileAges(); void showIndexTopic(); void showBookmarkTopic(); void setupTitleMap(); void saveBookmarks(); void showContentsTopic(); void showInitDoneMessage(); void buildContentDict(); QTreeWidgetItem * locateLink(QTreeWidgetItem *item, const QString &link); private: Ui::HelpDialog ui; IndexListModel *indexModel; QMap titleMap; bool indexDone, bookmarksInserted, titleMapDone, contentsInserted; bool lwClosed; MainWindow *help; QString documentationPath; Index *fullTextIndex; QStringList terms, foundDocs; bool initDoneMsgShown; void getAllContents(); QList > contentList; QMenu *itemPopup; QString cacheFilesPath; QStringList keywordDocuments; QAction *actionOpenCurrentTab; QAction *actionOpenLinkInNewWindow; QAction *actionOpenLinkInNewTab; }; QT_END_NAMESPACE #endif // HELPDIALOG_H qt-assistant-qassistantclient-library-compat-version-4.6.3/helpdialog.ui 777 0 0 32177 11406632726 21722 0 ********************************************************************* ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ********************************************************************* HelpDialog 0 0 274 417 Help <b>Help</b><p>Choose the topic you want help on from the contents list, or search the index for keywords.</p> 0 6 Displays help topics organized by category, index or bookmarks. Another tab inherits the full text search. Con&tents 5 6 Qt::CustomContextMenu <b>Help topics organized by category.</b><p>Double-click an item to see the topics in that category. To view a topic, just double-click it.</p> true true column 1 &Index 5 6 &Look For: editIndex Enter keyword <b>Enter a keyword.</b><p>The list will select an item that matches the entered string best.</p> Qt::CustomContextMenu <b>List of available help topics.</b><p>Double-click on an item to open its help page. If more than one is found, you must specify which page you want.</p> &Bookmarks 5 6 Qt::CustomContextMenu Displays the list of bookmarks. true column 1 0 6 Qt::Horizontal QSizePolicy::Expanding 20 20 Add new bookmark Add the currently displayed page as a new bookmark. &New Delete bookmark Delete the selected bookmark. &Delete &Search 5 6 Qt::Vertical QSizePolicy::Fixed 20 20 Searching f&or: termsEdit Enter searchword(s) <b>Enter search word(s).</b><p>Enter here the word(s) you are looking for. The words may contain wildcards (*). For a sequence of words quote them.</p> Qt::CustomContextMenu <b>Found documents</b><p>This list contains all found documents from the last search. The documents are ordered, i.e. the first document has the most matches.</p> Found &Documents: resultBox 1 6 Display the help page Display the help page for the full text search. He&lp Qt::Horizontal QSizePolicy::Expanding 61 21 Start searching Pressing this button starts the search. &Search false QFrame::StyledPanel QFrame::Raised 3 6 Preparing... tabWidget listContents editIndex listIndex listBookmarks buttonAdd buttonRemove termsEdit searchButton helpButton resultBox qt-assistant-qassistantclient-library-compat-version-4.6.3/helpwindow.cpp 777 0 0 16375 11406632726 22141 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "helpwindow.h" #include "mainwindow.h" #include "tabbedbrowser.h" #include "helpdialog.h" #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(Q_OS_WIN32) # include #endif QT_BEGIN_NAMESPACE HelpWindow::HelpWindow(MainWindow *w, QWidget *parent) : QTextBrowser(parent) , mw(w) , blockScroll(false) , shiftPressed(false) , newWindow(false) { FontSettings settings = Config::configuration()->fontSettings(); setFont(settings.browserFont); connect(this, SIGNAL(copyAvailable(bool)), w, SLOT(copyAvailable(bool))); } void HelpWindow::setSource(const QUrl &name) { if (name.isValid()) { if (name.scheme() == QLatin1String("http") || name.scheme() == QLatin1String("ftp") || name.scheme() == QLatin1String("mailto") || name.path().endsWith(QLatin1String("pdf"))) { bool launched = QDesktopServices::openUrl(name); if (!launched) { QMessageBox::information(mw, tr("Help"), tr("Unable to launch web browser.\n"), tr("OK")); } return; } QFileInfo fi(name.toLocalFile()); if (name.scheme() == QLatin1String("file") && fi.exists()) { if (newWindow || (shiftPressed && hasFocus())) { shiftPressed = false; mw->saveSettings(); MainWindow *nmw = new MainWindow; nmw->move(mw->geometry().topLeft()); nmw->show(); if (mw->isMaximized()) nmw->showMaximized(); nmw->setup(); nmw->showLink(name.toString()); } else { QTextBrowser::setSource(name); QTextBrowser::scrollToAnchor(name.fragment()); } return; } } mw->statusBar()->showMessage(tr("Failed to open link: '%1'").arg(name.toString()), 5000); setHtml(tr("

The page could not be found


" "

'%1'

").arg(name.toString())); mw->browsers()->updateTitle(tr("Error...")); } void HelpWindow::openLinkInNewWindow() { if (lastAnchor.isEmpty()) return; newWindow = true; setSource(lastAnchor); newWindow = false; } void HelpWindow::openLinkInNewWindow(const QString &link) { lastAnchor = link; openLinkInNewWindow(); } void HelpWindow::openLinkInNewPage() { if(lastAnchor.isEmpty()) return; mw->browsers()->newTab(lastAnchor); lastAnchor.clear(); } void HelpWindow::openLinkInNewPage(const QString &link) { lastAnchor = link; openLinkInNewPage(); } bool HelpWindow::hasAnchorAt(const QPoint& pos) { lastAnchor = anchorAt(pos); if (lastAnchor.isEmpty()) return false; lastAnchor = source().resolved(lastAnchor).toString(); if (lastAnchor.at(0) == QLatin1Char('#')) { QString src = source().toString(); int hsh = src.indexOf(QLatin1Char('#')); lastAnchor = (hsh>=0 ? src.left(hsh) : src) + lastAnchor; } return true; } void HelpWindow::contextMenuEvent(QContextMenuEvent *e) { QMenu menu(QLatin1String(""), 0); QUrl link; QAction *copyAnchorAction = 0; if (hasAnchorAt(e->pos())) { link = anchorAt(e->pos()); if (link.isRelative()) link = source().resolved(link); copyAnchorAction = menu.addAction(tr("Copy &Link Location")); copyAnchorAction->setEnabled(!link.isEmpty() && link.isValid()); menu.addAction(tr("Open Link in New Tab"), this, SLOT(openLinkInNewPage())); menu.addAction(tr("Open Link in New Window\tShift+LMB"), this, SLOT(openLinkInNewWindow())); } mw->setupPopupMenu(&menu); QAction *action = menu.exec(e->globalPos()); if (action == copyAnchorAction) QApplication::clipboard()->setText(link.toString()); } void HelpWindow::mouseReleaseEvent(QMouseEvent *e) { if (e->button() == Qt::XButton1) { QTextBrowser::backward(); return; } if (e->button() == Qt::XButton2) { QTextBrowser::forward(); return; } if (e->button() == Qt::MidButton && hasAnchorAt(e->pos())) { openLinkInNewPage(); return; } QTextBrowser::mouseReleaseEvent(e); } void HelpWindow::blockScrolling(bool b) { blockScroll = b; } void HelpWindow::ensureCursorVisible() { if (!blockScroll) QTextBrowser::ensureCursorVisible(); } void HelpWindow::mousePressEvent(QMouseEvent *e) { shiftPressed = e->modifiers() & Qt::ShiftModifier; if (!(shiftPressed && hasAnchorAt(e->pos()))) QTextBrowser::mousePressEvent(e); } void HelpWindow::keyPressEvent(QKeyEvent *e) { shiftPressed = e->modifiers() & Qt::ShiftModifier; QTextBrowser::keyPressEvent(e); } bool HelpWindow::isKDERunning() const { return !qgetenv("KDE_FULL_SESSION").isEmpty(); } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/helpwindow.h 777 0 0 6064 11406632726 21560 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef HELPWINDOW_H #define HELPWINDOW_H #include QT_BEGIN_NAMESPACE class MainWindow; class QKeyEvent; class QMime; class QMouseEvent; class QMenu; class HelpWindow : public QTextBrowser { Q_OBJECT public: HelpWindow( MainWindow *m, QWidget *parent = 0); void setSource( const QUrl &name ); void blockScrolling( bool b ); void openLinkInNewWindow( const QString &link ); void openLinkInNewPage( const QString &link ); void addMimePath( const QString &path ); void mousePressEvent(QMouseEvent *e); void keyPressEvent(QKeyEvent *); signals: void chooseWebBrowser(); void choosePDFReader(); protected: virtual void contextMenuEvent(QContextMenuEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); protected slots: void ensureCursorVisible(); private slots: void openLinkInNewWindow(); void openLinkInNewPage(); bool isKDERunning() const; private: bool hasAnchorAt(const QPoint& pos); MainWindow *mw; QString lastAnchor; bool blockScroll; bool shiftPressed; bool newWindow; bool fwdAvail; bool backAvail; }; QT_END_NAMESPACE #endif // HELPWINDOW_H qt-assistant-qassistantclient-library-compat-version-4.6.3/images/ 777 0 0 0 11410365631 20374 5qt-assistant-qassistantclient-library-compat-version-4.6.3/images/assistant-128.png 777 0 0 14460 11406632726 23542 0PNG  IHDR>agAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATx]{pTyB`a6`6 ؍%nm3iI'eiә5錍=Ik0inqJi08“FHa d0{=Z+ݻ/~(X'/RVhQQQz c5;Uv݊o.`P{ckahdPNzMGڽ>?H( ݷوT[֮- z0v<@`ӂlJw5N0zvTYOCC3%) $;Z[<f{!$QZFU- 7mM`H F"m(5wT\+sF0_P;TRg208oc^u|T02ޅWsAOs]Y^BX^PMb9 x:x0=)JRc~*REJ#FܧUˠ@`}ޥ]b0c\d< jT?ʽ!̔8,DW>;/e+qw >j2Ĝ== OY@4xlN@ޮ~'o%Mn . 8T_2?$4Dat*T7*5qbS-0nDj #ZAXNOn4@) >Z,.P g9DL:v )u+B8iS 0Py&i-q 4ZI6x5Z?)zW6R(E昽rլRl5M`2A ʗ^0{<?(BW/ Lffbݣ, Wv>MQL= xx) `l mBqLF- ])t#ݻ#gT1+} ŇsD3gG]ѨN>U%6[S]W^B~_cEq*)l} ;^/wf>E/b ҅+*8k2c!p`i(a(DyI-WTW<^v't4tNqI.4 00__dL8Mk *ʴa\ D#O/^\cnq~=.d@C!evS]T|1_J Θsa(5ÉӺyaf x&2F*.`K{!T>S&Uxg<E1&hvBfJ \+D}AwRK+WnC L!Կǘk>n?AϺbZÇC3=O%f^CDzW'K)A= Rĵ&m]"Ŏ r_ т\ڰ9tS:ʙ6_2Mf;>0?G3 ,|Ϩs1  CP}FiӖT z ^2zඞ;~di 2ofi}j5 ͊'󘸓XUZJD⌧RBJQ+S;4yS)T?"X>@VBGs{πٜCgz2hY_؆^ UiVJ&dX(l( r c" Aj̊dW1g B7QVM;9mNu:i3yllsI>6 o( PV5î|:`'7<$HɅn E] 7`DP,&D\0L$ܴkT4@7 '$c1W:~Dq`n輅 шN7̳vߗq .3nB(qQ4ǺޝoBm7h(/FPGuIkYYݼNvӾQ$2 &_!jq>:*K yyϵ_rͤ.GG"TYZ,n$p{&tNDfv;gdoa0n~|"_:߅߷" 7ɧjC?$TQ5EFLVP0imN`Ѯs㎓??qƀSfjW4pn)mX~ZW,1?Ds\}f&*6Dyc>PV-p#kUqj_ry l_{bf>;.m~Q0++fN/ @GcgG`<Ҹ(9oJ&01;/kg˩߭P'<TOe6`ahCG$G#8|fo޺ F³<|ڱ \_֏ˇ;>}8|x#o|1~vsSu,5 d><9B4%Gsඟ1}>dJh:*?.@*AhW|Խ#|7a?eˊj8>Eo;KBS1#6?*A5=Q<8˜\B[?,"*~܇{""8j/q9*f6B#3;Dߟ훡]nWO2xuv{)~1|"Ϻ`:6:$Ż*cQc8=|333~PI}/}1M1,%WqKb801?>{_ACFH(`R^QG6{N#شEL+2a+3^gW'9 A˨ ;ڥ1CXXb Eo^|ٙ( @*?"XZY4 w"()]? Ț# Lɗ16@ 8_#/z?lWsH?mztk 9l@`9cDI25d@A0=.C(@a* Ǟ8GUqn1D@Yuur.Vzn^OuT,8 ~5<F8-A-šGЖژ66>_%l3B`ǐ7?8C}|&&"8 V/ # 켯u[ϙ1?͋@^lDF'.\_EgКk>=sj0=璿1ƬL,EG$}!y^3Z1OL 0QSCaMGgꅣG?;lny[7 2{5dj>db |YڲS@J99`4< %5AlR0B/V3(*v~1P=:naȗ">\`81@e{,3dC]FiQ)@}hHB> A?oUr_5=!(`){OEfPP}2*3=ydT񥄌u6Y{ـȎQo2K>vM7Fv*C`.R`gjKMfHrȎ [|ݷ' 0-.b[X#-b\7j d CBE~\:9<aa.  ato-y(e %iF]Uf 3 !kϣCt҈-GtʤL$]gUAD), sηg-iRzI˝`Z\/x7=G)8 B{LT D vyw㭫p;󝿱c_l-+v+95ur~5bKmE|zYf2B`O9@`m^{dG(!IԀսK|(f3>-cf8" Zfo#AqIx]8;R=x%:<x#LܤIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/assistant.png 777 0 0 3762 11406632726 23215 0PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxWklfޅcw ~1K@A(P> U<QUЪQh4)DiCk xbNϽ;]韌}f瞙w=3<qg%STɍ .@QtR.$2*Ԁ$IMӻ OS$?Vʓ[Ǝd2륥\ʶ e#i%v(I'IWx|1bm$WH:fF{fr )n UsAILЛAmbbFpmISB ARd=ԍa$,N׊@֑S._Dwa]r̟gفS8*L iAd *T8Lݗ ^eo5hOeMl+?."Io\C3ә_V6B ;/ev xL`Jk-/_.ygTcqJPd-ϳ,L `xӈ)ɬm~0WFF8"c8'@^\ ޺M⹸%8-ʼnlJG|6$th9;q|:`6XxD}]x|A|upADxbJx{'Hzk U$a:DAYU3h,%eW=8YeBĐ!*'s\ZY/%}EM{VxجuI<$%97 JޓF`]]AW|HȎO0TC /,GsPã:r{O;vG5nau(Vjʊ ;QySlg~?MT-h}GW>ͿzCoE׵a9|[葠wwHzPI w?BCh R15:IUPQv(6Ap߭PEn\d_߰b~+o*3Q[6y1oq'l;)LݐR5oe"ፊ$&'ױWLf2i5-Wt1,j$X)s-2(Sq0¿Snв( [,_ rb/vt qP'$湐6Y23Ykn)-wWr^V0DL5JL]F6ZwQX#Y(q:=ۙVok0Xo "0{efXSZ̰_<8_bޡ}$êEHg]Y1yOFhu`<IENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/close.png 777 0 0 626 11406632726 22265 0PNG  IHDR(-SPLTE3"5'vN{O߁S߄SyYduzNoHuL^^O߀Q멕처쳚촜7'cdsVf`cvgSjwer_JxXv]fRvofnzzssr]n|tRNSDIDATx^mŮ1 @&CTƇF3]l٫bZ;}djx;@uL!ᣲ)MZOq/hfPuDh!  5%){+Q1K"0;uM=Oa IENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/designer.png 777 0 0 2402 11406632726 22772 0PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxWmL[U~-/FC`|7fMs`5# G?`̐̈P'J a:S@sB@G$ޓ{}2(B^V+-(,Y<˰] Eefl ֔\1XD6LMjB JQM e` i_c>|9j چ7_@s O%JSW5"C~&$gZa儤8p> s{PRхMl$= m৞tE{7|$"?9}`]Őds 7TG9c@#& gcjD?W/E&Gh Bg{Qyg") fWJѰ`͋+_7f$-v[J:,y/^Ƞ4W! ]$kK@W-Y5AS ˌvIIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/linguist.png 777 0 0 2546 11406632726 23041 0PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxWkL[e~tEr)A Yas .^@?9$2EoS-3,:Jl@ іrȥ@F޴w{}Pn~~4&&yXG9 Ȋُg }'A Esץ㊈0>>i&"]=,T;QS!R6pܧyWW/傸QfGQ M:iʾ j5#ehjPӞTG +K&#2BsB[3HO8Oj|O.KYE`P"K:xZel6 H0 Mڈ-(&Ft<y7LSnn1 T$`0C⬉Zڑvz=O|8#E~F~KǍ}x !Gs+;y%qsXz&!ONc`0?}bR+J4w-G:L@B?e#Z⻀@] sPАA ߀V Pג+;N!/XGrTueF' ໎2wK6+iNr5vH}>T\:+-cVT֝MNhV∅ä5 '/$0:XbCb Qӛ+j,ftݭWd>~Dq<@;2̘SX2"F@Jm[ |qp R6:qdKk%5:(#X2ܜꞽtwOb[D>u2x?Fz&Ko,"5I#{|Ϝ,L| Y'=CGx o7PqY}My7&nD&k10ysegr""3V.z 2؇K$pnUә1M8HwC}[Ӷn5t15 U͋gܩzr~;%%y| <ǖ⧴ͬ$_D'34qQ639A#7!Z'0^O3$LdpS'vL3r9]zٿ lؖ@OkIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/ 777 0 0 0 11410365631 21134 5qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/addtab.png 777 0 0 725 11406632726 23137 0PNG  IHDR(-SPLTE''',,,999>?>???,,,---@@@AAA+++333>>>DDEEEE---:::AAAHHH222777GGGIII///???BBBHHIHII666JJJPPPYYYNNNIIIRRRLLLMMM+++QQQ&&&JJJOOO777888<<<>>>???@@@AAADDDTTTWVWEEE[[[\\\dddeeejjj111WWW tRNS44444ggggZIDATmP,%Ss?O{4j2h].q|9-TJ2zi:7A9sN4W|)6^1S:"QQkBmDps fFE:aNt@k~H2K~~ɲYQ\m\ hWfunIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/book.png 777 0 0 2705 11406632726 22672 0PNG  IHDR szzIDATx^ŗ]lUƟ33mw[(Jša hz/4\17bBb &[B T/4. 7$Ƥ֖S#n,& t?''ْ$<Ϝ294׏^zÇ?s_:y.lONN NQ>00O:ūixx >xc$C{}|k$ *6* ,ˢ/X\.T[z,n__).W27ZjY9rQjc& ДLV(a8i;,9#8Vی;i1T;Aݲ`us\Q"T\gn ;ɫɫ'fe3h(WQ^d555p(JC- +@$gq >D8/C=4Mb 5:VD$bǤ; P(nOsN5 yQnA249l[XgoxEa7n X@nTg[@Ӿɒv[|qh=q7q mX[[`0uOxgS5Xo9 I(\zd2?cǎad‘ފ2@#w=EXg8z=G(4SRO@7 8wijb1]<vk`Vhr٘ٸgϞ5;A˖bQ90t~/ۏZw t$ѡbsp$ b9U/Qw7:4uk@Z @ Y,G~:c  ٛ˜G+ܱpu% tUN59Asa ƘOԋMòXf"k֖gz<ׁDS]U'ID@˻xQc̳_|w+2QmIbɿMU!i8F!6)b;K =uW:w|s>$v;D „T?9bO+ZG8+ȑg)3C)QR c"JJ)l/'W ȾOM-"@oFYW[EKNZN 8a+a{4W0hQ35IENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/closetab.png 777 0 0 1004 11406632726 23523 0PNG  IHDR(-SPLTE''',,,999>?????,,,---@@@AAA+++333>>>DEDEEE---:::AAAHGHHHH222777GGGHHH///???BBBHIIIII666IIIJJJOOOPPPRRR<<<@@@MMMNNNAAABBBZZZ]]]>>>[[[KKK777CCC^^^bbbDDDjjjkkksssEEEGGGIIITTTUUUAA@ŠtRNS44444ggggIDATm@УwѣLDM"Hho\]z?A<0(㫲2C#|>sxg0am. ݘQC-9S0K]"w/,60i- 8,WU5Co(Ut4_he .S-7$ܸҰЕ +*hJL铖N;ΫswrO2dyL|q~gFVhŞ;K6}^@SZ$ǷG_ EI7@@O7v ?hͶ98E@d <`N AIc845᯵KL{R|%aT*( :~/RR %GRvDB 'V,`Kކz?^&_6k"L ν7~Nul躶e`vDT*lǟ8113Af@uɡw'q8uOfY"z{p~_FOW=$ a,PVd]q/62qAvbOfJ -C/~K\DrqjGڠZRQ<'nO~9:UetvvbPm!BئMp`W/LM`9g>jb PkYyaܰ^WB!qrL5ST%&`;0@z 5T|$KmۘH'Vypr\D#@W-c֭bF<0N7 h,B<0bP4x mSn"뺐 )~h6\Cy.ֲ,A#xM1{"#78ŀS&ks(D, t ]WFA\=G8k(N4ң$tT]D@E3DQvA&BNDAz5X rwgs`&y ԄtfUi5"|hM"(~$:c9_ǐy$ٴ$8ViOs4PC͎]ȕȖE%N1DY5̍ "W٨ȈL\\CUU?3tb8۲ǭ|zA/ ɉu' !|Ty.DpkBoTb{5~.[ԝ/ȑhD*rQ(<_$$\.1uCԁ> Bd"DsO2{sss')jF+> -D0 |0y2EBe+͛V\ʿjH毽&(<1D"QNΕ57˺: 5TjpD,pCaii xzz2xj|XܯS `M++mcථ J呫^@Bh^8`U7LZ ф^ԵRdIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/find.png 777 0 0 3454 11406632726 22662 0PNG  IHDR szzIDATx^O[ǿb6x@` @$k$YTESht Z$mM~I~6ZNY~V.ҦA,! !c|= 8Js|>=c8M Ǡ"B9s._|j=ZƜ\(ip8rĉ$1[='°Y"VWW#S꽵Om zqFd aomb1 =rٮ-aLB(ܿ fD$CL!> _zS4Ocm()xNFL _X3ЀIp@`!BBh52xt~F.ڬ}+/Ŷ3wR`a\XXQh clryb& e{d;hvݻh_0 Lݾ}D2_ (db \U:K>PqÇ~zIIb%-;` @VVntvr e)g9И}ͿA,II”RbB,.y126cQ- |tvuaҳ*07}q[3#7@`A}CJtzH  ٥t.S 0lAqqfp8ш^]xAXNA?yt<"66`$جx#EhW ˂[>?g1P+_eYg{g|N;;;ջO osQƐ >4ZтV oX ^Cwws||ܕxbM0\zWWɩO(0Pxu7%N{0^<~4Ο…ȥK׮]3?| KgDžg>zSs% (67ƞZW!܄ayE22dT$qB<c£8ƈHz2S,$| X28`!3CE$KEdUDL%@i3+2-_?9՟QZD$4*bBa>@r(ksX7/o@j >Ian3$"#I܈g6:.5IENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/home.png 777 0 0 3417 11406632726 22671 0PNG  IHDR szzIDATx^Vkl\G=35]c[@R7)Xڨ,J~Pȃ?[EIQJQ 4D HTiAq$hP l%.yxݽ3sGu!lѼsw=K8h&-~vM4i(,`*ωv4fs' TSR%1>%^@b;s@l1@˂epj4ɷ!ghrBް)(Daq  Hb4Axͪ=Ǥ9Ѿ(}<r,cU7$fgRH>s|t#\ z6]p΋P [%N+0nT;Q FfShqT'EXql*B5& RX[ ?ō"Wq`/GyHn;hٴ 4mdޕ RXQ@" dYx.i0<:ZthrǢk2t'g`Y,0)`#`Yi~ -sз*kfE ԓ3( יo[SwRmE\LGVT̔]|]}J@G6\t&?H"wyĹ`qU[FLlkkQ`P`nIz$7fHx Oz[EPhrY/Sl:Ic 6[Zo _ifJqq\t>i`g*t={xү gNCě{s}Ü3O8Ο=|Ba_c\zL<'z ?l7eko=ӂ79WjAT-WmBCwseՙA+ehaq91]&fep4 BD( >PJU7R[03i@V==RjO0j Ȉ8ǹ?O]*W_E ] !DQ *^;r X(qw.I$:f ҝXB5l8A8)_C>{fkN -![G95 AT$qE*8'.9) mf80M…\$'_FUwqW,c*tmv#EN #VZZ\Ma=X(ۋbL1z+")h5 P E U!1 5_,UTKx:(@X Pl纎*8TSZj8D_ȅybR;#@'D%|Xr”{#4Jֹe"@"Q "~0Ry :o91_Ϡ% hqKc(H "-M0|l•b Q}2|f>@?\F]Z8̥JͬBCX(!@ԟGXmJk4cΉi2BfBIk@[Gpusn | Nkǎ0QX_~qPVz(ޡÇ(-qȑ{$Sw  }=Ywrz)MCCC{zz>[b||sN7Hm@UTj߈v~?_^JIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/next.png 777 0 0 2436 11406632726 22717 0PNG  IHDR DPLTE@X@W?XU|,Cdr^2Dd#Wj,>Z #o?`q`oaPWGiY_lRLZvCgmVB_OhE:6f92Qz|!3wtRNSx; f->  *!9+E0 /AC6 =2F81'&?5%(3$B)7 De{kp y,<2JWߐTX~IDAT8c`.0#$&W 8~UU̚W&xT8nz y{M#7Vo]݋fNٱ3 Si'_0ĩ*_UWWSSӸ++++dmKCyz9-00w=&\ߴPss[ۑǎ1)+(?uzs+.6,T!x슥˖>yrO<$|]Q.,LY@VfyVnG Qа'oGDj ˳rjF)mcVJJސ&oo. 7UBNFHː73+;'WFȊSn3F~Aa$J%H55! G")*PMD@sqq+<@)ӞIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/prev.png 777 0 0 2070 11406632726 22707 0PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATXݔLUeIMLgF.uMsS+ѕ54*TPJ+6+xf:eʦa{0hm߾9[ws}!B&!̜AOEd,׵Ǒ#.6j"w's=I]2io㕙C'^lm}ܡ _c9gҗ!ϊPX{ z˄@2(֑b쵛=5;p|7qf:>Ē2DL$:Z}GP2 ؑ\Sǟ آ\6!p2D#DUիKC&O^%Idbq3i+=->uIO^#e&# /|qj$A&O!S$-q*hqd42LQ') '@PD826N[@%$ٮt E(d!ޖMkH^U{Z5 Dȁ)&DR"SVo( LL~IENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/print.png 777 0 0 4047 11406632726 23075 0PNG  IHDR szzIDATXåWog?73;MLĽM/iieU Z>T/Q*%$*B}")Pjo*ח{93&$pv;79fy??_xscTR.\x*~[y ( CZFhCZi9{YEl,v! `*60o0yĵ֑q }mLv /}Ӳ-m [FTҘhÈ[1*w<*;066|ۄD!>ʊo,M!eݮGO>r섭VXnG3ŏUvww38}Qrd{U?,+vbhb4x&Gd9(1V Ćܜo`^E$ 9$h/h>ha-ÁdžK‘t"a oG6Ӆз;VFu(cFy./,,|">> )Oe2 x3/|zg)I\YJ&8MJXXV,t#R%~@:tֿ̙3gyTM/`~6K@Jeizj>S@5i{DC gG<y^GutcjvvVUUtz( B|vv\ڪoB Ll1fAϵ0XL?Խ{_vƍ4:zVWϧlm[VoGDM**qsUt-%_%j!#缎GAx"+ݹ3OM/(&gkkK b;A(i}}5#rmb.9QӦ, WO:؀Ec[,06Nl h(p-aec'^JCXёJ ȑ )CQ[)-&4HZYb#hP_~eScܪLI@"k'\L۷oS:4^}I7p訴Px'RtY|fg-CPB.˘ݐbx-x}mb+a=6[Yu+QRhFhC<)a3!_=9j41A(^]D$/ _MNN#A⽢#* ŀn&ƏB` FH"6& PX'y MEA'&&hyJYԾsAx>L^2$$qV;u:q:w SY${j"7w%7oҕ?\ԍmre'@E-\~;.g샯E͋tM \ dDŢ33tB*zJٲ, ߺ uچSNlշ@vu a.E:0fj(!`T8eêjsܨw&o ">}FcC͕.˿zGA4^+yGS*ah uB+9.d2{]ZTMt;1o ~%,..QMsTWL67HC^i4wwBEloFNTҰaZDy ;bdypŧ5QɾlM1h݃;]!cjjs԰٩j tkw].<AJG۞V;4BW絇:m͛"mE{/jaXf lcIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/synctoc.png 777 0 0 3456 11406632726 23426 0PNG  IHDR szzIDATx^Wkl\Gf>cq68/A@-ihGV T$B$~D)*TRT 6$4m@j$v}̜fcg=hš翸'D*!@:ЫܴO= OI$>hٮ*2OR+ufbB ?ֳ0 m(g֌Uɻz/,h&3c]HDtZ,]p`\%& >#oA%,\X4!7x?i /k F (\(dW΂@A`-6_G1>3'@9D mz /N7^}P י L:?n ^x  0-20&ّ>,!i $j FĐ+MV F 54h߸ImCPOA:`xwym61X[@PU4bHDSfq xhaX&'7c&pA@1 Jyf o>݃>gkuv'f)c݌c/T&7M;wBWY tJ*`©r+UOfyL.1&A^N  @Ћx80*= F M:1{OIHYo"t^ċyYx|gbh{IIdgG43=,|s8|s]DD;%Ipdx2>dlSW0-Y$1!!,[[[vtt!?xOaTrAǏ` a<.@ >-RRR=UW/-6Ða< ),,lkhh!9?&n-J;8e_.@fxV555QLܾNU[)1C6;@Cƒk9g:BB~G4.@PUUZA^iSEج[ѩwO.|wd$t|!yO.͘^Q__O{⯎\HΝ-]E}'|n$t|!yy5-@Xu#Πs3;bBk7L͝e?$t|!yy5-?cKiirZ-%{RT];Ak hI:><ȇ0~iuee% :r:5:\)TIu21Q;8#! dlݫ#Ϙo2,ڿ }.y\ ɗItC< 룢nbv#SZEli}|8%t|!y/UV_&zxO6G!tc5KIa<xwA)H U:pI*%ɣJi/2` vqG)=˫u;v`$)O'? R 9Hl@O/7!8[x/6|`RHȃ0aBup߄ gSS oo빹t%jhikͩl- (h%:.www񹣫e6L0,}b/3\ 7p7X>4tƍn vZ :m7Q咿+YQ#а̬}'''5$tgjG3@E:O察W_Tb9 sĽe7c?#Ml aeJ.TQΓ2cֳބؘC xh# |Cp1)N|E(iUEXb2Z"BWnWzb9XnV@3Y4%흥."gΓrL˿ѫ収c"̇6a0(2!JC.*] Zy1aΰ_ Yf9*JuUQ2 K9[!kR@1kc1%c*cc:c89=R_qb}N*J[CG-iZRΰ 'q"z$6]QJVGVzke9JwWp>"Nn"j%NPE6 Q;a"&z\'2d!6 C#! "&1 AnIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/mac/zoomout.png 777 0 0 3176 11406632726 23457 0PNG  IHDR szzEIDATXWyPU=x[ˤ !!HR@&% ((5(bF﹠ʢ j! 0!:`-Ȩt\fsswE""ヒ`Lf1|~$˗HKK;ϿΎhaÏ8xgİsuuJOOikkaЙ3g(**BCC6>D<==W[[[)33V^[rN>6>?Xo''{yYPOB䟡$Km|!0b%[677Sniuf'RąX)%JCnaqGQ  FoqnII e9dikα]1+E]wdhaÏ8x#zBc¸ꆆJ>6!xt-lE2yGC]Ckrssoі Lﴴê履EUl|!uPu 0AiiiOUU=3kÒUY.E.:B>)r ~e|A=5T0F\yy&8p~+ht`+kI-lyGQPP>>#&28XXXx oTVVRSKwͅ{-/g~ܲ ?◛[nknn~0^4&-0a,:w#??۩jSW6^///$zQAEIn*J_y*X4}m3|$ĠW32#A 3/( QcU2_Mj*XyˁKjC%0scѹɀ"^=/3f0l3`(EqRIEjb'WhԯjW8AC8  Y;1E H47OgLcX/06CsaOS=^#1k\nq. IENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/qt.png 777 0 0 2616 11406632726 21625 0PNG  IHDR szzsBIT|d pHYs̉tEXtSoftwarewww.inkscape.org< IDATXilTUof:L m-- Fh6ik@PKDF~'E#(bbeShYDRj1Z(-vfyy3-N=ν{"$\k%g82NQJpX4D#h,*+3LS\ &ZogjH_V9HDE/Օ g */.O`naU_UJXMш<[jX T9\F=6*eY4"eW_m/?a@b6{fifEd\7DoJRH[sDL6d2x91\=ϩT__ZJIͷ5z37a UCw=+eރ?Q9cmd[x5sds0# [",5>4O_Yʡ6_9%7 o: DYAF|"Ni lv9[kORG~)ki^*;~|J)>/Vjo"?9 ~̱?4Z^}Gs/&\Ad![Y97yE-e%џeسȞǖu=K53|ge[a>yKΑK'YIKb.$М 64Ph1;PU"T)JJlJUB&GJH44&s܆P2X^Gj"(LfBl*hC=g/ ",׬M?'V66ĊHucU^ v[6Vߐk27[RxU{錼48K;D 0uܪH% \2 xwqb{C'<(I F `lAGuc8SMV?zZ\~rُBFXkRM`\;A+իo޻^ ͝2_99Փ "bN >9H <G3atLz:ޑއB$i02<9 {W5`[`wA@pm|SVQ(} uXk39@UpP@Y]!-} ^ "֒$1Xk<`] /ZƀER H "> 4M=&ޫX}-p@pȰ]Q(9H8",$IHqȰ:0`(:6LAP LU9)""W"8NЊbzVy.9΁?^?`H)4bwHY_fry r;,.zsQA at8eм!L~6S۵3W~4}P&Ay7K 6Hd6~m6xh-iO}`Jw8;/]ձtf1!~ jq3tJ@{ǭ=q槮Ys{n,wM. X`a_LfPϊmQJUO0$r%IENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/win/find.png 777 0 0 3630 11406632726 22713 0PNG  IHDR szz_IDATx^mLTϽw^aE"X_QYmnt7h)Zf7M?4lӦ~6*IjwQX[qw]pQ^Da}`/OxCΐI~y&{~3ffTf1£9$ Gq<>8{,q5|`>߸w|qJʅ۾k ;!Y7”hOG'{g.\5/E68GFG_ϧ{>y6w*9N@SexdK^_cxj%+!O_XAI2`{1_=G I pP$5z %ņ-LK[^oEXDdBN( 07b>A`p8l @61MDlA1hP !F ) ,#$҂E.qrr]3cr$(b0= 6 ڀ׎Jwymmm7o -XL(օ~i'6055e*:|pwmomm!If!Y?BwĥzEO~- Qprt{!rJ{{q} tD_ y%۳P2'aޱyn:H`Aԙ姵'Ǐy```&$9:4 X#h /ńC+\Ԭ X<7Fs1ӝ'ծ沦}|DP'p@#ǃcHIF$B䗖 Ýb5EF^A[Fԡ x<%0&l5-nƦQB K 7p1+eh!徰?H8uń-zֶ)0@B$(v;`ocr 2CCi>t°"ơq̃|(H "$z MF===za&D$6p} ۨ >0Ɛo}z* r3zx(:|m$Y86g8^ 8Hp,\PYΠA{ BP+7\[ 01|!- b8MQVW_SsL/+tmᱨаO'-дĮ"L}rHC%YC^, ^v˲]T---bsfff1""1&,q{+"|SA|{`¾j(`q׮][/NzgT?䶄x'z< L0@,;8zUT\?{9}曠DJMMҹsܹ3;==pbbbpnn.BX~7UWU|I"$D![`I iD#DьG*-͌A,K&@ ^J,^pA}mGgRD`Կz@=I=Y JI (wP}Q {G?1 }¤/OQbФ?fm XN\N[I, LiSV's'Fs.Q"/d^2|[vR9ce߽w"ޠD=XR#h+<;MVv;,CV!#oZ3mجo5IÄUx胖N|icEOj3 .1iD^PRIK8ͩB04 i^fDd%~4#Oc|@ MN y]Yoc"?9#IENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/win/home.png 777 0 0 2606 11406632726 22725 0PNG  IHDRw=MIDATx^kg\/gf=sݳ] K ,T.-tV 6ZSL jiPD?T/FJ 5-J1" ]`a˹:=4Oϼ3ϓ7h:PI>S,l;z6 gE S֋5h0Hsm lB-_'^s+K2@v6_ 6 AHOo|AS4ɒl$sc;; sMMfYɰS`Y %T{,%绖 %:umka E1HQ zvS\F}zōy 3'!GEs=u ss 7dB$qDfZ"Ŝz󃁫s]WQ6l?IB @ӷ(& |3qLSr.>̻'E6@]ɀj,ߺ}C@fe%I99qy鄉eO3hJm{TBPeX5 ,M "qQAcz$ `jqDB|b(OD۔Kyt-g&x "#wکohQvrKaߖ3P*wl|+@Ӽw3naǪǻp|t?^@ۂI Xd-x/k{Ž{ھ}K`4 $|Zgg37o~4+h'& .L4\IENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/win/next.png 777 0 0 2016 11406632726 22746 0PNG  IHDRש(PLTEbUdd\]dou.dQ6ˋȕ=)@dS9=(mV[7;'v.r.R͋Έ߶bZh [rXv/҉רbԄכd֕ddˇՉhf әc؊{5衐`Zߠը卌]TThzOW9b c b Z|:k{R  5#}7[zQV;(~7yOB,?~R2!y-ZsL9%K!" JUJ4L: SN% mgLS@8/"qSE<0yY7B/2.=tRNSD W&#T= _q\(!me)pFJRԃBQRX}Ո1tt"f|:Y* !IDAT(c` 0aW"*&#))dm΍)! +V]M\NUM]Cy[;aGCM:2fF[N24&l .Z| mlal}3:&NrrFp6mfK˜=<$[bkZ}|[o  cAX?!N$ɹ I)i32=ŗ_P(Z,b2r&F@bČںzL@8XYF9 3qi:1FCSIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/win/previous.png 777 0 0 1602 11406632726 23644 0PNG  IHDRw=gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATH͖kHaǏZ4 n&vS, i%`rf 2B@$dm]RDPT%NM7]1ܲ)ά7ޝFt5>ss "MH%`7Y<nxDC3&%@LI<<ҽ*)$XJ8,8x<^1:U/d "f$C^9(a)vB*I`Yy`cu/&sB| e; {1mPOa ⳛz%1.Nt'9ɒxmѐ@8 ~B+)ԕDcdh>g2(L!uhuoJѴl/fP%B9Lc_= 9U."B}Mc^PvmJyYR{| z0S4S % *ah]Q^; 1]9]%Ai3 UxiZqB̉\1P2XE֑ulF|~7b>Dm*~K`O<J"'4jO sL> <ā &YBK,j!=Öfhj:NizB|Wd'[̉[ n֪ &g6GYٻRՉK_RŧcrڵVT?w_ѡsxrH&@VA!=}N^J>|,/H1YQ'Ț~۱]2 an:$?<ɂ08Rq  VcH4tj'pk /$iy$b|We_F%Xu0D@U난T j_,鉆1D;(p"xNf5gCϵ.H#^e7x& -nݎŒǏNOO׶$C0;T"CA cl<" j`0hqjjqddddFDDL:t G@E_F:,Y($װΡ淏fUOWadd۶mc@'`0|X]]a04 t:rrrߏxqcrrVUt7;; I lFZZ˃>غH@0>fhmmhvT1T"N${;|>A A066а@] 55QQQ z6AL:9::^v:3C0ԴzWr9sFfee!%%E0w:4՜fA\\<{>_())3 5-..FWWY&V0rTnn./_h8=Br~G *i20]S RI⒍K6B &Ο?5k,2 B2i)0==W ܼGUT"11Qo2"LÛ}M:Ҽ.؀l .it9 %D磢_#/7IENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/win/synctoc.png 777 0 0 2323 11406632726 23453 0PNG  IHDRw=IDATx^KlefέmKPZ/@)5i-4 5&ƍ+q+ݸ`ƅѕ&h$V *H5PҦBH)ZNO93g84iydIgK*ݲ5ӻeD2zGs'l6 m%Uy0a7kUU:yKScow_НlҔhh'i[R,Gv?U>L !}~3>1~6Ͻ&)*xS}_o.L%Ki02Fui/ 2BSX})2Nk6*00c\?74Q8yC p1m!b͐J_`X IQ֊%(Rs,RK ;ƛ@Ɵ&LP@}J8t$eΖt]S%SQZڹ]!F_ ĝݍϳ5fǢTnO 9 }*J;! QϹ8Nƶ,5]oV%|)5he \\/Ǯh#WdqhGal۱F(?WϭbCwbC6z mK| pjknh2+ 1;A©(=nOO T`QƠ`Gtr \e×%ytcߗ_}Z[(i昊Wӽ9 ^!M Z~{^",p=3TukH-ٰ̠n+]2WtbRjbM!Ó(k 6 Y.5y {>Eo2'H"v`@*֚&^:3>/yμGA݋Z-(%ZNL~1p§+Dr~e-@1X@k BY&%)a QV%#㞐NJk2W<,R$-eLbUOkwԉ/Ja9J\ZϊBƒ?K*-754eǜBHc'?%`&tKrPXe`X\ J^dۚlIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/win/whatsthis.png 777 0 0 2020 11406632726 24001 0PNG  IHDRw=gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATH_LSgq.lL K*4dU7nV'K`.ЉҎ! VaP hĵhk& -m+Rp~fJ)z{>' zO!rV[yȔ)'R9Uq4d8^.I\Mz[ȓC XBYxk2>81iWIȎe >QKc gO#b"2УAA21֜'o" ND|brCB1y&?'8xD`(Pe-OP-O9%evL.~iAc>?5(t8Vda7xQigcGZlޒyQ$0D.4QGU3oz"*N3D ISq[7(4ynyg0niM_쬿_puۋ(wtp Sa%@iwW|M9wsơlEdIC>1/i-5xN$U>հ:]IW}&^j J)ܳ";#7"`)"R%}qkIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/win/zoomin.png 777 0 0 2270 11406632726 23305 0PNG  IHDRw=gAMAOX2tEXtSoftwareAdobe ImageReadyqe<JIDATHVaL[el2i e$K7VZNBqCBcccYa ))fڊ)C3 PjWJ#lQY1n޻E3K_߽=}eM?1J2(#<eQP"DRKF05>>~fL&]"9"[w?鄶60zb ;H$[95v4 k߶ֺ7C?wZ? nj]h4ˌD'IZ95/=\sCO4wYLVg2‰ P__?#^Lr-E IZ95>yv[%<_V  ̣m_x7<>AGDu v4TQhq+9}G`JM'Eyd{ԹH W!b+"EiiJC4QƬrx^!2t Ƀn烊kXBG"0o[oYlL*ݰ>b(^`Iہ%`k秦&GD"rɊW4PPlN'+[h9\k׭X׋##WşJ!ݐ-4P"&YRJMM46\x;%O Ɋ(iάo%;{RV'Dn\Lr1*.D9+Vs͸MkW*7")tTA'fD:x\Q/G٢GBl!KP:4韼M 둿)DܕݧHүZ-R9ш}x_{d[#~x6/y55/G߬fa0%%%X Kt|Dwj.UTL&녁t088. |999 x}:bq(95X1 %oC3]y8PY쯙li@o0\MXO,t|޲5tV3([- F_88Rqp8bi^HrG &Isj.:ɀxScrLT8SN9=|~Y6liinDuFE v EVLW3ؗ=Gn*x$x@)yꚃ< .>X,SFMkkk!!!.eJ(9ۯnS?t.J7nltZ 5og?fdXv!qi ?%F'-PҜdqzAj޶mV*`];& \J(!+[hDL5~DHNN5]V]ڝ3%O ɊZ(i H}2fh{0NnKrm!"6DGX+ ]wc]$Pr΍]ؿ5ql.I+]`4{EHҷ>f=SCcON+%ZD#Sc{~"IgRmvЍw̒ȅm#/}vgv_o&MuIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/images/wrap.png 777 0 0 764 11406632726 22134 0PNG  IHDR r| pHYs  tIME  + bKGDIDAT(ύ=KQǥXڐYC(.QZOo؋YӋ:Q)jE3yy8G4<;=w5)8Ϛoh@EyUхRe(ƽ;\xPN W]͡jK*Y̠Œ ctpq|Rb&n1{c]X0u\x@n niaZF0< g1>!b&6MyHr~4 wLaj)6RdK #~ ;GkɆ0Ӫ$ w7m[pIo{gM뗴N!kko5(8z|GhEIENDB`qt-assistant-qassistantclient-library-compat-version-4.6.3/index.cpp 777 0 0 40364 11406632726 21063 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "index.h" #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE struct Term { Term() : frequency(-1) {} Term( const QString &t, int f, QVector l ) : term( t ), frequency( f ), documents( l ) {} QString term; int frequency; QVectordocuments; bool operator<( const Term &i2 ) const { return frequency < i2.frequency; } }; QDataStream &operator>>( QDataStream &s, Document &l ) { s >> l.docNumber; s >> l.frequency; return s; } QDataStream &operator<<( QDataStream &s, const Document &l ) { s << (qint16)l.docNumber; s << (qint16)l.frequency; return s; } Index::Index( const QString &dp, const QString &hp ) : QObject( 0 ), docPath( dp ) { Q_UNUSED(hp); alreadyHaveDocList = false; lastWindowClosed = false; connect( qApp, SIGNAL(lastWindowClosed()), this, SLOT(setLastWinClosed()) ); } Index::Index( const QStringList &dl, const QString &hp ) : QObject( 0 ) { Q_UNUSED(hp); docList = dl; alreadyHaveDocList = true; lastWindowClosed = false; connect( qApp, SIGNAL(lastWindowClosed()), this, SLOT(setLastWinClosed()) ); } void Index::setLastWinClosed() { lastWindowClosed = true; } void Index::setDictionaryFile( const QString &f ) { dictFile = f; } void Index::setDocListFile( const QString &f ) { docListFile = f; } void Index::setDocList( const QStringList &lst ) { docList = lst; } int Index::makeIndex() { if ( !alreadyHaveDocList ) setupDocumentList(); if ( docList.isEmpty() ) return 1; QStringList::Iterator it = docList.begin(); int steps = docList.count() / 100; if ( !steps ) steps++; int prog = 0; for ( int i = 0; it != docList.end(); ++it, ++i ) { if ( lastWindowClosed ) { return -1; } QUrl url(*it); parseDocument( url.toLocalFile(), i ); if ( i%steps == 0 ) { prog++; emit indexingProgress( prog ); } } return 0; } void Index::setupDocumentList() { QDir d( docPath ); QStringList filters; filters.append(QLatin1String("*.html")); QStringList lst = d.entryList(filters); QStringList::ConstIterator it = lst.constBegin(); for ( ; it != lst.constEnd(); ++it ) docList.append( QLatin1String("file:") + docPath + QLatin1String("/") + *it ); } void Index::insertInDict( const QString &str, int docNum ) { if ( str == QLatin1String("amp") || str == QLatin1String("nbsp")) return; Entry *e = 0; if ( dict.count() ) e = dict[ str ]; if ( e ) { if ( e->documents.last().docNumber != docNum ) e->documents.append( Document(docNum, 1 ) ); else e->documents.last().frequency++; } else { dict.insert( str, new Entry( docNum ) ); } } QString Index::getCharsetForDocument(QFile *file) { QTextStream s(file); QString contents = s.readAll(); QString encoding; int start = contents.indexOf(QLatin1String(" 0) { int end = contents.indexOf(QLatin1String(">"), start); QString meta = contents.mid(start+5, end-start); meta = meta.toLower(); QRegExp r(QLatin1String("charset=([^\"\\s]+)")); if (r.indexIn(meta) != -1) { encoding = r.cap(1); } } file->seek(0); if (encoding.isEmpty()) return QLatin1String("utf-8"); return encoding; } void Index::parseDocument( const QString &filename, int docNum ) { QFile file( filename ); if ( !file.open(QFile::ReadOnly) ) { qWarning( "can not open file %s", qPrintable(filename) ); return; } QTextStream s(&file); QString en = getCharsetForDocument(&file); s.setCodec(QTextCodec::codecForName(en.toLatin1().constData())); QString text = s.readAll(); if (text.isNull()) return; bool valid = true; const QChar *buf = text.unicode(); QChar str[64]; QChar c = buf[0]; int j = 0; int i = 0; while ( j < text.length() ) { if ( c == QLatin1Char('<') || c == QLatin1Char('&') ) { valid = false; if ( i > 1 ) insertInDict( QString(str,i), docNum ); i = 0; c = buf[++j]; continue; } if ( ( c == QLatin1Char('>') || c == QLatin1Char(';') ) && !valid ) { valid = true; c = buf[++j]; continue; } if ( !valid ) { c = buf[++j]; continue; } if ( ( c.isLetterOrNumber() || c == QLatin1Char('_') ) && i < 63 ) { str[i] = c.toLower(); ++i; } else { if ( i > 1 ) insertInDict( QString(str,i), docNum ); i = 0; } c = buf[++j]; } if ( i > 1 ) insertInDict( QString(str,i), docNum ); file.close(); } void Index::writeDict() { QFile f( dictFile ); if ( !f.open(QFile::WriteOnly ) ) return; QDataStream s( &f ); for(QHash::Iterator it = dict.begin(); it != dict.end(); ++it) { s << it.key(); s << it.value()->documents.count(); s << it.value()->documents; } f.close(); writeDocumentList(); } void Index::writeDocumentList() { QFile f( docListFile ); if ( !f.open(QFile::WriteOnly ) ) return; QDataStream s( &f ); s << docList; } void Index::readDict() { QFile f( dictFile ); if ( !f.open(QFile::ReadOnly ) ) return; dict.clear(); QDataStream s( &f ); QString key; int numOfDocs; QVector docs; while ( !s.atEnd() ) { s >> key; s >> numOfDocs; docs.resize(numOfDocs); s >> docs; dict.insert( key, new Entry( docs ) ); } f.close(); readDocumentList(); } void Index::readDocumentList() { QFile f( docListFile ); if ( !f.open(QFile::ReadOnly ) ) return; QDataStream s( &f ); s >> docList; } QStringList Index::query( const QStringList &terms, const QStringList &termSeq, const QStringList &seqWords ) { QList termList; for (QStringList::ConstIterator it = terms.begin(); it != terms.end(); ++it ) { Entry *e = 0; if ( (*it).contains(QLatin1Char('*')) ) { QVector wcts = setupDummyTerm( getWildcardTerms( *it ) ); termList.append( Term(QLatin1String("dummy"), wcts.count(), wcts ) ); } else if ( dict[ *it ] ) { e = dict[ *it ]; termList.append( Term( *it, e->documents.count(), e->documents ) ); } else { return QStringList(); } } if ( !termList.count() ) return QStringList(); qSort(termList); QVector minDocs = termList.takeFirst().documents; for(QList::Iterator it = termList.begin(); it != termList.end(); ++it) { Term *t = &(*it); QVector docs = t->documents; for(QVector::Iterator minDoc_it = minDocs.begin(); minDoc_it != minDocs.end(); ) { bool found = false; for (QVector::ConstIterator doc_it = docs.constBegin(); doc_it != docs.constEnd(); ++doc_it ) { if ( (*minDoc_it).docNumber == (*doc_it).docNumber ) { (*minDoc_it).frequency += (*doc_it).frequency; found = true; break; } } if ( !found ) minDoc_it = minDocs.erase( minDoc_it ); else ++minDoc_it; } } QStringList results; qSort( minDocs ); if ( termSeq.isEmpty() ) { for(QVector::Iterator it = minDocs.begin(); it != minDocs.end(); ++it) results << docList.at((int)(*it).docNumber); return results; } QString fileName; for(QVector::Iterator it = minDocs.begin(); it != minDocs.end(); ++it) { fileName = docList[ (int)(*it).docNumber ]; if ( searchForPattern( termSeq, seqWords, fileName ) ) results << fileName; } return results; } QString Index::getDocumentTitle( const QString &fullFileName ) { QUrl url(fullFileName); QString fileName = url.toLocalFile(); if (documentTitleCache.contains(fileName)) return documentTitleCache.value(fileName); QFile file( fileName ); if ( !file.open( QFile::ReadOnly ) ) { qWarning( "cannot open file %s", qPrintable(fileName) ); return fileName; } QTextStream s( &file ); QString text = s.readAll(); int start = text.indexOf(QLatin1String(""), 0, Qt::CaseInsensitive) + 7; int end = text.indexOf(QLatin1String(""), 0, Qt::CaseInsensitive); QString title = tr("Untitled"); if (end - start > 0) { title = text.mid(start, end - start); if (Qt::mightBeRichText(title)) { QTextDocument doc; doc.setHtml(title); title = doc.toPlainText(); } } documentTitleCache.insert(fileName, title); return title; } QStringList Index::getWildcardTerms( const QString &term ) { QStringList lst; QStringList terms = split( term ); QStringList::Iterator iter; for(QHash::Iterator it = dict.begin(); it != dict.end(); ++it) { int index = 0; bool found = false; QString text( it.key() ); for ( iter = terms.begin(); iter != terms.end(); ++iter ) { if ( *iter == QLatin1String("*") ) { found = true; continue; } if ( iter == terms.begin() && (*iter)[0] != text[0] ) { found = false; break; } index = text.indexOf( *iter, index ); if ( *iter == terms.last() && index != (int)text.length()-1 ) { index = text.lastIndexOf( *iter ); if ( index != (int)text.length() - (int)(*iter).length() ) { found = false; break; } } if ( index != -1 ) { found = true; index += (*iter).length(); continue; } else { found = false; break; } } if ( found ) lst << text; } return lst; } QStringList Index::split( const QString &str ) { QStringList lst; int j = 0; int i = str.indexOf(QLatin1Char('*'), j ); if (str.startsWith(QLatin1String("*"))) lst << QLatin1String("*"); while ( i != -1 ) { if ( i > j && i <= (int)str.length() ) { lst << str.mid( j, i - j ); lst << QLatin1String("*"); } j = i + 1; i = str.indexOf(QLatin1Char('*'), j ); } int l = str.length() - 1; if ( str.mid( j, l - j + 1 ).length() > 0 ) lst << str.mid( j, l - j + 1 ); return lst; } QVector Index::setupDummyTerm( const QStringList &terms ) { QList termList; for (QStringList::ConstIterator it = terms.begin(); it != terms.end(); ++it) { Entry *e = 0; if ( dict[ *it ] ) { e = dict[ *it ]; termList.append( Term( *it, e->documents.count(), e->documents ) ); } } QVector maxList(0); if ( !termList.count() ) return maxList; qSort(termList); maxList = termList.takeLast().documents; for(QList::Iterator it = termList.begin(); it != termList.end(); ++it) { Term *t = &(*it); QVector docs = t->documents; for (QVector::iterator docIt = docs.begin(); docIt != docs.end(); ++docIt ) { if ( maxList.indexOf( *docIt ) == -1 ) maxList.append( *docIt ); } } return maxList; } void Index::buildMiniDict( const QString &str ) { if ( miniDict[ str ] ) miniDict[ str ]->positions.append( wordNum ); ++wordNum; } bool Index::searchForPattern( const QStringList &patterns, const QStringList &words, const QString &fileName ) { QUrl url(fileName); QString fName = url.toLocalFile(); QFile file( fName ); if ( !file.open( QFile::ReadOnly ) ) { qWarning( "cannot open file %s", qPrintable(fName) ); return false; } wordNum = 3; miniDict.clear(); QStringList::ConstIterator cIt = words.begin(); for ( ; cIt != words.end(); ++cIt ) miniDict.insert( *cIt, new PosEntry( 0 ) ); QTextStream s( &file ); QString text = s.readAll(); bool valid = true; const QChar *buf = text.unicode(); QChar str[64]; QChar c = buf[0]; int j = 0; int i = 0; while ( j < text.length() ) { if ( c == QLatin1Char('<') || c == QLatin1Char('&') ) { valid = false; if ( i > 1 ) buildMiniDict( QString(str,i) ); i = 0; c = buf[++j]; continue; } if ( ( c == QLatin1Char('>') || c == QLatin1Char(';') ) && !valid ) { valid = true; c = buf[++j]; continue; } if ( !valid ) { c = buf[++j]; continue; } if ( ( c.isLetterOrNumber() || c == QLatin1Char('_') ) && i < 63 ) { str[i] = c.toLower(); ++i; } else { if ( i > 1 ) buildMiniDict( QString(str,i) ); i = 0; } c = buf[++j]; } if ( i > 1 ) buildMiniDict( QString(str,i) ); file.close(); QStringList::ConstIterator patIt = patterns.begin(); QStringList wordLst; QList a, b; QList::iterator aIt; for ( ; patIt != patterns.end(); ++patIt ) { wordLst = (*patIt).split(QLatin1Char(' ')); a = miniDict[ wordLst[0] ]->positions; for ( int j = 1; j < (int)wordLst.count(); ++j ) { b = miniDict[ wordLst[j] ]->positions; aIt = a.begin(); while ( aIt != a.end() ) { if ( b.contains( *aIt + 1 )) { (*aIt)++; ++aIt; } else { aIt = a.erase( aIt ); } } } } if ( a.count() ) return true; return false; } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/index.h 777 0 0 10604 11406632726 20522 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef INDEX_H #define INDEX_H #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE struct Document { Document( int d, int f ) : docNumber( d ), frequency( f ) {} Document() : docNumber( -1 ), frequency( 0 ) {} bool operator==( const Document &doc ) const { return docNumber == doc.docNumber; } bool operator<( const Document &doc ) const { return frequency > doc.frequency; } bool operator<=( const Document &doc ) const { return frequency >= doc.frequency; } bool operator>( const Document &doc ) const { return frequency < doc.frequency; } qint16 docNumber; qint16 frequency; }; QDataStream &operator>>( QDataStream &s, Document &l ); QDataStream &operator<<( QDataStream &s, const Document &l ); class Index : public QObject { Q_OBJECT public: struct Entry { Entry( int d ) { documents.append( Document( d, 1 ) ); } Entry( QVector l ) : documents( l ) {} QVector documents; }; struct PosEntry { PosEntry( int p ) { positions.append( p ); } QList positions; }; Index( const QString &dp, const QString &hp ); Index( const QStringList &dl, const QString &hp ); void writeDict(); void readDict(); int makeIndex(); QStringList query( const QStringList&, const QStringList&, const QStringList& ); QString getDocumentTitle( const QString& ); void setDictionaryFile( const QString& ); void setDocListFile( const QString& ); void setDocList( const QStringList & ); signals: void indexingProgress( int ); private slots: void setLastWinClosed(); private: void setupDocumentList(); void parseDocument( const QString&, int ); void insertInDict( const QString&, int ); void writeDocumentList(); void readDocumentList(); QStringList getWildcardTerms( const QString& ); QStringList split( const QString& ); QVector setupDummyTerm( const QStringList& ); bool searchForPattern( const QStringList&, const QStringList&, const QString& ); void buildMiniDict( const QString& ); QString getCharsetForDocument(QFile *); QStringList docList; QHash dict; QHash miniDict; uint wordNum; QString docPath; QString dictFile, docListFile; bool alreadyHaveDocList; bool lastWindowClosed; QHash documentTitleCache; }; #endif QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/Info_mac.plist 777 0 0 1044 11406632726 22010 0 CFBundleIconFile @ICON@ CFBundlePackageType APPL CFBundleGetInfoString Created by Qt/QMake CFBundleSignature ???? CFBundleIdentifier com.trolltech.assistant-compat CFBundleExecutable @EXECUTABLE@ qt-assistant-qassistantclient-library-compat-version-4.6.3/LGPL_EXCEPTION.txt 777 0 0 2271 11251143443 22127 0Nokia Qt LGPL Exception version 1.1 As an additional permission to the GNU Lesser General Public License version 2.1, the object code form of a "work that uses the Library" may incorporate material from a header file that is part of the Library. You may distribute such object code under terms of your choice, provided that: (i) the header files of the Library have not been modified; and (ii) the incorporated material is limited to numerical parameters, data structure layouts, accessors, macros, inline functions and templates; and (iii) you comply with the terms of Section 6 of the GNU Lesser General Public License version 2.1. Moreover, you may apply this exception to a modified version of the Library, provided that such modification does not involve copying material from the Library into the modified Library's header files unless such material is limited to (i) numerical parameters; (ii) data structure layouts; (iii) accessors; and (iv) small macros, templates and inline functions of five lines or less in length. Furthermore, you are not required to apply this additional permission to a modified version of the Library. qt-assistant-qassistantclient-library-compat-version-4.6.3/lib/ 777 0 0 0 11410365631 17675 5qt-assistant-qassistantclient-library-compat-version-4.6.3/lib/lib.pro 777 0 0 4401 11406632726 21256 0TEMPLATE = lib QT += network TARGET = QtAssistantClient isEmpty(QT_MAJOR_VERSION) { VERSION=4.3.0 } else { VERSION=$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION} } CONFIG += qt warn_on mac|win32:CONFIG += debug_and_release mac:unix:CONFIG += explicitlib CONFIG -= dll HEADERS = qassistantclient.h \ qassistantclient_global.h SOURCES = qassistantclient.cpp DESTDIR = ../../../../lib DLLDESTDIR = ../../../../bin unix { QMAKE_CFLAGS += $$QMAKE_CFLAGS_SHLIB QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_SHLIB } DEFINES += QT_ASSISTANT_CLIENT_LIBRARY contains(CONFIG, static) { DEFINES += QT_ASSISTANT_CLIENT_STATIC } #load up the headers info CONFIG += qt_install_headers HEADERS_PRI = $$QT_BUILD_TREE/include/QtAssistant/headers.pri include($$HEADERS_PRI, "", true)|clear(HEADERS_PRI) #mac frameworks mac:!static:contains(QT_CONFIG, qt_framework) { TARGET = QtAssistant # Change the name to match the headers QMAKE_FRAMEWORK_BUNDLE_NAME = $$TARGET CONFIG += lib_bundle qt_no_framework_direct_includes qt_framework CONFIG(debug, debug|release) { !build_pass:CONFIG += build_all } else { #release !debug_and_release|build_pass { CONFIG -= qt_install_headers #no need to install these as well FRAMEWORK_HEADERS.version = Versions FRAMEWORK_HEADERS.files = $$SYNCQT.HEADER_FILES $$SYNCQT.HEADER_CLASSES FRAMEWORK_HEADERS.path = Headers } QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS } } TARGET = $$qtLibraryTarget($$TARGET$$QT_LIBINFIX) #done towards the end target.path=$$[QT_INSTALL_LIBS] INSTALLS += target win32 { dlltarget.path=$$[QT_INSTALL_BINS] INSTALLS += dlltarget } qt_install_headers { assistant_headers.files = $$SYNCQT.HEADER_FILES $$SYNCQT.HEADER_CLASSES assistant_headers.path = $$[QT_INSTALL_HEADERS]/QtAssistant INSTALLS += assistant_headers } unix { CONFIG += create_pc QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS] QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS]/QtAssistant QMAKE_PKGCONFIG_CFLAGS = -I$$[QT_INSTALL_HEADERS] QMAKE_PKGCONFIG_DESTDIR = pkgconfig QMAKE_PKGCONFIG_REQUIRES += QtNetwork } qt-assistant-qassistantclient-library-compat-version-4.6.3/lib/qassistantclient.cpp 777 0 0 35527 11406632726 24120 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qassistantclient.h" #include #include #include #include #include QT_BEGIN_NAMESPACE class QAssistantClientPrivate { friend class QAssistantClient; QStringList arguments; }; static QMap *dpointers = 0; static QAssistantClientPrivate *data( const QAssistantClient *client, bool create=false ) { if( !dpointers ) dpointers = new QMap; QAssistantClientPrivate *d = (*dpointers)[client]; if( !d && create ) { d = new QAssistantClientPrivate; dpointers->insert( client, d ); } return d; } /*! \class QAssistantClient \obsolete \brief The QAssistantClient class provides a means of using Qt Assistant as an application's help tool. \ingroup helpsystem \bold{Note:} \e{This class is obsolete and only required when using the old Qt Assistant, now called assistant_adp. If you want to use the new Qt Assistant as a remote help viewer, simple create a QProcess instance and specify \tt{assistant} as its executable. The following code shows how to start Qt Assistant and request a certain page to be shown:} \snippet doc/src/snippets/code/tools_assistant_compat_lib_qassistantclient.cpp 0 \e{For a complete example using the Qt Assistant remotely, see the \l {help/remotecontrol}{Remote Control} example.} In order to make Qt Assistant act as a customized help tool for your application, you must provide your application with a QAssistantClient object in addition to a \l {assistant-manual.html} {Qt Assistant Document Profile} (\c .adp file) and the associated documentation. Note that the QAssistantClient class is not included in the Qt library. To use it you must add the following line to your pro file: \snippet doc/src/snippets/code/tools_assistant_compat_lib_qassistantclient.cpp 1 A QAssistantClient instance can open or close Qt Assistant whenever it is required. Once you have created a QAssistantClient instance, specifying the path to the Qt Assistant executable, using Qt Assistant is simple: You can either call the openAssistant() slot to show the defined start page of the documentation, or you can call the showPage() slot to show a particular help page. When you call openAssistant() and showPage(), Qt Assistant will be launched if it isn't already running. When Qt Assistant is running, the isOpen() function returns true. When calling showPage() the Qt Assistant instance will also be brought to the foreground if its hidden. The showPage() slot can be called multiple times, while calling openAssistant() several times without closing the application in between, will have no effect. You can close Qt Assistant at any time using the closeAssistant() slot. When you call openAssistant(), or you call showPage() without a previous call to openAssistant(), the assistantOpened() signal is emitted. Similarly when closeAssistant() is called, assistantClosed() is emitted. In either case, if an error occurs, error() is emitted. One QAssistantClient instance interacts with one Qt Assistant instance, so every time you call openAssistant(), showPage() or closeAssistant() they are applied to the particular Qt Assistant instance associated with the QAssistantClient. Qt Assistant's documentation set can be altered using the command line arguments that are passed to the application when it is launched. When started without any options, Qt Assistant displays a default set of documentation. When Qt is installed, the default documentation set in Qt Assistant contains the Qt reference documentation as well as the tools that come with Qt, such as \QD and \c qmake. Use the setArguments() function to specify the command line arguments. You can add or remove documentation from Qt Assistant by adding and removing the relevant content files: The command line arguments are \c {-addContentFile file.dcf} and \c {-removeContentFile file.dcf} respectively. You can make Qt Assistant run customized documentation sets that are separate from the Qt documentation, by specifying a profile: \c {-profile myapplication.adp}. The profile format can also be used to alter several of Qt Assistant's properties such as its title and startpage. The Documentation Content File (\c .dcf) and Qt Assistant Documentation Profile (\c .adp) formats are documented in the \l {assistant-manual.html}{Qt Assistant Manual}. For a complete example using the QAssistantClient class, see the \e{Simple Text Viewer} example. The example shows how you can make Qt Assistant act as a customized help tool for your application using the QAssistantClient class combined with a Qt Assistant Document Profile. \sa {Qt Assistant Manual}, {Simple Text Viewer Example} */ /*! \fn void QAssistantClient::assistantOpened() This signal is emitted when Qt Assistant is opened and the client-server communication is set up. \sa openAssistant(), showPage() */ /*! \fn void QAssistantClient::assistantClosed() This signal is emitted when the connection to Qt Assistant is closed. This happens when the user exits Qt Assistant, if an error in the server or client occurs, or if closeAssistant() is called. \sa closeAssistant() */ /*! \fn void QAssistantClient::error( const QString &message ) This signal is emitted if Qt Assistant cannot be started, or if an error occurs during the initialization of the connection between Qt Assistant and the calling application. The \a message provides an explanation of the error. */ /*! Constructs an assistant client with the specified \a parent. For systems other than Mac OS, \a path specifies the path to the Qt Assistant executable. For Mac OS, \a path specifies a directory containing a valid assistant.app bundle. If \a path is the empty string, the system path (\c{%PATH%} or \c $PATH) is used. */ QAssistantClient::QAssistantClient( const QString &path, QObject *parent ) : QObject( parent ), host ( QLatin1String("localhost") ) { #if defined(Q_OS_MAC) const QString assistant = QLatin1String("Assistant_adp"); #else const QString assistant = QLatin1String("assistant_adp"); #endif if ( path.isEmpty() ) assistantCommand = assistant; else { QFileInfo fi( path ); if ( fi.isDir() ) assistantCommand = path + QLatin1String("/") + assistant; else assistantCommand = path; } #if defined(Q_OS_MAC) assistantCommand += QLatin1String(".app/Contents/MacOS/Assistant_adp"); #endif socket = new QTcpSocket( this ); connect( socket, SIGNAL(connected()), SLOT(socketConnected()) ); connect( socket, SIGNAL(disconnected()), SLOT(socketConnectionClosed()) ); connect( socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(socketError()) ); opened = false; proc = new QProcess( this ); port = 0; pageBuffer = QLatin1String(""); connect( proc, SIGNAL(readyReadStandardError()), this, SLOT(readStdError()) ); connect( proc, SIGNAL(error(QProcess::ProcessError)), this, SLOT(procError(QProcess::ProcessError)) ); } /*! Destroys the assistant client object. */ QAssistantClient::~QAssistantClient() { if ( proc->state() == QProcess::Running ) proc->terminate(); if( dpointers ) { QAssistantClientPrivate *d = (*dpointers)[ this ]; if ( d ) { dpointers->remove(this); delete d; if( dpointers->isEmpty() ) { delete dpointers; dpointers = 0; } } } } /*! Opens Qt Assistant, i.e. sets up the client-server communication between the application and Qt Assistant, and shows the start page specified by the current \l {assistant-manual.html} {Qt Assistant Document Profile}. If there is no specfied profile, and Qt is installed, the default start page is the Qt Reference Documentation's index page. If the connection is already established, this function does nothing. Use the showPage() function to show another page. If an error occurs, the error() signal is emitted. \sa showPage(), assistantOpened() */ void QAssistantClient::openAssistant() { if ( proc->state() == QProcess::Running ) return; QStringList args; args.append(QLatin1String("-server")); if( !pageBuffer.isEmpty() ) { args.append( QLatin1String("-file") ); args.append( pageBuffer ); } QAssistantClientPrivate *d = data( this ); if( d ) { QStringList::ConstIterator it = d->arguments.constBegin(); while( it!=d->arguments.constEnd() ) { args.append( *it ); ++it; } } connect( proc, SIGNAL(readyReadStandardOutput()), this, SLOT(readPort()) ); proc->start(assistantCommand, args); } void QAssistantClient::procError(QProcess::ProcessError err) { switch (err) { case QProcess::FailedToStart: emit error( tr( "Failed to start Qt Assistant." ) ); break; case QProcess::Crashed: emit error( tr( "Qt Assistant crashed." ) ); break; default: emit error( tr( "Error while running Qt Assistant." ) ); } } void QAssistantClient::readPort() { QString p(QString::fromLatin1(proc->readAllStandardOutput())); quint16 port = p.toUShort(); if ( port == 0 ) { emit error( tr( "Cannot connect to Qt Assistant." ) ); return; } socket->connectToHost( host, port ); disconnect( proc, SIGNAL(readyReadStandardOutput()), this, SLOT(readPort()) ); } /*! Closes the Qt Assistant instance. \sa openAssistant(), assistantClosed() */ void QAssistantClient::closeAssistant() { if ( !opened ) return; bool blocked = proc->blockSignals(true); proc->terminate(); if (!proc->waitForFinished(2000)) { // If the process hasn't died after 2 seconds, // we kill it, causing it to exit immediately. proc->kill(); } proc->blockSignals(blocked); } /*! Brings Qt Assistant to the foreground showing the given \a page. The \a page parameter is a path to an HTML file (e.g., QLatin1String("/home/pasquale/superproduct/docs/html/intro.html")). If Qt Assistant hasn't been opened yet, this function will call the openAssistant() slot with the specified page as the start page. \note The first time Qt Assistant is started, its window will open in front of the application's windows. Subsequent calls to this function will only load the specified pages in Qt Assistant and will not display its window in front of the application's windows. \sa openAssistant() */ void QAssistantClient::showPage( const QString &page ) { if (opened) { QTextStream os( socket ); os << page << QLatin1String("\n"); } else { pageBuffer = page; if (proc->state() == QProcess::NotRunning) { openAssistant(); pageBuffer.clear(); return; } } } /*! \property QAssistantClient::open \brief whether Qt Assistant is open */ bool QAssistantClient::isOpen() const { return opened; } void QAssistantClient::socketConnected() { opened = true; if ( !pageBuffer.isEmpty() ) showPage( pageBuffer ); emit assistantOpened(); } void QAssistantClient::socketConnectionClosed() { opened = false; emit assistantClosed(); } void QAssistantClient::socketError() { QAbstractSocket::SocketError err = socket->error(); if (err == QTcpSocket::ConnectionRefusedError) emit error( tr( "Could not connect to Assistant: Connection refused" ) ); else if (err == QTcpSocket::HostNotFoundError) emit error( tr( "Could not connect to Assistant: Host not found" ) ); else if (err != QTcpSocket::RemoteHostClosedError) emit error( tr( "Communication error" ) ); } void QAssistantClient::readStdError() { QString errmsg = QString::fromLatin1(proc->readAllStandardError()); if (!errmsg.isEmpty()) emit error( errmsg.simplified() ); } /*! \fn void QAssistantClient::setArguments(const QStringList &arguments) Sets the command line \a arguments that are passed to Qt Assistant when it is launched. The command line arguments can be used to alter Qt Assistant's documentation set. When started without any options, Qt Assistant displays a default set of documentation. When Qt is installed, the default documentation set in Qt Assistant contains the Qt reference documentation as well as the tools that come with Qt, such as Qt Designer and qmake. */ void QAssistantClient::setArguments( const QStringList &args ) { QAssistantClientPrivate *d = data( this, true ); d->arguments = args; } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/lib/qassistantclient.h 777 0 0 6077 11406632726 23543 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QASSISTANTCLIENT_H #define QASSISTANTCLIENT_H #include #include #include #include #include QT_BEGIN_HEADER QT_BEGIN_NAMESPACE class QTcpSocket; class QT_ASSISTANT_CLIENT_EXPORT QAssistantClient : public QObject { Q_OBJECT Q_PROPERTY( bool open READ isOpen ) public: QAssistantClient( const QString &path, QObject *parent = 0); ~QAssistantClient(); bool isOpen() const; void setArguments( const QStringList &args ); public Q_SLOTS: virtual void openAssistant(); virtual void closeAssistant(); virtual void showPage( const QString &page ); Q_SIGNALS: void assistantOpened(); void assistantClosed(); void error( const QString &msg ); private Q_SLOTS: void socketConnected(); void socketConnectionClosed(); void readPort(); void procError(QProcess::ProcessError err); void socketError(); void readStdError(); private: QTcpSocket *socket; QProcess *proc; quint16 port; QString host, assistantCommand, pageBuffer; bool opened; }; QT_END_NAMESPACE QT_END_HEADER #endif qt-assistant-qassistantclient-library-compat-version-4.6.3/lib/qassistantclient_global.h 777 0 0 4537 11406632726 25062 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QASSISTANTCLIENT_GLOBAL_H #define QASSISTANTCLIENT_GLOBAL_H #include QT_BEGIN_HEADER QT_BEGIN_NAMESPACE #if defined(QT_ASSISTANT_CLIENT_STATIC) || (!defined(QT_SHARED) && !defined(QT_DLL)) # define QT_ASSISTANT_CLIENT_EXPORT #elif defined(QT_ASSISTANT_CLIENT_LIBRARY) # define QT_ASSISTANT_CLIENT_EXPORT Q_DECL_EXPORT #else # define QT_ASSISTANT_CLIENT_EXPORT Q_DECL_IMPORT #endif QT_END_NAMESPACE QT_END_HEADER #endif qt-assistant-qassistantclient-library-compat-version-4.6.3/LICENSE.GPL3 777 0 0 106700 11373064143 20771 0 GNU GENERAL PUBLIC LICENSE The Qt GUI Toolkit is Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). Contact: Qt Software Information (qt-info@nokia.com) You may use, distribute and copy the Qt GUI Toolkit under the terms of GNU General Public License version 3, which is displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ------------------------------------------------------------------------- In addition, as a special exception, Trolltech gives permission to link the code of its release of Qt with the OpenSSL project's "OpenSSL" library (or modified versions of it that use the same license as the "OpenSSL" library), and distribute the linked executables. You must comply with the GNU General Public License version 2 or the GNU General Public License version 3 in all respects for all of the code used other than the "OpenSSL" code. If you modify this file, you may extend this exception to your version of the file, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version of this file. qt-assistant-qassistantclient-library-compat-version-4.6.3/LICENSE.LGPL 777 0 0 65325 11324052666 21014 0 GNU LESSER GENERAL PUBLIC LICENSE The Qt GUI Toolkit is Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). Contact: Nokia Corporation (qt-info@nokia.com) You may use, distribute and copy the Qt GUI Toolkit under the terms of GNU Lesser General Public License version 2.1, which is displayed below. ------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! qt-assistant-qassistantclient-library-compat-version-4.6.3/main.cpp 777 0 0 40065 11406632726 20676 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "mainwindow.h" #include "helpdialog.h" #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(USE_STATIC_JPEG_PLUGIN) #include Q_IMPORT_PLUGIN(qjpeg) #endif #define INDEX_CHECK( text ) if( i+1 >= argc ) { fprintf(stderr, "%s\n", text); return 1; } QT_BEGIN_NAMESPACE #if !defined(QT_NO_DBUS) && defined(Q_OS_UNIX) QT_BEGIN_INCLUDE_NAMESPACE #include #include #include #include "tabbedbrowser.h" QT_END_INCLUDE_NAMESPACE class HelpWindowAdaptor : public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "com.trolltech.Assistant.HelpWindow") Q_PROPERTY(QString source READ source WRITE setSource) public: HelpWindowAdaptor(HelpWindow *w) : QDBusAbstractAdaptor(w), helpWindow(w) { setAutoRelaySignals(true); } public Q_SLOTS: inline QString source() const { return helpWindow->source().toString(); } inline void setSource(const QString &src) { helpWindow->setSource(src); } inline void clearHistory() { helpWindow->clearHistory(); } inline void backward() { helpWindow->backward(); } inline void forward() { helpWindow->forward(); } inline void reload() { helpWindow->reload(); } inline void home() { helpWindow->home(); } private: HelpWindow *helpWindow; }; class AssistantAdaptor : public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "com.trolltech.Assistant.HelpViewer") public: AssistantAdaptor(MainWindow *mw) : QDBusAbstractAdaptor(mw), mw(mw) { QDBusConnection connection = QDBusConnection::sessionBus(); connection.registerService(QLatin1String("com.trolltech.Assistant")); connection.registerObject(QLatin1String("/Assistant"), mw); } public slots: void showLink(const QString &link) { mw->showLink(link); } QDBusObjectPath createNewTab(); QDBusObjectPath currentTab(); private: QDBusObjectPath pathForBrowser(HelpWindow *window); MainWindow *mw; }; QDBusObjectPath AssistantAdaptor::createNewTab() { HelpWindow *window = mw->browsers()->newBackgroundTab(); return pathForBrowser(window); } QDBusObjectPath AssistantAdaptor::currentTab() { HelpWindow *window = mw->browsers()->currentBrowser(); return pathForBrowser(window); } QDBusObjectPath AssistantAdaptor::pathForBrowser(HelpWindow *window) { int index = mw->browsers()->browsers().indexOf(window); if (index == -1) return QDBusObjectPath(); QString name(QLatin1String("/Assistant/Tabs/")); name += QString::number(index); QDBusObjectPath path(name); if (!window->findChild()) { (void)new HelpWindowAdaptor(window); QDBusConnection::sessionBus().registerObject(name, window); } return path; } #endif // QT_NO_DBUS class AssistantSocket : public QTcpSocket { Q_OBJECT public: AssistantSocket( int sock, QObject *parent = 0 ); ~AssistantSocket() {} signals: void showLinkRequest( const QString& ); private slots: void readClient(); void connectionClosed(); }; class AssistantServer : public QTcpServer { Q_OBJECT public: AssistantServer( QObject* parent = 0 ); quint16 getPort() const; signals: void showLinkRequest( const QString& ); void newConnect(); public slots: virtual void incomingConnection( int socket ); private: quint16 p; }; AssistantSocket::AssistantSocket( int sock, QObject *parent ) : QTcpSocket( parent ) { connect( this, SIGNAL(readyRead()), SLOT(readClient()) ); connect( this, SIGNAL(disconnected()), SLOT(connectionClosed()) ); setSocketDescriptor( sock ); } void AssistantSocket::readClient() { QString link = QString(); while ( canReadLine() ) link = QLatin1String(readLine()); if ( !link.isNull() ) { link = link.replace(QLatin1String("\n"), QLatin1String("")); link = link.replace(QLatin1String("\r"), QLatin1String("")); QFileInfo fi(link); link = fi.absoluteFilePath(); emit showLinkRequest( link ); } } void AssistantSocket::connectionClosed() { deleteLater(); } AssistantServer::AssistantServer( QObject *parent ) : QTcpServer( parent ) { listen(QHostAddress::LocalHost, 0); if ( !isListening() ) { QMessageBox::critical( 0, tr( "Qt Assistant" ), tr( "Failed to bind to port %1" ).arg( serverPort() ) ); exit( 1 ); } p = serverPort(); } quint16 AssistantServer::getPort() const { return p; } void AssistantServer::incomingConnection( int socket ) { AssistantSocket *as = new AssistantSocket( socket, this ); connect( as, SIGNAL(showLinkRequest(QString)), this, SIGNAL(showLinkRequest(QString)) ); emit newConnect(); } int runAssistant( int argc, char ** argv ) { bool withGUI = true; #ifndef Q_WS_WIN if ( argc > 1 ) { QString arg = QString::fromLocal8Bit(argv[1]); arg = arg.toLower(); if ( arg == QLatin1String("-addcontentfile") || arg == QLatin1String("-removecontentfile") || arg == QLatin1String("-help") || arg == QLatin1String("/?") ) withGUI = false; } #endif QApplication a(argc, argv, withGUI); a.setOrganizationName(QLatin1String("Trolltech")); a.setApplicationName(QLatin1String("Assistant")); QString resourceDir; AssistantServer *as = 0; QStringList catlist; QString file, profileName, aDocPath; bool server = false; bool hideSidebar = false; bool configLoaded = false; if ( argc == 2 ) { file = QString::fromLocal8Bit(argv[1]); if (file.startsWith(QLatin1String("-")) || file == QLatin1String("/?")) { file.clear(); } else { QFileInfo fi(file); file = fi.absoluteFilePath(); file = MainWindow::urlifyFileName(file); } } if ( file.isEmpty() ) { for ( int i = 1; i < argc; i++ ) { QString opt = QString::fromLocal8Bit(argv[i]).toLower(); if ( opt == QLatin1String("-file") ) { INDEX_CHECK( "Missing file argument!" ); i++; file = QFile::decodeName(argv[i]); } else if ( opt == QLatin1String("-server") ) { server = true; } else if ( opt == QLatin1String("-profile") ) { INDEX_CHECK( "Missing profile argument!" ); profileName = QFile::decodeName(argv[++i]); } else if ( opt == QLatin1String("-addcontentfile") ) { INDEX_CHECK( "Missing content file!" ); Config *c = Config::loadConfig(QString()); QFileInfo file( QFile::decodeName(argv[i+1]) ); if( !file.exists() ) { fprintf(stderr, "Could not locate content file: %s\n", qPrintable(file.absoluteFilePath())); return 1; } DocuParser *parser = DocuParser::createParser( file.absoluteFilePath() ); if( parser ) { QFile f( QFile::decodeName(argv[i+1]) ); if( !parser->parse( &f ) ) { fprintf(stderr, "Failed to parse file: %s\n", qPrintable(file.absoluteFilePath())); return 1; } parser->addTo( c->profile() ); c->setDocRebuild( true ); c->save(); } return 0; } else if ( opt == QLatin1String("-removecontentfile") ) { INDEX_CHECK("Missing content file!"); Config *c = Config::loadConfig(QString()); Profile *profile = c->profile(); QString contentFile = QString::fromLocal8Bit(argv[i+i]); QStringList entries; #ifdef Q_WS_WIN contentFile.replace(QLatin1Char('\\'), QLatin1Char('/')); entries = profile->docs.filter(contentFile, Qt::CaseInsensitive); #else entries = profile->docs.filter(contentFile); #endif if (entries.count() == 0) { fprintf(stderr, "Could not locate content file: %s\n", qPrintable(contentFile)); return 1; } else if (entries.count() > 1) { fprintf(stderr, "More than one entry matching file name found, " "please specify full path to file"); return 1; } else { QFileInfo file(entries[0]); if( !file.exists() ) { fprintf(stderr, "Could not locate content file: %s\n", qPrintable(file.absoluteFilePath())); return 1; } profile->removeDocFileEntry( file.absoluteFilePath() ); c->setDocRebuild( true ); c->save(); } return 0; } else if ( QString( QLatin1String(argv[i]) ).toLower() == QLatin1String("-docpath") ) { INDEX_CHECK( "Missing path!" ); QDir dir(QString::fromLocal8Bit(argv[i+1])); if ( dir.exists() ) { Config *c = Config::loadConfig(QString()); c->saveProfile(Profile::createDefaultProfile(dir.absolutePath())); c->loadDefaultProfile(); c->setDocRebuild(true); c->save(); configLoaded = true; ++i; } else { fprintf(stderr, "The specified path does not exist!\n"); return 1; } } else if ( opt == QLatin1String("-hidesidebar") ) { hideSidebar = true; } else if ( opt == QLatin1String("-help") || opt == QLatin1String("/?") ) { QString helpText = QLatin1String( "Usage: assistant [option]\n" "Options:\n" " -file Filename assistant opens the specified file\n" " -server reads commands from a socket after\n" " assistant has started\n" " -profile fileName starts assistant and displays the\n" " profile specified in the file fileName.\n" " -addContentFile file adds the content file 'file' to the set of\n" " documentation available by default\n" " -removeContentFile file removes the content file 'file' from the\n" " documentation available by default\n" " -docPath path sets the Qt documentation root path to\n" " 'path' and starts assistant\n" " -hideSidebar assistant will hide the sidebar.\n" " -resourceDir assistant will load translations from\n" " this directory.\n" " -help shows this help."); #ifdef Q_WS_WIN QMessageBox::information( 0, QLatin1String("Qt Assistant"), QLatin1String("
") + helpText + QLatin1String("
") ); #else fprintf(stdout, "%s\n", qPrintable(helpText)); #endif exit( 0 ); } else if ( opt == QLatin1String("-resourcedir") ) { INDEX_CHECK( "Missing resource directory argument!" ); resourceDir = QFile::decodeName( argv[++i] ); } else { fprintf(stderr, "Unrecognized option %s. Try -help to get help.\n", qPrintable(opt)); return 1; } } } if( resourceDir.isNull() ) resourceDir = QLibraryInfo::location(QLibraryInfo::TranslationsPath); QTranslator translator( 0 ); translator.load( QLatin1String("assistant_adp_") + QLocale::system().name(), resourceDir ); a.installTranslator( &translator ); QTranslator qtTranslator( 0 ); qtTranslator.load( QLatin1String("qt_") + QLocale::system().name(), resourceDir ); a.installTranslator( &qtTranslator ); Config *conf = 0; if (configLoaded) conf = Config::configuration(); else conf = Config::loadConfig( profileName ); if (!conf) { fprintf( stderr, "Profile '%s' does not exist!\n", profileName.toLatin1().constData() ); fflush( stderr ); return -1; } QStringList links = conf->source(); conf->hideSideBar( hideSidebar ); QPointer mw = new MainWindow(); mw->setObjectName(QLatin1String("Assistant")); if ( server ) { as = new AssistantServer(); printf("%d\n", as->serverPort() ); fflush( stdout ); as->connect( as, SIGNAL(showLinkRequest(QString)), mw, SLOT(showLinkFromClient(QString)) ); } #if !defined(QT_NO_DBUS) && defined(Q_OS_UNIX) new AssistantAdaptor(mw); #endif // QT_NO_DBUS FontSettings settings = conf->fontSettings(); if (mw->font() != settings.windowFont) a.setFont(settings.windowFont, "QWidget"); #ifdef Q_WS_MAC // Make sure AssitantClient shows the window in front. mw->raise(); #endif mw->show(); if (!file.isEmpty()) mw->showLink( MainWindow::urlifyFileName(file) ); else if (file.isEmpty()) mw->showLinks( links ); a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) ); int appExec = a.exec(); delete (MainWindow*)mw; return appExec; } QT_END_NAMESPACE int main( int argc, char ** argv ) { Q_INIT_RESOURCE(assistant); return QT_PREPEND_NAMESPACE(runAssistant)(argc, argv); } #include "main.moc" qt-assistant-qassistantclient-library-compat-version-4.6.3/mainwindow.cpp 777 0 0 67545 11406632726 22142 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "mainwindow.h" #include "tabbedbrowser.h" #include "helpdialog.h" #include "config.h" #include "fontsettingsdialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE QList MainWindow::windows; #if defined(Q_WS_WIN) extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; #endif MainWindow::MainWindow() { setUnifiedTitleAndToolBarOnMac(true); ui.setupUi(this); #if defined(Q_WS_WIN) // Workaround for QMimeSourceFactory failing in QFileInfo::isReadable() for // certain user configs. See task: 34372 qt_ntfs_permission_lookup = 0; #endif setupCompleted = false; goActions = QList(); goActionDocFiles = new QMap; windows.append(this); tabs = new TabbedBrowser(this); connect(tabs, SIGNAL(tabCountChanged(int)), this, SLOT(updateTabActions(int))); setCentralWidget(tabs); Config *config = Config::configuration(); updateProfileSettings(); dw = new QDockWidget(this); dw->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); dw->setWindowTitle(tr("Sidebar")); dw->setObjectName(QLatin1String("sidebar")); helpDock = new HelpDialog(dw, this); dw->setWidget(helpDock); addDockWidget(Qt::LeftDockWidgetArea, dw); // read geometry configuration setupGoActions(); restoreGeometry(config->windowGeometry()); restoreState(config->mainWindowState()); if (config->sideBarHidden()) dw->hide(); tabs->setup(); QTimer::singleShot(0, this, SLOT(setup())); #if defined(Q_WS_MAC) QMenu *windowMenu = new QMenu(tr("&Window"), this); menuBar()->insertMenu(ui.helpMenu->menuAction(), windowMenu); windowMenu->addAction(tr("Minimize"), this, SLOT(showMinimized()), QKeySequence(tr("Ctrl+M"))); // Use the same forward and backward browser shortcuts as Safari and Internet Explorer do // on the Mac. This means that if you have access to one of those cool Intellimice, the thing // works just fine, since that's how Microsoft hacked it. ui.actionGoPrevious->setShortcut(QKeySequence(Qt::CTRL|Qt::Key_Left)); ui.actionGoNext->setShortcut(QKeySequence(Qt::CTRL|Qt::Key_Right)); static const QLatin1String MacIconPath(":/trolltech/assistant/images/mac"); ui.actionGoNext->setIcon(QIcon(MacIconPath + QLatin1String("/next.png"))); ui.actionGoPrevious->setIcon(QIcon(MacIconPath + QLatin1String("/prev.png"))); ui.actionGoHome->setIcon(QIcon(MacIconPath + QLatin1String("/home.png"))); ui.actionEditCopy->setIcon(QIcon(MacIconPath + QLatin1String("/editcopy.png"))); ui.actionEditCopy->setIcon(QIcon(MacIconPath + QLatin1String("/editcopy.png"))); ui.actionEditFind->setIcon(QIcon(MacIconPath + QLatin1String("/find.png"))); ui.actionFilePrint->setIcon(QIcon(MacIconPath + QLatin1String("/print.png"))); ui.actionZoomOut->setIcon(QIcon(MacIconPath + QLatin1String("/zoomout.png"))); ui.actionZoomIn->setIcon(QIcon(MacIconPath + QLatin1String("/zoomin.png"))); ui.actionSyncToc->setIcon(QIcon(MacIconPath + QLatin1String("/synctoc.png"))); ui.actionHelpWhatsThis->setIcon(QIcon(MacIconPath + QLatin1String("/whatsthis.png"))); #elif defined(Q_WS_X11) ui.actionGoNext->setIcon(QIcon::fromTheme("go-next" , ui.actionGoNext->icon())); ui.actionGoPrevious->setIcon(QIcon::fromTheme("go-previous" , ui.actionGoPrevious->icon())); ui.actionGoHome->setIcon(QIcon::fromTheme("user-home" , ui.actionGoHome->icon())); ui.actionEditCopy->setIcon(QIcon::fromTheme("edit-copy" , ui.actionEditCopy->icon())); ui.actionEditFind->setIcon(QIcon::fromTheme("edit-find" , ui.actionEditFind->icon())); ui.actionFilePrint->setIcon(QIcon::fromTheme("document-print" , ui.actionFilePrint->icon())); ui.actionZoomOut->setIcon(QIcon::fromTheme("zoom-out" , ui.actionZoomOut->icon())); ui.actionZoomIn->setIcon(QIcon::fromTheme("zoom-in" , ui.actionZoomIn->icon())); ui.actionSyncToc->setIcon(QIcon::fromTheme("view-refresh" , ui.actionSyncToc->icon())); #endif } MainWindow::~MainWindow() { windows.removeAll(this); delete goActionDocFiles; } void MainWindow::setup() { if(setupCompleted) return; qApp->setOverrideCursor(QCursor(Qt::WaitCursor)); statusBar()->showMessage(tr("Initializing Qt Assistant...")); setupCompleted = true; helpDock->initialize(); connect(ui.actionGoPrevious, SIGNAL(triggered()), tabs, SLOT(backward())); connect(ui.actionGoNext, SIGNAL(triggered()), tabs, SLOT(forward())); connect(ui.actionEditCopy, SIGNAL(triggered()), tabs, SLOT(copy())); connect(ui.actionFileExit, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); connect(ui.actionAddBookmark, SIGNAL(triggered()), helpDock, SLOT(addBookmark())); connect(helpDock, SIGNAL(showLink(QString)), this, SLOT(showLink(QString))); connect(helpDock, SIGNAL(showSearchLink(QString,QStringList)), this, SLOT(showSearchLink(QString,QStringList))); connect(ui.bookmarkMenu, SIGNAL(triggered(QAction*)), this, SLOT(showBookmark(QAction*))); connect(ui.actionZoomIn, SIGNAL(triggered()), tabs, SLOT(zoomIn())); connect(ui.actionZoomOut, SIGNAL(triggered()), tabs, SLOT(zoomOut())); connect(ui.actionOpenPage, SIGNAL(triggered()), tabs, SLOT(newTab())); connect(ui.actionClosePage, SIGNAL(triggered()), tabs, SLOT(closeTab())); connect(ui.actionNextPage, SIGNAL(triggered()), tabs, SLOT(nextTab())); connect(ui.actionPrevPage, SIGNAL(triggered()), tabs, SLOT(previousTab())); #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) QShortcut *acc = new QShortcut(tr("SHIFT+CTRL+="), this); connect(acc, SIGNAL(activated()), ui.actionZoomIn, SIGNAL(triggered())); #endif connect(new QShortcut(tr("Ctrl+T"), this), SIGNAL(activated()), helpDock, SLOT(toggleContents())); connect(new QShortcut(tr("Ctrl+I"), this), SIGNAL(activated()), helpDock, SLOT(toggleIndex())); connect(new QShortcut(tr("Ctrl+B"), this), SIGNAL(activated()), helpDock, SLOT(toggleBookmarks())); connect(new QShortcut(tr("Ctrl+S"), this), SIGNAL(activated()), helpDock, SLOT(toggleSearch())); connect(new QShortcut(tr("Ctrl+]"), this), SIGNAL(activated()), tabs, SLOT(nextTab())); connect(new QShortcut(tr("Ctrl+["), this), SIGNAL(activated()), tabs, SLOT(previousTab())); Config *config = Config::configuration(); setupBookmarkMenu(); QAction *viewsAction = createPopupMenu()->menuAction(); viewsAction->setText(tr("Views")); ui.viewMenu->addAction(viewsAction); const int tabIndex = config->sideBarPage(); helpDock->tabWidget()->setCurrentIndex(tabIndex); // The tab index is 0 by default, so we need to force an upate // to poulate the contents in this case. if (tabIndex == 0) helpDock->currentTabChanged(tabIndex); ui.actionEditFind->setShortcut(QKeySequence::Find); ui.actionEditFindNext->setShortcut(QKeySequence::FindNext); ui.actionEditFindPrev->setShortcut(QKeySequence::FindPrevious); QObject::connect(ui.actionEditFind, SIGNAL(triggered()), tabs, SLOT(find())); QObject::connect(ui.actionEditFindNext, SIGNAL(triggered()), tabs, SLOT(findNext())); QObject::connect(ui.actionEditFindPrev, SIGNAL(triggered()), tabs, SLOT(findPrevious())); connect(ui.actionEditFont_Settings, SIGNAL(triggered()), this, SLOT(showFontSettingsDialog())); qApp->restoreOverrideCursor(); ui.actionGoPrevious->setEnabled(false); ui.actionGoNext->setEnabled(false); ui.actionEditCopy->setEnabled(false); // set the current selected item in the treeview helpDialog()->locateContents(tabs->currentBrowser()->source().toString()); connect(tabs, SIGNAL(browserUrlChanged(QString)), helpDock, SLOT(locateContents(QString))); } void MainWindow::browserTabChanged() { HelpWindow *win = tabs->currentBrowser(); if (win) { QTextCursor cursor(win->textCursor()); ui.actionEditCopy->setEnabled(cursor.hasSelection()); ui.actionGoPrevious->setEnabled(win->isBackwardAvailable()); ui.actionGoNext->setEnabled(win->isForwardAvailable()); } } void MainWindow::copyAvailable(bool yes) { ui.actionEditCopy->setEnabled(yes); } void MainWindow::updateTabActions(int index) { bool enabled = (index > 1) ? true : false; ui.actionPrevPage->setEnabled(enabled); ui.actionNextPage->setEnabled(enabled); ui.actionClosePage->setEnabled(enabled); } void MainWindow::setupGoActions() { Config *config = Config::configuration(); QStringList titles = config->docTitles(); QAction *action = 0; static bool separatorInserted = false; foreach (QAction *a, goActions) { ui.goMenu->removeAction(a); ui.goActionToolbar->removeAction(a); } qDeleteAll(goActions); goActions.clear(); goActionDocFiles->clear(); int addCount = 0; foreach (QString title, titles) { QPixmap pix = config->docIcon(title); if(!pix.isNull()) { if(!separatorInserted) { ui.goMenu->addSeparator(); separatorInserted = true; } action = new QAction(this); action->setText(title); action->setWhatsThis(tr("Displays the main page of a specific documentation set.")); action->setIcon(QIcon(pix)); ui.goMenu->addAction(action); ui.goActionToolbar->addAction(action); goActions.append(action); goActionDocFiles->insert(action, config->indexPage(title)); connect(action, SIGNAL(triggered()), this, SLOT(showGoActionLink())); ++addCount; } } if(!addCount) ui.goActionToolbar->hide(); else ui.goActionToolbar->show(); } bool MainWindow::insertActionSeparator() { ui.goMenu->addSeparator(); ui.Toolbar->addSeparator(); return true; } void MainWindow::closeEvent(QCloseEvent *e) { saveSettings(); e->accept(); } void MainWindow::about() { QMessageBox box(this); box.setText(QString::fromLatin1("
" "

%1

" "

Version %2

" "

Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).

") .arg(tr("Qt Assistant")).arg(QLatin1String(QT_VERSION_STR))); box.setWindowTitle(tr("Qt Assistant")); box.setIcon(QMessageBox::NoIcon); box.exec(); } void MainWindow::on_actionAboutApplication_triggered() { QString url = Config::configuration()->aboutURL(); if (url == QLatin1String("about_qt")) { QMessageBox::aboutQt(this, QLatin1String("Qt Assistant")); return; } QString text; if (url.startsWith(QLatin1String("file:"))) url = url.mid(5); QFile file(url); if(file.exists() && file.open(QFile::ReadOnly)) text = QString::fromUtf8(file.readAll()); if(text.isNull()) text = tr("Failed to open about application contents in file: '%1'").arg(url); QFileInfo fi(file); QString path = QDir::cleanPath(fi.absolutePath()); if (!QDir::searchPaths(QLatin1String("aboutImages")).contains(path)) QDir::addSearchPath(QLatin1String("aboutImages"), path); QMessageBox box(this); box.setText(text); box.setWindowTitle(Config::configuration()->aboutApplicationMenuText()); box.setIcon(QMessageBox::NoIcon); box.exec(); } void MainWindow::on_actionAboutAssistant_triggered() { about(); } void MainWindow::on_actionGoHome_triggered() { QString home = MainWindow::urlifyFileName(Config::configuration()->homePage()); showLink(home); } QString MainWindow::urlifyFileName(const QString &fileName) { QString name = fileName; QUrl url(name); #if defined(Q_OS_WIN32) if (!url.isValid() || url.scheme().isEmpty() || url.scheme().toLower() != QLatin1String("file:")) { int i = name.indexOf(QLatin1Char('#')); QString anchor = name.mid(i); name = name.toLower(); if (i > -1) name.replace(i, anchor.length(), anchor); name.replace(QLatin1Char('\\'), QLatin1Char('/')); foreach (QFileInfo drive, QDir::drives()) { if (name.startsWith(drive.absolutePath().toLower())) { name = QLatin1String("file:") + name; break; } } } #else if (!url.isValid() || url.scheme().isEmpty()) name.prepend(QLatin1String("file:")); #endif return name; } #ifndef QT_NO_PRINTER class PrintThread : public QThread { QPrinter _printer; QTextDocument *_document; public: PrintThread(QObject *parent) : QThread(parent), _printer(QPrinter::HighResolution), _document(0) { } ~PrintThread() { wait(); } QPrinter *printer() { return &_printer; } void start(QTextDocument *document) { _document = document->clone(); _document->moveToThread(this); QThread::start(); } protected: void run() { _document->print(printer()); delete _document; _document = 0; } }; #endif //QT_NO_PRINTER void MainWindow::on_actionFilePrint_triggered() { #ifndef QT_NO_PRINTER if (!QFontDatabase::supportsThreadedFontRendering()) { QPrinter printer(QPrinter::HighResolution); QPrintDialog dlg(&printer, this); if (dlg.exec() == QDialog::Accepted) { qApp->setOverrideCursor(Qt::WaitCursor); tabs->currentBrowser()->document()->print(&printer); qApp->restoreOverrideCursor(); } return; } PrintThread *thread = new PrintThread(this); QPrintDialog dlg(thread->printer(), this); if (dlg.exec() == QDialog::Accepted) { connect(thread, SIGNAL(finished()), SLOT(printingFinished())); connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); qApp->setOverrideCursor(Qt::BusyCursor); thread->start(tabs->currentBrowser()->document()); } else { delete thread; } #else Q_ASSERT("No printing support"); #endif } void MainWindow::printingFinished() { qApp->restoreOverrideCursor(); } void MainWindow::updateBookmarkMenu() { for(QList::Iterator it = windows.begin(); it != windows.end(); ++it) (*it)->setupBookmarkMenu(); } void MainWindow::setupBookmarkMenu() { ui.bookmarkMenu->clear(); bookmarks.clear(); ui.bookmarkMenu->addAction(ui.actionAddBookmark); QFile f(QDir::homePath() + QLatin1String("/.assistant/bookmarks.") + Config::configuration()->profileName()); if (!f.open(QFile::ReadOnly)) return; QTextStream ts(&f); ui.bookmarkMenu->addSeparator(); while (!ts.atEnd()) { QString title = ts.readLine(); QString link = ts.readLine(); bookmarks.insert(ui.bookmarkMenu->addAction(title), link); } } void MainWindow::showBookmark(QAction *action) { if (bookmarks.contains(action)) showLink(bookmarks.value(action)); } void MainWindow::showLinkFromClient(const QString &link) { setWindowState(windowState() & ~Qt::WindowMinimized); raise(); activateWindow(); QString l = MainWindow::urlifyFileName(link); showLink(l); if (isMinimized()) showNormal(); } void MainWindow::showLink(const QString &link) { if(link.isEmpty()) qWarning("The link is empty!"); // don't fill the history with the same url more then once if (link == tabs->currentBrowser()->source().toString()) return; QUrl url(link); QFileInfo fi(url.toLocalFile()); tabs->setSource(url.toString()); tabs->currentBrowser()->setFocus(); } void MainWindow::showLinks(const QStringList &links) { if (links.size() == 0) { qWarning("MainWindow::showLinks() - Empty link"); return; } if (links.size() == 1) { showLink(MainWindow::urlifyFileName(links.first())); return; } QStringList::ConstIterator it = links.begin(); // Initial showing, The tab is empty so update that without creating it first if (!tabs->currentBrowser()->source().isValid()) { QPair browser; browser.first = tabs->currentBrowser(); browser.second = links.first(); pendingBrowsers.append(browser); tabs->setTitle(tabs->currentBrowser(), tr("...")); } ++it; while(it != links.end()) { QPair browser; browser.first = tabs->newBackgroundTab(); browser.second = *it; pendingBrowsers.append(browser); ++it; } startTimer(50); return; } void MainWindow::removePendingBrowser(HelpWindow *win) { if (!pendingBrowsers.count()) return; QMutableListIterator > it(pendingBrowsers); while (it.hasNext()) { QPair browser = it.next(); if (browser.first == win) { it.remove(); break; } } } void MainWindow::timerEvent(QTimerEvent *e) { QPair browser = pendingBrowsers.first(); pendingBrowsers.pop_front(); if (pendingBrowsers.size() == 0) killTimer(e->timerId()); browser.first->setSource(MainWindow::urlifyFileName(browser.second)); } void MainWindow::showQtHelp() { showLink(QLibraryInfo::location(QLibraryInfo::DocumentationPath) + QLatin1String("/html/index.html")); } MainWindow* MainWindow::newWindow() { saveSettings(); MainWindow *mw = new MainWindow; mw->move(geometry().topLeft()); if (isMaximized()) mw->showMaximized(); else mw->show(); mw->on_actionGoHome_triggered(); return mw; } void MainWindow::saveSettings() { Config *config = Config::configuration(); config->setSideBarPage(helpDock->tabWidget()->currentIndex()); config->setWindowGeometry(saveGeometry()); config->setMainWindowState(saveState()); // Create list of the tab urls QStringList lst; QList browsers = tabs->browsers(); foreach (HelpWindow *browser, browsers) lst << browser->source().toString(); config->setSource(lst); config->save(); } TabbedBrowser* MainWindow::browsers() const { return tabs; } void MainWindow::showSearchLink(const QString &link, const QStringList &terms) { HelpWindow * hw = tabs->currentBrowser(); hw->blockScrolling(true); hw->setCursor(Qt::WaitCursor); if (hw->source() == link) hw->reload(); else showLink(link); hw->setCursor(Qt::ArrowCursor); hw->viewport()->setUpdatesEnabled(false); QTextCharFormat marker; marker.setForeground(Qt::red); QTextCursor firstHit; QTextCursor c = hw->textCursor(); c.beginEditBlock(); foreach (QString term, terms) { c.movePosition(QTextCursor::Start); hw->setTextCursor(c); bool found = hw->find(term, QTextDocument::FindWholeWords); while (found) { QTextCursor hit = hw->textCursor(); if (firstHit.isNull() || hit.position() < firstHit.position()) firstHit = hit; hit.mergeCharFormat(marker); found = hw->find(term, QTextDocument::FindWholeWords); } } if (firstHit.isNull()) { firstHit = hw->textCursor(); firstHit.movePosition(QTextCursor::Start); } firstHit.clearSelection(); c.endEditBlock(); hw->setTextCursor(firstHit); hw->blockScrolling(false); hw->viewport()->setUpdatesEnabled(true); } void MainWindow::showGoActionLink() { const QObject *origin = sender(); if(!origin || QString::fromLatin1(origin->metaObject()->className()) != QString::fromLatin1("QAction")) return; QAction *action = (QAction*) origin; QString docfile = *(goActionDocFiles->find(action)); showLink(MainWindow::urlifyFileName(docfile)); } void MainWindow::on_actionHelpAssistant_triggered() { showLink(Config::configuration()->assistantDocPath() + QLatin1String("/assistant-manual.html")); } HelpDialog* MainWindow::helpDialog() const { return helpDock; } void MainWindow::backwardAvailable(bool enable) { ui.actionGoPrevious->setEnabled(enable); } void MainWindow::forwardAvailable(bool enable) { ui.actionGoNext->setEnabled(enable); } void MainWindow::updateProfileSettings() { Config *config = Config::configuration(); #ifndef Q_WS_MAC setWindowIcon(config->applicationIcon()); #endif ui.helpMenu->clear(); //ui.helpMenu->addAction(ui.actionHelpAssistant); //ui.helpMenu->addSeparator(); ui.helpMenu->addAction(ui.actionAboutAssistant); if (!config->aboutApplicationMenuText().isEmpty()) ui.helpMenu->addAction(ui.actionAboutApplication); ui.helpMenu->addSeparator(); ui.helpMenu->addAction(ui.actionHelpWhatsThis); ui.actionAboutApplication->setText(config->aboutApplicationMenuText()); if(!config->title().isNull()) setWindowTitle(config->title()); } void MainWindow::setupPopupMenu(QMenu *m) { m->addAction(ui.actionNewWindow); m->addAction(ui.actionOpenPage); m->addAction(ui.actionClosePage); m->addSeparator(); m->addAction(ui.actionSaveAs); m->addSeparator(); m->addAction(ui.actionGoPrevious); m->addAction(ui.actionGoNext); m->addAction(ui.actionGoHome); m->addSeparator(); m->addAction(ui.actionZoomIn); m->addAction(ui.actionZoomOut); m->addSeparator(); m->addAction(ui.actionEditCopy); m->addAction(ui.actionEditFind); } void MainWindow::on_actionSyncToc_triggered() { HelpWindow *w = tabs->currentBrowser(); if(w) { qApp->setOverrideCursor(QCursor(Qt::WaitCursor)); QString link = w->source().toString(); helpDock->locateContents(link); helpDock->tabWidget()->setCurrentIndex(0); qApp->restoreOverrideCursor(); } } void MainWindow::on_actionNewWindow_triggered() { newWindow()->show(); } void MainWindow::on_actionClose_triggered() { close(); } void MainWindow::on_actionHelpWhatsThis_triggered() { QWhatsThis::enterWhatsThisMode(); } void MainWindow::on_actionSaveAs_triggered() { QString fileName; QUrl url = tabs->currentBrowser()->source(); if (url.isValid()) { QFileInfo fi(url.toLocalFile()); fileName = fi.fileName(); } fileName = QFileDialog::getSaveFileName(this, tr("Save Page"), fileName); if (fileName.isEmpty()) return; QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) { QMessageBox::critical(this, tr("Save Page"), tr("Cannot open file for writing!")); return; } QFileInfo fi(fileName); QString fn = fi.fileName(); int i = fn.lastIndexOf(QLatin1Char('.')); if (i > -1) fn = fn.left(i); QString relativeDestPath = fn + QLatin1String("_images"); QDir destDir(fi.absolutePath() + QDir::separator() + relativeDestPath); bool imgDirAvailable = destDir.exists(); if (!imgDirAvailable) imgDirAvailable = destDir.mkdir(destDir.absolutePath()); // save images QTextDocument *doc = tabs->currentBrowser()->document()->clone(); if (url.isValid() && imgDirAvailable) { QTextBlock::iterator it; for (QTextBlock block = doc->begin(); block != doc->end(); block = block.next()) { for (it = block.begin(); !(it.atEnd()); ++it) { QTextFragment fragment = it.fragment(); if (fragment.isValid()) { QTextImageFormat fm = fragment.charFormat().toImageFormat(); if (fm.isValid() && !fm.name().isEmpty()) { QUrl imagePath = tabs->currentBrowser()->source().resolved(fm.name()); if (!imagePath.isValid()) continue; QString from = imagePath.toLocalFile(); QString destName = fm.name(); int j = destName.lastIndexOf(QLatin1Char('/')); if (j > -1) destName = destName.mid(j+1); QFileInfo info(from); if (info.exists()) { if (!QFile::copy(from, destDir.absolutePath() + QDir::separator() + destName)) continue; fm.setName(QLatin1String("./") + relativeDestPath + QLatin1String("/") + destName); QTextCursor cursor(doc); cursor.setPosition(fragment.position()); cursor.setPosition(fragment.position() + fragment.length(), QTextCursor::KeepAnchor); cursor.setCharFormat(fm); } } } } } } QString src = doc->toHtml(QByteArray("utf-8")); QTextStream s(&file); s.setCodec("utf-8"); s << src; s.flush(); file.close(); } void MainWindow::showFontSettingsDialog() { Config *config = Config::configuration(); FontSettings settings = config->fontSettings(); { // It is important that the dialog be deleted before UI mode changes. FontSettingsDialog dialog; if (!dialog.showDialog(&settings)) return; } config->setFontPointSize(settings.browserFont.pointSizeF()); config->setFontSettings(settings); updateApplicationFontSettings(settings); } void MainWindow::updateApplicationFontSettings(FontSettings &settings) { QFont font = settings.windowFont; if (this->font() != font) qApp->setFont(font, "QWidget"); font = settings.browserFont; QList browsers = tabs->browsers(); foreach (HelpWindow *browser, browsers) { if (browser->font() != font) browser->setFont(font); } } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/mainwindow.h 777 0 0 10277 11406632726 21575 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include "ui_mainwindow.h" #include "config.h" #include #include QT_BEGIN_NAMESPACE class TabbedBrowser; class HelpDialog; class HelpWindow; class QMenu; class QDockWidget; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); virtual ~MainWindow(); TabbedBrowser *browsers() const; HelpDialog *helpDialog() const; void setupPopupMenu(QMenu *menu); static QString urlifyFileName(const QString &fileName); void removePendingBrowser(HelpWindow *win); public slots: MainWindow *newWindow(); void setup(); void showLink(const QString &link); void showLinks(const QStringList &links); void saveSettings(); void updateBookmarkMenu(); void printingFinished(); private slots: void on_actionNewWindow_triggered(); void on_actionGoHome_triggered(); void on_actionFilePrint_triggered(); void on_actionClose_triggered(); void on_actionHelpWhatsThis_triggered(); void on_actionHelpAssistant_triggered(); void on_actionAboutApplication_triggered(); void on_actionAboutAssistant_triggered(); void on_actionSaveAs_triggered(); void on_actionSyncToc_triggered(); void about(); void setupBookmarkMenu(); void showBookmark(QAction *action); void showLinkFromClient(const QString &link); void showQtHelp(); void showSearchLink(const QString &link, const QStringList &terms); void showGoActionLink(); void updateProfileSettings(); void backwardAvailable(bool); void forwardAvailable(bool); void browserTabChanged(); void copyAvailable(bool yes); void updateTabActions(int index); void showFontSettingsDialog(); protected: void closeEvent(QCloseEvent *); void timerEvent(QTimerEvent *); private: void setupGoActions(); bool insertActionSeparator(); void updateApplicationFontSettings(FontSettings &settings); private: Ui::MainWindow ui; QList goActions; uint setupCompleted:1; TabbedBrowser *tabs; QMap bookmarks; HelpDialog *helpDock; QDockWidget *dw; static QList windows; QMap *goActionDocFiles; QList > pendingBrowsers; }; #endif // MAINWINDOW_H QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/mainwindow.ui 777 0 0 33772 11406632726 21770 0 ********************************************************************* ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ********************************************************************* MainWindow 0 0 949 670 Qt Assistant by Nokia Toolbar Qt::Horizontal TopToolBarArea false Go Qt::Horizontal TopToolBarArea false 0 0 949 29 &Help &File Boo&kmarks &Go &View &Edit :/trolltech/assistant/images/win/print.png &Print... Print the currently displayed page. Ctrl+P E&xit Quit Qt Assistant. Ctrl+Q QAction::QuitRole :/trolltech/assistant/images/win/editcopy.png &Copy Copy the selected text to the clipboard. Ctrl+C :/trolltech/assistant/images/win/find.png &Find in Text... Open the Find dialog. Qt Assistant will search the currently displayed page for the text you enter. Ctrl+F Find &Next F3 Find &Previous Shift+F3 :/trolltech/assistant/images/win/home.png &Home Go to the home page. Qt Assistant's home page is the Qt Reference Documentation. Ctrl+Home :/trolltech/assistant/images/win/previous.png &Previous Go to the previous page. Alt+Left :/trolltech/assistant/images/win/next.png &Next Go to the next page. Alt+Right About Qt Assistant Display further information about Qt Assistant. QAction::AboutRole About Qt QAction::AboutQtRole :/trolltech/assistant/images/win/zoomin.png Zoom &in Zoom in on the document, i.e. increase the font size. Ctrl++ :/trolltech/assistant/images/win/zoomout.png Zoom &out Zoom out on the document, i.e. decrease the font size. Ctrl+- New Window Open a new window. Ctrl+N &Close Close the current window. Ctrl+W &Add Bookmark Add the currently displayed page as a new bookmark. :/trolltech/assistant/images/win/whatsthis.png What's This? "What's This?" context sensitive help. "What's This?" context sensitive help. Shift+F1 Add Tab Ctrl+Alt+N Next Tab Ctrl+Alt+Right Previous Tab Ctrl+Alt+Left Close Tab Ctrl+Alt+Q :/trolltech/assistant/images/assistant.png Qt Assistant Manual F1 Save Page As... Ctrl+Alt+S :/trolltech/assistant/images/win/synctoc.png Sync with Table of Contents Select the page in contents tab. Font Settings... QAction::PreferencesRole qt-assistant-qassistantclient-library-compat-version-4.6.3/profile.cpp 777 0 0 16172 11406632726 21414 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "profile.h" #include #include #include #include #include #include QT_BEGIN_NAMESPACE #define QT_TITLE QLatin1String("Qt Reference Documentation") #define DESIGNER_TITLE QLatin1String("Qt Designer Manual") #define ASSISTANT_TITLE QLatin1String("Qt Assistant Manual") #define LINGUIST_TITLE QLatin1String("Qt Linguist Manual") #define QMAKE_TITLE QLatin1String("qmake Manual") Profile *Profile::createDefaultProfile(const QString &docPath) { QString path = QLibraryInfo::location(QLibraryInfo::DocumentationPath); if (!docPath.isEmpty()) path = docPath; path = QDir::cleanPath(path) + QLatin1String("/html/"); Profile *profile = new Profile; profile->valid = true; profile->type = DefaultProfile; profile->props[QLatin1String("name")] = QLatin1String("default"); profile->props[QLatin1String("applicationicon")] = QLatin1String("assistant.png"); profile->props[QLatin1String("aboutmenutext")] = QLatin1String("About Qt"); profile->props[QLatin1String("abouturl")] = QLatin1String("about_qt"); profile->props[QLatin1String("basepath")] = path; profile->props[QLatin1String("startpage")] = path + QLatin1String("index.html"); profile->addDCFTitle( path + QLatin1String("qt.dcf"), QT_TITLE ); profile->addDCFTitle( path + QLatin1String("designer.dcf"), DESIGNER_TITLE ); profile->addDCFTitle( path + QLatin1String("assistant.dcf"), ASSISTANT_TITLE ); profile->addDCFTitle( path + QLatin1String("linguist.dcf"), LINGUIST_TITLE ); profile->addDCFTitle( path + QLatin1String("qmake.dcf"), QMAKE_TITLE ); profile->addDCFIcon( QT_TITLE, QLatin1String("qt.png") ); profile->addDCFIcon( DESIGNER_TITLE, QLatin1String("designer.png") ); profile->addDCFIcon( ASSISTANT_TITLE, QLatin1String("assistant.png") ); profile->addDCFIcon( LINGUIST_TITLE, QLatin1String("linguist.png") ); profile->addDCFIndexPage( QT_TITLE, path + QLatin1String("index.html") ); profile->addDCFIndexPage( DESIGNER_TITLE, path + QLatin1String("designer-manual.html") ); profile->addDCFIndexPage( ASSISTANT_TITLE, path + QLatin1String("assistant-manual.html") ); profile->addDCFIndexPage( LINGUIST_TITLE, path + QLatin1String("linguist-manual.html") ); profile->addDCFIndexPage( QMAKE_TITLE, path + QLatin1String("qmake-manual.html") ); profile->addDCFImageDir( QT_TITLE, QLatin1String("../../gif/") ); profile->addDCFImageDir( DESIGNER_TITLE, QLatin1String("../../gif/") ); profile->addDCFImageDir( ASSISTANT_TITLE, QLatin1String("../../gif/") ); profile->addDCFImageDir( LINGUIST_TITLE, QLatin1String("../../gif/") ); profile->addDCFImageDir( QMAKE_TITLE, QLatin1String("../../gif/") ); return profile; } Profile::Profile() : valid( true ), dparser( 0 ) { type = DefaultProfile; } bool Profile::isValid() const { return valid; } void Profile::addDCFTitle(const QString &dcf, const QString &title) { QString absdcf = QFileInfo(dcf).absoluteFilePath(); dcfTitles[title] = absdcf; if (!docs.contains(absdcf)) docs << absdcf; } void Profile::addDCF(const QString &docfile) { if( !docs.contains( docfile ) == 0 ) docs << docfile; } void Profile::addDCFIcon(const QString docfile, const QString &icon) { icons[docfile] = icon; } void Profile::addDCFIndexPage(const QString title, const QString &indexPage) { indexPages[title] = indexPage; } void Profile::addDCFImageDir(const QString docfile, const QString &imgDir) { imageDirs[docfile] = imgDir; } void Profile::addProperty(const QString &name, const QString &value) { props[name] = value; } bool Profile::hasDocFile(const QString &name) { return docs.contains( name ); } void Profile::removeDocFileEntry(const QString &docfile) { docs.removeAll(docfile); QStringList titles; for( QMap::Iterator it = dcfTitles.begin(); it != dcfTitles.end(); ++it ) { if( (*it) == docfile ) { indexPages.remove( *it ); icons.remove( *it ); imageDirs.remove( *it ); titles << it.key(); } } for( QStringList::ConstIterator title = titles.constBegin(); title != titles.constEnd(); ++title ) dcfTitles.remove( *title ); #ifdef ASSISTANT_DEBUG qDebug() << "docs:\n - " << docs.join("\n - "); qDebug() << "titles:\n - " << titles.join("\n - "); qDebug() << "keys:\n - " << ((QStringList*)&(dcfTitles.keys()))->join("\n - "); qDebug() << "values:\n - " << ((QStringList*)&(dcfTitles.values()))->join("\n - "); #endif } QString Profile::storableFilePath(const QString &fileName) { QString path = QLibraryInfo::location(QLibraryInfo::DocumentationPath).replace(QLatin1String("\\"), QLatin1String("/")); QString fName = fileName; if (fName.startsWith(path)) fName.replace(0, path.length(), QLatin1String("$DOCPATH$")); return fName; } QString Profile::loadableFilePath(const QString &fileName) { QString path = QLibraryInfo::location(QLibraryInfo::DocumentationPath).replace(QLatin1String("\\"), QLatin1String("/")); QString fName = fileName; if (fName.startsWith(QLatin1String("$DOCPATH$"))) fName.replace(0, 9, path); return fName; } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/profile.h 777 0 0 6701 11406632726 21036 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef PROFILE_H #define PROFILE_H #include #include #include #include QT_BEGIN_NAMESPACE class DocuParser; class Profile { public: enum ProfileType { DefaultProfile, UserProfile }; Profile(); bool isValid() const; void addDCF( const QString &docfile ); void addDCFIcon( const QString title, const QString &icon ); void addDCFIndexPage( const QString title, const QString &indexPage ); void addDCFImageDir( const QString title, const QString &imgDir ); void addDCFTitle( const QString &dcf, const QString &title ); void addProperty( const QString &name, const QString &value ); bool hasDocFile( const QString &docFile ); void removeDocFileEntry( const QString &title ); ProfileType profileType() const { return type; } void setProfileType( ProfileType t ) { type = t; } DocuParser *docuParser() const { return dparser; } void setDocuParser( DocuParser *dp ) { dparser = dp; } static Profile* createDefaultProfile(const QString &docPath = QString()); static QString makeRelativePath(const QString &base, const QString &path); static QString storableFilePath(const QString &fileName); static QString loadableFilePath(const QString &fileName); uint valid:1; ProfileType type; DocuParser *dparser; QMap props; QMap icons; QMap indexPages; QMap imageDirs; QMap dcfTitles; QStringList docs; }; QT_END_NAMESPACE #endif // PROFILE_H qt-assistant-qassistantclient-library-compat-version-4.6.3/tabbedbrowser.cpp 777 0 0 36763 11406632726 22611 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "tabbedbrowser.h" #include "mainwindow.h" #include "helpwindow.h" #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE #ifdef Q_WS_MAC const QLatin1String ImageLocation(":trolltech/assistant/images/mac/"); #else const QLatin1String ImageLocation(":trolltech/assistant/images/win/"); #endif TabbedBrowser::TabbedBrowser(MainWindow *parent) : QWidget(parent) { ui.setupUi(this); init(); QStackedWidget *stack = qFindChild(ui.tab); Q_ASSERT(stack); stack->setContentsMargins(0, 0, 0, 0); connect(stack, SIGNAL(currentChanged(int)), parent, SLOT(browserTabChanged())); QPalette p = palette(); p.setColor(QPalette::Inactive, QPalette::Highlight, p.color(QPalette::Active, QPalette::Highlight)); p.setColor(QPalette::Inactive, QPalette::HighlightedText, p.color(QPalette::Active, QPalette::HighlightedText)); setPalette(p); } TabbedBrowser::~TabbedBrowser() { } MainWindow *TabbedBrowser::mainWindow() const { return static_cast(parentWidget()); } void TabbedBrowser::forward() { currentBrowser()->forward(); emit browserUrlChanged(currentBrowser()->source().toString()); } void TabbedBrowser::backward() { currentBrowser()->backward(); emit browserUrlChanged(currentBrowser()->source().toString()); } void TabbedBrowser::setSource( const QString &ref ) { HelpWindow * win = currentBrowser(); win->setSource(ref); } void TabbedBrowser::reload() { currentBrowser()->reload(); } void TabbedBrowser::home() { currentBrowser()->home(); } HelpWindow *TabbedBrowser::currentBrowser() const { return static_cast(ui.tab->currentWidget()); } void TabbedBrowser::nextTab() { if(ui.tab->currentIndex()<=ui.tab->count()-1) ui.tab->setCurrentIndex(ui.tab->currentIndex()+1); } void TabbedBrowser::previousTab() { int idx = ui.tab->currentIndex()-1; if(idx>=0) ui.tab->setCurrentIndex(idx); } HelpWindow *TabbedBrowser::createHelpWindow() { MainWindow *mainWin = mainWindow(); HelpWindow *win = new HelpWindow(mainWin, 0); win->setFrameStyle(QFrame::NoFrame); win->setPalette(palette()); win->setSearchPaths(Config::configuration()->mimePaths()); ui.tab->addTab(win, tr("...")); connect(win, SIGNAL(highlighted(QString)), (const QObject*) (mainWin->statusBar()), SLOT(showMessage(QString))); connect(win, SIGNAL(backwardAvailable(bool)), mainWin, SLOT(backwardAvailable(bool))); connect(win, SIGNAL(forwardAvailable(bool)), mainWin, SLOT(forwardAvailable(bool))); connect(win, SIGNAL(sourceChanged(QUrl)), this, SLOT(sourceChanged())); ui.tab->cornerWidget(Qt::TopRightCorner)->setEnabled(ui.tab->count() > 1); win->installEventFilter(this); win->viewport()->installEventFilter(this); ui.editFind->installEventFilter(this); return win; } HelpWindow *TabbedBrowser::newBackgroundTab() { HelpWindow *win = createHelpWindow(); emit tabCountChanged(ui.tab->count()); return win; } void TabbedBrowser::newTab(const QString &lnk) { QString link(lnk); if(link.isNull()) { HelpWindow *w = currentBrowser(); if(w) link = w->source().toString(); } HelpWindow *win = createHelpWindow(); ui.tab->setCurrentIndex(ui.tab->indexOf(win)); if(!link.isNull()) { win->setSource(link); } emit tabCountChanged(ui.tab->count()); } void TabbedBrowser::zoomIn() { currentBrowser()->zoomIn(); Config::configuration()->setFontPointSize(currentBrowser()->font().pointSizeF()); } void TabbedBrowser::zoomOut() { currentBrowser()->zoomOut(); Config::configuration()->setFontPointSize(currentBrowser()->font().pointSizeF()); } void TabbedBrowser::init() { lastCurrentTab = 0; while(ui.tab->count()) { QWidget *page = ui.tab->widget(0); ui.tab->removeTab(0); delete page; } connect(ui.tab, SIGNAL(currentChanged(int)), this, SLOT(transferFocus())); QTabBar *tabBar = qFindChild(ui.tab); QStyleOptionTab opt; if (tabBar) { opt.init(tabBar); opt.shape = tabBar->shape(); tabBar->setContextMenuPolicy(Qt::CustomContextMenu); connect(tabBar, SIGNAL(customContextMenuRequested(QPoint)), SLOT(openTabMenu(QPoint))); } // workaround for sgi style QPalette pal = palette(); pal.setColor(QPalette::Active, QPalette::Button, pal.color(QPalette::Active, QPalette::Window)); pal.setColor(QPalette::Disabled, QPalette::Button, pal.color(QPalette::Disabled, QPalette::Window)); pal.setColor(QPalette::Inactive, QPalette::Button, pal.color(QPalette::Inactive, QPalette::Window)); QToolButton *newTabButton = new QToolButton(this); ui.tab->setCornerWidget(newTabButton, Qt::TopLeftCorner); newTabButton->setCursor(Qt::ArrowCursor); newTabButton->setAutoRaise(true); newTabButton->setIcon(QIcon(ImageLocation + QLatin1String("addtab.png"))); QObject::connect(newTabButton, SIGNAL(clicked()), this, SLOT(newTab())); newTabButton->setToolTip(tr("Add page")); QToolButton *closeTabButton = new QToolButton(this); closeTabButton->setPalette(pal); ui.tab->setCornerWidget(closeTabButton, Qt::TopRightCorner); closeTabButton->setCursor(Qt::ArrowCursor); closeTabButton->setAutoRaise(true); closeTabButton->setIcon(QIcon(ImageLocation + QLatin1String("closetab.png"))); QObject::connect(closeTabButton, SIGNAL(clicked()), this, SLOT(closeTab())); closeTabButton->setToolTip(tr("Close page")); closeTabButton->setEnabled(false); QObject::connect(ui.toolClose, SIGNAL(clicked()), ui.frameFind, SLOT(hide())); QObject::connect(ui.toolPrevious, SIGNAL(clicked()), this, SLOT(findPrevious())); QObject::connect(ui.toolNext, SIGNAL(clicked()), this, SLOT(findNext())); QObject::connect(ui.editFind, SIGNAL(returnPressed()), this, SLOT(findNext())); QObject::connect(ui.editFind, SIGNAL(textEdited(QString)), this, SLOT(find(QString))); ui.frameFind->setVisible(false); ui.labelWrapped->setVisible(false); autoHideTimer = new QTimer(this); autoHideTimer->setInterval(5000); autoHideTimer->setSingleShot(true); QObject::connect(autoHideTimer, SIGNAL(timeout()), ui.frameFind, SLOT(hide())); } void TabbedBrowser::updateTitle(const QString &title) { ui.tab->setTabText(ui.tab->indexOf(currentBrowser()), title.trimmed()); } void TabbedBrowser::newTab() { newTab(QString()); } void TabbedBrowser::transferFocus() { if(currentBrowser()) { currentBrowser()->setFocus(); } mainWindow()->setWindowTitle(Config::configuration()->title() + QLatin1String(" - ") + currentBrowser()->documentTitle()); } void TabbedBrowser::initHelpWindow(HelpWindow * /*win*/) { } void TabbedBrowser::setup() { newTab(QString()); } void TabbedBrowser::copy() { currentBrowser()->copy(); } void TabbedBrowser::closeTab() { if(ui.tab->count()==1) return; HelpWindow *win = currentBrowser(); mainWindow()->removePendingBrowser(win); ui.tab->removeTab(ui.tab->indexOf(win)); QTimer::singleShot(0, win, SLOT(deleteLater())); ui.tab->cornerWidget(Qt::TopRightCorner)->setEnabled(ui.tab->count() > 1); emit tabCountChanged(ui.tab->count()); } QStringList TabbedBrowser::sources() const { QStringList lst; int cnt = ui.tab->count(); for(int i=0; iwidget(i))->source().toString()); } return lst; } QList TabbedBrowser::browsers() const { QList list; for (int i=0; icount(); ++i) { Q_ASSERT(qobject_cast(ui.tab->widget(i))); list.append(static_cast(ui.tab->widget(i))); } return list; } void TabbedBrowser::sourceChanged() { HelpWindow *win = qobject_cast(QObject::sender()); Q_ASSERT(win); QString docTitle(win->documentTitle()); if (docTitle.isEmpty()) docTitle = QLatin1String("..."); // Make the classname in the title a bit more visible (otherwise // we just see the "Qt 4.0 : Q..." which isn't really helpful ;-) QString qtTitle = QLatin1String("Qt ") + QString::number( (QT_VERSION >> 16) & 0xff ) + QLatin1String(".") + QString::number( (QT_VERSION >> 8) & 0xff ) + QLatin1String(": "); if (docTitle.startsWith(qtTitle)) docTitle = docTitle.mid(qtTitle.length()); setTitle(win, docTitle); ui.frameFind->hide(); ui.labelWrapped->hide(); win->setTextCursor(win->cursorForPosition(QPoint(0, 0))); } void TabbedBrowser::setTitle(HelpWindow *win, const QString &title) { const QString tt = title.trimmed(); ui.tab->setTabText(ui.tab->indexOf(win), tt); if (win == currentBrowser()) mainWindow()->setWindowTitle(Config::configuration()->title() + QLatin1String(" - ") + tt); } void TabbedBrowser::keyPressEvent(QKeyEvent *e) { int key = e->key(); QString ttf = ui.editFind->text(); QString text = e->text(); if (ui.frameFind->isVisible()) { switch (key) { case Qt::Key_Escape: ui.frameFind->hide(); ui.labelWrapped->hide(); return; case Qt::Key_Backspace: ttf.chop(1); break; case Qt::Key_Return: case Qt::Key_Enter: // Return/Enter key events are not accepted by QLineEdit return; default: if (text.isEmpty()) { QWidget::keyPressEvent(e); return; } ttf += text; } } else { if (text.isEmpty() || text[0].isSpace() || !text[0].isPrint()) { QWidget::keyPressEvent(e); return; } if (text.startsWith(QLatin1Char('/'))) { ui.editFind->clear(); find(); return; } ttf = text; ui.frameFind->show(); } ui.editFind->setText(ttf); find(ttf, false, false); } void TabbedBrowser::findNext() { find(ui.editFind->text(), true, false); } void TabbedBrowser::findPrevious() { find(ui.editFind->text(), false, true); } void TabbedBrowser::find() { ui.frameFind->show(); ui.editFind->setFocus(Qt::ShortcutFocusReason); ui.editFind->selectAll(); autoHideTimer->stop(); } void TabbedBrowser::find(QString ttf, bool forward, bool backward) { HelpWindow *browser = currentBrowser(); QTextDocument *doc = browser->document(); QString oldText = ui.editFind->text(); QTextCursor c = browser->textCursor(); QTextDocument::FindFlags options; QPalette p = ui.editFind->palette(); p.setColor(QPalette::Active, QPalette::Base, Qt::white); if (c.hasSelection()) c.setPosition(forward ? c.position() : c.anchor(), QTextCursor::MoveAnchor); QTextCursor newCursor = c; if (!ttf.isEmpty()) { if (backward) options |= QTextDocument::FindBackward; if (ui.checkCase->isChecked()) options |= QTextDocument::FindCaseSensitively; if (ui.checkWholeWords->isChecked()) options |= QTextDocument::FindWholeWords; newCursor = doc->find(ttf, c, options); ui.labelWrapped->hide(); if (newCursor.isNull()) { QTextCursor ac(doc); ac.movePosition(options & QTextDocument::FindBackward ? QTextCursor::End : QTextCursor::Start); newCursor = doc->find(ttf, ac, options); if (newCursor.isNull()) { p.setColor(QPalette::Active, QPalette::Base, QColor(255, 102, 102)); newCursor = c; } else ui.labelWrapped->show(); } } if (!ui.frameFind->isVisible()) ui.frameFind->show(); browser->setTextCursor(newCursor); ui.editFind->setPalette(p); if (!ui.editFind->hasFocus()) autoHideTimer->start(); } bool TabbedBrowser::eventFilter(QObject *o, QEvent *e) { if (o == ui.editFind) { if (e->type() == QEvent::FocusIn && autoHideTimer->isActive()) autoHideTimer->stop(); } else if (e->type() == QEvent::KeyPress && ui.frameFind->isVisible()) { // assume textbrowser QKeyEvent *ke = static_cast(e); if (ke->key() == Qt::Key_Space) { keyPressEvent(ke); return true; } } return QWidget::eventFilter(o, e); } void TabbedBrowser::openTabMenu(const QPoint& pos) { QTabBar *tabBar = qFindChild(ui.tab); QMenu m(QLatin1String(""), tabBar); QAction *new_action = m.addAction(tr("New Tab")); QAction *close_action = m.addAction(tr("Close Tab")); QAction *close_others_action = m.addAction(tr("Close Other Tabs")); if (tabBar->count() == 1) { close_action->setEnabled(false); close_others_action->setEnabled(false); } QAction *action_picked = m.exec(tabBar->mapToGlobal(pos)); if (!action_picked) return; if (action_picked == new_action) { newTab(); return; } QList windowList = browsers(); for (int i = 0; i < tabBar->count(); ++i) { if (tabBar->tabRect(i).contains(pos)) { HelpWindow *win = static_cast(ui.tab->widget(i)); if (action_picked == close_action) { mainWindow()->removePendingBrowser(win); QTimer::singleShot(0, win, SLOT(deleteLater())); } windowList.removeOne(win); break; } } if (action_picked == close_others_action) { foreach (HelpWindow* win, windowList) { mainWindow()->removePendingBrowser(win); QTimer::singleShot(0, win, SLOT(deleteLater())); windowList.removeOne(win); } } ui.tab->cornerWidget(Qt::TopRightCorner)->setEnabled(windowList.count() > 1); emit tabCountChanged(windowList.count()); } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/tabbedbrowser.h 777 0 0 7051 11406632726 22222 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TABBEDBROWSER_H #define TABBEDBROWSER_H #include "ui_tabbedbrowser.h" QT_BEGIN_NAMESPACE class MainWindow; class HelpWindow; class QStyleSheet; class QMimeSourceFactory; class QTimer; class TabbedBrowser : public QWidget { Q_OBJECT public: TabbedBrowser(MainWindow *parent); virtual ~TabbedBrowser(); MainWindow *mainWindow() const; HelpWindow *currentBrowser() const; QStringList sources() const; QList browsers() const; HelpWindow* newBackgroundTab(); HelpWindow* createHelpWindow(); void setTitle(HelpWindow*, const QString &); signals: void tabCountChanged(int count); void browserUrlChanged(const QString &link); protected: void keyPressEvent(QKeyEvent *); bool eventFilter(QObject *o, QEvent *e); public slots: void init(); void forward(); void backward(); void setSource(const QString &ref); void reload(); void home(); void nextTab(); void previousTab(); void newTab(const QString &lnk); void zoomIn(); void zoomOut(); void updateTitle(const QString &title); void newTab(); void transferFocus(); void initHelpWindow(HelpWindow *win); void setup(); void copy(); void closeTab(); void sourceChanged(); void find(); void findNext(); void findPrevious(); private slots: void find(QString, bool forward = false, bool backward = false); void openTabMenu(const QPoint& pos); private: Ui::TabbedBrowser ui; QWidget *lastCurrentTab; QFont tabFont; QString fixedFontFam; QColor lnkColor; bool underlineLnk; QTimer *autoHideTimer; }; QT_END_NAMESPACE #endif // TABBEDBROWSER_H qt-assistant-qassistantclient-library-compat-version-4.6.3/tabbedbrowser.ui 777 0 0 16133 11406632726 22431 0 ********************************************************************* ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ********************************************************************* TabbedBrowser 0 0 710 664 TabbedBrowser 0 0 Untitled 8 6 QFrame::StyledPanel QFrame::Raised 0 6 :/trolltech/assistant/images/close.png true 0 0 0 0 150 0 Previous :/trolltech/assistant/images/win/previous.png Qt::ToolButtonTextBesideIcon true 0 0 Next :/trolltech/assistant/images/win/next.png Qt::ToolButtonTextBesideIcon true Qt::NoArrow Case Sensitive Whole words 0 20 105 20 <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Search wrapped Qt::RichText true Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Qt::Horizontal 81 21 qt-assistant-qassistantclient-library-compat-version-4.6.3/topicchooser.cpp 777 0 0 6443 11406632726 22435 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "topicchooser.h" #include #include #include QT_BEGIN_NAMESPACE TopicChooser::TopicChooser(QWidget *parent, const QStringList &lnkNames, const QStringList &lnks, const QString &title) : QDialog(parent), links(lnks), linkNames(lnkNames) { ui.setupUi(this); ui.label->setText(tr("Choose a topic for %1").arg(title)); ui.listbox->addItems(linkNames); if (ui.listbox->count() != 0) ui.listbox->setCurrentRow(0); ui.listbox->setFocus(); } QString TopicChooser::link() const { if (ui.listbox->currentRow() == -1) return QString(); QString s = ui.listbox->item(ui.listbox->currentRow())->text(); if (s.isEmpty()) return s; int i = linkNames.indexOf(s); return links[i]; } QString TopicChooser::getLink(QWidget *parent, const QStringList &lnkNames, const QStringList &lnks, const QString &title) { TopicChooser *dlg = new TopicChooser(parent, lnkNames, lnks, title); QString lnk; if (dlg->exec() == QDialog::Accepted) lnk = dlg->link(); delete dlg; return lnk; } void TopicChooser::on_buttonDisplay_clicked() { accept(); } void TopicChooser::on_buttonCancel_clicked() { reject(); } void TopicChooser::on_listbox_itemActivated(QListWidgetItem *item) { Q_UNUSED(item); accept(); } QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/topicchooser.h 777 0 0 5254 11406632726 22101 0/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TOPICCHOOSER_H #define TOPICCHOOSER_H #include "ui_topicchooser.h" #include #include QT_BEGIN_NAMESPACE class TopicChooser : public QDialog { Q_OBJECT public: TopicChooser(QWidget *parent, const QStringList &lnkNames, const QStringList &lnks, const QString &title); QString link() const; static QString getLink(QWidget *parent, const QStringList &lnkNames, const QStringList &lnks, const QString &title); private slots: void on_buttonDisplay_clicked(); void on_buttonCancel_clicked(); void on_listbox_itemActivated(QListWidgetItem *item); private: Ui::TopicChooser ui; QString theLink; QStringList links, linkNames; }; #endif // TOPICCHOOSER_H QT_END_NAMESPACE qt-assistant-qassistantclient-library-compat-version-4.6.3/topicchooser.ui 777 0 0 11713 11406632726 22304 0 ********************************************************************* ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt Assistant of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ********************************************************************* TopicChooser 0 0 391 223 Choose Topic Select a topic from the list and click the <b>Display</b>-button to open the online help. true 6 11 11 11 11 &Topics listbox Displays a list of available help topics for the keyword. 6 0 0 0 0 Qt::Horizontal QSizePolicy::Expanding 20 20 Open the topic selected in the list. &Display true true Close the Dialog. &Close true qt-assistant-qassistantclient-library-compat-version-4.6.3/translations/ 777 0 0 0 11410366047 21652 5qt-assistant-qassistantclient-library-compat-version-4.6.3/translations/assistant_adp_de.ts 777 0 0 102027 11262330577 25660 0 AssistantServer Qt Assistant Qt Assistant Failed to bind to port %1 Kann Port %1 nicht binden FontPanel Font Schrift &Writing system S&kript &Family &Schriftart &Style S&chriftschnitt &Point size Schriftg&rad FontSettingsDialog Font Settings Schriftart Font settings for: Schriftart für: Browser Hilfeseiten Application Anwendung Use custom settings Erweitere Einstellungen nutzen HelpDialog Con&tents Inhal&t Qt Assistant Qt Assistant Open Link in New Window Öffne Link in neuem Fenster Prepare... Initialisiere... Cannot open the index file %1 Kann Indexdatei %1 nicht öffnen Warning Warnung Documentation file %1 does not exist! Skipping file. Dokumentation %1 existiert nicht! Überspringe Datei. Parse Error Syntaxfehler Done Fertig Indexing files... Indiziere Dokumentation... Reading dictionary... Lese Suchindex... Full Text Search Volltextsuche Using a wildcard within phrases is not allowed. Wildcards innerhalb von Phrasen sind nicht zugelassen. The closing quotation mark is missing. Das schließende Anführungszeichen fehlt. %n document(s) found. %n Dokumente gefunden. Open Link in Current Tab Link im Aktuellen Tab öffnen Open Link in New Tab Link in einem neuen Tab öffnen Failed to load keyword index file Assistant will not work! Die Indexdatei konnte nicht geladen werden. Der Assistent ist nicht einsatzbereit! Documentation file %1 is not compatible! Skipping file. Dokumentation %1 ist nicht kompatibel! Datei wird übersprungen. Failed to save fulltext search index Assistant will not work! Der Index für die Volltextsuche konnte nicht gespeichert werden. Assistent ist nicht einsatzbereit! Help Hilfe <b>Help</b><p>Choose the topic you want help on from the contents list, or search the index for keywords.</p> <b>Hilfe</b><p>Wählen Sie ein Hilfethema aus dem Inhalt oder suchen Sie im Index nach Schlüsselwörtern.</p> Displays help topics organized by category, index or bookmarks. Another tab inherits the full text search. Zeigt Hilfethemen geordnet nach Kategorie, Index oder Lesezeichen an. Ein weiterer Abschnitt enthält die Volltextsuche. <b>Help topics organized by category.</b><p>Double-click an item to see the topics in that category. To view a topic, just double-click it.</p> <b>Hilfethemen geordnet nach Kategorie.</b><p>Doppelklicken Sie einen Eintrag, um die Themen dieser Kategorie zu sehen. Doppelklicken Sie ein Thema, um es angezeigt zu bekommen.</p> column 1 Spalte 1 &Index &Index &Look For: Suchen &nach: Enter keyword Geben Sie ein Schlüsselwort ein <b>Enter a keyword.</b><p>The list will select an item that matches the entered string best.</p> <b>Geben Sie ein Schlüsselwort ein.</b><p>Es wird dann der Eintrag aus der Liste ausgewählt, der am besten mit dem eingegebenen Begriff übereinstimmt.</p> <b>List of available help topics.</b><p>Double-click on an item to open its help page. If more than one is found, you must specify which page you want.</p> <b>Liste aller verfügbaren Hilfethemen.</b><p>Doppelklicken Sie auf einen Eintrag, um die Hilfe zu öffnen. Wenn mehr als eine Seite gefunden wurde, wählen Sie die gewünschte Seite aus.</p> &Bookmarks L&esezeichen Displays the list of bookmarks. Zeigt alle Lesezeichen an. Add new bookmark Füge neues Lesezeichen hinzu Add the currently displayed page as a new bookmark. Füge aktuelle Seite zu den Lesezeichen hinzu. &New &Neu Delete bookmark Lösche Lesezeichen Delete the selected bookmark. Lösche markiertes Lesezeichen. &Delete &Löschen &Search &Suche Searching f&or: Suche &nach: <b>Enter search word(s).</b><p>Enter here the word(s) you are looking for. The words may contain wildcards (*). For a sequence of words quote them.</p> <b>Geben Sie Suchbegriffe ein.</b><p>Geben Sie hier die gesuchten Begriffe ein. Die Begriffe können Wildcards (*) enthalten. Eine Phrase muß in Anführungszeichen stehen.</p> <b>Found documents</b><p>This list contains all found documents from the last search. The documents are ordered, i.e. the first document has the most matches.</p> <b>Gefundene Dokumente</b><p>Diese Liste beinhaltet alle gefundenen Dokumente der letzten Suche. Die Dokumente sind nach der Häufigkeit der Treffer geordnet.</p> Found &Documents: Gefundene &Dokumente: Display the help page for the full text search. Zeigt die Hilfeseite für die Volltextsuche an. He&lp Hi&lfe Pressing this button starts the search. Startet die Suche. Preparing... Initialisiere... Enter searchword(s) Geben Sie Suchbegriffe ein Display the help page Hilfeseite anzeigen Start searching Suche beginnen HelpWindow Help Hilfe Open Link in New Window Shift+LMB Öffne Link in neuem Fenster Open Link in New Tab Link in einem neuen Tab öffnen Unable to launch web browser. Der Webbrowser konnte nicht gestartet werden. OK OK Failed to open link: '%1' Der Link '%1' konnte nicht geöffnet werden <div align="center"><h1>The page could not be found</h1><br><h3>'%1'</h3></div> <div align="center"><h1>Die Seite wurde nicht gefunden</h1><br><h3>'%1'</h3></div> Error... Fehler ... Copy &Link Location Link-Adresse kopieren Index Untitled Unbenannt MainWindow Toolbar Werkzeugleiste &Print... &Drucken... E&xit &Beenden &Copy &Kopieren &Find in Text... Text&suche... &Home St&artseite &Previous &Vorherige &Next &Nächste About Qt Über Qt Zoom &in Vergrößern Zoom &out Ver&kleinern New Window Neues Fenster... Ctrl+T Strg+T Ctrl+I Strg+I Ctrl+B Strg+E Qt Assistant Qt Assistant &Add Bookmark &Füge Lesezeichen hinzu &File &Datei &Edit &Bearbeiten &View &Ansicht &Go &Gehe zu Boo&kmarks &Lesezeichen Qt Assistant by Nokia Qt Assistant von Nokia &Help &Hilfe Print the currently displayed page. Drucke aktuelle Seite. Ctrl+P Strg+P Quit Qt Assistant. Qt Assistant beenden. Ctrl+Q Strg+Q Copy the selected text to the clipboard. Den markierten Text in die Zwischenablage kopieren. Ctrl+C Strg+C Open the Find dialog. Qt Assistant will search the currently displayed page for the text you enter. Den Suchdialog öffnen. Qt Assistant sucht in der aktuellen Seite nach dem eingegebenen Text. Ctrl+F Strg+F Go to the home page. Qt Assistant's home page is the Qt Reference Documentation. Zur Startseite gehen. Startseite im Qt Assistant ist die Qt-Referenzdokumentation. Ctrl+Home Strg+Pos1 Go to the previous page. Gehe zur vorherigen Seite. Alt+Left Alt+Links Go to the next page. Gehe zur nächsten Seite. Alt+Right Alt+Rechts Display further information about Qt Assistant. Zeigt das Handbuch zum Qt Designer an. Zoom in on the document, i.e. increase the font size. Vergrößert die Schrift. Ctrl++ Strg++ Zoom out on the document, i.e. decrease the font size. Verkleinert die Schrift. Ctrl+- Strg+- Open a new window. Öffnet ein neues Fenster. Ctrl+N Strg+N &Close &Schließen Close the current window. Schließt das aktuelle Fenster. Qt Assistant Manual Handbuch zu Qt Assistant F1 F1 Add the currently displayed page as a new bookmark. Aktuelle Seite zu den Lesezeichen hinzufügen. What's This? Direkthilfe "What's This?" context sensitive help. Kontextbezogene Direkthilfe. Shift+F1 Umschalt+F1 Ctrl+S Strg+S Initializing Qt Assistant... Qt Assistant wird initialisiert... Go Gehe zu Find &Next Weitersuchen F3 F3 Find &Previous Vorheriges suchen Shift+F3 Umschalt+F3 About Qt Assistant Über Qt Assistent Add Tab Tab einfügen Ctrl+Alt+N Next Tab Nächster Tab Ctrl+Alt+Right Previous Tab Voriger Tab Ctrl+Alt+Left Close Tab Tab schließen Ctrl+Alt+Q Failed to open about application contents in file: '%1' Fehler beim Öffnen des Inhalts in Datei: '%1' Sidebar Sidebar &Window &Fenster Minimize Minimieren Ctrl+M Strg+M SHIFT+CTRL+= Umschalt+Strg+= Ctrl+W Strg+W Ctrl+] Strg+AltGr+] Ctrl+[ Strg+AltGr+[ Views Menüleisten/Sidebar Displays the main page of a specific documentation set. Zeigt die Hauptseite eines Dokumentensets an. ... ... Save Page Seite speichern Cannot open file for writing! Die Datei konnte nicht zum Schreiben geöffnet werden. Save Page As... Seite speichern als... Ctrl+Alt+S Strg+Alt+S Sync with Table of Contents Seite mit Inhalt-Tab syncronisieren Select the page in contents tab. Wählt die Seite im Inhalt-Tab aus. Font Settings... Schriftart... QObject Qt Assistant by Nokia Qt Assistant von Nokia TabbedBrowser TabbedBrowser Untitled Unbenannt Add page Seite einfügen Close page Seite schließen ... ... New Tab Neuer Tab Close Tab Tab schließen Close Other Tabs Andere Tabs schließen Previous Vorheriger Next Nächster Case Sensitive Groß-/Kleinschreibung beachten Whole words Ganze Wörter <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Search wrapped <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Seitenende TopicChooser Choose a topic for <b>%1</b> Wählen Sie ein Thema für <b>%1</b> Choose Topic Thema wählen Select a topic from the list and click the <b>Display</b>-button to open the online help. Wählen Sie ein Thema aus der Liste aus und klicken Sie <b>Anzeigen</b> um die Hilfe zu öffnen. &Topics &Themen Displays a list of available help topics for the keyword. Zeigt eine Liste der verfügbaren Hilfethemen für diesen Begriff an. &Display &Anzeigen Open the topic selected in the list. Öffne das gewählte Thema aus der Liste. &Close &Schließen Close the Dialog. Schließt den Dialog. qt-assistant-qassistantclient-library-compat-version-4.6.3/translations/assistant_adp_ja.ts 777 0 0 115401 11244537332 25660 0 AssistantServer Qt Assistant Qt Assistant Failed to bind to port %1 ポート %1 のバインドに失敗しました FontPanel Font &Writing system &Family &Style &Point size FontSettingsDialog Font Settings Font settings for: Browser Application Use custom settings HelpDialog Open Link in Current Tab リンクを現在のタブに開く Open Link in New Window リンクを新しいウィンドウで開く Open Link in New Tab リンクを新しいタブで開く Prepare... 準備中... Qt Assistant Qt Assistant Failed to load keyword index file Assistant will not work! キーワードインデックスファイルのロードに失敗しました Assistant は動きません! Cannot open the index file %1 インデックスファイル %1 をオープンできません Warning 警告 Documentation file %1 does not exist! Skipping file. ドキュメンテーションファイル %1 は存在しません! スキップします。 Parse Error パースエラー Documentation file %1 is not compatible! Skipping file. ドキュメンテーションファイル %1 は互換性がありません! スキップします。 %n document(s) found. Index インデックス Bookmarks ブックマーク Contents 目次 Search 検索 Done 完了 Failed to save fulltext search index Assistant will not work! 全文検索インデックスのセーブに失敗しました Assistant は動きません! Indexing files... インデックス作成中... Reading dictionary... ディレクトリを読み込んでいます... Full Text Search 全文検索 Using a wildcard within phrases is not allowed. フレーズ中のワイルドカードの使用は認められていません。 The closing quotation mark is missing. 閉じ引用符がありません。 Help ヘルプ <b>Help</b><p>Choose the topic you want help on from the contents list, or search the index for keywords.</p> <b>ヘルプ</b><p>目次のリストからヘルプを希望するトピックを選択します、あるいはキーワードをインデックスから検索します。</p> Displays help topics organized by category, index or bookmarks. Another tab inherits the full text search. カテゴリ、インデックス、ブックマークで編成したヘルプトピックを表示します。もう一つのタブは全文検索を引き継いでいます。 Con&tents 目次(&T) <b>Help topics organized by category.</b><p>Double-click an item to see the topics in that category. To view a topic, just double-click it.</p> <b>カテゴリで編成したヘルプトピックです。</b><p>カテゴリ内のトピックを見るには、項目をダブルクリックしてください。</p> column 1 コラム 1 &Index インデックス(&I) &Look For: 以下を検索(&L): Enter keyword キーワードを入力してください <b>Enter a keyword.</b><p>The list will select an item that matches the entered string best.</p> <b>キーワードを入力してください。</b><p>入力された文字列に一番近いものを選択します。</p> <b>List of available help topics.</b><p>Double-click on an item to open its help page. If more than one is found, you must specify which page you want.</p> <b>ヘルプトピック一覧</b><p>ヘルプページをオープンするには、項目をダブルクリックしてください。複数見つかった場合は、その中から選んでください。</p> &Bookmarks ブックマーク(&B) Displays the list of bookmarks. ブックマーク一覧を表示します。 Add new bookmark 新しいブックマークを追加 Add the currently displayed page as a new bookmark. 現在表示されているページを新しいブックマークとして追加します。 &New 新規(&N) Delete bookmark ブックマークを削除 Delete the selected bookmark. 選択されたブックマークを削除します。 &Delete 削除(&D) &Search 検索(&S) Searching f&or: 以下を検索(&O): Enter searchword(s). 検索する語(フレーズ)を入力してください。 <b>Enter search word(s).</b><p>Enter here the word(s) you are looking for. The words may contain wildcards (*). For a sequence of words quote them.</p> <b>検索する語(フレーズ)を入力してください。</b><p>検索する語(フレーズ)を入力してください。ワイルドカード(*)を含めることもできます。連続する語を入力する場合は引用符で囲んでください。</p> <b>Found documents</b><p>This list contains all found documents from the last search. The documents are ordered, i.e. the first document has the most matches.</p> <b>見つかったドキュメント</b><p>この一覧は最新の検索で見つかったドキュメントを全て含んでいます。該当項目が多い順に並んでいます。</p> Found &Documents: 見つかったドキュメント(&D): Display the help page. ヘルプページを表示します。 Display the help page for the full text search. 全文検索用にヘルプページを表示します。 He&lp ヘルプ(&L) Start searching. 検索を開始します。 Pressing this button starts the search. このボタンを押すと検索が始まります。 Preparing... 準備中... HelpWindow Help ヘルプ OK Failed to open link: '%1' リンク開けませんでした: '%1' <div align="center"><h1>The page could not be found</h1><br><h3>'%1'</h3></div> <div align="center"><h1>ページが見つかりませんでした</h1><br><h3>'%1'</h3></div> Error... エラー... Copy &Link Location Open Link in New Window Shift+LMB リンクを新しいウィンドウで開く Shift+LMB Open Link in New Tab リンクを新しいタブで開く Unable to launch web browser. ブラウザを起動できません。 Ok Ok Index Untitled タイトルなし MainWindow Sidebar サイドバー Initializing Qt Assistant... Qt Assistant を初期化中... SHIFT+CTRL+= SHIFT+CTRL+= Ctrl+T Ctrl+T Ctrl+I Ctrl+I Ctrl+B Ctrl+B Ctrl+S Ctrl+S Ctrl+W Ctrl+W Ctrl+] Ctrl+] Ctrl+[ Ctrl+[ Views 表示 Displays the main page of a specific documentation set. 指定されたドキュメントセットのメインページを表示します。 Qt Assistant Qt Assistant Failed to open about application contents in file: '%1' '%1' というファイル内の、アプリケーションについての説明内容を開けませんでした ... ... Save Page ページを保存 Cannot open file for writing! 書き込みのためにファイルが開けません! Qt Assistant by Trolltech Trolltech の Qt Assistant Toolbar ツールバー Go 移動 &File ファイル(&F) &Edit 編集(&E) Font Settings... &View 表示(&V) &Go 移動(&G) Boo&kmarks ブックマーク(&K) Qt Assistant by Nokia &Help ヘルプ(&H) Print the currently displayed page. 現在表示されているページを印刷します。 Ctrl+P Ctrl+P &Print... 印刷(&P)... Quit Qt Assistant. Qt Assistant を終了します。 Ctrl+Q Ctrl+Q E&xit 終了(&X) Copy the selected text to the clipboard. 選択されているテキストをクリップボードにコピーします。 Ctrl+C Ctrl+C &Copy コピー(&C) Open the Find dialog. Qt Assistant will search the currently displayed page for the text you enter. 検索ダイアログを開きます。Qt Assistant は入力されたテキストを現在表示されているページから検索します。 Ctrl+F Ctrl+F &Find in Text... テキスト内を検索(&F)... F3 F3 Find &Next 次を検索(&N) Shift+F3 Shift+F3 Find &Previous 前を検索(&P) Go to the home page. Qt Assistant's home page is the Qt Reference Documentation. ホームページへ移動します。Qt Assistant のホームページは Qt Reference Documentation です。 Ctrl+Home Ctrl+Home &Home ホーム(&H) Go to the previous page. 一つ前のページへ戻ります。 Alt+Left Alt+左矢印 &Previous 戻る(&P) Go to the next page. 一つ先のページへ進みます。 Alt+Right Alt+右矢印 &Next 進む(&N) Display further information about Qt Assistant. Qt Assistant について、さらに詳しい情報を表示します。 About Qt Assistant Qt Assistant について About Qt Qt について Zoom in on the document, i.e. increase the font size. 文書をズームイン(フォントサイズを拡大)します。 Ctrl++ Ctrl++ Zoom &in 拡大(&I) Zoom out on the document, i.e. decrease the font size. 文書をズームアウト(フォントサイズを縮小)します。 Ctrl+- Ctrl+- Zoom &out 縮小(&O) Open a new window. 新規ウィンドウを開きます。 Ctrl+N Ctrl+N New Window 新しいウィンドウ Close the current window. 現在のウィンドウを閉じます。 &Close 閉じる(&C) Add the currently displayed page as a new bookmark. 現在表示されているページを新規ブックマークとして追加します。 &Add Bookmark ブックマークに追加(&A) "What's This?" context sensitive help. 文脈依存のヘルプ、ヒントです。 Shift+F1 Shift+F1 What's This? ヒント Ctrl+Alt+N Ctrl+Alt+N Add Tab タブを追加 Ctrl+Alt+Right Ctrl+Alt+右矢印 Next Tab 次のタブ Ctrl+Alt+Left Ctrl+Alt+左矢印 Previous Tab 前のタブ Ctrl+Alt+Q Ctrl+Alt+Q Close Tab タブを閉じる F1 F1 Qt Assistant Manual Qt Assistant マニュアル Ctrl+Alt+S Ctrl+Alt+S Save Page As... 名前をつけてページを保存... &Window ウィンドウ(&W) Minimize 最小化 Ctrl+M Ctrl+M Open Source Edition オープンソース版 This version of Qt Assistant is part of the Qt Open Source Edition, for use in the development of Open Source applications. Qt is a comprehensive C++ framework for cross-platform application development. この Qt Assistant は Qt オープンソース版の一部であり、オープンソースのアプリケーションの開発を目的としたものです。Qt は、複数のプラットフォームに対応するアプリケーションを開発するための C++ のわかりやすいフレームワークです。 You need a commercial Qt license for development of proprietary (closed source) applications. Please see <a href="http://qt.nokia.com/company/model.html">qt.nokia.com/company/model.html</a> for an overview of Qt licensing. 著作権のある(ソースを公開しない)アプリケーションを開発するには、Qt の商用ライセンスが必要です。Qt のライセンスの概要については <a href="http://qt.nokia.com/company/model.html">qt.nokia.com/company/model.html</a> をご覧ください。 This program is licensed to you under the terms of the Qt Commercial License Agreement. For details, see the file LICENSE that came with this software distribution. このプログラムは Qt 商用版ライセンス規約の定める条件の下で、あなたにライセンスされています。詳細はこのソフトウェアとともに配布される LICENSE ファイルをご覧ください。 Sync with Table of Contents 目次の該当箇所を表示 Select the page in contents tab. 「目次」タブからそのページを選択します。 QAssistantClient Failed to start Qt Assistant. Qt Assistant の起動に失敗しました。 Qt Assistant crashed. Qt Assistant がクラッシュしました。 Error while running Qt Assistant. Qt Assistant 実行中にエラーが発生しました。 Cannot connect to Qt Assistant. Qt Assistant に接続できません。 Could not connect to Assistant: Connection refused Assistant に接続できませんでした: 接続を拒否されました Could not connect to Assistant: Host not found Assistant に接続できませんでした: ホストが見つかりませんでした Communication error 通信エラー QObject Qt Assistant by Trolltech Trolltech の Qt Assistant Qt Assistant by Nokia TabbedBrowser ... ... Add page ページを追加 Close page ページを閉じる New Tab Close Tab タブを閉じる Close Other Tabs TabbedBrowser タブブラウザ Untitled タイトルなし Previous Next Case Sensitive 大文字と小文字を区別する Whole words 完全に一致する単語だけを検索する <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Search wrapped <img src=":/trolltech/assistant/images/wrap.png">&nbsp;検索が一通り終わりました TopicChooser Choose a topic for <b>%1</b> <b>%1</b> のトピックを選択 Choose Topic トピックを選択 Select a topic from the list and click the <b>Display</b>-button to open the online help. 一覧からトピックを選択し、<b>表示</b>ボタンをクリックしてオンラインヘルプを開いてください。 &Topics トピック(&T) Displays a list of available help topics for the keyword. 指定されたキーワードの使用できるヘルプトピックの一覧を表示します。 &Display 表示(&D) Open the topic selected in the list. 一覧から選択されたトピックを開きます。 &Close 閉じる(&C) Close the Dialog. ダイアログを閉じます。 qt-assistant-qassistantclient-library-compat-version-4.6.3/translations/assistant_adp_pl.ts 777 0 0 102266 11272337263 25710 0 AssistantServer Qt Assistant Qt Assistant Failed to bind to port %1 Błąd podłączenia do portu %1 FontPanel Font Czcionka &Writing system Sys&tem pisania &Family &Rodzina &Style &Styl &Point size &Wielkość punktu FontSettingsDialog Font Settings Ustawienia czcionki Font settings for: Ustawienia czcionki Browser przeglądarki Application aplikacji Use custom settings Użyj własnych ustawień HelpDialog Open Link in Current Tab Otwórz odsyłacz w bieżącej karcie Open Link in New Window Otwórz odsyłacz w nowym oknie Open Link in New Tab Otwórz odsyłacz w nowej karcie Prepare... Przygotuj... Qt Assistant Qt Assistant Failed to load keyword index file Assistant will not work! Nie można wczytać indeksu słów kluczowych Assistant nie będzie działał! Cannot open the index file %1 Nie można otworzyć indeksu %1 Warning Ostrzeżenie Documentation file %1 does not exist! Skipping file. Plik dokumentacji %1 nie istnieje! Plik zostaje pominięty. Parse Error Błąd parsowania Documentation file %1 is not compatible! Skipping file. Plik dokumentacji %1 jest nieodpowiedni! Plik zostaje pominięty. Done Zrobione Failed to save fulltext search index Assistant will not work! Nie można zapisać indeksu dla pełnego wyszukiwania Assistant nie będzie działał! Indexing files... Indeksowanie plików... Reading dictionary... Czytanie katalogu... Full Text Search Pełne wyszukiwanie Using a wildcard within phrases is not allowed. Używanie znacznika w wyrażeniu nie jest dozwolone. The closing quotation mark is missing. Brakuje kończącego znaku cudzysłowu. Help Pomoc <b>Help</b><p>Choose the topic you want help on from the contents list, or search the index for keywords.</p> <b>Pomoc</b><p>Wybierz temat pomocy z listy dostępnych tematów bądź poszukaj słowa kluczowego w indeksie.</p> Displays help topics organized by category, index or bookmarks. Another tab inherits the full text search. Pokazuje listę tematów pomocy zorganizowaną w kategorie, indeks lub zakładki. Kolejna karta pozwala na pełne wyszukiwanie. Con&tents &Spis treści <b>Help topics organized by category.</b><p>Double-click an item to see the topics in that category. To view a topic, just double-click it.</p> <b>Tematy pomocy zorganizowane w kategorie.</b><p>Kliknij dwukrotnie na wybraną kategorię aby otworzyć listę jej tematów. Aby obejrzeć temat dwukrotnie kliknij go.</p> column 1 kolumna 1 &Index &Indeks &Look For: &Szukaj wyrażenia: Enter keyword Wprowadź słowo kluczowe <b>Enter a keyword.</b><p>The list will select an item that matches the entered string best.</p> <b>Wprowadź słowo kluczowe.</b><p>Lista wybierze temat który najbardziej odpowiada szukanemu wyrażeniu.</p> <b>List of available help topics.</b><p>Double-click on an item to open its help page. If more than one is found, you must specify which page you want.</p> <b>Lista dostępnych tematów pomocy</b><p>Kliknij dwukrotnie na wybranym temacie aby otworzyć jego treść. Jeśli temat występuje w kilku kontekstach, dodatkowo należy wybrać kontekst z listy.</p> &Bookmarks &Zakładki Displays the list of bookmarks. Pokazuje listę zakładek. Add new bookmark Dodaj nową zakładkę Add the currently displayed page as a new bookmark. Dodaj bieżącą stronę jako nową zakładkę. &New &Nowa Delete bookmark Usuń zakładkę Delete the selected bookmark. Usuń zaznaczoną zakładkę. &Delete &Usuń &Search &Szukaj Searching f&or: &Szukanie: <b>Enter search word(s).</b><p>Enter here the word(s) you are looking for. The words may contain wildcards (*). For a sequence of words quote them.</p> <b>Wprowadź wyrażenie(a) do szukania.<b><p>Wprowadź w tym okienku wyrażenia, których szukasz. Wyrażenia mogą zawierać znaczniki (*). Dla wyszukania ciągu wyrażeń umieść całość w cudzysłowie.</p> <b>Found documents</b><p>This list contains all found documents from the last search. The documents are ordered, i.e. the first document has the most matches.</p> <b>Znalezione dokumenty</b><p>Lista zawiera wszystkie znalezione dokumenty związane z ostatnim wyszukiwaniem. Dokumenty są poukładane w kolejności pod względem ilości trafień szukanego wyrażenia.</p> Found &Documents: Znalezione &dokumenty: Display the help page for the full text search. Pokaż stronę pomocy dla pełnego wyszukiwania. He&lp &Pomoc Pressing this button starts the search. Naciśnięcie tego przycisku powoduje rozpoczęcie wyszukiwania. Preparing... Przygotowywanie... %n document(s) found. Znaleziono %n dokument. Znaleziono %n dokumenty. Znaleziono %n dokumentów. Enter searchword(s) Wprowadź wyrażenie(a) do szukania Display the help page Pokaż stronę pomocy Start searching Rozpocznij wyszukiwanie HelpWindow Help Pomoc Unable to launch web browser. Nie można uruchomić przeglądarki internetowej. Failed to open link: '%1' Nie można otworzyć odsyłacza: '%1' <div align="center"><h1>The page could not be found</h1><br><h3>'%1'</h3></div> <div align="center"><h1>Strona nie została znaleziona</h1><br><h3>'%1'</h3></div> Error... Błąd... Open Link in New Window Shift+LMB Otwórz odsyłacz w nowym oknie Shift+LMB Open Link in New Tab Otwórz odsyłacz w nowej karcie OK OK Copy &Link Location Skopiuj &odsyłacz Index Untitled Nienazwany MainWindow Sidebar Panel &Window &Okno Minimize Minimalizuj Ctrl+M Ctrl+M Initializing Qt Assistant... Inicjalizowanie Qt Assistant... SHIFT+CTRL+= SHIFT+CTRL+= Ctrl+T Ctrl+T Ctrl+I Ctrl+I Ctrl+B Ctrl+B Ctrl+S Ctrl+S Ctrl+W Ctrl+W Ctrl+] Ctrl+] Ctrl+[ Ctrl+[ Views Widoki Displays the main page of a specific documentation set. Pokazuje główną stronę wybranego zestawu dokumentacji. Qt Assistant Qt Assistant Failed to open about application contents in file: '%1' Nie można otworzyć pliku: '%1' z informacjami o aplikacji ... ... Save Page Zapisz stronę Cannot open file for writing! Nie można otworzyć pliku do zapisu! Qt Assistant by Nokia Qt Assistant Nokii Toolbar Pasek główny Go Pasek z odsyłaczami &Help &Pomoc &File &Plik Boo&kmarks &Zakładki &Go &Nawigacja &View &Widok &Edit &Edycja &Print... Wy&drukuj... Print the currently displayed page. Wydrukuj bieżącą stronę. Ctrl+P Ctrl+P E&xit &Zakończ Quit Qt Assistant. Zakończ Qt Assistant. Ctrl+Q Ctrl+Q &Copy S&kopiuj Copy the selected text to the clipboard. Skopiuj wybrany tekst do schowka. Ctrl+C Ctrl+C &Find in Text... &Znajdź w tekście... Open the Find dialog. Qt Assistant will search the currently displayed page for the text you enter. Otwórz okno szukania. Qt Assistant będzie przeszukiwał bieżącą stronę dla podanego tekstu. Ctrl+F Ctrl+F Find &Next Znajdź &następne F3 F3 Find &Previous Znajdź &poprzednie Shift+F3 Shift+F3 &Home Strona &startowa Go to the home page. Qt Assistant's home page is the Qt Reference Documentation. Przejdź do strony startowej. Strona startowa Qt Assistant jest główną stroną dokumentacji Qt. Ctrl+Home Ctrl+Home &Previous &Poprzednia strona Go to the previous page. Przejdź do poprzedniej strony. Alt+Left Alt+Left &Next &Następna strona Go to the next page. Przejdź do następnej strony. Alt+Right Alt+Right About Qt Assistant Informacje o Qt Assistant Display further information about Qt Assistant. Pokaż dalsze informacje o Qt Assistant. About Qt Informacje o Qt Zoom &in Po&większ Zoom in on the document, i.e. increase the font size. Powiększ rozmiar czcionek w dokumencie. Ctrl++ Ctrl++ Zoom &out Po&mniejsz Zoom out on the document, i.e. decrease the font size. Pomniejsz rozmiar czcionek w dokumencie. Ctrl+- Ctrl+- New Window Nowe okno Open a new window. Otwórz nowe okno. Ctrl+N Ctrl+N &Close Za&mknij Close the current window. Zamknij bieżące okno. &Add Bookmark &Dodaj zakładkę Add the currently displayed page as a new bookmark. Dodaj bieżącą stronę jako nową zakładkę. What's This? Co to jest? "What's This?" context sensitive help. "Co to jest?" jest pomocą kontekstową. Shift+F1 Shift+F1 Add Tab Dodaj kartę Ctrl+Alt+N Ctrl+Alt+N Next Tab Następna karta Ctrl+Alt+Right Ctrl+Alt+Right Previous Tab Poprzednia karta Ctrl+Alt+Left Ctrl+Alt+Left Close Tab Zamknij kartę Ctrl+Alt+Q Ctrl+Alt+Q Qt Assistant Manual Podręcznik Qt Assistant F1 F1 Save Page As... Zapisz stronę jako... Ctrl+Alt+S Ctrl+Alt+S Sync with Table of Contents Znajdź bieżącą stronę w spisie treści Select the page in contents tab. Wybierz stronę w karcie ze spisem treści. Font Settings... Ustawienia czcionki... QObject Qt Assistant by Nokia Qt Assistant Nokii TabbedBrowser ... ... Add page Dodaj kartę Close page Zamknij kartę TabbedBrowser Przeglądarka z kartami Untitled Nienazwany Previous Poprzedni Next Następny Case Sensitive Uwzględniaj wielkość liter Whole words Wszystkie wyrazy <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Search wrapped <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Szukanie od początku New Tab Nowa karta Close Tab Zamknij kartę Close Other Tabs Zamknij pozostałe karty TopicChooser Choose a topic for <b>%1</b> Wybierz temat dla <b>%1</b> Choose Topic Wybierz temat Select a topic from the list and click the <b>Display</b>-button to open the online help. Wybierz temat z listy i kliknij przycisk <b>Pokaż</b> aby otworzyć pomoc (online). &Topics &Tematy Displays a list of available help topics for the keyword. Pokazuje listę dostępnych tematów pomocy dla szukanego wyrażenia. &Display Pok&aż Open the topic selected in the list. Otwórz wybrany na liście temat. &Close Za&mknij Close the Dialog. Zamknij okno. qt-assistant-qassistantclient-library-compat-version-4.6.3/translations/assistant_adp_ru.ts 777 0 0 115061 11343713702 25713 0 AssistantServer Failed to bind to port %1 Не удалось открыть порт %1 Qt Assistant Qt Assistant FontPanel &Family &Шрифт &Style &Начертание Font Шрифт &Writing system Система &письма &Point size &Размер FontSettingsDialog Application Приложение Browser Обозреватель Font settings for: Настройки шрифта для: Use custom settings Использование индивидуальных настроек Font Settings Настройки шрифта HelpDialog &Index &Указатель &Look For: &Искать: &New &Новая &Search &Поиск <b>Enter a keyword.</b><p>The list will select an item that matches the entered string best.</p> <b>Указание ключевого слова.</b><p>Список заполняется элементами, лучше соответствующими указанному ключевому слову.</p> <b>Enter search word(s).</b><p>Enter here the word(s) you are looking for. The words may contain wildcards (*). For a sequence of words quote them.</p> <b>Указание слов для поиска.</b><p>Введите одно или несколько слов, по которым требуется осуществить поиск. Слова могут содержкать символы-заменители (*). Если требуется найти сочетание слов, заключите искомую фразу в кавычки.</p> <b>Found documents</b><p>This list contains all found documents from the last search. The documents are ordered, i.e. the first document has the most matches.</p> <b>Найденные документы</b><p>В данном списке представлены все найденные при последнем поиске документы. Документы упорядочены по релевантности, т.е. чем выше в списке, тем чаще в нём встречаются искомые слова.</p> <b>Help topics organized by category.</b><p>Double-click an item to see the topics in that category. To view a topic, just double-click it.</p> <b>Разделы справки, распределённые по категориям.</b><p>Дважды щёлкните по одному из пунктов для отображения разделов в данной категории. Для открытия раздела дважды щёлкните по нему.</p> <b>Help</b><p>Choose the topic you want help on from the contents list, or search the index for keywords.</p> <b>Справка</b><p>Выберите раздел справки из оглавления или воспользуйтесь поиском по предметному указателю.</p> <b>List of available help topics.</b><p>Double-click on an item to open its help page. If more than one is found, you must specify which page you want.</p> <b>Список доступных разделов справки.</b><p>Дважды щёлкните по одному из пунктов для открытия страницы справки. Если найдено более одной страницы, выберите желаемую.</p> Add new bookmark Добавить закладку Add the currently displayed page as a new bookmark. Добавить отображаемую страницу в закладки. Cannot open the index file %1 Не удаётся открыть файл индекса %1 Con&tents &Оглавление Delete bookmark Удалить закладку Delete the selected bookmark. Удалить выбранную закладку. Enter searchword(s) Введите одно или несколько слов для поиска Display the help page Показать страницу справки Display the help page for the full text search. Показать справку по полнотекстовому поиску. Start searching Начать поиск Displays help topics organized by category, index or bookmarks. Another tab inherits the full text search. Отображает список разделов, распредёленных по категориям, указатель или закладки. Последняя вкладка содержит панель полнотекстового поиска. Displays the list of bookmarks. Отображает список закладок. Documentation file %1 does not exist! Skipping file. Файл документации %1 не существует! Пропущен. Documentation file %1 is not compatible! Skipping file. Несовместимый файл документации %1! Пропущен. Done Готово Enter keyword Введите ключевое слово Failed to load keyword index file Assistant will not work! Не удалось загрузить файл индекса ключевых слов Qt Assistant не будет работать! Failed to save fulltext search index Assistant will not work! Не удалось сохранить индекс полнотекстового поиска Qt Assistant не будет работать! Found &Documents: Найденные &документы: Full Text Search Полнотекстовый поиск He&lp &Справка Help Справка Indexing files... Индексирование файлов... Open Link in New Tab Открыть ссылку в новой вкладке Open Link in New Window Открыть ссылку в новом окне Parse Error Ошибка обработки Prepare... Подготовка... Preparing... Подготовка... Pressing this button starts the search. Нажатие на эту кнопку запустит процесс поиска. Qt Assistant Qt Assistant Reading dictionary... Чтение каталога... Searching f&or: &Искать: The closing quotation mark is missing. Пропущена закрывающая кавычка. Using a wildcard within phrases is not allowed. Использование символов-заменителей внутри фраз недопустимо. Warning Предупреждение column 1 столбец 1 Open Link in Current Tab Открыть ссылку в текущей вкладке %n document(s) found. Найден %n документ. Найдено %n документа. Найдено %n документов. &Bookmarks &Закладки &Delete &Удалить HelpWindow <div align="center"><h1>The page could not be found</h1><br><h3>'%1'</h3></div> <div align="center"><h1>Страница не найдена</h1><br><h3>'%1'</h3></div> Copy &Link Location Копировать &адрес ссылки Error... Ошибка... Failed to open link: '%1' Не удалось открыть ссылку: '%1' Help Справка OK Закрыть Open Link in New Tab Открыть ссылку в новой вкладке Open Link in New Window Shift+LMB Открыть ссылку в новом окне Shift+LMB Unable to launch web browser. Невозможно запустить вэб-браузер. Index Untitled Неозаглавлено MainWindow "What's This?" context sensitive help. Контекстная справка "Что это?". &Add Bookmark &Добавить закладку &Close &Закрыть &Copy &Копировать &Edit &Правка &File &Файл &Find in Text... П&оиск по тексту... &Go &Перейти &Help &Справка &Home &Домой &Next Сл&едующий &Previous &Предыдущий &Print... &Печать... &View &Вид &Window &Окно ... ... About Qt О Qt About Qt Assistant О Qt Assistant Add Tab Добавить вкладку Add the currently displayed page as a new bookmark. Добавить отображаемую страницу в закладки. Boo&kmarks &Закладки Cannot open file for writing! Не удалось открыть файл для записи! Close Tab Закрыть вкладку Close the current window. Закрыть текущее окно. Display further information about Qt Assistant. Показать дополнительную информацию о Qt Assistant. Displays the main page of a specific documentation set. Открывает стартовую страницу выбранного набора документации. E&xit В&ыход Failed to open about application contents in file: '%1' Не удалось получить информацию о приложении из файла: '%1' Find &Next Найти &следующее Find &Previous Найти &предыдущее Font Settings... Настройки шрифта... Go Перейти Go to the home page. Qt Assistant's home page is the Qt Reference Documentation. Перейти на домашнюю страницу. Домашная страница Qt Assistant - Справочная документация по Qt. Go to the next page. Переход на следующую страницу. Initializing Qt Assistant... Инициализация Qt Assistant... Minimize Свернуть New Window Новое окно Next Tab Следующая вкладка Open a new window. Открыть новое окно. Open the Find dialog. Qt Assistant will search the currently displayed page for the text you enter. Открыть окно поиска. Qt Assistant произведёт поиск введённого текста на отображаемой странице. Previous Tab Предыдущая вкладка Print the currently displayed page. Печатать отображаемую страницу. Qt Assistant Qt Assistant Qt Assistant Manual Руководство по Qt Assistant Qt Assistant by Nokia Qt Assistant от Nokia Quit Qt Assistant. Выйти из Qt Assistant. Save Page Сохранить страницу Save Page As... Сохранить страницу как... Select the page in contents tab. Выбрать страницу во вкладке оглавления. Sidebar Боковая панель Sync with Table of Contents Синхронизировать с оглавлением Toolbar Панель инструментов Views Виды What's This? Что это? Zoom &in У&величить Zoom &out У&меньшить Zoom in on the document, i.e. increase the font size. Увеличить размер шрифта. Zoom out on the document, i.e. decrease the font size. Уменьшить размер шрифта. Ctrl+M SHIFT+CTRL+= Ctrl+T Ctrl+I Ctrl+B Ctrl+S Ctrl+] Ctrl+[ Ctrl+P Ctrl+Q Copy the selected text to the clipboard. Скопировать выделенный текст в буфер обмена. Ctrl+C Ctrl+F F3 Shift+F3 Ctrl+Home Go to the previous page. Переход на предыдущую страницу. Alt+Left Alt+Right Ctrl++ Ctrl+- Ctrl+N Ctrl+W Shift+F1 Ctrl+Alt+N Ctrl+Alt+Right Ctrl+Alt+Left Ctrl+Alt+Q F1 Ctrl+Alt+S QObject Qt Assistant by Nokia Qt Assistant от Nokia TabbedBrowser ... ... <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Search wrapped <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Поиск с начала Add page Добавить вкладку Case Sensitive Учитывать регистр Close Other Tabs Закрыть остальные вкладки Close Tab Закрыть вкладку Close page Закрыть вкладку New Tab Новая вкладка Next Следующее Previous Предыдущее Untitled Безымянный Whole words Слова целиком TabbedBrowser TabbedBrowser TopicChooser &Close &Закрыть &Display &Показать &Topics &Разделы Choose Topic Выбор раздела Choose a topic for <b>%1</b> Выберите раздел для <b>%1</b> Close the Dialog. Закрыть диалог. Displays a list of available help topics for the keyword. Показывает список доступных разделов справки, найденных по ключевому слову. Open the topic selected in the list. Открыть выбранный раздел. Select a topic from the list and click the <b>Display</b>-button to open the online help. Выберите раздел из списка и нажмите на кнопку <b>Показать</b> для открытия онлайн справки. qt-assistant-qassistantclient-library-compat-version-4.6.3/translations/assistant_adp_zh_CN.ts 777 0 0 105102 11244537332 26264 0 AssistantServer Qt Assistant Qt 助手 Failed to bind to port %1 绑定到端口%1失败 FontPanel Font 字体 &Writing system 书写系统(&W) &Family 字体族(&F) &Style 风格(&S) &Point size 点大小(&P) FontSettingsDialog Font Settings 字体设置 Font settings for: 字体设置用于: Browser 浏览器 Application 应用程序 Use custom settings 使用自定义设置 HelpDialog Open Link in Current Tab 在当前标签页打开链接 Open Link in New Window 在新窗口中打开链接 Open Link in New Tab 在新标签页中打开链接 Prepare... 准备... Qt Assistant Qt 助手 Failed to load keyword index file Assistant will not work! 加载关键词索引文件失败 Qt 助手将不能工作! Cannot open the index file %1 无法打开索引文件 %1 Warning 警告 Documentation file %1 does not exist! Skipping file. 文档文件 %1 不存在! 跳过文件。 Parse Error 解析错误 Documentation file %1 is not compatible! Skipping file. %1 文档文件不兼容! 跳过文件! Done 完成 Failed to save fulltext search index Assistant will not work! 保存全文搜索索引失败 Qt 助手将不能工作! Indexing files... 正在索引文件... Reading dictionary... 正在读取词典... Full Text Search 全文搜索 Using a wildcard within phrases is not allowed. 不允许在短语中使用通配符。 The closing quotation mark is missing. 缺少关闭标点。 Help 帮助 <b>Help</b><p>Choose the topic you want help on from the contents list, or search the index for keywords.</p> <b>帮助</b><p>在内容列表中选择您需要帮助的主题,或者在索引中搜索这个关键词。</p> Displays help topics organized by category, index or bookmarks. Another tab inherits the full text search. 按种类、索引和标签显示帮助主题。另一个标签页中可以执行全文搜索。 Con&tents 内容(&T) <b>Help topics organized by category.</b><p>Double-click an item to see the topics in that category. To view a topic, just double-click it.</p> <b>按种类组织帮助主题。</b><p>双击一项可以查看那个种类中的主题。要查看一个主题,只要双击它就可以了。</p> column 1 列 1 &Index 索引(&I) &Look For: 查找(&L): Enter keyword 输入关键词 <b>Enter a keyword.</b><p>The list will select an item that matches the entered string best.</p> <b>输入一个关键词。</b><p>这个列表将会选择一个和已输入字符串最匹配的一项。</p> <b>List of available help topics.</b><p>Double-click on an item to open its help page. If more than one is found, you must specify which page you want.</p> <b>可用的帮助主题列表。</b><p>双击一项打开它的帮助页面。如果找到一个以上的结果,你必须指定你想要打开哪一个。</p> &Bookmarks 书签(&B) Displays the list of bookmarks. 显示书签列表。 Add new bookmark 添加新书签 Add the currently displayed page as a new bookmark. 把当前显示的页面添加为一个新书签。 &New 新建(&N) Delete bookmark 删除书签 Delete the selected bookmark. 删除被选中的书签。 &Delete 删除(&D) &Search 搜索(&S) Searching f&or: 正在搜索(&O): Enter searchword(s). 输入搜索词。 <b>Enter search word(s).</b><p>Enter here the word(s) you are looking for. The words may contain wildcards (*). For a sequence of words quote them.</p> <b>输入搜索词。<b><p>在这里输入您要查找的词。这个词可以包含通配符(*)。如果是一个词的序列,请把它们放在英文引号内。</p> <b>Found documents</b><p>This list contains all found documents from the last search. The documents are ordered, i.e. the first document has the most matches.</p> <b>发现文档</b><p>这个列表包含上此搜索发现的所有文档。这些文档已经排序,例如,第一个文档最为匹配。</p> Found &Documents: 找到的文档(&D): Display the help page. 显示帮助页面。 Display the help page for the full text search. 显示全文文本搜索的帮助页面。 He&lp 帮助(&L) Start searching. 开始搜索。 Pressing this button starts the search. 点击这个按钮开始搜索。 Preparing... 正在准备... %n document(s) found. %n 个文档已经找到。 HelpWindow Help 帮助 Unable to launch web browser. 不能启动网页浏览器。 Failed to open link: '%1' 打开链接失败:“%1” <div align="center"><h1>The page could not be found</h1><br><h3>'%1'</h3></div> <div align="center"><h1>没有找到这个页面</h1><br><h3>“%1”</h3></div> Error... 错误... Open Link in New Window Shift+LMB 在新窗口中打开链接 Shift+LMB Open Link in New Tab 在新标签页中打开链接 OK 确定 Copy &Link Location 复制链接地址(&L) Index Untitled 未命名的 MainWindow Sidebar 侧栏 &Window 窗口(&W) Minimize 最小化 Ctrl+M Ctrl+M Initializing Qt Assistant... 正在初始化 Qt 助手... SHIFT+CTRL+= SHIFT+CTRL+= Ctrl+T Ctrl+T Ctrl+I Ctrl+I Ctrl+B Ctrl+B Ctrl+S Ctrl+S Ctrl+W Ctrl+W Ctrl+] Ctrl+] Ctrl+[ Ctrl+[ Views 视图 Displays the main page of a specific documentation set. 显示一个指定文档集的主页面。 Open Source Edition 开源版本 This version of Qt Assistant is part of the Qt Open Source Edition, for use in the development of Open Source applications. Qt is a comprehensive C++ framework for cross-platform application development. 这个版本的 Qt 助手是 Qt 开源版本的一部分,用于开发开源应用程序。Qt 是一个用于跨平台应用程序开发的综合 C++ 框架。 This program is licensed to you under the terms of the Qt Commercial License Agreement. For details, see the file LICENSE that came with this software distribution. 我们已经允许您在 Qt 商业许可协议下使用本程序。有关细节,请阅读本软件发行中所带的 LICENSE 文件。 Qt Assistant Qt 助手 Failed to open about application contents in file: '%1' 在“%1”文件中打开应用程序内容失败 ... ... Save Page 保存页面 Cannot open file for writing! 不能写打开文件! Qt Assistant by Trolltech Trolltech 的 Qt 助手 Qt Assistant by Nokia Qt助手 - Nokia Toolbar 工具栏 Go 前往 &Help 帮助(&H) &File 文件(&F) Boo&kmarks 书签(&K) &Go 前往(&G) &View 查看(&V) &Edit 编辑(&E) &Print... 打印(&P)... Print the currently displayed page. 打印当前显示页面。 Ctrl+P Ctrl+P E&xit 退出(&X) Quit Qt Assistant. 退出 Qt 助手。 Ctrl+Q Ctrl+Q &Copy 复制(&C) Copy the selected text to the clipboard. 复制选中的文本到剪贴板。 Ctrl+C Ctrl+C &Find in Text... 在文本中查找(&F)... Open the Find dialog. Qt Assistant will search the currently displayed page for the text you enter. 打开查找对话框。Qt 助手将会在当前显示页面中搜索您输入的文本。 Ctrl+F Ctrl+F Find &Next 查找下一个(&N) F3 F3 Find &Previous 查找上一个(&P) Shift+F3 Shift+F3 &Home 主页(&H) Go to the home page. Qt Assistant's home page is the Qt Reference Documentation. 前往主页。Qt 助手的主页就是 Qt 参考文档。 Ctrl+Home Ctrl+Home &Previous 上一页(&P) Go to the previous page. 前往上一页。 Alt+Left Alt+Left &Next 下一页(&N) Go to the next page. 前往下一页。 Alt+Right Alt+Right About Qt Assistant 关于 Qt 助手 Display further information about Qt Assistant. 显示有关 Qt 助手的更多信息。 About Qt 关于 Qt Zoom &in 放大(&I) Zoom in on the document, i.e. increase the font size. 放大文档,也就是增大字体大小。 Ctrl++ Ctrl++ Zoom &out 缩小(&O) Zoom out on the document, i.e. decrease the font size. 缩小文档,也就是减小字体大小。 Ctrl+- Ctrl+- New Window 新建窗口 Open a new window. 打开一个新窗口。 Ctrl+N Ctrl+N &Close 关闭(&C) Close the current window. 关闭当前窗口。 &Add Bookmark 添加书签(&A) Add the currently displayed page as a new bookmark. 把当前显示页面添加为一个新书签。 What's This? 这是什么? "What's This?" context sensitive help. “这是什么?”上下文敏感帮助。 Shift+F1 Shift+F1 Add Tab 添加标签页 Ctrl+Alt+N Ctrl+Alt+N Next Tab 下一个标签页 Ctrl+Alt+Right Ctrl+Alt+Right Previous Tab 前一个标签页 Ctrl+Alt+Left Ctrl+Alt+Left Close Tab 关闭标签页 Ctrl+Alt+Q Ctrl+Alt+Q Qt Assistant Manual Qt 助手手册 F1 F1 Save Page As... 页面另存为... Ctrl+Alt+S Ctrl+Alt+S Sync with Table of Contents 同步目录 Select the page in contents tab. 选择内容标签页中的页面。 Font Settings... 字体设置... You need a commercial Qt license for development of proprietary (closed source) applications. Please see <a href="http://qt.nokia.com/company/model">qt.nokia.com/company/model</a> for an overview of Qt licensing. 开发商业(闭源)应用程序,你需要商业 Qt 许可。对于 Qt 许可的概览,请参考<a href="http://qt.nokia.com/company/model">qt.nokia.com/company/model</a>。 This program is licensed to you under the terms of the Qt %1 License Agreement. For details, see the license file that came with this software distribution. 我们已经允许您在 Qt %1 许可协议下使用本程序。有关细节,请阅读本软件发行中所带的许可协议文件。 QObject Qt Assistant by Trolltech Trolltech 的 Qt 助手 Qt Assistant by Nokia Qt助手 - Nokia TabbedBrowser ... ... Add page 添加页面 Close page 关闭页面 TabbedBrowser 标签页浏览器 Untitled 未命名的 Previous 上一个 Next 下一个 Case Sensitive 区分大小写 Whole words 整词 <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Search wrapped <img src=":/trolltech/assistant/images/wrap.png">&nbsp;搜索已经回环 New Tab 新标签页 Close Tab 关闭标签页 Close Other Tabs 关闭其它标签页 TopicChooser Choose a topic for <b>%1</b> 为<b>%1</b>选择一个主题 Choose Topic 选择主题 Select a topic from the list and click the <b>Display</b>-button to open the online help. 从列表中选择一个主题并且点击<b>显示</b>按钮打开在线帮助。 &Topics 主题(&T) Displays a list of available help topics for the keyword. 为这个关键词显示一个可用帮助主题的列表。 &Display 显示(&D) Open the topic selected in the list. 打开列表中选中的主题。 &Close 关闭(&C) Close the Dialog. 关闭对话框。 qt-assistant-qassistantclient-library-compat-version-4.6.3/translations/assistant_adp_zh_TW.ts 777 0 0 105066 11244537332 26327 0 AssistantServer Qt Assistant Qt 小幫手 Failed to bind to port %1 無法結合連接埠 %1 FontPanel Font 字型 &Writing system 寫入系統(&W) &Family 家族(&F) &Style 風格(&S) &Point size 點大小(&P) FontSettingsDialog Font Settings 字型設定 Font settings for: 字型設定用於: Browser 瀏覽器 Application 應用程式 Use custom settings 使用者自訂設定 HelpDialog Con&tents 內容(&T) Qt Assistant Qt 小幫手 Open Link in Current Tab 在目前的分頁開啟連結 Open Link in New Window 在新視窗開啟連結 Open Link in New Tab 在新分頁開啟連結 Prepare... 準備中... Failed to load keyword index file Assistant will not work! 無法載入關鍵字索引檔 小幫手將無法運作! Cannot open the index file %1 無法開啟索引檔 %1 Warning 警告 Documentation file %1 does not exist! Skipping file. 文件檔 %1 不存在 將跳過此檔案。 Parse Error 剖析錯誤 Documentation file %1 is not compatible! Skipping file. 文件檔 %1 不相容 將跳過此檔案。 Done 完成 Failed to save fulltext search index Assistant will not work! 無法儲存全文檢索搜尋索引。 小幫手將無法運作! Indexing files... 建立檔案索引中... Reading dictionary... 讀取字典中... Full Text Search 全文檢索 Using a wildcard within phrases is not allowed. 在片語中不能使用萬用字元。 The closing quotation mark is missing. 沒有關閉引號。 Help 說明 <b>Help</b><p>Choose the topic you want help on from the contents list, or search the index for keywords.</p> <b>說明</b><p>請從內容清單中選擇您需要說明的主題,或是在索引中搜尋關鍵字。</p> Displays help topics organized by category, index or bookmarks. Another tab inherits the full text search. 依分類、索引或書籤來顯示說明主題。另一個分頁會繼承此全文檢索。 <b>Help topics organized by category.</b><p>Double-click an item to see the topics in that category. To view a topic, just double-click it.</p> <b>依類別組織說明主題。</b><p>雙擊可以查看該類別中有哪些主題。雙擊該主題可以查看內容。</p> column 1 欄 1 &Index 索引(&I) &Look For: 搜尋(&L): Enter keyword 輸入關鍵字 <b>Enter a keyword.</b><p>The list will select an item that matches the entered string best.</p> <b>輸入關鍵字。</b><p>此清單可以選擇最能符合輸入字串的項目。</p> <b>List of available help topics.</b><p>Double-click on an item to open its help page. If more than one is found, you must specify which page you want.</p> <b>可用說明主題清單。</b><p>雙擊可以開啟該說明頁面。如果找到一個以上,您必須指定您要看哪一個頁面。</p> &Bookmarks 書籤(&B) Displays the list of bookmarks. 顯示書籤的清單。 Add new bookmark 新增書籤 Add the currently displayed page as a new bookmark. 將目前顯示的頁面新增到書籤中。 &New 新增(&N) Delete bookmark 刪除書籤 Delete the selected bookmark. 刪除選取的書籤。 &Delete 刪除(&D) &Search 搜尋(&S) Searching f&or: 搜尋內容(&O): Enter searchword(s). 請輸入搜尋關鍵字詞。 <b>Enter search word(s).</b><p>Enter here the word(s) you are looking for. The words may contain wildcards (*). For a sequence of words quote them.</p> <b>輸入搜尋關鍵字詞。</b><p>在此輸入您要搜尋的關鍵字詞。可以使用萬用字元 (*)。如果是一個片語,請用引號括起來。</p> <b>Found documents</b><p>This list contains all found documents from the last search. The documents are ordered, i.e. the first document has the most matches.</p> <b>找到的文件</b><p>這放清單包含了所有上次搜尋找到的文件。文件會依符合程度排序。</p> Found &Documents: 找到的文件(&D): Display the help page. 顯示說明頁面。 Display the help page for the full text search. 顯示全文檢索的說明頁面。 He&lp 說明(&L) Start searching. 開始搜尋。 Pressing this button starts the search. 按下此按鍵開始搜尋。 Preparing... 準備中... %n document(s) found. 找到 %n 個文件。 HelpWindow Help 說明 Open Link in New Window Shift+LMB 在新視窗開啟連結 Shift+滑鼠左鍵 Unable to launch web browser. 無法啟動瀏覽器。 OK 確定 Failed to open link: '%1' 無法開啟連結:%1 <div align="center"><h1>The page could not be found</h1><br><h3>'%1'</h3></div> <div align="center"><h1>找不到該頁面</h1><br><h3>%1</h3></div> Error... 錯誤... Open Link in New Tab 在新分頁開啟連結 Copy &Link Location 複製連結位置(&L) Index Untitled 未命名 MainWindow Qt Assistant by Trolltech Qt 小幫手,Trolltech 公司提供 Toolbar 工具列 &Print... 列印(&P)... E&xit 離開(&X) &Copy 複製(&C) &Find in Text... 在文字中尋找(&F)... &Home 首頁(&H) &Previous 前一個(&P) &Next 下一個(&N) About Qt 關於 Qt Zoom &in 放大(&I) Zoom &out 縮小(&O) New Window 新視窗 Ctrl+T Ctrl+T Ctrl+I Ctrl+I Ctrl+B Ctrl+B Qt Assistant Qt 小幫手 &Add Bookmark 新增書籤(&A) Sidebar 邊列 &Window 視窗(&W) Minimize 最小化 Ctrl+M Ctrl+M Initializing Qt Assistant... 初始化 Qt 小幫手中... SHIFT+CTRL+= SHIFT+CTRL+= Ctrl+S Ctrl+S Ctrl+W Ctrl+W Ctrl+] Ctrl+] Ctrl+[ Ctrl+[ Views 檢視 Displays the main page of a specific documentation set. 顯示指定文件集的主頁面。 Open Source Edition 開放源碼版本 This version of Qt Assistant is part of the Qt Open Source Edition, for use in the development of Open Source applications. Qt is a comprehensive C++ framework for cross-platform application development. 此版本的 Qt 小幫手是 Qt 開放源碼版本的一部份,只能用於開發開放源碼的應用程式。Qt 為一個跨平台的,強大的 C++ 應用程式開發框架。 This program is licensed to you under the terms of the Qt Commercial License Agreement. For details, see the file LICENSE that came with this software distribution. 此程式以 Qt 商業授權同意書(Qt Commerical License Agreement)授權給您。詳情請參照 LICENSE 檔。 Failed to open about application contents in file: '%1' 無法開啟檔案中應用程式的「關於」內容:%1 ... ... Save Page 儲存頁面 Cannot open file for writing! 無法開啟檔案以寫入! Qt Assistant by Nokia Nokia 提供的 Qt 小幫手 Go &Help 說明(&H) &File 檔案(&F) Boo&kmarks 書籤(&K) &Go 走(&G) &View 檢視(&V) &Edit 編輯(&E) Print the currently displayed page. 列印目前顯示的頁面。 Ctrl+P Ctrl+P Quit Qt Assistant. 離開 Qt 小幫手。 Ctrl+Q Ctrl+Q Copy the selected text to the clipboard. 複製選取的文字到剪貼簿中。 Ctrl+C Ctrl+C Open the Find dialog. Qt Assistant will search the currently displayed page for the text you enter. 開啟「尋找」對話框。Qt 小幫手會在目前顯示的頁面中搜尋您所輸入的文字。 Ctrl+F Ctrl+F Find &Next 尋找下一筆(&N) F3 F3 Find &Previous 尋找上一筆(&P) Shift+F3 Shift+F3 Go to the home page. Qt Assistant's home page is the Qt Reference Documentation. 回到首頁。Qt 小幫手的首頁為 Qt 參考文件。 Ctrl+Home Ctrl+Home Go to the previous page. 跳到上一頁。 Alt+Left Alt+Left Go to the next page. 跳到下一頁。 Alt+Right Alt+Right About Qt Assistant 關於 Qt 小幫手 Display further information about Qt Assistant. 顯示關於 Qt 小幫手的詳情。 Zoom in on the document, i.e. increase the font size. 放大文件,也就是加大字型。 Ctrl++ Ctrl++ Zoom out on the document, i.e. decrease the font size. 縮小文件,也就是縮小字型。 Ctrl+- Ctrl+- Open a new window. 開啟新視窗。 Ctrl+N Ctrl+N &Close 關閉(&C) Close the current window. 關閉目前的視窗。 Add the currently displayed page as a new bookmark. 將目前顯示的頁面新增到書籤中。 What's This? 這是什麼? "What's This?" context sensitive help. 「這是什麼?」內文說明。 Shift+F1 Shift+F1 Add Tab 新增分頁 Ctrl+Alt+N Ctrl+Alt+N Next Tab 下一個分頁 Ctrl+Alt+Right Ctrl+Alt+Right Previous Tab 前一個分頁 Ctrl+Alt+Left Ctrl+Alt+Left Close Tab 關閉分頁 Ctrl+Alt+Q Ctrl+Alt+Q Qt Assistant Manual Qt 小幫手手冊 F1 F1 Save Page As... 另存頁面為... Ctrl+Alt+S Ctrl+Alt+S Sync with Table of Contents 與目錄同步 Select the page in contents tab. 選擇在內容分頁中的頁面。 Font Settings... 字型設定... You need a commercial Qt license for development of proprietary (closed source) applications. Please see <a href="http://qt.nokia.com/company/model">qt.nokia.com/company/model</a> for an overview of Qt licensing. 您需要商業版的 Qt 授權才能發展私有(封閉)應用程式軟體。關於 Qt 授權的概要,請參考 <a href="http://qt.nokia.com/company/model">qt.nokia.com/company/model</a>。 This program is licensed to you under the terms of the Qt %1 License Agreement. For details, see the license file that came with this software distribution. 此程式以 Qt %1 授權同意書授權給您。詳情請參照套件中的授權檔。 QObject Qt Assistant by Trolltech Qt 小幫手,Trolltech 公司提供 Qt Assistant by Nokia Nokia 提供的 Qt 小幫手 TabbedBrowser ... ... Add page 新增頁面 Close page 關閉頁面 New Tab 新增分頁 Close Tab 關閉分頁 Close Other Tabs 關閉其他分頁 TabbedBrowser 分頁式瀏覽器 Untitled 未命名 Previous 前一個 Next 下一個 Case Sensitive 區分大小寫 Whole words 整個字詞 <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Search wrapped <img src=":/trolltech/assistant/images/wrap.png">&nbsp;搜尋已折回 TopicChooser Choose a topic for <b>%1</b> 請為 <b>%1</b> 選擇一個主題 Choose Topic 選擇主題 Select a topic from the list and click the <b>Display</b>-button to open the online help. 請從清單中選取一個主題,並按下「顯示」鍵開啟線上說明。 &Topics 主題(&T) Displays a list of available help topics for the keyword. 顯示此關鍵字可用的說明主題。 &Display 顯示(&D) Open the topic selected in the list. 開啟在清單中選取的主題。 &Close 關閉(&C) Close the Dialog. 關閉對話框。