Files
cuberite-2a/source/tolua++.exe
T

5047 lines
188 KiB
Plaintext
Raw Normal View History

2011-10-03 18:41:19 +00:00
MZÿÿ¸@躴 Í!¸LÍ!This program cannot be run in DOS mode.
$mÐdú)±
©)±
©)±
©FÇ¡©3±
©FÇ”©:±
© É™©+±
©wq©*±
©)± ©U±
©FÇ ©C±
©FÇ—©(±
©Rich)±
©PEL©Mà 
Æ$Ô>à@P[@d
< ´0
â°@àÀ.textªÅÆ `.rdataì3à4Ê@@.data Üþ@À.rsrc´ Ú@@.relocÒ0Ü@Bh â@è&"ƒÀ@Pè!ƒÄÃÌÌÌÌÌÌÌÌÌU‹ìPVèæ‹M QVèÜ‹URVè̃Ä]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌU‹ìWhÜæ@hîØÿÿVèÄjÿVè¶x‹EPVè—WjþVèšjþV范Ä0_]ÃPhðæ@è•!ƒÀ@Pè€ ƒÄ h â@è!ƒÀ@Pèj ƒÄjè¤%ÌÌÌÌÌÌÌÌÌÌÌÌU‹ìSVèr‹ðVèdhÌæ@Vè#hhç@hîØÿÿVèCh`ç@hLç@hîØÿÿVè(»ƒÄ,9]uh â@è!ƒÀ@PèìƒÄ^3À[]ÃWjjVèîhÜæ@hîØÿÿVèäjjVèÔjÿVèÆhDç@hîØÿÿVèÂV誃Ä<‹ø9]ŽY‹E ˜€9-…,¾IƒÁσùE¶‰H@ÿ$@h@ç@é§h<ç@éT˜CRW¸8ç@è<þÿÿƒÄ韋D˜CPW¸4ç@è#þÿÿƒÄ醋L˜CQW¸0ç@è
þÿÿƒÄëph,ç@ëNh(ç@ëG‹T˜CRW¸$ç@èæýÿÿƒÄëLh ç@ë*hç@ë#hç@ë‹D˜CPèñýÿÿƒÄë'hç@ëhç@Vèšhç@WV肃ÄC;]ŒýþÿÿëThÌæ@h¤æ@芃À@PèuƒÄ _^3À[]ÃèBýÿÿ_^3À[]˘èÃýÿÿh ç@V‹Ùè6SVè/WVè"ƒÄjþVè#Vè‡ƒÄ _^3À[]Ã"@M@?@T@@)@É@@F@¹@ì@Ó@¿@k@d@@Å@ 
ÌÌWVèÍhðØÿÿjÿV躃ąÀt$jþVècjjVè}jÿVèoWV范Ä$jýVè{jýVè+jþVè/ƒÄÃÌÌÌÌÌU‹ìV‹uh€ç@jýVè„jÿVèvƒÄƒøuHjjþVèdjÿVèPƒÄ…ÀtjjVè9ƒÄ ¸^]ÃjÿVè2ƒÄƒø„ƒj ƒÄ…Àtkhxç@Vè”jþVè
jVè¨jVè jÿVèìƒÄ(ƒøujjVèÎƒÄ ¸^]ÃjÿVèǃăøujýV蟃ĸ^]ÃV舃ĸ^]ÃÌÌÌU‹ìV‹uh”ç@jüVè„jÿVèvƒÄƒøuAjjþVèdjÿVèPƒÄ…Àt"jVèójVèëjjVè)ƒÄ3À^]ÃjƒÄ…ÀtWjÿVèƒÄ…ÀtHhˆç@VèŒjþVèjÿVèôƒÄƒøu%jjVèˆjVè€jjV较Ä$jVèMjýVèÃÄ3À^]ÃÌÌÌÌÌÌÌU‹ìV‹ujV虃ăø…âjVèahðØÿÿjÿVèNƒÄ…Àu#jjþVèIjÿVèYƒÄ…À….jVèÔjVèêjÿVè$ƒÄ…ÀIjþVèJjVè<ƒÄ…ÀtLh¤ç@VèŽjþVèjÿVèöƒÄƒø…¦jVèŽjVè†jjVèăĸ^]ÃjVèijþVè»jÿV譃ąÀ…‚jþVè(h€ç@jþVèjÿVèƒÄ ƒøu3jjþVèmjÿVèYƒÄ…À…jÿÿÿjÿVèLƒÄƒøt,jVèÊjÿVè"ƒÄ…ÀÿÿÿVèƒÄ¸^]ÃWjVè-8jjVèµhœç@Vè€WVè jýVèõjþVè«jþVèëjÿVè}ƒÄDjVèrjþV舃Ŀè¹ûÿÿ‹Ç_^]Ãø…yÿÿÿVèüÿÿƒÄ¸^]ÃÌÌÌÌÌÌÌÌÌU‹ìV‹ujVèyƒÄƒø…FjVèSjÿVè]ƒÄƒø…ìjVèmƒÄ…ÀtQh¬ç@Vè¿jþVè5jÿVè'ƒÄƒø…¢jVè¿jVè·jVè¯jjVèíƒÄ$3À^]Ãh”ç@VènjþVèäjÿVèփăøu*jVèrjþVèÄjÿV调ąÀufjþVè5ƒÄjþVè*jÿV肃ąÀu VèiƒÄjþV覃ÄjÿVèqƒÄƒøÿÿÿWjVèêƒÄ¿èWúÿÿ_3À^]ÃjVèíjVèåjjVè#ƒÄ3À^]Ãøu Vè„ûÿÿƒÄ3À^]ÃÌÌÌÌÌÌÌÌÌÌÌÌU‹ìV‹ujVèùƒÄƒøuLhÜç@VènjVèäjÿVèփăøu)jƒÄjVèaƒÄHPVè¤ƒÄ ¸^]Ãjh´ç@ƒÄ 3À^]ÃÌÌÌÌÌÌÌÌjV调ąÀtUjjÿVèWƒÄ…Àt>jþVè„WVèÛjþVèQjÿVèCƒÄ ƒøt*jVèÁjÿVèƒÄ…ÀuÂjhäç@VèŸƒÄ 3ÀÃjVèµjVè­jjVèëƒÄ¸ÃÌÌÌÌÌÌU‹ìV‹uW¿è@èNÿÿÿ_^]ÃÌÌÌÌÌÌÌÌÌÌU‹ìV‹uW¿ è@è.ÿÿÿ_^]ÃÌÌÌÌÌÌÌÌÌÌU‹ìV‹uW¿(è@èÿÿÿ_^]ÃÌÌÌÌÌÌÌÌÌÌU‹ìV‹uW¿0è@èîþÿÿ_^]ÃÌÌÌÌÌÌÌÌÌÌU‹ìV‹uW¿8è@èÎþÿÿ_^]ÃÌÌÌÌÌÌÌÌÌÌU‹ìV‹uW¿<è@è®þÿÿ_^]ÃÌÌÌÌÌÌÌÌÌÌU‹ìV‹ujVèIƒÄ…Àt\jVè¶jÿVèðƒÄ…ÀtEIjþVèh@è@VèmjþVèãjÿVèÕƒÄ ƒøt2jVèSjÿV諃ąÀu¾jVè<jVè܃ĸ^]ÃjVè?jVè7jjVèuƒÄ¸^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹ìV‹uWjVèv‹8híØÿÿVè÷WVè\jþVèBjVè"VèÔhìØÿÿHÿQPVèÆƒÄ<…Àtgj
hDè@VèLjþVèjÿVèúƒÄƒøtjþVèxjh@$@ƒÄjVè~jjVè¼WVèÙjûV迃Ä(jüVè6ƒÄ_3À^]ÃÌÌÌÌÌÌÌU‹ìV‹uhxç@j@VèµjýVè}hˆç@Vèîj@Vè•jýVè]ƒÄ8^]ÃÌÌÌU‹ìV‹uWjÿV3ÿè$ƒÄ…Àt2hxç@Vè¬jþVè"jÿVè\3É=ð@”ÁjýV‹ùèŽƒÄ ‹Ç_^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹ìV‹uhxç@Vè^j@jýVèÍhˆç@Vè>jh@VèåjýVè­h è@ƒÄ@jh @VèÂjýVèŠh˜è@Vèûj@Vè¢jýVèjhè@VèÛj@V肃ÄDjýVèGhˆè@Vè¸jh@Vè_jýVè'h€è@Vè˜jh @Vè?jýVèƒÄ@hxè@Vèujh@@jýVèähpè@VèUjh`@VèüjýVèÄhhè@Vè5ƒÄ@jh€@VèÙjýVè¡h`è@hPè@hðØÿÿVèzjýVèxƒÄ4^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹ìS‹] V‹uW‹}WSVèƒÄ …Àt
_^¸[]ËE…Àt PVè΃Äëj h¨è@VèRhðØÿÿVè ƒÄSVè§jþVèùWVè˜hðØÿÿVèçjþVèßjÿVèjüV‹øèUƒÄ8‹Ç_^[]ÃÌÌÌÌÌU‹ìV‹uW‹} WV覃ăøÿuhÐè@ƒÄjjÿVèìƒÄ _^]Ãøt'ƒøtyPVèÎPVèïƒÄjjÿVèÀƒÄ _^]ÃWVè:ƒÄ…ÀujëÍhðØÿÿVè<jÿV舃ąÀjþVè©hÄè@V蘃ÄjjÿVèiƒÄ _^]ÃWVè¡hðØÿÿVèðjÿVè<ƒÄ…Àu'jþVèah¼è@VèPƒÄjjÿVè!ƒÄ _^]Ãh´è@Vè1jþVèkjVèíƒÄjjÿVèòƒÄ _^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌU‹ìV‹u €>#…‘‹ES‹]W‹xPSèœþÿÿŠNƒÄ€ùfu8‹U
WPƒÆƒzQVthpé@S蘃Ä_[^]Ãh@é@Sè…ƒÄ_[^]ÀùvuMWƒÆƒyPVthé@Sè^ƒÄ_[^]ÃhÜè@SèKƒÄ_[^]ËUVRè9ƒÄ^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹ìV‹uW‹} WV覃ăøu?h°é@WVètjÿV贃ąÀtWVèèƒÄ^]ÃjþVèð
ƒÄ_3À^]ÃÌU‹ìV‹uVèñ
PVèŒýÿÿƒÄ ¸^]ÃÌU‹ìSV‹ujV3ÛèVƒÄ…ÀtpWjVè48SjVè‰hèé@Vèˆ
hðØÿÿVèû
WVèjþVèì
jVèÌ
jþjÿVèª
ƒÄH…ÀtWVèÞ
Vè¢
jûVèÄ
ƒÄ»_3À…Û•ÀPVè×
ƒÄ[]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌU‹ìV‹uWjVèx
ƒÄjjVƒøuèþëè—ƒÄ jjV‹øèHƒÄ …ÿt…ÀtPWVè…ƒÄ ^]ÃVè
ƒÄ^]ÃÌÌÌÌÌÌÌU‹ìV‹uh°é@VèŽ jþVèª jüVè
ƒÄ3À^]ÃÌÌÌÌÌÌU‹ìV‹ujþVè
ƒÄ…Àuhôé@VèO VèE
ƒÄ jÿVè¶ ƒÄ…ÀujþVè5 hðØÿÿVèH ƒÄjþVèa ƒÄ3À^]ÃÌU‹ìV‹ujÿVèU hðØÿÿjÿVèB ƒÄ…ÀtjþVèë Vè9 ƒÄ ¸^]ÃÌÌÌÌU‹ì‹EjjPèpPèëƒÄ3À]ÃÌÌÌU‹ìQS‹] V‹uWSVÇEüè+ ‹8hèé@Vèˆ hðØÿÿVèû WVè jþVèì jÿVèÞ ƒÄ0…ÀtjýV3ÿè[ ƒÄ‹Ç_^[‹å]ÃWVèÒ SVè¡ jüVè· ‹}üƒÄjýVè+ ƒÄ‹Ç_^[‹å]ÃÌÌÌÌÌÌÌÌÌU‹ì‹E …ÀtV‹uPVèû
jþVèq ƒÄ^]ËEhîØÿÿPè ƒÄ]ÃÌÌÌÌÌÌÌÌÌÌU‹ì‹EjþPèÈ
ƒÄ]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌU‹ìV‹uW‹} …ÿtMWVèš
jþVè jÿVè ƒÄƒøt<jþVè€
jjVèš
WVèi
jþVè…
jüVèÝ
ƒÄ,ëhîØÿÿVèm
ƒÄƒ}t@Vèj÷ÿÿƒÄ…Àu3PPVèU
÷ÿÿjþVèƒ
ƒÄ…Àt jþVè˜
ƒÄjþVè
ƒÄjþVèþ ƒÄ_^]ÃÌU‹ì‹EMU VuPQRVèß
ƒÄ…Àu PPPVèÉ
ƒÄ^]ÃÌU‹ìVuWjV3ÿèV
ƒÄ…Àt-j
ƒÄ…ÀtjþVè– WjVè}
jVèÏýÿÿƒÄ‹ø3À…ÿ•ÀPVè
ƒÄ_¸^]ÃU‹ìVuWVèp h|ê@V‹øèE hðØÿÿVè¸ jÿVèª ƒÄƒø„Óh|ê@ jVèÁ hðØÿÿVèŒ hÈé@Vèýjj jj jhÀé@Vè– ƒÄDjh¼é@Vè† jýVèH jþVèF hðØÿÿVè5 h¨è@Vè¦jjVèÆhðØÿÿVè ƒÄ@hèé@VèƒjjVè£hðØÿÿVèòhPè@Vèchèé@VèXhðØÿÿVèËh¨è@VèBhðØÿÿV赃ÄDjh @VèÛhðØÿÿVè hÔé@ ƒÄ…Àt'jÿVè&hÔé@Vè÷hðØÿÿVèæVèvõÿÿƒÄjþVèáhîØÿÿVèôjþVèÎhîØÿÿVèáhtê@Vè²jþVè(jÿVèƒÄ8ƒøt0jþVè˜jjVè²htê@Vè}jþVè™jüVèñƒÄ,jþVèhhtê@VèWjþVèÍhlê@VèDjh0"@VèëjýVè³h\ê@Vè$jhP&@Vè˃ÄHjýVèhHê@jhP"@Vè¨jýVèph@ê@Vèájh#@VèˆjýVèPƒÄ@h8ê@Vè¾jhp#@VèejýVè-h0ê@Vèžjh #@VèEjýVè
h(ê@Vè~ƒÄ@jh$@Vè"jýVèêjþVèdjþVè\ƒÄ$WVèRƒÄ_^]ÃÌÌÌÌÌU‹ìW‹} …ÿu‹EP膃Ä_]ÃS‹]V‹uShðØÿÿVè*hÈé@jþVè}jÿVèoƒÄ$…Àu!jþVèîhÈé@VèÝhðØÿÿVèPƒÄWVèXjþVè>jÿVè0ƒÄjþV…Àuoè¯WVè2jVè¨jÿV‰8è´jüVèÊjýVèjþVè~jþV蔃Ä@jþVèïhðØÿÿVè~jþV蚃ÄjþVèéƒÄ^[_]Ãè|jþVè8h¨è@Vè'hðØÿÿVèšjþVèzjþVèŠjÿVè|ƒÄ8ƒøu7SVèõjþVèkjÿV諃ăøujüVèÛjþVèoƒÄ^[_]ÃjûVèájûVè?jüV賃ÄjþVèDƒÄ^[_]ÃÌÌÌÌÌÌÌÌÌÌU‹ìV‹uWVè ‹M ‹ø‹Á™3Â+ƒÄ;ø}‹E_^]ÃjQVè=ƒÄ _^]ÃÌÌÌÌÌÌÌÌU‹ìV‹uWVè`‹} ‹È‹Ç™3Â+ƒÄ;È}‹E_^]ÃWVèɃąÀuWVèÓõÿÿƒÄ…Àu_3À^]ÃWV蕃ąÀtì‹_^]ÃÌÌU‹ìV‹uWVè‹} ‹È‹Ç™3Â+ƒÄ;È}‹E_^]ÃWVè9ƒÄƒøuWVèHƒÄ_^]ËURWVèPÿÿÿƒÄ _^]ÃÌÌÌÌÌÌÌÌÌU‹ìV‹uWVè"úÿÿjjVèÈøÿÿjVè`øÿÿVèˆhî@h AV‹øècùÿÿWVèRVèdhðí@h¨#AV‹øè?ùÿÿƒÄHWVè+Vè=hÈí@hÍ"h¨3AV‹øèùÿÿWVèh í@hA hxVAV‹øèôøÿÿWVèãƒÄ@Vèòhtí@hhÀaAV‹øèÍøÿÿWVè¼VèÎhLí@hHhAV‹øè©øÿÿWVè˜Vèªh$í@h rAV‹øè…øÿÿƒÄLWVèqVèƒhøì@hDhÀxAV‹øè^øÿÿWVèMVè_hÐì@hš)hȼAV‹øè:øÿÿWVè)ƒÄ@Vè8h¨ì@hhæAV‹øèøÿÿWVèh|ì@h›h0ìAV‹øèï÷ÿÿWVèÞVèðhTì@h#hÐðAV‹øèË÷ÿÿƒÄLWVè·VèÉh(ì@høõAV‹øè¤÷ÿÿWVè“Vè¥hüë@h¯:hØÿAV‹øè€÷ÿÿWVèoƒÄ@Vè~hÐë@hˆ:BV‹øèY÷ÿÿWVèHVèZh¨ë@h•hZBV‹øè5÷ÿÿWVè$Vè6h|ë@h·7h¨sBV‹øè÷ÿÿƒÄLWVèýhPë@h™h`«BV‹øèêöÿÿWVèÙVèëh ë@h%hÃBV‹øèÆöÿÿWV赃Ä@VèÄhøê@hdh(ÊBV‹øèŸöÿÿWVèŽVè ‹øhÐê@h7hÝBVè{öÿÿWVèjVè|h¨ê@hhÈâBV‹øèWöÿÿƒÄLWVèCVèUhŒê@h™hàéBV‹øè0öÿÿWVèVèCõÿÿƒÄ(_¸^]ÃÌÿ%¸á@ÿ%´á@ÿ%°á@ÿ%¬á@ÿ%¨á@ÿ%¤á@ÿ% á@ÿ%œá@ÿ%˜á@ÿ%”á@ÿ%á@ÿ%Œá@ÿ%ˆá@ÿ%„á@ÿ%€á@ÿ%|á@ÿ%xá@ÿ%tá@ÿ%pá@ÿ%lá@ÿ%há@ÿ%dá@ÿ%`á@ÿ%\á@ÿ%Xá@ÿ%Tá@ÿ%Pá@ÿ%Lá@ÿ%Há@ÿ%Dá@ÿ%@á@ÿ%<á@ÿ%8á@ÿ%4á@ÿ%0á@ÿ%,á@ÿ%(á@ÿ%$á@ÿ% á@ÿ%á@ÿ%á@ÿ%á@ÿ%á@ÿ% á@ÿ%á@ÿ%á@ÿ%á@j hAèð3Û‰]ä3À‹}•À;Ãuè‡Çè*ƒÈÿéÅ3À9] •À;Ãt܉}Wè—Y‰]üöG @uoWèMYƒøÿtƒøþt‹ÐÁú‹ÈƒáÁá Cë¹0íBöA$u)ƒøÿtƒøþt‹ÈÁùƒàÁàCë¸0íBö@$€tèõÇ蘃Mäÿ9]äu#Wèê ‹ðEPSÿu WèØ‰EäWVèl
ƒÄÇEüþÿÿÿè ‹Eäè@ÃÿuèLYø€êBá CVj^…Àu¸ë;Æ}‹Æ£ CjPè÷ YY£ C…ÀujV‰5 CèÞ YY£ C…ÀujX^Ã3Ò¹€êBë¡ C ƒÁ ƒÂùíB|êjþ^3Ò¹êBW‹ÂÁøC‹úƒçÁçƒøÿt;Æt…Àu‰1ƒÁ BùðêB|Î_3À^Ãè(#€=ŒûBtèô ÿ5 Cè<YËÿU‹ìVu¸€êB;ðr"þàìBw‹Î+ÈÁùƒÁQèf$N
ƒÆ Vÿ à@^]ËÿU‹ì‹Eƒø}ƒÀPè9$‹E H Y]ËE ƒÀ Pÿ à@]ËÿU‹ì‹E¹€êB;Ár=àìBw` ÿÿÿ+ÁÁøƒÀ#Y]ÃÀ Pÿ¤à@]ËÿU‹ì‹M‹E ƒù}` ÿÿÿƒÁQèè"Y]ÃÀ Pÿ¤à@]ËÿU‹ìhTî@ÿ¬à@…ÀthDî@Pÿ¨à@…ÀtÿuÿÐ]ËÿU‹ìÿuèÈÿÿÿYÿuÿ°à@Ìjèh#YÃjè†"YËÿVè,&‹ðVèí%Vè£VèÒ%Vè½%Vè²#Vè›#ƒÄ^ËÿU‹ìV‹u3Àë…Àu…ÉtÿуÆ;u rì^]ËÿU‹ìƒ=lî@thlî@èw,Y…Àt
ÿuÿlî@Yè«+hàá@hÈá@è¡ÿÿÿYY…ÀuTVWhB`@è'+¸Àá@¾Äá@Y‹ø;Æs…ÀtÿЃÇ;þrñƒ= C_^th Cè
,Y…Àt jjjÿ C3À]Ãj h°Aèìjè\"Yƒeü3À@9”ûB„Ø£ûBŠE¢ŒûBƒ} … ÿ5 C‹5´à@ÿ֋؉]Ð…Ûthÿ5 CÿÖ‹ø‰}Ô‰]܉}؃ï‰}Ô;ûrKèÏ$9tí;ûr>ÿ7ÿÖ‹Øè¼$ÿÓÿ5 CÿÖ‹Øÿ5 CÿÖ9]Üu9EØt‰]܉]ЉEØ‹ø‰}Ô‹]Ðë«ÇEääá@}äðá@s‹Eä‹…ÀtÿЃEäëæÇEàôá@}àøá@s‹Eà‹…ÀtÿЃEàëæÇEüþÿÿÿè ƒ}u)Ç”ûBjèt Yÿuè½ýÿÿƒ}tjè^ YÃèþËÿU‹ìjjÿuè¯þÿÿƒÄ ]ËÿU‹ìjjÿuè™þÿÿƒÄ ]Ãjjjè‰þÿÿƒÄ ÃjjjèzþÿÿƒÄ ËÿU‹ìèõ,ÿuè>+Yhÿè¯ÿÿÿ̸”n@£ðBÇ ðBŠe@ÇðB>e@ÇðBwe@ÇðBàd@£ðBÇ ðB n@Ç$ðBüd@Ç(ðB^d@Ç,ðBêc@ËÿU‹ìè–ÿÿÿƒ}tèr7Ûâ]ËÿU‹ìS]ƒûàwoVWƒ=hCuèJ,jè”*hÿè˜üÿÿYY…Ût‹Ãë3À@Pjÿ5hCÿ¸à@‹ø…ÿu&j ^9lCt
Sè›"Y…Àu©ëè‰0è‰0‹Ç_^ëSèz"YèýÇ 3À[]ÃÌÌÌU‹ìWV‹u ‹M‹}‹Á‹ÑÆ;þv‚ ù€rƒ=èCtWVƒçƒæ;þ^_uéÙ6÷ÇuÁéƒâƒùr)ó¥ÿ$•P9@‹Çºƒér ƒàÈÿ$…d8@ÿ$`9@ÿ$ä8@t8@ 8@Ä8@#ÑŠˆŠFˆGŠFÁéˆGƒÆƒÇƒùrÌó¥ÿ$•P9@I#ÑŠˆŠFÁéˆGƒÆƒÇƒùr¦ó¥ÿ$•P9@#ÑŠˆƒÆÁéƒÇƒùrˆó¥ÿ$•P9@IG9@49@,9@$9@9@9@ 9@9@DŽä‰Dä‹DŽè‰Dè‹DŽì‰Dì‹DŽð‰Dð‹DŽô‰Dô‹DŽø‰Dø‹DŽü‰Düðøÿ$•P9@‹ÿ`9@h9@t9@ˆ9@E^_Éʈ‹E^_ÉʈŠFˆG‹E^_ÉÃIŠˆŠFˆGŠFˆG‹E^_ÉÃt1ü|9ü÷Çu$Áéƒâƒùr
ýó¥üÿ$•ì:@‹ÿ÷Ùÿ$œ:@I‹Çºƒùr ƒà+Èÿ$…ð9@ÿ$ì:@:@$:@L:@ŠF#шGƒîÁéƒïƒùr²ýó¥üÿ$•ì:@IŠF#шGŠFÁéˆGƒîƒïƒùrˆýó¥üÿ$•ì:@ŠF#шGŠFˆGŠFÁéˆGƒîƒïƒù‚Vÿÿÿýó¥üÿ$•ì:@I :@¨:@°:@¸:@À:@È:@Ð:@ã:@‰D‹DމD‹DމD‹DމD‹DŽ ‰D ‹DމD‹DމDðøÿ$•ì:@‹ÿü:@;@;@(;@E^_ÉÊFˆGE^_ÉÃIŠFˆGŠFˆGE^_ÉÊFˆGŠFˆGŠFˆG‹E^_ÉËÿU‹ìƒ}t-ÿujÿ5hCÿÀà@…ÀuVèh‹ðÿ¼à@Y‰^]ÃÌÌÌÌÌ‹L$ W…É„·‹|$V÷ÇStŠƒÇ„Àt9÷Çuÿþþ~Ѓðÿ3ƒÇ©tè‹Gü„Àt!„ät©ÿt ©ÿuσïë
ƒïëƒïëƒï‹t$÷Æu ‹ÙÁéu\ë"ŠƒÆ„Òt=ˆƒÇƒét)÷Æuå‹ÙÁéu8‹ËƒátŠƒÆˆƒÇ„Òtƒéuíˆ[^‹D$_È‹D$[^_ɃǃétȺÿþþ~‹Ѓðÿ3‹ƒÆ©tÜ„Òt΄öt*÷Âÿt÷Âÿuĉ‹D$[^_Ãf‰3Ò‹D$ˆW[^_Ãf‰D$[^_Ã;
íBuóÃéL3ÌÌÌÌÌÌÌÌÌÌÌÌ‹T$ ‹L$…Òti3ÀŠD$„Àuú€rƒ=èCté4W‹ùƒúr1÷Ùƒát +шƒÇƒéuö‹ÈÁàÁ‹ÈÁàÁ‹ÊƒâÁétó«…Òt
ˆƒÇƒêuö‹D$_ËD$ËÿU‹ìƒ=¤ûBtèT&ÿuè$hÿè¡öÿÿYY]ÃjAè¡3ö95 Cu VVjVÿÈà@¸MZf9@t‰uäë6¡<@¸@PEuê¹ f9ˆ@u܃¸t@vÓ3É9°è@•Á‰Mäèý0…Àujè]ÿÿÿYèt…ÀujèLÿÿÿYè"‰uüè|…Àyjè›øÿÿYÿÄà@£ Cès8£œûBè®7…ÀyjèuøÿÿYè'5…Àyj èdøÿÿYjè;öÿÿY;ÆtPèQøÿÿY¡tûB£xûBPÿ5lûBÿ5hûBèRÒÿÿƒÄ ‰Eà9uäuPèÙ÷ÿÿèøÿÿë.‹Eì‹‹ ‰MÜPQèy3YYËeè‹E܉Eàƒ}äuPè¿÷ÿÿèß÷ÿÿÇEüþÿÿÿ‹Eàè’ÃèY8é•þÿÿ‹ÿU‹ìV‹uVèàPèÚ8YY…Àt|è2óÿÿƒÀ ;ðu3Àëè"óÿÿƒÀ@;ðu`3À@ÿ`ûB÷F uNSW<…¨ûBƒ?»u SèÏY‰…ÀuFj‰FX‰F‰Fë
?‰~‰>‰^‰^N 3À_@[ë3À^]ËÿU‹ìƒ}t'Vu ÷F tVèòf ÿîÿÿƒfƒ&ƒfY^]ËÿU‹ì‹EV‹ñÆF …ÀucèX‰FHl‰Hh‰N;
˜÷Bt
PõB…HpuèÙAF;XôBtF
PõB…Hpuè8:‰FFö@puƒHpÆF ë
‹@‰F‹Æ^]ÂöA @tƒyt$ÿIx ˆÿ¶Àë ¾ÀQPèåAYYƒøÿu ÃÿËÿU‹ìQSV‹ð‹ÙèVöG @‹‰Eüt
ƒuëJè<ƒ ë(‹EŠ‹ÏKèÿÿÿÿEƒ>ÿuèƒ8*u
‹Ï°?èuÿÿÿ…ÛÔèƒ8u
èü‹Mü‰^[ÉËÿU‹ììx¡íB3ʼnEüS‹]V‹u3ÀWÿu‹} ¤ýÿÿ‰µÀýÿÿ‰Øýÿÿ‰…¸ýÿÿ‰…ðýÿÿ‰…Ìýÿÿ‰…èýÿÿ‰…Ðýÿÿ‰…¼ýÿÿ‰…Èýÿÿèkþÿÿ…öu+èƒÇè&€½°ýÿÿt
‹…¬ýÿÿƒ`pýƒÈÿéä
öF @u^VèO
Yº0íBƒøÿtƒøþt‹Èƒá‹ðÁþÁá µCë‹ÊöA$u›ƒøÿtƒøþt‹ÈƒàÁùÁàCë‹Âö@$€…qÿÿÿ3ö;þ„gÿÿÿŠ3ɉµÜýÿÿ‰µàýÿÿ‰µ´ýÿÿˆ•ïýÿÿ„Ò„9
G‰½Äýÿÿ9µÜýÿÿŒ&
Bà<Xw¾Â¾€hî@ƒà뾄Áˆî@jÁøY‰… ýÿÿ;Á‡Ë ÿ$…hL@ƒèýÿÿÿ‰µ”ýÿÿ‰µ¼ýÿÿ‰µÌýÿÿ‰µÐýÿÿ‰µðýÿÿ‰µÈýÿÿé” ¾Âƒè tJƒèt6ƒèt%HHtƒè…u ƒðýÿÿéi ƒðýÿÿé] ƒðýÿÿéQ ðýÿÿ€éB ƒðýÿÿé6 €ú*u,ƒÃØýÿÿ‹[ü‰Ìýÿÿ;Þ ƒðýÿÿ÷Ìýÿÿé ‹…ÌýÿÿkÀ
¾ÊDЉ…Ìýÿÿéꉵèýÿÿé߀ú*u&ƒÃØýÿÿ‹[ü‰èýÿÿ;ÞÀƒèýÿÿÿé´‹…èýÿÿkÀ
¾ÊDЉ…èýÿÿ陀úItU€úhtD€últ€úwðýÿÿér€?luGðýÿÿ‰½ÄýÿÿéWƒðýÿÿéKƒðýÿÿ é?Š<6u4uƒÇðýÿÿ‰½Äýÿÿé<3u2uƒÇ¥ðýÿÿÿÿÿ‰½Äýÿÿéù<d„ñ<i„é<o„á<u„Ù<x„Ñ<X„ɉµ ýÿÿƒ¥Èýÿÿ…¤ýÿÿP¶ÂPèSAY…ÀŠ…ïýÿÿYt"‹ÀýÿÿµÜýÿÿè®ûÿÿŠG‰½Äýÿÿ„À„¯üÿÿ‹ÀýÿÿµÜýÿÿèŒûÿÿéh¾Âƒødè„yƒøSò„€ƒèAtHHtXHHtHH…Œ€Â Ç…”ýÿÿˆ•ïýÿÿƒðýÿÿ@½ôýÿÿ¸‰½äýÿÿ‰…œýÿÿ9µèýÿÿHÇ…èýÿÿé£÷…ðýÿÿ0…˜ðýÿÿé‰÷…ðýÿÿ0u
ðýÿÿèýÿÿƒùÿu¹ÿÿÿƒÃ÷…ðýÿÿØýÿÿ‹[ü‰äýÿÿ„«;Þu ¡(íB‰…äýÿÿ‹…äýÿÿÇ…ÈýÿÿéyƒèX„ÓHHty+Á„'ÿÿÿHH…˜ƒÃ÷…ðýÿÿØýÿÿt0·CüPh…ôýÿÿP…àýÿÿPè–?ƒÄ…ÀtÇ…¼ýÿÿëŠCüˆ…ôýÿÿÇ…àýÿÿ…ôýÿÿ‰…äýÿÿé/ƒÃØýÿÿ;Æt;‹H;Ît4÷…ðýÿÿ¿äýÿÿt™+ÂÑøÇ…ÈýÿÿéꉵÈýÿÿéß¡$íB‰…äýÿÿPè$=Yéȃøpô„܃øeŒ¶ƒøgŽ4þÿÿƒøitqƒønt(ƒøo…šö…ðýÿÿ€Ç…àýÿÿtaðýÿÿëU‹3ƒÃØýÿÿèŸ<…À„:úÿÿö…ðýÿÿ t f‹…Üýÿÿf‰ë‹…Üýÿÿ‰Ç…¼ýÿÿéÁƒðýÿÿ@Ç…àýÿÿ
ðýÿÿ÷Á„¢‹SƒÃéÎu€úgucÇ…èýÿÿëW9…èýÿÿ~‰…èýÿÿ½èýÿÿ£~=‹µèýÿÿÆ]Vèg Š•ïýÿÿY‰…´ýÿÿ…Àt‰…äýÿÿ‰µœýÿÿ‹øë
Ç…èýÿÿ£‹5´à@ƒÃ‰…ˆýÿÿ‹Cü‰…Œýÿÿ…¤ýÿÿPÿµ”ýÿÿ¾Âÿµèýÿÿ‰ØýÿÿPÿµœýÿÿ…ˆýÿÿWPÿ5 ðBÿÖÿЋðýÿÿƒÄã€tƒ½èýÿÿu…¤ýÿÿPWÿ5,ðBÿÖÿÐYY€½ïýÿÿgu…Ûu…¤ýÿÿPWÿ5(ðBÿÖÿÐYY€?-uðýÿÿG‰½äýÿÿWé
þÿÿÇ…èýÿÿ¸ýÿÿë$ƒès„½üÿÿHHþÿÿƒè…·Ç…¸ýÿÿ'ö…ðýÿÿ€Ç…àýÿÿ„pþÿÿŠ…¸ýÿÿQÆ…Ôýÿÿ0ˆ…ÕýÿÿÇ…ÐýÿÿéLþÿÿ÷Á…RþÿÿƒÃöÁ tØýÿÿöÁ@t¿Cüë·Cü™ë‹CüöÁ@t™ë3Ò‰ØýÿÿöÁ@t…Ò|…Às÷؃Ò÷Úðýÿÿ÷…ðýÿÿ‹Ú‹øu3Ûƒ½èýÿÿ} Ç…èýÿÿ냥ðýÿÿ÷¸9…èýÿÿ~‰…èýÿÿ‹Ç Ãu!…Ðýÿÿuó‹…èýÿÿÿèýÿÿ…À‹Ç Ãt-‹…àýÿÿ™RPSWè=<ƒÁ0‰œýÿÿ‹ø‹Úƒù9~¸ýÿÿˆNë½Eó+ÆF÷…ðýÿÿ‰…àýÿÿ‰µäýÿÿtb…Àt‹Î€90tWÿäýÿÿ‹äýÿÿÆ0@ë?If90tƒÀ;Îuó+…äýÿÿÑøë(;Þu ¡$íB‰…äýÿÿ‹…äýÿÿëI€8t@;Îuõ+…äýÿÿ‰…àýÿÿƒ½¼ýÿÿ…}‹…ðýÿÿ¨@t2©t Æ…Ôýÿÿ-ë¨t Æ…Ôýÿÿ+ë ¨tÆ…Ôýÿÿ Ç…ÐýÿÿÌýÿÿ+àýÿÿ+Ðýÿÿ‰œýÿÿ¨ u'‹û…Û~!‹ÀýÿÿµÜýÿÿ° OèFõÿÿƒ½Üýÿÿÿt…ÿß‹½Àýÿÿ‹Ðýÿÿ…ÔýÿÿP…ÜýÿÿèNõÿÿö…ðýÿÿYt(ö…ðýÿÿuëµÜýÿÿ‹Ï°0Kèöôÿÿƒ½Üýÿÿÿt…ÛヽÈýÿÿàýÿÿtT…Û~P‹µäýÿÿ·PjEôPýÿÿPKƒÆè!:ƒÄ…Àu ‹ýÿÿ…ÉtEôP…ÜýÿÿèÉôÿÿY…ÛuÁëƒÜýÿÿÿëÿµäýÿÿ…Üýÿÿ‹Ëè¦ôÿÿYƒ½Üýÿÿ|.ö…ðýÿÿt%‹œýÿÿëµÜýÿÿ‹Ï° KèHôÿÿƒ½Üýÿÿÿt…Ûヽ´ýÿÿtÿµ´ýÿÿè3ïÿÿƒ¥´ýÿÿY‹½ÄýÿÿŠˆ…ïýÿÿ„Àt ýÿÿ‹Øýÿÿ3öŠÐéÇõÿÿ€½°ýÿÿt
‹…¬ýÿÿƒ`pý‹…Üýÿÿ‹Mü_^3Í[èRðÿÿÉÃISD@RB@B@àB@,C@7C@}C@®D@‹ÿU‹ìƒìLVE´PÿØà@j@j ^Vè®YY3É;ÁuƒÈÿé£C‰5ðC;Âs6ƒÀƒHûÿfÇ@ÿ
‰HfÇ@
Æ@!
‰H3ˆH/5CƒÀ@Æ;ÖrÍSWf9Mæ‹Eè;ÁƒÀ‰Eüþ‰Eø;Þ|‹Þ9ðC}k¿Cj@j èYY…ÀtQƒðC ˆ;Ás1ƒÀƒHûÿƒ`€`€ƒ`3fÇ@ÿ
fÇ@
Æ@/ƒÀ@ÎPû;ÑrÒƒÇ9ðC|¢ëðC3ÿ…Û~r‹Eø‹ƒøÿt\ƒøþtW‹MüŠ öÁtMöÁu PÿÔà@…Àt=‹÷ƒæ‹ÇÁøÁæ4…C‹Eø‹‹EüŠˆFF PÿÐà@…À„¼ÿFƒEøGÿEü;û|Ž3Û‹óÁæ5Cƒøÿt ƒøþt€N€ëqÆF…ÛujöXë
Cÿ÷ØÀƒÀõPÿà@‹øƒÿÿtB…ÿt>WÿÔà@…Àt3%ÿ‰>ƒøu€N@ë ƒøu€Nh F PÿÐà@…Àt,ÿFë
€NþÿÿÿCƒûŒhÿÿÿÿ5ðCÿÌà@3À_[^ÉÃÈÿëö‹ÿU‹ì‹E…ÀuèñÇ蔃Èÿ]Ë@]ËÿU‹ì‹E£°ûB]ËÿU‹ìì(¡íB3ʼnEüS‹]WƒûÿtSè~7Yƒ¥àüÿÿjL…äüÿÿjPè‘íÿÿ…àüÿÿ‰…Øüÿÿ…0ýÿÿƒÄ ‰…Üüÿÿ‰…àýÿÿ‰Üýÿÿ‰•Øýÿÿ‰Ôýÿÿ‰µÐýÿÿ‰½ÌýÿÿfŒ•øýÿÿfŒìýÿÿfŒÈýÿÿfŒ…ÄýÿÿfŒ¥ÀýÿÿfŒ­¼ýÿÿœ…ðýÿÿ‹EMôýÿÿÇ…0ýÿÿ‰…èýÿÿ‹Iü‰äýÿÿ‹M àüÿÿ‹Mäüÿÿ‰…ìüÿÿÿèà@j‹øÿäà@…ØüÿÿPÿàà@…Àu…ÿu ƒûÿtSè‰6Y‹Mü_3Í[èŒìÿÿÉËÿVj¾ÀVjèÅþÿÿƒÄ Vÿôà@Pÿðà@^ËÿU‹ìÿ5°ûBÿ´à@…Àt]ÿàÿuÿuÿuÿu ÿuè¯ÿÿÿÌ3ÀPPPPPèÇÿÿÿƒÄËÿU‹ì‹E3É;ÍpíBtAƒù-rñHíƒùwj
X]ËÍtíBDÿÿÿjY;ÈÀ#ÁƒÀ]ÃèÑ
…Àu¸ØîBÃÀÃè¾
…Àu¸ÜîBÃÀ ËÿU‹ìVèâÿÿÿ‹MQ‰è‚ÿÿÿY‹ðè¼ÿÿÿ‰0^]ÃÌÌÌÌÌÌÌÌh€Q@dÿ5‹D$‰l$l$+àSVW¡íB1Eü3ÅP‰eèÿuø‹EüÇEüþÿÿÿ‰EøEðd£Ã‹Mðd‰
Y__^[‹å]QÃÌÌÌÌÌÌÌ‹ÿU‹ìƒìS‹] V‹s35íBW‹ÆEÿÇEô{ƒøþt
‹NÏ3 8èüêÿÿ‹N ‹FÏ3 8èìêÿÿ‹Eö@f‹MUè‰Sü‹[ ‰Eè‰Mìƒûþt_I[‹L†D†‰Eð‹‰Eø…Ét‹×è”5ÆEÿ…Àx@G‹Eø‹Øƒøþu΀}ÿt$‹ƒøþt
‹NÏ3 8èyêÿÿ‹N ‹VÏ3 :èiêÿÿ‹Eô_^[‹å]ÃÇEôëÉ‹M9csmàu)ƒ=ìCt hìC裃ąÀt‹UjRÿìCƒÄM Uè45‹E 9X thíBW‹Ó‹Èè65‹E ‹Mø‰H ƒøþt
‹NÏ3 8èãéÿÿ‹N ‹VÏ3 :èÓéÿÿ‹Eð‹H‹×èÊ4ºþÿÿÿ9S „OÿÿÿhíBW‹Ëèá4éÿÿÿ‹ÿU‹ìVW3öÿuè)äÿÿ‹øY…ÿu'9´ûBvVÿøà@†è;´ûBvƒÈÿ‹ðƒøÿuÊ‹Ç_^]ËÿU‹ìVW3öjÿu ÿuè˜4‹øƒÄ …ÿu'9´ûBvVÿøà@†è;´ûBvƒÈÿ‹ðƒøÿuËÇ_^]ËÿU‹ìVW3öÿu ÿuèÐ4‹øYY…ÿu,9E t'9´ûBvVÿøà@†è;´ûBvƒÈÿ‹ðƒøÿuÁ‹Ç_^]ÃjAè&ýÿÿ3Û‰]äjè‘Y‰]üj_‰}à;= C}T‹÷¡ C9°tE°ö@ ƒtPèk5YƒøÿtÿEäƒÿ|(¡ C°ƒÀ PÿÜà@¡ Cÿ4°èáæÿÿY¡ C°Gë¡ÇEüþÿÿÿè ‹EäèåüÿÿÃjè6YËÿU‹ìSV‹u‹F ‹È€á3Û€ùu@©t9FW>+ø…ÿ~,WPVèúÿÿYPèK<ƒÄ ;Çu‹F „Àyƒàý‰F ëƒN ƒËÿ_‹Fƒf^‹Ã[]ËÿU‹ìV‹u…öu Vè5Yë/Vè|ÿÿÿY…ÀtƒÈÿë÷F @tVè¦ùÿÿPè·<Y÷ØYÀë3À^]ÃjhAèÚûÿÿ3ÿ‰}ä‰}ÜjèBY‰}ü3ö‰uà;5 Cƒ¡ C°98t^ö@ ƒtVPVèÃÝÿÿYY3ÒB‰Uü¡ C°‹H öÁƒt/9UuPèJÿÿÿYƒøÿtÿEäë9}uöÁtPè/ÿÿÿYƒøÿu E܉}üèFë„3ÿ‹uà¡ Cÿ4°VèÌÝÿÿYYÃÇEüþÿÿÿèƒ}‹Eät‹EÜè[ûÿÿÃjè¬YÃjèÿÿÿYËÿVW3ö¿¸ûBƒ<õäîBuõàîB‰8h ÿ0ƒÇÿÐà@…Àt Fƒþ$|Ó3À@_^Ã$õàîB3Àëñ‹ÿS‹Üà@V¾àîBW‹>…ÿtƒ~t
WÿÓWèµäÿÿƒ&YƒÆþðB|ܾàîB_‹…Àt ƒ~uPÿÓƒÆþðB|æ^[ËÿU‹ì‹Eÿ4ÅàîBÿ¤à@]Ãj h8Aè?úÿÿ3ÿG‰}ä3Û9hCuè» jè hÿè ÝÿÿYY‹u4õàîB9t‹ÇëmjèíûÿÿY‹ø;ûuè¡ùÿÿÇ 3ÀëPj
èXY‰]ü9u+h WÿÐà@…ÀuWèäãÿÿYèlùÿÿÇ ‰]äë ‰>ëWèÉãÿÿYÇEüþÿÿÿè ‹EäèØùÿÿÃj
è)ÿÿÿYËÿU‹ì‹EV4ÅàîBƒ>uPè#ÿÿÿY…ÀujèôÞÿÿYÿ6ÿ à@^]ÃjhXAèJùÿÿèC‹@x…ÀtƒeüÿÐë3À@ËeèÇEüþÿÿÿèÀ:ècùÿÿÃhÊW@ÿìà@£ýBËÿU‹ì‹E£ ýB£ýB£ýB£ýB]ËÿU‹ì‹E
Ìù@V9Pt‹ñkö uƒÀ ;ÆrìkÉ M^;Ás9Pt3À]Ãÿ5ýBÿ´à@Ãj hxAèžøÿÿ3ÿ‰}ä‰}Ø‹]ƒû Kt‹ÃjY+Át"+Át+ÁtY+ÁuCè÷‹ø‰}Ø…ÿuƒÈÿéT¾ ýB¡ ýBëUÿw\‹Óè]ÿÿÿYpëQ‹Ãƒèt2ƒèt!HtèÞ÷ÿÿÇè÷ÿÿë¹¾ýB¡ýBë¾ýB¡ýBë
¾ýB¡ýBÇEäPÿ´à@‰Eà3Àƒ}à„Ö9Eàujè5Ýÿÿ9EätPèCþÿÿY3À‰Eüƒût
ƒû tƒûuO`‰MÔ‰G`ƒûu>Od‰MÐÇGdŒƒûu,
Àù@‰MÜ‹
Äù@
Àù@9MÜ}‹MÜkÉ ‹W\‰DÿEÜëÝè´ÇEüþÿÿÿèƒûuÿwdSÿUàYë‹]‹}؃}ätjèÔüÿÿYÃSÿUàYƒût
ƒû tƒûu‹EÔ‰G`ƒûu‹EЉGd3ÀèM÷ÿÿËÿU‹ì‹E£ ýB]ËÿU‹ì‹E£$ýB]ËÿU‹ì‹E£(ýB]ËÿU‹ìÿ5(ýBÿ´à@…ÀtÿuÿÐY…Àt3À@]Ã3À]Ãjÿìà@Ãÿ˜à@‹ÿVÿ5ðBÿ”à@‹ð…öuÿ50ýBÿ´à@‹ðVÿ5ðBÿà@‹Æ^áðBƒøÿtPÿ58ýBÿ´à@ÿЃ
ðBÿ¡ðBƒøÿtPÿŒà@ƒ
ðBÿévûÿÿjAè#öÿÿhäî@ÿ¬à@‹uÇF\0ù@ƒf3ÿG‰~‰~pƆÈCƆKCÇFh0ðBj
è\üÿÿYƒeüÿvhÿˆà@ÇEüþÿÿÿè>j è;üÿÿY‰}ü‹E ‰Fl…Àu¡˜÷B‰Flÿvlè#YÇEüþÿÿÿèèÙõÿÿÃ3ÿG‹uj
è$ûÿÿYÃj èûÿÿYËÿVWÿ¼à@ÿ5ðB‹øèÄþÿÿÿЋð…öuNhjè„÷ÿÿ‹ðYY…öt:Vÿ5ðBÿ54ýBÿ´à@ÿÐ…ÀtjVèøþÿÿYYÿ€à@ƒNÿ‰ë Vè2ßÿÿY3öWÿ„à@_‹Æ^ËÿVèÿÿÿ‹ð…öujèÚÿÿY‹Æ^ÃjAèÜôÿÿ‹u…ö„ø‹F$…ÀtPèåÞÿÿY‹F,…ÀtPè×ÞÿÿY‹F4…ÀtPèÉÞÿÿY‹F<…ÀtPè»ÞÿÿY‹F@…ÀtPè­ÞÿÿY‹FD…ÀtPèŸÞÿÿY‹FH…ÀtPè‘ÞÿÿY‹F\=0ù@tPè€ÞÿÿYj
èÎúÿÿYƒeü‹~h…ÿtWÿ|à@…Àuÿ0ðBtWèSÞÿÿYÇEüþÿÿÿèWj è•úÿÿYÇEü~l…ÿt#Wè"Y;=˜÷BtÿÀöBt ƒ?uWèü"YÇEüþÿÿÿèVèûÝÿÿYèôÿÿ‹uj
èeùÿÿYËuj èYùÿÿYËÿWhäî@ÿ¬à@‹ø…ÿu è4ýÿÿ3À_ÃV‹5¨à@h ï@WÿÖhï@W£,ýBÿÖhï@W£0ýBÿÖhï@W£4ýBÿÖƒ=,ýB5à@£8ýBtƒ=0ýBt
ƒ=4ýBt…Àu$¡”à@£0ýB¡Œà@Ç,ýBwZ@‰54ýB£8ýBÿ˜à@£ðBƒøÿ„Áÿ50ýBPÿÖ…À„°èÖÿÿÿ5,ýB‹5ìà@ÿÖÿ50ýB£,ýBÿÖÿ54ýB£0ýBÿÖÿ58ýB£4ýBÿÖ£8ýBè¬÷ÿÿ…Àtc‹=´à@h8\@ÿ5,ýBÿ×ÿУðBƒøÿtDhjè´ôÿÿ‹ðYY…öt0Vÿ5ðBÿ54ýBÿ×ÿÐ…ÀtjVè,üÿÿYYÿ€à@ƒNÿ‰3À@ëè×ûÿÿ3À^_ËÿU‹ìQSV‹5´à@Wÿ5 CÿÖÿ5 C‹Ø‰]üÿÖ‹ð;ó‹þ+ûGƒøruSèî3‹ØGY;ØsH¸;Øs‹ÃÃ;ÃrPÿuüèZôÿÿYY…ÀuC;Ãr>PÿuüèDôÿÿYY…Àt/ÁÿP4¸ÿìà@£ Cÿu‹=ìà@ÿ׉ƒÆVÿ×£ C‹Eë3À_^[ÉËÿVjj è°óÿÿYY‹ðVÿìà@£ C£ C…öujX^Ã&3À^Ãj AèKñÿÿèNÔÿÿƒeüÿuèüþÿÿY‰EäÇEüþÿÿÿè ‹EäègñÿÿÃè-ÔÿÿËÿU‹ìÿuè·ÿÿÿ÷ØÀ÷ØYH]ËÿV¸€A¾€AW‹ø;Æs…ÀtÿЃÇ;þrñ_^ËÿV¸ˆA¾ˆAW‹ø;Æs…ÀtÿЃÇ;þrñ_^ËÿVW3ÿÿ·ðBÿìà@‰‡ðBƒÇƒÿ(ræ_^ÃÌÌÌÌÌ‹ÿU‹ì‹M¸MZf9t3À]ËA<Á8PEuï3Ò¹ f9H”‹Â]ÃÌÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ì‹E‹H<È·ASV·q3ÒWD…öt} H ;ùr XÙ;ûr
BƒÀ(;Örè3À_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ìjþh Ah€Q@PƒìSVW¡íB1Eø3ÅPEðd£‰eèÇEüh@è*ÿÿÿƒÄ…ÀtT‹E-@Ph@èPÿÿÿƒÄ…Àt:‹@$Áè÷ЃàÇEüþÿÿÿ‹Mðd‰
Y_^[‹å]ËEì‹9À”‹ÂËeèÇEüþÿÿÿ3À‹Mðd‰
Y_^[‹å]ËÿU‹ì3À‹M; Ű÷@t
@ƒørî3À]ËÅ´÷@]ËÿU‹ììü¡íB3ʼnEüSV‹uWVè¹ÿÿÿ‹ø3ÛY‰½þÿÿ;û„ljè;4Yƒøjè*4Y…Àu
ƒ= íB„îþü„6hìø@h¿@ýBWè”3ƒÄ …À…¸h¾rýBVSf£zÿBÿtà@»û…Àuh¼ø@SVè\3ƒÄ …Àt 3ÀPPPPPè_íÿÿVè(3@Yƒø<v*Vè3EüüB‹È+ÎjÑùh´ø@+ÙSPè12ƒÄ…Àu½h¬ø@¾VWè¤1ƒÄ …Àu¥ÿµþÿÿVWè1ƒÄ …Àu‘h h`ø@
0ƒÄ ë^SSSSSéyÿÿÿjôÿà@‹ð;ótFƒþÿtA3ÀŠ GˆŒþÿÿf9Gt@=ôrèSþÿÿPþÿÿPˆ]ûè. YPþÿÿPVÿxà@‹Mü_^3Í[èÙÿÿÉÃjèÀ2Yƒøtjè³2Y…Àuƒ= íBuè%þÿÿhÿèþÿÿYYËÿU‹ìƒìVÿu Mðè°Ûÿÿ‹u¾Pèw4ƒøeë FPè%3…ÀYuñ¾PèZ4YƒøxuƒÆ‹Mð‹‰¼‹ ŠŠ ˆˆŠÁŠF„Éuó^8Müt‹Eøƒ`pýÉËÿU‹ìƒìVÿu Mðè<Ûÿÿ‹EŠ‹uð„Ét‹–¼Š:Êt„ÉuõŠ@„Ét6ë €ùet €ùEt„Éuï‹ÐH€80tú‹Ž¼‹ SŠ:[u
@Bˆ„Éuö€}ü^t‹Eøƒ`pýÉËÿU‹ìÙî‹EÜßàöÄAz3À@]Ã3À]ËÿU‹ìQQƒ}ÿuÿutEøPè•3‹Mø‹E ‹Mü‰HëEPè$4‹E ‹MƒÄ ÉËÿU‹ìjÿuÿu ÿuè©ÿÿÿƒÄ]ËÿV‹ð…ÿtVèY@PV÷VèŽ4ƒÄ^ËÿU‹ìjÿuèdþÿÿYY]ËÿU‹ìjÿuèÅþÿÿYY]ËÿU‹ìƒìSVÿuMð‹ØèúÙÿÿ3É;Ùu"èëÿÿj^‰0è´êÿÿ€}üt‹Eøƒ`pý‹Æ^[ÉÃ9MvÙ9M ~‹E ë3ÀƒÀ 9Ew èÕêÿÿj"ëÃW8MtU3À9M ŸÀ3Ƀ:-”Á‹øË‹Áè6ÿÿÿ‹}ƒ?-‹óuÆ-sƒ} ~ŠN‹Eðˆ‹€¼Š3À8E”ÀE ðƒ}ÿuƒËÿë]h ù@SVèë6ƒÄ …ÀutN9EtÆEG €80t/GHy÷ØÆF-ƒød| ™jd_÷ÿF‹Âƒø
| ™j
_÷ÿF‹ÂFöÔC_t€90ujAPQè&3ƒÄ €}ütEøƒ`pý3Àéçþÿÿ3ÀPPPPPè.éÿÿÌ‹ÿU‹ìƒì,¡íB3ʼnEü‹ESVuW} j[SMäQMÔQÿpÿ0èô7ƒÄ…ÿuè‘éÿÿ‰è8éÿÿ‹Ãëm‹E…Àtéƒøÿu Àë3Ƀ}Ô-”Á+Á3É…öŸÁ+ÁMÔQNQP3Àƒ}Ô-”À3É…öŸÁÇÈQè06ƒÄ…ÀtÆëÿuEÔjPÿu‹ÇVÿuèêýÿÿƒÄ‹Mü_^3Í[èòÔÿÿÉËÿU‹ìjÿuÿuÿuÿu ÿuèÿÿÿƒÄ]ËÿU‹ìƒì$VWÿuMÜÇEìÿ3ÿÇEü0è¤×ÿÿ9}}‰}‹u ;÷u#è±èÿÿj^‰0èUèÿÿ€}èt‹Eäƒ`pý‹Æé9}vØ‹EƒÀ Æ9Ew è{èÿÿj"ëÈ‹}‰Eô‹G‹ÈÁéºÿS#Ê3Û;Ê…’…Û…Š‹Eƒøÿu ÀëƒÀþjÿu^PSWè$ÿÿÿƒÄ…Àt€}èÆ„¡‹Mäƒapýé•€;-uÆ-Fƒ}Æ0”ÀþÈ$àxˆFjeƒÆVèØ-YY…À„Uƒ}”ÁþÉ€áà€ÁpˆÆ@é;%€3É ÈtÆ-F‹]…Û”ÀþÈ$àx÷ÛÛÆ0ˆF‹Oƒãàáð3ÀƒÃ'3Ò Áu$ÆF0‹OáÿÿƒÆ Áu‰UìëÇEìþëÆF1ƒÆ‹ÆF‰E 9Uuˆë‹MÜ‹‰¼‹ Š ˆ‹Oáÿÿ‰Møw†´‰UôÇEøƒ}~L‹W#Uø‹¿Mü#EôâÿÿèË6fƒÀ0·Àƒø9vËMøƒmüˆ‹Eô¬ÈÁéFÿMfƒ}ü‰Eô‰Mø}®fƒ}ü|Q‹W#Uø‹¿Mü#Eôâÿÿèx6fƒøv1FÿŠ€ùft€ùFuÆ0Hëî;E tŠ€ù9u€Ã:ˆë þÁˆëþ@ÿƒ}~ÿuj0Vè`ÒÿÿƒÄ u‹E €8u‹ðƒ}±4”ÀþÈ$à‹Wè63Û%ÿ#Ó+EìSYÑx;Ãr ÆF+ƒÆë
ÆF-ƒÆ÷ØÓ÷Ú‹þÆ0;Ó|$¹è;ÁrSQRPèÚ4F‰Uð‹Á‹Ó;÷u …Ò|ƒødrjjdRPè´4‰UðF‹Á‹Ó;÷u …Ò|ƒø
rjj
RPèŽ4‰UðF‹Á‰]ðÆF€}èt‹Eäƒ`pý3À[_^ÉËÿU‹ìƒìSVWÿu‹ø‹w‹ÙMðNè5Ôÿÿ…Ûu#èMåÿÿj^‰0èñäÿÿ€}üt‹Eøƒ`pý‹Æé¹ƒ}v×€}t;u u3Àƒ?-”ÀÆfÇ0ƒ?-‹óuÆ-sG…ÀV^èâ@PVSè.Æ0ƒÄ‹óëðƒ} ~QV^è¾@PVSèõ-‹Eð‹€¼ŠˆƒÄ…ÿy&÷߀}u9} |‰} ‹} ‹ÃèùÿÿWj0Sè‰ÐÿÿƒÄ €}üt‹Eøƒ`pý3À_^[ÉËÿU‹ìƒì,¡íB3ʼnEü‹EVW} j^VMäQMÔQÿpÿ0è˜2ƒÄ…ÿuè5äÿÿ‰0èÜãÿÿ‹ÆëlS‹]…Ûuèäÿÿ‰0èÄãÿÿ‹ÆëSƒÈÿ;Øt
3Ƀ}Ô-‹Ã”Á+Á‹uMÔQ‹MØÎQP3Àƒ}Ô-”ÀÇPèÐ0ƒÄ…ÀtÆëÿuEÔjVS‹ÏèNþÿÿƒÄ[‹Mü_3Í^è˜ÏÿÿÉËÿU‹ìƒì,¡íB3ʼnEü‹EVu Wj_WMäQMÔQÿpÿ0è×1ƒÄ…öuètãÿÿ‰8èãÿÿ‹Çé•‹M…ÉtæS‹]Ø3ÀKƒ}Ô-”À<0ƒùÿu ÉëEÔPÿuQWè&0ƒÄ…ÀtÆëWEØH;ØœÁƒøü|-;E}(„Ét
ŠG„ÀuùˆGþÿuEÔjÿu‹ÎÿuèýÿÿƒÄëÿuEÔjPÿu‹Æÿuÿuè£÷ÿÿƒÄ[‹Mü_3Í^è«ÎÿÿÉËÿU‹ì‹Eƒøet_ƒøEtZƒøfuÿu ÿuÿuÿu ÿuè'þÿÿƒÄ]ÃøatƒøAtÿu ÿuÿuÿuÿu ÿuèÂþÿÿë0ÿu ÿuÿuÿuÿu ÿuèoùÿÿëÿu ÿuÿuÿuÿu ÿuèoøÿÿƒÄ]ËÿU‹ìjÿuÿuÿuÿuÿu ÿuèZÿÿÿƒÄ]ËÿVhh3öVèó1ƒÄ …Àt
VVVVVèNáÿÿ^Ãjhjÿpà@3É…À•Á£hC‹ÁÃW‹Æƒà…À…Á‹ÑƒáÁêteëfofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fp¶€¿€Ju£…ÉtI‹ÑÁê…ÒtfofvJuïƒát$‹ÁÁét
vIuó‹Èƒát ŠˆFGIu÷X^_]ú+Ð+ÊQ‹Â‹Èƒát ŠˆFGIu÷Áèt
vHuóYé ÿÿÿj
ÿlà@£èC3ÀËÿU‹ìì(£xC
tCpClC‰5hC‰=dCC
C`C\CfŒ%XCfŒ-TCœˆCE£|C‹E£€CE£ŒC‹…àüÿÿÇÈC¡€C£|CÇpC ÀÇtC¡íB‰…Øüÿÿ¡íB‰…Üüÿÿÿèà@£ÀCjèÈYjÿäà@h(ù@ÿàà@ƒ=ÀCujè¤Yh Àÿôà@Pÿðà@ÉÃfïÀQS‹Áƒà…Àu‹ÂƒâÁèt7¤$ffAfA fA0fA@fAPfA`fAp‰€HuÐ…Òt7‹ÂÁètëIfIHuöƒât‹Â3ÛÁêtIJuøƒàtˆAHuú[XËØ÷ÛƒÃ+Ó3ÀR‹ÓƒâtˆAJuúÁëtIKuøZéUÿÿÿ‹ÿU‹ì‹E8csmàu*ƒxu$@= t=!t="t=@™uè¾åÿÿ3À]ÂhÐq@ÿäà@3ÀËÿU‹ìVèzéÿÿ‹ð…ö„2‹N\‹U‹ÁW9t
ƒÀ ¹;ÇrïÁ;Ás9t3À…Àt‹P…Òu3Àéõƒúu ƒ`3À@éäƒú„Ø‹M S‹^`‰N`‹Hƒù…¶j$Y‹~\ƒd9ƒÁ ù|í‹~d=ŽÀu ÇFdƒë~=Àu ÇFdën=Àu ÇFd„ë^=“Àu ÇFd…ëN=Àu ÇFdë>=Àu ÇFd†ë.=Àu ÇFdŠëÀu ÇFdëÀuÇFdŽÿvdjÿÒY‰~dëƒ`QÿÒY‰^`[ƒÈÿ_^]Ã= Cuèq V‹5œûBW3ÿ…öuƒÈÿé‘<=tGVè'YtŠ„ÀuêjGWè§ßÿÿ‹øYY‰=tûB…ÿtË‹5œûBSë3Vèö€>=YXt"jSèyßÿÿYY‰…Àt?VSPèv)ƒÄ …ÀuGƒÇó€>uÈÿ5œûBè:Çÿÿƒ%œûBƒ'Ç C3ÀY[_^Ãÿ5tûBèÇÿÿƒ%tûBƒÈÿëä3ÀPPPPPèæÛÿÿÌ‹ÿU‹ìQ‹MS3ÀV‰‹ò‹U Ç9Et ]ƒE‰Eü€>"u3À9Eü³"”ÀF‰Eüë<ÿ…ÒtŠˆB‰U жÃPFèÑ,Y…Àtÿƒ} t
‹M ŠÿE ˆF‹U ‹M„Ût2ƒ}üu©€û t€û uŸ…ÒtÆBÿƒeü€>„éŠ< t< uFëóNëã€>„Ѓ}t EƒEÿ3ÛC3ÉëFA€>\tù€>"u&öÁuƒ}üt F€8"u‹ðë
3À3Û9Eü”À‰EüÑé…ÉtI…ÒtÆ\Bÿ…Éuñ‰U Š„ÀtUƒ}üu< tK< tG…Ût=¾ÀP…Òt#èì+Y…Àt
Š‹M ÿE ˆFÿ‹M ŠÿE ˆë
èÉ+Y…ÀtFÿÿ‹U FéVÿÿÿ…ÒtÆB‰U ÿ‹Méÿÿÿ‹E^[…Àtƒ ÿÉËÿU‹ìƒì S3ÛVW9 Cuèïh¾˜CVSˆœCÿhà@¡ C‰5„ûB;Ãt‰Eü8u‰uü‹UüEøPSS}ôè
þÿÿ‹EøƒÄ =ÿÿÿ?sJ‹MôƒùÿsB‹øÁç;Ár6Pè¬Üÿÿ‹ðY;ót)‹UüEøPþWV}ôèÉýÿÿ‹EøƒÄ H£hûB‰5lûB3ÀëƒÈÿ_^[ÉËÿU‹ìƒì SVÿ\à@‹Ø3ö;Þu3Àëwf93tƒÀf90uøƒÀf90uðW=`à@VVV+ÃVÑø@PSVV‰Eôÿ׉Eø;Æt8PèÜÿÿY‰Eü;Æt*VVÿuøPÿuôSVVÿ×…Àu ÿuüè-ÄÿÿY‰uüSÿdà@‹Eüë Sÿdà@3À_^[ÉËÿU‹ìƒì¡íBƒeøƒeüSW¿Næ@»»ÿÿ;Çt
…Ãt ÷УíBëeVEøPÿLà@‹uü3uøÿPà@3ðÿ€à@3ðÿTà@EðPÿXà@‹Eô3Eð3ð;÷u¾Oæ@»ë…óu ‹Æ
GÁà ð‰5íB÷Ö‰5íB^_[ÉËÿU‹ì‹EƒøþuèðØÿÿÇ 3À]Ã…Àx;ðCrèÕØÿÿÇ èxØÿÿëދȃàÁù CÁà¾Dƒà@]Ã-¤t"ƒètƒè
t Ht3ÀøøøøËÿVW‹ðh3ÿFWPègÄÿÿ3À·È‹Á‰~‰~‰~ Áá Á~«««¹0ðBƒÄ F+οŠˆ@Ou÷¾Šˆ@Nu÷_^ËÿU‹ìì¡íB3ʼnEüSW…èúÿÿPÿvÿHà@¿…À„ü3Àˆ„üþÿÿ@;ÇrôŠ…îúÿÿÆ…üþÿÿ „Àt0ïúÿÿ¶È;Èw+Á@P
üþÿÿj Rè¤ÃÿÿƒÄ ŠCƒÃ„ÀuÖjÿv …üúÿÿÿvPW…üþÿÿPjjèD+3ÛSÿv…üýÿÿWPW…üþÿÿPWÿv Sè÷)ƒÄDSÿv…üüÿÿWPW…üþÿÿPhÿv SèÒ)ƒÄ$3À·ŒEüúÿÿöÁt€LŠŒüýÿÿëöÁt€L ŠŒüüÿÿˆŒëˆœ@;Çr¿ëRÇ…äúÿÿŸÿÿÿ3É)…äúÿÿ‹•äúÿÿÐZ ƒûw
€LQ ë
ƒúw €L QàˆëÆA;ÏrÆ‹Mü_3Í[èqÂÿÿÉÃj h( AèÎÖÿÿèÇáÿÿ‹ø¡PõB…Gptƒlt‹wh…öuj è;¼ÿÿY‹ÆèæÖÿÿÃj
èÝÿÿYƒeü‹wh‰uä;5XôBt6…ötVÿ|à@…Àuþ0ðBtVèŠÀÿÿY¡XôB‰Gh‹5XôB‰uäVÿˆà@ÇEüþÿÿÿè뎋uäj
èÖÛÿÿYËÿU‹ìƒìS3ÛSMðè°Äÿÿ‰ CƒþþuÇ Cÿ@à@8]ütEMøƒapýë<ƒþýuÇ CÿDà@ëÛƒþüu‹Eð‹@Ç CëÄ8]üt‹Eøƒ`pý‹Æ[ÉËÿU‹ìƒì ¡íB3ʼnEüS‹] V‹uWèdÿÿÿ‹ø3ö‰};þu‹Ãèºüÿÿ3À顉uä3À9¸`ôB„‘ÿEäƒÀ0=ðÿèý„tÿéý„h·ÇPÿ<à@…À„VEèPWÿHà@…À„7hCVPèÇÀÿÿ3ÒBƒÄ ‰{‰s 9Uè†ü€}î„ÓuɄƶFÿ¶Éé©hCVPè€Àÿÿ‹MäƒÄ kÉ0‰uà±pôB‰uäë+ŠF„Àt)¶>¶ÀëEàŠ€\ôBD;¶FG;øvê‹}ƒÆ€>uЋuäÿEàƒÆƒ}à‰uäré‹Ç‰{ÇCèiûÿÿj‰C C‰dôBZf‹1f‰0ƒÁƒÀJuñ‹óè×ûÿÿé´þÿÿ€L@;ÁvöƒÆ€~ÿ…0ÿÿÿC¹þ@Iuù‹Cèûÿÿ‰C ‰Së‰s·È‹ÁÁá Á{«««ë§95 C…TþÿÿƒÈÿ‹Mü_^3Í[èh¿ÿÿÉÃjhH AèÅÓÿÿƒMàÿèºÞÿÿ‹ø‰}ÜèØüÿÿ‹_h‹uèqýÿÿ‰E;C„Wh è€ÕÿÿY‹Ø…Û„F¹ˆ‹wh‹ûó¥ƒ#Sÿuè´ýÿÿYY‰Eà…À…ü‹uÜÿvhÿ|à@…ÀuFh=0ðBtPèb½ÿÿY‰^hS=ˆà@ÿ×öFp…êöPõB…Ýj
èÙÿÿYƒeü‹C£°C‹C£´C‹C £¸C3À‰Eäƒø}f‹LCf‰ C@ëè3À‰Eä=}
ŠLˆˆPòB@ëé3À‰Eä=}ŠŒˆˆXóB@ëæÿ5XôBÿ|à@…Àu¡XôB=0ðBtP詼ÿÿY‰XôBSÿ×ÇEüþÿÿÿèë0j
èØÿÿYÃë%ƒøÿu û0ðBtSès¼ÿÿYèûÑÿÿÇëƒeà‹Eàè}ÒÿÿÃ= CujýèVþÿÿYÇ C3ÀËÿU‹ìSV‹5ˆà@W‹}WÿÖ‹‡°…ÀtPÿÖ‹‡¸…ÀtPÿÖ‹‡´…ÀtPÿÖ‹‡À…ÀtPÿÖ_PÇE{øTõBt …ÀtPÿÖƒ{üt
‹C…ÀtPÿÖƒÃÿMuÖ‹‡Ô´PÿÖ_^[]ËÿU‹ìW‹}…ÿ„ƒSV‹5|à@WÿÖ‹‡°…ÀtPÿÖ‹‡¸…ÀtPÿÖ‹‡´…ÀtPÿÖ‹‡À…ÀtPÿÖ_PÇE{øTõBt …ÀtPÿÖƒ{üt
‹C…ÀtPÿÖƒÃÿMuÖ‹‡Ô´PÿÖ^[‹Ç_]ËÿU‹ìSV‹u‹†¼3ÛW;Ãto=¸÷Bth‹†°;Ãt^9uZ‹†¸;Ãt9uPèÒºÿÿÿ¶¼èC(YY‹†´;Ãt9uP豺ÿÿÿ¶¼è¹'YYÿ¶°è™ºÿÿÿ¶¼èŽºÿÿYY‹†À;ÃtD9u@‹†ÄPèmºÿÿ‹†Ì¿€+ÇPèZºÿÿ‹†Ð+ÇPèLºÿÿÿ¶ÀèAºÿÿƒÄ‹†Ô=XõBt9˜´uPè¿#ÿ¶ÔèºÿÿYY~PÇEøTõBt;Ãt 9uPèó¹ÿÿY9_üt‹G;Ãt 9uPèܹÿÿYƒÇÿMuÇVè͹ÿÿY_^[]ËÿU‹ìW‹} …ÿt;E…Àt4V0;÷t(W‰8èjýÿÿY…ötVèîýÿÿƒ>YuþÀöBtVèsþÿÿY‹Ç^ë3À_]Ãj hh AèMÏÿÿèFÚÿÿ‹ð¡PõB…Fpt"ƒ~ltè/Úÿÿ‹pl…öuj èµ´ÿÿY‹Æè`ÏÿÿÃj èŠÕÿÿYƒeüÿ5˜÷BƒÆlVèYÿÿÿYY‰EäÇEüþÿÿÿèë¾j èƒÔÿÿY‹uäËÿU‹ìQV‹u Vè}Ìÿÿ‰E ‹F Y¨‚uèoÎÿÿÇ ƒN ƒÈÿé/¨@t
èTÎÿÿÇ"ëãS3Û¨t‰^¨„‡‹Nƒàþ‰‰F ‹F ƒàïƒÈ‰F ‰^‰]ü© u,èr¯ÿÿƒÀ ;ðt èf¯ÿÿƒÀ@;ðu
ÿu èôôÿÿY…ÀuVèF(Y÷F W„€F>HN+øI‰N;û~WPÿu èü
ƒÄ ‰EüëMƒÈ ‰F ƒÈÿëy‹M ƒùÿtƒùþt‹Áƒà‹ÑÁúÁàCë¸0íBö@ tjSSQèá&#ƒÄƒøÿt%FŠMˆë3ÿGWEPÿu è
ƒÄ ‰Eü9}üt ƒN ƒÈÿë‹E%ÿ_[^ÉáíBƒÈ3É9¼C”Á‹ÁÃÌÌÌÌÌÌ‹L$÷Át$ŠƒÁ„ÀtN÷Á¤$¤$ºÿþþ~Ѓðÿ3ƒÁ©tè‹Aü„Àt2„ät$©ÿt©ÿtëÍAÿ‹L$+ÁÃAþ‹L$+ÁÃAý‹L$+ÁÃAü‹L$+ÁËÿU‹ìƒìSVu 3ÛW‹};óu;ûv
E;Ãt3Àë{‹E;ÃtƒÿÿÿÿÿvèEÌÿÿj^‰0èéËÿÿ‹ÆëVÿuMðè »ÿÿ‹Eð9Xf‹E¹ÿf;Áv6;ót;ûv WSVè¸ÿÿƒÄ èúËÿÿÇ*èïËÿÿ‹8]üt‹Møƒapý_^[ÉÃ;ót&;ûw èÏËÿÿj"^‰0èsËÿÿ8]üt…‹Eøƒ`pýéyÿÿÿˆ‹E;ÃtÇ8]ü„<ÿÿÿ‹Eøƒ`pýé0ÿÿÿM QSWVjMQS‰] ÿpÿ`à@;Ãt9] …jÿÿÿ‹M;Ët½‰ë¹ÿ¼à@ƒøz…Pÿÿÿ;ó„sÿÿÿ;û†kÿÿÿWSVè8·ÿÿƒÄ é[ÿÿÿ‹ÿU‹ìjÿuÿuÿu ÿuè“þÿÿƒÄ]ËÿU‹ìƒìÿu MðèÞ¹ÿÿ¶E‹Mð‹‰È·A%€}üt‹MøƒapýÉËÿU‹ìjÿuè¹ÿÿÿYY]ÃÌÌÌÌÌÌÌÌV‹D$ Àu(‹L$‹D$ 3Ò÷ñ‹Ø‹D$÷ñ‹ð‹Ã÷d$‹È‹Æ÷d$ÑëG‹È‹\$‹T$ ‹D$ÑéÑÛÑêÑØ Éuô÷ó‹ð÷d$‹È‹D$÷æÑr;T$ wr;D$v N+D$T$3Û+D$T$ ÷Ú÷؃ڋʋӋًȋÆ^ƒ%äCÃÌÌÌSVWT$D$L$URPQQh@‡@dÿ5¡íB3ĉD$d‰%D$0XL$,3p ƒþþt;T$4ƒúþt;òv.4v ‰H ƒ{uÌh‹Cèr%¹‹Cè„%ë°dƒÄ_^[ËL$÷A¸t3D$H3ÈèUµÿÿUhÿp ÿpÿpè>ÿÿÿƒÄ ]D$‹T$¸ÃU‹L$‹)ÿqÿqÿq(èÿÿÿƒÄ UVWS‹ê3À3Û3Ò3ö3ÿÿÑ[_^]Ëê‹ñ‹ÁjèÏ$3À3Û3É3Ò3ÿÿæU‹ìSVWjRhæ‡@Qè¾M_^[]ÃUl$RQÿt$èµþÿÿƒÄ ‹ÿU‹ì‹M…Étjà3ÒX÷ñ;E sè°ÈÿÿÇ 3À]ïM V‹ñ…öuF3ÀƒþàwVjÿ5hCÿ¸à@…Àu2ƒ=lCtVèèÑÿÿY…ÀuÒ‹E…ÀtÇ 3Àë
‹M…ÉtÇ ^]ËÿU‹ìƒ}u ÿu è²®ÿÿY]ÃV‹u …öu
ÿuè—²ÿÿY3ÀëMWë0…öuFVÿujÿ5hCÿ4à@‹ø…ÿu^9lCt@VèiÑÿÿY…ÀtƒþàvËVèYÑÿÿYèÜÇÿÿÇ 3À_^]ÃèËÇÿÿ‹ðÿ¼à@Pè{ÇÿÿY‰ëâè³Çÿÿ‹ðÿ¼à@PècÇÿÿY‰‹ÇëÊ‹ÿU‹ìV‹uWƒÏÿ…öuèˆÇÿÿÇè+Çÿÿ ÇëDöF ƒt8Vè(ËÿÿV‹øè­$Vè]ÅÿÿPèÝ#ƒÄ…ÀyƒÏÿë‹F…Àt Pè²±ÿÿƒfYƒf ‹Ç_^]Ãj hˆ AèvÇÿÿƒMäÿ3À‹u…ö•À…ÀuèÇÿÿÇè±ÆÿÿƒÈÿë
öF @t
ƒf ‹Eäè‚ÇÿÿÃVè©ÿÿYƒeüVè<ÿÿÿY‰EäÇEüþÿÿÿèëÔ‹uVèj©ÿÿYÃÌ‹ÿU‹ì¸äèž%¡íB3ʼnEü‹E V‹uW3ÿ‰…4åÿÿ‰½8åÿÿ‰½0åÿÿ9}u3Àé®;Çuè…Æÿÿ‰8èkÆÿÿÇèÆÿÿƒÈÿé‹‹ÆÁø‹þSCƒçÁçŠL8$ÉÐù‰$åÿÿˆ?åÿÿ€ùt€ùu'‹M÷ÑöÁuè'Æÿÿƒ è ÆÿÿÇè¯ÅÿÿéöD8 tjjjVèÕƒÄVèÞìÿÿY…À„™öD„ŒèÑÿÿ‹@l3É9H… åÿÿ”ÁP‹ÿ4‹ñÿ,à@3É;Á„`;ñt 8?åÿÿ„Pÿ0à@4åÿÿ‰… åÿÿ3À‰…,åÿÿ9E†#‰…@åÿÿŠ…?åÿÿ„À…gŠ ‹µ$åÿÿ3À€ù
”À‰…åÿÿ‹ǃx8tŠP4ˆUôˆMõƒ`8jEôPëK¾ÁPè=úÿÿY…Àt:‹4åÿÿ+ËM3À@;Ȇ¥j…DåÿÿSPè¾#ƒÄ ƒøÿ„’Cÿ…@åÿÿëjS…DåÿÿPèš#ƒÄ ƒøÿ„n3ÀPPjMôQjDåÿÿQPÿµ åÿÿCÿ…@åÿÿÿ`à@‹ð…ö„=j…,åÿÿPVEôP‹…$åÿÿ‹ÿ4ÿxà@…À
‹…@åÿÿ‹0åÿÿÁ‰…8åÿÿ9µ,åÿÿŒöƒ½åÿÿ„Íj…,åÿÿPjEôP‹…$åÿÿ‹ÆEô
ÿ4ÿxà@…À„±ƒ½,åÿÿŒ°ÿ…0åÿÿÿ…8åÿÿéƒ<t<u!·33Ƀþ
”ÁƒÃƒ…@åÿÿ‰µDåÿÿ‰åÿÿ<t<uRÿµDåÿÿè+!Yf;…Dåÿÿ…Iƒ…8åÿÿƒ½åÿÿt)j
XP‰…Dåÿÿèþ Yf;…Dåÿÿÿ…8åÿÿÿ…0åÿÿ‹E9…@åÿÿ‚ùýÿÿéŠÿ…8åÿÿˆT4‹‰D8éï3É‹öD8„¡€½?åÿÿDåÿÿ…¨4åÿÿ9M†ý‹Ë3ö+4åÿÿ…Håÿÿ;Ms&ŠCA‰ åÿÿ€ú
u ÿ…0åÿÿÆ
@Fˆ@FþÿrÕ‹ð…Håÿÿ+ðj…(åÿÿPV…HåÿÿP‹…$åÿÿ‹ÿ4ÿxà@…À„C‹…(åÿÿ…8åÿÿ;ÆŒ;‹Ã+…4åÿÿ;E‚lÿÿÿé%€½?åÿÿ…Í4åÿÿ9M†Hƒ¥@åÿÿ‹Ë+4åÿÿj…Håÿÿ^;MsC·ÞΉ åÿÿƒú
uµ0åÿÿj
[f‰ åÿÿƵ@åÿÿµ@åÿÿf‰ƽ@åÿÿþr¸‹ð…Håÿÿ+ðj…(åÿÿPV…HåÿÿP‹…$åÿÿ‹ÿ4ÿxà@…À„i‹…(åÿÿ…8åÿÿ;ÆŒa‹Ã+…4åÿÿ;E‚GÿÿÿéK‹…4åÿÿ‰…,åÿÿ9M†u,åÿÿƒ¥@åÿÿ+4åÿÿj…Hùÿÿ^;Ms;‹•,åÿÿ·µ,åÿÿ΃ú
uj
[f‰Æµ@åÿÿµ@åÿÿf‰ƽ@åÿÿ¨rÀ3öVVhU
ðëÿÿQHùÿÿ+Á™+ÂÑøP‹ÁPVhéýÿ`à@‹Ø;Þ„—j…(åÿÿP‹Ã+ÆP„5ðëÿÿP‹…$åÿÿ‹ÿ4ÿxà@…Àt µ(åÿÿ;ÞËë ÿ¼à@‰…Dåÿÿ;Þ\‹…,åÿÿ+…4åÿÿ‰…8åÿÿ;E ÿÿÿë?Q(åÿÿQÿuÿµ4åÿÿÿ48ÿxà@…Àt‹…(åÿÿƒ¥Dåÿÿ‰…8åÿÿë ÿ¼à@‰…Dåÿÿƒ½8åÿÿulƒ½Dåÿÿt-j^9µDåÿÿuè-ÀÿÿÇ è5Àÿÿ‰0ë?ÿµDåÿÿè9ÀÿÿYë1‹…$åÿÿ‹öD@t‹…4åÿÿ€8u3Àë$èí¿ÿÿÇèõ¿ÿÿƒ ƒÈÿë ‹…8åÿÿ+…0åÿÿ[‹Mü_3Í^è§«ÿÿÉÃjh¨ AèÀÿÿ‹]ƒûþu蹿ÿÿƒ èž¿ÿÿÇ ƒÈÿé”…Ûx;ðCrè’¿ÿÿƒ èw¿ÿÿÇ è¿ÿÿëÒ‹ÃÁø<…C‹óƒæÁæ¾D0ƒàtÆSèQYƒeüöD0tÿuÿu SènøÿÿƒÄ ‰Eäëè¿ÿÿÇ è%¿ÿÿƒ ƒMäÿÇEüþÿÿÿè ‹Eäè¿ÿÿË]Sè™YÃjhÈ Aè0¿ÿÿ‹]ƒûþuèÒ¾ÿÿÇ ƒÈÿé¡…Ûx;ðCrè³¾ÿÿÇ èV¾ÿÿëÚ‹ÃÁø<…C‹óƒæÁæ¾DƒàtÎSèYƒeüöDt1SèYPÿ(à@…Àu ÿ¼à@‰Eäëƒeäƒ}ätèY¾ÿÿ‹Mä‰è<¾ÿÿÇ ƒMäÿÇEüþÿÿÿè ‹Eäè´¾ÿÿË]SèÀYÃè§Åÿÿ…Àtjè©ÅÿÿYö ÷Btjh@jè¼ÿÿƒÄ jè£ÿÿÌ‹ÿU‹ì‹E…Àtƒè8ÝÝuPè4¨ÿÿY]ËÿU‹ìƒ}u诽ÿÿÇèR½ÿÿƒÈÿ]Ãÿujÿ5hCÿ$à@]Ãjèh£ÿÿYËÿU‹ìƒì$¡íB3ʼnEü‹ES‰Eà‹E VW‰EäèüÆÿÿƒeìƒ=ÀC‰Eèu}hàý@ÿœà@‹Ø…Û‹=¨à@hÔý@Sÿ×…À„ú‹5ìà@PÿÖhÄý@S£ÀCÿ×PÿÖh°ý@S£ÄCÿ×PÿÖh”ý@S£ÈCÿ×PÿÖ£ÐC…Àth|ý@Sÿ×PÿÖ£ÌC¡ÌC‹Mè‹5´à@;ÁtG9
ÐCt?PÿÖÿ5ÐC‹øÿÖ‹Ø…ÿt,…Ût(ÿ×…ÀtMÜQj MðQjPÿÓ…ÀtöEøu M ë3¡ÄC;Eèt)PÿÖ…Àt"ÿЉEì…Àt¡ÈC;EètPÿÖ…ÀtÿuìÿЉEìÿ5ÀCÿÖ…ÀtÿuÿuäÿuàÿuìÿÐë3À‹Mü_^3Í[èÿ§ÿÿÉËÿU‹ìV‹uW…öt‹} …ÿuèý»ÿÿj^‰0è¡»ÿÿ‹Æ_^]ËM…Éu3Àf‰ëÝ‹Öfƒ:tƒÂOuô…ÿtç+Ñ·f‰
ƒÁf…ÀtOuî3À…ÿuÂf‰è«»ÿÿj"Y‰‹ñ몋ÿU‹ì‹US]VW…Ûu…Òu9U u3À_^[]Ã…Òt‹} …ÿuèp»ÿÿj^‰0è»ÿÿ‹ÆëÝ…Ûu3Àf‰ëЋM…Éu3Àf‰ëԋƒûÿu‹ò+ñ·f‰ƒÁf…Àt'Ouîë"‹ñ+ò· f‰ƒÀf…ÉtOtKuë…Ûu3Éf‰…ÿ…yÿÿÿ3Àƒûÿu‹M jPf‰DJþXédÿÿÿf‰èáºÿÿj"Y‰‹ñéjÿÿÿ‹ÿU‹ì‹Ef‹ƒÀf…Éuõ+EÑøH]ËÿU‹ìV‹uW…öt‹} …ÿuè ºÿÿj^‰0èDºÿÿ‹Æ_^]ËE…Àuf‰ëß‹Ö+зf‰ ƒÀf…ÉtOuî3À…ÿuÔf‰è`ºÿÿj"Y‰‹ñ뼋ÿU‹ì‹M…Éxƒù~ ƒùu¡¤ûB]á¤ûB
¤ûB]Ãè(ºÿÿÇè˹ÿÿƒÈÿ]ÃÌÌÌÌÌÌÌÌÌU‹ìW‹}3ÀƒÉÿò®ƒÁ÷ÙƒïŠE ýò®ƒÇ8t3Àë‹Çü_ÉËÿU‹ìƒìÿu Mð讨ÿÿ‹Eðƒ¸¬~EðPjÿuèÂƒÄ ë‹€È‹M·Hƒà€}üt‹MøƒapýÉËÿU‹ìƒ=àCu‹E
ˆ÷B·Aƒà]Ãjÿuè…ÿÿÿYY]ËÿU‹ìƒìSVÿu Mèè-¨ÿÿ‹]¾;ÞsT‹M胹¬~EèPjSè7‹MèƒÄ ë
È·Xƒà…ÀtÌ飀}ôt‹Eðƒ`pý‹Ã霋E胸¬~1‰]Á}EèP‹E%ÿPè·íÿÿYY…ÀtŠEjˆEüˆ]ýÆEþ謸ÿÿÇ*3Ɉ]üÆEýA‹EèjÿpUøjRQMüQVÿpEèPè ƒÄ$…À„oÿÿÿƒø¶Eøt ¶MùÁà Á€}ôt‹Mðƒapý^[ÉËÿU‹ìƒ=àCu‹EH¿ƒùwƒÀ ]ÃjÿuèÃþÿÿYY]ËÿU‹ìƒì(¡íB3ʼnEüSV‹uWÿu} MÜèÛ¦ÿÿEÜP3ÛSSSSWEØPEðPèK$‰EìEðVP蜃Ä(öEìu+ƒøu8]ètEäƒ`pýjXë/ƒøu8]èt‹Eäƒ`pýjëèöEìuêöEìuÎ8]èt‹Eäƒ`pý3À‹Mü_^3Í[èb£ÿÿÉËÿU‹ìƒì(¡íB3ʼnEüSV‹uWÿu} MÜè3¦ÿÿEÜP3ÛSSSSWEØPEðPè£#‰EìEðVPèEƒÄ(öEìu+ƒøu8]ètEäƒ`pýjXë/ƒøu8]èt‹Eäƒ`pýjëèöEìuêöEìuÎ8]èt‹Eäƒ`pý3À‹Mü_^3Í[躢ÿÿÉÃÌÌÌU‹ìWV‹u ‹M‹}‹Á‹ÑÆ;þv‚ ù€rƒ=èCtWVƒçƒæ;þ^_ué¹Ôÿÿ÷ÇuÁéƒâƒùr)ó¥ÿ$•p›@‹Çºƒér ƒàÈÿ$…„š@ÿ$€›@ÿ$›@”š@Àš@äš@#ÑŠˆŠFˆGŠFÁéˆGƒÆƒÇƒùrÌó¥ÿ$•p›@I#ÑŠˆŠFÁéˆGƒÆƒÇƒùr¦ó¥ÿ$•p›@#ÑŠˆƒÆÁéƒÇƒùrˆó¥ÿ$•p›@Ig@T@L@D@<@4@,@$@‹DŽä‰Dä‹DŽè‰Dè‹DŽì‰Dì‹DŽð‰Dð‹DŽô‰Dô‹DŽø‰Dø‹DŽü‰Düðøÿ$•p›@‹ÿ€›@ˆ›@”›@¨›@‹E^_Éʈ‹E^_ÉʈŠFˆG‹E^_ÉÃIŠˆŠFˆGŠFˆG‹E^_ÉÃt1ü|9ü÷Çu$Áéƒâƒùr
ýó¥üÿ$• @‹ÿ÷Ùÿ$¼œ@I‹Çºƒùr ƒà+Èÿ$…œ@ÿ$ @ œ@Dœ@lœ@ŠF#шGƒîÁéƒïƒùr²ýó¥üÿ$• @IŠF#шGŠFÁéˆGƒîƒïƒùrˆýó¥üÿ$• @ŠF#шGŠFˆGŠFÁéˆGƒîƒïƒù‚Vÿÿÿýó¥üÿ$• @IÀœ@Èœ@М@Øœ@àœ@èœ@ðœ@@‹DމD‹DމD‹DމD‹DމD‹DŽ ‰D ‹DމD‹DމDðøÿ$• @‹ÿ@$@4@H@E^_ÉÊFˆGE^_ÉÃIŠFˆGŠFˆGE^_ÉÊFˆGŠFˆGŠFˆG‹E^_ÉËÿU‹ì‹UVW…Òt‹} …ÿuèT³ÿÿj^‰0èø²ÿÿ‹Æë3‹E…Àuˆëâ‹ò+ðŠˆ @„ÉtOuó…ÿuÆè³ÿÿj"Y‰‹ñëÆ3À_^]ËÿU‹ì‹MS‹Y V‹u3À;ðuèô²ÿÿj^‰0蘲ÿÿ‹Æéƒ9E vå‹Uˆ;Ð~‹Â@9E wèȲÿÿj"Y‰‹ñëÐW~Æ0‹Ç…Ò~Š „Ét¾ÉCëj0Yˆ@J…Òé‹MÆ…Òx€;5|
ëÆ0H€89t÷þ€>1uÿAëWè`åÿÿ@PWVè—ûÿÿƒÄ3À_^[]ËÿU‹ìQ‹M ·AS‹ØÁë%Vºÿ#ÚW‰E ‹A·û¾€%ÿÿ‰uü…ÿt;útÃ<ë(¿ÿë$3Ò;Âu;ÊuEfM ‰PëBÃ<‰Uü·û‹ÑÁêÁà Ð Uü‹EÁá ë‹ÙÁëÒ ÓÉÇÿÿ‰P…Ötä‹M Ï_^f‰H[ÉËÿU‹ìƒì0¡íB3ʼnEü‹ES]V‰EÜWEPEÐPè"ÿÿÿYYEàPjjƒì uЋü¥¥f¥è¦$‹u܉C¾E≿Eà‰CEäPÿuVèÕýÿÿƒÄ$…Àu‹Mü_‰s ^‹Ã3Í[èÿÿÉÃ3ÀPPPPPèx°ÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌWVU3ÿ3í‹D$ À}GE‹T$÷Ø÷ڃ؉D$‰T$‹D$ À}G‹T$÷Ø÷ڃ؉D$‰T$ Àu(‹L$‹D$3Ò÷ñ‹Ø‹D$÷ñ‹ð‹Ã÷d$‹È‹Æ÷d$ÑëG‹Ø‹L$‹T$‹D$ÑëÑÙÑêÑØ Ûuô÷ñ‹ð÷d$‹È‹D$÷æÑr;T$wr;D$v N+D$T$3Û+D$T$My÷Ú÷؃ڋʋӋًȋÆOu÷Ú÷؃Ú]^_ÂÌ€ù@s€ù s­ÐÓêËÂ3Ò€áÓèÃ3À3ÒËÿU‹ì‹E‹M %ÿÿ÷ÿ#ÈV‹u÷Áàüðüt$…öt
jjèN-YY‰èܯÿÿj^‰0耯ÿÿ‹ÆëPÿu …öt è*-ëè!-YY3À^]ËÿU‹ìƒìÿuMðè}žÿÿ¶E ‹MôŠU„Tuƒ}t‹Mð‹‰È·A#Eë3À…Àt3À@€}üt‹MøƒapýÉËÿU‹ìjjÿujèšÿÿÿƒÄ]ËÿU‹ìƒì¡íB3ʼnEü‹US3ÛVW;Ó~‹E‹ÊI8t@;ËuöƒÉÿ‹Â+ÁH;Â}@‰E‰]ø9]$u E@‰E$5à@3À9](SSÿu•ÀÿuÅPÿu$ÿÖ‹ø‰}ð;ûu3ÀéR~Cjà3ÒX÷÷ƒør7D?=w膋Ä;ÃtÇÌÌë •ÿÿY;Ãt ÇÝ݃À‰Eôë‰]ô9]ôt¬Wÿuôÿuÿujÿu$ÿÖ…À„à‹5 à@SSWÿuôÿuÿu ÿÖ‰Eø;ÄÁ¹…Mt)‹E ;Ĭ9Eø£PÿuWÿuôÿuÿu ÿÖ鎋}ø;û~Bjà3ÒX÷÷ƒør6D?;ÁwèÌ‹ü;ûthÇÌ̃ÇëPèN”ÿÿY;Ãt ÇÝ݃À‹øë3ÿ;ût?ÿuøWÿuðÿuôÿuÿu ÿÖ…Àt"SS9] uSSëÿu ÿuÿuøWSÿu$ÿ`à@‰EøWèŸïÿÿYÿuôè–ïÿÿ‹EøYeä_^[‹Mü3ÍèG™ÿÿÉËÿU‹ìƒìÿuMðè+œÿÿÿu(Eðÿu$ÿu ÿuÿuÿuÿuÿu PèåýÿÿƒÄ$€}üt‹MøƒapýÉËÿU‹ìQQ¡íB3ʼnEüS3ÛVW‰]ø9]u E@‰E5à@3À9] SSÿu•ÀÿuÅPÿuÿÖ‹ø;ûu3Àë~<ÿðÿÿw4D?=wèŠ
‹Ä;ÃtÇÌÌë“ÿÿY;Ãt ÇÝ݃À‹Ø…Ûtº?PjSèv˜ÿÿƒÄ WSÿuÿujÿuÿÖ…ÀtÿuPSÿu ÿà@‰EøSèiîÿÿ‹EøYeì_^[‹Mü3Íè˜ÿÿÉËÿU‹ìƒìÿuMðèþšÿÿÿu$Eðÿuÿuÿuÿuÿu PèëþÿÿƒÄ€}üt‹MøƒapýÉËÿU‹ìV‹u…ö„cÿvèK–ÿÿÿvèC–ÿÿÿv è;–ÿÿÿvè
ÿ¼à@‹øë3ÿVèÈ‹ÆÁøCƒæÁæYÆD0…ÿt W讣ÿÿYƒÈÿë3À_^]Ãjh
AèÁ£ÿÿ‹]ƒûþuèv£ÿÿƒ è[£ÿÿÇ ƒÈÿé„…Ûx;ðCrèO£ÿÿƒ è4£ÿÿÇ è×¢ÿÿëÒ‹ÃÁø<…C‹óƒæÁæ¾D0ƒàtÆSèYƒeüöD0t SèÕþÿÿY‰Eäëèâ¢ÿÿÇ ƒMäÿÇEüþÿÿÿè ‹EäèZ£ÿÿË]SèfYËÿU‹ìV‹u‹F ¨ƒt¨tÿvèÿÿf ÷ûÿÿ3ÀY‰‰F‰F^]ËÿU‹ìQƒ=døBþuèî"¡døBƒøÿu¸ÿÿÉÃjMüQjMQPÿ à@…Àtâf‹EÉËÿU‹ìƒìSV‹u 3Û;ót9]t8uE;Ãt3Éf‰3À^[ÉÃÿuMðèëÿÿ‹Eð9Xu‹E;Ãtf‰8]ütEøƒ`pý3À@ëËEðPPèÇÖÿÿYY…Àt}‹Eð‹ˆ¬ƒù~%9M| 3Ò9]•ÂRÿuQVj ÿpÿà@…À‹EðuM;ˆ¬r 8^t‹€¬8]ü„fÿÿÿ‹MøƒapýéZÿÿÿèp¡ÿÿÇ*8]üt‹Eøƒ`pýƒÈÿé;ÿÿÿ3À9]•ÀPÿu‹EðjVj ÿpÿà@…À…:ÿÿÿ뺋ÿU‹ìjÿuÿu ÿuèÕþÿÿƒÄ]ÃÌÌÌÌÌÌQL$À÷Ð#È‹Ä%ðÿÿ;Èr
‹ÁY”‹$Ã-ëéÌÌ‹ÿU‹ì‹MS3ÛVW;Ë|[;
ðCsS‹ÁÁø‹ñƒæ<…CÁæöD0t6ƒ<0ÿt0ƒ= íBu+ËtItIuSjôëSjõëSjöÿà@ƒ ÿ3Àëèq ÿÿÇ èy ÿÿ‰ƒÈÿ_^[]ËÿU‹ì‹Eƒøþuè] ÿÿƒ èB ÿÿÇ ƒÈÿ]Ã…Àx;ðCrè9 ÿÿƒ è ÿÿÇ èÁŸÿÿëÕ‹ÈÁù CƒàÁàöDtÍ‹]Ãj h(
Aè8 ÿÿ‹}‹ÇÁø‹÷ƒæÁæ4…CÇEä3Û9^u5j
胦ÿÿY‰]ü9^uF PÿÐà@…Àu‰]äÿFÇEüþÿÿÿè09]ät‹ÇÁøƒçÁçCD8 Pÿ à@‹EäèùŸÿÿÃ3Û‹}j
èE¥ÿÿYËÿU‹ì‹E‹ÈƒàÁù CÁàD Pÿ¤à@]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌQL$+ȃáÁÉ ÁYéúýÿÿQL$+ȃáÁÉ ÁYéäýÿÿ‹ÿU‹ìƒìSÿuMèè¾ÿÿ‹]C=w‹E苀ȷXëu‰]Á}EèP‹E%ÿPè˜ÓÿÿYY…ÀtŠEjˆEøˆ]ùÆEú
3Ɉ]øÆEùAEèjÿpÿpEüPQEøPEèjPè7òÿÿƒÄ …Àu8Eôt‹Eðƒ`pý3Àë·Eü#E €}ôt‹Mðƒapý[ÉËÿU‹ìƒì8¡íB3ʼnEü‹E‹M ‰MÌ·H
S‹Ùá‰MÈ‹H‰Mð‹H·ãÿëÿ?ÁàW‰Mô‰EøûÀÿÿu'3Û3À9\…ðu
@ƒø|ô3Àé˜}ð««j«X鈃eÜV}䥥¥‹=<øBOG™ƒâÂÁøW ]Ô‰EØyJƒÊàBt…ðj3ÀY+Ê@Óà‰MÐ…‹E؃ÊÿÓâ÷Ò…T…ðëƒ|…ðu@ƒø|óën‹Ç™jY#ÑÂÁøç€yOƒÏàGƒeÜ+Ï3ÒBÓâL…ð‹9ú‰}à‹99}àr"9Uàë…Ét+ƒeÜL…ð‹z‰}à;úrƒÿsÇEÜH‹Uà‰‹MÜyщMÜ‹MЃÈÿÓàjY!‹EØ@;Á}
|…ð+È3Àó«ƒ}ÜtC¡8øB‹È+
<øB;Ù}
}ð«««é  +EÔuä‹È}𥙃âÂ¥‹ÑÁøâ€¥yJƒÊàBƒe؃eàƒÏÿ‹ÊÓçÇEÜ )UÜ÷׋]à\ð‹3‹Î#ωMÔ‹ÊÓî‹MÜ u؉3‹uÔÓæÿEàƒ}à‰uØ|Ó‹ðjÁæMøZ+Î;Ð|‹1‰t•ðëƒd•ðƒéJyé‹5<øBNF™ƒâÂÁøV EÐyJƒÊàBjY+Ê3ÒBÓâ\…ð‰MÔ…„‚ƒÊÿÓâ÷Ò…T…ðëƒ|…ðu@ƒø|óëf‹Æ™jY#ÑÂÁøæ€yNƒÎàFƒeØ3Ò+ÎBÓâL…ð‹1<;þr;úsÇE؉9‹MØë…ÉtL…ð‹r3ÿ;òrƒþs3ÿG‰1‹ÏHyÞ‹MÔƒÈÿÓà!‹EÐ@ƒø}
jY|…ð+È3Àó«‹
@øBA™ƒâÂQÁøâ€yJƒÊàBƒe؃eàƒÏÿ‹ÊÓçÇEÜ )UÜ÷׋]à\ð‹3‹Î#ωMÔ‹ÊÓî‹MÜ u؉3‹uÔÓæÿEàƒ}à‰uØ|Ó‹ðjÁæMøZ+Î;Ð|‹1‰t•ðëƒd•ðƒéJyéj3ÛXéS
@øB;4øBŒ©}ð«««€‹Á™ƒâ‹ÑÁøâ€yJƒÊàBƒe؃eàƒÏÿ‹ÊÓçÇEÜ )UÜ÷׋]à\ð‹3‹Î#ωMÔ‹ÊÓî‹MÜ u؉3‹uÔÓæÿEàƒ}à‰uØ|Ó‹ðjÁæMøZ+Î;Ð|‹1‰t•ðëƒd•ðƒéJyé‹HøB4øB3À@é˜HøBeðÿÿÿ‹Á™ƒâ‹ÑÁøâ€yJƒÊàBƒe؃eàƒÎÿ‹ÊÓæÇEÜ )UÜ÷Ö‹Mà‹|ð‹Ï#ΉMÔ‹ÊÓï‹Mà }؉|ð‹}Ô‹MÜÓçÿEàƒ}à‰}Ø|ЋðjÁæMøZ+Î;Ð|‹1‰t•ðëƒd•ðƒéJyé3À^jY+
@øBÓã‹MÈ÷ÙÉá Ù‹
DøB ]ðƒù@u
MÌ‹Uô‰Yë
ƒù u‹M̉‹Mü_3Í[èÒ„ÿÿÉËÿU‹ìƒì8¡íB3ʼnEü‹E‹M ‰MÌ·H
S‹Ùá‰MÈ‹H‰Mð‹H·ãÿëÿ?ÁàW‰Mô‰EøûÀÿÿu'3Û3À9\…ðu
@ƒø|ô3Àé˜}ð««j«X鈃eÜV}䥥¥‹=TøBOG™ƒâÂÁøW ]Ô‰EØyJƒÊàBt…ðj3ÀY+Ê@Óà‰MÐ…‹E؃ÊÿÓâ÷Ò…T…ðëƒ|…ðu@ƒø|óën‹Ç™jY#ÑÂÁøç€yOƒÏàGƒeÜ+Ï3ÒBÓâL…ð‹9ú‰}à‹99}àr"9Uàë…Ét+ƒeÜL…ð‹z‰}à;úrƒÿsÇEÜH‹Uà‰‹MÜyщMÜ‹MЃÈÿÓàjY!‹EØ@;Á}
|…ð+È3Àó«ƒ}ÜtC¡PøB‹È+
TøB;Ù}
}ð«««é  +EÔuä‹È}𥙃âÂ¥‹ÑÁøâ€¥yJƒÊàBƒe؃eàƒÏÿ‹ÊÓçÇEÜ )UÜ÷׋]à\ð‹3‹Î#ωMÔ‹ÊÓî‹MÜ u؉3‹uÔÓæÿEàƒ}à‰uØ|Ó‹ðjÁæMøZ+Î;Ð|‹1‰t•ðëƒd•ðƒéJyé‹5TøBNF™ƒâÂÁøV EÐyJƒÊàBjY+Ê3ÒBÓâ\…ð‰MÔ…„‚ƒÊÿÓâ÷Ò…T…ðëƒ|…ðu@ƒø|óëf‹Æ™jY#ÑÂÁøæ€yNƒÎàFƒeØ3Ò+ÎBÓâL…ð‹1<;þr;úsÇE؉9‹MØë…ÉtL…ð‹r3ÿ;òrƒþs3ÿG‰1‹ÏHyÞ‹MÔƒÈÿÓà!‹EÐ@ƒø}
jY|…ð+È3Àó«‹
XøBA™ƒâÂQÁøâ€yJƒÊàBƒe؃eàƒÏÿ‹ÊÓçÇEÜ )UÜ÷׋]à\ð‹3‹Î#ωMÔ‹ÊÓî‹MÜ u؉3‹uÔÓæÿEàƒ}à‰uØ|Ó‹ðjÁæMøZ+Î;Ð|‹1‰t•ðëƒd•ðƒéJyéj3ÛXéS
XøB;LøBŒ©}ð«««€‹Á™ƒâ‹ÑÁøâ€yJƒÊàBƒe؃eàƒÏÿ‹ÊÓçÇEÜ )UÜ÷׋]à\ð‹3‹Î#ωMÔ‹ÊÓî‹MÜ u؉3‹uÔÓæÿEàƒ}à‰uØ|Ó‹ðjÁæMøZ+Î;Ð|‹1‰t•ðëƒd•ðƒéJyé‹`øBLøB3À@é˜`øBeðÿÿÿ‹Á™ƒâ‹ÑÁøâ€yJƒÊàBƒe؃eàƒÎÿ‹ÊÓæÇEÜ )UÜ÷Ö‹Mà‹|ð‹Ï#ΉMÔ‹ÊÓï‹Mà }؉|ð‹}Ô‹MÜÓçÿEàƒ}à‰}Ø|ЋðjÁæMøZ+Î;Ð|‹1‰t•ðëƒd•ðƒéJyé3À^jY+
XøBÓã‹MÈ÷ÙÉá Ù‹
\øB ]ðƒù@u
MÌ‹Uô‰Yë
ƒù u‹M̉‹Mü_3Í[èÿÿÉËÿU‹ìƒì|¡íB3ʼnEü‹E3ÉV3ö‰Eˆ‹E FW‰E}à‰MŒ‰u˜‰M´‰M¨‰M¤‰M ‰Mœ‰M°‰M”9M$uèL“ÿÿÇèï’ÿÿ3Àé<U‰U¬Š< t < t<
t<
uBëëS³0ŠBƒù ÿ$âÃ@HÏ€ùwjYJëß‹M$‹ ‹‰¼ :ujYëɾÀƒè+tHHt
ƒè…|‹Îë°jYÇEŒë¤ƒeŒjYë›Hωu¨€ùv«‹M$‹ ‹‰¼ :ujë¯<+t"<-t:Ãt»<CŽ/<E~
,d<‡!jë‰Jj ë„HÏ€ù†_ÿÿÿ‹M$‹ ‹‰¼‹ :„aÿÿÿ:Äsÿÿÿ‹U¬é‰u¨ë<9ƒ}´s
ÿE´*ÈÿE°ŠB:Ã}â‹M$‹ ‹‰¼ :„hÿÿÿ<+tŽ<-tŠékÿÿÿƒ}´‰u¨‰u¤u&ëÿM°ŠB:Ãtöë<9Õƒ}´s ÿE´*ÈGÿM°ŠB:Ã}äë»*Éu¤< ‡nÿÿÿjé«þÿÿJþ‰M¬HÏ€ùwj é–þÿÿ¾Àƒè+t HHtƒè…=ÿÿÿjé‘þÿÿƒM˜ÿjYéQþÿÿjé~þÿÿ‰u ëŠB:Ãtù,1<v¸Jë&HÏ€ùv­:Ã뿃} tG¾Àƒè+Jÿ‰M¬tÄHHt´‹Ñƒ}¨‹E„ØjX9E´v€}÷|þE÷OÿE°‰E´ƒ}´†ÝëYj
YJƒù
…Ïýÿÿ뾉u 3Éë<9
¾ðL1ÐùP ŠB:Ã}ãë¹Q‰Mœë <9]ÿÿÿŠB:Ã}ñéQÿÿÿÿM´ÿE°O€?EÄPÿu´EàPèZEœ3ÒƒÄ 9U˜}÷ØE°9U uE9U¤u+E=P!=°ëÿÿŒ-¹€øBƒé`‰E¬;„è}
÷عàùB‰E¬ƒé`9Uu3Àf‰EÄ9U¬„Åë‹M„3Ò‹E¬Á}¬ƒÁTƒà‰M„;„œ ¸f9r‹ó}¸¥¥¥ÿMº]¸‹UÎ3À‰E°‰EÔ‰E؉EÜ·C
‹ð3uιÿ#Ñ#Áæ¿ÿ ‰u·Éf;׃ f;ǃ¿ý¿f;Ͼ¿?f;Îw
3À‰EȉEÄé
3öf;ÖuA÷EÌÿÿÿu9uÈu9uÄu 3Àf‰EÎéêf;Æu!A÷Cÿÿÿu9su93u‰ủuȉuÄéĉu˜}ØÇE¨‹E˜‹U¨À‰Uœ…Ò~RDĉE¤C‰E ‹E ‹U¤··ƒe´¯Â‹Wü4;òr;ðsÇE´ƒ}´‰wütfÿƒE¤ƒm ÿMœƒ}œ»ƒÇÿE˜ÿM¨ƒ}¨ÁÀf…É~7‹}Ü…ÿx+‹uØ‹EÔÑeÔÁè‹Öö ðÁê? ÂÁÿÿ‰u؉EÜf…ÉÎf…ÉMÁÿÿf…ÉyB‹Á÷Ø·ðÎöEÔtÿE°‹EÜ‹}Ø‹UØÑmÜÁàÑï ø‹EÔÁâÑè ÂN‰}؉EÔuÑ9u°tfƒMÔ¸f9EÔw‹UÔâÿÿúu4ƒ}Öÿu+ƒeÖƒ}ÚÿuƒeÚºÿÿf9UÞuf‰EÞAëfÿEÞëÿEÚëÿEÖ¸ÿf;Èr#3À3Éf9E‰EÈ”Á‰EÄIáÁ€ÿ‰MÌë;f‹EÖ Mf‰EÄ‹E؉EÆ‹E܉EÊf‰MÎë3Àf…ö”ÀƒeÈH%€ÿƒeĉẼ}¬…=ýÿÿ‹EÌ·MÄ‹uÆ‹UÊÁèë/ÇE”ë3ö¸ÿº€3ÉÇE”ëÇE”3É3À3Ò3ö‹}ˆ EŒf‰f‰G
‹E”‰w‰W[‹Mü_3Í^èØxÿÿÉÃIƽ@¾@c¾@”¾@Ù¾@¿@%¿@~¿@i¿@æ¿@Û¿@Š¿@‹ÿU‹ìƒìt¡íB3ʼnEü·E·U¹#ÁS‹]‰E AÿV#Ðfƒ} W‰]œÇEÐÌÌÌÌÇEÔÌÌÌÌÇEØÌÌû?ÇEŒtÆCÆC ‹u ‹}f…Òu7…ö…Ï…ÿ…Ç3Àf9M f‰•ÀþÈ$
 ˆCfÇC0ÆC3À@é f;Ð…—‹M 3À@f‰¸€;Èuƒ}t÷Á@uh˜AëS3ÀPPPPPè<‹ÿÿ3Òf9U tùÀu 9Uu-hAë;Èu"9UuhˆACjPè=ØÿÿƒÄ …Àu¸ÆCëh€ACjPè ØÿÿƒÄ …Àu›ÆC3Àék·Ê‹ÙiÉM‹ÆÁèÁëCkÀM í¼ìÁø·À3Éf‰Mà¿Ø¹€øBƒé`÷Û‰E´f‰Uê‰uæ‰}â‰M˜„œ…Ûy¸àùBƒè`÷Û‰E˜…Û„ƒƒE˜T‹ËÁûƒá„g M˜‹Á‰M¼¹f9r‹ð}Ä¥¥EÄ¥ÿMƉE¼3ɉM¸‰Mð‰Mô‰Mø·H
‹Ñ3Uê¾ÿâ‰U¨‹Uê#Ö#Î4·þ¾ÿf;Öƒ§f;΃ž¾ý¿f;þ¾¿?f;þw3ö‰uè‰uä‰uàéÒ3öf;ÖuG÷Eèÿÿÿu9uäu9uàu 3Àf‰Eêé¬f;ÎuG÷@ÿÿÿu 9pu90t´!u¬uôÇEÀM¬‹UÀɉU°…Ò~UL
àƒÀ‰M‰E”‹E·‹E”·‹Vü¯Èƒe¤
;Âr;ÁsÇE¤ƒ}¤‰FütfÿƒEƒm”ÿM°ƒ}°»‹E¼ƒÆÿE¬ÿMÀƒ}ÀÇÀf…ÿ~;÷Eø€u-‹Eô‹MðÑeð‹ÐÀÁé Á‰Eô‹EøÁêÀ ÂÇÿÿ‰Eøf…ÿÊf…ÿMÇÿÿf…ÿyB‹Ç÷Ø·ÀøöEðtÿE¸‹Mø‹uô‹UôÑmøÁáÑî ñ‹MðÁâÑé ÊH‰uô‰MðuÑ9E¸tfƒMð¸f9Eðw‹Mðáÿÿùu4ƒ}òÿu+ƒeòƒ}öÿuƒeö¹ÿÿf9Múuf‰EúGëfÿEúëÿEöëÿEò¸ÿf;ø‚§3À3Éf9E¨‰Eä”Á‰EàIáÁ€ÿ‰Mè3ö;Þ…}ýÿÿ‹MèÁéºÿ?¸ÿf;Ê‚Ÿ‹]ÚÿE´3Ò‰U°‰Uð‰Uô‰Uø‹UÚ3Ù#È#Ðã4
‰]¤·öf;ȃLf;ЃC¸ý¿f;ð‡5¸¿?f;ðwK3À‰Eä‰Eàé9f‹Eò }¨f‰Eà‹Eô‰Eâ‹Eø‰Eæf‰}êéZÿÿÿ3À3öf9u¨”ÀH%€ÿ‰Eèéaýÿÿ3Àf;ÈuF÷Eèÿÿÿu9Eäu9Eàu f‰EêéÚf;ÐuF÷EØÿÿÿu9EÔu 9EЄvÿÿÿ‰E¬}ôÇEÀ‹E¬‹MÀÀ‰M¸…É~KM؉M¨Dà‹M¨·· ƒe¼¯Ê‹Wü
;Úr;ÙsÇE¼ƒ}¼‰_ütfÿƒm¨ƒÀÿM¸ƒ}¸¿ƒÇÿE¬ÿMÀƒ}ÀÆÀf…ö~7‹}ø…ÿx+‹Eô‹MðÑeð‹ÐÀÁé Á‰EôÁê? ÂÆÿÿ‰Eøf…öÎf…öMÆÿÿf…öyB‹Æ÷Ø·ÀðöEðtÿE°‹Mø‹}ô‹UôÑmøÁáÑï ù‹MðÁâÑé ÊH‰}ô‰MðuÑ9E°tfƒMð¸f9Eðw‹Mðáÿÿùu4ƒ}òÿu+ƒeòƒ}öÿuƒeö¹ÿÿf9Múuf‰EúFëfÿEúëÿEöëÿEò¸ÿf;ðr#3À3Éf9E¤‰Eä”Á‰EàIáÁ€ÿ‰Mèë;f‹Eò u¤f‰Eà‹Eô‰Eâ‹Eø‰Eæf‰uêë3Àf…Û”ÀƒeäH%€ÿƒeà‰EèöE‹Uœ‹E´‹}f‰t0˜ø…ÿ)3Àf‰¸f9E fÇB0•ÀþÈ$
 ˆBÆBésùÿÿƒÿ~j_‹uèÁîîþ?3Àf‰EêÇE¼‹Eà‹]ä‹MäÑeàÁèÛ Ø‹EèÁéÀ ÁÿM¼‰]ä‰EèuØ…öy2÷Þæÿ~(‹Eè‹]ä‹MäÑmèÁàÑë Ø‹EàÁáÑè ÁN‰]ä‰Eà…öØGZ‰]À‰E´…À޵‹Uà‹Eä}Ä¥¥¥Ñeà‹}àÑeàÁê Ê‹Uè‹ðÁîÒ Ö‹Á4 Áè ‹UÄÁï È‹Eà ÷<;ør;úsF3Ò;Ærƒøs3ÒB‹ð…ÒtA0‰U¼;Ör;ÐsAMÌÁêÉ Ê4?‰uà‹u¼‰MèÁéö€Á0‹ÇÁè ðˆ CÿM´ƒ}´‰uäÆEëKÿÿÿŠCÿƒë<5}MÀëD€;9u Æ0K;]Àsò‹Eœ;]ÀsCfÿþ*Ø€ë¾ËˆXÆD‹EŒ‹Mü_^3Í[èêoÿÿÉÀ;0uK;Ùsö‹Eœ;ÙsÍ3Òf‰ºf9U Æ@•ÂþÊ€â
€Â ˆPÆ0Æ@é¡÷ÿÿ3ÀöÃt@öÃtƒÈöÃtƒÈöÃtƒÈöÃtƒÈ ÷ÃtƒÈ‹Ëº#ÊV¾t#ùt;Ît ;Êu
ë
ë
‹Ëát ùu Æë Â^÷Ãt
Ã3ÀöÂt¸€SVW»öÂt ÃöÂt
öÂt
öÂt
¿÷Ât Njʾ#Ît;Ït;Ët ;Îu
`ë
@ë
¹_#Ñ^[útút
;Ñu
ÃÈ@Ã
@€Ã‹ÿU‹ìƒìSVW›Ù}üf‹]ü3ÒöÃtjZöÃtƒÊöÃtƒÊöÃtƒÊöà tƒÊöÃtÊ·Ë‹Á¾ #Æ¿t$=t=t;Æu ×ëÊëÊ#ÏtùuÊëʷétÊ‹} ‹M‹Ç÷Ð#Â#Ï Á‰E „®‹Øèþÿÿ·À‰EøÙmø›Ù}ø‹]ø3ÒöÃtjZöÃtƒÊöÃtƒÊöÃtƒÊöà tƒÊöÃtÊ·Ë‹Á#Æt(=t=t ;ÆuÊëÊëÊátùuÊëÊ÷ÃtʉU ‹Â3ö95èCç‰}ì®]ð‹Eð„ÀyjtƒÎ©tƒÎ©tƒÎ©tƒÎ©t΋Ȼ`#Ët*ù tù@t ;ËuÎëÎëο@€#ǃè@tt
ƒè@uÎëÎë΋Eì‹Ð#E÷Ò#Ö Ð;Öu‹Æé°èýÿÿP‰EôèöY®]ô‹Mô3Ò„ÉyjZ÷ÁtƒÊ÷ÁtƒÊ÷ÁtƒÊ÷ÁtƒÊ¾…ÎtÊ‹Á#Ãt$= t=@t ;ÃuÊë
Êë Ö#σé@téÀt
ƒé@uÊëÊëʋ‹È3M E ÷Át
€_^[ÉÃ3ÀPPjPjh@h Aÿà@£døBádøBƒøÿt ƒøþtPÿà@ÃU‹ìV3ÀPPPPPPPPU IŠ
Àt ƒÂ«$ëñ‹uƒÉÿIƒÁŠ
Àt ƒÆ£$sî‹ÁƒÄ ^ÉÃÌÌÌÌÌÌÌÌÌÌ‹T$‹L$÷Âu<:u.
Àt&:au%
ätÁè:Au
Àt:auƒÁƒÂ
äuÒ‹ÿ3ÀÃÀÑàƒÀÃ÷ÂtŠƒÂ:uçƒÁ
ÀtÜ÷Ât¤f‹ƒÂ:
ÀtÆ:a
ät½ƒÁëˆÌÌÌÌÌÌÌÌU‹ìV3ÀPPPPPPPPU IŠ
Àt ƒÂ«$ëñ‹u‹ÿŠ
Àt ƒÆ£$sñFÿƒÄ ^ÉËÿU‹ìƒì‹ES3ÛVWÇEüN@‰X‰X9] †E‰]‹ð}襥¥‹Ñ< Áê  Ê‹Uƒe‹ó‹Ù‰}øÁîÒ Ö‹uøÉÁï Ï‹ù‰Mø ‹UèöÁë ËÖ‰0‰x‰H;Ör;UèsÇEƒ}t'uøƒe~;þrƒÿsÇEƒ}‰xtA‰Huìƒe7;ßr;ÞsÇEƒ}‰XtA‰HMðƒeø‹ûÉ‹òÁï ÏÁîÛÒ Þ‰H‰Mô‰M‹M‰X¾1 2‰uè;Êr;ÎsÇEøƒ}øt$K3Ò;Ërƒùs3ÒB‹Ù‰H…Òt
‹MôA‰M‰HÿM ‹MÿEƒ} ‰X‰H‡Àþÿÿ3Û9Xu*‹PEüðÿ‹ú‹ñÁîÁâÁï ÖÁá‰P;ût܉x‹x÷Çu0‹HEüÿÿ‹ñ‹ÓÁîÿÁêÉ þÛ Ê‰‰H‰x÷ÇtÓf‹Mü_^f‰H
[ÉÃjhH
Aè|ÿÿ3À9èCtVöE@tH9TûBt@‰Eü®Uë.Eì‹=Àt
=Àt3ÀÃ3À@Ëeèƒ%TûBƒe¿®UÇEüþÿÿÿëƒe¿®Uèp|ÿÿÃÌÌÌÌÌÌÌÌÌÌU‹ìWVS‹M ÉtM‹u} ·A³Z¶ IŠ&
äŠt'
Àt#ƒÆƒÇ:çr:ãwæ:Çr:ÃwÆ:àu ƒéuÑ3É:àt ¹ÿÿÿÿr÷Ù‹Á[^_ÉÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$ È‹L$ u ‹D$÷áÂS÷á‹Ø‹D$÷d$Ø‹D$÷áÓ[Âÿ%8à@,ÐÀ°¢~hXL8&üêÞÔÈ®˜ˆnT>$òäΪlbTF:*Vn˜¬ºÊÖæò<drœ¸Öêú"8&ðâÔÄ´¤tbN<* ú
â
Î
À
²
¦

ˆ
t
d
V
H
8
*


ü ì Ú Ê ¼ ¬ ž   p ` 62@˜_@p@é~@r@iÑ@ç2@©Miøøð
usage: tolua++ [options] input_file
Command line options are:
-v : print version information.
-o file : set output file; default is stdout.
-H file : create include file.
-n name : set package name; default is input file root name.
-p : parse only.
-P : parse and print structure information (for debug).
-S : disable support for c++ strings.
-1 : substract 1 to operator[] index (for compatibility with tolua5).
-L file : run lua file (with dofile()) before doing anything.
-D : disable automatic exporting of destructors for classes that have
constructors (for compatibility with tolua5)
-W : disable warnings for unsupported features (for compatibility
with tolua5)
-C : disable cleanup of included lua code (for easier debugging)
-E value[=value] : add extra values to the luastate
-t : export a list of types asociates with the C++ typeid name
-q : don't print warnings to the console
-h : print this message.
Should the input file be omitted, stdin is assumed;
in that case, the package name must be explicitly set.
%s (written by W. Celes, A. Manzur)
tolua++-1.0.92_extra_parameterstolua: unknown option '%s'
fqtCWDL1SHnoPpflagsTOLUA_LUA_VERSIONLua 5.1TOLUA_VERSION__index.get__newindex.set.self.geti.setiAttempt to call a non-callable object..callAttempt to perform operation on an invalid operand.add.sub.mul.div.lt.le.eq.collectortolua_gc_event__gc__call__eq__le__lt__div__mul__sub__addtolua_superclass table[undefined][no object]%s
value is '%s'; '%s' expected.
%s
value is array of '%s'; array of '%s' expected.
%s
argument #%d is '%s'; '%s' expected.
%s
argument #%d is array of '%s'; array of '%s' expected.
.c_instancev__modetolua_uboxtolua_commonclasstolua_gcInvalid argument #1 to setpeer: userdata expected.getpeersetpeerinheritcastreleaseownershiptakeownershiptypetoluatolua_openedtolua: embedded Lua code 23tolua embedded: src/bin/lua/doit.luatolua embedded: src/bin/lua/clean.luatolua embedded: src/bin/lua/class.luatolua embedded: src/bin/lua/template_class.luatolua embedded: src/bin/lua/operator.luatolua embedded: src/bin/lua/function.luatolua embedded: src/bin/lua/array.luatolua embedded: src/bin/lua/variable.luatolua embedded: src/bin/lua/declaration.luatolua embedded: src/bin/lua/enumerate.luatolua embedded: src/bin/lua/define.luatolua embedded: src/bin/lua/namespace.luatolua embedded: src/bin/lua/module.luatolua embedded: src/bin/lua/package.luatolua embedded: src/bin/lua/container.luatolua embedded: src/bin/lua/typedef.luatolua embedded: src/bin/lua/code.luatolua embedded: src/bin/lua/verbatim.luatolua embedded: src/bin/lua/feature.luatolua embedded: src/bin/lua/basic.luatolua embedded: src/bin/lua/compat.luatolua embedded: src/bin/lua/compat-5.1.luaCorExitProcessmscoree.dll07@(null)(null)EEE50P( 8PX700WP `h````xpxxxxKERNEL32.DLLFlsFreeFlsSetValueFlsGetValueFlsAllocruntime error
TLOSS error
SING error
DOMAIN error
R6033
- Attempt to use MSIL code from this assembly during native code initialization
This indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain.
R6032
- not enough space for locale information
R6031
- Attempt to initialize the CRT more than once.
This indicates a bug in your application.
R6030
- CRT not initialized
R6028
- unable to initialize heap
R6027
- not enough space for lowio initialization
R6026
- not enough space for stdio initialization
R6025
- pure virtual function call
R6024
- not enough space for _onexit/atexit table
R6019
- unable to open console device
R6018
- unexpected heap error
R6017
- unexpected multithread lock error
R6016
- not enough space for thread data
R6010
- abort() has been called
R6009
- not enough space for environment
R6008
- not enough space for arguments
R6002
- floating point support not loaded
P÷@øö@  ö@
Xö@ö@ õ@Xõ@õ@ô@@ô@Ðó@`ó@ó@Ðò@ò@  ñ@!°ï@xŒï@ypï@zTï@üLï@ÿ,ï@Microsoft Visual C++ Runtime Library
...<program name unknown>Runtime Error!
Program: e+000pCÈCÀ ÀÀÀŽÀÀÀÀÀÀ´ÀµÀ HH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSunHH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSun€€†€†€†‚€EEE………00€P€ˆ('8PW€700PPˆ (€ˆ€€`h`hhhxppwppGetProcessWindowStationGetUserObjectInformationWGetLastActivePopupGetActiveWindowMessageBoxWUSER32.DLL ((((( H h(((( H H‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~1#QNAN1#INF1#IND1#SNANCONOUT$HíBpARSDS†ÄoCpíA  ¦R²ü`ËD:\my_projects\IGAD\Year2\tolua++-1.0.93\win32\vc7\withLua51_Release\toluapp.pdb€Q@‡ «þÿÿÿÔÿÿÿþÿÿÿ&2@þÿÿÿÀÿÿÿþÿÿÿS6@þÿÿÿÌÿÿÿþÿÿÿ–>@ª>@þÿÿÿÐÿÿÿþÿÿÿT@þÿÿÿÌÿÿÿþÿÿÿ V@×U@þÿÿÿÔÿÿÿþÿÿÿŽW@þÿÿÿØÿÿÿþÿÿÿêW@îW@þÿÿÿÀÿÿÿþÿÿÿ×Y@þÿÿÿØÿÿÿþÿÿÿ[@þÿÿÿœ[@þÿÿÿØÿÿÿþÿÿÿO]@þÿÿÿ[]@þÿÿÿÔÿÿÿþÿÿÿÿ_@þÿÿÿØÿÿÿþÿÿÿ«a@¾a@þÿÿÿÔÿÿÿþÿÿÿÞz@þÿÿÿÌÿÿÿþÿÿÿ°~@þÿÿÿÔÿÿÿþÿÿÿ4‚@þÿÿÿÔÿÿÿþÿÿÿŠ@þÿÿÿÐÿÿÿþÿÿÿÙ‘@þÿÿÿÐÿÿÿþÿÿÿ²’@þÿÿÿÌÿÿÿþÿÿÿ «@þÿÿÿÐÿÿÿþÿÿÿ ®@þÿÿÿÔÿÿÿþÿÿÿm±@þÿÿÿØÿÿÿþÿÿÿ±Ô@ÍÔ@  Já 
Þà,ÐÀ°¢~hXL8&üêÞÔÈ®˜ˆnT>$òäΪlbTF:*Vn˜¬ºÊÖæò<drœ¸Öêú"8&ðâÔÄ´¤tbN<* ú
â
Î
À
²
¦

ˆ
t
d
V
H
8
*


ü ì Ú Ê ¼ ¬ ž   p ` hlua_settableVlua_pushstringilua_settop^lua_rawsetiLlua_objlen6lua_getfield?lua_gettopXlua_pushvalue/lua_createtabledlua_setfieldluaL_openlibsluaL_newstateAlua_insertclua_setfenvZlua_rawequal5lua_getfenvTlua_pushnil>lua_gettable<lua_getmetatable*lua_callBlua_iscfunctiontlua_type[lua_rawget]lua_rawsetglua_setmetatableRlua_pushlightuserdataslua_touserdataClua_isnumber_lua_removeElua_isuserdataNlua_pushbooleanOlua_pushcclosureSlua_pushlstringmlua_tocfunctionllua_toboolean-lua_concatDlua_isstringulua_typenameolua_tolstringluaL_error`lua_replaceluaL_newmetatable3lua_gc2lua_errorMlua_pcallluaL_loadbufferJlua_newuserdatalua5.1.dllîEnterCriticalSection9LeaveCriticalSectionEGetProcAddressGetModuleHandleWExitProcessÊDecodePointerËHeapAllocGetLastErrorÏHeapFreeGetCommandLineAÓHeapSetInformationoSetHandleCountdGetStdHandleãInitializeCriticalSectionAndSpinCountóGetFileTypecGetStartupInfoWÑDeleteCriticalSectionÓUnhandledExceptionFilter¥SetUnhandledExceptionFilterIsDebuggerPresentêEncodePointerÀTerminateProcessÀGetCurrentProcess²Sleep?LoadLibraryWÅTlsAllocÇTlsGetValueÈTlsSetValueÆTlsFreeïInterlockedIncrementsSetLastErrorÅGetCurrentThreadIdëInterlockedDecrement%WriteFileGetModuleFileNameWÍHeapCreateIsProcessorFeaturePresentGetModuleFileNameAaFreeEnvironmentStringsWWideCharToMultiByteÚGetEnvironmentStringsW§QueryPerformanceCounterGetTickCountÁGetCurrentProcessIdyGetSystemTimeAsFileTimerGetCPInfohGetACP7GetOEMCP
IsValidCodePageRtlUnwindÒHeapReAllocšGetConsoleCP¬GetConsoleModeWFlushFileBuffersÔHeapSize-LCMapStringWgMultiByteToWideChariGetStringTypeWfSetFilePointerRCloseHandle$WriteConsoleWSetStdHandleCreateFileWKERNEL32.dllif string.find(_VERSION, "5%.0") then
return
end
-- "loadfile"
local function pp_dofile(path)
local loaded = false
local getfile = function()
if loaded then
return
else
local file,err = io.open(path)
if not file then
error("error loading file "..path..": "..err)
end
local ret = file:read("*a")
file:close()
ret = string.gsub(ret, "%.%.%.%s*%)", "...) local arg = {n=select('#', ...), ...};")
loaded = true
return ret
end
end
local f = load(getfile, path)
if not f then
error("error loading file "..path)
end
return f()
end
old_dofile = dofile
dofile = pp_dofile
-- string.gsub
--[[
local ogsub = string.gsub
local function compgsub(a,b,c,d)
if type(c) == "function" then
local oc = c
c = function (...) return oc(...) or '' end
end
return ogsub(a,b,c,d)
end
string.repl = ogsub
--]]
--string.gsub = compgsub
-------------------------------------------------------------------
-- Real globals
-- _ALERT
-- _ERRORMESSAGE
-- _VERSION
-- _G
-- assert
-- error
-- metatable
-- next
-- print
-- require
-- tonumber
-- tostring
-- type
-- unpack
-------------------------------------------------------------------
-- collectgarbage
-- gcinfo
-- globals
-- call -> protect(f, err)
-- loadfile
-- loadstring
-- rawget
-- rawset
-- getargs = Main.getargs ??
rawtype = type
function do_ (f, err)
if not f then print(err); return end
local a,b = pcall(f)
if not a then print(b); return nil
else return b or true
end
end
function dostring(s) return do_(loadstring(s)) end
-- function dofile(s) return do_(loadfile(s)) end
-------------------------------------------------------------------
-- Table library
local tab = table
foreach = tab.foreach
foreachi = tab.foreachi
getn = tab.getn
tinsert = tab.insert
tremove = tab.remove
sort = tab.sort
-------------------------------------------------------------------
-- Debug library
local dbg = debug
getinfo = dbg.getinfo
getlocal = dbg.getlocal
setcallhook = function () error"`setcallhook' is deprecated" end
setlinehook = function () error"`setlinehook' is deprecated" end
setlocal = dbg.setlocal
-------------------------------------------------------------------
-- math library
local math = math
abs = math.abs
acos = function (x) return math.deg(math.acos(x)) end
asin = function (x) return math.deg(math.asin(x)) end
atan = function (x) return math.deg(math.atan(x)) end
atan2 = function (x,y) return math.deg(math.atan2(x,y)) end
ceil = math.ceil
cos = function (x) return math.cos(math.rad(x)) end
deg = math.deg
exp = math.exp
floor = math.floor
frexp = math.frexp
ldexp = math.ldexp
log = math.log
log10 = math.log10
max = math.max
min = math.min
mod = math.mod
PI = math.pi
--??? pow = math.pow
rad = math.rad
random = math.random
randomseed = math.randomseed
sin = function (x) return math.sin(math.rad(x)) end
sqrt = math.sqrt
tan = function (x) return math.tan(math.rad(x)) end
-------------------------------------------------------------------
-- string library
local str = string
strbyte = str.byte
strchar = str.char
strfind = str.find
format = str.format
gsub = str.gsub
strlen = str.len
strlower = str.lower
strrep = str.rep
strsub = str.sub
strupper = str.upper
-------------------------------------------------------------------
-- os library
clock = os.clock
date = os.date
difftime = os.difftime
execute = os.execute --?
exit = os.exit
getenv = os.getenv
remove = os.remove
rename = os.rename
setlocale = os.setlocale
time = os.time
tmpname = os.tmpname
-------------------------------------------------------------------
-- compatibility only
getglobal = function (n) return _G[n] end
setglobal = function (n,v) _G[n] = v end
-------------------------------------------------------------------
local io, tab = io, table
-- IO library (files)
_STDIN = io.stdin
_STDERR = io.stderr
_STDOUT = io.stdout
_INPUT = io.stdin
_OUTPUT = io.stdout
seek = io.stdin.seek -- sick ;-)
tmpfile = io.tmpfile
closefile = io.close
openfile = io.open
function flush (f)
if f then f:flush()
else _OUTPUT:flush()
end
end
function readfrom (name)
if name == nil then
local f, err, cod = io.close(_INPUT)
_INPUT = io.stdin
return f, err, cod
else
local f, err, cod = io.open(name, "r")
_INPUT = f or _INPUT
return f, err, cod
end
end
function writeto (name)
if name == nil then
local f, err, cod = io.close(_OUTPUT)
_OUTPUT = io.stdout
return f, err, cod
else
local f, err, cod = io.open(name, "w")
_OUTPUT = f or _OUTPUT
return f, err, cod
end
end
function appendto (name)
local f, err, cod = io.open(name, "a")
_OUTPUT = f or _OUTPUT
return f, err, cod
end
function read (...)
local f = _INPUT
if rawtype(arg[1]) == 'userdata' then
f = tab.remove(arg, 1)
end
return f:read(unpack(arg))
end
function write (...)
local f = _OUTPUT
if rawtype(arg[1]) == 'userdata' then
f = tab.remove(arg, 1)
end
return f:write(unpack(arg))
end -- tolua: basic utility functions
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- Last update: Apr 2003
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Basic C types and their corresponding Lua types
-- All occurrences of "char*" will be replaced by "_cstring",
-- and all occurrences of "void*" will be replaced by "_userdata"
_basic = {
['void'] = '',
['char'] = 'number',
['int'] = 'number',
['short'] = 'number',
['long'] = 'number',
['unsigned'] = 'number',
['float'] = 'number',
['double'] = 'number',
['_cstring'] = 'string',
['_userdata'] = 'userdata',
['char*'] = 'string',
['void*'] = 'userdata',
['bool'] = 'boolean',
['lua_Object'] = 'value',
['LUA_VALUE'] = 'value', -- for compatibility with tolua 4.0
['lua_State*'] = 'state',
['_lstate'] = 'state',
['lua_Function'] = 'value',
}
_basic_ctype = {
number = "lua_Number",
string = "const char*",
userdata = "void*",
boolean = "bool",
value = "int",
state = "lua_State*",
}
-- functions the are used to do a 'raw push' of basic types
_basic_raw_push = {}
-- List of user defined types
-- Each type corresponds to a variable name that stores its tag value.
_usertype = {}
-- List of types that have to be collected
_collect = {}
-- List of types
_global_types = {n=0}
_global_types_hash = {}
-- list of classes
_global_classes = {}
-- List of enum constants
_global_enums = {}
-- List of auto renaming
_renaming = {}
function appendrenaming (s)
local b,e,old,new = strfind(s,"%s*(.-)%s*@%s*(.-)%s*$")
if not b then
error("#Invalid renaming syntax; it should be of the form: pattern@pattern")
end
tinsert(_renaming,{old=old, new=new})
end
function applyrenaming (s)
for i=1,getn(_renaming) do
local m,n = gsub(s,_renaming[i].old,_renaming[i].new)
if n ~= 0 then
return m
end
end
return nil
end
-- Error handler
function tolua_error (s,f)
if _curr_code then
print("***curr code for error is "..tostring(_curr_code))
print(debug.traceback())
end
local out = _OUTPUT
_OUTPUT = _STDERR
if strsub(s,1,1) == '#' then
write("\n** tolua: "..strsub(s,2)..".\n\n")
if _curr_code then
local _,_,s = strfind(_curr_code,"^%s*(.-\n)") -- extract first line
if s==nil then s = _curr_code end
s = gsub(s,"_userdata","void*") -- return with 'void*'
s = gsub(s,"_cstring","char*") -- return with 'char*'
s = gsub(s,"_lstate","lua_State*") -- return with 'lua_State*'
write("Code being processed:\n"..s.."\n")
end
else
if not f then f = "(f is nil)" end
print("\n** tolua internal error: "..f..s..".\n\n")
return
end
_OUTPUT = out
end
function warning (msg)
if flags.q then return end
local out = _OUTPUT
_OUTPUT = _STDERR
write("\n** tolua warning: "..msg..".\n\n")
_OUTPUT = out
end
-- register an user defined type: returns full type
function regtype (t)
--if isbasic(t) then
-- return t
--end
local ft = findtype(t)
if not _usertype[ft] then
return appendusertype(t)
end
return ft
end
-- return type name: returns full type
function typevar(type)
if type == '' or type == 'void' then
return type
else
local ft = findtype(type)
if ft then
return ft
end
_usertype[type] = type
return type
end
end
-- check if basic type
function isbasic (type)
local t = gsub(type,'const ','')
local m,t = applytypedef('', t)
local b = _basic[t]
if b then
return b,_basic_ctype[b]
end
return nil
end
-- split string using a token
function split (s,t)
local l = {n=0}
local f = function (s)
l.n = l.n + 1
l[l.n] = s
return ""
end
local p = "%s*(.-)%s*"..t.."%s*"
s = gsub(s,"^%s+","")
s = gsub(s,"%s+$","")
s = gsub(s,p,f)
l.n = l.n + 1
l[l.n] = gsub(s,"(%s%s*)$","")
return l
end
-- splits a string using a pattern, considering the spacial cases of C code (templates, function parameters, etc)
-- pattern can't contain the '^' (as used to identify the begining of the line)
-- also strips whitespace
function split_c_tokens(s, pat)
s = string.gsub(s, "^%s*", "")
s = string.gsub(s, "%s*$", "")
local token_begin = 1
local token_end = 1
local ofs = 1
local ret = {n=0}
function add_token(ofs)
local t = string.sub(s, token_begin, ofs)
t = string.gsub(t, "^%s*", "")
t = string.gsub(t, "%s*$", "")
ret.n = ret.n + 1
ret[ret.n] = t
end
while ofs <= string.len(s) do
local sub = string.sub(s, ofs, -1)
local b,e = string.find(sub, "^"..pat)
if b then
add_token(ofs-1)
ofs = ofs+e
token_begin = ofs
else
local char = string.sub(s, ofs, ofs)
if char == "(" or char == "<" then
local block
if char == "(" then block = "^%b()" end
if char == "<" then block = "^%b<>" end
b,e = string.find(sub, block)
if not b then
-- unterminated block?
ofs = ofs+1
else
ofs = ofs + e
end
else
ofs = ofs+1
end
end
end
add_token(ofs)
--if ret.n == 0 then
-- ret.n=1
-- ret[1] = ""
--end
return ret
end
-- concatenate strings of a table
function concat (t,f,l,jstr)
jstr = jstr or " "
local s = ''
local i=f
while i<=l do
s = s..t[i]
i = i+1
if i <= l then s = s..jstr end
end
return s
end
-- concatenate all parameters, following output rules
function concatparam (line, ...)
local i=1
while i<=arg.n do
if _cont and not strfind(_cont,'[%(,"]') and
strfind(arg[i],"^[%a_~]") then
line = line .. ' '
end
line = line .. arg[i]
if arg[i] ~= '' then
_cont = strsub(arg[i],-1,-1)
end
i = i+1
end
if strfind(arg[arg.n],"[%/%)%;%{%}]$") then
_cont=nil line = line .. '\n'
end
return line
end
-- output line
function output (...)
local i=1
while i<=arg.n do
if _cont and not strfind(_cont,'[%(,"]') and
strfind(arg[i],"^[%a_~]") then
write(' ')
end
write(arg[i])
if arg[i] ~= '' then
_cont = strsub(arg[i],-1,-1)
end
i = i+1
end
if strfind(arg[arg.n],"[%/%)%;%{%}]$") then
_cont=nil write('\n')
end
end
function get_property_methods(ptype, name)
if get_property_methods_hook and get_property_methods_hook(ptype,name) then
return get_property_methods_hook(ptype, name)
end
if ptype == "default" then -- get_name, set_name
return "get_"..name, "set_"..name
end
if ptype == "qt" then -- name, setName
return name, "set"..string.upper(string.sub(name, 1, 1))..string.sub(name, 2, -1)
end
if ptype == "overload" then -- name, name
return name,name
end
return nil
end
-------------- the hooks
-- called right after processing the $[ichl]file directives,
-- right before processing anything else
-- takes the package object as the parameter
function preprocess_hook(p)
-- p.code has all the input code from the pkg
end
-- called for every $ifile directive
-- takes a table with a string called 'code' inside, the filename, and any extra arguments
-- passed to $ifile. no return value
function include_file_hook(t, filename, ...)
end
-- called after processing anything that's not code (like '$renaming', comments, etc)
-- and right before parsing the actual code.
-- takes the Package object with all the code on the 'code' key. no return value
function preparse_hook(package)
end
-- called before starting output
function pre_output_hook(package)
end
-- called after writing all the output.
-- takes the Package object
function post_output_hook(package)
end
-- called from 'get_property_methods' to get the methods to retrieve a property
-- according to its type
function get_property_methods_hook(property_type, name)
end
-- called from ClassContainer:doparse with the string being parsed
-- return nil, or a substring
function parser_hook(s)
return nil
end
-- called from classFunction:supcode, before the call to the function is output
function pre_call_hook(f)
end
-- called from classFunction:supcode, after the call to the function is output
function post_call_hook(f)
end
-- called before the register code is output
function pre_register_hook(package)
end
-- called to output an error message
function output_error_hook(...)
return string.format(...)
end
-- custom pushers
_push_functions = {}
_is_functions = {}
_to_functions = {}
_base_push_functions = {}
_base_is_functions = {}
_base_to_functions = {}
local function search_base(t, funcs)
local class = _global_classes[t]
while class do
if funcs[class.type] then
return funcs[class.type]
end
class = _global_classes[class.btype]
end
return nil
end
function get_push_function(t)
return _push_functions[t] or search_base(t, _base_push_functions) or "tolua_pushusertype"
end
function get_to_function(t)
return _to_functions[t] or search_base(t, _base_to_functions) or "tolua_tousertype"
end
function get_is_function(t)
return _is_functions[t] or search_base(t, _base_is_functions) or "tolua_isusertype"
end -- tolua: abstract feature class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Feature class
-- Represents the base class of all mapped feature.
classFeature = {
}
classFeature.__index = classFeature
-- write support code
function classFeature:supcode ()
end
-- output tag
function classFeature:decltype ()
end
-- register feature
function classFeature:register (pre)
end
-- translate verbatim
function classFeature:preamble ()
end
-- check if it is a variable
function classFeature:isvariable ()
return false
end
-- check if it requires collection
function classFeature:requirecollection (t)
return false
end
-- build names
function classFeature:buildnames ()
if self.name and self.name~='' then
local n = split(self.name,'@')
self.name = n[1]
self.name = string.gsub(self.name, ":%d*$", "")
if not n[2] then
n[2] = applyrenaming(n[1])
end
self.lname = n[2] or gsub(n[1],"%[.-%]","")
self.lname = string.gsub(self.lname, ":%d*$", "")
self.original_name = self.name
self.lname = clean_template(self.lname)
end
if not self.is_parameter then
self.name = getonlynamespace() .. self.name
end
local parent = classContainer.curr
if parent then
self.access = parent.curr_member_access
self.global_access = self:check_public_access()
else
end
end
function classFeature:check_public_access()
if type(self.global_access) == "boolean" then
return self.global_access
end
if self.access and self.access ~= 0 then
return false
end
local parent = classContainer.curr
while parent do
if parent.access and parent.access ~= 0 then
return false
end
parent = parent.prox
end
return true
end
function clean_template(t)
return string.gsub(t, "[<>:, %*]", "_")
end
-- check if feature is inside a container definition
-- it returns the container class name or nil.
function classFeature:incontainer (which)
if self.parent then
local parent = self.parent
while parent do
if parent.classtype == which then
return parent.name
end
parent = parent.parent
end
end
return nil
end
function classFeature:inclass ()
return self:incontainer('class')
end
function classFeature:inmodule ()
return self:incontainer('module')
end
function classFeature:innamespace ()
return self:incontainer('namespace')
end
-- return C binding function name based on name
-- the client specifies a prefix
function classFeature:cfuncname (n)
if self.parent then
n = self.parent:cfuncname(n)
end
local fname = self.lname
if not fname or fname == '' then
fname = self.name
end
n = string.gsub(n..'_'.. (fname), "[<>:, \.%*&]", "_")
return n
end -- tolua: verbatim class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: verbatim.lua,v 1.3 2000/01/24 20:41:16 celes Exp $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Verbatim class
-- Represents a line translated directed to the binding file.
-- The following filds are stored:
-- line = line text
classVerbatim = {
line = '',
cond = nil, -- condition: where to generate the code (s=suport, r=register)
}
classVerbatim.__index = classVerbatim
setmetatable(classVerbatim,classFeature)
-- preamble verbatim
function classVerbatim:preamble ()
if self.cond == '' then
write(self.line)
end
end
-- support code
function classVerbatim:supcode ()
if strfind(self.cond,'s') then
write(self.line)
write('\n')
end
end
-- register code
function classVerbatim:register (pre)
if strfind(self.cond,'r') then
write(self.line)
end
end
-- Print method
function classVerbatim:print (ident,close)
print(ident.."Verbatim{")
print(ident.." line = '"..self.line.."',")
print(ident.."}"..close)
end
-- Internal constructor
function _Verbatim (t)
setmetatable(t,classVerbatim)
append(t)
return t
end
-- Constructor
-- Expects a string representing the text line
function Verbatim (l,cond)
if strsub(l,1,1) == "'" then
l = strsub(l,2)
elseif strsub(l,1,1) == '$' then
cond = 'sr' -- generates in both suport and register fragments
l = strsub(l,2)
end
return _Verbatim {
line = l,
cond = cond or '',
}
end -- tolua: code class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1999
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- global
code_n = 1
-- Code class
-- Represents Lua code to be compiled and included
-- in the initialization function.
-- The following fields are stored:
-- text = text code
classCode = {
text = '',
}
classCode.__index = classCode
setmetatable(classCode,classFeature)
-- register code
function classCode:register (pre)
pre = pre or ''
-- clean Lua code
local s = clean(self.text)
if not s then
--print(self.text)
error("parser error in embedded code")
end
-- get first line
local _, _, first_line=string.find(self.text, "^([^\n\r]*)")
if string.find(first_line, "^%s*%-%-") then
if string.find(first_line, "^%-%-##") then
first_line = string.gsub(first_line, "^%-%-##", "")
if flags['C'] then
s = string.gsub(s, "^%-%-##[^\n\r]*\n", "")
end
end
else
first_line = ""
end
-- pad to 16 bytes
local npad = 16 - (#s % 16)
local spad = ""
for i=1,npad do
spad = spad .. "-"
end
s = s..spad
-- convert to C
output('\n'..pre..'{ /* begin embedded lua code */\n')
output(pre..' int top = lua_gettop(tolua_S);')
output(pre..' static const unsigned char B[] = {\n ')
local t={n=0}
local b = gsub(s,'(.)',function (c)
local e = ''
t.n=t.n+1 if t.n==15 then t.n=0 e='\n'..pre..' ' end
return format('%3u,%s',strbyte(c),e)
end
)
output(b..strbyte(" "))
output('\n'..pre..' };\n')
if first_line and first_line ~= "" then
output(pre..' tolua_dobuffer(tolua_S,(char*)B,sizeof(B),"tolua embedded: '..first_line..'");')
else
output(pre..' tolua_dobuffer(tolua_S,(char*)B,sizeof(B),"tolua: embedded Lua code '..code_n..'");')
end
output(pre..' lua_settop(tolua_S, top);')
output(pre..'} /* end of embedded lua code */\n\n')
code_n = code_n +1
end
-- Print method
function classCode:print (ident,close)
print(ident.."Code{")
print(ident.." text = [["..self.text.."]],")
print(ident.."}"..close)
end
-- Internal constructor
function _Code (t)
setmetatable(t,classCode)
append(t)
return t
end
-- Constructor
-- Expects a string representing the code text
function Code (l)
return _Code {
text = l
}
end -- tolua: typedef class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Typedef class
-- Represents a type synonym.
-- The 'de facto' type replaces the typedef before the
-- remaining code is parsed.
-- The following fields are stored:
-- utype = typedef name
-- type = 'the facto' type
-- mod = modifiers to the 'de facto' type
classTypedef = {
utype = '',
mod = '',
type = ''
}
classTypedef.__index = classTypedef
-- Print method
function classTypedef:print (ident,close)
print(ident.."Typedef{")
print(ident.." utype = '"..self.utype.."',")
print(ident.." mod = '"..self.mod.."',")
print(ident.." type = '"..self.type.."',")
print(ident.."}"..close)
end
-- Return it's not a variable
function classTypedef:isvariable ()
return false
end
-- Internal constructor
function _Typedef (t)
setmetatable(t,classTypedef)
t.type = resolve_template_types(t.type)
appendtypedef(t)
return t
end
-- Constructor
-- Expects one string representing the type definition.
function Typedef (s)
if strfind(string.gsub(s, '%b<>', ''),'[%*&]') then
tolua_error("#invalid typedef: pointers (and references) are not supported")
end
local o = {mod = ''}
if string.find(s, "[<>]") then
_,_,o.type,o.utype = string.find(s, "^%s*([^<>]+%b<>[^%s]*)%s+(.-)$")
else
local t = split(gsub(s,"%s%s*"," ")," ")
o = {
utype = t[t.n],
type = t[t.n-1],
mod = concat(t,1,t.n-2),
}
end
return _Typedef(o)
end -- tolua: container abstract class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- table to store namespaced typedefs/enums in global scope
global_typedefs = {}
global_enums = {}
-- Container class
-- Represents a container of features to be bound
-- to lua.
classContainer =
{
curr = nil,
}
classContainer.__index = classContainer
setmetatable(classContainer,classFeature)
-- output tags
function classContainer:decltype ()
push(self)
local i=1
while self[i] do
self[i]:decltype()
i = i+1
end
pop()
end
-- write support code
function classContainer:supcode ()
if not self:check_public_access() then
return
end
push(self)
local i=1
while self[i] do
if self[i]:check_public_access() then
self[i]:supcode()
end
i = i+1
end
pop()
end
function classContainer:hasvar ()
local i=1
while self[i] do
if self[i]:isvariable() then
return 1
end
i = i+1
end
return 0
end
-- Internal container constructor
function _Container (self)
setmetatable(self,classContainer)
self.n = 0
self.typedefs = {tolua_n=0}
self.usertypes = {}
self.enums = {tolua_n=0}
self.lnames = {}
return self
end
-- push container
function push (t)
t.prox = classContainer.curr
classContainer.curr = t
end
-- pop container
function pop ()
--print("name",classContainer.curr.name)
--foreach(classContainer.curr.usertypes,print)
--print("______________")
classContainer.curr = classContainer.curr.prox
end
-- get current namespace
function getcurrnamespace ()
return getnamespace(classContainer.curr)
end
-- append to current container
function append (t)
return classContainer.curr:append(t)
end
-- append typedef to current container
function appendtypedef (t)
return classContainer.curr:appendtypedef(t)
end
-- append usertype to current container
function appendusertype (t)
return classContainer.curr:appendusertype(t)
end
-- append enum to current container
function appendenum (t)
return classContainer.curr:appendenum(t)
end
-- substitute typedef
function applytypedef (mod,type)
return classContainer.curr:applytypedef(mod,type)
end
-- check if is type
function findtype (type)
local t = classContainer.curr:findtype(type)
return t
end
-- check if is typedef
function istypedef (type)
return classContainer.curr:istypedef(type)
end
-- get fulltype (with namespace)
function fulltype (t)
local curr = classContainer.curr
while curr do
if curr then
if curr.typedefs and curr.typedefs[t] then
return curr.typedefs[t]
elseif curr.usertypes and curr.usertypes[t] then
return curr.usertypes[t]
end
end
curr = curr.prox
end
return t
end
-- checks if it requires collection
function classContainer:requirecollection (t)
push(self)
local i=1
local r = false
while self[i] do
r = self[i]:requirecollection(t) or r
i = i+1
end
pop()
return r
end
-- get namesapce
function getnamespace (curr)
local namespace = ''
while curr do
if curr and
( curr.classtype == 'class' or curr.classtype == 'namespace')
then
namespace = (curr.original_name or curr.name) .. '::' .. namespace
--namespace = curr.name .. '::' .. namespace
end
curr = curr.prox
end
return namespace
end
-- get namespace (only namespace)
function getonlynamespace ()
local curr = classContainer.curr
local namespace = ''
while curr do
if curr.classtype == 'class' then
return namespace
elseif curr.classtype == 'namespace' then
namespace = curr.name .. '::' .. namespace
end
curr = curr.prox
end
return namespace
end
-- check if is enum
function isenum (type)
return classContainer.curr:isenum(type)
end
-- append feature to container
function classContainer:append (t)
self.n = self.n + 1
self[self.n] = t
t.parent = self
end
-- append typedef
function classContainer:appendtypedef (t)
local namespace = getnamespace(classContainer.curr)
self.typedefs.tolua_n = self.typedefs.tolua_n + 1
self.typedefs[self.typedefs.tolua_n] = t
self.typedefs[t.utype] = namespace .. t.utype
global_typedefs[namespace..t.utype] = t
t.ftype = findtype(t.type) or t.type
--print("appending typedef "..t.utype.." as "..namespace..t.utype.." with ftype "..t.ftype)
append_global_type(namespace..t.utype)
if t.ftype and isenum(t.ftype) then
global_enums[namespace..t.utype] = true
end
end
-- append usertype: return full type
function classContainer:appendusertype (t)
local container
if t == (self.original_name or self.name) then
container = self.prox
else
container = self
end
local ft = getnamespace(container) .. t
container.usertypes[t] = ft
_usertype[ft] = ft
return ft
end
-- append enum
function classContainer:appendenum (t)
local namespace = getnamespace(classContainer.curr)
self.enums.tolua_n = self.enums.tolua_n + 1
self.enums[self.enums.tolua_n] = t
global_enums[namespace..t.name] = t
end
-- determine lua function name overload
function classContainer:overload (lname)
if not self.lnames[lname] then
self.lnames[lname] = 0
else
self.lnames[lname] = self.lnames[lname] + 1
end
return format("%02d",self.lnames[lname])
end
-- applies typedef: returns the 'the facto' modifier and type
function classContainer:applytypedef (mod,type)
if global_typedefs[type] then
--print("found typedef "..global_typedefs[type].type)
local mod1, type1 = global_typedefs[type].mod, global_typedefs[type].ftype
local mod2, type2 = applytypedef(mod.." "..mod1, type1)
--return mod2 .. ' ' .. mod1, type2
return mod2, type2
end
do return mod,type end
end
-- check if it is a typedef
function classContainer:istypedef (type)
local env = self
while env do
if env.typedefs then
local i=1
while env.typedefs[i] do
if env.typedefs[i].utype == type then
return type
end
i = i+1
end
end
env = env.parent
end
return nil
end
function find_enum_var(var)
if tonumber(var) then return var end
local c = classContainer.curr
while c do
local ns = getnamespace(c)
for k,v in pairs(_global_enums) do
if match_type(var, v, ns) then
return v
end
end
if c.base and c.base ~= '' then
c = _global_classes[c:findtype(c.base)]
else
c = nil
end
end
return var
end
-- check if is a registered type: return full type or nil
function classContainer:findtype (t)
t = string.gsub(t, "=.*", "")
if _basic[t] then
return t
end
local _,_,em = string.find(t, "([&%*])%s*$")
t = string.gsub(t, "%s*([&%*])%s*$", "")
p = self
while p and type(p)=='table' do
local st = getnamespace(p)
for i=_global_types.n,1,-1 do -- in reverse order
if match_type(t, _global_types[i], st) then
return _global_types[i]..(em or "")
end
end
if p.base and p.base ~= '' and p.base ~= t then
--print("type is "..t..", p is "..p.base.." self.type is "..self.type.." self.name is "..self.name)
p = _global_classes[p:findtype(p.base)]
else
p = nil
end
end
return nil
end
function append_global_type(t, class)
_global_types.n = _global_types.n +1
_global_types[_global_types.n] = t
_global_types_hash[t] = 1
if class then append_class_type(t, class) end
end
function append_class_type(t,class)
if _global_classes[t] then
class.flags = _global_classes[t].flags
class.lnames = _global_classes[t].lnames
if _global_classes[t].base and (_global_classes[t].base ~= '') then
class.base = _global_classes[t].base or class.base
end
end
_global_classes[t] = class
class.flags = class.flags or {}
end
function match_type(childtype, regtype, st)
--print("findtype "..childtype..", "..regtype..", "..st)
local b,e = string.find(regtype, childtype, -string.len(childtype), true)
if b then
if e == string.len(regtype) and
(b == 1 or (string.sub(regtype, b-1, b-1) == ':' and
string.sub(regtype, 1, b-1) == string.sub(st, 1, b-1))) then
return true
end
end
return false
end
function findtype_on_childs(self, t)
local tchild
if self.classtype == 'class' or self.classtype == 'namespace' then
for k,v in ipairs(self) do
if v.classtype == 'class' or v.classtype == 'namespace' then
if v.typedefs and v.typedefs[t] then
return v.typedefs[t]
elseif v.usertypes and v.usertypes[t] then
return v.usertypes[t]
end
tchild = findtype_on_childs(v, t)
if tchild then return tchild end
end
end
end
return nil
end
function classContainer:isenum (type)
if global_enums[type] then
return type
else
return false
end
local basetype = gsub(type,"^.*::","")
local env = self
while env do
if env.enums then
local i=1
while env.enums[i] do
if env.enums[i].name == basetype then
return true
end
i = i+1
end
end
env = env.parent
end
return false
end
methodisvirtual = false -- a global
-- parse chunk
function classContainer:doparse (s)
--print ("parse "..s)
-- try the parser hook
do
local sub = parser_hook(s)
if sub then
return sub
end
end
-- try the null statement
do
local b,e,code = string.find(s, "^%s*;")
if b then
return strsub(s,e+1)
end
end
-- try empty verbatim line
do
local b,e,code = string.find(s, "^%s*$\n")
if b then
return strsub(s,e+1)
end
end
-- try Lua code
do
local b,e,code = strfind(s,"^%s*(%b\1\2)")
if b then
Code(strsub(code,2,-2))
return strsub(s,e+1)
end
end
-- try C code
do
local b,e,code = strfind(s,"^%s*(%b\3\4)")
if b then
code = '{'..strsub(code,2,-2)..'\n}\n'
Verbatim(code,'r') -- verbatim code for 'r'egister fragment
return strsub(s,e+1)
end
end
-- try C code for preamble section
do
local b,e,code = string.find(s, "^%s*(%b\5\6)")
if b then
code = string.sub(code, 2, -2).."\n"
Verbatim(code, '')
return string.sub(s, e+1)
end
end
-- try default_property directive
do
local b,e,ptype = strfind(s, "^%s*TOLUA_PROPERTY_TYPE%s*%(+%s*([^%)%s]*)%s*%)+%s*;?")
if b then
if not ptype or ptype == "" then
ptype = "default"
end
self:set_property_type(ptype)
return strsub(s, e+1)
end
end
-- try protected_destructor directive
do
local b,e = string.find(s, "^%s*TOLUA_PROTECTED_DESTRUCTOR%s*;?")
if b then
if self.set_protected_destructor then
self:set_protected_destructor(true)
end
return strsub(s, e+1)
end
end
-- try 'extern' keyword
do
local b,e = string.find(s, "^%s*extern%s+")
if b then
-- do nothing
return strsub(s, e+1)
end
end
-- try 'virtual' keyworkd
do
local b,e = string.find(s, "^%s*virtual%s+")
if b then
methodisvirtual = true
return strsub(s, e+1)
end
end
-- try labels (public, private, etc)
do
local b,e = string.find(s, "^%s*%w*%s*:[^:]")
if b then
return strsub(s, e) -- preserve the [^:]
end
end
-- try module
do
local b,e,name,body = strfind(s,"^%s*module%s%s*([_%w][_%w]*)%s*(%b{})%s*")
if b then
_curr_code = strsub(s,b,e)
Module(name,body)
return strsub(s,e+1)
end
end
-- try namesapce
do
local b,e,name,body = strfind(s,"^%s*namespace%s%s*([_%w][_%w]*)%s*(%b{})%s*;?")
if b then
_curr_code = strsub(s,b,e)
Namespace(name,body)
return strsub(s,e+1)
end
end
-- try define
do
local b,e,name = strfind(s,"^%s*#define%s%s*([^%s]*)[^\n]*\n%s*")
if b then
_curr_code = strsub(s,b,e)
Define(name)
return strsub(s,e+1)
end
end
-- try enumerates
do
local b,e,name,body,varname = strfind(s,"^%s*enum%s+(%S*)%s*(%b{})%s*([^%s;]*)%s*;?%s*")
if b then
--error("#Sorry, declaration of enums and variables on the same statement is not supported.\nDeclare your variable separately (example: '"..name.." "..varname..";')")
_curr_code = strsub(s,b,e)
Enumerate(name,body,varname)
return strsub(s,e+1)
end
end
-- do
-- local b,e,name,body = strfind(s,"^%s*enum%s+(%S*)%s*(%b{})%s*;?%s*")
-- if b then
-- _curr_code = strsub(s,b,e)
-- Enumerate(name,body)
-- return strsub(s,e+1)
-- end
-- end
do
local b,e,body,name = strfind(s,"^%s*typedef%s+enum[^{]*(%b{})%s*([%w_][^%s]*)%s*;%s*")
if b then
_curr_code = strsub(s,b,e)
Enumerate(name,body)
return strsub(s,e+1)
end
end
-- try operator
do
local b,e,decl,kind,arg,const = strfind(s,"^%s*([_%w][_%w%s%*&:<>,]-%s+operator)%s*([^%s][^%s]*)%s*(%b())%s*(c?o?n?s?t?)%s*;%s*")
if not b then
-- try inline
b,e,decl,kind,arg,const = strfind(s,"^%s*([_%w][_%w%s%*&:<>,]-%s+operator)%s*([^%s][^%s]*)%s*(%b())%s*(c?o?n?s?t?)[%s\n]*%b{}%s*;?%s*")
end
if not b then
-- try cast operator
b,e,decl,kind,arg,const = strfind(s, "^%s*(operator)%s+([%w_:%d<>%*%&%s]+)%s*(%b())%s*(c?o?n?s?t?)");
if b then
local _,ie = string.find(s, "^%s*%b{}", e+1)
if ie then
e = ie
end
end
end
if b then
_curr_code = strsub(s,b,e)
Operator(decl,kind,arg,const)
return strsub(s,e+1)
end
end
-- try function
do
--local b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w])%s*(%b())%s*(c?o?n?s?t?)%s*=?%s*0?%s*;%s*")
local b,e,decl,arg,const,virt = strfind(s,"^%s*([^%(\n]+)%s*(%b())%s*(c?o?n?s?t?)%s*(=?%s*0?)%s*;%s*")
if not b then
-- try function with template
b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w]%b<>)%s*(%b())%s*(c?o?n?s?t?)%s*=?%s*0?%s*;%s*")
end
if not b then
-- try a single letter function name
b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?)%s*;%s*")
end
if not b then
-- try function pointer
b,e,decl,arg,const = strfind(s,"^%s*([^%(;\n]+%b())%s*(%b())%s*;%s*")
if b then
decl = string.gsub(decl, "%(%s*%*([^%)]*)%s*%)", " %1 ")
end
end
if b then
if virt and string.find(virt, "[=0]") then
if self.flags then
self.flags.pure_virtual = true
end
end
_curr_code = strsub(s,b,e)
Function(decl,arg,const)
return strsub(s,e+1)
end
end
-- try inline function
do
local b,e,decl,arg,const = strfind(s,"^%s*([^%(\n]+)%s*(%b())%s*(c?o?n?s?t?)[^;{]*%b{}%s*;?%s*")
--local b,e,decl,arg,const = strfind(s,"^%s*([~_%w][_@%w%s%*&:<>]*[_%w>])%s*(%b())%s*(c?o?n?s?t?)[^;]*%b{}%s*;?%s*")
if not b then
-- try a single letter function name
b,e,decl,arg,const = strfind(s,"^%s*([_%w])%s*(%b())%s*(c?o?n?s?t?).-%b{}%s*;?%s*")
end
if b then
_curr_code = strsub(s,b,e)
Function(decl,arg,const)
return strsub(s,e+1)
end
end
-- try class
do
local b,e,name,base,body
base = '' body = ''
b,e,name = strfind(s,"^%s*class%s*([_%w][_%w@]*)%s*;") -- dummy class
local dummy = false
if not b then
b,e,name = strfind(s,"^%s*struct%s*([_%w][_%w@]*)%s*;") -- dummy struct
if not b then
b,e,name,base,body = strfind(s,"^%s*class%s*([_%w][_%w@]*)%s*([^{]-)%s*(%b{})%s*")
if not b then
b,e,name,base,body = strfind(s,"^%s*struct%s+([_%w][_%w@]*)%s*([^{]-)%s*(%b{})%s*")
if not b then
b,e,name,base,body = strfind(s,"^%s*union%s*([_%w][_%w@]*)%s*([^{]-)%s*(%b{})%s*")
if not b then
base = ''
b,e,body,name = strfind(s,"^%s*typedef%s%s*struct%s%s*[_%w]*%s*(%b{})%s*([_%w][_%w@]*)%s*;")
end
end
end
else dummy = 1 end
else dummy = 1 end
if b then
if base ~= '' then
base = string.gsub(base, "^%s*:%s*", "")
base = string.gsub(base, "%s*public%s*", "")
base = split(base, ",")
--local b,e
--b,e,base = strfind(base,".-([_%w][_%w<>,:]*)$")
else
base = {}
end
_curr_code = strsub(s,b,e)
Class(name,base,body)
if not dummy then
varb,vare,varname = string.find(s, "^%s*([_%w]+)%s*;", e+1)
if varb then
Variable(name.." "..varname)
e = vare
end
end
return strsub(s,e+1)
end
end
-- try typedef
do
local b,e,types = strfind(s,"^%s*typedef%s%s*(.-)%s*;%s*")
if b then
_curr_code = strsub(s,b,e)
Typedef(types)
return strsub(s,e+1)
end
end
-- try variable
do
local b,e,decl = strfind(s,"^%s*([_%w][_@%s%w%d%*&:<>,]*[_%w%d])%s*;%s*")
if b then
_curr_code = strsub(s,b,e)
local list = split_c_tokens(decl, ",")
Variable(list[1])
if list.n > 1 then
local _,_,type = strfind(list[1], "(.-)%s+([^%s]*)$");
local i =2;
while list[i] do
Variable(type.." "..list[i])
i=i+1
end
end
--Variable(decl)
return strsub(s,e+1)
end
end
-- try string
do
local b,e,decl = strfind(s,"^%s*([_%w]?[_%s%w%d]-char%s+[_@%w%d]*%s*%[%s*%S+%s*%])%s*;%s*")
if b then
_curr_code = strsub(s,b,e)
Variable(decl)
return strsub(s,e+1)
end
end
-- try array
do
local b,e,decl = strfind(s,"^%s*([_%w][][_@%s%w%d%*&:<>]*[]_%w%d])%s*;%s*")
if b then
_curr_code = strsub(s,b,e)
Array(decl)
return strsub(s,e+1)
end
end
-- no matching
if gsub(s,"%s%s*","") ~= "" then
_curr_code = s
error("#parse error")
else
return ""
end
end
function classContainer:parse (s)
--self.curr_member_access = nil
while s ~= '' do
s = self:doparse(s)
methodisvirtual = false
end
end
-- property types
function get_property_type()
return classContainer.curr:get_property_type()
end
function classContainer:set_property_type(ptype)
ptype = string.gsub(ptype, "^%s*", "")
ptype = string.gsub(ptype, "%s*$", "")
self.property_type = ptype
end
function classContainer:get_property_type()
return self.property_type or (self.parent and self.parent:get_property_type()) or "default"
end -- tolua: package class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Package class
-- Represents the whole package being bound.
-- The following fields are stored:
-- {i} = list of objects in the package.
classPackage = {
classtype = 'package'
}
classPackage.__index = classPackage
setmetatable(classPackage,classContainer)
-- Print method
function classPackage:print ()
print("Package: "..self.name)
local i=1
while self[i] do
self[i]:print("","")
i = i+1
end
end
function classPackage:preprocess ()
-- avoid preprocessing embedded Lua code
local L = {}
self.code = gsub(self.code,"\n%s*%$%[","\1") -- deal with embedded lua code
self.code = gsub(self.code,"\n%s*%$%]","\2")
self.code = gsub(self.code,"(%b\1\2)", function (c)
tinsert(L,c)
return "\n#["..getn(L).."]#"
end)
-- avoid preprocessing embedded C code
local C = {}
self.code = gsub(self.code,"\n%s*%$%<","\3") -- deal with embedded C code
self.code = gsub(self.code,"\n%s*%$%>","\4")
self.code = gsub(self.code,"(%b\3\4)", function (c)
tinsert(C,c)
return "\n#<"..getn(C)..">#"
end)
-- avoid preprocessing embedded C code
self.code = gsub(self.code,"\n%s*%$%{","\5") -- deal with embedded C code
self.code = gsub(self.code,"\n%s*%$%}","\6")
self.code = gsub(self.code,"(%b\5\6)", function (c)
tinsert(C,c)
return "\n#<"..getn(C)..">#"
end)
--self.code = gsub(self.code,"\n%s*#[^d][^\n]*\n", "\n\n") -- eliminate preprocessor directives that don't start with 'd'
self.code = gsub(self.code,"\n[ \t]*#[ \t]*[^d%<%[]", "\n//") -- eliminate preprocessor directives that don't start with 'd'
-- avoid preprocessing verbatim lines
local V = {}
self.code = gsub(self.code,"\n(%s*%$[^%[%]][^\n]*)",function (v)
tinsert(V,v)
return "\n#"..getn(V).."#"
end)
-- perform global substitution
self.code = gsub(self.code,"(//[^\n]*)","") -- eliminate C++ comments
self.code = gsub(self.code,"/%*","\1")
self.code = gsub(self.code,"%*/","\2")
self.code = gsub(self.code,"%b\1\2","")
self.code = gsub(self.code,"\1","/%*")
self.code = gsub(self.code,"\2","%*/")
self.code = gsub(self.code,"%s*@%s*","@") -- eliminate spaces beside @
self.code = gsub(self.code,"%s?inline(%s)","%1") -- eliminate 'inline' keyword
--self.code = gsub(self.code,"%s?extern(%s)","%1") -- eliminate 'extern' keyword
--self.code = gsub(self.code,"%s?virtual(%s)","%1") -- eliminate 'virtual' keyword
--self.code = gsub(self.code,"public:","") -- eliminate 'public:' keyword
self.code = gsub(self.code,"([^%w_])void%s*%*","%1_userdata ") -- substitute 'void*'
self.code = gsub(self.code,"([^%w_])void%s*%*","%1_userdata ") -- substitute 'void*'
self.code = gsub(self.code,"([^%w_])char%s*%*","%1_cstring ") -- substitute 'char*'
self.code = gsub(self.code,"([^%w_])lua_State%s*%*","%1_lstate ") -- substitute 'lua_State*'
-- restore embedded Lua code
self.code = gsub(self.code,"%#%[(%d+)%]%#",function (n)
return L[tonumber(n)]
end)
-- restore embedded C code
self.code = gsub(self.code,"%#%<(%d+)%>%#",function (n)
return C[tonumber(n)]
end)
-- restore verbatim lines
self.code = gsub(self.code,"%#(%d+)%#",function (n)
return V[tonumber(n)]
end)
self.code = string.gsub(self.code, "\n%s*%$([^\n]+)", function (l)
Verbatim(l.."\n")
return "\n"
end)
end
-- translate verbatim
function classPackage:preamble ()
output('/*\n')
output('** Lua binding: '..self.name..'\n')
output('** Generated automatically by '..TOLUA_VERSION..' on '..date()..'.\n')
output('*/\n\n')
output('#ifndef __cplusplus\n')
output('#include "stdlib.h"\n')
output('#endif\n')
output('#include "string.h"\n\n')
output('#include "tolua++.h"\n\n')
if not flags.h then
output('/* Exported function */')
output('TOLUA_API int tolua_'..self.name..'_open (lua_State* tolua_S);')
output('\n')
end
local i=1
while self[i] do
self[i]:preamble()
i = i+1
end
if self:requirecollection(_collect) then
output('\n')
output('/* function to release collected object via destructor */')
output('#ifdef __cplusplus\n')
for i,v in pairs(_collect) do
output('\nstatic int '..v..' (lua_State* tolua_S)')
output('{')
output(' '..i..'* self = ('..i..'*) tolua_tousertype(tolua_S,1,0);')
output(' Mtolua_delete(self);')
output(' return 0;')
output('}')
end
output('#endif\n\n')
end
output('\n')
output('/* function to register type */')
output('static void tolua_reg_types (lua_State* tolua_S)')
output('{')
if flags.t then
output("#ifndef Mtolua_typeid\n#define Mtolua_typeid(L,TI,T)\n#endif\n")
end
foreach(_usertype,function(n,v)
if (not _global_classes[v]) or _global_classes[v]:check_public_access() then
output(' tolua_usertype(tolua_S,"',v,'");')
if flags.t then
output(' Mtolua_typeid(tolua_S,typeid(',v,'), "',v,'");')
end
end
end)
output('}')
output('\n')
end
-- register package
-- write package open function
function classPackage:register (pre)
pre = pre or ''
push(self)
output(pre.."/* Open function */")
output(pre.."TOLUA_API int tolua_"..self.name.."_open (lua_State* tolua_S)")
output(pre.."{")
output(pre.." tolua_open(tolua_S);")
output(pre.." tolua_reg_types(tolua_S);")
output(pre.." tolua_module(tolua_S,NULL,",self:hasvar(),");")
output(pre.." tolua_beginmodule(tolua_S,NULL);")
local i=1
while self[i] do
self[i]:register(pre.." ")
i = i+1
end
output(pre.." tolua_endmodule(tolua_S);")
output(pre.." return 1;")
output(pre.."}")
output("\n\n")
output("#if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501\n");
output(pre.."TOLUA_API int luaopen_"..self.name.." (lua_State* tolua_S) {")
output(pre.." return tolua_"..self.name.."_open(tolua_S);")
output(pre.."};")
output("#endif\n\n")
pop()
end
-- write header file
function classPackage:header ()
output('/*\n') output('** Lua binding: '..self.name..'\n')
output('** Generated automatically by '..TOLUA_VERSION..' on '..date()..'.\n')
output('*/\n\n')
if not flags.h then
output('/* Exported function */')
output('TOLUA_API int tolua_'..self.name..'_open (lua_State* tolua_S);')
output('\n')
end
end
-- Internal constructor
function _Package (self)
setmetatable(self,classPackage)
return self
end
-- Parse C header file with tolua directives
-- *** Thanks to Ariel Manzur for fixing bugs in nested directives ***
function extract_code(fn,s)
local code = '\n$#include "'..fn..'"\n'
s= "\n" .. s .. "\n" -- add blank lines as sentinels
local _,e,c,t = strfind(s, "\n([^\n]-)[Tt][Oo][Ll][Uu][Aa]_([^%s]*)[^\n]*\n")
while e do
t = strlower(t)
if t == "begin" then
_,e,c = strfind(s,"(.-)\n[^\n]*[Tt][Oo][Ll][Uu][Aa]_[Ee][Nn][Dd][^\n]*\n",e)
if not e then
tolua_error("Unbalanced 'tolua_begin' directive in header file")
end
end
code = code .. c .. "\n"
_,e,c,t = strfind(s, "\n([^\n]-)[Tt][Oo][Ll][Uu][Aa]_([^%s]*)[^\n]*\n",e)
end
return code
end
-- Constructor
-- Expects the package name, the file extension, and the file text.
function Package (name,fn)
local ext = "pkg"
-- open input file, if any
local st,msg
if fn then
st, msg = readfrom(flags.f)
if not st then
error('#'..msg)
end
local _; _, _, ext = strfind(fn,".*%.(.*)$")
end
local code
if ext == 'pkg' then
code = prep(st)
else
code = "\n" .. read('*a')
if ext == 'h' or ext == 'hpp' then
code = extract_code(fn,code)
end
end
-- close file
if fn then
readfrom()
end
-- deal with include directive
local nsubst
repeat
code,nsubst = gsub(code,'\n%s*%$(.)file%s*"(.-)"([^\n]*)\n',
function (kind,fn,extra)
local _, _, ext = strfind(fn,".*%.(.*)$")
local fp,msg = openfile(fn,'r')
if not fp then
error('#'..msg..': '..fn)
end
if kind == 'p' then
local s = prep(fp)
closefile(fp)
return s
end
local s = read(fp,'*a')
closefile(fp)
if kind == 'c' or kind == 'h' then
return extract_code(fn,s)
elseif kind == 'l' then
return "\n$[--##"..fn.."\n" .. s .. "\n$]\n"
elseif kind == 'i' then
local t = {code=s}
extra = string.gsub(extra, "^%s*,%s*", "")
local pars = split_c_tokens(extra, ",")
include_file_hook(t, fn, unpack(pars))
return "\n\n" .. t.code
else
error('#Invalid include directive (use $cfile, $pfile, $lfile or $ifile)')
end
end)
until nsubst==0
-- deal with renaming directive
repeat -- I don't know why this is necesary
code,nsubst = gsub(code,'\n%s*%$renaming%s*(.-)%s*\n', function (r) appendrenaming(r) return "\n" end)
until nsubst == 0
local t = _Package(_Container{name=name, code=code})
push(t)
preprocess_hook(t)
t:preprocess()
preparse_hook(t)
t:parse(t.code)
pop()
return t
end
setmetatable(_extra_parameters, { __index = _G })
function prep(file)
local chunk = {'local __ret = {"\\n"}\n'}
for line in file:lines() do
if string.find(line, "^##") then
table.insert(chunk, string.sub(line, 3) .. "\n")
else
local last = 1
for text, expr, index in string.gfind(line, "(.-)$(%b())()") do
last = index
if text ~= "" then
table.insert(chunk, string.format('table.insert(__ret, %q )', text))
end
table.insert(chunk, string.format('table.insert(__ret, %s )', expr))
end
table.insert(chunk, string.format('table.insert(__ret, %q)\n',
string.sub(line, last).."\n"))
end
end
table.insert(chunk, '\nreturn table.concat(__ret)\n')
local f,e = loadstring(table.concat(chunk))
if e then
error("#"..e)
end
setfenv(f, _extra_parameters)
return f()
end -- tolua: module class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Module class
-- Represents module.
-- The following fields are stored:
-- {i} = list of objects in the module.
classModule = {
classtype = 'module'
}
classModule.__index = classModule
setmetatable(classModule,classContainer)
-- register module
function classModule:register (pre)
pre = pre or ''
push(self)
output(pre..'tolua_module(tolua_S,"'..self.name..'",',self:hasvar(),');')
output(pre..'tolua_beginmodule(tolua_S,"'..self.name..'");')
local i=1
while self[i] do
self[i]:register(pre..' ')
i = i+1
end
output(pre..'tolua_endmodule(tolua_S);')
pop()
end
-- Print method
function classModule:print (ident,close)
print(ident.."Module{")
print(ident.." name = '"..self.name.."';")
local i=1
while self[i] do
self[i]:print(ident.." ",",")
i = i+1
end
print(ident.."}"..close)
end
-- Internal constructor
function _Module (t)
setmetatable(t,classModule)
append(t)
return t
end
-- Constructor
-- Expects two string representing the module name and body.
function Module (n,b)
local t = _Module(_Container{name=n})
push(t)
t:parse(strsub(b,2,strlen(b)-1)) -- eliminate braces
pop()
return t
end -- tolua: namespace class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 2003
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Namespace class
-- Represents a namesapce definition.
-- Stores the following fields:
-- name = class name
-- {i} = list of members
classNamespace = {
classtype = 'namespace',
name = '',
}
classNamespace.__index = classNamespace
setmetatable(classNamespace,classModule)
-- Print method
function classNamespace:print (ident,close)
print(ident.."Namespace{")
print(ident.." name = '"..self.name.."',")
local i=1
while self[i] do
self[i]:print(ident.." ",",")
i = i+1
end
print(ident.."}"..close)
end
-- Internal constructor
function _Namespace (t)
setmetatable(t,classNamespace)
append(t)
return t
end
-- Constructor
-- Expects the name and the body of the namespace.
function Namespace (n,b)
local c = _Namespace(_Container{name=n})
push(c)
c:parse(strsub(b,2,strlen(b)-1)) -- eliminate braces
pop()
end -- tolua: define class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: define.lua,v 1.2 1999/07/28 22:21:08 celes Exp $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Define class
-- Represents a numeric const definition
-- The following filds are stored:
-- name = constant name
classDefine = {
name = '',
}
classDefine.__index = classDefine
setmetatable(classDefine,classFeature)
-- register define
function classDefine:register (pre)
if not self:check_public_access() then
return
end
pre = pre or ''
output(pre..'tolua_constant(tolua_S,"'..self.lname..'",'..self.name..');')
end
-- Print method
function classDefine:print (ident,close)
print(ident.."Define{")
print(ident.." name = '"..self.name.."',")
print(ident.." lname = '"..self.lname.."',")
print(ident.."}"..close)
end
-- Internal constructor
function _Define (t)
setmetatable(t,classDefine)
t:buildnames()
if t.name == '' then
error("#invalid define")
end
append(t)
return t
end
-- Constructor
-- Expects a string representing the constant name
function Define (n)
return _Define{
name = n
}
end -- tolua: enumerate class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: enumerate.lua,v 1.3 2000/01/24 20:41:15 celes Exp $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Enumerate class
-- Represents enumeration
-- The following fields are stored:
-- {i} = list of constant names
classEnumerate = {
}
classEnumerate.__index = classEnumerate
setmetatable(classEnumerate,classFeature)
-- register enumeration
function classEnumerate:register (pre)
if not self:check_public_access() then
return
end
pre = pre or ''
local nspace = getnamespace(classContainer.curr)
local i=1
while self[i] do
if self.lnames[i] and self.lnames[i] ~= "" then
output(pre..'tolua_constant(tolua_S,"'..self.lnames[i]..'",'..nspace..self[i]..');')
end
i = i+1
end
end
-- Print method
function classEnumerate:print (ident,close)
print(ident.."Enumerate{")
print(ident.." name = "..self.name)
local i=1
while self[i] do
print(ident.." '"..self[i].."'("..self.lnames[i].."),")
i = i+1
end
print(ident.."}"..close)
end
-- Internal constructor
function _Enumerate (t,varname)
setmetatable(t,classEnumerate)
append(t)
appendenum(t)
if varname and varname ~= "" then
if t.name ~= "" then
Variable(t.name.." "..varname)
else
local ns = getcurrnamespace()
warning("Variable "..ns..varname.." of type <anonymous enum> is declared as read-only")
Variable("tolua_readonly int "..varname)
end
end
local parent = classContainer.curr
if parent then
t.access = parent.curr_member_access
t.global_access = t:check_public_access()
end
return t
end
-- Constructor
-- Expects a string representing the enumerate body
function Enumerate (n,b,varname)
b = string.gsub(b, ",[%s\n]*}", "\n}") -- eliminate last ','
local t = split(strsub(b,2,-2),',') -- eliminate braces
local i = 1
local e = {n=0}
while t[i] do
local tt = split(t[i],'=') -- discard initial value
e.n = e.n + 1
e[e.n] = tt[1]
i = i+1
end
-- set lua names
i = 1
e.lnames = {}
local ns = getcurrnamespace()
while e[i] do
local t = split(e[i],'@')
e[i] = t[1]
if not t[2] then
t[2] = applyrenaming(t[1])
end
e.lnames[i] = t[2] or t[1]
_global_enums[ ns..e[i] ] = (ns..e[i])
i = i+1
end
e.name = n
if n ~= "" then
Typedef("int "..n)
end
return _Enumerate(e, varname)
end -- tolua: declaration class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Declaration class
-- Represents variable, function, or argument declaration.
-- Stores the following fields:
-- mod = type modifiers
-- type = type
-- ptr = "*" or "&", if representing a pointer or a reference
-- name = name
-- dim = dimension, if a vector
-- def = default value, if any (only for arguments)
-- ret = "*" or "&", if value is to be returned (only for arguments)
classDeclaration = {
mod = '',
type = '',
ptr = '',
name = '',
dim = '',
ret = '',
def = ''
}
classDeclaration.__index = classDeclaration
setmetatable(classDeclaration,classFeature)
-- Create an unique variable name
function create_varname ()
if not _varnumber then _varnumber = 0 end
_varnumber = _varnumber + 1
return "tolua_var_".._varnumber
end
-- Check declaration name
-- It also identifies default values
function classDeclaration:checkname ()
if strsub(self.name,1,1) == '[' and not findtype(self.type) then
self.name = self.type..self.name
local m = split(self.mod,'%s%s*')
self.type = m[m.n]
self.mod = concat(m,1,m.n-1)
end
local t = split(self.name,'=')
if t.n==2 then
self.name = t[1]
self.def = find_enum_var(t[t.n])
end
local b,e,d = strfind(self.name,"%[(.-)%]")
if b then
self.name = strsub(self.name,1,b-1)
self.dim = find_enum_var(d)
end
if self.type ~= '' and self.type ~= 'void' and self.name == '' then
self.name = create_varname()
elseif self.kind=='var' then
if self.type=='' and self.name~='' then
self.type = self.type..self.name
self.name = create_varname()
elseif findtype(self.name) then
if self.type=='' then self.type = self.name
else self.type = self.type..' '..self.name end
self.name = create_varname()
end
end
-- adjust type of string
if self.type == 'char' and self.dim ~= '' then
self.type = 'char*'
end
if self.kind and self.kind == 'var' then
self.name = string.gsub(self.name, ":.*$", "") -- ???
end
end
-- Check declaration type
-- Substitutes typedef's.
function classDeclaration:checktype ()
-- check if there is a pointer to basic type
local basic = isbasic(self.type)
if self.kind == 'func' and basic=='number' and string.find(self.ptr, "%*") then
self.type = '_userdata'
self.ptr = ""
end
if basic and self.ptr~='' then
self.ret = self.ptr
self.ptr = nil
if isbasic(self.type) == 'number' then
self.return_userdata = true
end
end
-- check if there is array to be returned
if self.dim~='' and self.ret~='' then
error('#invalid parameter: cannot return an array of values')
end
-- restore 'void*' and 'string*'
if self.type == '_userdata' then self.type = 'void*'
elseif self.type == '_cstring' then self.type = 'char*'
elseif self.type == '_lstate' then self.type = 'lua_State*'
end
-- resolve types inside the templates
if self.type then
self.type = resolve_template_types(self.type)
end
--
-- -- if returning value, automatically set default value
-- if self.ret ~= '' and self.def == '' then
-- self.def = '0'
-- end
--
end
function resolve_template_types(type)
if isbasic(type) then
return type
end
local b,_,m = string.find(type, "(%b<>)")
if b then
m = split_c_tokens(string.sub(m, 2, -2), ",")
for i=1, table.getn(m) do
m[i] = string.gsub(m[i],"%s*([%*&])", "%1")
if not isbasic(m[i]) then
if not isenum(m[i]) then _, m[i] = applytypedef("", m[i]) end
m[i] = findtype(m[i]) or m[i]
m[i] = resolve_template_types(m[i])
end
end
local b,i
type,b,i = break_template(type)
--print("concat is ",concat(m, 1, m.n))
local template_part = "<"..concat(m, 1, m.n, ",")..">"
type = rebuild_template(type, b, template_part)
type = string.gsub(type, ">>", "> >")
end
return type
end
function break_template(s)
local b,e,timpl = string.find(s, "(%b<>)")
if timpl then
s = string.gsub(s, "%b<>", "")
return s, b, timpl
else
return s, 0, nil
end
end
function rebuild_template(s, b, timpl)
if b == 0 then
return s
end
return string.sub(s, 1, b-1)..timpl..string.sub(s, b, -1)
end
-- Print method
function classDeclaration:print (ident,close)
print(ident.."Declaration{")
print(ident.." mod = '"..self.mod.."',")
print(ident.." type = '"..self.type.."',")
print(ident.." ptr = '"..self.ptr.."',")
print(ident.." name = '"..self.name.."',")
print(ident.." dim = '"..self.dim.."',")
print(ident.." def = '"..self.def.."',")
print(ident.." ret = '"..self.ret.."',")
print(ident.."}"..close)
end
-- check if array of values are returned to Lua
function classDeclaration:requirecollection (t)
if self.mod ~= 'const' and
self.dim and self.dim ~= '' and
not isbasic(self.type) and
self.ptr == '' and self:check_public_access() then
local type = gsub(self.type,"%s*const%s+","")
t[type] = "tolua_collect_" .. clean_template(type)
return true
end
return false
end
-- declare tag
function classDeclaration:decltype ()
self.type = typevar(self.type)
if strfind(self.mod,'const') then
self.type = 'const '..self.type
self.mod = gsub(self.mod,'const%s*','')
end
end
-- output type checking
function classDeclaration:outchecktype (narg)
local def
local t = isbasic(self.type)
if self.def~='' then
def = 1
else
def = 0
end
if self.dim ~= '' then
--if t=='string' then
-- return 'tolua_isstringarray(tolua_S,'..narg..','..def..',&tolua_err)'
--else
return '!tolua_istable(tolua_S,'..narg..',0,&tolua_err)'
--end
elseif t then
return '!tolua_is'..t..'(tolua_S,'..narg..','..def..',&tolua_err)'
else
local is_func = get_is_function(self.type)
if self.ptr == '&' or self.ptr == '' then
return '(tolua_isvaluenil(tolua_S,'..narg..',&tolua_err) || !'..is_func..'(tolua_S,'..narg..',"'..self.type..'",'..def..',&tolua_err))'
else
return '!'..is_func..'(tolua_S,'..narg..',"'..self.type..'",'..def..',&tolua_err)'
end
end
end
function classDeclaration:builddeclaration (narg, cplusplus)
local array = self.dim ~= '' and tonumber(self.dim)==nil
local line = ""
local ptr = ''
local mod
local type = self.type
local nctype = gsub(self.type,'const%s+','')
if self.dim ~= '' then
type = gsub(self.type,'const%s+','') -- eliminates const modifier for arrays
end
if self.ptr~='' and not isbasic(type) then ptr = '*' end
line = concatparam(line," ",self.mod,type,ptr)
if array then
line = concatparam(line,'*')
end
line = concatparam(line,self.name)
if self.dim ~= '' then
if tonumber(self.dim)~=nil then
line = concatparam(line,'[',self.dim,'];')
else
if cplusplus then
line = concatparam(line,' = Mtolua_new_dim(',type,ptr,', '..self.dim..');')
else
line = concatparam(line,' = (',type,ptr,'*)',
'malloc((',self.dim,')*sizeof(',type,ptr,'));')
end
end
else
local t = isbasic(type)
line = concatparam(line,' = ')
if t == 'state' then
line = concatparam(line, 'tolua_S;')
else
--print("t is "..tostring(t)..", ptr is "..tostring(self.ptr))
if t == 'number' and string.find(self.ptr, "%*") then
t = 'userdata'
end
if not t and ptr=='' then line = concatparam(line,'*') end
line = concatparam(line,'((',self.mod,type)
if not t then
line = concatparam(line,'*')
end
line = concatparam(line,') ')
if isenum(nctype) then
line = concatparam(line,'(int) ')
end
local def = 0
if self.def ~= '' then
def = self.def
if (ptr == '' or self.ptr == '&') and not t then
def = "(void*)&(const "..type..")"..def
end
end
if t then
line = concatparam(line,'tolua_to'..t,'(tolua_S,',narg,',',def,'));')
else
local to_func = get_to_function(type)
line = concatparam(line,to_func..'(tolua_S,',narg,',',def,'));')
end
end
end
return line
end
-- Declare variable
function classDeclaration:declare (narg)
if self.dim ~= '' and tonumber(self.dim)==nil then
output('#ifdef __cplusplus\n')
output(self:builddeclaration(narg,true))
output('#else\n')
output(self:builddeclaration(narg,false))
output('#endif\n')
else
output(self:builddeclaration(narg,false))
end
end
-- Get parameter value
function classDeclaration:getarray (narg)
if self.dim ~= '' then
local type = gsub(self.type,'const ','')
output(' {')
output('#ifndef TOLUA_RELEASE\n')
local def; if self.def~='' then def=1 else def=0 end
local t = isbasic(type)
if (t) then
output(' if (!tolua_is'..t..'array(tolua_S,',narg,',',self.dim,',',def,',&tolua_err))')
else
output(' if (!tolua_isusertypearray(tolua_S,',narg,',"',type,'",',self.dim,',',def,',&tolua_err))')
end
output(' goto tolua_lerror;')
output(' else\n')
output('#endif\n')
output(' {')
output(' int i;')
output(' for(i=0; i<'..self.dim..';i++)')
local t = isbasic(type)
local ptr = ''
if self.ptr~='' then ptr = '*' end
output(' ',self.name..'[i] = ')
if not t and ptr=='' then output('*') end
output('((',type)
if not t then
output('*')
end
output(') ')
local def = 0
if self.def ~= '' then def = self.def end
if t then
output('tolua_tofield'..t..'(tolua_S,',narg,',i+1,',def,'));')
else
output('tolua_tofieldusertype(tolua_S,',narg,',i+1,',def,'));')
end
output(' }')
output(' }')
end
end
-- Get parameter value
function classDeclaration:setarray (narg)
if not strfind(self.type,'const%s+') and self.dim ~= '' then
local type = gsub(self.type,'const ','')
output(' {')
output(' int i;')
output(' for(i=0; i<'..self.dim..';i++)')
local t,ct = isbasic(type)
if t then
output(' tolua_pushfield'..t..'(tolua_S,',narg,',i+1,(',ct,')',self.name,'[i]);')
else
if self.ptr == '' then
output(' {')
output('#ifdef __cplusplus\n')
output(' void* tolua_obj = Mtolua_new((',type,')(',self.name,'[i]));')
output(' tolua_pushfieldusertype_and_takeownership(tolua_S,',narg,',i+1,tolua_obj,"',type,'");')
output('#else\n')
output(' void* tolua_obj = tolua_copy(tolua_S,(void*)&',self.name,'[i],sizeof(',type,'));')
output(' tolua_pushfieldusertype(tolua_S,',narg,',i+1,tolua_obj,"',type,'");')
output('#endif\n')
output(' }')
else
output(' tolua_pushfieldusertype(tolua_S,',narg,',i+1,(void*)',self.name,'[i],"',type,'");')
end
end
output(' }')
end
end
-- Free dynamically allocated array
function classDeclaration:freearray ()
if self.dim ~= '' and tonumber(self.dim)==nil then
output('#ifdef __cplusplus\n')
output(' Mtolua_delete_dim(',self.name,');')
output('#else\n')
output(' free(',self.name,');')
output('#endif\n')
end
end
-- Pass parameter
function classDeclaration:passpar ()
if self.ptr=='&' and not isbasic(self.type) then
output('*'..self.name)
elseif self.ret=='*' then
output('&'..self.name)
else
output(self.name)
end
end
-- Return parameter value
function classDeclaration:retvalue ()
if self.ret ~= '' then
local t,ct = isbasic(self.type)
if t and t~='' then
output(' tolua_push'..t..'(tolua_S,(',ct,')'..self.name..');')
else
local push_func = get_push_function(self.type)
output(' ',push_func,'(tolua_S,(void*)'..self.name..',"',self.type,'");')
end
return 1
end
return 0
end
-- Internal constructor
function _Declaration (t)
setmetatable(t,classDeclaration)
t:buildnames()
t:checkname()
t:checktype()
local ft = findtype(t.type) or t.type
if not isenum(ft) then
t.mod, t.type = applytypedef(t.mod, ft)
end
if t.kind=="var" and (string.find(t.mod, "tolua_property%s") or string.find(t.mod, "tolua_property$")) then
t.mod = string.gsub(t.mod, "tolua_property", "tolua_property__"..get_property_type())
end
return t
end
-- Constructor
-- Expects the string declaration.
-- The kind of declaration can be "var" or "func".
function Declaration (s,kind,is_parameter)
-- eliminate spaces if default value is provided
s = gsub(s,"%s*=%s*","=")
s = gsub(s, "%s*<", "<")
local defb,tmpdef
defb,_,tmpdef = string.find(s, "(=.*)$")
if defb then
s = string.gsub(s, "=.*$", "")
else
tmpdef = ''
end
if kind == "var" then
-- check the form: void
if s == '' or s == 'void' then
return _Declaration{type = 'void', kind = kind, is_parameter = is_parameter}
end
end
-- check the form: mod type*& name
local t = split_c_tokens(s,'%*%s*&')
if t.n == 2 then
if kind == 'func' then
error("#invalid function return type: "..s)
end
--local m = split(t[1],'%s%s*')
local m = split_c_tokens(t[1],'%s+')
return _Declaration{
name = t[2]..tmpdef,
ptr = '*',
ret = '&',
--type = rebuild_template(m[m.n], tb, timpl),
type = m[m.n],
mod = concat(m,1,m.n-1),
is_parameter = is_parameter,
kind = kind
}
end
-- check the form: mod type** name
t = split_c_tokens(s,'%*%s*%*')
if t.n == 2 then
if kind == 'func' then
error("#invalid function return type: "..s)
end
--local m = split(t[1],'%s%s*')
local m = split_c_tokens(t[1],'%s+')
return _Declaration{
name = t[2]..tmpdef,
ptr = '*',
ret = '*',
--type = rebuild_template(m[m.n], tb, timpl),
type = m[m.n],
mod = concat(m,1,m.n-1),
is_parameter = is_parameter,
kind = kind
}
end
-- check the form: mod type& name
t = split_c_tokens(s,'&')
if t.n == 2 then
--local m = split(t[1],'%s%s*')
local m = split_c_tokens(t[1],'%s+')
return _Declaration{
name = t[2]..tmpdef,
ptr = '&',
--type = rebuild_template(m[m.n], tb, timpl),
type = m[m.n],
mod = concat(m,1,m.n-1),
is_parameter = is_parameter,
kind = kind
}
end
-- check the form: mod type* name
local s1 = gsub(s,"(%b\[\])",function (n) return gsub(n,'%*','\1') end)
t = split_c_tokens(s1,'%*')
if t.n == 2 then
t[2] = gsub(t[2],'\1','%*') -- restore * in dimension expression
--local m = split(t[1],'%s%s*')
local m = split_c_tokens(t[1],'%s+')
return _Declaration{
name = t[2]..tmpdef,
ptr = '*',
type = m[m.n],
--type = rebuild_template(m[m.n], tb, timpl),
mod = concat(m,1,m.n-1) ,
is_parameter = is_parameter,
kind = kind
}
end
if kind == 'var' then
-- check the form: mod type name
--t = split(s,'%s%s*')
t = split_c_tokens(s,'%s+')
local v
if findtype(t[t.n]) then v = create_varname() else v = t[t.n]; t.n = t.n-1 end
return _Declaration{
name = v..tmpdef,
--type = rebuild_template(t[t.n], tb, timpl),
type = t[t.n],
mod = concat(t,1,t.n-1),
is_parameter = is_parameter,
kind = kind
}
else -- kind == "func"
-- check the form: mod type name
--t = split(s,'%s%s*')
t = split_c_tokens(s,'%s+')
local v = t[t.n] -- last word is the function name
local tp,md
if t.n>1 then
tp = t[t.n-1]
md = concat(t,1,t.n-2)
end
--if tp then tp = rebuild_template(tp, tb, timpl) end
return _Declaration{
name = v,
type = tp,
mod = md,
is_parameter = is_parameter,
kind = kind
}
end
end -- tolua: variable class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Variable class
-- Represents a extern variable or a public member of a class.
-- Stores all fields present in a declaration.
classVariable = {
_get = {}, -- mapped get functions
_set = {}, -- mapped set functions
}
classVariable.__index = classVariable
setmetatable(classVariable,classDeclaration)
-- Print method
function classVariable:print (ident,close)
print(ident.."Variable{")
print(ident.." mod = '"..self.mod.."',")
print(ident.." type = '"..self.type.."',")
print(ident.." ptr = '"..self.ptr.."',")
print(ident.." name = '"..self.name.."',")
if self.dim then print(ident.." dim = '"..self.dim.."',") end
print(ident.." def = '"..self.def.."',")
print(ident.." ret = '"..self.ret.."',")
print(ident.."}"..close)
end
-- Generates C function name
function classVariable:cfuncname (prefix)
local parent = ""
local unsigned = ""
local ptr = ""
local p = self:inmodule() or self:innamespace() or self:inclass()
if p then
if self.parent.classtype == 'class' then
parent = "_" .. self.parent.type
else
parent = "_" .. p
end
end
if strfind(self.mod,"(unsigned)") then
unsigned = "_unsigned"
end
if self.ptr == "*" then ptr = "_ptr"
elseif self.ptr == "&" then ptr = "_ref"
end
local name = prefix .. parent .. unsigned .. "_" .. gsub(self.lname or self.name,".*::","") .. ptr
name = clean_template(name)
return name
end
-- check if it is a variable
function classVariable:isvariable ()
return true
end
-- get variable value
function classVariable:getvalue (class,static, prop_get)
local name
if prop_get then
name = prop_get.."()"
else
name = self.name
end
if class and static then
return self.parent.type..'::'..name
elseif class then
return 'self->'..name
else
return name
end
end
-- get variable pointer value
function classVariable:getpointervalue (class,static)
if class and static then
return class..'::p'
elseif class then
return 'self->p'
else
return 'p'
end
end
-- Write binding functions
function classVariable:supcode ()
local class = self:inclass()
local prop_get,prop_set
if string.find(self.mod, 'tolua_property') then
local _,_,type = string.find(self.mod, "tolua_property__([^%s]*)")
type = type or "default"
prop_get,prop_set = get_property_methods(type, self.name)
self.mod = string.gsub(self.mod, "tolua_property[^%s]*", "")
end
-- get function ------------------------------------------------
if class then
output("/* get function:",self.name," of class ",class," */")
else
output("/* get function:",self.name," */")
end
self.cgetname = self:cfuncname("tolua_get")
output("#ifndef TOLUA_DISABLE_"..self.cgetname)
output("\nstatic int",self.cgetname,"(lua_State* tolua_S)")
output("{")
-- declare self, if the case
local _,_,static = strfind(self.mod,'^%s*(static)')
if class and static==nil then
output(' ',self.parent.type,'*','self = ')
output('(',self.parent.type,'*) ')
local to_func = get_to_function(self.parent.type)
output(to_func,'(tolua_S,1,0);')
elseif static then
_,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)')
end
-- check self value
if class and static==nil then
output('#ifndef TOLUA_RELEASE\n')
output(' if (!self) tolua_error(tolua_S,"'..output_error_hook("invalid \'self\' in accessing variable \'%s\'", self.name)..'",NULL);');
output('#endif\n')
end
-- return value
if string.find(self.mod, 'tolua_inherits') then
local push_func = get_push_function(self.type)
output('#ifdef __cplusplus\n')
output(' ',push_func,'(tolua_S,(void*)static_cast<'..self.type..'*>(self), "',self.type,'");')
output('#else\n')
output(' ',push_func,'(tolua_S,(void*)(('..self.type..'*)self), "',self.type,'");')
output('#endif\n')
else
local t,ct = isbasic(self.type)
if t then
output(' tolua_push'..t..'(tolua_S,(',ct,')'..self:getvalue(class,static,prop_get)..');')
else
local push_func = get_push_function(self.type)
t = self.type
if self.ptr == '&' or self.ptr == '' then
output(' ',push_func,'(tolua_S,(void*)&'..self:getvalue(class,static,prop_get)..',"',t,'");')
else
output(' ',push_func,'(tolua_S,(void*)'..self:getvalue(class,static,prop_get)..',"',t,'");')
end
end
end
output(' return 1;')
output('}')
output('#endif //#ifndef TOLUA_DISABLE\n')
output('\n')
-- set function ------------------------------------------------
if not (strfind(self.type,'const%s+') or string.find(self.mod, 'tolua_readonly') or string.find(self.mod, 'tolua_inherits')) then
if class then
output("/* set function:",self.name," of class ",class," */")
else
output("/* set function:",self.name," */")
end
self.csetname = self:cfuncname("tolua_set")
output("#ifndef TOLUA_DISABLE_"..self.csetname)
output("\nstatic int",self.csetname,"(lua_State* tolua_S)")
output("{")
-- declare self, if the case
if class and static==nil then
output(' ',self.parent.type,'*','self = ')
output('(',self.parent.type,'*) ')
local to_func = get_to_function(self.parent.type)
output(to_func,'(tolua_S,1,0);')
-- check self value
end
-- check types
output('#ifndef TOLUA_RELEASE\n')
output(' tolua_Error tolua_err;')
if class and static==nil then
output(' if (!self) tolua_error(tolua_S,"'..output_error_hook("invalid \'self\' in accessing variable \'%s\'", self.name)..'",NULL);');
elseif static then
_,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)')
end
-- check variable type
output(' if ('..self:outchecktype(2)..')')
output(' tolua_error(tolua_S,"#vinvalid type in variable assignment.",&tolua_err);')
output('#endif\n')
-- assign value
local def = 0
if self.def ~= '' then def = self.def end
if self.type == 'char*' and self.dim ~= '' then -- is string
output(' strncpy((char*)')
if class and static then
output(self.parent.type..'::'..self.name)
elseif class then
output('self->'..self.name)
else
output(self.name)
end
output(',(const char*)tolua_tostring(tolua_S,2,',def,'),',self.dim,'-1);')
else
local ptr = ''
if self.ptr~='' then ptr = '*' end
output(' ')
local name = prop_set or self.name
if class and static then
output(self.parent.type..'::'..name)
elseif class then
output('self->'..name)
else
output(name)
end
local t = isbasic(self.type)
if prop_set then
output('(')
else
output(' = ')
end
if not t and ptr=='' then output('*') end
output('((',self.mod,self.type)
if not t then
output('*')
end
output(') ')
if t then
if isenum(self.type) then
output('(int) ')
end
output('tolua_to'..t,'(tolua_S,2,',def,'))')
else
local to_func = get_to_function(self.type)
output(to_func,'(tolua_S,2,',def,'))')
end
if prop_set then
output(")")
end
output(";")
end
output(' return 0;')
output('}')
output('#endif //#ifndef TOLUA_DISABLE\n')
output('\n')
end
end
function classVariable:register (pre)
if not self:check_public_access() then
return
end
pre = pre or ''
local parent = self:inmodule() or self:innamespace() or self:inclass()
if not parent then
if classVariable._warning==nil then
warning("Mapping variable to global may degrade performance")
classVariable._warning = 1
end
end
if self.csetname then
output(pre..'tolua_variable(tolua_S,"'..self.lname..'",'..self.cgetname..','..self.csetname..');')
else
output(pre..'tolua_variable(tolua_S,"'..self.lname..'",'..self.cgetname..',NULL);')
end
end
-- Internal constructor
function _Variable (t)
setmetatable(t,classVariable)
append(t)
return t
end
-- Constructor
-- Expects a string representing the variable declaration.
function Variable (s)
return _Variable (Declaration(s,'var'))
end -- tolua: array class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1999
-- $Id: array.lua,v 1.1 2000/11/06 22:03:57 celes Exp $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Array class
-- Represents a extern array variable or a public member of a class.
-- Stores all fields present in a declaration.
classArray = {
}
classArray.__index = classArray
setmetatable(classArray,classDeclaration)
-- Print method
function classArray:print (ident,close)
print(ident.."Array{")
print(ident.." mod = '"..self.mod.."',")
print(ident.." type = '"..self.type.."',")
print(ident.." ptr = '"..self.ptr.."',")
print(ident.." name = '"..self.name.."',")
print(ident.." def = '"..self.def.."',")
print(ident.." dim = '"..self.dim.."',")
print(ident.." ret = '"..self.ret.."',")
print(ident.."}"..close)
end
-- check if it is a variable
function classArray:isvariable ()
return true
end
-- get variable value
function classArray:getvalue (class,static)
if class and static then
return class..'::'..self.name..'[tolua_index]'
elseif class then
return 'self->'..self.name..'[tolua_index]'
else
return self.name..'[tolua_index]'
end
end
-- Write binding functions
function classArray:supcode ()
local class = self:inclass()
-- get function ------------------------------------------------
if class then
output("/* get function:",self.name," of class ",class," */")
else
output("/* get function:",self.name," */")
end
self.cgetname = self:cfuncname("tolua_get")
output("#ifndef TOLUA_DISABLE_"..self.cgetname)
output("\nstatic int",self.cgetname,"(lua_State* tolua_S)")
output("{")
output(" int tolua_index;")
-- declare self, if the case
local _,_,static = strfind(self.mod,'^%s*(static)')
if class and static==nil then
output(' ',self.parent.type,'*','self;')
output(' lua_pushstring(tolua_S,".self");')
output(' lua_rawget(tolua_S,1);')
output(' self = ')
output('(',self.parent.type,'*) ')
output('lua_touserdata(tolua_S,-1);')
elseif static then
_,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)')
end
-- check index
output('#ifndef TOLUA_RELEASE\n')
output(' {')
output(' tolua_Error tolua_err;')
output(' if (!tolua_isnumber(tolua_S,2,0,&tolua_err))')
output(' tolua_error(tolua_S,"#vinvalid type in array indexing.",&tolua_err);')
output(' }')
output('#endif\n')
if flags['1'] then -- for compatibility with tolua5 ?
output(' tolua_index = (int)tolua_tonumber(tolua_S,2,0)-1;')
else
output(' tolua_index = (int)tolua_tonumber(tolua_S,2,0);')
end
output('#ifndef TOLUA_RELEASE\n')
if self.dim and self.dim ~= '' then
output(' if (tolua_index<0 || tolua_index>='..self.dim..')')
else
output(' if (tolua_index<0)')
end
output(' tolua_error(tolua_S,"array indexing out of range.",NULL);')
output('#endif\n')
-- return value
local t,ct = isbasic(self.type)
local push_func = get_push_function(t)
if t then
output(' tolua_push'..t..'(tolua_S,(',ct,')'..self:getvalue(class,static)..');')
else
t = self.type
if self.ptr == '&' or self.ptr == '' then
output(' ',push_func,'(tolua_S,(void*)&'..self:getvalue(class,static)..',"',t,'");')
else
output(' ',push_func,'(tolua_S,(void*)'..self:getvalue(class,static)..',"',t,'");')
end
end
output(' return 1;')
output('}')
output('#endif //#ifndef TOLUA_DISABLE\n')
output('\n')
-- set function ------------------------------------------------
if not strfind(self.type,'const') then
if class then
output("/* set function:",self.name," of class ",class," */")
else
output("/* set function:",self.name," */")
end
self.csetname = self:cfuncname("tolua_set")
output("#ifndef TOLUA_DISABLE_"..self.csetname)
output("\nstatic int",self.csetname,"(lua_State* tolua_S)")
output("{")
-- declare index
output(' int tolua_index;')
-- declare self, if the case
local _,_,static = strfind(self.mod,'^%s*(static)')
if class and static==nil then
output(' ',self.parent.type,'*','self;')
output(' lua_pushstring(tolua_S,".self");')
output(' lua_rawget(tolua_S,1);')
output(' self = ')
output('(',self.parent.type,'*) ')
output('lua_touserdata(tolua_S,-1);')
elseif static then
_,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)')
end
-- check index
output('#ifndef TOLUA_RELEASE\n')
output(' {')
output(' tolua_Error tolua_err;')
output(' if (!tolua_isnumber(tolua_S,2,0,&tolua_err))')
output(' tolua_error(tolua_S,"#vinvalid type in array indexing.",&tolua_err);')
output(' }')
output('#endif\n')
if flags['1'] then -- for compatibility with tolua5 ?
output(' tolua_index = (int)tolua_tonumber(tolua_S,2,0)-1;')
else
output(' tolua_index = (int)tolua_tonumber(tolua_S,2,0);')
end
output('#ifndef TOLUA_RELEASE\n')
if self.dim and self.dim ~= '' then
output(' if (tolua_index<0 || tolua_index>='..self.dim..')')
else
output(' if (tolua_index<0)')
end
output(' tolua_error(tolua_S,"array indexing out of range.",NULL);')
output('#endif\n')
-- assign value
local ptr = ''
if self.ptr~='' then ptr = '*' end
output(' ')
if class and static then
output(class..'::'..self.name..'[tolua_index]')
elseif class then
output('self->'..self.name..'[tolua_index]')
else
output(self.name..'[tolua_index]')
end
local t = isbasic(self.type)
output(' = ')
if not t and ptr=='' then output('*') end
output('((',self.mod,self.type)
if not t then
output('*')
end
output(') ')
local def = 0
if self.def ~= '' then def = self.def end
if t then
output('tolua_to'..t,'(tolua_S,3,',def,'));')
else
local to_func = get_to_function(self.type)
output(to_func,'(tolua_S,3,',def,'));')
end
output(' return 0;')
output('}')
output('#endif //#ifndef TOLUA_DISABLE\n')
output('\n')
end
end
function classArray:register (pre)
if not self:check_public_access() then
return
end
pre = pre or ''
if self.csetname then
output(pre..'tolua_array(tolua_S,"'..self.lname..'",'..self.cgetname..','..self.csetname..');')
else
output(pre..'tolua_array(tolua_S,"'..self.lname..'",'..self.cgetname..',NULL);')
end
end
-- Internal constructor
function _Array (t)
setmetatable(t,classArray)
append(t)
return t
end
-- Constructor
-- Expects a string representing the variable declaration.
function Array (s)
return _Array (Declaration(s,'var'))
end -- tolua: function class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Function class
-- Represents a function or a class method.
-- The following fields are stored:
-- mod = type modifiers
-- type = type
-- ptr = "*" or "&", if representing a pointer or a reference
-- name = name
-- lname = lua name
-- args = list of argument declarations
-- const = if it is a method receiving a const "this".
classFunction = {
mod = '',
type = '',
ptr = '',
name = '',
args = {n=0},
const = '',
}
classFunction.__index = classFunction
setmetatable(classFunction,classFeature)
-- declare tags
function classFunction:decltype ()
self.type = typevar(self.type)
if strfind(self.mod,'const') then
self.type = 'const '..self.type
self.mod = gsub(self.mod,'const','')
end
local i=1
while self.args[i] do
self.args[i]:decltype()
i = i+1
end
end
-- Write binding function
-- Outputs C/C++ binding function.
function classFunction:supcode (local_constructor)
local overload = strsub(self.cname,-2,-1) - 1 -- indicate overloaded func
local nret = 0 -- number of returned values
local class = self:inclass()
local _,_,static = strfind(self.mod,'^%s*(static)')
if class then
if self.name == 'new' and self.parent.flags.pure_virtual then
-- no constructor for classes with pure virtual methods
return
end
if local_constructor then
output("/* method: new_local of class ",class," */")
else
output("/* method:",self.name," of class ",class," */")
end
else
output("/* function:",self.name," */")
end
if local_constructor then
output("#ifndef TOLUA_DISABLE_"..self.cname.."_local")
output("\nstatic int",self.cname.."_local","(lua_State* tolua_S)")
else
output("#ifndef TOLUA_DISABLE_"..self.cname)
output("\nstatic int",self.cname,"(lua_State* tolua_S)")
end
output("{")
-- check types
if overload < 0 then
output('#ifndef TOLUA_RELEASE\n')
end
output(' tolua_Error tolua_err;')
output(' if (\n')
-- check self
local narg
if class then narg=2 else narg=1 end
if class then
local func = get_is_function(self.parent.type)
local type = self.parent.type
if self.name=='new' or static~=nil then
func = 'tolua_isusertable'
type = self.parent.type
end
if self.const ~= '' then
type = "const "..type
end
output(' !'..func..'(tolua_S,1,"'..type..'",0,&tolua_err) ||\n')
end
-- check args
if self.args[1].type ~= 'void' then
local i=1
while self.args[i] do
local btype = isbasic(self.args[i].type)
if btype ~= 'value' and btype ~= 'state' then
output(' '..self.args[i]:outchecktype(narg)..' ||\n')
end
if btype ~= 'state' then
narg = narg+1
end
i = i+1
end
end
-- check end of list
output(' !tolua_isnoobj(tolua_S,'..narg..',&tolua_err)\n )')
output(' goto tolua_lerror;')
output(' else\n')
if overload < 0 then
output('#endif\n')
end
output(' {')
-- declare self, if the case
local narg
if class then narg=2 else narg=1 end
if class and self.name~='new' and static==nil then
output(' ',self.const,self.parent.type,'*','self = ')
output('(',self.const,self.parent.type,'*) ')
local to_func = get_to_function(self.parent.type)
output(to_func,'(tolua_S,1,0);')
elseif static then
_,_,self.mod = strfind(self.mod,'^%s*static%s%s*(.*)')
end
-- declare parameters
if self.args[1].type ~= 'void' then
local i=1
while self.args[i] do
self.args[i]:declare(narg)
if isbasic(self.args[i].type) ~= "state" then
narg = narg+1
end
i = i+1
end
end
-- check self
if class and self.name~='new' and static==nil then
output('#ifndef TOLUA_RELEASE\n')
output(' if (!self) tolua_error(tolua_S,"'..output_error_hook("invalid \'self\' in function \'%s\'", self.name)..'", NULL);');
output('#endif\n')
end
-- get array element values
if class then narg=2 else narg=1 end
if self.args[1].type ~= 'void' then
local i=1
while self.args[i] do
self.args[i]:getarray(narg)
narg = narg+1
i = i+1
end
end
pre_call_hook(self)
local out = string.find(self.mod, "tolua_outside")
-- call function
if class and self.name=='delete' then
output(' Mtolua_delete(self);')
elseif class and self.name == 'operator&[]' then
if flags['1'] then -- for compatibility with tolua5 ?
output(' self->operator[](',self.args[1].name,'-1) = ',self.args[2].name,';')
else
output(' self->operator[](',self.args[1].name,') = ',self.args[2].name,';')
end
else
output(' {')
if self.type ~= '' and self.type ~= 'void' then
output(' ',self.mod,self.type,self.ptr,'tolua_ret = ')
output('(',self.mod,self.type,self.ptr,') ')
else
output(' ')
end
if class and self.name=='new' then
output('Mtolua_new((',self.type,')(')
elseif class and static then
if out then
output(self.name,'(')
else
output(class..'::'..self.name,'(')
end
elseif class then
if out then
output(self.name,'(')
else
if self.cast_operator then
--output('static_cast<',self.mod,self.type,self.ptr,' >(*self')
output('self->operator ',self.mod,self.type,'(')
else
output('self->'..self.name,'(')
end
end
else
output(self.name,'(')
end
if out and not static then
output('self')
if self.args[1] and self.args[1].name ~= '' then
output(',')
end
end
-- write parameters
local i=1
while self.args[i] do
self.args[i]:passpar()
i = i+1
if self.args[i] then
output(',')
end
end
if class and self.name == 'operator[]' and flags['1'] then
output('-1);')
else
if class and self.name=='new' then
output('));') -- close Mtolua_new(
else
output(');')
end
end
-- return values
if self.type ~= '' and self.type ~= 'void' then
nret = nret + 1
local t,ct = isbasic(self.type)
if t and self.name ~= "new" then
if self.cast_operator and _basic_raw_push[t] then
output(' ',_basic_raw_push[t],'(tolua_S,(',ct,')tolua_ret);')
else
output(' tolua_push'..t..'(tolua_S,(',ct,')tolua_ret);')
end
else
t = self.type
new_t = string.gsub(t, "const%s+", "")
local owned = false
if string.find(self.mod, "tolua_owned") then
owned = true
end
local push_func = get_push_function(t)
if self.ptr == '' then
output(' {')
output('#ifdef __cplusplus\n')
output(' void* tolua_obj = Mtolua_new((',new_t,')(tolua_ret));')
output(' ',push_func,'(tolua_S,tolua_obj,"',t,'");')
output(' tolua_register_gc(tolua_S,lua_gettop(tolua_S));')
output('#else\n')
output(' void* tolua_obj = tolua_copy(tolua_S,(void*)&tolua_ret,sizeof(',t,'));')
output(' ',push_func,'(tolua_S,tolua_obj,"',t,'");')
output(' tolua_register_gc(tolua_S,lua_gettop(tolua_S));')
output('#endif\n')
output(' }')
elseif self.ptr == '&' then
output(' ',push_func,'(tolua_S,(void*)&tolua_ret,"',t,'");')
else
output(' ',push_func,'(tolua_S,(void*)tolua_ret,"',t,'");')
if owned or local_constructor then
output(' tolua_register_gc(tolua_S,lua_gettop(tolua_S));')
end
end
end
end
local i=1
while self.args[i] do
nret = nret + self.args[i]:retvalue()
i = i+1
end
output(' }')
-- set array element values
if class then narg=2 else narg=1 end
if self.args[1].type ~= 'void' then
local i=1
while self.args[i] do
self.args[i]:setarray(narg)
narg = narg+1
i = i+1
end
end
-- free dynamically allocated array
if self.args[1].type ~= 'void' then
local i=1
while self.args[i] do
self.args[i]:freearray()
i = i+1
end
end
end
post_call_hook(self)
output(' }')
output(' return '..nret..';')
-- call overloaded function or generate error
if overload < 0 then
output('#ifndef TOLUA_RELEASE\n')
output('tolua_lerror:\n')
output(' tolua_error(tolua_S,"'..output_error_hook("#ferror in function \'%s\'.", self.lname)..'",&tolua_err);')
output(' return 0;')
output('#endif\n')
else
local _local = ""
if local_constructor then
_local = "_local"
end
output('tolua_lerror:\n')
output(' return '..strsub(self.cname,1,-3)..format("%02d",overload).._local..'(tolua_S);')
end
output('}')
output('#endif //#ifndef TOLUA_DISABLE\n')
output('\n')
-- recursive call to write local constructor
if class and self.name=='new' and not local_constructor then
self:supcode(1)
end
end
-- register function
function classFunction:register (pre)
if not self:check_public_access() then
return
end
if self.name == 'new' and self.parent.flags.pure_virtual then
-- no constructor for classes with pure virtual methods
return
end
output(pre..'tolua_function(tolua_S,"'..self.lname..'",'..self.cname..');')
if self.name == 'new' then
output(pre..'tolua_function(tolua_S,"new_local",'..self.cname..'_local);')
output(pre..'tolua_function(tolua_S,".call",'..self.cname..'_local);')
--output(' tolua_set_call_event(tolua_S,'..self.cname..'_local, "'..self.parent.type..'");')
end
end
-- Print method
function classFunction:print (ident,close)
print(ident.."Function{")
print(ident.." mod = '"..self.mod.."',")
print(ident.." type = '"..self.type.."',")
print(ident.." ptr = '"..self.ptr.."',")
print(ident.." name = '"..self.name.."',")
print(ident.." lname = '"..self.lname.."',")
print(ident.." const = '"..self.const.."',")
print(ident.." cname = '"..self.cname.."',")
print(ident.." lname = '"..self.lname.."',")
print(ident.." args = {")
local i=1
while self.args[i] do
self.args[i]:print(ident.." ",",")
i = i+1
end
print(ident.." }")
print(ident.."}"..close)
end
-- check if it returns an object by value
function classFunction:requirecollection (t)
local r = false
if self.type ~= '' and not isbasic(self.type) and self.ptr=='' then
local type = gsub(self.type,"%s*const%s+","")
t[type] = "tolua_collect_" .. clean_template(type)
r = true
end
local i=1
while self.args[i] do
r = self.args[i]:requirecollection(t) or r
i = i+1
end
return r
end
-- determine lua function name overload
function classFunction:overload ()
return self.parent:overload(self.lname)
end
function param_object(par) -- returns true if the parameter has an object as its default value
if not string.find(par, '=') then return false end -- it has no default value
local _,_,def = string.find(par, "=(.*)$")
if string.find(par, "|") then -- a list of flags
return true
end
if string.find(par, "%*") then -- it's a pointer with a default value
if string.find(par, '=%s*new') or string.find(par, "%(") then -- it's a pointer with an instance as default parameter.. is that valid?
return true
end
return false -- default value is 'NULL' or something
end
if string.find(par, "[%(&]") then
return true
end -- default value is a constructor call (most likely for a const reference)
--if string.find(par, "&") then
-- if string.find(def, ":") or string.find(def, "^%s*new%s+") then
-- -- it's a reference with default to something like Class::member, or 'new Class'
-- return true
-- end
--end
return false -- ?
end
function strip_last_arg(all_args, last_arg) -- strips the default value from the last argument
local _,_,s_arg = string.find(last_arg, "^([^=]+)")
last_arg = string.gsub(last_arg, "([%%%(%)])", "%%%1");
all_args = string.gsub(all_args, "%s*,%s*"..last_arg.."%s*%)%s*$", ")")
return all_args, s_arg
end
-- Internal constructor
function _Function (t)
setmetatable(t,classFunction)
if t.const ~= 'const' and t.const ~= '' then
error("#invalid 'const' specification")
end
append(t)
if t:inclass() then
--print ('t.name is '..t.name..', parent.name is '..t.parent.name)
if string.gsub(t.name, "%b<>", "") == string.gsub(t.parent.original_name or t.parent.name, "%b<>", "") then
t.name = 'new'
t.lname = 'new'
t.parent._new = true
t.type = t.parent.name
t.ptr = '*'
elseif string.gsub(t.name, "%b<>", "") == '~'..string.gsub(t.parent.original_name or t.parent.name, "%b<>", "") then
t.name = 'delete'
t.lname = 'delete'
t.parent._delete = true
end
end
t.cname = t:cfuncname("tolua")..t:overload(t)
return t
end
-- Constructor
-- Expects three strings: one representing the function declaration,
-- another representing the argument list, and the third representing
-- the "const" or empty string.
function Function (d,a,c)
--local t = split(strsub(a,2,-2),',') -- eliminate braces
--local t = split_params(strsub(a,2,-2))
if not flags['W'] and string.find(a, "%.%.%.%s*%)") then
warning("Functions with variable arguments (`...') are not supported. Ignoring "..d..a..c)
return nil
end
local i=1
local l = {n=0}
a = string.gsub(a, "%s*([%(%)])%s*", "%1")
local t,strip,last = strip_pars(strsub(a,2,-2));
if strip then
--local ns = string.sub(strsub(a,1,-2), 1, -(string.len(last)+1))
local ns = join(t, ",", 1, last-1)
ns = "("..string.gsub(ns, "%s*,%s*$", "")..')'
--ns = strip_defaults(ns)
local f = Function(d, ns, c)
for i=1,last do
t[i] = string.gsub(t[i], "=.*$", "")
end
end
while t[i] do
l.n = l.n+1
l[l.n] = Declaration(t[i],'var',true)
i = i+1
end
local f = Declaration(d,'func')
f.args = l
f.const = c
return _Function(f)
end
function join(t, sep, first, last)
first = first or 1
last = last or table.getn(t)
local lsep = ""
local ret = ""
local loop = false
for i = first,last do
ret = ret..lsep..t[i]
lsep = sep
loop = true
end
if not loop then
return ""
end
return ret
end
function strip_pars(s)
local t = split_c_tokens(s, ',')
local strip = false
local last
for i=t.n,1,-1 do
if not strip and param_object(t[i]) then
last = i
strip = true
end
--if strip then
-- t[i] = string.gsub(t[i], "=.*$", "")
--end
end
return t,strip,last
end
function strip_defaults(s)
s = string.gsub(s, "^%(", "")
s = string.gsub(s, "%)$", "")
local t = split_c_tokens(s, ",")
local sep, ret = "",""
for i=1,t.n do
t[i] = string.gsub(t[i], "=.*$", "")
ret = ret..sep..t[i]
sep = ","
end
return "("..ret..")"
end -- tolua: operator class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Operator class
-- Represents an operator function or a class operator method.
-- It stores the same fields as functions do plus:
-- kind = set of character representing the operator (as it appers in C++ code)
classOperator = {
kind = '',
}
classOperator.__index = classOperator
setmetatable(classOperator,classFunction)
-- table to transform operator kind into the appropriate tag method name
_TM = {['+'] = 'add',
['-'] = 'sub',
['*'] = 'mul',
['/'] = 'div',
['<'] = 'lt',
['<='] = 'le',
['=='] = 'eq',
['[]'] = 'geti',
['&[]'] = 'seti',
--['->'] = 'flechita',
}
-- Print method
function classOperator:print (ident,close)
print(ident.."Operator{")
print(ident.." kind = '"..self.kind.."',")
print(ident.." mod = '"..self.mod.."',")
print(ident.." type = '"..self.type.."',")
print(ident.." ptr = '"..self.ptr.."',")
print(ident.." name = '"..self.name.."',")
print(ident.." const = '"..self.const.."',")
print(ident.." cname = '"..self.cname.."',")
print(ident.." lname = '"..self.lname.."',")
print(ident.." args = {")
local i=1
while self.args[i] do
self.args[i]:print(ident.." ",",")
i = i+1
end
print(ident.." }")
print(ident.."}"..close)
end
function classOperator:supcode_tmp()
if not _TM[self.kind] then
return classFunction.supcode(self)
end
-- no overload, no parameters, always inclass
output("/* method:",self.name," of class ",self:inclass()," */")
output("#ifndef TOLUA_DISABLE_"..self.cname)
output("\nstatic int",self.cname,"(lua_State* tolua_S)")
if overload < 0 then
output('#ifndef TOLUA_RELEASE\n')
end
output(' tolua_Error tolua_err;')
output(' if (\n')
-- check self
local is_func = get_is_function(self.parent.type)
output(' !'..is_func..'(tolua_S,1,"'..self.parent.type..'",0,&tolua_err) ||\n')
output(' !tolua_isnoobj(tolua_S,2,&tolua_err)\n )')
output(' goto tolua_lerror;')
output(' else\n')
output('#endif\n') -- tolua_release
output(' {')
-- declare self
output(' ',self.const,self.parent.type,'*','self = ')
output('(',self.const,self.parent.type,'*) ')
local to_func = get_to_func(self.parent.type)
output(to_func,'(tolua_S,1,0);')
-- check self
output('#ifndef TOLUA_RELEASE\n')
output(' if (!self) tolua_error(tolua_S,"'..output_error_hook("invalid \'self\' in function \'%s\'", self.name)..'",NULL);');
output('#endif\n')
-- cast self
output(' ',self.mod,self.type,self.ptr,'tolua_ret = ')
output('(',self.mod,self.type,self.ptr,')(*self);')
-- return value
local t,ct = isbasic(self.type)
if t then
output(' tolua_push'..t..'(tolua_S,(',ct,')tolua_ret);')
else
t = self.type
local push_func = get_push_function(t)
new_t = string.gsub(t, "const%s+", "")
if self.ptr == '' then
output(' {')
output('#ifdef __cplusplus\n')
output(' void* tolua_obj = Mtolua_new((',new_t,')(tolua_ret));')
output(' ',push_func,'(tolua_S,tolua_obj,"',t,'");')
output(' tolua_register_gc(tolua_S,lua_gettop(tolua_S));')
output('#else\n')
output(' void* tolua_obj = tolua_copy(tolua_S,(void*)&tolua_ret,sizeof(',t,'));')
output(' ',push_func,'(tolua_S,tolua_obj,"',t,'");')
output(' tolua_register_gc(tolua_S,lua_gettop(tolua_S));')
output('#endif\n')
output(' }')
elseif self.ptr == '&' then
output(' ',push_func,'(tolua_S,(void*)&tolua_ret,"',t,'");')
else
if local_constructor then
output(' ',push_func,'(tolua_S,(void *)tolua_ret,"',t,'");')
output(' tolua_register_gc(tolua_S,lua_gettop(tolua_S));')
else
output(' ',push_func,'(tolua_S,(void*)tolua_ret,"',t,'");')
end
end
end
output(' }')
output(' return 1;')
output('#ifndef TOLUA_RELEASE\n')
output('tolua_lerror:\n')
output(' tolua_error(tolua_S,"'..output_error_hook("#ferror in function \'%s\'.", self.lname)..'",&tolua_err);')
output(' return 0;')
output('#endif\n')
output('}')
output('#endif //#ifndef TOLUA_DISABLE\n')
output('\n')
end
-- Internal constructor
function _Operator (t)
setmetatable(t,classOperator)
if t.const ~= 'const' and t.const ~= '' then
error("#invalid 'const' specification")
end
append(t)
if not t:inclass() then
error("#operator can only be defined as class member")
end
--t.name = t.name .. "_" .. (_TM[t.kind] or t.kind)
t.cname = t:cfuncname("tolua")..t:overload(t)
t.name = "operator" .. t.kind -- set appropriate calling name
return t
end
-- Constructor
function Operator (d,k,a,c)
local op_k = string.gsub(k, "^%s*", "")
op_k = string.gsub(k, "%s*$", "")
--if string.find(k, "^[%w_:%d<>%*%&]+$") then
if d == "operator" and k ~= '' then
d = k.." operator"
elseif not _TM[op_k] then
if flags['W'] then
error("tolua: no support for operator" .. f.kind)
else
warning("No support for operator "..op_k..", ignoring")
return nil
end
end
local ref = ''
local t = split_c_tokens(strsub(a,2,strlen(a)-1),',') -- eliminate braces
local i=1
local l = {n=0}
while t[i] do
l.n = l.n+1
l[l.n] = Declaration(t[i],'var')
i = i+1
end
if k == '[]' then
local _
_, _, ref = strfind(d,'(&)')
d = gsub(d,'&','')
elseif k=='&[]' then
l.n = l.n+1
l[l.n] = Declaration(d,'var')
l[l.n].name = 'tolua_value'
end
local f = Declaration(d,'func')
if k == '[]' and (l[1]==nil or isbasic(l[1].type)~='number') then
error('operator[] can only be defined for numeric index.')
end
f.args = l
f.const = c
f.kind = op_k
f.lname = "."..(_TM[f.kind] or f.kind)
if not _TM[f.kind] then
f.cast_operator = true
end
if f.kind == '[]' and ref=='&' and f.const~='const' then
Operator(d,'&'..k,a,c) -- create correspoding set operator
end
return _Operator(f)
end
_global_templates = {}
classTemplateClass = {
name = '',
body = '',
parents = {},
args = {}, -- the template arguments
}
classTemplateClass.__index = classTemplateClass
function classTemplateClass:throw(types, local_scope)
--if table.getn(types) ~= table.getn(self.args) then
-- error("#invalid parameter count")
--end
-- replace
for i =1 , types.n do
local Il = split_c_tokens(types[i], " ")
if table.getn(Il) ~= table.getn(self.args) then
error("#invalid parameter count for "..types[i])
end
local bI = self.body
local pI = {}
for j = 1,self.args.n do
--Tl[j] = findtype(Tl[j]) or Tl[j]
bI = string.gsub(bI, "([^_%w])"..self.args[j].."([^_%w])", "%1"..Il[j].."%2")
if self.parents then
for i=1,table.getn(self.parents) do
pI[i] = string.gsub(self.parents[i], "([^_%w]?)"..self.args[j].."([^_%w]?)", "%1"..Il[j].."%2")
end
end
end
--local append = "<"..string.gsub(types[i], "%s+", ",")..">"
local append = "<"..concat(Il, 1, table.getn(Il), ",")..">"
append = string.gsub(append, "%s*,%s*", ",")
append = string.gsub(append, ">>", "> >")
for i=1,table.getn(pI) do
--pI[i] = string.gsub(pI[i], ">>", "> >")
pI[i] = resolve_template_types(pI[i])
end
bI = string.gsub(bI, ">>", "> >")
local n = self.name
if local_scope then
n = self.local_name
end
Class(n..append, pI, bI)
end
end
function TemplateClass(name, parents, body, parameters)
local o = {
parents = parents,
body = body,
args = parameters,
}
local oname = string.gsub(name, "@.*$", "")
oname = getnamespace(classContainer.curr)..oname
o.name = oname
o.local_name = name
setmetatable(o, classTemplateClass)
if _global_templates[oname] then
warning("Duplicate declaration of template "..oname)
else
_global_templates[oname] = o
end
return o
end -- tolua: class class
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Class class
-- Represents a class definition.
-- Stores the following fields:
-- name = class name
-- base = class base, if any (only single inheritance is supported)
-- {i} = list of members
classClass = {
classtype = 'class',
name = '',
base = '',
type = '',
btype = '',
ctype = '',
}
classClass.__index = classClass
setmetatable(classClass,classContainer)
-- register class
function classClass:register (pre)
if not self:check_public_access() then
return
end
pre = pre or ''
push(self)
if _collect[self.type] then
output(pre,'#ifdef __cplusplus\n')
output(pre..'tolua_cclass(tolua_S,"'..self.lname..'","'..self.type..'","'..self.btype..'",'.._collect[self.type]..');')
output(pre,'#else\n')
output(pre..'tolua_cclass(tolua_S,"'..self.lname..'","'..self.type..'","'..self.btype..'",NULL);')
output(pre,'#endif\n')
else
output(pre..'tolua_cclass(tolua_S,"'..self.lname..'","'..self.type..'","'..self.btype..'",NULL);')
end
if self.extra_bases then
for k,base in ipairs(self.extra_bases) do
-- not now
--output(pre..' tolua_addbase(tolua_S, "'..self.type..'", "'..base..'");')
end
end
output(pre..'tolua_beginmodule(tolua_S,"'..self.lname..'");')
local i=1
while self[i] do
self[i]:register(pre..' ')
i = i+1
end
output(pre..'tolua_endmodule(tolua_S);')
pop()
end
-- return collection requirement
function classClass:requirecollection (t)
if self.flags.protected_destructor or (not self:check_public_access()) then
return false
end
push(self)
local r = false
local i=1
while self[i] do
r = self[i]:requirecollection(t) or r
i = i+1
end
pop()
-- only class that exports destructor can be appropriately collected
-- classes that export constructors need to have a collector (overrided by -D flag on command line)
if self._delete or ((not flags['D']) and self._new) then
--t[self.type] = "tolua_collect_" .. gsub(self.type,"::","_")
t[self.type] = "tolua_collect_" .. clean_template(self.type)
r = true
end
return r
end
-- output tags
function classClass:decltype ()
push(self)
self.type = regtype(self.original_name or self.name)
self.btype = typevar(self.base)
self.ctype = 'const '..self.type
if self.extra_bases then
for i=1,table.getn(self.extra_bases) do
self.extra_bases[i] = typevar(self.extra_bases[i])
end
end
local i=1
while self[i] do
self[i]:decltype()
i = i+1
end
pop()
end
-- Print method
function classClass:print (ident,close)
print(ident.."Class{")
print(ident.." name = '"..self.name.."',")
print(ident.." base = '"..self.base.."';")
print(ident.." lname = '"..self.lname.."',")
2011-10-03 18:41:19 +00:00
print(ident.." type = '"..self.type.."',")
print(ident.." btype = '"..self.btype.."',")
print(ident.." ctype = '"..self.ctype.."',")
local i=1
while self[i] do
self[i]:print(ident.." ",",")
i = i+1
end
print(ident.."}"..close)
end
function classClass:set_protected_destructor(p)
self.flags.protected_destructor = self.flags.protected_destructor or p
end
-- Internal constructor
function _Class (t)
setmetatable(t,classClass)
t:buildnames()
append(t)
return t
end
-- Constructor
-- Expects the name, the base (array) and the body of the class.
function Class (n,p,b)
if table.getn(p) > 1 then
b = string.sub(b, 1, -2)
for i=2,table.getn(p),1 do
b = b.."\n tolua_inherits "..p[i].." __"..p[i].."__;\n"
end
b = b.."\n}"
end
-- check for template
b = string.gsub(b, "^{%s*TEMPLATE_BIND", "{\nTOLUA_TEMPLATE_BIND")
local t,_,T,I = string.find(b, '^{%s*TOLUA_TEMPLATE_BIND%s*%(+%s*\"?([^\",]*)\"?%s*,%s*([^%)]*)%s*%)+')
if t then
-- remove quotes
I = string.gsub(I, "\"", "")
T = string.gsub(T, "\"", "")
-- get type list
local types = split_c_tokens(I, ",")
-- remove TEMPLATE_BIND line
local bs = string.gsub(b, "^{%s*TOLUA_TEMPLATE_BIND[^\n]*\n", "{\n")
local Tl = split(T, " ")
local tc = TemplateClass(n, p, bs, Tl)
tc:throw(types, true)
--for i=1,types.n do
-- tc:throw(split_c_tokens(types[i], " "), true)
--end
return
end
local mbase
if p then
mbase = table.remove(p, 1)
if not p[1] then p = nil end
end
mbase = mbase and resolve_template_types(mbase)
local c
local oname = string.gsub(n, "@.*$", "")
oname = getnamespace(classContainer.curr)..oname
if _global_classes[oname] then
c = _global_classes[oname]
if mbase and ((not c.base) or c.base == "") then
c.base = mbase
end
else
c = _Class(_Container{name=n, base=mbase, extra_bases=p})