%!PS-Adobe-2.0 %%Creator: dvips 5.58 Copyright 1986, 1994 Radical Eye Software %%Pages: 12 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentFonts: Times-Bold Times-Roman Courier Times-Italic %%+ Syntax-Roman Syntax-Italic Syntax-Bold %%EndComments %DVIPSCommandLine: dvips -f %DVIPSParameters: dpi=600, comments removed %DVIPSSource: TeX output 1996.11.08:1702 %%BeginProcSet: tex.pro /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict /eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail {dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ 4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet %%BeginFont: Syntax-Roman %!PS-AdobeFont-1.0: Syntax-Roman 001.001 %%CreationDate: Tue Feb 13 21:12:20 1990 %%VMusage: 25174 32066 %% The digitally encoded machine readable software for producing the %% Typefaces licensed to you is copyrighted (c) 1989, 1990 Adobe Systems. All %% Rights Reserved. This software is the property of Adobe Systems %% Incorporated and its licensors, and may not be reproduced, used, %% displayed, modified, disclosed or transferred without the express written %% approval of Adobe. The digitally encoded machine readable outline data %% for producing the Typefaces licensed to you is copyrighted (c) 1981 %% Linotype AG and/or its subsidiaries. All Rights Reserved. This data is %% the property of Linotype AG and/or its subsidiaries and may not be %% reproduced, used, displayed, modified, disclosed or transferred without %% the express written approval of Linotype AG and/or its subsidiaries. %% Syntax is a registered trademark of Linotype AG and/or its subsidiaries. 11 dict begin /FontInfo 10 dict dup begin /version (001.001) readonly def /Notice (Copyright (c) 1989, 1990 Adobe Systems Incorporated. All Rights Reserved.Syntax is a registered trademark of Linotype AG and/or its subsidiaries.) readonly def /Copyright ( The digitally encoded machine readable software for producing the Typefaces licensed to you is copyrighted (c) 1989, 1990 Adobe Systems. All Rights Reserved. This software is the property of Adobe Systems Incorporated and its licensors, and may not be reproduced, used, displayed, modified, disclosed or transferred without the express written approval of Adobe. The digitally encoded machine readable outline data for producing the Typefaces licensed to you is copyrighted (c) 1981 Linotype AG and/or its subsidiaries. All Rights Reserved. This data is the property of Linotype AG and/or its subsidiaries and may not be reproduced, used, displayed, modified, disclosed or transferred without the express written approval of Linotype AG and/or its subsidiaries. ) readonly def /FullName (Syntax) readonly def /FamilyName (Syntax) readonly def /Weight (Roman) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /Syntax-Roman def /Encoding StandardEncoding def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /UniqueID 28016 def /FontBBox{-162 -252 1000 937}readonly def currentdict end currentfile eexec CA1B70EE20C79173943EFFE588E6BCF48359D5E2EAC695C74473347CC362247CF7C90C67A5B9 8BE3250135E0AAAB3A1F985D00D66C9DAFC68358E1CE17EF17A4F5E0DF3B807E01666F07B0D2 514B3DBB841CA968CF83FA0E945D6E0B5020511AE814C6E6FE05BAF1B45EC589105A2F699335 50FE1185E09F9CDE9BBC3E333869E34D7325209842BFF3AA94A980F813AB88B727DD8B2372B9 7EB5D3E628D52F8D1F5C15BDE0DCE9AAA871C9CF973D231E0D85F46493AAD624BB9F49769C5A B09A4BD13730232E80ACB970F66DDAEBA5F5595D5236EBDAAC2E596931A357CD733750ACA5B1 1DE65B4BC4D24AA0BE709780A50F39DF524F3488833A83CCE5FC9DF06AFDC109571F7266456B E9EDD8091A44386E1787E9E9FD0D34F3292D4D64808300A5700F2F9E394BC4B9F23CA437BB9B EC44F8F7FB0D7DE6017B0E94B28BD4D3D1DCD48E459C6B6895D8109CB32363675C95F2490044 65B7F9CF98D2E06690F9121E0D525D6E5CD21E61D08C90288968DBE2BE652D8A79A3C3369212 688E34F2CCD8D6A8B0771FEDBB6ECE0FE7A894FFB1D5BE027E69C134F4194812F2DC7025CB85 F7622B4482577560D6A103297898A29C024A00FBBC65242CB752D807B58594516106FEF99F5A 913BC2874DC4406E3ECD77F68A4B540235F24B5C8AFBE05CCEBE06D16FA35BC57DF09D48F3A3 6FE9ECDC746E81AAC18549DB05B77069FBCB71BAEBA7EFE2166A654EDD9BE394A98BFB1C70A6 FF97297BF2996E870F0B5BE663568A1550139733C065A490F8CEADAD35058D10C5ADF6026B8C 879EBDE585F90544931B55B084918CFC102AE8263E1EECA8D0EC14D9CBDD1979D9CE9F6659E6 50FE794B8486FC8F4866957E6CA67FF183232D54E7EA99AE40EC2D7CA95C4EF4B6A2FE3565D1 46215DC23460F925329F61986BC3AF22C7CF102E9FA94464C4F2750F9BAE04F77C8619AF2CDD 623A68291B5087EF4E3520C4768EED6E3B1E6E62825D76C7B2AA9C2DBE630573381171AD30DD 5333266408B9092056014D672FCB01A0076D2B3DFD26E23B616C7939EBC65556830089336219 4BDD20026E6DDA2BCD8BF1629F684FE3AD968FDECB48D0707D9CCDBF7D68D595BC598D4DF3F0 91050BC814CA3304037C111999EC4CABEE782C2EF9ED6F39C86720178248D3663E51635F223E D5F7E7086FF5C10D884B5CBF0300AFDD0052B1938546A3B83C633E461EB5A27746B0F3F1B8FE 28B04E8B02E28B43154084CCB97A664ACAE5658E114A4960727D2AF7CC179189BBDC7B1A967F 07A9206EB27B1A341F5C2E2649297424BD356EA9DC4EB72758C80CA6B7C053FA42E19B6B58F0 4D04196025881F7B855EB541C4D87263165C83521D3224F78CEC84AC888C78A0DE429FC7C50D D91D5A657F699667B3ADF6B26D7B4DC6EBAEBC7EA8D0D05BEC79B72382A64799564FC2A8B5E5 75E26F8057FFD0D4A6FF9F03824A8E697B22BDFF1CCCDF546617BD35CA0C79E232B01EB36CD6 D6D56A345CEFC1B299CA0153E1F0E65D00BA874DF632003209DFA456A1A560F1F7104234BBFE B6808C5794F1EA6A6A301F62D7759900A66C7177D6DA573AD835AC53B1D39D91B64644E3DBCF 56557587B407AB60CF9BDCFDC59AB59278F9497698DF4CFB90F86B0CC81D3426364EFCCD46CD 6181C424FFBDFC31A3C31955B32A6D2D987F49B298BF85D6A89600ADF3783CF01A4B825FFEB2 C0F578F4D031AB958B2B075DCE85275CFCCD92CA987DF25AF3B0271B027B05C340CDE1C6CA2D B7780B78086927220B944BFE8EB3DDC4473BCE5D3168228310BC2024ABEB7F6CE5675BF4BF69 5D5C16118A01952FAB1524C2F805F7A0245A6408C5CAE100606CA45EF3D65BCFDB58AC95B929 E43002F25EBCB78700AF1ABD610F5F1BCA188596AD078C487DD25930A0C7C921F079CA52AA31 F6BC4063BB2B9FCACE424966C257397E9BE44319DC0A3CDE25B2E4D3FEB9D6141AE156A65CD3 EB7C16EE2F89D73A68121F424494DED909D772001CBA47302C6EE832C02553AA68842E7FD4BC CC7BC9B1A9ACC5F02B80D09A48E4B630C8C57AB5A4C0925B36ED5085F5614A66A342E00623E9 733B0563453FFF5A5F786648E415F4A1CF4D04AC80E412B4135A0D606A8DFECFBA9739264A2D 5ECEBF54561A225451D526A2C0ED4E719D39E5C3E62F4C519BEE994A9CCE79C4FF7F1BA52D0A 727739250FBC12AD3D9EF3C72891968D580C5691B971B20FF59D3D705592C16785DB8B91B08D 74DFB70F055702D82795DF63F5E35493F60A8088461FE275BA0C844363537B1AC8682445AFAE 252B2E623F3ECE53E795B846D7190712C6A9135B02D10F5E67BEC6467ED6DD077BE121B35097 8312F063A2C761DC64747898F79BEE595CCFC633265AA5ED4ADBBBA05ED6800FB5F9D88A778D 39501A2C8146189C782EF5E77FD88969A3F3DD153B1F190B1C7EA628BFB0F14BD97F7CFAF573 E0A861C8922C000B0536337D5579529C023CE7F7E9EA328265318AFD9C78AC2A3A854D99BBE1 815142B25DB0497B6B83243EBBD9E54A2967D5C1AD34DFA827D69B84406CE9958BB8ACAD1B53 0640A140AB11201BBBFBB3C18C7F811796189D0B3A42F990E1AD20506BB9DF192406C029F590 EE857A320E2F51E710C648397AFC97616FD1E4C6FB59B008456EAE0FF8E22BC798AEC2817D55 87EB14FEB466EE2CD00B7432C28F1766B11CF8595DC99AEB38FE90E9C7789482D8D33867DB81 62927981E3955A5ED2C2FCD40D8146B8F04AB9D5104B26E93F32E3FBCF70660432E97BB68879 8686577D16A67FF8302C6A56BA6E71266F3360C355698E32D9FE297640C0AB4684B97C379B25 80EFFAC99FEBC2B0D1946AFC6623654F3D93379EB75E6F47B47EBD3503A533F1C479252D9450 45E00BFDBB6B24D6E229773965D269AD30F9B2FE28A30B0DD1460714BD283D62C9742E632E95 92E9966BC271E015B5642DDBF3CE82D859368591740F10520C40CC117B0F8F086A3E341E33A2 FFFEBABF8C4F0D045A0BB5104CF93172F819E438A97CC17D64AD2EC9435ABDB0F21B7E12B3BC 3C0265D82C9C1D7A7DB5B76D891228BDF0437EB65B7889A4FFA499B4589FE586BC4EA5440363 7843BCAC337BC8C44ECDAF9ABD6DEAFA61DA5A11AE83EEBF2DE02FFC35152252FDE3C12E1E3B 1B3077FF85736B02F894C296BF34CF2A654946B67B1EA45793C88B825B273A7CCEBA0D0DB3E1 E818D8C06D611704BC0AA1D0A0CDB79071E764B4EA9E18D6F0F231493F420BBC23BA69BEB518 C8768E58BEB44068BDD0A531CEDE1A668109200382D501327581AE58D62204F774E61B8B45F3 E8DDBF9F5CB68B6D636E17D938515600E7BBF4C35092A359C06D38E79582ADB75D3EDD7B2CA5 A1C447A40084861DC20781346C4C4B324DFFC810090A05828155F4FBCB291EF397ACD04DA5FB 35DAC9E46660164E755C63B0020E2FD182752849BCEA4901FC3E233FCDEBB2918B923C5F764A E60578CA16E51571A088B93FB555CB9725FA3F708B3EE785597C77F571BB98FF3B9101698377 61B4EF3798A54B003F9FA60AA425CA682B4734A1E2370AAB07A3239598D1BFF5D284424FED71 969AC77A09F0472C3CEF1E291426E355155DE589549C184C546DC8CD84ED2700AD9B92ABE56B 4CB2B79A6F0EB99BFCF14295CAA7E83B10F653B91341277747C2716F7393D604FB74B55B84FC D6FEFDA856AA95DE81E7A938734B579B691D1828643E8ED21FCA15FE83B4CDD3A516C5A4989C C44B269786D2D2A1C17EC139E75EB0912E20BF09446FF1F16DE86CD33B32E83AD3CC0F14ECA8 90D0110603668456F7004A9615F0543525BACB8FF5B519BC93700F566299820628CB632A12FA 57FABE1CB50518D4F0AF001911015590F5CA42D10C20D4176CF2A97101D7A700A77392DB64F6 5C63D245446CEB4A4230EEFA338ACDD8C8866451E5CEE2DD576C7AE9040DF980D4AA604FEE68 62E0835B37C0BA71E24890AE46E8806E09BD1ED75487222A5393214100AC904A39FE99B42832 B0E1ACBF20AE28D9C3A6C59A3F4141C2202427F6CD4B6DCB9D01276FF63B67A75DAAE76381FA 144A51A86592472C47FAB14DE187F45F8A973E97737B78A9225B11146FFB834A0B5BBE01A3F6 77B432A407FC3996100290520A8745F59C54CCE770E8EF48D791944A23985A876C1BF4E1E2D5 8D35402C376C1E24DD6AF93C394E1E110EEA48B9D15589CE492D884AAFF31E774909E4C69C9C B19E7D4456BD6E76581CDC7F4407FD937886D7ED3F22D81B556712DD4C8C6138D53500B21836 4D684DA823798B70B76DF3E940E15A6E51223A55C94149AFF4FD84457002B1ABE5546DAFB600 4CB4D8D9034DC74A95B2C449713F1B9041C75777DC427B1AD7767584214625048A69ED6EDE24 0118EDBDBE5302572074EEAB14CC98481EF5D8AEDE8F4E7A36A8AF511CB99DDB799E92D9E34F 6E10DEC177616AA35FABD138315A1A1F8DF9E1C1A784158382025E34155C24C1D7F8E9C36F44 E4A39E1F8A0335F31F393721D3DC8AE08C5DFE77CF391FF7C2E9314069F8F8F8C010654AFAF4 CCC70AA1EE5970B724D285E91C67CD641289E84AB6C7FBE213D4C3CD3FCFEDFEFF1A3EA9F8F9 2DD7375DD2D8F6CA8E4BB2BE4CBBECB0FDABBC94D989A7D2A3F0357BAB40062A76D19074653C 746E36C8BA115413125B0A130B5F256F0BA9F09529750ACF1725B2CF72E1EC79A99F9272E427 9079C92AC5AEE19087B2FE98233D28A177A9B7D48EA2C207DAAF5834CC050834056787113B43 3F5E8602DB97E3B81CA2658E9380D4EFFD55C41C233D6900BE9511D851F0FB86B209EC89AF2B 66E9C1C94ACE86DA1619E09C9296909806061D28BC9555A1D09B2908522BEEDE6A200D8EE37B 176D5AC1450C375DF1ADA8D9401582EB4EA1DD00D8ADCAD1B2774D63554000500618A1DBC378 439147DCB2198796C44A14B63B5F453E3FEDECAE59E727AF5E3F0FE935898148687C5C9C1166 EB52B1E62C1B3D834973C31B2C00D064103B450873E2E3172CAC5E90EF47624A1372610EF06A 1FDC422A179F2C57A5696DD83A36B398EDEBBEFA58BA57C9A5A60E96A8FFAF01BC264C611E81 EF6C9E7CBB5C92F62CE871B3FE7460212272061C495D053905B7966A19934FCAFBB56592D93D 01AFF57F3F585AE116313D4554D5E258C645A619BC423F7F657BCF828337B23D567B14658FA8 45B07AE80694A758BA534AE131D29754C9A7CB6FFAFDB92AB82ACF14BD60E013D3A4777DDD0E B39BBE09847416C32A202003D2CCC44EE0CCBB876A32A91A014DDA8282E5426570E78D5B923F 2AA63EF2C50032C640A28CCF3381BA4929D729877FBA609719F5507717906112C38812B2DA41 4FCF7A38F37CE0FE2AAF08A2381D227DBEA649B84AB9E108FD10FAE9A749B9594FD828589518 556500A361E9D25E4A70676D1D3253BA41261D4E3E93857AE9BA72A14E50D6AAC6ECC9D19AD4 CBE33358AB817AA16072F569AAEB27D8BB2F0A626ADE85A21B704B3706653C8525146E80DCC5 6A64362B6BD9CAD322543ED13027D165D2E72D22CCBCF294D1BD7074DF6EBE86FF3EAA157678 0B1041440B0ED37F9EFAE47FA2C09F9A331A630522C9260DAF6E420D46463DC3446610AC79B3 A5CDF076FE8DA3DA8F93364391284A6A758A7F4028FD607A9F5019B5AC23C2D2C9E1DA366BBA C79D2B9551F7768EAA14460EA7F4200A26E3E057F512A3BB654DC79F5AD6FFA10DA99E644491 E47512D13467274AB0E52FA97FDB5D3D991D6A918B13A747811553196EB39E3040E772416004 A2BB70EF42739EDEAE2DA40AE9874061D3B4B6B0FE1DE29109052C9C548EDAA0C2324D90DC10 D322500A5B905AD6E86F368EC5C01123EFAC501A39BDB81AA5F7B4C409EF1F2301CD2D7067B4 740FD49DB25E7B3E624FE3C74C9D7890B6FBB6BF0AAC38105879C01DA0ECC052A78D34306301 4899DED6EB7831C95D68E5B091926F6882341E8BCDA9CF2B4C16FDEEC09C3B13596A274C89E2 4C9D70C8089C42A58D39D20C9B9D9D2C9AE8F79BD38823E480E1BE8433E01BCA5D0956CBAE27 A9CAF7827F452AA88F31AF66E1DEA10F4645764DEC9CC7B9F5F762CBF09E572A1059739CC2C2 56F574733FAC8F25A0E5D37D1BFD4DA56554EA2015933122C45A63AFCFA7D1B1DCAD99FCB50D C7E078F97862C41D779A4A279FBBCC5A6050E9B54203CD40E48535B172C4A3CC27EBCF95491C 619ABA243B546ECF5073AAF7942E6366A7E7CAB23C26D6E21C7274AF442115BF1D6F7A0F764E 2B5B70565CE44095163CF6AF4A82D938E5F776CBF573F94ED5FD3E20FCDDE45750E8960904B7 CBB3F551638CBC7651B11CDDDB7193ADBBECB185B3693722CFCCADAA3D175E88ADD1EDDAE700 D720502598BE04BC168DD3054D0BD52C7E1BF3DC5241B54C47966935E5041C903E55A9C66316 9DEAD85A273A2184A877824E763CA1870C80646DCF87B221ACEF4CC468BD31695A11CC6917E7 8284FA9EF06A0A045C9BFA54FAB371E319D98C67ABBFE17E956B243C8B772A4F57820E3C3659 66AF2C0E10C76DE55F4173B13F9E5882A0E4BB356AA4EB2683F4A8B8CD9F0CD9B2CCA344FCA6 DAB94994E7DAD0CF7BFD63B09FF5DE9AE217FF37C05B8DE31B30B5BAAD873A839BD745740AD3 D22D46951B4C6AEED2681984B7D64847E9D777D4C07FFAD54FB43F5DF0FAEB986824D61FB2FF 6FFC472174393B2745448E291F79A5423586327553E4B5DDF2F6579C8AF31A0FF06D6774C9B9 B0B07BAC976827E5176E8818AD277CD0922E0BF8188797B8E86D816E71668893E304D3D3A3FC 3572CB3C14CD74242AB285A898ED98D599E79B9547D333F22EC5423FF4009B703C320AB6181D 4CFFE0808009D2D1932E84639B945237FFE8056D2D5E99D11CC039743AA478EF7D37A5A178C5 B4ADBBE909C640B1BA679F7A67642D648E5FCA37B100A0CDC4936739131AAC907F777551ACC4 B1F29DECE619C390A0F474BE1A23EBA879EC698FF9E0E605B8C7496A3763ADF92A2B362ED01B 88FB017CBEC4A247FAAD9A144106B4475D17D784CBB17DD8256A193896E609ECFB7BDF3090F5 4DF31BB075B53DC1D036D501BA0291FD2FEE6661B6B14D9DE832EC00636F6F6C75A028CD6E5E CF1021DDEF3053749C9B19ABBE367C9E4BA1B99FDCAADCE2024C4ABF95333230BFC124F5D77E B3D5A51E5AA56AF45932DCE6D28940A4F22AA99DC77963BC7D2AB63EF6A35ED5AB63FDA40172 5F048E8199CFE2E7611B2C0A60685070D6D5F4A7AD131532B40E8550974DC33163D177F34F9E DEB52AAE1B80E6DD17AEF387FE850F28C2C1364DF21AD7F8A18438DAB2BEAF51A1D7CBF39331 EF0B99219FB64053E69C04703EAD9BAFBB06DEF3A5C236F03AD857DFD782CC5EA81805ACB683 EB580643C24C2A74DE7196D882955D37EC9FE4DC64F3709CEC5AAEF7374AE1D70EEDA242169F 9117C435F0BB598629E6D7F000D5B340F609D4712EAE4CE2F86C754B8A61E47BAE77A124BF5F 49733712649F681D44CEA678FE73D127AAA4C4FD8E52187ADF3A01CC6098E20602B36CDF6F93 705B8440F9DFF5FDD8E6173D497D67F5268112EAFC368F80D3FCAC7B590081BB70151F4D4757 B480FC94992A2345920A76C212E840049D729057F728AADE678BE3D5220B0E6113C1A0F8165D 2FD916BBD7E384CC01B2C97693CFEC624AE3220198E47EFB3997A62C3173C22FD516BE5219C7 64110CBD54569A666887BDA47AB0F2EA1B332DFD4C35346631E44DA5B1BA346EB49D65E82A07 38AF37B08FD7BC5756AF67503AA6F439D937ED8FC88FC12A209AF0C74865AE0494239E40F7B5 B5C7EE0F692A7C8FEF24D580BF8BC1A74F999C8554FD4FA2533DDCFAF431931C1E175771257F B2FC696D71D41CBC9D4CB7885FDCD4F86838B2387F16370E1DB88C75E1D2A41F19CA1AEA9B9E A11DD39FF2153AC8B7B1B80D2E3E0653D7D54738460DA7736F5D25CFFE72E677ECB3172F5743 1777D0A47CA9FBADCCC3E6E918F05F0A41A8B2D82E32861FC6BA27E6C32FE04E69D692690F67 82D14C02D98DD85B1C5C76D328AA7BE3FFAA214991819F26327A552B96AEAD1BE1DB0444FBCE E3CA36312453D1AD3EAE3CA1B14C33FAF9B3A296965C3A00EE1A6D4E3C47BD456C7C4AC152EA 135F92090184C04C5852D918E82F2DE4F6BDD55828A5054DCCED52FD13EA992D7FABF48366A9 AAA79A79E0B93DC069C8D07AE875C9F6FCDF8AFFCEA92C621D16AF04E39A0E9A05BD28412C8B 57D655849DCE5F11164E99A03A359194EE2EF16598ED5CE60EDA3CD8782CB90574EBD00C5AE4 B44A32857C078D6408903047751BC098342260C68272A1115289BA3FD91A9402953C40AF9FF4 D8968F1975D0FFD03ED7CE16A030A4B737EC8F0E0194E202A977D267A4EC00E31084563F4992 0F9A073995021848D448CFAF540474329810F57851121149658EB92300C2FF5118B20D0062E3 917DB4A076B3DF39313BC0BF969782F12E4B4BB4DC63A29B0B2A618505DF13C1659365772A09 117148154D19BBE6CF2A5BA2C8BB588E1D0BC2EBEF829EDBCF6EFA19B87EEDBDAE700279F0ED 3A9218D70EF87FDE01717B3E0CB9192145B6CD3FDBB21A9A96425D3F0AF2B108B511E31E1D60 BD693FE82CFB4AAC73DB66C96A18505A2550313979557A900C2E0B5AC6A9A77B6A9BB05860A2 D0DC5BE549B40804A3D276C2D23A64BC936C5745D16AD7AAABB764E8C6097B502F955215EB8A F0774CBC082A4EC8782247D86440B2C976DC31140D4023BDBD380773AC3BCB388FEB64D50F83 312EE69582B1E5E39914C746AAF0141A93E0E7F669BCE7527CDDFF20F6C797007200077DE064 3FD413405937D455C31028B0650C87D611899DAC4C8E5FFCC572202C50AAA5DEC683EFB4692B E13EE795647EB7C70FB8400517DBAFCB55BD3D5C9678955E06F09EA11E8D16FCF4304094DDF0 D5483BCC01B34C6F15BB660AEB5B4EC96A0992AD87C40A8D41D1603D20A0DEBCDC19F33A60F3 8AB66FF2D3180FB350E051606124FB11262C356250E18D23DA29FC5F9AA78EF6282568C0C11A BDCEA26818FBA7C021C5F4D285261AC3C3BCBFD8518CBF5F697AE8307A0BCB497C4D9B3DA39F F1AA4C03CA6AA3C4F807D1C2040003347BF021E1CE5F26F28357151F04C7885376EB8D7DC92D B0D094AF56C844792D0E911528CBBE937646142DA694779EE741877312A2F0CC441BB9DEF97D A5A2F4C847D1A75FDD46D14828F5CEF3712D0768383A288C1BEADD24374D43F5C61CB3546B22 18A35BCD8222E733C3F78B60436A217C7577D8A37669EFADFE6BB046DA4286E47930101F1561 7C47F6C57E6874F1D4BE7277A9458D9C06BE2B9BB2048CB5777E7D9F9D7DEA5ABD177AE8A1FE 39542C995D731CC0237A0B0F653C4E05802C5DC2CE0B4AF3B0501DCC5958841B996C35411087 8A2090B9DDF556BD6B34F31BFAA19D6088BC14E42799F4CE7041DBC6D94C89D47EAC8C403FE6 2E040FC34C9FF01165E7470D2D3C13757368A733488AE671BFAB2938728065DD1F7D423660AC BD5F12A9C864BBD837199B010ABC910C0522A3EA84BA0AA4ADA4254782B1B902D5D5F4B8569D AEAE65CFADC2266692E3FED43D3A14085545F384ADA007D1BB7528A7B242D039DE5C86BB032F 12322B3FFDFCFE9C5D3010582E4EFEE7B5AC8AA56A847D2882BB20ACFBB85C1B92FCA464AA53 8204872BED9B1167C6626EA9E7F35C6529ABE77ACC50A1E426756F8774B63E3B05B612D67EDD 962D6079AF99FE69B91514680DF413F2E8E01E05059873B1EEDA98BD66410AA1F0C2C3A457E3 A1DF5751153FA88B04DB3856A3D682B8213FE53CE483C1B2CD2A9323CC68B015368B9A263065 4002F7BF5C9CD77981A7CBD1EE1D254BAE1F7E6D718A5A361512BB9B1C851744DC9843A86DC5 EBBD7E935DBBE4D3F2D4348B79DB56568969384F8CA958DE06689C0B707941AE4C9BB68BE1F4 B698D73FB077A70E595A8F2419E91E1E25CAE405BBCBFD23D15405B3C12E255D866F413E5FAE 04961E5EED59AA2A9A3E007FE59AEFC873F3C13FF7E3315F8C97AEA18E24FC2170CFE097FEDE CD2D80AF624E6B517FA60BAE5139E2D62120AEC2587977802DC56896CC3FB7BEDD20AEBA2505 4B4B630C8EDD687988E04DED15DE276123A1A85AFD12AC02D925F2E36E3F344DC7D78E2F0151 004136D7BEBC49523C72872219E3614412789C35865B14185EE4B9E87DD8E892C3284BD02B63 7E11B9E8377AE317463B2CA2E984B544E78C7209DB36F1C71610AD6ED33CBBC27A456C59C8D5 DBA23B9CABBAA8A4336A175B007CE0C70751AA672E038897CED14CE5B3AE06580B0D14FC6CDE 5C36771A04ED370BDFC88F4E7BAE4CB5AD0658ECC490A7F619D749AA5800AEA8D9E941175ABA DD3027FE25E5B9578044E5DF21174EC5424871DE51552394BA26CC4D152CE47A917A01502C18 C3FFFEE5DCDBD389285EF9D84ED8A6811224E11D76C246011A93443BD1E1EB567807CA440734 168A0F397B30341E9D0A5F52AC248088FD59BAF3B9C87E5FD3AA0BCCF7B08EED9EEC53A232F8 A5DEC00093FFEE49646EBC58DFF2F1B1BA294D005FC34637092DF02EE6CBF9599A89BE7B1C77 F03F4F0122DD67F4E9C7B05D144BF0DB4390FDFB8FBE97BC71A7B8CA1328C610043F66738C4D E1ED725AFB7EC529199A03FB1B5BBB24F9E2A2502C77DACD58D32B037189F31B33DA23C8CF3F 79C3DA460435DD838C2D8122593417D674A5702323D333169A164E003A48692B87156F67231C 5EC1ED82FB987CCF1857021044AE467892D4D51B08C9DE7DFB12B025B6F7227A8500BD3A7589 0F47BA077F959BEC790CA3E3751664874A0481E3B0C1487BFBA203715DE9B681BD7CC776DF31 A4151023D666DDBD756EA288ED7094B38BA9FB81368AD35BB578FC76081D2D848DFF3807AD11 A99727744A3E4DC264F93C824B2C9B04862D41A6E07366826FF9310926A316568655DF7CD9F2 32B78B5147130CB5BA22225A5D28AB039EE800EFD53AFA9D5BC0EA807B0FDEE302F01F7041D4 E270364E534EAD170818A4EE70F738C1471737E88DFD84F87C90A9B151BE7DC9982536E1DE88 14232103A5BAE7A1E0DAB58796C062079CA0AA5CE87A8F88DE6B52341B028DC5E7815B93A808 E82CF21EFD4F0D5D2B0C80996AE9E4DFE9B086C77B6CA72FA8B2C7A25780D0FB57E93E89F8E4 94FED084850EFB52AB95590FA46D468EC4DCEDFBBD7C2F9663E9F96287896DF000813E62C99B 64536BFDADFB64DD03490CEF14499012D97F7AC2B2A712C385E52D5D11CDE9E631724ACC21DE 62D276D8CAD614AD21005405DA732B2861012F8AC7279931A189E07CB7499BF0801140DB6F49 CE800D3BB55138879C9A10B4FA3A6BE34A89C89768349F45586102478C9C18C3E2A178E7B9F8 65F8BB0A34CE40E2ED2614E550718EF95D98EB09CB0C4F7E8AD5BDD2B00310CB9D9D331A3F47 B4880B26D06AF6AD14A807B2595D6A1ACF4A9C054A7ABE3A14B9A9FE41369C8FED04222D2C6E 1B4AC1E158CF9DEDC21A76545C0037FC9AEB3D614134117D298EDFB89F6E5F4E7AB6A19542BF D9B0B85715259AB5836A6D4C6C88B1C1C0C2F1825962BF5CECDE9940C12C57AC20EEFCA41191 2F1B20C764E41C2CADA49AB29C03C97872E69D74AF24BAA279904FC0EE6F7D1FA679EB6345B8 1F332963FD7C37F50CA6E6268C0753C61C218E44AC11D6F8B6EE34C59F3047C1A393C2C7EB07 9F54CC4287057B98D6E0C1C97642A50FD54007710AAA615A6E8AFAA89F1E62CE493BCCE4C5AA A3864D0120ED48FF5FEB55C2A23E9E90452C4424E6484C8D028A7DAA4EB0B7C2B03DDC569648 070D01F95114EF641DE2EE18799AFD7DCAA963BA5B7B5E9608AC5BE8702137B3DD9206A3D85C 15628FBEA77EF11DE71DBC388470BF35B198991AC149A3B2FADDCF6323F8F0ADCAD18D3D4AD2 92B14BE1F440CB96B94983C7F5498274146FBB9D43C5B2CAE702EA9BCA351D32B9CFB01AE7D4 EFEA649AD24D0FC7BF7EAA07186EF98579C99B16E46D4A575A9F2CE279B609448746BCA78ABD C6B886ACB8AF074604294FF64A2BB4E3FDB2D92DDDAC7BD32DB8C6A804501F97948B41B67FA5 53F437B0ADAC14F53718819B0E5431947D130D3DEF9F0E0FBD5C7AB96EE2FB6F16ED6D5B0C6E F913F2C12F559D4E61C189C23BB257134B130622A06692CBD590F95EE8C91DB486013FA32479 50F85ABA9AF19283C424399240FC4D5D31B0DA0E431763AC14D9FA8B554B6AFA8D2F2A96D8FC D41D66F888D8903C899652197E05C380AA3B8547B9575ED1563E383082F37A3F609AB9CD9388 001A1809CD7506F8D20E5D8B39464BF005D53CA7A3DDD116A933B3C06E45FAF5514DE9FF7F45 2F40D836408D768F031807B3773BE56958B39D4D7B30A0D14DFECF3A91EF6B3269FCB1102ABF 4522749667BC5E00877A389EA44E81EB3555A3D7B7C4EC59503DDC817F0361D668E03F282107 4177DB086BD62F43910C37E0FA66D9AC34A79E19D025E683251A3DBF7F9877372537FDDB5FCA 59EE41C3321B38EA41D73B3E66141258036B58ABCF248DC5B48FB232BF39EF64A31FBA9787CC EB94599EDF5FFF58DA19632161529CD77D07929F539B6C45E751A21834AAC33B92F62C49E911 6585A7A83DEABEE82088DE3C0F96B76F22DD4EE555A59A591738C1FE2232131766A776D00B85 EC502075324650A97614E8B81AB11D4DA68C66FC417E8142E8B2A966F77FF5B0EDBBEB334C0C FD896FEED4DA711766BD94E1AD310C7536471DB950BF267AF56182E7CFC4F570BFBFF048EE38 BB2E426E6F246995F8FECBB01FF6214FBAF97060D14800C516213C96B79B71DCF540B2AC267E C7E36FD43D182C867DB5DD94970CF4C4FB35F16600E2C0E25326A152C496FC65B7192B1BAE82 33914B6290BE24825B6052F508EAAE574B3663B199350C6F4CB4D90E71CC8B74EA8E45DF6183 92EBC6F04637CECAC39ABED6F2F8566505E8F23F1AB1387093D504756101746CB91F571313DE 881D9B6ADE9AE9029962401833FFAAE716BC2D61F5FC5F0997685881FE7D4E4D00B74F8B91C3 D316F39253034D36F57555D4DEA0979473436BEF0F7BD90482AA7494DA7975DC1830140954EA 9F2A214CE89C0C7DE2A644602C8893A8A47487FF6BA27B08A2ED9ECDA68173B2D7F5AA627D45 7758991F25C16E04B4D447B2139B1FECA4BBEED331FBE1DE26AA3A3E6E1F42F21C19B01EB5A8 481B60508BDC5A3DF6BF63B5C8505739208206701E45B172F3BF0A2C59BDDF6AB4208DFCB775 E04A4C17AEE9FFA45E8D59C28763E718F358254455BA13582DB7D93E808F5B2E56DE3B8F0689 9A59F01F60A6DC57D39CDF5B131F6364FF825B576CF7005DB4512D646A59C960CC6F29E7A2C9 4B854DDA2CAD4D9B5363CAB440A76746AA90B04D9D543B31F0FA730DC83DB2F679678CB9CCE4 63DBF1332AE9B92E7EEFB8DE086015A9388AEF765D5D15E9DDC9101373F43AF4ED801BFBB191 DD56D8B2D76AA3A40ACF8AA7D6272A097276E6748B8EB6F2CA486F0DC40938EFBDB45F1237B5 199EDECCE7B18B609466460FF8CEB3595C46DD9C7C256F3BAEB51F61049861974435C95A2C4C 00EE0A41F20AA9B64A2F9D6B0C7A6EADB3541F83907DB69A40A105203436C188CAD2168533E0 56595642C45784141DE10A1BB343CDACD558D46A69EF842A0B4ECC063AA0C456276BD000E9A6 8A5CA58D935A291D06B9BD0B04D12E4859FD29BCF29A0465DC58AAA9DBC99D70703FECCB29C6 518A60EF8871489253EEA7343E9E110E253E5887070B2480D63A62A5E1E11C6CB527476AA6DC EC4749807A36D4E85D336FF6DB24AED6F02D2CF9C6433D1BC25DA1C10ABD718F2BB7F6C5FFBC B099629B4888A6FBECF24E1524B618321B8FCB2F6C42AAE629BF12D27218F18359EB2320A5E1 5EB793FA4359A98598BA66C6835990166839D65E3E035F4C5C6111127BBC3C5B15A400446F64 6CE083971D03810B6B2CDEEF70D92C2143ABE204C30F51B687EAD7086D0DE632428EA03B7AE1 C531A3A219673E434CFA97CB5810FCFAC932E79AA9B3F7E21CCC933FA2F7FF053454E8CDE438 95BFD8B9AEB535D9B151F09BED3621D32F3CF4F26F7D6714DA6E30C0DC1DA31048F4AA0FC425 A1477CD345E1F2811FF36E5256A767F18002489AEF3B31EE37A2F9C2316003E4CB8432A81BAB 305C04DAF81B0D5A4FB9D6929BE081544D9AEA7572ECB27B136053EE06A4A70D3FF39E6E4173 9CDE45BBFB88ADCCA918B8FADBE33E5BF800FA788F1F1B81A7353774D3F5AF4A865453AF112D 4FBB003B1BB33FFAE5AFFE1554C3968044581C087AF5748CB51F2C0A2B999EC5E0A9113C58FB 19A2A743F66D62B6135BDFE4CAD2A7CF5916AAE767FD537B89758C7B6A231F76A1F58FDE8D16 9E21BE23C9EC71B127D9E675EB07D23B7752F9CCD360067E37E8CC4B6C581608098FC6F146B0 7B0C736A41DCBE759D8CA995122999B4E9883A4E5AB538B7D5783CCA2C79D2F24FCCD7B4986C B39F59248F4710C425D68CB8A40A6EB9A468F2DE845EBAFFD7DE20BC6E053A504D5E8D85D100 319322A51483A825AF31F3931E8CC71A7631752E1AB65DF3B17D2A60D272A2D00597CC951BE9 9752795C3DA3190D72BA8258136C46E8E9BADA5F4E6D9DC202F36D072BA918DCB77B2DFA6CDD A6FF2ED1461BD676543F9D00A6224BB529875E07D32A7B920582BECAAD02D2A4BBEC3A149801 520817E2D051EB2FF08C01052ACE775592143784D6D0B9D25C812530627E7C26A8CD40B6E12A DA957AF030D4EFFA0CCDFAB0BA1898EBAE2012A9E775015F9E7F75BD089D1EFA06489F380227 9619BF26DEE436A9E5F3605B495DE5493C64BBA34CB952C5B062911129A2E68DF1A61BEECEF5 B01270F615CAE12489F632872F1ABA5668CEF3515266FF1A48DFA169C26AF01E54590161302D E80E5A6D93494A4C28CD8DF98EC66DFDFFBAC2DD449C294BCECF50A022327200A618A273D404 191C3F7327620A49DE488B134B2CEB9A5DAB38FAAD2FE276B515A8469979C28D2BE270BAF24B 59668F283B1023EBCBC4311354F9CF664F91191FA342BDCEAF2CDAB436F0F52F620D3B0EA6EE 6B3C329C33A10B78353DA7415179F516008D7978806F3B78080D6CD1AC4026BAD55AD515EF5A 13960A2F7CF9B63DFDB37987BBF52A175BD1764F29571645985034CA99345C1BB9EE35122A86 EDF384C57457396BEBE2DDAA90BE29D9326D60D914CA66E97FC5D61B43A02C76DD97E364228D D60AA04BDA22997B93B66EE1F5397A4AA1BEE1A7C631524181D880F1EFF7F8212A0C17B4FE8A FC7162120E1E7931F44978328822C4181E2CC57CACB671616BA797E3589E38BCDA39F6F25F59 3772FB42CD355B80A4F0C3F7BFD872F8491CE59DC46549F3DA3BD7E16E919389250917C04FAC FDFAA9F8A009BE2E61D303F12B309E376F4B5BBBB00DF00A60A62CD0D08E695164869B9B75AF D392727EAAD11A72D5E1F0D5830A61A3263FBA57B9F387AD98542AED2460324E51869B714D33 FCF86D36BD38257975F42CD427AC4F3E77EC5C427F92412EB7AE056D31C553F6A9076A9F8E3F 2B948CED6FA7065F44947B85E309CA52C160A9826FCC3370FD434E8036528825F686451930DE 7673DDE9016473739D55D81116AC3AA2680D3C32D51242D1343BB3B7DFDE4D414F28358158FF 57FAB505F88EFC7944D6245998AD6E4844DE9C83F47BEE222409A9EF03047F815829F7BDFFE2 7B162DA07AC3F328A7CCFBB31802D3A725AC20AB3447945A76B083BCA227C97D47F774869E36 B8502D998106BD4CA9837B54A8677F91B723AAB22F07E1342371ED2565F3EF22CC906DD2B8EB 08722896DADCA7F0538DCAAFC3875AC1C7C3FC6DF6B96025A73999592D48EA68D6CF9829CDDE 807BC40930C51E08B77760FEBC9311A31FBC5DA2C752ADDBEB4D6929AC87C052645C578619D4 3FE78DCCA3E59508940E7B79C0E79A1564091E007328A116A93BF648386B65C44342EC8E55D7 E76ADDC12044ED93F715FFF3DD928BB4455BD7B1B904D326BB5F45F7F449803824EBDE4B1F08 B8F9B47DF6E03A1A9FFDA863132EC72B6873C109F407B0FB6B6BD0CE5440AD0BD90FD40E170A 4A656A659C9C41FD309E804DF6A58AAA5988002FDBE43CAE8611BE4C79D19A0A94822660817F 4B510FA70410BE1EF59225CC9BDCB5A8D6F2A4F5C95F6ECD426F96F12126695F1428F0E79034 1FFB193F9CE542A05B1A00CADD3E0A80834790599A82D2C77635215B87BEA2DC8C32743603F2 3859494921818CA43E950A80742673375AE8876D379417ACCA5451739A10E97A39A9792D349E FBF93282A27587534B369DB7251D3D3D2A1C8548F211CE7E030686E7AF963BAC1027B360FBA7 07D53935F8B9A9BB1C5AFCE5E53EB5F7E494712BE09E32A8613BC82476373D06E3526DA3AEC2 BEFF7DEF70DC3261094C881E7381AE8CF30E6C0FB2EB0D1B7DB078D98FCD3747F79F91936A53 8BF3F09FE6193A5B7E8848EC5B2BC75469008E2D728FA47FDAAD0154E1520453EEB31438BC66 68DF4E3A0FDFB2CF12B0DB2406294DEC568C8098467C18FF052EDDE728C86B8FB94311140725 19A66838A76803E2ABFF04C9010E009604A2BCE32797E172C0E7545F5A0EFE92502630E8F1CF 42C2799DF4D3B8737A46DCB65BE72A1220E0BBB0C4E56883BD552133E66DEF1AA5FF1AE50F51 BDB2D7184C1DCAF0EEE4EB37BBBA32579190BF6A5F96FF25FD86C8316D586FC0627B994E8768 40E63E145DE745073C90E256A364B9D3368DDDC4FBBB7F82C2FE640FE5AEA5CA05057D0A7DDE A3B2CE003A67EA45768BCE562BE4A930C7057B3C6694B7F6628D4FBCC9FE57AE87893B283BBC 58F2415E9E26986D624E1F6B02D846ADB091A7474BECCD98F9797746B1A9EA65FDBE5FA4C19E EBF6A7739BC39D618F1322D3F82AC684E9F9AF40BA7A180269ADB4CAEE9EF7C9544E4C2DA86D E84C40A0C36A3D20A79801089531F55FDE77CBB59FAF3E27E1DB13B634E1FECB609B3F3B3DAD 9997BC0DD286CD29F62C22FD9BD98761658F99C16D332C67ACCBAFDEEC93BB13196B7A38AD5B A04E8045BFFB3E07B9B8CFC9BB579FE249D08CB35DA79EAE2191F60B6B0B92E7CBDC59F8BBA8 1049F5F34A0C5500FAD51BC9DBD06B6E2D596DD592E78758AE6D616B6C2D167A8171F6E8E286 7A4B77A34B078DC52D9F033319D6E7A57E66FAC76049B2C1EF0799E994D5C5E24FF52D8C4454 45789ED237A85E81A948D2425C9552FC40EF0005B43D5F5EE167195698092A67E5CC58122FBB D008CD0E6831712C0FF45D691AC4F592198A22C2648A48D6690EBF2F3D0F525B0DEFF4954135 E9EA1DAB41C24B1A173BD79736F685388EA88DACBC622B7074DDD83C545041BDD9BE106725DF 9F44CCDE2DB0D77776AC11022CD7D5D235EA290524C2CE7F7C83E79D16CCA56D389B5019619E 841AE6796A17F011FB8144F615195AC1546776914585C56AD5DA18D04B68B1A010FB58C33B35 3443EE23278B8759C037DF731F7DDFBFBD59D8AAAE37142F97EE5FDA6A02FAB6909E866AF5C4 76DF8BB02CE3C606E000BC5455D6CB043B6849E988337CFA4B186ACAEC1355955AAED8F76620 024F1722AD2F31CCC052727E6FCABDA589F7F630AED1D9E651653B67D29CF14FB42946C11DFE 2BEA4EEDD5456F5E3C5B3032FE19B33D75B22397AD56EED083350190DBCDE46EFC5983E12689 C6F3F0E2498E2425DD60AFE09B2D798D6A39EE9035D112CA0A83445ABC58926A2F51FDF6FE7C 5EBCA2E1B9C87E664A6DFD6D5291DF42A6F8C3D6374CF31BA070F190AD2E41B818CC1E801468 7EDF9A43178ED5D244BA3B6F620F70014578B371C3B82E4A479580824EDCE22338739D125BBD 78FEF6320DC37F5DE70A29E9DC334C2047A915D678802401A92663C66D6F6C0B28524B6B92DE 64F37D60D9FC0F8A968D1020A019829E47C99E56981D4A6E650E78336CC06F7AD2B673FDF3A2 3ECC0D56B8271B3F4434631B70B3458CE6D9DC695E7522CCDDA094FCFC4372CA7403AB1A6FB3 D7D13EE0817B635CA53240C8D8EDF175B3A17A2E9002D438B83F0BD45361EE8E5DF8DA847FCC 9300DFAC284C44A76D5442C19D832C8B15B6F4FD697C873B4A54D3EA80BC84DB3DD87E96D52F 1D9F8D0E2F0CC3AB9EB15A541FBA2F00C7D316983B848D1051B9D8EE7E081795E3181664D732 E3421A370126DF20DF2E699300786B0109896595C6AEB91E82603808B7B63B0E8489A57ACC32 47F3F6CCDCF74AF83DC23FBAEEBF83D116377B29430EE25A48A48CAE0332F0D119550BFF9558 05748D32332460F531F43A46D17043B9A6A97279A54394B58FB9D894C6EDDEE11BF0DEA58FD1 90BAFF1743CFFFCA9E5BE614C4ED8B86FD17A3780A7834911E0877AF8555F609C70AA9FD0FE4 4DD8409E0379B0A4BC0B04FD1B1124DC424868C50D19569986795857586F9E8CF6602B2414F9 DBC129ED991F99C835A5F6FA063EC4560C98FF0D214476A4238269596D5273C72708B08DE90A 07D684CC305621F557A6E8C08DF70C68A177558E7928C6ECBD6E449053F7AC85DEC23DF8294D A30BE40F4472F5944FAE7C569462A971493110440BCB997C5116644350BC0958592DDEA15E7E 998920CB0FF5D236881C3BAB929AD772E4A9A4F879A89D6C89A10F54A5623284239374E9B8A0 42E375CD8170EFCE675FF40C9B9A2DB22E7869BC3644A6EE68089F3368569D472685F666892D EAC3A8B8AF8317AEE28F75D49FAAC458DB46BC13212C60A7108440BA1405AA9EB5D1C6C2352F 2C0C610A5A663A56FC5C7295A2374FBAE8F92419423291714200EF42275F971B885A421076E1 4B8649E0C2C6B7F427E253F072EE31E302181B8C1FD54A66A7BEA934434EAEE2AF2530160708 E9E7273A75D8D8A44AB09325B4BE0B191D54740998D32A93DDA17FFC947484F95BF953DDBE58 41DB45C1AD126ECC809540D4D7A17CB4385982B4ECEC4470E2B29C3526E971A1C8EB714F3C4B 4B5B90B40B35D56D993A4947B44199B811EA470612EC76E9B792BD1E9D2ED139897C0487EB4D FC60238ABC971904ADD0872283E66BA4CA97142B770A328446B1A67662205873361823EF74D6 A7AC9D5597A6F732BCAC444AF2654DE9CA70F774A710031763E9481BFECA2BD5E1A8A0702EA3 A1D00B679A01C852515C77F63C90077601405495FEE822BCFAEE350C49498649FD0EE938E373 E5A518427DACA2A48C000FAC9B81AE1EE3B3C30850651AD8307F315D27669018144F9D95B449 6501B908B3E7D6B85F805F172F7403C4F1E3F722CD5BA56FCAEE3E8724B10BB2457B5C442EC1 EB1DEFE08BC2E6A79663BE1703AA74A556DADF25C56D9A1375344DB0158CE077C6BA88A8BAC1 7CA4E1D89B879156814BFDFAAAD6563D32B12B3692E8AB51DF0FAE2881127833B8A2ED691EC6 54E8046EFA9E132B707CA5B81BFCA9DCC042DD7B340ABC8B16135D0EE076CD1874FA33F801C8 A42EB5EEEEB31C16817F9B2D614EA00EB9E2D5B1A41CB83196FC158B751BC778EFD5C2D4E36A C3E16740F5A0C5BC1DE392A6262C1396DE92C9A8AC09D90581A97EC0D1C8AE0FD0330894810E 7A851E65A87E17BBD239EB7CBA486FB72ACD3C9A033073BB62A1D5FFDE8CBFB2CEEA858C7634 790D06B2A7299AD247D5DC13280D41A833502E61411B6FDA61F2740D8B9B27537638568094C7 771817E1B5815F82B6FB59020E1A07116A29C19F56A4F65CCF76BDEB3253947E8E288F29DDBB 067A8D5F1CB24E4CD24962BEBC0F490DA67666B3D91981DE385D06EBC729F2CCE54A1A03213D 274E8F0D433EB1FDCD1FE893FCDDD3CA819EB9B2167932200DF375738252E4213461E97CDF52 CDD8F677D67A817DDB6BB5D779B24D1EF3EDCBE0DC14CCC9281CCC303661BFFDCC2791C700DA E3FD5777AB5A033F4CF9971D3EF79D710C073EDCA95D4CAF71A37D005C5F0443CCEB928F1D39 697128AAC9C4A6F59BAAD7EE8D0AB6D642539596FC42E4A106E31C7766ACB58C278E414CCD0F 1146B81E7D700304BD60FF374C8F101681FA9B19F5BAAD862B1647A14844429C2FEC8A47AE4C CE72CC7D417FB59044A98F0ABF6137397011D5949E09A4BBD977498DEF5333191DAC584DEC7B D756DE4E94BCB035EF4685B59F60947AE3D6FBA02EB4B0948926B2DF8BFD2204FF8C8A3DCAED 032543567CE16C6BE59EE83B7FCDC5099E760A126FE1AD1AD63C8C3A85B0D65CC3ADACA451AC D9089ECE55B2DE498A09A479E72D38D7FC9DA6B68D0C61C17692B1E1232FFBA44367861A2D90 A747A7749F5BEEDA9020D2F0C830FB8B9BDAA0E4DA842790358A8FDF3FD36F1D133E6154E9B0 C381B15DAE8C5D75E8B383E5E05F56766054B865667CF5EDDD22246A642C1D592E26F07693CB 37DFA8472B4DFC39DBC3E0E3126B9D49A4E0ADE08402E054F41CBE08A3B5903C6B541B81B4A0 C1AFA0EC80567250FEA64F517283C7442CA326CC85E40776416907D8F1C3AE06CC722B78703B AFB6396EBFB020C1C5A9416BB9CCEF1D4AF632A0F30048CC7997B056F81CB57A48BA8E5E8409 5DBA9B4D980E678A831C843DECD662AFFDFC474FC6133E9147BB0845BA55661BADA0E483D014 5F4BFE04821E05316F9784CF9C991789121EC61C78F8506A9226536061CD12CBB175D68FA444 41F4C16FA833D674535B80295444A37E9FFD99612A71852494F9A8D164891635CDD6F104EF47 8C7E8AC6FC287111A1587C593AEE25286FA241E626A5C89581AC3490BC5CE2E4DEDA7FB1219D 50C58DA778B3FD07630C3CADD38A5101D66A02537BC001733964A8DD461AE5EEF31ADF481896 667EA23588B0FBCD90F09A2DBCED48FDACE2843E4AEF0D648C9B15C71A4B5184E025B29188A7 2BCF5AC89AE0C41A51850DCA3884535508389A550E2EEBBFF48C2D732598F3533D2C63DCD95F 14598811D9738FA00C1E87508A4ED71A51EABF744A9E02D05B89768D653E803E385B733679E2 744A0F9E686311DEA98E4945188FE9FCA858C7958A5DD1BF044AB257DF5B35A59893FF3C72C9 279685228F30D6D465FD1F20BA2704DAB1A723DFF0EA98AEF5E7C97974EA1A54EE082C136FA4 5BCC0A81026E6E8948AE55B7F3B9868108E20A9D194FA9AD57457B170B7064C1FFCD72D8CCB3 5748E4426653506D195C26AAEFB501074925A4B2456EBF5092FCAD616402C470BF00604518E4 C27B7FF5830360E6B9FD86270E852D8EA5392F4B0C00760C09CFE42F943B60D932A58A72A901 B8CE80D40344EAE7B19B965C9B0044DA3B099F27CAF832FFDCB830A9B0E87A919C021FC7E73B C6405FCAC10FF1692F55A95446870A735FB5F52F6AE02917A331A7FE68483385FA7F41A1B11E FE7CA5A0FB29DC9D27DBFA15E9AD4B1662F9ACC4B2EDC8676AA38C04763A057E989851D08D3F 9C4813CBEFCE7A7644C8B161F0F81AAF45B3EEF595C368ACF22AF726C1409B200832DBA09B46 A89EA21B08AB2D5781F9C94550CDC0A1372A33CAC91E9DCF29B46627FA0729F2DFD6CECB00DD 5FE0E3B2378AFB6198BC7DC5C59CAFF738B3E8A7DEAC765C23C1D7829B99A19C5427F3388D95 8D68C63C8DABB2DA44C4469A1BAEA14F7076630923B2A243681D42934D973AC95ABF956090AD C2525A8C8518A46DBC4CDDF39A93765F9F6F652121CB23762233723AC81850B2C77BF7048BBE 50DE17282AF801B2DA80243FCEAA2A1F408281C1E13FE9A55E2277059FF2682B2A66B6B4BE0A A90B06377FB1BC51B51D420DDB2A377C220DBACB3500BA892B772200ACCC25A27B125CCD5C7E D2ED74071D686B755497A186BCF6EB8CAD905CD8D56FEDE5AA0C7DA85C849D2FE08E629174A9 993BCD8F9AFB9929C36070179A79745F2BC3C8B97A23F7827A051565B1E973AF6B9B751C18E5 7D75CD54307DA926B8FB508B407FFC473F87D389F1FF5803BE5FCD13857BAC400F278BFC145F 9DBC0E541449EDDB6356771DE1619BE6D6F018381F84B8417722E3E11F7A34A08851BD58332E D3346D958CD68CBE100E0E52CE4485F2615AD19F23C3EF374BA66A6C4BD6F4F9C94F60AA8B67 066210524CF7C58B027FFF080DBFC2DCF72B91E2628BC8A1473DE3C727CF653AE3136A00D1EE 105E89DB0A7FD5C47DCE26CD60EBF5AEB20DB3122FDD64131494800D675EEEB7E4378D0D2634 D8B8C0EF7F045DA1D7A3FA2BF6F5E6A4372C856FAA283E5F0DE4CD15E66B8DFDAB3EED43C0CE 657AAA0919A2070554FBA141EB1B334009F0018A64239FCD20D9F428AB65EC0AA7814CA444DA E3B485C43C0F9BA4D16646DA6895B6549CB5517514782B3F78CCF34F3024B5D800665544C019 E6E5ABC2560AE4D8FE783647767677CA435833892202DFFB13D307A96B34CE54E1CBCB12B2C4 CE646B925A2D3A3BE6322AD47A3EA413F78C611C252758BECBF20A77CCDC78D59EB498F1874E 2DF68A63C93FD7F32325E1724A7834B2A0335277F9E4C1A558CF3095C34A75AFCAAA022953E6 B4C5695F5CE43831B75914EE77ADF5D9752748514D6A8D1E86E168BC900557F5A6F866C6DFE3 C01C6B6298FA062EACCEDF2C08FC1F7547902F5AAA261A01AA6A1FDE902B5A4C283F695EF213 50ACAA9CE22111586838E62A63CC0DDFBDBDD22E61DD55935E7456CE664867ECD8DFC06753EB 5BBB44ACDDC281CBD786697C587EC288140BE9278262D8DED4549356E061C1CAD6131CC1CD9F F219F1AD7D49989D1FA6289CFC8BF2377211A1F754EB55EB9A07B539C91E5A9EEA5FF5030B3A D2522BCC6E93C87DB2A79C2B3D6BF1F618D50DD7342A1DB18AB5986303FB0643D101F58E4EA7 D90734913FACE4D4BB3AF7B4D574ABFB6CB42A79D384A35190CABC49529742C2B501149862BD A44AF69B1CC9B27B4EBF75A95E2E2E8FB8DA9CCDB4B733B8C56677CE0E5036A2F001619D4A89 B391F51099BE21B261FE2645D7B0E51BDA6BEC6D534FED5D24BE9E64C53B9E3872F8733DE6C4 292AF5C334E61B2D12283001F491CA467BC49AB0E876287A66855514FCE8C074E4CDCB4C1223 2BDC74F80ABB9EDB44F28623AEA9C8F7024DF0ED543A55FA2EBC43B6399B1FBB15DA82EB97B5 C74C39D7E4BB79C68BB97E706A244D47384F7AA6E5F371DD28F6784E9E879719A48C7E774A2A 833CFA183A0E8E758AE5B26B59C799EC4B82CAE129B592CFE4857318C873C0430EE90ACE1E82 8640AF7C236071135E5536C52AE5DFF11037C4E415C75D4AE306585B00F06D230E50122DB9CA F72A399ACEDDD05B4926EC1714CDB245BE916E4E9D9EB1A4545D19A497A40F9D75112B23510C 432BF5F81DF86B2629FA0ED7771586A56C588795907A73F5FC4914D8561FA16F73E51719CA5C 1EB7C8C61DC19D33FB55D29CB75254AA81B3EA2F13A523B3CAC3243677D251CF853937E2112D E75321D39288B49A7F3E0A989CCF03368677E2F71D1E47F80883EBD489499D0B0B5540A9BFCA 4D257BA223607EEB8E3028D30F0E43957B42DDD6AE6CCC9728395D876F66F176795DD6335C58 988572FFCFBB1EAEA286A3CAD8E011E3B00E2C7FFB20228E1789A7D6ED55DAC13C4A0DA8A99E FBBF50FF0762BC6853AA8582F0F5D1383CCB95D6C736C52233613B406B2698E0995752FAB095 F558579CEE9F59A198B975E7D3EB34D963DE564627EF0AE6727F23DFD426BFE36AC9313B9D51 E584DD78BB0D19AAF27C50F1B35DEA96E3DE939D2E11C155D6620DE887D157BC6F372F8DAB23 1C6497B2C856B01CD94BD2581EFE9E1283BE9A132B0696269A6AC1ED9F076CAC19F7D9CAC1D2 6979B8B2AD840E13A2B5AC52862F7C97C9FA4005080DEE5C759AFD5F4412CF0DF2123977EC24 77A0DDEF175975E47221D73079BE387FD01E748E07426B446D5906866F74E528D83CE6A10B76 DBA9B9DED3F0F6348190BABDFA23DBE72485245A75483E0763687EA2AD39FC5FB1A366F4D311 7A3036B2F0268179482D5157713A81C36636C18FFC6D25DC065FE414B5063821D8A53C7FBB8C E5ED9945F31BD8706D57FC9E32018E8ABC70A50D7D903C020081A2BF45CAF66189C2F7584E6B 4ABA38924CCE0990A04D3DD8CFEFAF8D2A53843EEB7659648122DF0599B7097E3E5920D11571 DEC72245FEF1C4AB8C48F822A05E035D5F4158F0A93DE0F541307B9D53BE0FEDDD62D958B959 EBD37D201F0CCCB2C900324FC6EB89C8133C94B1343D46E5AE553715F6A2C8428D19EC537CF7 1F97FC611D880AA6EB2659375193E3A92C638357E381201CC3BC948583F17E1CAF54F00F303B BF8F7F4C17B149789BC8E0EC8070E66ABA0B7C07179351E3608DA80C30B00B53AB7729421694 C7D2688ED85A74F064BD1BBFC36D35F9ED47C0FAC378E42966502C52D854808677C6638F37D0 B4F715F2C8495F41AD53F47A6854C1467602406F892DAEA7D73842294F1E78AD85048919C31A 4EB8AC1870BEBA9B37A9C259BFAC84F08BCD2AF8FF23D29745F425B1A5884F809D3E0AC2A61D AEC74E62538201096DE13D99A6A5A6CD4F968211D0F80CF1CEF3CF1E5EEE6E8834E4D35C4798 4F1555CE13B62E4568AE42D10651725ECA2E563B35C9AD1C7E3499F5CD64FE89E54123A634AB 5FCB8D830DA796C5A10C407106E3CE82E570FE1B5B6873C300CB682943E9CEE0239C782B7821 EB183E8293E44D869FDCAF653CAB1B193D4F45CE9A57138F9F1BAF86B3E5CA5DA1EC3ADDA116 65E1161FB5816CE7A90816CC2A29FE58963D73C7379D7B31C22EE17984802324B738CC02E319 5A2376C1E43186A60C0256336F511115F9A56F5E1D9646BCB4420006502D1C808EBFBF8EFFF9 59B6D5AE882DD94235929D1BAAF9E974F2B3C473EF62B385FD06B99A390C1059CB1DAA1183B1 2A57AADB2A82A61D126B0CB0072B9EF04B016D5449197D0C7753ADCEB269BFEE8FCDF1DB607A A711EC619CECA71C571DC7D95933A48904D6C800F2CF73E050EFB65C5634070B17DF8DEDEF9B 1A1CECCAFBDDDABC19A26BD6914EE25CDDD6278C7CD815F52A4C4C920EAC5B3993A9A8EB560E 8EDFB4C86520000DD14F012718A237590E6C80447892DD458BEA2692B1CDA93D3E210696C591 EFA96D58944CFE8CB6AEB386EF812A068DE2E50AFCE4304CDD5C59D4AC6E5D3EF4F25FAE1E97 A898873D86BCF1EEEF661A9019FF6A9417D3FD3E64E7985FE9ECD22DC77B8399281BEAA70EDE 1023AA834D7F9E48FDA480C86C181E4EAE5A671428E4ACA0ABBA8FF0840251C0C9B9EE5E3AEB D99DB7828C29A93010B6F5012FB32CFB97680160D8AB1148D7D801101CC2AF93ECA18B4D9C1D 7BBB282B5854F40F47F4434FCA651DE54BB4C6359A73D522167496CBC493F59016D9E5350555 4A5FEB9CA2CF11089F4A8B8469233B45D544C11C8F64D5B25422700987A18F10F2B98E151278 A8761B05F483FD66065E23DCAE02242B75F164638196B894862AAFDD9EF76BBA535FC0A73358 D0532E9DA68A01CBF9E327391D31AA5B9FEFC39440AE99B727F05CB12B2AADF183B526646E67 1E28A914C477D4EDA2C3FCC3E86A3C48AFB0D7F3D928C76EE9E8BF6DF6B33E65C8D716F2911F 2B5C080A2D5BABB42D95AED8E8B524BCBC7713CE3DB800C5F3DF2C1133656A50DA8BCB8C7A4C 9D193A6CA0053F3EC506DC860A6E1D87C9A20DB97046E18512E160895BA0295E2873DA275AAA F18FD4B423DF8EC1A53723C58F68524D54B6D9914AF8BBE78CC125A704B2AA630BFC9079072C A1746927903318B12F3B1E27917DFBF55C073C864A723DE698EAB4FABE10A7E72808A4F244DC 46371DF1FCC09EEE4DF59704E9216469E4E4FB322BE5AEE80C6D98A8720D0F3F3FB55F6BCA4F CB482A1BE93DA7DE1EA31C2E271DE833241F339EB2659613C7B01F66F83C76C267A3008AE743 6B28216A090189E761F1A7F37F9B2C36ED3F6E13904D76F86F8F4A52936DFFB3A6E80F5BAA9F 1B487DC441FCAF4CBD03967E7FEC6E9CDC3391C610D417131459EED2EA59BB347669602E20BE 20274402FD4ECB6C48B1EC88723DDEC6FA62B5198A1A1B58C84808927754A5CCF1A303B477BD 007D0ACE8605BD69843D281FC86ADE5967FA5EE4F3236685224E7C8E60E5B5DE54275A2619EE 6505EDA4DD09B6141936CAA437034C9BFBF16F49DFE78D9FB54A077F8F7CA6C1F826A7F14481 09650878C00DED8FBCB44F530E1EF48A8CD2A1B12A0559C1E395F71D329C3346666C0DF556AC C03C93558FC7E31A1FBC5F4405283B4B89CC60AC795A07247F640321F79893B8AB69DD094DB9 54325D7156AFD5FA5C342DCBB43AC95F08B8CF84EC36701AD2F4F36B0F8825984A06939DFDA1 FBB9F5EC31F817679C16CE40F62DE80DD73BFE40D91542D7F5797933C9634AC1D4B3AB826889 645B2E5F92D38A0145DFF591F06889BAEDCD3D940CA1170D6696343D36DCCA45D1E7CE91EADD FF859735592AFFE97B3BCDD718883281FCE404A5965FDC496EBD18E5538CE70B6451B71331C4 C9F801EAE0AE6E3F337780BFC3A949EF1C13EF46CE490C93C6727B32AA87326A42F28C41C6D3 41DF54717959DB4976A6CBCD7C25CE1C33827BFE0F2388D2C4CE1CFEAD186E2BD67D38643600 9F82C120C09586F7CC02418A872CB45154B46DF9CB69DE5CDA0EA993F8DE6E327C7BFD04207B 517B3EE48E21F50FAFE63DDA65CDA3E6A4B74CCD5C24BE3CD6B92B441C40F86ADBD18BF783D7 2A6263A819137FDA5AE0EEF18C2F2DF9E92C5EEC87138B9745BA726E8522027165DC0F62E6C8 7F43792068793DAD52D828F64F7937CE3251AE3BA0A815ADEE848F06E6BCA0B91F02BFD60D4E 7A18233B9CFDF7118CF131EB40303D1FE9B51F3BAA0AC7BFF29D8A7BD29976CEC990C83CF700 415749A0B1012DC268706A6EAE045648FFEA95B584F578E71414A75A160A26F56B4ABCFE3126 57E21EE81CC08C532C927E4C7C867181059C891F319748124B9A6AAAA3131E09523F5DBF8C8D B253B88174FFD26C92E6EC94C6E2977978CDB8D6D18E64C1B477454D981D8F2849D270A104B8 5CB96313AD641043C0C334B6F5C33A958264F2E398D983C5D9C92FDBA69EAB817B6B9149853B E7E56E68462CF2A4F294C8A53AF3652F5CAD7ACC27806AE182C03901B3E10FE09ECFE4185DE9 D0FF04BB5CAF49208E014BC3304245181E2F8B86376AB85C6B4A73B86CC6800FCC94796D9BB7 2288B221E7C4BAEA909C94A33C89B9BF69CCE971EC7EDBEE9D9D577BD96FFF6C499DA061EC85 04B4BE27DD9A63B8B878202A51F9D9D9A085555A3B732A462CBA2B23850595B66C7B1F46B28C 0EBCF4DDFE39E75FCFD524B2645437AF0A6D516A923F13E8D5C8E9B9914B84256EBEAE040656 3D3AE563429921869E25A1A212A2356DE4F4146F08CFE96BFE4C5FF4D7EC28538A1FB10F61D9 1345B03A6185FF15339C3030BB1F808D15FA4E7914A3585EE12892188D52225539002ADFEE03 9DF7929343D20EF7E9233D321F5F24F418C4E8BBB6EA884712494C2E4DA09D9D14192408A5F0 E8476A12829CF4D9360B6EF2D550CF08F0ED55524417C9C4126F800C3255669D7CC7D48E3B5D C1F7CEEB63BF83F088B81BD5E79A6D98C9059AAB0B7C76BE0FE2064ABC855C79D3A6B7170F95 78A72AFF4AEF788DEF0071D4225BA16D8F7D2A4CE788024DC40E3AA499740B15862592846334 8C0D5DD4DD8D3AF95820E7990F2B71D6CB9DF2C70B9E1FA1FBE2B0E90BCA50C26A9E8395C30F 88F6E89B3D278D7FC72CACF7EAD59834D3F57DDA601E36CE1865F3AF9D4BC4B248ACF5F14D51 745BB04A6707413B3EEE11F681BCAA00720F3392F76BABA49199C259605CD9C54FFD3C83AD44 0F343279A815CDC5E0B64483759B881FDEF81F054F91D01A3CA6DE094D9B1147728CFC2A6634 F9D044845A256281B6AECCFCE9C117A142E92C191DED94FDF1FD6569FB64778989B2D4535E5C CD4733A6DA2CAB68CD13328B901B743D21A67879E62DBD911011E279544A5A0B510A08DB359C C72AED682F2617C68597F7B4DF3FB57FE824EE343667C88D2C4A28CD082A7D1EDF3C24622A34 2E6F5FD204483866BCC14DD14AD7499567353BC17F733641929ED72831579EB52B6FA39420D3 307E00B3FAA59F2C6C24CF21B7C0C08C0A0F040CCC959D79F111A79309D0D06C62BAD63B8430 477BCA820BECD877D4F9F8C74E8D0B88A837FAA52E734840E9530E6D7016FCE925F81C572AAF DEDC251CBDFB2B7EA32DDA00021E56F2B98A69D20C248F60F84B3D12EB3489E836CF1EFEBBD2 032104C91C8E4080277D68F62E8421315F53F1AB932CE97701AE332D2EF6B7EEE799AD592CB6 14A288F4D488DD224B7C16CD88CE36E9B4A1BA8ADFF15552C5F3E080B56E8F01D96525F2F5E9 129E02E118ECFF0F2FBDD8FBC159EE58A217DC106D5E7127CCE323513A0288AD2FDC3FC3A514 962D6501534A1E7F63CFE949888BB1172AB9C5709D923A2055B16CE93DE49E2DFF0B03C3C02A 35EB8831695304764D82BF5B02EE351F28111885DC9E7E46DD1BC49DABCF05EEF9AE7BEDAE74 FC6DAE06F8BC2B0C15F740F451339933023EAAA03803A0630F78A40A8DB4D8C76F9A4EC2F3B9 A22369949B27579C335F06977163F091EA7EE35093DF43ED53A111637B1CDFF73C551EF14CE0 2AA83153F63B33907C33DA1353B3B3309064D4329C5B617E3BFE99CEFB5F106A6FD523FFA56F CFDC6D79493CB13EEF377875CCAA20C64D0FC259CDE947575CB228D1F57AFE8A52302A510106 7F38C69B4C48D2FB2A3FAD53954235A51389899E19F5E062CFC2C5C84F09EB230D11B5A884EA 8C5589EEFE86749783E3BC36822D126FBDC1CCB703BA09776C41A21C615A33E40070705684C7 89FA3376FB9E4578BAC6572C550B20898F154353C7E7BF741599FE134F2770062EFE37F23601 4A3AEACFB2CA8A822D38D9021127C806F184A4BF540B9294B819AD14899307BE553E3074D752 7779320036858576320ACC67B9F4195BCC796CCF18F2508CB0D8E0675FECE799043714C4C7F3 E20C4FE6FC16369AB13127E4B83046AB8F6424553A50C77A462B43FF44020619CA5BDE1A169F 7FF6DA47C5B4AA04AEE8E5F9DDBFD5B5C038BF40E6E1D9E60948B7E803DA7F4493B8B4EA5FC7 9A13838273663FEC8A066CFE47ECF982B56DE16B54862984E85EA71EDA0853EDD62A2BCA32A4 18FF4FD64E5A9F8C89CE8DE212DBE0C2F1C7A9808376314C887D6B4CFD1DB02CC074F6203774 C8ED0A960AC299317B086B7B4F2B9C8C8943EC408C720C9EC403D81A3334048DD9E9775725A8 6CB6E643588026144B223770C81AE246EE5284753BB9C8A3CB1503956520FCBCB3275E2E12AA 3586EA17D54C21ACA07EA68D5B829F34DED20C3D742517985EAD0C73B376A8FF83196ED1734C 0CB7CFF4AA21A361B74DD8F86520974EA056C75A83481BA7EFBE627D9E8D9193BE448B57E259 605228AEFE61EE96F11F63AE3006564BF7F76A282C8E77B7B563124C6F2C087B2CB1E7A342AD F70BEF85E707ACC3D13183EFD1389CD4F63C7E9325A0C8964A64A44DD487B5F254301EE239BD A274FE59747CB73AF14DC10DEC080E026DE3B9E645DF15671E541247D52D1F6CEB9909DEFD2F E0F0C1A45F67767502A11A9200DAF76C7ACC526E9AA1E650C85DD2A615A1209A79939EED4D8B CB82F64C750FF4E9FC079FF128FC31FF2AB46B9AA7032CCFF4470952DAB0DA571681B98FD9F6 F88A150FC734CE885571B9AA859F46AEAAE787778F00C55D4E9DDEDEC1AC7875FE26EF45D3DD AF1C81C9734610B3ABABEF7DD4920317BE44821FB4D29573C1EBFEBA992832C6E6EEF541C442 E277318F4E3838097F05815AD7FCAC930E65DECE76C4B594B673FD4501257ACC3C7946705FA7 5C44EDCCAE53324230034D22B3DB4017B638779446A237C90F174A32D742DF6DEC92D772BD38 1924277FB71C0C4ACADA6707AB9E7C5225778BD469AE4B5FDE051DB5395F87511E29D6C6646A 8D8D6BE1C8934449EE1161FEF494D8C7FAFB1A9ABF67C29A739AED99B080EF01DD81A88EB0DB AB40475429C3EB8327EF6E8CAB6089CEDE6D80827EF9088B7A3D9E49D2EE12ACF84DB87A70AF 6C9B62BB5322059B7A6F3E5B7139E9CC299A17C4D515345F19AFFCD0BE18B94C312081C0BEA4 4BC2D23185A82ED97FD2EAA3984EFFCB5F841BB5C5BCDD52D0EDA14B41B13EBC52BED4C4493A E72B665D3E50B7BD739F32F913D46BFAE248FBA2AE62440D4FD28E90AAB1A21E174F99A10B86 98949F9CF1AEF121BDEA07A960D3E3AE14C529130B3F8B703DEC100BEC0D66199EDEDC4EC04E CF4B367C0CBA4C104C8F69A0E1A483DD30C52A1E06EC44586B687A181BD1E5A6EDC8B71FDEC6 91148F2D8FC56AE5FD1C77C7B9146ADF1A440120C1E66F7393AD2F3D44C03AD764768B567C0D F0776DA2138A40FC817C109063CF4A62509254622F423FFDB55F454971120DBAA8972C7DFA45 B4498068428F09E5F775DC89ADC83CFC24518F25483A687100651E0A1694D8DF792FD1B02E97 E8B958797758CEA3716BEC1AAAADA74F2BED7F487D872524A833AEFCA6814B4C735EEC991E2E ADF95994B9660204EFE8ED0A0FBBEF84CF67DDA6C1AF8715ED2B2844E9CFC3FFEE2A2586B95F 45AA44D8EC113E899E2FFC211925B03271C67117E14F3C115B816027A0727730B5A50B427C77 C027288B908EF5E5352A55AFC96D900BD57464D61F00FA1164ED5BF6462505F56557FBFC835E B384E965B33422107F84E9248140DB3C540653106B8567417397E1F28C5B90D44FD5D8F49236 FBA255FF6E67580914EFFD5E38B1F7830B7C7070DB2F2356EB7DC47C73F1553CC4823300D3EB 7802825D7301622B8784D6357B089ED25A893306DDA9E3AFAD35DDF750BBA279E53A0CA663E5 57184C3F444F232D1D3E386E31376104B71CB9E17F97FF8717499BAD463E7C283CBE61337CE7 59B922BDFDEF0F0910F8413E3105FABCE601C1ED8411BA7B091BC12664FE992E024E741D1823 3B3C3FD21B73E10154DC1287988EA5946A47181F78CFDDB8D33FA7BD0DA14112DCBA97656F53 8AA776898E2E10EA1FACAF822E7B64F4353E7414D468C19395FCD58EA86C6EBAD05E6A00F117 3749EAA8C1AE9BC2E278DAC86FB3A134B951A8110DB59C7C78F455C6056AC5EBC4AD8A0F0309 7AF06F8D7324D9B6FCF021AC2EF58AD617305C3069F921774832B97900E9A3B9557CD2DFAB05 8D7B2B351EB80249952AFAF84502B12B1E6AEA3F9D8F3EBB6F77801D71FADA21D542B3F6D60E C743DEAFF50625F7780114482E8322858D79F636601510485FFACDA1D23A41EC56FA3E084DA6 4F5EAE6571C12454C3C0890F454AC976757E0282C6A954DE72FA34B35079B53D7D78740DCD7C 9FC4D26D0F0919A3A7CC9CFD81C52DA5FB1D9E2105D59109FA279768181F19B25DE4263EB40B 81617B4E0D038EF3CBB283E11F42F3651C9E5F401414B51953B4A2E5644B3F82BCF8D8001C57 18C2917825A802759568D42E8B9E4036E70CB2FCEBF58A24E0177DB0B8E4D0276C1EFD8CB08F 3B81F55CA3372BBED2027DF56C0FC393A4FD61C6E42F61BAAF9EB62A311050A54120D1F26F1D 0C344F8F46D19637D140831F66AE65397243DDF6BD42698DE30EA3D59E41E2923FF5A1062612 0C0414BBA01B40E0D8D1606C3A1209027D448ACC47ED2B12A90EBA01B2ECE9FEAB0B1B511A6E 2AE8F65F332230704BBB86318E86A1298B0F11705052FC6DA94C99EA0363DA8E14C314166FF5 8FEDB893DE54199557E939ACEF00700B1B7F715FB81206D1DACE7873699D0FAEDE4BDBFC833B 04FAA82300DB4D86ABC16839BF9FC85B517CEB710C238F44C21234C8E47821D7A76E4906A03B 7271814FFD6F2213F2A65397AE7C03EC13FCC8953E05B57B77EB662A4066D5EC6894C2269E42 D4E0EF8F5145FB8C1186D58B7F718C4230FDE0F38294638DFED9178281070AC9B4132AF4F448 10A0AA39BCECF4C14F810462A62F1D7EC6E17298E71CA869BFB8664FDB0CF24F2ABBF54A115D 942F540AAC90C90B054DA94CFD3AAC253B6B9B25D6E5C0153522A3D5E61F89864308E1BE2948 6D32EF7906F6F7B0D33BD5DC416E639150A254697C14AEEC9494FB9726D52EDF3590602285D4 F89CBEF328D36B3DA494980813DE6891FC7AF514785FC9A41E481EBB64B2FE158000B2EE1C1E 58A767B9DD80FC33A55E1566261D210C97E6082C5395B0A9B313DA07125AEAB4F1877A0343E1 6FC2ABC256F27832DD6FDC85F2D498C8CC87A0F6BA154E8D8F74B25B6367AE4ACD4C81A6251C A2D0F2074892AF0C851E67DE3659BE0D7EE25471EACBBB62F73183BCBCB17437966D54B361F9 3671607B63B740E1FE757D54F85723333CC1D9CBC177402BC7307C66356190C9B6BBD8173259 9D69598E272F13B699FF9F7A73CC00C304E8D0C08F609CE5FDE5E1F412306FC1BE067ED5F3B7 05A3626D634C9C93C62904969EBA1838BE08AF50D02EA70489DBB59A728184F8A9EB2427E676 5FD95F35B59AD4FB5B6703808766376C1FD1A7841D399CCD07D91D8F3A98465681ADA819780F 7F5F4C2E414F61BCA1155827EAE5806F3C8C84B72906DC3082C7C27545381046AC307FC0F770 3D9649FC79C398A4FC132C677CAC03C7113DF5EB54D03AB848C98C840EC16CE2E23015D9C855 BD4B04E6BE0FABAF777F5AEBE32A5DB649388AB504320BAC1839273F0293AC794176FFB1B0E9 C48994C6BD5D3C532772FE8A5868BFF9621ECA953BD512FAAB4744D0D3B3A166A63303959A4E 4DCFADBE9B3F5EAF73AE6B794181C242535726A6284B68960D92D6E17A7EB85C51EE6F50BADB F5C178ACEEC1B27A087761032C42A5CC97F49FC946DD19B98AF548B7301F7D3C8594ACF1D876 0C87B9751580EB1B3B158FD7AA432B7DEC4E3ECED0580EBF5B8CE6390FC7E6405DCF232C1763 7756308E6FA3D0E01EC3DBAD056D7512AD2BA0D34B8160917459CBE003F04BA0F5981F85BC22 79B80114E101FCAF0DC00E4A5E5D5BAA3780D2F4350D6EC9700AE601C639AA60F564147E6B41 8BF2F3515BB6DDCD8BD4D52812FF7FA276267BB8C0A6D35943A76EFC669E61CFE8BAA010FE22 38D3DF6357FF5F17A9B62C7ACB40A5107A5F0BBABD40BB50D1D6810ADCF5E183195F7E7FDC83 6E0A9F1013E2AF1D95DA5E979E72BA668B3A32542E2BFA13C893F34F16FD86CA98BFD24539E0 6DA37F39D26DAAC647045CFBBFCD8AD55563A375E6D7E69F13FD469DF68E6B36959DBFBF0B90 75A2382C76B5E0EC2B0EF3CC8845D3A841D73ABE499B7144BFE9DAC7EA44779754C7FB19D1E1 BEEBAB54CF88F2F4972459441704FBFC503327FEC07022C7FD8E10CEF8693C9D4A839A025017 C266E898DEEFEFB1AF80592E0AB5A0D53ED42C1AA7DBC221C48557BC493F503518187B317392 59B44BD18896EDB63E189A05473337273D7714023F6B598075A8CFEAD5143341C39DC4B51FCA 79677A24D3BBB2B4FACDAD1BDD209B0216683757B7D81FFBA4F339B41465C709005DD2D138FE 35F5A1C134702822A39BF9FF5C24786AA15466E8DB995B1DD2C73CB0CA2D438130BC58CF8456 7489872992E333A2FE79604A6BF853634B80981660E0578441256C0DCD93361D33CE08182413 DD0C680C84691D7EBCC6E5B861BADC92B0407D2C3CAD09E35BAFFC9E0664B77E852350DF5903 022B2CA728CBBF5337F3ED754F048518288F78A0486FD0308A7004DB69FCCAA89B14520A06E7 608DA3D0A6A483EE1E7F3B59E601C0F08DF1D23507F4C3A501596063E8D3085033673FB44119 EB15DF0382F24CE38A1DBF1277BFC1F30DBD44BA9E4A4D1204277D95BADEE66F9C3E4436DE62 716769F5A89EEADE61FD5A4F06EA437CC8D779603E1966C24EAA23391B2E931CBAFDE8B946CE 4A2B786281F9F7A1B9A88B0BDA06DDD79DAE4255CCAD33AC54D612A8ED6BE53F9A6DF1469F30 17EDE8DE964E0E2305F7A5110FFE9F4A54B57571A787F9C9285E4DEF41AD372319D5D0C187D4 D680DF8ED16BD3DDAB9D2CC0048B37947BD8FF5FE17B4820F71B9B02A32157E7C57E4C314012 DC79A1F6261BC8602E04D0F86170FF079AF2F5513FA00792DB882309F12C09A8A2C83E360B0E 8E01B2F85B66285C888E3471F8A6A210F792658A69DB1CCB2C2C8E3CF7D5F14C0163CECD5857 4223E40DAFB51B6901D37F63656F5755FF210221D9D00E5A44BCBBBB32E7EEF7C3C575B4CF02 6B4DEDBA71E3F0FA7229EAF6CCB123B0250631F2B3244B4192469162C3509B359BD21A64B498 3F11504C9EFA77C9199CAB7C17F8FB8A515A6C46FAF6B9CDDFFF969B1949BEB605E464DFEA17 554AE60195C3B6A61FA79A628A869776B7311E74821703E93D1072424C4011929A33D4CA9622 733DF3AD65E5A7A53222E8A8B6883E5EAF51AAF975E7F9A7E2168E99FC95E63E9F00B3EECAA8 FE908F23D8A48871045B34CE91EEF1D2C7BEBDBEF67A6A3FBAB256F08060192BC7E23659F226 FF0867F6945D308C4ADE762BBCE6BBFF958E6011F3FAB906542E8CE8C143FB82444BBABD6719 57B2694DE5AA533BA0869EE790E2B2F086698C0E270608CA4B335230E3521517020636CB4CC1 CA532AA04BCB63A8A9F21A1587A2770A24697C3D2A2BBC4F085B6D272CEE26CF999C87D30E4A 00F7FA4FA408732C231F60D01BB7E2D8DD0B38BA6C62A4785F1C5E37A0862F4B5033DFB3F10C C109E5D2D73FE85A4D66EDFF0EED4C4CE7483DF582F9E2619C00B8F289EFE1420E12F06EC841 D0EACD9C48B0302AEC5ECB65C08C34482A0E85FA76A1BCD7B22947439496BE21CA5E63B058F0 ACDC918D660BA06866A0228E09BE8CD54F5314A7343A0C2F8A991C0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginProcSet: eka.enc %Eddie Kohler Accent encoding /EKAEncoding [ %00 /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/fi/fl/.notdef/.notdef %10 /dotlessi/.notdef/grave/acute/caron/breve/macron/ring /cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash %20 /space/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash %30 /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/exclamdown/equal/questiondown/question %40 /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O %50 /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent %60 /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o %70 /p/q/r/s/t/u/v/w /x/y/z/endash/emdash/hungarumlaut/tilde/dieresis %80 /Aacute/Acircumflex/Adieresis/Agrave/Aring/Atilde/.notdef/Ccedilla /Eacute/Ecircumflex/Edieresis/Egrave/.notdef/.notdef/.notdef/Eth %90 /Iacute/Icircumflex/Idieresis/Igrave/.notdef/.notdef/Lslash/Ntilde /Oacute/Ocircumflex/Odieresis/Ograve/Otilde/.notdef/Scaron/Thorn %A0 /Uacute/Ucircumflex/Udieresis/Ugrave/.notdef/Yacute/Ydieresis/Zcaron /aacute/acircumflex/adieresis/agrave/aring/atilde/.notdef/ccedilla %B0 /eacute/ecircumflex/edieresis/egrave/.notdef/.notdef/.notdef/eth /iacute/icircumflex/idieresis/igrave/.notdef/.notdef/lslash/ntilde %C0 /oacute/ocircumflex/odieresis/ograve/otilde/.notdef/scaron/thorn /uacute/ucircumflex/udieresis/ugrave/.notdef/yacute/ydieresis/zcaron %D0 /section/paragraph/dagger/daggerdbl/cent/bullet/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef %E0 /braceleft/braceright/backslash/minus/less/greater/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef %F0 /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef % LIGKERN acute A =: Aacute ; circumflex A =: Acircumflex ; ring A =: Aring ; % LIGKERN dieresis A =: Adieresis ; grave A =: Agrave ; tilde A =: Atilde ; % LIGKERN acute E =: Eacute ; circumflex E =: Ecircumflex ; % LIGKERN dieresis E =: Edieresis ; grave E =: Egrave ; % LIGKERN acute I =: Iacute ; circumflex I =: Icircumflex ; % LIGKERN dieresis I =: Idieresis ; grave I =: Igrave ; % LIGKERN acute O =: Oacute ; circumflex O =: Ocircumflex ; % LIGKERN dieresis O =: Odieresis ; grave O =: Ograve ; tilde O =: Otilde ; % LIGKERN acute U =: Uacute ; circumflex U =: Ucircumflex ; % LIGKERN dieresis U =: Udieresis ; grave U =: Ugrave ; % LIGKERN cedilla C =: Ccedilla ; space L =: Lslash ; tilde N =: Ntilde ; % LIGKERN caron S =: Scaron ; acute Y =: Yacute ; dieresis Y =: Ydieresis ; % LIGKERN caron Z =: Zcaron ; % LIGKERN acute a =: aacute ; circumflex a =: acircumflex ; ring a =: aring ; % LIGKERN dieresis a =: adieresis ; grave a =: agrave ; tilde a =: atilde ; % LIGKERN acute e =: eacute ; circumflex e =: ecircumflex ; % LIGKERN dieresis e =: edieresis ; grave e =: egrave ; % LIGKERN acute i =: iacute ; circumflex i =: icircumflex ; % LIGKERN dieresis i =: idieresis ; grave i =: igrave ; % LIGKERN acute o =: oacute ; circumflex o =: ocircumflex ; % LIGKERN dieresis o =: odieresis ; grave o =: ograve ; tilde o =: otilde ; % LIGKERN acute u =: uacute ; circumflex u =: ucircumflex ; % LIGKERN dieresis u =: udieresis ; grave u =: ugrave ; % LIGKERN cedilla c =: ccedilla ; space l =: lslash ; tilde n =: ntilde ; % LIGKERN caron s =: scaron ; acute y =: yacute ; dieresis y =: ydieresis ; % LIGKERN caron z =: zcaron ; % LIGKERN question quoteleft =: questiondown ; % LIGKERN exclam quoteleft =: exclamdown ; % LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ; % LIGKERN quoteleft quoteleft =: quotedblleft ; % LIGKERN quoteright quoteright =: quotedblright ; ] def %%EndProcSet %%BeginFont: Syntax-Italic %%BeginFont: Syntax-Italic %!PS-AdobeFont-1.0: Syntax-Italic 001.001 %%CreationDate: Tue Feb 20 20:35:37 1990 %%VMusage: 26077 32969 %% The digitally encoded machine readable software for producing the %% Typefaces licensed to you is copyrighted (c) 1990 Adobe Systems. All Rights %% Reserved. This software is the property of Adobe Systems Incorporated and %% its licensors, and may not be reproduced, used, displayed, modified, %% disclosed or transferred without the express written approval of Adobe. %% The digitally encoded machine readable outline data for producing the %% Typefaces licensed to you is copyrighted (c) 1981 Linotype AG and/or its %% subsidiaries. All Rights Reserved. This data is the property of Linotype AG %% and/or its subsidiaries and may not be reproduced, used, displayed, %% modified, disclosed or transferred without the express written approval of %% Linotype AG and/or its subsidiaries. 12 Syntax* Italic 13245 %% Syntax is a registered trademark of Linotype AG and/or its subsidiaries. 11 dict begin /FontInfo 10 dict dup begin /version (001.001) readonly def /Notice (Copyright (c) 1989, 1990 Adobe Systems Incorporated. All Rights Reserved.Syntax is a registered trademark of Linotype AG and/or its subsidiaries.) readonly def /Copyright ( The digitally encoded machine readable software for producing the Typefaces licensed to you is copyrighted (c) 1990 Adobe Systems. All Rights Reserved. This software is the property of Adobe Systems Incorporated and its licensors, and may not be reproduced, used, displayed, modified, disclosed or transferred without the express written approval of Adobe. The digitally encoded machine readable outline data for producing the Typefaces licensed to you is copyrighted (c) 1981 Linotype AG and/or its subsidiaries. All Rights Reserved. This data is the property of Linotype AG and/or its subsidiaries and may not be reproduced, used, displayed, modified, disclosed or transferred without the express written approval of Linotype AG and/or its subsidiaries. 12 Syntax* Italic 13245 ) readonly def /FullName (Syntax Italic) readonly def /FamilyName (Syntax) readonly def /Weight (Roman) readonly def /ItalicAngle -12 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /Syntax-Italic def /Encoding StandardEncoding def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /UniqueID 1052165 def /FontBBox{-162 -236 1020 932}readonly def currentdict end currentfile eexec DF75E52129501C77D48A2CD163E439035617130524EB7CFF08648F56EA432F668E7411DEA230 FFF6E9AD2B398FD91803E3551CB2161D263C9C3C506EBAA45FAA0DC432BA459DFC24FA05C912 BDADFD31AF2148789CDDE8DF8ABD55A7A4802E573B762BF0616B5C33B587AB6F571F8FFFFA9D CEEB0F119B8BDBD5AAE384A484925422802580AD6A9E4BFEDD06A1834D4D481BB4AB620D0E51 810F9BA34FF1C9B738EB8FC8919CA771B6BC327FDA79D7447F40BE4011D88C8B0B5A40C73E73 49E5DC65BD64D3352F759777E3FEE7A6BE1E51F0E7F20FBF467342413F41B2B8452C85812F15 ABFD909B3194DE96A5053DC0295EB7B0F1468A48F9C98CE534BFE44D3C265807F1F3E120DDC8 5378CA5ECB1EA70DA75E17D6F881870C46170B0CF74B1A0303AA384384C454876F45FC6F8B0F 07A11E7A2DF1ECE5260B9276C74AE065A8C995B3C804FDDAE6567D980F5137ECDF19C823F0E0 9594E7DAE6537935DB15F2C9272536883EC455899236A78EF77584ECF747B2500F9BABADAF8C 2F54725C9E1AEF87BDA6B8DB6A1923FC5194FD1AB0D81714945845B18455420213DB5D807181 E1AB3A83975004E70F1D17A2497DDB5FF978B9AEEB7DE0E85F09E5CE98566684C93984049A85 466A8265777AE0454810DF97A8428C6D79071D89D6176828E3A5FAD61AD158DD929C1FA29321 DF325CFE0AB616DFA79B5060919B3BF33F5D09632287C625A842A4404C0F2C42E045918A512E 7C3475B9D0EC2B179BB75E92F75E6E1641893AF638CC4BDB80A6A556B339AA7F3A370BED1E8B 6E23DF5C14DCF2A580F910065490467C28D95F0C965E86B86B53A6647873C5B1FA26349A1695 BE34688D1BC80B43C92427F462F656265E45DEA4DC0672A0C3AA7BF025CA4E022AFFBB2457EC C1EB2E2C0EB54D35230C4FB2A7A3F51A650BF334EFAD923D2A583C779A47566ED04C7679A9A5 7D49F99FB6BD21B95E6F6B7D40EBDEB0A3AFEF7FBB2ED679A32845F8B66FFD3E20EB6F3C7AFC 9AD15A9C103B5BFC68C250252823B11A62B105343C3D5DCB319C406C110D0F31865FE480F4DD 061580AAEFE91077D36C83BFB687689D88820398CCEAF2A3E37B8683C0256938AFE2FA6D0E46 BFE510726895C8213EE3C33D4819758C01208AB6F7FE925939EAD8786558451C9A0E17449042 1FEA66621A561582466D8BDAEE7A00C3E88DC7C6B3F80823D0958CB514C3F2B0E31E149E72D5 19844D535E056B87D89C7240F00F5073D597F75ADF53E84E7CAE6C3602CA7B0C02517FF411DC A3517EE40B0096E90FF29AC8F645C385C9DEE25CBB8C5A99DF581EE2E17EF16A9232C1A819B3 C4A9F4FA595A7E9550D55D44742B757F3F630F89DA9DA2B542BE07FEBAF91A41B03A37191636 744AE628176EA62BEEF57F1BB7AABB50D1B26A0D498BEC3CFF7B29CDC48A757F7DBA3FED97CA 68F778BDCB7F51EDEBBC9018C3E65A7FDCAFB7B47D0CFE1F07D00AE8932A6459982FA89EE009 B322DD50B67979C2A87434CA05E89BE970DA3E5EA0B8E3150DC133760E52C722A21706167224 1CEB82913A4EE26251A478A08EFB281D6F7D3D253812A65C4942785089856E54B6BFB2740FFE FABC822789A736DDA759A6EAC803EE81284EFC2A37C09F7AB8C3E58279A6800C676D4994AC8C E8EA6BF831DB6A568075EEA565A5BA798A517FFF311B1F8AB0C8D74B4180DC8C15995764F5EF D8C098E664A569DC5662369D9F81A2008A807545F88C6EB11FC608433A2BE7DB640FE0D688AD B18FD9357229879A7E63A7FC291A3DA4B53E0374235B061B28D544B111E84F9263FA6F0DF49A 981BFA7BC7081EFF0B9F0418ACF511D4E017F9232BFBFA218A9B15F981EE218AA1E246FA3E77 666EDBDDB82048E12D497B28B980DF993B52B8BBF530D6925509654A916D13DEF19BF6079886 B4896A6141939AE6C61D87C4F8CA21011FB854728D6FE65C93925D9AD4C457F70251626B86B4 4F4454F623AEDF6A372E2EFBAC8E5407DE2D97023C014372A82460B48F3086AE2772B008C10D F73F70A0622AC615A8CF71447CAFE783452A7DD0C6D88DD95BFCAF3A32203D535FBABF17F32A 35200288F4DBCA1A996D29B4A70F4E81E5249CED62956BBD79EF7873BFF9170F71233BBE5600 AA01D300748FA551F448EF7C84C89BDB745627B13F880F2922F6B71D513D20D671E4D4ADA110 6BF6E4EBF7E573678A57F3EB1DA1D7652C59B77B9488170210782F70709726629B3CB401C9A2 6719B401C934BDA643252AE9139E1F50E20DA0FED8A1C80990BD7BAD0514C1E053911A03315D 03BC3614D41E5EE43A9E643B264B33828CFF77C0C8801BA6C3D4B5705FD8A9B90DA3BF4B0644 28995005A3B3334814C8A898A95B6EF750F8D19DDA8C66F19BC102AFCF0CD21BA2ADBB9EBE4B 1EB126B6F03534EF6A68467DCCC274156C50E01E504090FDFD8EF644842B574D9C82788CB4D8 70A0E544C88E99F6F150E4B9976B4845DB7C9F7DA840D9D91C88D657D73EDA6A6ED427812FF0 7D38E662F3DFC52D00C9F6A8837A433D55A7D6F80D67D947095932F907F1A880C866316AF755 C3DF5733BE741E3EB3BB018EC31404AEFB647834865ABB0EF7F21E4DB64762D9B5BC3E26BF85 6996B4E78D8055CC309103A94821D68948E6B37B4B40450A5464F0CE26E3454258EEECBCC336 DB38E49FBE33710442FDEB62ADC5E6F4A2C5C1CBC21DF351097EA2E49A32179DC20DE327593F A5611EFD6043380EE9D767C8D33946558639A4641CAE2D2E1EFDD924D6FBE4AF3570D558F467 4E00F62C10909AB8C0EFF6D4063000800A842013D4551176C5BD298B2BE5616E334D852FD3B4 FBC2293D61066CCC93A58EB70DB9E6C061B2C08B4A2CE2130E83AB80DC8D40D11F99ECA64D8A BDB8D583A65FD848E725D252FC9CB5BCCA23AD4700B778B4D3A0AB0E74DCFECBC5F9D2CD5BC8 D570392BC617BC170EFCB0D05A3384CC43DD85B60B7B4858A335FC3BB9C34AABAE535F5AAC9E B49CCD5CFED774103CC038C4356852DA6570C7AD422035EB43C55A80E7A56062181F7DACADFA 44AD44FD9997809D37BC158AD9D4EC44E0094F8A3D9B553FFC97F6F1331DF71163789E2EA800 DBEB127A6A0F872B501875E5758EFE2CFA4DA08A49FB435D4620E8A15EFC9FB33B13FA1F6A98 56CF2EEB543CA5B4F0157C88E3AF4290F2BEFB2B97A778FBA23FDDD295E090D5CA4CB1B7C1F7 5B11AD1E77A11365E6034F7ABC9CBA49619429113007CBA2A5D4DA27FA8783F0766ACC58A999 38A32295BC5936B911AF3461A1C6384CC73B512916301E80FDF11F06DD0E7BE6BF7928523A9B CABECDFD61B369CBB2F962380812B6A93CD29E14370E57DFBBD4B2BC510D5D7C3D570E184989 D6E095A9033BD12505E174BEF1E1126F6B661A9E0C16E2CC949DE4CD308C436B6266CE01B5BF C14863A6A39FB85A1CD2D3C94B9A9A57E4954B6F8A5E3A74345C528E2E398534B471025747A7 21FE2A7C4FBFE12A134EC9DBEC4067A85FF92A6F229DE071D167BFFBDC86B0FE672775993870 64F823C48932C807802FE4D9C7F8F9B16BE3CDCFB98A29EC822BEB4099D53498108833A8AD14 A520AF70088E0315721F77BD0692E6C5A2C31E3F322F388B7A241E73D0865974C76503CB7709 9FAB1DF8A9D3ED2103D8AD1E7001E0AE8825A2E1E7B28197D3414C8E41B711279BE5F0CF1FCB D3DED183B140AB9729CFEEE1A4F981B79764FA126ABF2509754DD48D142BE30C3F904FF8AB08 C474B6555E6A9BF6006DB60397621F23CB59496E932F51B7F7835A1564C59A5890912338DC64 19E62A6417226DF3BBF81A1D1073E4D78D04B4DAEAF32DC5C92879F90AD42F6103976F9208C6 B3C19A78302EC141CF59B2523A0CB883D46ACC0058B2D01A561F01A70E7FA707B0AEF92AC653 C1373763DD8B7BFF31A3C3195572EC4B882E663F4E8E54D77B43B5805B9D8B88C396DF5E9ED4 D39BB31C29200018504AF000675634B6D08D8EA60D508788A057AEFBD150909F386C88233BC8 0CB800A297A0F0D3EBE2A2474D484D87CA634C67C85DE15A06473D1EFEC3E7100592B42C01DC 314370C28BAB6E4E5CF165FC2BC1913B3AFC35AA7A105BF9516D8AF96A265C2617B2D56DDFDE 8AD2EDA3B964D80AA8E79ACB2B5F54081555602D8775E56C826A45C63F0DF55133989E1686B2 7522EF7CD68E4469007CCF094824265F19A2571FF73C4E768F0188A64E4C73E98DA95E2D19A2 8F04220187D7D1AF187DEE7F8E4A249E0C396D429EABB1F875BE91E995945D6D6066D0806F02 52F9D34CFF6F2539886C6315B896483CFDC0453800097B7621492295232158EB7666DCCAA9E2 C2C91B469F83CED50182290BD895D2D6544484CB2E4949BEA4AA8A7008548E8592E9107F9770 CC726DFEFC5BC425F9359C54C18F943AAD706092D4305225B34172528C26B18DB2CCCEED22FF 15193003BCD8C6CF19ECD54BBD60BB4667EEC117B3F6A6E700B24257853FFA8405E2EBC4AD5B 083D1CBB37A38377394B681EF436002BDCB662ECA1421152C328B67C2B99547E91CD6FFAE104 145E290A0E8E86330D52699E83FC54F26C9B4F74A199E6A83BFE486DFFC6A3C76F54C2E77A9D EBA0D909921AF24F068B662F7E9E01B3ED95D736691B2986BCA73C3A4C7EE3C577A5332677A8 52DCB5EE7EFA4CCEE610339A30E9D1D9D9AC1802617631B10A73E058D6EE98EEF470D926A3E5 93C5C5E2F2949742FA593E306C2558C80CA676D27EA33C83370CF71714D0678E3CB363F476A1 4CEBEB807C0C65E0D7B01AEAF7A030E5343F137C673BD221AA029354426EB29A6A415AE3D9E9 D8DC7FB5C19B9BD331FCDFDCD5F23FDBCDDC78314F142A4E69A4FC25AE97439830D303F60F32 21C9A780336032AEB2F5631D37B47E725DE6CE75ACBC1826324ACD089AAF928741DBECB6B48E 9137F10A96C31ED82D2B1B9500B35FE23E0E7E769762C774B3CD39B0D0A1F460E94BBBE5D0BC 501FA389CF8133412B09F89376F3DF0989167AA614FAD2962180DD49225DF289D089BE8B4A65 43BE7BE292FC77C356FF6DBFCC7CD0265FC55BDA41B6BBEEAD23E469AD2D603715D48F3A2606 B39DF0F8E92B82B579B88F88B25E67395DB97D36397C5A17DF663208E83DED465C30E20F16BF CEDF36B46C6B078FAF156C60D9DBF9EFFA483B1DB40F7880873FEE0A73FE4049AE91E7BB6B39 34F75784A82E6C0570B0539B62C9F30B8751F6FAC5344878219D8AAE3A6A596BCA06EA4C226E 655F894F6F50FB38017C2E5851AA593E0ABA61FD98C4C17BB8AE2DF302F35811D41DFAD5102C B10B414D64F60AED726D425BC596255D6CCFB1D5C0A45596B353FEDDB1B9615FE3B24E97B6F8 67935DEE4E8C9610AFDCC3E5AFFECA2F9A1A2D05DAB9F147BDB22BDFA21B3A999247D59AB6A8 61727B844B9505D9E7C7EBD59013B3A57D8E3A1F35D138FD5DA9CCEF95707AE197BB9CCCEEB9 699FD6D7D69BC61F00234BE48E8044979997C47D2700731D8BB7212896C995C6DFB356FBEAAD B54FE0A04F8728AE29D511C2DC86932001FF248C47378BD9CCF4D750940E22E45EF20C2408E3 9D3D0D040175EB6EDC0E873005050A438A53D29A5BA58E78441A017EAA8F1F400EF2C3837D8B 7DB8CE62025486A7B7B33C7920BF60C72D57F5D625228490349B33F2C91AC4A4F85B122E35A9 49B0AF372D86A1E5F9A6CD372CC70E647C09131AFA907D9B5E5E63982C42A3C46227FEB87DC1 6594B77DA3556012EE5E31D9C11A0EAC715CE4B5A0C1CE4BD0C341EC50CCB508285E6832F8B7 ECDBEA2D226A94DA153D81675DF41E1D1A0ADA39D191D927D1B15C9B93812E0277766144BC23 5F3965AF7B0234461650845A86B271532F05BCE094E181DA3C0992A74A18FC17F969137F6EB0 2D8D790819A4F56A12916D231830A830E9A91E0F13ADEEBDD92389AE2F43212AF01189BAC8EB 6D6921D4C20F4612BF53C7BE13F342EC97ABF0681CD2049BF8C642FE5E9963486D876D84880F 40247AE98FF6269DB4D56CA0440128A7789DD382CEC2720EBAD93EF14E897CDF0A3958E2E9A6 96D75E7B9F73EC6269231E598E605A1FED0750A3215B2184628C07A730E9FDAA28B2D6EF4780 EC853244F8E8FCD31C57E77B59237441843DEE9AFA96A0C25A8EBA7D5911ACDED6455EBF5FF9 364776BDBEFCABC23A0EEDA01687DEF7053AFE7E29128B78A92DEBD8AD8A353DEDF3A9531185 7025C0DF9EB10F4BCA90EDC67E3C9BB5AB4ABF51F0C342EE24773E42C0C9A811DEB461A4DCF0 8F2838AC015D3F60B9FF256B886D95B02F40C8B0D90EFD592317DCCF83923216479BE41CBF1A F913FD89E0B53602D45D4E2AF977F861E06CDE121F80CC3D2EF22A24CD4B49563FE190581DDD 153571D12CDD4D4E28ACF7D2F0DBA740589EB3C58A2C635344E73603B454037FAF116044587A 364E5DE00FD1629C533BB7F6E34B1C347B9F881C4D8BC2E4CE6E1071373C385FD72FDE4E028D FECD0D88EBEE48B6C3F9CB1558A0C466A97BF93E3A1966D4404D835DFE0099E06A863D331504 E7AE642A198122D490B9FD7A80DB2E4194F63DEB4E97EC3C8582CB51956AF6389EB934CA9E1E 040952D7197D7B8BD6B1592DB9D2F5186D45473D483480EEDD6B992CD004E7E979425F4A7182 C71E0AE558EEA2886BFB638DCA3F0A569753D2395A6CF425AFC7709A68C99D308064AD814D20 67CA0CD54988451B1866B0E9F38BB9B0969C2BC23208ED4C0628D848A14A7B4CEF44182AEE29 67E4D6F2042E1660AC231373DD59030B20BD2BF4BFE16F0627CF6EDBD2372AEEF4933BB338CB 770A0BC8EAB7B91CCDB5A73DC9401B614EF2470B36B6D8ECB96A8261AB50103F2BB45B3A0B72 A43FF08B162DEB1B852D3952D4ECA579200974950488F578979BE9934052306979FF149B34B2 D7EA22AF3747F60FAA0A9746BF9282B91F5A2201988D009ED6349CA9299EC6C55D3552C697F5 C00122781D1E5070854183F15C483839DC8FE8E66C23C48DCB89AC65E89B1991D9783463265D F46015281C1E1B1A71CC3A73116F76B4AF22FBD52C077AE70E115B67DAF9FE4643DEFFB61BA0 EBFC44DF3AFCC070EFE545C8AFE61D26EFB033A01E3375F944783636D96671C22B78BF35DD2C 18B78594BDE4CC2D8A3FA89D5C5CCC99592BC5BCFD3DAE4B8E2D0CBDB46E19EED3006DC72E03 EF55D5B14DA855C21F7CA10CB64487804684046720564CE6F916E5181BBB8A4D745338091434 9610452A39F0DA4851836E39A99013EA30A1E384663A350F19B5538D91467F097BBB32BE4E26 20A503D0389F1B25BA3FF98ABC1F5B773CB25E7DB3678FA812630E854E04536ACE296706FCD0 A1B19EE96541ED27199A84F061C7CBAF4749175250C62E30C7839F3760BCCC67DBA15CAD148C E562FBDD723B8E6688246E53C934C7C15EF356F09417059FE73CDDD862BE7A417F6B21B0A3E0 A0AF55C695287021DF46F69E2F949A3C6A636922E494E65B2DD577E2CD81BE44FB35117AFB1D 67930A2B5DF0775CE085DD44F0CF2AB0553DDACB216F2D416874575446F013455BA783ED1AB7 2FD776B97CDAFA94C60B1DC71DA51BA0806D50AB1977343481EF7C27B059107ED8DD5D9E0501 151525B8FCF3982B147D2293FF17A067B501D89637CCC57E09473A85F92428E363E322E75416 82EA3487B9FEA9AEEF4208C08892C0B9ABC6EB1274192E8C81DF7FC55305116DDCAEF62E196A E3D00B5E7A49C92B7C564298581B5D753BD94F78F15B21D5D3AE38C732686AA8B7BA8B1D526C C2700959865D130558CDF24074D4754E35AB90126937F60A01B6A3BE9D7E4E7133E1FE208DC4 D397EC14B0139DC2BAFA4B843A51402E8283EA4BACEEF514592866149769A62B0AFBE7D51218 11CF9B2F8E84106AA986C64DFFC1172E21D1DDC5ACEEDFD31551193BA8A5D9D23D09DE58D6A9 7FC37971ED521AB045726F023EA6D8F661BC8EF6AE11CA06B4770911455909A30516B35D5D8C 12F6C0CA8A49E157A3E4C5683445244A261CAAF1D7A9AFEAFF76B7D60AA59643E5C89D5C2B4C 0352E4A341A4340DED6E948B37008CC3F8EFB09F20DC0DFF7A02D8BBDD1EDA65E9DEAC81574A BE0686F6574C8CDFB79A3B8AFF3ABD0A6D1844A7212190D495A2F89139CB62460D1A52218F34 043AB09C6919E2F5527D6479F3D53A9413901BA4580F3A2B307596AD360B56960640D1B56D17 FA1D694766C5D3B776303B66DC254D9E98E71C4F6C763C81DD473830E3B99C92D037768629FB EAD74B687DBBCBC387356793381C9D0CB29EE91F74BD1C6AC1D6160C1FC3B84394485A71F8BC 06C6311FF83634162A5DB35BFD80B797402FB58A5EAC4935E79D30E3D18557E0CE248E21A8D4 9A4A0C5DA1DFE90BB73105F1B8915210423469FC9432BDA1769B602C56C8B9395FB66706C963 E638332309A709499553D4A82FD8691DF97D74055C4C250BAD060D10252F9326416647BA9400 CD21070DEC67A8E73124A6A5602A14C039D09AE6501D75B81C436EEA3DB2AFF09B42A0C25339 605EBF14C1146B79E6F01EF16209FAC6A7FBCFAFEC152B3800ED007BD6F1B14925EA90AC57B7 1D637BC0CD4D67F30E25602DB14F2538B5E128E2D600E96B430D06AD9811EA65113BC6898138 3A60930019549D49B17D1536894DBD466455EA6CCD8FF545B3221D2A709DA0E008036A6486BB 737E19BE66D6BBF2D8B2DA9EEDD0059949AC884B0AD171F646510C3F28F5BE70BA8483F21B63 A6EF27581E7ABD9E12D54B50FA6D46886A210B4C28E676D0483B3BA93DC31C24AD166CB397EB D0DBBD5A6BDF5E71A32C9F34D80FC0006C50785EA7A4AE8C25009441DACB36EE70D1AD65E081 C889AC12ABAC51892457559F429E29E5B24A393D47FAE8A274BB641582865C2EC5CF876882F2 2F7B8C38C09B6F99DA63608A393F8D7EA5B2708D4DF27041EEC38257745F67687BDA49B8556F A0B177E5CE5E4963A0A9088F6F7BD24DE5DF820F1C48E27CC1C9313732606E95EBA44731FE70 BF73CA659BAAF62348743A67B0166AA2EC150699E531DE769E86E76EC3DD559F7E1D9D287F52 D1CED22CD711669E40E77DAE997C5DC0BD0D324C402DB1E743009FEB64575B7CE972D0B9CB60 F717556FE3A3EE85F3A4A74D11BF2FE2910688E6B69827E29F1F7A7E92BD4B5891063C764E45 5181F1B1B0657D0BD1DB32F3E8A22FADF26358201DDB6135BB151A23D51D2B112A9631C7C736 551B948A93FB89E731EFF9669CB028AD72F1B77393BCD34AB436517196014D1D5D305FD7EE22 A0BBE9FBA134CF936C83C682B66341F400232636239BFCE6973B94D845DD45FCBEF9D9E618DE D40C755DF4BDAE214A30491259D99C552D6AEEE12A3F2BB1A4C1430716275C6EE46D0BFB01BE DE9F7386EDBC8D2035BCEF554381E7D6EFCB7C4A137AA5AD3D71F7723556DD1AE2FB82CFA837 D54F4B306295488537D8A06E18763B8CE18FAB6A9B1ABE57A2D5AA8B614E7E6EB09317EF9B05 0723616BC7B3C155A2E2CB5F1149EB85608246D8BDC6C7FE76EEBE6596B360A0A479052341A9 38987B832CDD5FD474910458E73C1402DA7C53B3AB9AF6D8A2EB659F0F1E34ED5B49AA9679B5 574A52B7EB15EEBFABE7E5BF62F1009C4B5ECE706505DECBAAD2760346167DC2B29CAB9A3A5A 6CD600BBE436651D2697FA7E74FFE379EFD0EDD9F853CDAB9D37517AC37E3B51FE08B7BC1DAD 1AB9D70979B8D10C23A283710F0219085AE93FAC2AE4879C71C555F2B4E11FCC4D14CB0A990C 53F063BE43F3E6AA4EB839CF30BCF18E291170FAB40833BF98F792743D27052588F41F4D7ACE 77EB665EF95387C03EED14D30C19C65BDA3270A130487E6180FD138192CDEB6CF2B81332931C E0A95DEB524889DE2ACED96996B41AF95A7746790D67CC0E5C5189A646133CC6279CA5309BC0 3788BE2A4AF0BEDCAE2C6246FD02DEC16E24B0E7775922EC1E7762B6101F280A1BFFD8B0A11B A7C2885FDFF456C3D52466FA2AFF9B2678B2E05F160D96EF22C1454CBE85334E68E24F82DFFC 035561C4F43143F20B4AD10F6738F30829313412CCC2DE482F244C74A69CA43BCDF46C8892B8 763D6A5D6D23B16B452715BF811F901B8625E95463708BFE10CB203BC5208FBA702AEE77A869 44B879E23DDA5BEDC9272C7CB80C9C91C0351701BB183EDFD131F3BB120376860681708554F1 CEC411EE101EA1B3C101F4B4644640AD096F40A8B730CF1C275572EAB4C1FDEAF26058D00DA2 008FBDB457C74B15F2817F78C83D601D6EC7FE591664752EA1A72DFCD6D0976EFC339BA0AA21 34B5B76DCB93A22C162D5C91458D4DA70E93FF244ED816A8DAF850BB865602AEC3ACB1A9B500 D54F9D0E61F56040B4F6EA584F84DA41C262A9BC9A23ED793C01D72705EEAEEE495DD96D5126 6E06C029F590EE8578501B19AEDE379BFBBD4BD2D25509884137015FBB7313A4BA278B55C4E3 17E7FE9AB6B27A7A3BFF48BE11CF6C5AC5C5F43ADD080C4E289FD03C8E34D8381F4CE7C81471 A1AC229A827A850124F1C29B4F81FEE3DAD535EBEBB62D99C3F1817D473244AE1FA1B6697D00 4E08ABE891996D89C86381A1B3B7EEC5D6895E79D81F84504FB6A15A4F4A39BFFEAC3070B619 379374859197831AF9D0DD0B0831A5C4DC95A5823F6892E4F6247CF2BAED5B1176930372592B 46A91F49C2F34B6C53F193A3A438679F73CB57F1A557328B88C5902E57D3B2938117B9572096 61843E8C92F767DFB672AFD4E2BBAEB9C79702E6E15EA4C7D46371220ED41747D6FA0CF40F59 0AB7544C6D799ABFE49C788B5CE30D39A53B2AC5C37BB8FE779DA9702E1B25BADCC9F8C55073 6572D0B688829C741B3750ED8EBC7A0933AABD76B3B73C0CB825F3D4ED2CF6B7E9BE02AAFE53 0C2A991A8FF0D4AEDAAB91506346656A911FB761EAEB2C7EB7284507537A69DF39F795EE5167 41F47F0579A98167E4241BA9E92758C2604CB12EEF67408B051F537ECA7D3969EAC729D954DA 6C3B73ED583B1FEDD5A7C15404EB21987CE2B0C747F86EC37FA68AE1D159451DA5F87A48399D B70466884082C735DA89BD0295185E5E44A28AA15BA2A9F4C8B7AF7EF9433DEA791B2B67C76F 7BAE81AE3735E7148DF3BDBCB97500613B34CF58A7659AA743B2672775D0B903CCBCA8791F5A 484EAD6FB91FE8FD40ED46E4462EA3FA61851D29977317608656C6F9884FFB44AA8641B1B07E 22F72DEC63BE96D9E364585B52E79137E1996D992F4C381BBAA5B888F26A9620EDD0B8AF639D DCC96C107999C99AB5813B3C5AF870B8BD361744260184D7E92CE03A8658BCE8DC497E7A27A7 E294455E679C8621624EDA5C27E887EFF948D15157D2F6AC13E03102AA1DBE9B146AA62FA516 D60986D22ECD3D43756860E09FAFD71CABB73FF10BFCD4C7ECEEA9E328ABD35F6D8E957E6BE1 1C65C79DFADF72C392510A27A90441618D4DB02CD828BAC7B55447E0F2208A1764342FDA7A95 4A6E4C649A78459EFCCE998A50BE70504F323099B2460BB5AD13DF185C073F14AB14E1A5AAF2 821601F601828AE3A3853E3C4087CF2CC023DAC71EBAB777B9C34A99450786C261BD49279B18 27BB8B9C5821CC6073A31BF1224C9667CD36A02846B6F7AC8552A2C2F23C253AA09B500258CD 189D59661D21BC447BF5DB1FD06504C5B8CE447C06B53892B28B4D3087B365DA9089D02A36ED B7DD055215361F066F9FEC6B08B7A4BDB24FF8B8C17014C3459D5CDA0BC19FD4C14DAC0C96FE AB991CBB1D31D1954E1B47AFA311337A631BD59852D773E7569C4BCCEBA27B10F78369F4A084 97A89303F70DCDB2476E6D0CF0A0FF90164218E0574ED519F22FB2BB584078EFEAF1B0D101E0 46DCC5422B54D7BA9BF97EC97F30B1E6C77E7988DEF2A0E86DB8BF75B6EFE67CC28E279BB8C8 74A2927AC356EE1809C8229A2ACDF505913605D68D33CB653A36EDA07F8CFB2F4BEF97C9FF10 21080679C215097793BE52CABBFEDA51B5F1603C26B6DF152F83D09583552E29F624200DC344 8DA71081FC5FEA4E5139AB90BBC61784FBF48CB65AA8CF0F16187F7D411ED2CA7447E35F9C82 1DC88C6A3E960E60BF60EB948A5C138CFFE335F2BD590915096B4BA469A2BBA3A81CF9E1A28E EDBD3B5BC8B9A3A2EEC91A17A242FA67984428ECA0C7271FEC5FCCABA64B94FD43DEB8EB7029 46CD32F8AB34101EAD01BF6101BEF6214AEDA62DCABF4DB035CCEB7871DB97294BBAFFB0A844 517AC957B8C16D3CA29DF0CFEBC00CC4152EB8D9340CE1766735BEACFB4758522534C17C8675 6ED5B08CFB47E21386FBD4636E9DF740BD1BF3ACD6E2DB336B58CC9BC00822EFE9503C9EF42F 3AE08DAA202110F1225AE90C90720D33BF245AE3640721E871AD06C73239A4635C9963878D6E 54A3BBFB0A421966174955255C793F44D438500B77A65F78848A986688C6D473C4D334C57E2B 668DC3925711A7AF618539C3FED37CADD8C027C2D3238EB02937B1FCF2BCAA9B6D97B8A14E11 5A7999ED3C6B00F21AA70BDD64CCD26E0E1F77713D454BE0B4D32E94FF1B944651AAB020B9DF FAF3C74B5313F765F76A61F9B3A862147B43915D7CBF5E369609D38228933DD3B8DC226D94FE 77600B5DE75373FB590DDBF51AA20627316104F447CC98F7319E1555AA7466F4588A22F6C105 09FFEA213B9466F1C187D8245549796CA3F29842C563A9BFFCEE0223D905A9B44DCD7AA79C84 7EF135FEBA8CB75D76FA77287229A8F9922F66930B7B90D5454E39AE34A9BB2CE49F42EDFFF1 7577837D54AB638BB96D7DFE3C8C019DC4C74C233E90CC31F919F94DD8F3A25EAAFB78DC11AF 0A3C736752A3D63C7D2B9CBBF65133DA80292A3429F5DC57A59CEC82F52E09627AE9229FB016 F520958CE2AC8BAED559CA2CAA91E0ECD6C4857067117F38B8E75640EB9C0A30BBC7CFD0C481 43D4712F64D666A46DD7B91F65DC2161927B10A55A14F26FD70486DD6E3F205029F82C315819 9D7988B27F2DDFF40E4FA8F10DDE45A200DFE5A311B54B29B865241ADE1DFEBD4E363CF62827 F43E84499ECDF366FDE52882CD14C5B01A14A30BA73BA485A07290366936243B08BD49A64B0B 690589B9A95D77C8C92634F6C6E322DCC813EE7B267FADEE0FB8E6F17B2654C05C7FCAF8D20F 1F1115CDA8D58886EEB87F7DF24A462A18793836407029CE4EB18CF0546640690CF53C505B74 5CD3D13CD659C7D34EC670AF42DF5EB046E91FAEAC43D80C0A554A77E604AAB292FB5DD44ED7 A508EEE345B6EB0C4C748F349408356506FDCBD92A05955BD13B4BB3C9CD63B8CED6E3A97D18 C561800E8CB7AC79D985F8FB541606CCC0EC7EFB214446DC2A1B13DF5E2A71A2DA3498ECDE42 B096BB173AF87BA1D85DA18BDF5659E1E0AA1394FAFB811044998D08C124953DA42767183E98 5A790FAD67755C37D19109E12E25A9471797AD692BD1F67A7D58804C6ABF078AA0DB6C7242A2 B592DD6322CEEB1D5BA0B5BA81F15ECF2F336D5103C13C38DCAABA93ADAC57168797C1FFBE1A 25407433132C65AEC16E360405BA60F7B94A384D41887893965415C01BE8736236E53515E360 7AD1BC4407E3509A46A80D8B5BC0A170093BAB72AFCB5BB428DDF3DC715B42191C23438F27EB 99EDEDDCE572CCBB03096B6A73EF7461EC4BAC589FE3ECE41FA5A25F5B62E1B256F8F1F66F2F 3B8B03DD9F7FFD8F69FBEC2CE61AE480C086A1C89FD911CBD59FAC38612C34B5F904287ED1AC 2692494D3ECBC2D38138534CFEEE973ABFBEEDED4B373DE559993B61E1DDB3865A8B8320FCD0 1BD4F093A546A081840415D97DC3153FFB8442439DC2177A4491AEE75FE4C8979568D6999F76 07FA83B440DD14A28C927DF8FE9652E29D50656748E5BF873955BD4C3FE5EA5EA59C16975175 FA171AB0E826864108056D2DC4D4A25784EF107932EADE54D7CE756FD7EBDC36CB6D9580ED93 AE4850C4BEE96C91000230543BC195C0A0C931FE218660504595C6BF420267C33374316B048B 567AAFC593E5416B264B4AE0BEE8EA2C259FBD15084DADEA19BFCB3DDA7B32C370D3D0D8C3B0 419F7118BB58985564E308489CE77B62157351AFC2F1850B3F35B7D9E5331065FDF40011C7A6 451E22F1654C2F57C0C10E759903C58695A9178550E58F5FF08A3FEC985ADB9E431EAB74E0B2 56A3A529E5A73362CA7092328792DFCCCFE1551960C970E7659E1389010762D210F3C8FD01D4 936FA0D6C8A66AE38073CA24C4EB2FC2A82BD9357F5A1F8376044FE0B8B5A21A96B3D5531112 66A50687AEC1E714754F59A760F3FE1B62EBB5569AF1DE16D03C2B61EDAB41E1CB8A91714B9C 7881174406AEDE18A6DAC6258977DC052A8EEACF48595984F50728F594C0D76CA905AA474F8B F99B1AE0C266DF28AEAD1E4FBF12C6067A61B8467A4D1BA4DBA7227259F508F40DA370C9885E 493A986BAD99E48BF285E32AE56F931014D6A20D9A871CE852BC0D07064C5010380D161BD4ED 6B0BF7E86317BE3BAAA4DDF35978C6F1127C3016661121A5D2A2CA4C24CFE31357A023EF74A5 3582A125FC8139CE21C05D2C36E7B756B84B1AD2A5336E6E8D4EE7CBDD81304E578F317FA3C5 E4388F707CD6C7E9BC9B29C96EA685045F9946EED502B1D7F5176E0D5DCCFC482BBD54DC1287 9886282EF434851D203108DDB22A6DF101F4B2AEA61791E48E6A6DC08A0741FAE0880D2EECD9 7BA314F4B88905837BCAFA5737ABE0A88AD421B35B459AFC312D3E56B7F913550F9509AC9C5D 61DAAD577A1CE05F3F02DB4E4A364C980008824CE1830889D58073760F8A8048E1E6E6A0B4CB 9C698E3D79467BAE79B50C990E9C97335E4FD4971E18164801F58968792B3C71D791882C9FD4 D7D754E38A4FA2E50E6492B5CA5486F3FDBD903753CF91F05DEF6DEA1C04BE4B215768880085 E75C585A1C2A60196F38B648C88610FCE33E14661CAE39C9643B661D4451D0CDBCD2EFB06A2F 686C7CFD7141F3D9C429BE334C674BF56C90CF2BA41F11E2E3B4729DCA3C65D5122B4964BA2A 3062A8B5E2761B7A5276FB68A6C935315E66BBE2E8764D40FF6495004DAD067F88F2A055C881 959A529324028D3EE04C0051149B4ECA1E662AF08B858911EBD914F01A639D5CEBA9FFD44B46 CD0AF38863434C82589A731C5463EC0701053E7AD30555C094D5AD2348DA187794BE3B997174 212A8A0BC4DF4620629C65C0F5AB2BF0E0139367041EBC7C1C8267CBCCFA38FB4BE996AC1387 46C2993974A93850CDCAB007EC57B0D304BC93878B73C1E8C82CE9B50105A0C806B9314E4F32 AB788467E214046F287C9AAF4D5FD6E11FEB9B026E988490B1F23C4ADA121126408D98EB1D2C 172A8B8A048EE44CE369ABC0B46EAD667B629819259F71EC5477D97640B67698D3A5CA082C6B 724199B15DB296C9547F521059ACDBD26D820BBA61FD98C4C17BB8AE01B9C6FD4D449AEAFE98 E3913985C4871931CB40DD0DBEEA735BA7D0D26FD3F3D367B9EC76F2A1BE26BD966100B7D0B9 C71FF8B1739A5516C5B024CF4468A3B3E1C1D8B79D21DC62C4C5FF9D9C0803E17A3488686BB5 F3C28FDDF03488E55EB4F38E43290BFA3D680D97679857098B6BC64B7D13171D322D7BDB6269 2410BE95A8DDC6859F7204661E3C18AE942E070DFB451F959A11C8FB1E3167A51DAB8DD59594 C082E12EA47640DE9544D0D800F3E6B10DF8DA0297D55FC3097D656513CC64BF6D253BA007ED 31029FB94D1176901DCDB4712260EEAEBFE1A88A529587915CA33BF421A4A457D0C76F54144A BB43604006C6F9AE6441421C24ABC8C8ADEC1D0CD3D7F0F5E1411C571E1ACE92BBCB81C4FBBA 6005B5CC233DCEA05C87B71E39FDA58B4B65AB64EFB664CA112F8F962A00563C239D4ADEE863 7388A536FBAB7E97B28AA9D8F39F8CE4FBB2F53F366FE06A55D56B5FDA4FE2D2F914B0706916 94104C17C83CEC1A6EBE300C29F6E1ECC5D2C96B5B28CD90A22F6FA06321B4230D24157E2AC1 8F4B76224D327D9C7EB2665EAACAEA190D4A609F2DD7FECE50AF6889BC6CB8531D3793B5C557 E16DA788AC0A635AE3C5215E18CDC93F4445BFA9B20B35DA11935C1A9BC933AC86FE0845D796 BDF226642E4027401DACCAD1282FF3348B373963C64E16A6B3758262F1441D8C082764C558A7 8C8E228C0475B5E4994932B8B99B9B3D58CD94BAB092C1A248A6A75FE59CC36766692EB44B9C 68EE9B5FDD950A31A190413386ED7493600CABF994F776E80F46A8A9D0A4B11EE30097B6D078 08ED444F011E04929E2D02C67EDDD0854C67500AD5267A21DFB699C756D02D8940EE4CA43E8C 4FE92F80E977D3082012F7E6CEA5E3B6A521DE5EDBCFA1C3EA9BA48D7ADA86234C9EACE24A9B F5BACBDEDFD07310F66DA61C67805AB8CD78BAFCBB363CF9AB6EDD41A54651D5C64D90C76D96 8E018C23A70B18319AE20D2F15FB3B5858F44C26D4328D9A740E5FC6148EC88EA367328CAE26 888C33B71F60C1CF13159F379746103B2DE7872B311CCFE836D62ACF721A93CB579EE0AF32D2 21475E4410724812A2B6A2036B0A7164483BD7E7E053B62BCF90A60E41BD90D18356F5158535 FE66A066294595FC730F7E0A6196020E30573339DA6055F1CE892F475609C46702A37B00788A 12461810DA3BC30175AE4FEF5BFA802D4061FE6AEB450F30CE7F1432D37B5625A8B36FF433CF E7D437213308CADCB30F2FAB9B19E48386AF023886F7AD5811446D0998C214E1D472E5A24995 A44730DAD9E53C1EDCBB94E41BFDA2707BE079606E4575DD3FC518884EFF4ECAF6CE4584DB47 FC550623DF231A59FFD4C34C8D8DDFBE12A76CF2CEE0CEEB4C9C4C63CC57C11EEDF36190C823 5762FBEDA0F118B5295F2D4EDBA33203FC5B9DFD93997AB708EE54FFA7B0F986C86A9E6AB595 9A37E947D265F54D23542793C5103109BA1643ED18E7298598E92817F9446552220044AF2016 7BF7DE7EC2F0E2D2B02A89C72BB56AB4EE51732AEB9571FD0B1B0EF390944C8ED8E2DA606095 0FAF4E36625EFB554BA74C9C19F5CBE7EBCE5108A6EFD7E1DF314D0C942282247D2CF946BD07 ADA48F46D353145CDEB0D67BFBE6C8C9A1549A36A170FB76AF9EADCA47EC4AADDDFC909718A0 7CED65F7F75330B72DDC428A0A0B4223E0A02846F003A836C2B948EFA140093CF234B4340D02 C056BD737E9548FB515F09BA535B17E70B3295B0901ABAD43DB2D6329446F78688C8F2FF08ED BA5E0F4AAF406C0EFBE74E92A92891A68B6F1C779A72905087515BFFDF20C12EEE82310CECCC A5657AE878C8C6D2750CE891C8109348E183EFA6E4ED4D789511C2D610DDA2D1BB6259A8F968 AB4E32957BF0C8C40F4972ACAB3A2C4B31190D4E12FE71376C185C304CB3E02D98384A9832D3 97265BAD975C8AB1AE9B0A72ECB16511080E75B6CBDA1D2BBDA0F6067B71B9664CE5CA139D08 AD6D1C51999A4D93B07AB2169BC26C9BE91AFC234D465E0F6FA6EF752B6D5AB0248A2F29AE1F 9818FD120D1EA6BC0E5F2EE2A86634F6E3AE4CA77867AA8A993848EEB4D04ECA6618D448749F FD6DFC4386139E7296E0DADF900F3C0982FC120E4F9A16694038F8CF9A32CF2C8E6775CBAAC7 988014B0155487533F6584E4E0812C6A6C80C12B79719367E94C373F3DEF751DD9B5BBB5F4AD 57E461BBB886AEF7B29F64AAA45BDD2C9D397C7B248ED25A438D35B26665DD65C13B577BDF1A 0B1DFF5FC75C78E63C81411EAB8ED844B985238E5801BA0F1F71E71A0484F7CAC290475BDCA2 67A3F0C5A0D0FD0FE9BB9613E7F144EA533323FFCCAC1B6F6D329EA6AF80BAB5C7305F38883A F91AB691F44745297A0FFF84EB89DFB6E38155DB0F387AD2DCF3BD687C49C1E141B14D722341 9408A1CC06326729AB4DC169A18B8123F6B2BBC61973E7870D04AC8D2F3618C42CA6F784DD2B 0AEEFC358A13CE06F76374AD6D8FEA8D3235E76A6907702B27BA01E0169B8A4C2E89CBB0AC89 CECDFD222C129F8F516DBCFC709603DC7E13BBF27BD3FBB37A8C97863973CC4D3C0C011330F3 72799AC5C93020D180F6747CC574A5FE86BF5BB51D02DEABB44B19CEEE15C1BB8B0DC2AFB462 59588ACBD9BA39BB95F656BC0F64FC8CBD8A40DE136838F47A1D4E9399605A4A9FF83630E3D7 E38A1A2CEC50E6C4BF13D174ABC24F7B03A803CF541DEAEDD14C1B48F0A2320848BF6D7FDEC1 5BF4777225D185A7CF21F4EB37B4FD93D578C92D8EB503506A469DB3BC379FDF483C43107C1A 42DC4C1A9AC030F3CC13053FBAE9AB6BD5457B0F73873D93F90288AD2AC9C64D707D040684D2 B904D22D2B89F3D82D511B177C59421DC94BEB8B6BAA644E5F20F6F38E33A891B936EF46B0DC 4C76D2C4E5224CB568203CA3449A8D9B968C5C9DE858BE78C7D357BD182BA5AAD928FA4333C8 AB8BFD8814DC1293268627AC5D42F089672DFAAF36F6C4AFE015A687613241D23D410A3487A8 0250871FB9F43D8A7F96FAC828600609428FABC70FC2A3E5EA352CE9F8EA273F2898773D428C 816866DFD83203E4A14A782FEC63E2B5C5310312ED638DD4E05F74593CEB7028677B836AD544 6D7C190FA0B542BBFC969CC9D2E52CE4A88DCCCB483967623BF15838CC2B7216A933EF65A1C2 4E407CBA5D4895F6589249EBA3391336464578D0A2A3534C07DF768D3DAAECB633712C03EEDB 9330C7547BC50D6B0E5151DF1138716A01F98D55529B9DB04729A12227F91FE78F5993E3777F DA24CA9C76252D4FA14F76861D598EACB4BC41F818E02CFA89EC4C7BA5D412A8A72EA8EF5D87 CBDBC9FF552A9656BE45137D295863A9E79818100426794057F0E7442244BE6F058478D3D4D9 E6FA081A373A85B243F9C4521F8EA61E7FE1B66FFC7A4E2143C8EC1DEE04B4EF29B50D74751C C683803ADB9E3530B8AFF1C29DEB4954B779CD06FD79A3C557623B2BDD0A9D575CC10A6E798C 380634AFE8CB2DC55D513EE0E72B9628D65EF168CB9770FD7CBA30F1FD492AE363EEBD75DB59 CDA2AC93E5E15CDB9C4CD27D6E90D7B08DE7FA6D5D0E69E7BED01E4C07E531E4F46FF8793984 FB359E22F086B76413EE7A86DF5D8DAE2145D5083F040FC3CB4F27B3F879C27207F809A07067 81BF4386294A3CA0139AFED4CCFF8B1544CED0DB2EDA7ACA38A8066F12547346B7F308993254 95B898D26477F48E3C864C4B0DB9D37A751C0E30484987F1A06B601F5F7AEF6FD8665D4241EA 49D4080356BB144FB246E1766A571E3030547FEE174A176F48086BDBD0486A9A8FA93B5AED45 8F826A82D597C9389F4BAC0CDA2067DAB5980F3F1B9733D61B9B473F8A1333057424D7A2191C 93BB09F2D4307E1AF64355FD494C6E2A8FAAB0C19F896842BB4DEC3C6AE75C706656E46BF188 562B81F912C3D772313758C9D944ABDC897F1EF3DADA012AE42EB4CCFD68FD09B7BE8B243C53 C806E9949D375F0D6DA38E3025CEE802E8994DFA5090126B0D46B0B2981089988F14EF4EB023 B9AA60ABCC93482CD161C867832BF097FFB091F1F6920FAF1AEFF3B2DC0D7E7FD524867D3A41 544C0B3AC72A08DECC4B75507A59AEF2D52976E5859FC554D23647CF993099BB5868FBBA98E6 872479FB9C689C3FDF10E82858E5A849DFC6ADBA48636E723C6CA9FEF184CB4775C0B157447B 953920A6FA8C82A7C41550241807F249D32A5EAE1BC817EC2E0DF6400A32F923515C0A2212C7 837127B5070D89138D6A91BBA817C3B46A2E25871C003243941395906015C86C3FE4DCCC9F2F 0062959529A93DCDC2B65C3BA5014CB82B1C97255E3E097B15CF659A7B758DE51ED8CF40FFA3 4170FCF38FF9C29EC5FD23136C2C28889203EC50B44DDD0EE3A14511EAE60D989AD6B5DC1631 C7C6F2AEEC5D73D91531AB1C9862E9EC516AEF7CD5168F9105DCA310387808CCFFE62133F18F 0E57572F10D0816415963CFF836F870824BEA6F03D51D89CF1CED3F5EBA30A656D5416F3C5FF 20AB32419E92510EFC99BB15B55F2B57E60812B1F57475E531EE127E5636023E56D05E3FE42E 8529AA70F6C98E9790C61E2270A02FA7F8387EE165708929C169B095FA7AC93E6EC0BFB068B1 9F35B0E64A4D3AC4D2342D2195F7DE63645CBE042CEE1A3364CE46D9818DDF60594587859025 752D0704D1553D8830ACA99B4D15B531A779D3F837F18E65BDCC690C1201BA4B9C1E2C74C3F1 03FD142B5EB579AB43DB054D769B8C78E01F21A5FA9AC069EEF09344D28DA25E957F4C133106 52CD61346FBD144FF1A2C40605472CD2E26E2CFDFDDB7F6C7E4970947FA139CF205121767D82 EA93A7DEB7315E32C0B7EB9D8C27BBF85C8D17C5696217577DAA43469C576C174B6F5E96560D 3316A7DADA06361D89E37F17C844D2C0014D1A6A1D0579899D73435412284C43AE5D8FAD74BB A1F9B3279A9CBF808D1691F15B40BE53B1C239241125647A47F7514E096A20C22D682843F253 E2886B16F88CF3712BEC2A9BEEC27FB1F3E3D585F760D1B54450682E188B4DA09E2A99729CF4 0D3C92B6FB8E7332FEF71B8EEE05C8A7B4CF5D9F22633B279F817C5703DD80A87DA27892433B 1765EEDACA0A60DFDABBC3D1512AA5758B65D48EC1A5F608F8C72D494B3258404E014ECF82EF 53599617D4AB8971A8A516E6085B7CEC72D1BF229098E8CF7662321712316E3476DDEDD2F39C 731164A18308FF1B6B44E07DB527868C87951AFCF9F94C45CEA75638A9785DF50F2CE97FAB9A EDFA101B35841BE71FCCA0AF7A67987891E93AAB94F2D7A87E0A28AA2A7869443BAE7F000BAB A59EE2993CECCEF3FFFC9AA3C79A575007F8A9662DDA62395073CE9057F96A38A10809C701F6 44ED64649ECC4E1A5637514FA7BF1AC97BBFDECBECD0C14F48A70F0A42C93868923C94EEF4A2 8B0D407F984AEC9754FA24D95108B894FBFA27D2A8FD9F17FB277D42F6D72D796AEC14AB605D 288D586CC4100998D55430C562763ED5F600C7D27E6CC350BFD876DEDDD116381C5DBB150C61 26A3DBBFD9B1575DD8E39A72CF25310EDD5E5FC69D49D65806132289683542BEE984C62671B0 A5A6A094E4FE098AA2D536B92F8D37522B1C774386EE2485D9BDC99118F8792289C057D5F492 E910562BAB89ABA0733A021692912B4590F4C5698F9450EEC0E8EC459206669D15395A3F4865 71DF5B87B3C37B6B889BA72226A140741D1C4ED3297D22A61F7D67A56A5456541976170EFE21 10BACC984F96A566FA4FE7159D3C84787E75631A95663399EBC7313875E2975C3A2D2FE34A90 BDAF8E71FF24D6C8BEB6F4A3F4611E842CE7ECB7186444930008B0039B22135B6CC2FAAADAF8 A7345EC0C958E8597DE6F61C2B8C7D61D5F624F43257F22C07C27AD0F112E768F6B0E43F6E68 8FAE31066CF621CE0C6777992F89610EC7A99874286B72D8DE8DC9975B726253ED4D568FFE0F 9CB7580F791696DE3DD74B6FFAC2630D65E2568FBD90B16E8821A4E7FE4535F730FBECEDFF42 FFAD214FF3574D7BF3744232049F1AC700A9C173633DD25E3BD68142D5032A87B91A0085D8FC 9019F36775023D6AE0A93146C98FD1D089117F55B1DA159F347C769B75497185920A1015E27F F68DEF958031CC87D9B26901DEEFD57C6619BA2573DE14756FA7F433155B74D465D6329F7FAB 19DC196F267FE5968DFC7DFA4013C13E7EB9818156C7F5259341393B17B612046F15FB5E7760 3019EC8B18BA221A9F5A0C56D06BE59EE83B7D71AC2A562637978E71328F75E4B7E402972F22 25FAD56C70893E1767C7C2D32F41DBC5A1FD78A22DE5AE5911D8424650CE1F6DBF57C527E316 B4A6E4966C554CE7D5D0C39C6FC410BCDEF03816FE133B3D857F5D1CFBF60B93A9800D1E9D9D 84492E46C9ABB77EB45F75EDE35226D2A0152111AED68080211ACC6167FF090CA5AF3DA89BC9 083783C4F5D2C1057C3026EF80ABEA3440660ED5761B3C02C75A793A17456699B076F79FD535 AE4497273169EBAA171E4D5F8163DF9DD0F2F02E5F41555F65B93909800CAFF21DA21719FF17 D847053DC1681CEFF18C97FF5C21BFCE4A47A342359989A0BB3B6D15D3D361BC2D014A5F22D6 8270C910C26AE182C03934C0F9817FA72E73FC1ABA46C1B7F4EE489532F64CFE3580BEB03986 A0DEF7E5A84093E40CE1829836F660F399B65F5D95EB491950487C45469468762B924406C11D B6145CD8E03F0B393BC5D5E65FE532ECB8DAE83A2B7C29E892C5CC0B9E8C05DA2D2D542C1C06 D81523552F80C734CEE32F2336D2BEA9BB8F7BB50106E698F658F274159CD6D1E1897951EF92 07D06BA88A9DFF8D75FB9CFE21D7E10B91904AB1826FE106A5C2467592E04D44E8C9BA6F371C 95220776C25B5D4F6C8D53CE86DAC5E328B8147DC9D0CD2C6F669BD02DDFBEA1872F50CF4313 F90361004E5B5247ABCF8A19E3ED1AFB6A423635B07D5899639798FF1220589B97C0C98DFBD2 BC3A74D1D7DFE406B012912A4E034B985D91C25EA109058970B9D683102802B8A7A90EF9C47D 289EC797477ED3B11EA5848599FBD2214F1AACB53173AC05235532F9C820F77CF09D9A9F454B CF069485989A4B61F8D8B745E1A65E4D409B815F559EF3F1ED86DD60581B3E681FA9BB411FD9 8594256FEC495BCE6636F30C3209FA755C8D496050DC250783953A6EE1122B3686293C816F6B F8FEC38471D34102FD83F414A4F3047008AD464D9455E4ADE59E1B8FF534AAFF2008CC26B917 EF6A21D6A7E57E3E2BC05202F2E799EAA22F3A3284727C96BA7A7A13135821B3F2AF38E679D7 00E2402F046E2374EDFCD10A181BDECB358258512B2D844235276514CA3B41A2CA8B5B6FF922 C72ADFD54B6791C760CFB17D7924F5AAF3021029B5B69FC4971BD38ACC4F4910027D0E1C73A9 FD37868CC902F76C9C3034F95BF4E6E4EE37B0EB055C31197D2BFE4CA9CB270154E741A99DBD 70DB9F0BC689670BB86E24B4B03AD4CE0A038A0A74D26EBBF382EA400A0869822266299C7019 99F598CB2A3B12DC5382EE0012A71C65AFAFA6091F513E993354270F976B177D3FB909F40451 ABB056394E6C5D86F4EFE5E287D644305BD6D7BD09218E0680E7E39A82763E3E921B0CD98F0C 84A2C9B97CA8F95BF7611C57A1705DA10656455054B2F327DDA00B8C169CA18B8AA186C16584 F4BBA7678B75F84750FAEF82C18134C41EA756F9A6544C665DDBF78A27DA53E2AB0873AB6BAF A7AB5005FB854E437DE910D9C7ECF75687F5B0963795A1AB33D08D06F7BD458F161080E4606A 4FF61EF3960DFBA592794995067C2DF847C2C7F3A05679A5FD277113A9604CF0B9FB8B16194E 81F0453CF46E5B73795A274AD1D034BFF9F135D5BCEFBC6A7C815AABA7609249CFFC20CF9EF8 AD053452CFBD09FA1B9A3550B7B57E895065977D601466AA53DC3B7F0C0E17F90201BD165264 0256C9CF553EA2434ABC48FA559F8C75B2A70D431CD5EABD2CB0F039A6F93E706661F90DA8A4 EA016C7924AE8A7309170FE224E62421B9C071292ABF03623C4FD069A3BBE4BCF410D37651B7 CE24B15D9FF3D47349D0EF513214AA1EE12AFC519F597EF9F9966915DAA67532982121CB7272 8A4780800CE354227E0BED41F0041C554334A8F56C73A8FC7DA68605060941C21F8CBCA3733A 009C29FA06DBE33A7D682F8FAB0D828DF8C8E50B4F44B24DBE9D6A183F14487B811043F3158E EED13F96BE3B391F12AD559AA406465BBDC396FF65DB5F0B712BC056FC6BA610B7EC20B4695E 35A0FD161A185C8CF4AD7BCCF092958C50A7A35FB4BAB55DDE0A44AEEA0CDDAFBAC97DD3FF0F 27EBF164B46693B52D9373DA7FDA7C9A6743457750C8416FD86CEECB2817A4E845BC1A3501AB D005DFD1C0D13E8FAB534D386A451F939DB7D328EB73556BA3EFF489C4B623F9EB96F536A05E 89C1DF0556701BC94D12508DFCF9320D003394D6722C6687EEDECE18674B8186726068A18E21 F219E92B66386E2FE17BF1DF96CC8D709074C6E9C67437C183FB60FA998492CB30FE2C346AB2 FCAA57537D71EC0F129A2E7A27E27A17156E7F651F05EE2F5394F0C0824A48C2DDDC6E399A2E 4731675BF484DE94BCA12E9E782D1FE08CE3A0F261508495624B1A5AFF228A14CAE6B12BA054 FF204A121E2A9A635032B2FAF4912BBE89D74F570535C2F942FE35F2DC5DB22C37C22D176E5B 6ECFEC06F6E4A8D332F96389E7CCFBC3B530F327A05B734B68603C928AB8C5CA8C0F41705B9D D5C386C28506D62144466D0F57AF71C8CAFF7A2B8C29345ED04B50471A0AB11431622AD4A351 9ABF3F46650026AD7278F6CD2B4DB14255CB63E88677F95787E5066F379E20A1BE68F9965E32 B2762F11E728DA13B7180648B3F2662F9BDCC47BEE2705C88486A0729EA1ED80E3E50020AA03 ED6EE50B1829ED407116A9F4F1F0ECCD6A0561B445DCD20625DC70D12D2EC6838BCE586B89E5 D6C8B6BCB1D643A03B8086FFC508BE225CE663104EA4C64D8E387DA6B710FD26C3D28406493B F5BC88ADD3891C0401BD11D733E9262C6E2960D010D83A808CA863369F6CF63C6B329BF6CE56 68436C68B514546FB4370BF2F3D6C78E777704EDF146E3998212C9FD0E3B8C097171836335CB 4AECB7BADB58C6B7AB573D25F10435BA418565D858E9ED6C5F9AEC22AE174103A12763D37831 ADC025BC4C7B9C74B95C9043F5A33A1934494F6FBEE55BB6567465B7EB03A3F6C96BB51C9D4E 4A190010545CABCD7A0154D74A58F81DBD7FAEAC8C5C19D0649A8C0D3EBCCF4BAE6A905B118B E8438D25459DD1114E7FC7CDA2944011F120891BFD91C72F926F777E61AF6131250073BBCEB8 0E1CEEE841D737F41A5A56602509D6340EE29F66EE9B49EB4B7876E78BB90C15F276D461DE0E F85D43F41A31CB00D11E7EF0C0EF3EBC9F954118A9273E5D6206F4F235DF34C776A9E144D622 AC126AACBC6FA33839CA7915AB766537E594F0CB38B9DB38AFD6F2B2CA28AF905354BD55C924 D824D364962C95F349CB69E71DAD9E2452EB5F9C483140A4ED20F5DDCD90AF10962013DC5539 97654EAAA84002D658AB0A067E24FF144468677917646CBD009FD3CA64349AF4B65C5CF954D1 D87E3B5F91135BF33039E0AEA5D3A864AACFA6225AA63B6C90D877472AC2EE2297DE0FF6DCDF 27F6334B70186C784FB5D125160382B33F901B29C50FCE709E8014E17CAEDAE6B3B59672B226 3E029ED633F3DEA78B04788A080F0AC59BD41B688103B0637121479F35F5FF3BDCCBE6EB0089 C844EC46F7E412DC5716FA486C66BBD81C1F1A0C62C416DD79B0A434A3EC3FD408285D7E5251 0810ED8516015F3BEA1BF4398704BC4B7C19528F3BC5C2D250296FCD64A25653EB7BD6A1B6A3 3C15DF095FC28E976A868D919FC075A09FE735082D3973DA3E9FDAD5B7C9F88FAD029516E9D3 175ABA0C6103135ACD7A95DFA54FF50DE8E7EDFBCBCF274CC887FECAE373392394374E38A02C 2087ADB3DC2A6936A9A69B20F1CF1B385A0F353127388998420BF6816A6F90AB72860387AE27 F421E318B66E53834997F641BD0C87527B6597A3CCD0DBED7EC410D3758F34344B3BB2E430BE F30D0E9D616D79311844E5648FF4D6F652390C43AACF72C2AF0AC20E399CF949F7CEA427F472 C540DD63197BC73B1543EEE6C2D019198981A11486E9C206F77CEBFB00D9883CBE928A11A875 CC774F60C42E32FBEA05FC01B82E61A0CC176CFC5B4582A6ED822F85FE89CAC9B53F8A824B3A 554772DF6A196CA9FFECBD5AD70A2E10D6DFAFA9472E57F9B18A88086F1C075D3B5706C6811F 95DF1DCA0A5D90D1E765BB9BE3A563A1FB2F1D2027407A3E46E89B0DA342BBBF155FC625DD56 1B0E9771D1B988279702FA3F3B1C2B5D4D540668092BFE4525F70010F287D0A8F9278A6DD65F F4F88D1EC7EBE15632011219B3E1EECA7D99EF0FF7F7ED4CC800A98AC7D3CD557050310B133E DAFFDE3655EA23070C2207606328BD25B9F784A4134707D43C47F9926090CBB8B9A96D536132 922DF0706D59AF4E77194CBDDB5E0E2CB2555FA03ECE2314F728A46B620DDB770F83E30546A2 BCABE19B4734F5DF4B16C8954044942C5CFB0E8DE9FD8279313DF79557DC408301346468143C 087E0DD4351DF91107FA8EAAFE663794D240B2D697C269CA605BAF93C5552C7655FE5F486FE3 2A205344681E647E8A541347D9721589F1F12ED67C2F232D2DC499834BD0494E1B62F9E2EA03 0937DFB1D09335350489ED372F175C1C1B69626AD22927C97D78EBD226CE8BE7BB14827CA37E 2A541BA32853AC8C8B6B180D378E26ED0AD5AFD3A5BBF7C42A2E0F97721323AA9802579C2518 E2B16819C8E9590D409EFA0CE9B33275EA7A824B3188CBFFA5933864FB27251920AE23D3A0B7 3D714DFD155950FD0C9EEA61EE7FEB2487751C6B81E4246BB9DD9F5C899AEC89B8B7324AF033 5DA4051E6093F410287C86E6324769172E3FB9FFF636D88BECF6D5CC3740860648CA09A18955 9E09F58DF9A342728AF1C72605B8EF3387426D7EE769D9EDB3D6039F788DADA196D957AA9BA9 46D346ABB053BC19ED5B76C3FEB8774342FA25C8549E64130398A70C157A97CCAD075CEAB373 6FD153F91B2AA4E24E182A837EB20F04F2AED3EDD067053D3ED33C82B02BFD716F7288D94CC1 641F75EBD5F08DCFF9D02FE25AD2B9325DC58A6C1D923F89191090C3471345F4C5CD4DAD9754 31EE711072F4A1F7C6350CCBD5F03C721EB47A485C6896C1220274A43B8CFE3C9AA7B8F2BEC0 1546F3F2846A8288C5B9E50389AE8DEE23ED88904F62BB67E8914860D12D3FD41A4AD45E3D0C 540AA0AE54D46DF4699B5E6E8467AF52E54A9AC3F1BD6639B3386C263F7BA81E85ABC23DD9B6 423D256568889CE2D34CA2AA9AD01508BF331D51A4EB4BA5E5BFB8A855CA07C70E21AF03C0F7 F21977B2B12C1034F5E38C633A6FD9781FE78B45859249E317C9B01B57C1A0D43C8BEA8FC402 D81971571174180ADBC537D3BBF83439B63C5379D37016EF7BAF2CF76B6C22C8D1F9194BE219 05B8A58EBAFEDAB8CD8D364CA50FDBCB17EE37B31EB1FF79EB02E771EB5303F43EBFBE6185FF B2BB69D373E7B00707F300FAC0FDF038986BB1F84953D266A4246C70F3C3D2CF417524036F83 A478F094008B71845D0D6AA9D301C9E8A9DE3ED1953795815AD6DEA3A1F6F0B78C6090E12E9B 26B826BD1D11B28861FDD8FDC956909D92679EB30357457F6584EB43367248CE612C52CB3CB9 009ACFFDD3D80BEF5E8FB6AE06A6862CA0D88141A1BD8A294F3AB4CC42C0AFE841382AD3C54D 1199B0D1CE8ABBFA12FAFBC43C144B8E722A77D3F0F6968F8EB668FE77D0B8325959AEA61D14 DE1058E698AD1DAD97A44C8D0CBF126CC7B954D3404952F674D7518EB50FB4ABB55E6757BDA9 58CDF80A31625299434828D066D4ED1811DEA731D0AE406B3648C4474230EBDE94B1F794485B E39A8F64B5D71984546321E92F0007BC6BF8364E781904D20E2FB6C5C236D6DBD01C7F94B998 CCD1626A73307E14E517FD99FC56BC3048DC36EF87C3D4015EDBBD1D7EC706724D083B1BD434 8F840654CBB1DD8714E0FA233E078812B703AE33B939BB44BDE971897B9E36AAA68430F3BCF7 A2DAEBA1D114C8ECA415C60DF5AC1B6BD8CB2AA17FCFB7785282A92DCDF7CC0D7D764560D754 3D92558ACB9386A0176ECDB015A9B71F5FD94BFCCF74C1EF15AFD88A494817043398BA4ED5E4 703A40378D930AB8E3A2BBD906E4CFC0837DC09066DDB010F0BE8A2241D24D6AD6C57F5049FB F105F863CAC4D9433796763FC723388A16196B35D670ECE78080F05AF280EA1E8EBB35328417 7460DA2165C4B8F0BCF5CA8981B1A3A53E0E506D7CBCD0C55BA8304EC97A751418FC2648B8BF C9355CFC69740330FA8B7F2E4B59232A725F8CEC8486911F73992DB5CBBE90621810A8F70E2D 19A82E13C75A932D2407F6FDEAA1207EE86C8E7C565477D3AE9108C3D31B2C878A02E3BA97AA 36068CB00ECB143EF35BC60BE1F8F63D59392E3DFCC93C7266DA55C1020302D92BA99E2F70F1 87C02C6E3B6A43EEDE4EA8D28919440E30DE85C99894B15A848C3C83687DA1F5117034AE7608 10D64A3D6EE5A354DE7717B8E12A327CEDFB890F9B2B59F16BE669F47A5B8855B5560DB8F1CE 209A2E11B44019D1FC0ABAD520B251CD3670E3AFFE6AD651B472B78BDAE8A4CA3B947CBFBC58 53A02BBB4CD71306EAF612613BA148F1C2C447CBAFFF3F8D3C8583A8065F754909A9629FED32 DF6F4FAF7BF97BFB3FDAAD9B8CE17A29586FEF23DD003EA24A876E40536EBA8961709E6F7745 DFE1C6FAF77C953BBBA900FB6A7096E63B6A42BF0BE92604ABCBCF6679B52BD5697907D7BCC6 16A9C5376B8A957EEB2E5ABC5B52C33AA29660E422D1C4F8E99093510466D2B0C438C661F92D C0A13DE2F06BFEA9E1FB8D7C80503A5D3AAF6A6A54893F86F72AD35666D71CC19CD875F25BAE 6ED0D07A610BCB43B2DAFA5080FF71C7F193E7DB973B72E0EA448E323662EECE94782E6F0C33 CD1633D067ABE5D5FDC960A69881FDB4760064D717B18D5EC445F3EAB4CF0819C6FCEE832F34 50A5B2DD9088174809E03482FBEAC2D24527BD7105DFFC23E481480110CCD0B0722CBE28D8E7 E829D2AE0F9777978E0AABB84551B3B2B89FC664C8D364D36050D4F071F17380B7716DFED5F4 F1F743D58F8FC9B68CCE0129EA274E7243FA340E7BC8A43A91F8E8D747D999F354488D38C2CD 66756E59BB7119FBBE4A9405BD0DA806F5B6605111E0B1F7BB68142AFD8BED8A25B3EDE6A8F8 1C87FEF5B679DE1BADDEE192B8459590A951F9EAA430A09A61DB63168CD49CE39DD10F2741DD C1EC37965F875CE188403F1BE857DD4DFE3E5ABF1842CF7107C2520AE3D13B554B0CC43B9DC7 66BA86354543E950C2E2352DF8F6C3109663713AF17077414AA1F663B47B9157DA3D45B75DF6 47E5DB3706AA3153B38C5212CCD60DB799094598CE054E3C6282E7AB17AE8F41AD7DF1B9B3FE A0E6396F8FDECA564C71E16A9F292EBA016BA10A8D798378A8C1B48F16B6AFAC3F45CAAD8863 B3B3C6131237B8B1D72EB5A7DB1B6DC62F0DE4BEE473D99D7A4F6BFC8B0A6B736D71BA709BC2 5EF27A292AD8482F37241E2AA94AE9C2ED0418B3478B48F6FB8A2DEE1BBD8F4954B9F6A41CA8 EA0B977F85F8E772008C94F5116FFF65549BEF02C29DB95ED8F6E5BF51B0B2AD129DA3298D5B 9795B8D7F87031ABC255452911D5504741872FE90D5952CE7B55E6E947DA6719BC7DDB043525 4F88D71ED0AEAFC616CB60B16A19DB6B6C913865740E88C3ECBB1305EEF53388C217B0D0BC07 37CB5380F899C1F96984F7B4187CB7210F1B9C147711819E56E3C63147CF6C6C9D24C84B7AF1 85D0628D7B1F7478E6FDCA1000D56C1C26B21829700EF00E88CB78B9B34A6D7753296BAAF09E BD1022375092DD56B89E1A04FDCF3C717B769D28CAE2C843F431D3DE6D1516D15DF3275A3467 EA0B1472BB6301A497E232A21EBD89F76286A4EE33EA65434569E252E41F22EEA75656BA6228 7D797708B29F00FF7771DBA5D107748BA345D52166B90BA2C56EA208FE206B533443EF351606 2D29E7097570B519BA457E08AD0233525DF3C07385CF65CF30F79860C428B01273936C6971D4 07E9F1931BD7DB92B2F0524C766CE31F8E66480021248169DB4899CF8D5F8FF950CB22FEBB35 A1C8921D38AD8DABCE82C1BE321A96D82DC031011B61981D1AA717632577F78F8E384A83A7C0 496C4DCF664F5BA861293C96A4025028658C158408D151712EAF7301997EB9766A4D80DF94E9 86156B746421DC533FD02CCD847ACC7988DEC7A4B8325C70CD6F307E3D65D91CC2E178E09E82 358446BDA173A5842EAE26992A0702A72C2D492000DF760EF7C51D20F5BAAF191354880CCDC1 50B46CE7459CDA1143867D68283DA67870014611E826F405875FA54E8C2324D3663DFD0B130B 4594B8DE4566DAAA0FC8278B6E9F459A09FA3C581BA64ED9BC387DF5C2E4EE46E19E676417DB 8C507FF2882A194619FE4AC007F18B0AB8762BA551A2CCBA4B9C1346036585C9BC94E481E0DA C69595BC312155D1C12D9D0BA721E81967A347B47FA535496EFBD4ED7F0DEF7DF02001E0F4F7 288AC99502E9264DEFB25354B02D5BED39AD8A676DC1A3A33DB0D76ABA025005F0A24D664C93 7F30028063E412CCEDC2F9C6B7F93C55650CF2A44FF881CCA56CC6C33D63C4BB670EFC742DD3 93F0DFB80A940186C372344FB836D1993A96325274C0D208A1AB4D4F96F93427FD129F99D56D 5FD286D89D296D5AC50ED1F0D873B89FADADD8CF816F386BFE2EE5C993BE28EC1A15286F3258 FB51ED3E1CDA2405A237ACBCA50534951B2CA2C1202CC051B42AC9AB567106856FCBAF388932 EFDC135B30D63D75129035E70845CA8AF1D17CC180501F272C854A4B194A8853B9EBBE02C524 343932AC9AAF687FE332067B8DED6B0978CA3147F92F25C5196924E33593AA335C2067E9A2A4 9D95267F581F039707273E52AD38A94ABFBEC5BE616F35FFC895D5E5B82F89D2B0D8F341ED5D 87DCA9B80DA0DE2AF309A22EFDAB796D1EAEFA11E9E20CD88086DC5B050F85BD73001FD4AE19 B8DD81582B70AAED3EEF9AFB6906DBAE5E980159B5986A87CB2423566A0FF0671BB53A782B9A 5D3E0E06B022B37EB8EB9E02E1B212D652AC69D69A36B284EBB89B774CC7B72C6C12E92EFDC2 0577A558645E96EDF9CEEF8D9308203C4327B2242CBD06FE9B6B8F185735B34AAD8667E7099A 4F69168B5C5C5059E09CD885BAA985962FF9C1356D8AC82D8D49FD634B76387B6616E7F17B26 5A87922D9150F031B7662F8C0C2BC5BA6842CBA22BC3BB75315034E1803FEDEFF9551853A592 9EA23ED6C5B3BC7FD1DC3422A1F1BF2AEDDE174CA1EF8C071E98E142B25529727BEDAE0B45E6 20483CAE31065042E1A0FE9A632A15E2D29B147C45297ED4686686EC5B89640BBE5DA109D425 084649B932DBBDE8D5273752252B4020DC1CF42BF429EAF74F84F72F2B0ED96EF8EB66FB33A0 CF080DAC6620394FF85913CFE928F1FC38C2FAB058737C7B3A316272FDA68F6E14E666427240 282D396C3745CF935B6B501E362AEDADD850FFC257DCCD578AA97BFF0BD1F04528979135BBE9 A4A5541BF7610EC81F183632A26465F504D26062D648E11260CAFFE13785552375F10C51F48A 1CD1446B30D9AFD51B37575A9192D89EA8D63B09988008272343B64DB4E441098E252E4CC5DD 4DCB8FAE3ADD57D396065B8A7E110C711A8B5C00AE0F703BDBEDD6C62DE9527A3988B0A1515A 485BD564D4358EF5DABBE7CFBF44A1B1CE8BAAF408BCBAFDC489E0A6F8B5D98044B7CC08FD18 2E691B0D5B1BA14D973BE9B43B3D07424641B23EDCDF27D363C02E6EC643A97F180B7CA01A56 07A0C13C52BFBF5BE618F3E4D6398509449E117A41D81B78A0D150EE5B8FFD6AD5EF7399DDCB C18649CD067D1E0981683D4B7F5C5898427DBCF86E4BD380E51C87A827614E833D7EE5755EEB 7D93FC6EA43FBBACCD0CC769218AD199235A3CCCEE9F179F5B3D61FBF1EFFF2A30C29CD11B9C AF06EDB7FE306303FBDBD8D999310C3A4E6F9E19CC302E11EB6520B0D21515C0DE51EC2401C5 B96A149C33FE18ED39B73F89F11DC68B70F71F996B3C9083E0FFDA2F49FBBEA4B1F266037762 39C3579966914F73AB6B1A47B840E191B844647641CC11150B5DA0E136B07816268D5F973F7E C2879E47A6EDF375E8BE7C6B9930D689BEA0576854DD9FB386AC31DE68A0DF60AB84A36F4EE2 FDB90838CBF6A6EC30624ACE09F2086EE5FE2B286168E9AF8222D6F822DA309E6794C0ACE041 63F0D08AF85304B3A1F389995F96EBE4F66D0AFA3AC86791F0B21AC9C925371EF420B1A41A17 099D73F9F133C22D9A9E73DF77EDDB8CA245DBB658559576BE2E56C43DF8EBC6B8B0DF37B957 E93573F1C8B67897AE21386FC711515FCC3AE71B516B27DE14E7BAB110D467380E2E4821CA72 A580B447B5B8802F59DEC1F29BDD6703502698D2ADFC85A3FFF06BCC71B046EBEDC2E96264CA A14A96E8E33F44A55AB34928D43115374A2C3156E47B519E208AECE23F1F77B1756D1F97A056 803FFF745C098C421858B705DA9FA109C0BD741F205D067168EA60FBE59615D347F44A6DFC06 88EF2C01CA13A63AF6AB41EC5660EADE78CFFADD522C8AA4280CB01C7D4F48B9A56EEA8BFE24 D58409CA0699C047338D12E589EE11CB60633A4ACD076175DBF497B70167F7101C348C893D96 216077DF0F3BF4B971897C7AA68131AE5AD9934EB9BFFC19F4D59955F562E00BC3FAEF27EF39 79241274523CC58C42255A4E0330A68240C06A8E3563A75E668342C5547651B5CC5CDE13D796 46DAC9519943F498E75280931A98A511E1BBE8101A3115323CCB7DCA4AA4862A6828E8C85A1C B5A97202478751B4657AABE3E54838341FAC9D72255FCCE30C9562BE891BC0C61E9C40480008 312387D7CF1B91046805F0237FD6238B3BD13473E00B5EC03610EA784E83C3FDC83DEA63F210 DA959E902A26116451535ABC587DD89530F9B81F2645475993CF08C9FC54C43E46F9120C1FC6 6AA470849774D4C940DBE32E10788E918F1C368550ED885DCF7BC3F487ABC5D580E03F628B09 7AE77F763267C2C7BCFE477109AE255C55210834C225743DD3FD162542A6D00E61DFF3F426D2 1C1831FB2F6C4C3ADD9C3FDF4CEB081747A335DAD6D1B4E138DB4A866801F01189BEAF9455F5 A132289DF49985F94ECA83788A093817CA0AC17163B017EC2E4DB7BE6AD16C1639CCCC3AEF4C 2713174D8A22A1E5C75B51A313AF537602D68E78EEAB6C4F49D65D4F8BB84F2901F05B4B909D 1937996862D51A59CD70DC8F9C9AEF63F7C735E171F62E23ED2276795AA5CF590C88B52D18EE 1498650D1084E7CE98F960E8B307AA4E517364A335E3F2FB4CB36A5C4DB9692F666E3E2353B0 9EB28244DDE89D12BBC7ADB14A35461B9E2602D28CD71EBB51DB8CF62A2E602324DF66BD9AC3 1BEF17E514D42680B6A0A5E3C4A189262CE6B1A4C416E2CD9D74031EF572AA1EAD56528B0B13 F61DCA81FC4677DD7D4A225884D0985FBA673F8A14AC790BA441DBC47BCE0176F20E5A2C38E2 2A6616CA3C4DB30B8F3DB39AEA589AA6C71417E9D142960AC86CF444FC2C47C2F1F50171A3DA 319C4E4502D103BD3F64D2622CE68A35A1C9B88DA033E62D850B5BCD6C8C45B2BBB2D4CAC10E 69A98BF23E8A86D1C5F7E47E69581D480386272F8E9CA707EA267C873F0D4325A34D36DF0CB5 EF3A65E81783BB4A37DD259598A49385B9D0E5B054531ACD9087F1607704FA5C786246170433 98EB7C0CD2FCB15E05B7DBFCF44946CC691AD40F015E0D3E6C92F6177AC4A529D61CE41D18E5 2D8B018838CFBA0E69FEE6946D137922A6FD49397005F3BF6D2D14734C3FE61F7C66524D6157 00F1BC31FF1D8DC3D503EE0EA76D8A1BB6E53DF9D4086E350CC27E77176A786AB5199196742B EAFAA2A04202FCCE67FF3A2C48B5E20FD9F2029BD151AC8CA06E124CDE4D28E9BBBA966324CB 0DC4137026748DF3C9745240BB7095A29A5B10C98592D5C4371F2EDA764A69CD472E0A5D34A1 8291B712BBCB16DDEB1630CA0CACA11B98F1ECC735AD60FB9BC2CFA10C8110BBE241199C474F 9D5CF1F38A7A0DAEF8B844F9512F6BE839FCAAAC7212888E824EC2EA3C329B68A2B1C6AB6555 0DB4CDDCE14E13362696A1256FE48F9BC40CF9BE9E91EAB57BDD3AA59AD86967E13303291CF3 8B22B19BE19FC2C437221E1F9F19CF9841DE45467875D17113553EF01C0A51D228FFC46A4F46 CF738FEC24A84B66F690E15B1447DFAD501E12D5878CD4386C95DE5D0B642CC5C56F740E18CF 55DF6DFC8D617589E0C95E319A87A43B3356794F20D6E6FD356A2A9C4F717E8E4B5D5875C0E4 C50863310FD2A92F5E1B4A48B45CF60A849396C394808506CD0C4520B6A5A7B1DE4EF7CCFDD8 1D1FD1407D2510E748E73A4690BCE8E4C0FF494B5946A72E7BDCADB4552268C4D20616685F3B E26DF0399E4C95AF26EC652CB332937708556E1874D1D978C462BB1E4FD292A769D739BAFE73 05127F87714C3ACCC7A93E62F1878B8AEC789531F1509DE43A064428CCCE8F3E2CBC25039D7A 5BF029BFE133D21F7934928B34B4ED1D90BDBABA1737A209BE794176FFB1B0E9C4C799F7FEAF 402F33ACF0E39144C22E769FAF65FC1A4F7836C45EA2EB5578624726F1CE956BEEB85A59F0E7 704923631C142098B0317989EE4EDD1A748882326C55BF14BDC9410C2DF40EC71CB73830D623 11919DFC5223DF21496257ED1AAA500B96044A5FEB9314F0BB4724067163C484764CDDAF9001 9DC62801FA6FD2AAE9D8740B0B253C08B902084DB7ECF0EB633AA545A8B32A6FF3455782D0F6 2A4A24553D802D1ADDCAFF96A9B7946D3B0C3A6A9954BC305592FA1F7EC37CB6A887985DE0BE D457A7514A8F1DE907B9639E713E59497BB38BB99C937C625E45A8DCBC7CB072100F3862187D B78BA71CFB6AAFA7FDBF9542E48CB7788783BD6DBAA8DFCC95DF41C469E8157AB518CF22B3DF 3291ECF441DD25D299C035A4D86ACE81FDCD9AFB856185244308DC1B8CFD8A120AD589890916 0821F9C46FC0DEFC96FB43A7066A4A14C3D36DBBCB3D0932D07D43683DD027CD025BE8C1155E 2385CE1D79BDE99EDCF6B5D831ED90AB32C9BCFF7D5E1CFF3B7EE26A51FE0E6E3326A7DCDC30 67D00CED1E03C6AA81702F0E328F40D7CF0EA3B9AD901F86AFF7DD65D09D385969F706B04536 F2920ADC025B40F9D729567E8F4F0A2C1C5B81EFCDB0FBC5CCA62912C7E0E3965B2CD0398DD7 3FFF01B30C64D9380D9CF0BA110A1B052FA08802FF6D89CD8D17D32A3D9D344E6332C492CA78 962FF0B75252ED91227037C6470CF8603FACBC7E01D985055481AB7F62A32AEE65DD85445AF2 BB034EDE39A2B2E2749C7DF77E6E9BC754A1F1A0DFEC2AF62FEEFEDBB427805BC49DCE750422 070FEB9E072F8CECECB1B34FDE5745D7E42CF6B50F5CCDE3CF1E1C26BD73A4319BE467F56C82 4DAFB71AAEEC601A573674346B1FE3BF6132081EF14C34A95B03002218B5185BC492987F8842 35DA8F246FDB7EF6825B41173C9E323928CFCCFF458EFA16449D6DE9EE10343948C47D13D084 C53062B6E050BF65A10793743F0E31647B17BC12D78C8D93364343E461F356BE399CE1346653 09BE1BF04E7BFF1BACDCD7D4B3A3C888764D0FF0E37C6CCD2F97447D99C7FED10F2AF68857FC B24720F4E7DC2D5FC36B238B20373BC97371C123F3B557DE53D449EB95622FF172B32D49380B 5857E4882BAE76D03FE0CDB2CAE5CB3C01A4D17205185973966586CFD834F79C71AE8360552C 3B1F617D4937B4744AD8D47F0F851DB9AFAF16E775B6646BA883EF94785D75D50DD1C997018D D2944EBF0D9192B3314BD68CD3ED6C85C98D7925F340F1C788C7FBB5D3F5D93FE58F3E96C9DA 68F396971A4EBFC3B1C753AA872BE0FBD6EF8ED870DF6BE677FA7C578EB0E6CA6E35F5A81088 9D1B0DD523791B8D63041EA45A7799233E2B669877A8F511AD8C56287FC537B15ACBBA765EFE 4B9DF9C5CF0C9AEFB800B6125291998CC8B4711C403D0AF489F59F27D3146BFAE9361D8D3B8A F87069D7D0E9B63DE7358139BA85C35C1EDDC601EDFA953C831E3A21F6FB3503EE6C62D0D601 869E51C2799DFF239880A5928DC2CD149F0B796AF3F38452A7C98885368FEBA0A03BF019833B 556778CEAB9120984523A8925117C4B9A7A21A6141899FE4CA4AFDC5F191E93E2118E7DFFF3A BDB7EED7585F668BE8EA68620809489E35C75C9100C8691FD1CCB7F0CAB5B25C8359CA875596 8021A2F2B04ADEF447A667DD078A4C04B5D1AD705AA2C9CBE8F6A01A58C2434F38821B0F837C 33C63AC348E5481FDA5A256346A27E5F6803B54E41ED61212BB48DB2CE0DDA8E9488E9205861 FBB70372A5BFDFFDAC8296CF1739210CBD31246250734B13F5C7AAF5B8B3577541C1696C7B80 B28F312F6FF0E4658BEF18DE42CD0B7C17D8F487752C28E98CF54FA1B7160FACC98B7F39D54C C4D9101E8CFD1E13874630C7F6C7A327DD83A12AD9061C8F638D4324CE342E89DC08A3340CBB C214D6B48C71E1ADBE2E607EFF9EC9C69814FCBD47BD6744088F1C7B8056BC0F71DDA966562D 9C197491CE16B22C96997A6253F266AB613633DE80BE263E7D4995C7A0B415AD8B036758E523 5DC3B519AE1E75E783D20026E21245B7D3DE8AAB1A9D4B1FEA6A082494644057C97D0F31EFD6 5A64D16FF330BCF27866C98CFB00000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%EndFont %%BeginFont: Syntax-Bold %!PS-AdobeFont-1.0: Syntax-Bold 001.001 %%CreationDate: Tue Feb 13 19:51:34 1990 %%VMusage: 26366 33258 %% The digitally encoded machine readable software for producing the %% Typefaces licensed to you is copyrighted (c) 1989, 1990 Adobe Systems. All %% Rights Reserved. This software is the property of Adobe Systems %% Incorporated and its licensors, and may not be reproduced, used, %% displayed, modified, disclosed or transferred without the express written %% approval of Adobe. The digitally encoded machine readable outline data %% for producing the Typefaces licensed to you is copyrighted (c) 1981 %% Linotype AG and/or its subsidiaries. All Rights Reserved. This data is %% the property of Linotype AG and/or its subsidiaries and may not be %% reproduced, used, displayed, modified, disclosed or transferred without %% the express written approval of Linotype AG and/or its subsidiaries. %% Syntax is a registered trademark of Linotype AG and/or its subsidiaries. 11 dict begin /FontInfo 10 dict dup begin /version (001.001) readonly def /Notice (Copyright (c) 1989, 1990 Adobe Systems Incorporated. All Rights Reserved.Syntax is a registered trademark of Linotype AG and/or its subsidiaries.) readonly def /Copyright ( The digitally encoded machine readable software for producing the Typefaces licensed to you is copyrighted (c) 1989, 1990 Adobe Systems. All Rights Reserved. This software is the property of Adobe Systems Incorporated and its licensors, and may not be reproduced, used, displayed, modified, disclosed or transferred without the express written approval of Adobe. The digitally encoded machine readable outline data for producing the Typefaces licensed to you is copyrighted (c) 1981 Linotype AG and/or its subsidiaries. All Rights Reserved. This data is the property of Linotype AG and/or its subsidiaries and may not be reproduced, used, displayed, modified, disclosed or transferred without the express written approval of Linotype AG and/or its subsidiaries. ) readonly def /FullName (Syntax Bold) readonly def /FamilyName (Syntax) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /Syntax-Bold def /Encoding StandardEncoding def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /UniqueID 28002 def /FontBBox{-166 -242 1008 918}readonly def currentdict end currentfile eexec 59F63F2125B33CD026DD3D81743D42B1046F118C1E80803141CEF2C09E47CD73AAACF7532ACE B1DC04760EE682878BA081B1D45873150D6816144E9BA0C81350559FC4C4C38099804B8AD462 D7B30A3C128A36449A89A89674813E9E6689684DA60AAC58D1CF66EFD374E33F7D5857E19481 3CED917F272B313B47892B5DB5AB3A04CDD5330ED82F5CC90A3AF8F4A0430A8ACC492E24B281 50159C539C72B697832E7E577ACC7D3BB08A4E7569F8692FB077873CF5D3B23A3C0E988CB029 988671F6780EE8C82BEA324E8A5C4E4E2F58A3C25605288078BB6F301AA174613778C96F8560 D8484661D5CE26FF2B0115F2F28269C329EE02CCDE121071B758E93145DE18996D221DE77A26 E3536FB39564521726257056E14C444B2733E6C510B385681C0C63AD644B5C1E2181516944A3 67A938FE414F9B775A5FF0661E6A2C8974CEB1DC906B369AD3146122B19DD30CBB6B95A83DE7 E4494A500B7512A3CDA3091E676C8465C974919DDCAAE69D84C31970037D0E1C70F84F6B9736 C11EA6E4DEB1F7C05E7C3DD92F419E3630CF3B6AC5E867BF7108B31F259E64E9273855982A39 51333260AF19A8F655B10A284F16D9CA86FC2C817D81B729F86D794535491DACCF6D122A7442 C59A9A5BD15E49DA965A12A70F0E581674584B843924A6B959EF52E32AF8734D6BD24BB4DA19 7C14A816FCCE6A40D026655CB0A4094EC6179209B30F9B93E74F5E019AD044675D6D4020C812 27A58B3C6730CC8B70787FA2C153B5AB6D4B2CC27C9B71CF8B47AAA5B77C4211AB8E6A77EA07 9AD969C352BC4A6A43AD5C6696CE56D8727455C309C230597B0BDE7EE1379ECAE476E631CF4B 7929D1E42965B04F5F03822228DD52F4B7320C272C3914DAF7ABB5727BC8D30C41EB5C748283 1291A1A7351D228DB526AA4F26E083A8D56BBD86164DE8BF970B992E7F0710633B59C2C58276 2AC48AAFD068563CE8AA8B6A32F64E66E3203E4EE8D5C74DDAD8315ED4342394F7AC8B643A8B 44C1D184444D6DD3D6B45A7CC367B5BEA5D8B1E375452050DCC47FEF6C7CC198568E3E7E301C 6A7E891901937321C185C8164DD74305395D40321C0A470C355ED8A83D483F729C4CF46FD9F1 D415A7A55BDD2DA55E415A89DFE7B1D0F320A9CD0A8A8D37C9F887A00F5EEACDF7C936DF6722 6E73CA9D79D3952FD54E4F244FD86E4730B6DD4D894474E96780AE73AB3ED44881E89CDFC74F 3BB33267804C0E1E1399E39DEDAC4D34C41B30957FAC57DF24C0A3667B89F9EE021B222138B1 682A1DB12CB20F407AE1A2BEB14C0405192B20A1A1FEB21B2A38AAD8799964081F523A761BB2 A5DAB8D9B49A6AA263014EC36EF81338FE549D727DD72B7C724070B67D0204BC2477A68F3706 CAB9AC27436EB8DAEAF1F1907EC61DBB6105268FB5772934968B1E73B5FDA6E8556B602C1FBF A60ECD02D52F92007263B89145E770962688D68E847B9EFCE68AA0401374A6FFA70A3AC768B3 E6C4BD7F439982F3B8612D5CD69FAAB08B7A2A479B1654C56B6D9506B99967F6EFBA8F9951EB 5F7F61CC55FF96D7BAE5F784C772BA90B7B7BFFF0E79F934E396E53FED60C90211137AB2F9D8 77C881C1602896359CDBFDB6A2D7E34991B5DEEFFFF4DDBAAEBEF2E55A61A000FBA09AEE0A05 3B7EA190A6418AB57EBDE29A554F72B12C1BE8C38071815A5263FD00762E1EEF00F8486C1C89 953BF1A2C1CFF12F3369BEC305764AD61055E9FA246E00FA4CB8BA3C85B5F20588C855D2ED29 32DDC3F49088DAA392C6323BC637F99A5C45C16163CD8DD59FD1C7F2284CEE90378B7615AB6E A143DD760EC6FCEC062D14FC169CB6CDAA44400581EA91B039E725C8B92B45FDCBEF32479B20 7D80F8167A13B5999613746C405422C8F79DF0E16589BD8EC66D2AE8F3B500108CA2C13EF9C2 752453C83E5DC61628C8C261D8029ED714AD9489AD0C517F8C6AD469229FC1EC8979F5AF9393 725E4B63B058BAA30A21C0FB5CECF18BD59C62793F83F81B8B0E136F4E2596EB2350EBA170FA 39737BD2D74C3C61C609D9F7D76C0180EBAFFD9E941536C2C3811AB6EE2F18E64138674E0642 C028F530815B2B5C611B6C5812D6E7A3134FB80C2308E1ACDB5067F451D65C3274FEAAE2DEE0 840BA9DC0E3A7F2D836BB648DE94259883029D2B1A9CCC6587F9A75C1C9B56035877BC49CFDD 0A6EED1CA004896832A91C69F2EDA09830200B9FF755905EC9C7439CD5312E0B27C0202C2D99 B097E376899AD99814DE95F97BA91739464D43E2A62360DCAA92E7859D81AEF3C15BC7FFDB29 ECA4F41DEBCFFE505B3640E04FEC257589B633B794A9235CAF7E3FDCF3AE8C9614987E1FB3F1 F50B79BC7372D1C0A391EE8525F6D4652FCA8F3EC5525DAFABB22E67FB14C75984BAB2DA260E E8DB66FB6C8E56A82E6823086739FD941D9A7682478C3505B4839559936F6DC196FDF4F89122 5F87B7515EF9937E0C9A976FA91F543B34BB6F07259201CDFB4F103968474A87BB01AECE173C 8600589B41C2EB3BAC444CA9068A365DD2BAB9CBAE60DD946C8AC8ADB8244FC44FB9DED6D877 6460F7611AB03FB142ACF586EA5B0546A00AD7E21DC51577231A4546DF6202B8160826932195 6C7454A2E2CB7561F979423778BEB02F14679B3B1962D41778040E021389A55FA015A022C6DC D2F346C95CB04A43D714510B1E871907E8E5BED7DC921ED88773758D8DD12C20212683BAF9C3 7D2BE7961E41D5EE8FD0B706E712B72CAEBA74FEBE31601C1210AB11089D004E352246FAD655 ECBD3783CF5B06DAB1F0D2DCDE439E2D50DCBD1C70B7387F2C51FAE8DA4F392EC8A5E45D572D 17BFAEDFA3FE36961013209625ED59C578157945DA419AADA6505E05AC58E53EA0777ACF3532 69C80783514DA97B5AD95B6D4B76D2E3BD50A5D06DEBADA540630807471FE2F5F8DCFDBA3493 B6978345DD24278C368C195A7BA45CBA4B1B37E97E36959A980AFA343BCE80512B43E5662251 B085622CFBF23453BDF12A3CF27F355FA4E54A93A25E411EC2150CD131620F75F281F3D2FE9B 1732DEB4B3CA0DB165F8B121FB9033312CC20C8D8CB4054A7AEF889DD1BF8E256BDDA3FFCC1C 27E7179A352EE96990227D4E80200D253591BCFDAE2DEA42C76722C8DA959A662D87C4998927 9989486830F6D162D0738A7854380EA9E0D733DCF83C12C0AB8DF04FE4881BB2B562CCCA7056 6CE60FBE2CB0D3F0BB9DFCB57C5F991C03308ECFCFF51C9A0348616D5AEDD60A40E91CE1FD49 28687732AB7F0B447B23A778E6395EBE78B65AAA26F6BDE01BDF24BC53F6D6168E0167F05E9D DF2AC26B7A1842214BBB4115A83D7270467FA63ED8EBBED262CFBAA1B7738610F410E5D06CB3 BD9D3942624EA6A2B772025FD0216F59551EA794895BA40F8AC60EEC664C360A8650111E7A55 E758C89C2F38F1FC200265C766F5A88E00BF9A239670C4ECC5CBDC495E6B58928E265C9FA4CA 6C73D151D1005277D8B4E2C698D114BD3D2829A2B0CE1CE0ACCFF15B78F7D035BE87D4EFA0BD 65C24E9699833C44D355BC2B1A1ED7BBEB077C7EE246723C7D0D84C240F079DB1DFA9B63E265 D49E5F9FD0BA5378E48266BF5BB7758DA716D4524C96B086E3E7D228DF704512AA8F7C901ADE 913AEA983936A6CFA1C2537E74B2AB0E4B2B6221F643689AF160D2EC4C5C58AAA60D08C03E04 0995372B93FDF3F0300C92E0BB3FCA5940BC9E22B5F3A3AE881C7B2B0B45986C9C8B73216924 AA75650661A7B4AE162C9654CD5CC9E6B10A3F67BE46306223580A4BD16084556C0476BBCAA9 B0904FA81CD4863ED3CC920FD27FDA30A2E3027379E264FB5640D9AF4CEBA4B93ADD4BFDC262 ABF6FDBF305CD9A2AB5705A1E671B960E4E974EC1C644B1A08FCA6FFC4F805E9DEBF3A78813B 80C5DDBA2AD9AD1F484211BDEE87D553592105D3A523001D95C0DAD9F6FA97FC6AF64E3D45E0 A86D6161CBF8F7B1835AF1A60766603C438F121C47FF72D385A5FC20F80090B0E7AE70E8474D 1126FE5BF61BF2C87C209DBD71C392085A1D1ECD916FC9B487F5C13A2E344A6A64D26757FB35 E101633EE41C8C4D52786A436D486CABD078E7F78FD8810C2DF6CC0793AAA55B1C58B19D0261 F7104D6CB7EAE052D75D0227C4206DB031E79626432FFB6092724DEDA7987F5EF950C08F91BF CEA89F2DC2029053140A1B0A036D0F66440A74F03B3BD6FF52BFDC1A6AC943FB5ECA6BFA63FD CFB0B8B28A3BD893E608F4546FA71703394B9C531003F02262F09F8BCB458CD043C774DC47CC 7170211D7A4C408B221CFBE92AA984A3E850099AD1BD407B6AF0192A2C97140F5C784E7093AD 211DDDB1910628CC0FADDE14027B47142528271F771A3390E9DD0C98024926F7DA02D449C492 0ED7DD0EA7E23A87AFE2639305A09C59037348B45BF5E554C41E9F28AFFE93CABB6E8B06A862 FC245742B43B0B9600C52B51BBEAAB08EC1D21D153C858ED9B03AE859854474B043F9162C398 969FA4A5FF9BB410B07E8100061BBEC0B21F2807228E969EA76ADE683F6F81F92D2F4D3EA181 090C3E93E1F8AED483B977CE200750443F248F6D048C61F8B7D8316349A0C9B32CA6AA72EA0B 42EA7C780AF7A8417C9ED9E0906E3B76379305DF78F50E616AF7254CB4F3A5D000CA8B71FD8D 06CDA8739CA8D8C5B2D48C2F76FBCC44FC41D6F1D1CAEDF7DE19033F79271A67221AAAC5F2B3 48A315F1E427DB61916230378F6A960A98AC16005CC74A2DB52C4CEC3008AD3FC263AAD9AE21 A6487F9B1A11A7DBF9FE3B4734BC47F3A32E3660EF8865C652CB7B447914C681BD20374C36D4 B933FF7033A588A7754B54714465201D3169092A69BDA975D837D81F33C4446DB54481180D2C 4FAD37FB766F5A43D7A2F5E11A469A5B0C554B95622CF98C52DA8E97157ADB01FCDB66987A35 521D52DB7E2423139F54C22FAF5422B5B507953BEF6CC32FBE8AD2E16834A1A6E5294D558161 D7835B2A185B6038B7FE61EBCB6248E671A3D079F74410EF8EC63512EB14137594CA40271129 A371C782F15A81B96A24BDB8EF5DCF575F3DE1C31D1EBF54099810CAB5874D1597E79443A489 FEAEBC9219D38B4DDCBE8559DE644F14C9153D63A613187CA8EDC2BDFC7FFF7A6AC7AE696DDF 3D7F75B428E41255A1481E24F005CF8D14E339FA60C755A35A722504E1B4A7BB4B7A3EEB00A3 F910783C7FFCE2FBCE95F1A0E73A6DE961CF4C6BB00E68AFB676E4BBAE420F247D1E24C17E04 F0E9FE0B0DAE30C2DDF548B8FF9A3B8AFD3D0A6CEC7AFB111B39895AFD37FBAAE7FDFE976BA0 27B72B4666AEF01ACE8E6E683B0E2B049B591F8A6585E9707A5D6353AA556E0B313B90A25260 309B33A4491F6CC7460E42D81B90C8CECA753D1BB3728A590966A1FDFCA2249E9BFBF17F7E2C 041A154AC5C6F2F73915C5A9DDE20B991E85351071921311F8A6805A440A9DBD75AAE4FB5679 C1D5ECAABF04CB0ABE2E10D7644E73C74705563AD9102987B22E45E739E42AC6972F97A00E3B 6074314CB5B55542473C3AC508AC81CAE5036FA264BB8DF644A8E4E2CA2CF8860E60AFB1B9C2 E8EA3C510029E1BBB6EDBA4E3A5CD7C6029E16CCDB45A4BA2292BA64B8ACB442DCBB724DEE75 1CDDA07791D01526D4CC15B5C5A35195F42FE362D102535031B8BF2B86761FEB2A3AAA1585D2 7DF164842981F9C76D9138C1D3A0E8A1538FAE45D1B02DCFA46A3F7F62E2FF2F3AD8193CBA3D 11B4090987CA3AFAEA7859A27D66411593D10A734F580DE2C3203F1F381FC92E8CC7D7E412F3 290E025E46BEBCC0D7CFC29374C6ED59B7420F60DFBB57DF61897ACF739B2FCD5B6180AD6364 82ADDAC59E47DE705EFDE08EF83ABAE7B2A543366A748817A63B04A17CC330B53CBA98052BC6 52ED09905788EA6C4B810DE341C187D214AA32789349A59DAFD0D9C547EA7AA5B753DCDC2056 9F3C100AD2C960C4924A9E776CBBE948450E234C8C1F3A41094223A7DF2564C6345D52C00C3B E7603AFD12271651B4006FE0E0C9E14D2A9C29AF8A99284237A07FEBD761ABFAAC3F7CF24715 1DB2F6FD6DF900C9CFB0281E12E7DC9AC0B279D81896F68EB59917143E425099EFA96F29295C FBE3438FB21FBDB51CE030699157A1422A58E668E9194DE86F89BC8778549B51B57F39B81527 5E98C7EBA14D03FFB262E528DFEA7D363CCEF909FF711B844FCEAAD5FCCA9A8153FE06635025 11AEAA012B9194054F8C05E0102DF5EF7CB3F017D0C6F02813EF4EA710D3684BE937C3ABB62E 677AB94E251BD6C6D99647E0B72D1EE2379FCB4C2DC690183D17D46BCD6B9E508BD4BFC8320E AFCC03944F0095FE2173A1F3E51BE14DFFC0A1C392A77AAE1E6CD4DC6FD366791063AC97DE0B DF5BFCAF3A1D80685ECC6AF53F72FF2909DB0A7E8F26E03EB3CB024E32D290F9BA2D6844C7D8 16A04E2FF3935A0B0C20D47D18CB5BAABF2C4C859CBF3D382D49E136078A7EB553AD3DBB6FC0 95E9B808AB808899B2F167FE9632F35810519394220EF079CEB65DB51E299DC0CC9D2BB8C811 7CF4CA303E8E061856B47516FA152620B4BC18C50CB28D95B56A49B61C74BEFFF1382DB9110B 6C6ED6D2DBEEBA7F6F5C9216D1F783B689F2D886899BB87A900E5F1F6CAECFD8E5E7CD5D723A 27C9EE16168584EF0484325996005F8783A40DE40B12465CE0BA18186C7E0D82E404199EDC1E A6907163DD62B8513647CC788C4402C56CA92D4C16D373E6CEF75DDF931CBD6CA5BF4CEFFA9C 8810A35B16DE15C79B58BF67AA868A2023B0C6A0A1D1822D1FAF7FD6F609925121EFCDD5DFCF 8B99288F2C8DC60A9D5E0CB9C15859CDC7C2B449451651E3ACA0F9DB49A21CDB5F6AAF4A638F D213E3FC147E1719A7B3EE57E0FE0E61F52306780D4F368C5A86B2717C8FBAED0D7EB44AA96A CAD83E1917E8B2E261F994C6B911EBCB4B979802410884FF8A62C6903A69B7D2E92218004E7B E87582D4B8711E6F7285D52CADCB93141F27ADB44F3C794369151A0FF41BD7F7020948B0BF00 38A3C207397853C705A77AE8C432CA2DF2A7DAE1D0616E674029F979AF112C09F7943DA66D29 0A4077ECFDBC5A90D503E2F0B68F7D3355C6EE4B13565BFCD03BB30AFCAA497F94A3DC5B1D1B D949D7C9959A0017FC07E5DC4530FA748B0C8FADEB252EFC3C93EE94039C8A1B809B8E0F267B AB4EBCDBCBB982082400A157025AEE393C044315837057D30FD01919A42FDC9DB02DCC30A54D 6E8EE884AA08326A7FD930D0F24555E22995E1DA90B830FB29D4D60362E4949895D672D386BC 98B28B60EA887902F8F83BA4FEE80E1DBBC6ED0AF14972D467A439675E7AEF02FC4EB7669BE4 E1F6FEBBB484AE5E4E87F976C106B7E4D561039DD408F4A52A1582E44884284B838D192E1EC7 108B92B74795384488BFC146CB062D90AF98B3CF60D3EF35C9B4E41A808174CBBEAAB72ABB49 BB63E352D4512ED6782C5F29E7834823A4A422DF68BFF332A757963B6E74B1840A77A638CB18 ADDFBCD5569B710560CBD509565EB5B4F6D99091B311BD929F39D903E9EEF793D7A13A0C5635 0E644307AD45A86CAF705D2709E867DAA1C3F8D5518D2F821F83F3C42E46ED1FCD2C485B8AE5 00785244DA140EDF6CFEE9F44BB14F58F075842061223310EEECE7BF9EEE2FCD8AA4C2A2479E 6A6ABB9AD5724DAEEDC5AD3EA2FD4FB8E7C39A655F25DBBEDCF731B377303E2D21BC435DB666 28793D9B4FC5C25D7F3A308B30B013A6D334CDEF5CF93A074B4A7BA2D497B50B204D6012DE86 4519F5A9B26E57DC6BE8887E86D874713BDBA81EB1005CE04190A053648940FF9EF99F65ACD4 4B47130D4B70E679DADA1D61D34118DCAF6612217D2C72ACDF91780F505434872DB2FC70B399 D371AAC8AF483DED414B3E71305AB9DE7FAA98ECE1B437BE6AE3B2AC13140E326ED56F737EAC 0924D2DB224E360B069A8187E7F6F20A1793F7A3C1953A6B646DB685480345BBED23B69C5030 4530D4A50510DF29BD01A329B641803CE42D785B82EE3DBEA80E5D4305F8CE567358EE1F745C 1367E97720F7DEB3026295F943CD907EFA8469702B86E03A2A3FBA4395622F6EBC561B93ACE3 4476EA667BE6C8F0F7E1C7649C7F241827CC8C2591BF30684589F292ACF7C16A5D4291211CD2 0F16FF3B150356BDDEFFE697C5E678642D279459844CF1ED79A914FE6A779A36E2B8E0A0BB9C E60BCF90A90BC5797E8EF8830FC1DA7DDBF70D2866CFF0AF055EC245E3528DE430774D0CFCD6 0B909506BF9343460F10C282EC5E9991754F9F775584B41DFE6417C3EA368F599C0F528F06C5 226C3C0C3E1B142649A202115FC4E695DBBAD3161C96F51F7F3F476E2762417EBC5E170E6541 2186CCB92A35BC9D18CD911C9553C6028B36E53A18268FC86F6B6338DD6A007C60CABA00A51D 2D8572826F0FEBF76142A32F23AA7C751E2C699E96B579795FC983B12520811D99DF5CEF787D B439E0EDB28913B0DC7D20240FAD37F060BAE2CC5E0A0A1D62B334E1961AE265B61B8BDB6130 2E0B27C073F79F624FCA7AF93EEF0F93AD3BB13C8474B268F47232C0BACE9D1753DCC4C952B7 32395F54406E4E1B756A4239D485028676EC83628E468522F702D666AB8F8BFA70276D8EB8B1 D64A694F1331B33A41DDF0BBC70FA772F9418BDAAFC493FB4E33E2193ADF5684788B8B52A51A 3E30FC005D986A0E8E1089A512B9C93C348650BAD444A056B7F76F075160EBE9D24B7C12307B 6B67A5E1A79AFFF1DEC0CBE61CEBB8AFB0104C9950B03DCA651D21EB1612816A045372C05E1C 5D85FD01741273EADFEC7B4BEE90D1038EC050F0B70BD95275BB73BFA0EC0DC3E320003D97BE 424923A196FF4A45A4FEABBFC947D04B7240E6F18F8789AEFCD0ACFC4FED1BFD7B85E2B4C615 7E7517AC9D805BD9EC76FCC2C165DC9837CB6A8C95F5BC442E974076EF12528396DCC8CC618F C2E4C4479FD6BFC0E675EE0E775EC4578F6ECB89B7FE85FCA82BD47C05173663DDFEBB3D2E6E 8CBD8C8652238242B5FDAC983CD86A858EBA4D5ADAB0E85A5B24AD261F4C078055B6746E856E DF0FFD6F9601A3D2AF5AAA13AF68E79FB40039772834588F4F466746F2E02CF444E96EAA4C76 39869EC2D6FC83E41C2214A79C81B5A5898EB6FC89FD2BE1BCD672CD09333568E4182F089F3F BF1FC83806D61CD27ADC1F15FB4F44C1F4707725E7121349C087BB96D4ECB172693C65577C5E 793ECFEA01382ED7FEBD734E0BCF8B2218A89ABAA3D09AB012D57EE827919E44B8F5772CC87B 6F2F761AE69413EFD19C9F79C391ADF816CDFECEB7D7C198F0D577940B007E972801BED2FCE8 F2FDBD28E6C0145E6753B09F9A91A7C5DFDC716265AFA23AE549BC89FF1C817F2E3CE3B05086 9C8D9B02969B7435762C8F03D45D99FD41B9CF2364B83649A88500E21B751D5A2AFCF1722845 6B4FB0FA31AF0CD15A8B76264154B22DC03E63FF02F13DB1AF1FAC8D94CF7ACB4B264040529D C24505746CA70D0C4ABBA7DF10F71419CBA3D09E144854DE0DD8276B535F46D69CAE6F191AC4 C05F38FC134886D93C38B72059A28EB49E4C302CC065687D0EB39842C7E750F4AF124740AE85 3231A32E9EC4204ED80CC1E0AEBE452DE3178295FB873059201323DA59E2D40C23D65725D4DF 41F750F9A59E02997BEE773628DB4AF354F7091E8D46096FE2C2DA36E10C4DF6C10504331453 2C6F4B801E67C3E7DEA90A13C20E30C3F4E30726CF4939320B57C6F7A77993B644BF4D8FE90C CC8C4416A58141A98960C788119A375D4FB8BB26B587189F894A708A6E2384DA78A20D655573 43B38E6B4B41DFC6323BD29DC4CAA823AE20C1EE279541C1DFA465A26EC28DD41EE1E2D7A408 EEBDAD3A784A146ADEA4A2367CDCDD1444BBD5BF98D29FDB901F34164E78987F06837B5F99B8 19E67397CEC661EF7BF25B6428940FB5155CD0234741270814D87310E25461C5E51594200C20 E0BF00FFB4D4FBE791BD4561473B02C886FD4BBEB928BFA9C2040BC61EB73B74836F383FB21C BEE3426B48BB982926CF2AC2CA766E4B9C51B5A86E3F953B7835CE15E514CC26C329974DEC7E 40A5085BF8917825E0DC701380D37594D8CEEC684B8462988881A403DE9A70B8BD03179829EE A616A7654D92471D114A09373E19266FD2AEA24C1A52C7ECF78A1F9E63A35B10513AE6D539C9 7F88A5F5268C6B428F7CAB52ECE8895F2DC226BBBE62503F12FA66EED4CC99380CAF49ACAA0E 3842BFE20BDA0C3EDFF687BFD08ECBB010F0AA2759549B46C22C764A249BDD4DCEEC148C9BD6 7286F147113752F5EB05F96284FA500904E2002A103A0DBB3A2B1C270C4C955B95F7E0A10B3A 4F688C219FEE5D9046E98923DDBB64679F7173E8BCD75313B79BF639F2147A4A59C11D62F335 AECDCD295C1DC6C8A52E4F3FDD9347100C6CE8FA7C2E7034CB3158ABBB7937134A70F598C160 C401885B2986F395437BFBDD959E67B195E4D3443182DDA2EBC5B295C6443E0E932A479D1E35 808CBFC3224DF5B67282D8CF46EC92E297A8FF25748CCC7A3A971AFE2468914A5C227395029B 9D76A08958F630C3D5EBC7D419111DE9538BCDB93D64DAF9FEF275E2B4A6E258ED41F15ADFB5 8791A51AFA65B39D78382B0122B7043DC0878B24C44408A4B28B3CC9096CEC9F5FF9719013DB 3AB8FE62389CB1B07A94A35AC77AC6D03379152D0D9ACA48124B8F121CAB6C42F1E449A0CDD9 39558B6AFBC601BF5E498AC42568B2899EBB22E66258C33E1EEC34BA918BF64E44E4E02CE18C 08B7DD990105E40FE8D10A826CDC3C0956A31A4D7E51FFB6DB18E0154B3914FB622FA2A9128C BE1CCD6596F8A0958EF16980AB82D1910CA4BAA3DA318B3F09EB6E3A74695C85131BB81150E5 EBEA83955A8AC0A1C271E24EE1C5B6B053FF2132C4F879316F44CBDA98904C768C18CD7CC62D 69FF9577A07FE06736ED52286A6341C1569129C2ABF1D3EBB6061A078F27C56613AF02CA25C7 8DB23FD16996AA3F0555B6B0E221919C3B306CB73CA66935106CFCCF3AD36774D17E79CDEF66 E7E8F42BF334F468F37558A4D1E7583119048FE1BC9E55903F83FF1BF19181E5B39695C1134A CEA4474F072FA8CFF0F452B1E0954DD19A36B7253305453948C1221E55EAE73A9806D161E4B1 1B3C62447F100768D3BBB300336C9B62DCCBBD6CC293013F2F2F43240E6CB75A1B9F993C028C D88AFFA8B7C60DAA3C503E37FA3F7E4BB91D38C6E37AC55835644814546C0920D924D6CD2F4D F321B396BAD9B233A2E1E53F107E96D94871731DC0C0DEB523B878F1B51E08029CD08500C171 F9841C1E04675D25BEE89D58AAB7EDEE916A6F5FAA718715B95AF8E579BA00B21186D88F23F9 701EFE42CE11C39158B3DA2800F965B5305084A8427769FCC0C9CE079EDEF413A2C4477E61FA 593E5A556C65E1C5FE8B62FFF73C7AC36EDAE866E8C54D8856DD6A87503D24490ADF484D1A5B 9D0B700CEE37366A1A22AAE4AF8BDC7E94A6FF49BFB4006DA1C061466AE4C865C0B43634D7BE 2387A0B8E247158F100D037BA8D764CDC38FACE6485B3C4744D97F6098E70672412EB519BEAE AA9BF1D7468D2B18EA60AFF5B6DF7922E5D58D243862C3A5D0FABA666EC561901655FD312C23 41D5DF6A63D68ECA8D8B57C4270E451D057FA0CE873CCFCBAADF3D6FAB6F55AA44490D03B151 5F573900B931339885E2E7C8DAF6D9B13036195AE8009883009D4AC0A4E14387E6424B70757B F22C2676ECD57DAC35820B810600E5039EC8ECE5F78D60473793753F119194017EDDF1671A56 BCB83E47A653F8550E23C9292B4BBFF6101069C479F31BDBBECD7D3CFEB988B085E947FA6C95 46F9A66803DC750FCB745E7B9F85D99E843C7625FE1E4BB90470793105D23C61C17FFF1D83AD A70748267428C80CE633A966AAE27B47AE3ECF64BA84216672BB744ED7EC61C94EA5EE1E376A 996933F9B249C57F5C48AED31D94D6741F2DD8F511F131C5765F00B43A0AEC64EA6D786BA0BA 13A31099E6C83E6B40D7C268CD71E0B66BC5ECEAE755769BF34B28A91FE30CFDFFBB317A8588 7DC67E1B3988A2E4AE73B1C8A47D9A5177F67DA5C4C2BD1DB1FA4BF5DFD9F0FF44F5EFAC833D 6A3BE62717FA37E598AB99905926260F47CB64B74C33E4F99363845BF7BD23B28A5B420F8A51 C68BE48C0340B631A15841AEA60380AC1E18ABB48C4EFABF1C0F9E27FF10C73E5B00F741D050 6F07378ADA16585AB9A8877B5E321ECA9E9FC9C4561383228B0B3AD22D82795FFF6DE12B52AB 0C1AD211C5DFB1E2F7EB8879C7C682C775DC790E86D6206CFF754094308E8F32092A65AF3413 A014A726C32121B32EAF34835F2B88DB3CE5ADBD7853238AC08C1DEC209AB1A9BE63483FE56F 0E0F6F56B04B4572870074D15DF9393255A8E2410AB7F07A24B29D0662B0894610426ED9AA4B 2C8ABA1399A7A16A870C914B8C7BC5B5424B61AAE41CB4B7B423684CC27FED8BCE9D8FA942ED 01E4A3A1FF572106AAD889FF0925124CD20208D043EB1A6ED3E8CB962A0EF299BF60B94FCB8D EE806A2BEF0D908ACEBF0CFAEB8251258C567E87DECF4C865B8C277E83A4D4135522C69BEC06 4B3C59295378D5F5DBD0D56415939218B145C06769D0A72E06BE93EC93F87BBFB7C915D4AFEA C3C772DB09653179A7BDE3DE26D7050404C6CB20505EFB6E34F3028133065404DDAFDF958EA2 C776C6D2152F87937727BA220FF19D2C42F7ED4C88D993C71F0260D21B9BB31705624B8BCB52 D5222AD73F9B50A5FF67554EEF5FB6F215CC442A965F145D7DC46E909F829D9F0CE6F0E8A92C 9F0A45B4EC2C1A8917A08A5F25D0FBDE11B197B97D290F5DAAA877C94EB7C836F76FF3EDDD0C 95E4702428D9C9B4F54C616A264198500F8187FA7D88635667FE3C78349A15BD349105A1DB1F 75DC6221321A27071DBFCCA95DFE0E404030A95DDCE89670106CCA590123C7946DEE16B67E8B 440A1D60F22D42315904E9BDBEAB448AD1A1F1E466B963FA0EEF2619A03CE3C2AF053EBF56C2 96600C9170765AA1B27BBE3FF9C0266C9AF29BDFA95EA426CC6D2E1BECB1897718928841D041 400D6B0FB05B6CE3447DFFBAD65DDF25F088680D2165B52C2454F9E6A7B1E57A1EA24D5CE3FD 7D2FBE52AFC0BFB7F15A8C4F309B1AA25ADC6AE7B51B7853FD56252C5DEEA410A48C46337D34 BA45D263DAE36FC0745C32D5D09D3AEAE5FF5339E4DF2263545B217210CD442F64807C7A6C59 4EA17144B45D1474BDBCB4EAE6501C44824F3BA49A5C39911642CA5DF39AB3C1F724CA808F9F 50C643CC570151541F49B7A621084801C946BF8338D8CF6C9E0E0B414FC4422E5B558FCB5CEF 4A6360B22C44C2987D4F4F60448FFB7DECBD87B80C771DF2A4AE1749A829490D350981BF97B3 2D899418F8327B6F0737F60F50771190D572BBE89F4EE316D66721F00AC59B31BD2E5AF43187 7F9C4090298B0AD4F427166400046856E5B56604F70A67686715C052D4FCFB85E587EF53A42B 98914A88A552BADCFA1FBFA6F965A3270235590D68CAC597A022E6713EACB608C06C59A5220D 793FEFDCA2B7DAEDE9191CD8306F3775595E3B2EB744C70FA30CFEED01F3273A51C8667F9141 02D25EAEAB8C40DBF1FBDDEE6D1B78CEF4515524A71F18F888B3E0B077EAE77795F3C57BB6C4 FD25DACE205E38F43E1B8157EC9FD481C4FBE5E4268CDAAFA0761A9D2E1D4E7DEABE0807101D 27D6F913F1DD351297853BAF59C9800A3DB3B732B03FF41E0CB0F6C8B7B950163EB4AA869B06 A9AEC34613083EE0CCD011C8378D5B000DD44605EB14682A5BF0E49AA29E16DD99F05D1024C7 DDDE254AF649D3EA28FF20E2DF5A5223866C867FDDB7BD3461054BFCF6F380234F1197D7B431 0F786E5F09DB1F45EF11EF2914CE6DB40F3C2D3E8A4E4B952A2960238D0FE49D249B07773FA1 848ACE2018B884A7E30F37E3252F5A10A5063120B785FAC6BFFA5F904F1822A44F7CDE02E490 C765884F4924AB56E1377EB8BCE7671BFF48CFFE98A922A70AC98BF99DCFFBF9FAA6ACD794DB D4EE7379E703858AFD36AD38C17A3A5E911FABAE4EE2C83C02A3EC1EBEB7F43626E5A22518B3 818501EDBB2003CA27A1D52B43761BF7CC127DCF8AC6AC029B266676DD100C07246F057641FF 286937B95356C5856AD85FA219AA48585170AF474BA5571F9ACBD96C24183319096732A686A0 B4A8EDCD1F393CF6876E9715D95D44EE038ED5D7BA32B7CFBA2A58AD685A75C0162C1F78A2F9 647355AFD8D983553E00016F5AE20211BEA9644E791E48D65B6B5DC82E3CBD15FCB4B88DBEF9 55DABEEDBAF6DA8E47B403761A838956DCA6D815D32AE26BF7D0321F5005BDBB9556937BD2A3 EC9532D68DD2B2E0DD27449559D9F18067FACCF81939487CE27D327157BFEAB88C6FAE46BF56 4B67B8821F4B5842B9525F32281D454364586A256D1FBC3BB4022E46916CB0B49D658FFD8938 4C42ACE35E44A41A569EA86A3AEA0C8768078134755368F23DE790874A889DD1DFCEC279BC63 8AA5D66AA94D978A2E139C1AC97049189DE86BC3A19405FEAF28362A1DD19109F69EABD6F578 DCB2AC4BF11CE1B411621D0DE459C604C4F22B94A7D52FF5606239B6B01FA97520DF9FD7CB66 98FC0DE4A1B61D1BD95421CFF5D4B125EF0F624ACCD0B0A320E3A80B8D9E336A734C19A86DE6 BB10F369D09FB9F3C092EBD625C520919C7AC435C9AA579743939FA7D133B1F4131E55AD1EDB F92F19EF3F978A08950BDDA8DEDA1E401657767E4E43F6F01A6DAA8BEA5DCDFC0E1CFEEF0127 906DAC424B57C2042687A58983FC078620AD5EBB15C685668793B0EACF35A65C0825891C562C 3FD9A0F64F5A5372C27C20E4A79E16D6F98A031B64F265FF6BBE3424E0ABBFAA6F1AFD5D8F12 A0C7AAFD64A3B76E8B8EBFB3FA740B3301B32C19DC848CD88F7BC6B090AF90FD3507D53DC963 A98E44E1E6D5720D42A296A8A4F42BD4C33B25B8B419ECA4ECAC214BA1088C7911E97A8E8451 66B79D95742E8C0D89AF6CE44EB4AE66FA739A20F2EDA6D2334FAA18B96008ABFE04643B49F0 28D298A3EF508991F22E41317C200AF293B03DB7B635FCF354EB1D1FADC99EF1A23DD4638FDC 0853C7EFEB486C671BFA98D8AC5745E93AC1273A10FD4C4A7594B0FBE52DA2EA7681D0F64134 DA8D042FAD70527D1FEA9FB9591D1E4E905ACD4E8C8D6FED60886505A9052AB1011853508684 926B85246DAC0BDD3DA8811C854163D75579A61BC71CF4CE1C85D9A24ECB5D5D4C4F185FDFCA C824E26947B910E6C76B943683321A7CE209ACF0ECD89361341C849E575DC51AC28946A8984D D9D51DF6E983F8D8AFE69096EB3D493776229F5DEFB1A387A08B692C48C551264E34B91EA8F6 3DCED03599195B26CDD125B8391EB06D2F975E6F039F24BFFD1B8EEC28F5F2A615B671926833 27FD7894335528E6259D8302189B231EAD910FA5454794DE2355C4372660A08923E7BCEAF3FD 3A4E39AED1A38728349EBAED1F765BAFD424C1E4879EB434DD14F882BB5787A798E99191FE19 648B5E14613A1B47F1FF71FE8811A41C5C72347B1DB49780017CEA779125BD1243374A5C3C6D 19CEE28719FD576B19D60EE7F154AC0E5207FDC32E9DCE4DFC7C75339B8EC05910EDEE34CBBF 769B15963A6122AD88E6DE966B06D6ADCF272641848735B709E0F84F6D9AB2EFE730D06C54A8 8534A072D90CCF1783F9F0469DED40DB50A13C451BA98FC672994DC1BEB94D3BAAC1CC3B2409 D0C4E1F06127EEC1D46560102E92862CE827A7A9F6B44128D7C5E69138C6B59924D6B7A9127F 02CBF32E8936CD70AA8F0DFCE86035A633BFD2AF92DEF7B065A433053491A4D6F994F0358654 E202E1B229931F7992658A69DB3AC04CA2980354F706025C334AD4A19B1CF04DEC6B1F44BD17 F920345596FAB29B4E204AD5D5A26C6A91CCE3DBD3C9C587B1D57D9200C13A3400820A34B595 E7634AE4D2F09F20DAD0A851BEBF473DBEE173F1CE15A324643CAF724448ECDFBF554AD1F635 E36824946ED105927CA9232B17E6613A595DE95B9ADF965D1C69BF1921CD015DE4BD613CD62C 08DFE1A054DD1A4D64178BAE037C6B86333D91881B67F257514B97A9D76759481CED53413FE0 132DD3E5BE1BD297D8858F29FB4ADF2D048E2D738B88A7819B623C72F1AFE6BFA3159D231082 8EA8D172A084CDEEE19E537BED2F3B597EB50A9B17AD1AC21BF0888054C56B0C0B44E5D52E56 433EA5190CEB3800A888CE04E5EBFF6FEFE5DBAA8BC68AB9AF55D969C59EBE520D808CA1A4A7 F1A83FCF91E5A0A518433930AF117E254347FB2CB68DDD3DEE76DB30385BC4F40B57369B455C C75E39703E734CE9092C3E05EFB0BFC322B8CEF4A56AFA1D198B52E02119BF433B90A33E5984 2C22AF5819903CAA4DD665A724FEE33EEB3BB8E037BE1BD3CC157DA7C353FF11714B2FDD9E26 D6119E6E5F9C37BB2C3E7AAAF86A6516E242B58824F3F9049732E920ED74DC3799F6B75FEADC C1E210550D4887DCFA7960156C8AFEBC95F2CAE5C8E8DF12961E20D908E7A2532048D3BC1A08 23906EADC102BF4BB8901A486156E0BEE2647ABC1D83DAA63E3D9E000E4255848B38DEB0B84B EFF24F13F4465F8C6033051A27A123A46D4B479A5114310B26919C70171A2728731D99C7F1B3 094643E79513364EB699C732CD78B7B82E24D86F0A3BD09ED646FC2BEAD6B709B7586BB54CD7 92FE4492397859D8953271125085ABB0A87E23073A2B9D978989D1DA994D94057168FDACC3FC 6618429BE08C47EE7DC68C4B34AF31136989FA47431E761424399BB487D306984D2C80F6E09C 0D6AB73E6109E8FCA404BB8203E1629132DA7D4991B615A561C4D9AA87C8A65A6582BBDA988F 50BAF58CF7574D1F1EF04F622624A87F7F09DB1B2CB6802D219764CEED9855FDA819C8332DF8 FA075202E42B9139FDB94B6E98A89DDB053EF68786082B4750F678323FCA0BBAE66B3339563F B92A75814C942A1CD4195A9D7110E8025970EE07D8AD7FD5E381A51049F90787217CC51CD654 0F765712DAF647BCDEF44E3EEE8B75A229CFBB710914F37D7F11537D15B5446959FD78072582 53CFAA5BECC03CE0334CFBB3863712B16998BE264E52A97D7039DC89EBD7D2064735D9C834E6 9533C441EF68A817BEB7276EDB7D9BBFB160165A60C41DBCC439A44DCDBB025174CD26AFFD93 2CF0E052DA5CC8F31B88FF1C883B256A0BEC836C6BCA57AC41020F5D371B58780864EAE3F967 2C96E8D0ABCDFBE990470D832C3B5175307971954376A95F0A9EB15E60DC09C1C77EF33863CD C0DDA2F866BCC814F933BDCBF7C6A1A87C7EB1604A49685BCA39E27C16486AB98265D7824ECF 15600BC02DD532EB2BE5BF513A5EA4AAE38F78A209E55380CE1A7F7535B98672F84CA5BF8FA1 BE94F3BF6E5BFF8821555873DE1514CADD66615D9D8585B1EA02596B432B1647B68A8410B1F7 E3E830DDAAFE3D3D38C1D4B18C73D8ADA9C7D46AB6B26BD73CDFB5683EA2058790BD096334BE 1FE2EB7CEB0F279E0A26C67B9C803A261057E60DC6E5191F17DD0F4571F9A3A189E1801B19E5 AEC15F56AB548187B02989717C5EFA2222DF767B7AC94540DAB04838B44875C365959DA52300 07321DDEA3883D31996DBBDACBBC63620E8B6C34888F22FD3F9C5F888ED4435CA37C64917D9B 1FB525CB8BDC641153D756A964F61182D567813C2935C94C55C3BA137DF999DD51C7CE3F057D 20A1F309ABD225B68A56F23D2250EDA0DEA540CFFEDFB063791EEE51E951FF7149914A4505DB A6F6D8CEC9DB976CBA2F0492DCEB646D6D11ED6535B00104ECA4891C515A65ABBCA848F39A14 C8E4E6A9809B6A1C33D121A52CDD4107A9C7F1904A69637811ABDC9514449149EBC36EE64D49 4D9A25034825D8E9A9EE7DED5FCFACD80801D694FBFCE96CCC234BBCEA12F64786FA52105C97 37017599DB2A8293830E274241AAF0CF16C458D4EBFA576BA3E5C09D536988B2CC35C7114F96 D6E243FCC0437C78564B91923EFCF9E46DC3F723957158A004AF99F6195280BC6FAD3ADD1DEE D59744D28C2F005845CAA41FBCA16EDCF021C5EB2CC40F2AE5BC423DD42180C59B71E25F9B6C 134A142D4BA0AF973FFD518C879F12ED58D7C27DB19441B9CE465C51864919CB71B6B4C84577 C2A9E49FBDCE75E45F8A20E2EE0014313B26A36660DCACFF90731E4125565995AB2F0F948E8C 3455BFA4830AB51C62A11EA78542A76B1BB1722EA94E11F8C97D42DEE7C2C4A8735B5390D53E BF7125378F4BD3E524B584EA3D5681FDA47415D80F3D98A399405B772E1A62456C5FB4928F15 3E50E9EFD4728A6FC846B7D3CDD4521D34570C57ED19905B0ECF04DFAFA5039DD17D34088139 0108D03AAA4F7D05D1916F83F607FD0ED36852EB51BCAE696E8A9565BDC64690F61B71DB481C A138B90D1C023658A5EF72843F2933356E73955A59475A7FA6C880E600CA6C69F0DD1E137081 91C7B7E71CCDD863A3C5B162EA0C8C4D28006558556DD6BAC3B393CEF41DE6DE03BE431CC5C0 B3F87D5AC00FADF97D5BD9B7B4D376EF55EDFF2FAD513F3884F1F54731BDC3B32362CE9DB225 F8474B0DD9D28441A492C87BE9EA5A339CB630FD1E102FFF0E9D6D45CC167E504C621B39A327 862E063CF64DBA8C8D145E187198BF55E06ADEBCE91FDC27760BE2F0439138AA59ACD622B478 EF265C77EE9AB9D8175538B89CCEE599D4C1D343993298D7AC4F5B1D63C2A8B1D1B089981046 347DD451923F3CD369948AE10B126BE69229B6862DDACCB71BB382D453223AA10EAC98C025A9 8EC4BF03DC786C51CA7CFE8895A793279C39630275E93157E10013BD418FAB44689E8C47A7D7 18192CB5EEF14FB99A25AD2F1572D72CAC6DF5B4ACA2C23CB24FD6B00A7B844177F96508FE91 1967FCF7108EEC38E7B5C1E8F75F9C07253074C86D31D79A4E4AA53308465D91E13941E79981 54545210378651E526795DD4B855B7F0266EDF11962BE734EE2D386305CFB69603DDDCEF0E84 F4EBBD60D9AEAE220F8846CB19B84E95575363C05FEE1FEC1B9FB7DEA5E1AE70AA6A61388948 041348739ECFDE4527271BD83C67F4AEF2FF4457BAA38CB8BD2A61437FD53BE60B6D8E609FB6 122ABFDB4DC2C43BA4D5E235553D2FB0DEE119399EB8FF8A1AE295D7601BAB9D664215528D2B D9200FFEACCD4FBF708B5192F39EEE46AD3B6C04E4D97FA895DE7D81086F7109D87B73AE2D12 93DB4AA2A4EE29672C31531C509BB108BED594AB1BF07209912955BB7FBF0CA816ED3A152772 E4D454D2E2D560E898F65341044622B3FFC87B937C38C4282F644696E2741AF6AC29BD39A100 542772CC023CAD0AF9591B4F53BE0C509EF3D1CCAA52D1E0839DC2CDBB5B25FB3FAC2F218ACD F025C2CFE34D5B031F06DA86748885E741A333B4B3CFBE48E2AEB8576A2E19C0F709B6C62CE1 49EFA8EC0417CFE16260B88CFA9E64CC3BB1FE1F246749358B4A979CC28C541D579FF45001E1 79CAAAD1FA8B9781E198FF176F94A8DBA444A6DA425BC0940E53136A0DAA9BA0487B004CBF2D 8AB9CE4CA86FA22F981954E6AE5A5676118F7F9905AC8C63D080E961D938A2724C32AE6C7806 BD1B3B6E25C4999CEEA1787413690176925848163DAB10D01ECAEE48C0794C58DA4F83B3E989 B88984B10E4211C09BA8264E0A3C999E1DCB726F17FA54F274268CEDC1C38B0A3EF88A19B157 6D217E05A2426FBF0734021E30AE193AE573D5E7512044CDDECF172263BE830D8454D4B51DE0 3CA9201157B58CE5C32D35BAF912F6535F45FED9DE0B54EAAA6D50EE2D89D82983D597F4849A 429D28EE5BD28B412B1365470FBA998526CBEBC683FC2A083E2176224F5E365BAD49E11E5F45 2E8FCAA3522C86A0345BBDD35C3C1744F11DB3E47E037321D45352F8FC876057FAE5097BE0FE 371C76E156C1FDD5E4F66864EA07963BF6306C2506807B28EABF17FC994ADA4E857EC43714BA A53F5F2FABE8FDD21D90B7D6E1C82FD7EC759963A5A1C9B55BCFC5936AE05F57D04ED6D75DE9 8F7A0A58E6C28FC4D3EBC44C3EB22F6A4B7E104C478115244FF9739AAC3EBBA1926E7F34D084 E26A59581D895489FAC13296C48F66DE8ED2419C68B9A09B1DFECF46E6A0A86D63828B486424 432BE3832827C5DC9194CCE146800F643F2F8AB770D7C262A3CEF21760AFEE19C069073E7AC2 8020CF4ADE9F09B61FF4845E6DB7CEA707EC663E89130A020706E25A89DB44C9AE6749FE3641 7452681D12A346BFB9E8CE0D64B48165AB59F48785DEA8C0B4A280E260ADB1CA7443B1CB4B32 4E3E9A8E92D53BA2135E00ADD05DA7B068D590F526BAC9F6DA75E49CC572C129FCA6AE313AC9 D172674B8CC5DDB0B7A5E9D9E16292563DD71F3CC68691DFFF2029D0585D7F9E4550CD812DD2 6BB16D2E9424FF5F2B3A7C491EBF41EB4008F467EFCD9614537F77FC4E5AE74C1A1EE76FE70D 99B0E47696A66CED3DCDE3EB526AAAA65826A7ECC98108E14F8CB6FE44809C6ED89A0B9F2061 146536111FA826443CD51F5D8E1D7F802F7D49A418F7A2AF98F63554DA236E04818E1DCE320E 2EA339BE7843651C7AF10A8C08FFA6FC44DA3C690B9461AA3807D124D9D3B3074778FADBEBB5 DBC0874CD0663E103DDA25A8E422601856BCEDC2E780490372030E6B64BC72F1B32584D4E615 7847AD3C86E9D356E001588A5270AEEEF28F32F6B28143FF88F1003DD62ACAF6DC32882B3DAB 3DF3EDE7F70D787D264A33454751120C45A9C8CC8DAC760DD8894AD67448CFEE6A978D1B6886 FBD37C1DA8ABB842F14DC15A88279AB7810A820F85EDD858EF2F6D93E55F915E23E9E0B8E7DE 47F316BB596B85D39F76A27C398B75B5EAF9B2FA12FAC834545EFC6D9CECA1C698488AF97755 C4636DC9A6614A416DFF84BEB9FC4ED7D0D78671067A971998EFB0849BD7E949622BDA0B86FC F71D034BD884F7214EDA23F1E6307DAB6FFB00EDA46B77542A000BEA461FF00094E86FB82225 CD1A38B8474A361CA9F47F02F3102C9FFDAE58BB969128DD40C81CBBC4C1908CFCBE81C28D92 0C131EB65302D8188DDA0526E3D4D13DC21ADA5512E54DEE28842F206A931D7941435D90C2F7 396061AAEF7480FA54897B316CDB1363C95092F9B07DD1836D53D8E9834C30B2E315CC3D2094 B3E765F68343A8E6916576EF17010ACF780107E43C2DB313F15F42C65BE7C241D3AE401E1FEE 9AC5990CFED9B8AA69B041DAE0D3FB35F4D50A4549AD9B1C53B9A23C3509D997D2D92E5312F1 F79D46BB840812EC2BA3141133843585CBB0FD2A4C57BF5725BCFF342ADE606F3707A022A1CF D7DFBC7291CE45430612F48A6FFFF31DFBA614891A4E4E56094D9E30D8B4E9C00807CBFEE0D2 DF9491701FA055F815225B57BCD4FF9D109F835787DE5853B0879A90E1E52992C331D8B97F14 A0A7744F5DE29EEC761A91562A101E18ABFB009D9A4B262DEB48768B73293BACAE5057123134 731338E84668005E520DECF01EC70E178B8FD37CD1A5AFD509A9A172873D0B1ABCF86C96F66D 5D3DE5CFB77ECD415C2188B21B68CF94B22CF18DB0AE2B4A3B7929CFF6FA0A7AB48472513DCA AA20AD25160717BA26FCA6B98EF4F9E5E2991A1A63AAED616CD50E2F608B623079BE07684F1A 0C4BE18E6AFFBCED9F937BA7C2937573CF1EC64941D861D332D705C906AFFCB3F554510D47EF B15CEDB7194A77F74813F0D69E89F4D44B6838172AFAFEC90B8AD07C1F116EBF26617573197D A2C6E73A4CABF03739DA456139AB07A2A916B0CE07D36F0403D19FBA23CFE1EBE15A96BFE8FA 8AC80BAAA0F536B1518CF78462ABFF9727994E38869B3B4BCBAA6095DDB69EEE1CB93109D573 686D6EA1359F7D205E6B333CB564F07CFBBCA2A926B5CB6244B2E75C329E274351EA20E90B93 605656C01E248A09B323FD6A92F8C549C56511083307CD02B26DBC4EE2E1F892E1E168701738 A0078696B1B7BDB12E13AD151479348A0369BC3622F537B9E2B40FEF1517BBE969E0BCB3E44C 8813691433699F65F63AAEB5D2AA3A2B6EB6021661372F68B220F320C566A0F12C4663E35670 A5E5FCA80ED1BEA92063EE52C41FCD120DD5DBFCC015A895DD69682E546A678DF51E4EEC8159 D912AD90175785FCF3AA1378D435DCF166BC6FB01FE0EBD91FB2BC4F87C03D4CC352A0E7E160 32D2391E0FF3D7E4EFCA14A2EEBF4A0EB3908BBAD7581024FC4075F43DFB6FD780698201CFC7 7FD18BF35DA7B9DC24E0A284AAFAA1D428C30FC842538C27112C7A0F1DF3426384B89FBBF810 33FB4382C970F40186B40FE74FA6C087DBC4D8F035E61DBCC9DE86B5AA2F7ED05ED141BA09AF A745EC5C0E33CB58AD942C9F205401EB6BC4EB4B67E60E628E5CE33121C91CA8C6193A63FB2B 234D3AF8DA262D35AF2B6D75158CDD27EE543151DEBBD94A12846C8DCF68F44D8608AECABF1B 8CC787D3EAB5281D2C25F24AF29D003274C7A2D4F840E89778CD560C73558E0AE74B58266007 59884D153EE6A80049020A015222C53720650657C8150D6455860C4F74B35243EAD060CA03DF 07228DFF0E58873DAF398C43012B642AAB96382B253F5E62010AE56D7BE95081A911955B3B57 42B7E82A0F12E1C2E14A029A47EB986D08698E1155CA0AC06513739D67D9D706704CA07342C7 157E00121F2FE57BDA5097755699B814C0BB185B898D4B7F1EF9E0F60AF9208B79A7D29491B4 06FD1BB3746979C98B40317E9B3D27546CE36F4FEB6C646E7282C45BFD28136378E963983675 938D69C33B169399E9D52C520B8B53385E2655DB0C5B4231CC3089C82AA139AE11E21BCF2442 79D99AE426E81697973EAE196C47631863805EC34DD1B8151FB6C3D399842C0A896ED6D22057 59B950B38D64CEF9E8693FBE1DF9513ADEAFA4CCDA3DD268209B9B6D4C3B02E0094449AAB2BA C06C74715F5669D6CBC66A089619C4DB886BD7DD023C7597A0946D109FA90C3CF15EFC6981C8 1AAB3E1ACD5D8DE78539A1B557535874FC5BBB34569A36C386938A4C181A2FC4B1EBEA30E31F F4D5A18958F3379B298D5A1ED013BA01E342E59C4584073F73CCB6ED347321B420D8F3A7BA5F 6EE16890D30B7213A4DD25DC2B4BC4D35DDCAB1E7C239F774D374CAB41BBEF0795B4F417CAD6 3B6371A3E003661E19A7A55A90656AF1E8C358F848A51377B41F1D61C03457C54498E028EDD4 F49E4612E2AF95324F479F4D90275C28D4DD8A9A07F95F30A2CE6F65F97043222829D0207F64 0FF8CE6120912A6B46774F8A27BB3A63C3F176BE1F4ACF8F106752CC3BEEC9F167A652B998B4 5AA721316C9C036AC485B3AC2EA5DDB2C05536F5CDD21759FBF2B5909DD5FB2EF1CCD8F8F77F C6BB730A390C55B2F1AA91FC834EE6ADB2228057D77C164909C4EF4D1DF8E705F12328227EAB CA2D8D6A07ED17EFDB6E39FD430F1D92C71D11195658C8499AD2290CC3A63278B9BD7C04607C 154368E5FB29C4895D5D97AD707303ECC0228DFB8A6F5353B4EDD316B943333A20A2C8F25E20 D8085A70A6D1E104F6C936D5900D1F9D3A26917A196CA646DCDB0672C4E57F7510D724739CCC B528B310A6AFAEE98357B856DBAAF2AA4F55D155069B7FF12D74EC699F30C6A6925F59218404 A35C6372DD3FC399396FB340B398D44294C3BC04AFE671FC4294B38251D917DA574A608890E3 AE39A52F64F10117CD4CB62F30BD302BB907C13ADC0DE51B4CAEF248EEC85FC0CCABF7B3BF7F 22DBDE6500844ABC2A48C4EE9F25552FE19DE5828EE3ABED118AEA7BE6053F26001DEFAF954E 49370C5166D595B352085F6C8D135C2D54DD2B69CDB0D72156CDC0E7C7CF932DD86EF4EF9385 F6C7B48DBDEAB48C1E254445A3D409F2CE1D08A243A79BF9E05945BB4D1E5A20607CEDFB736C 8788A743342D9F25FCDA1067900EA04C8217F9D518CAEBF3FA67B8EAC09DB7698A84B10764AE C6A1F92EC6D28FE83A727108DA133611A684BDE9C2E0B51DBF732EA95CDA7B3EEEDAE973B3B9 5CCE5F9A7B0C5220975C9B24760BA9937DB8099A7D9CF5BB07CDADFD4484FA3745987342C046 60313980A8BE37130EA1125DE630B1A9C8B399BC8B1F97E36B60FD5E396094BBED215B206F20 7832F70811C61406A73B1B475B3C44B2EFB0EA320EAF62BC5890D4325E48DDDCF522364CC758 E7B2A0DE88C7929EA29640418F8C65CEB179042C18D031D03FAB34123E50613F66EDD1FC41FC 7F2B2464D91365150D2F392A8CE234873CE1469516FDE770FECC7C4ACAF346B90A53AACD8615 328B84FD52612867F542C72A0B67345E95E8F31D4D59486F90CE3FB16DE4C36CB24A5F1F336E 03BB91A35B17DD54DEC0E63D769A7201828F8508A6A10E417CCC85E5BD5A8E94D74BE6EB82D7 3DBBA81BF5086A8FF408FC5F041789D8F139FDD204090B99912034440A5FC115DEEDF52DC007 3897AD9E593377DC6E2E2A42231DBB6D76D2EC66F663CA71A2ACC39AC79389FA39E3F6CAED95 320469EE3CC06D759C4F083D138C99C3B1A922FCEEDB00EB25C23DC2122FAEAEA38169AF9553 8910AEBC2939403B1FE44CEDC947B9933C575E2E8CB3AE84569BD25BF40856882C2CD89B5324 D8471B9B47852795D24D796800518F8BC1C014D3FC3D5947F5DCA12C0FC62B6292C162329292 49FC4AC97CBEFB2D7C0AF39F7A353A8FD84430E9C6AD201329BF50ED38873355DB8521855622 B393F54C2E5C65127944827987934DD1380FBC4E75F96754314B0363E65773A07FC1C8A69742 7CA936A4FE2D850FF02EF16116B1155DF795F650BACEAB88A17873A2098AC58FB86D74BCDA9F 55F5C4F16C0CE60CF82F1A3EA3EC2EA9969F4CB82F34BFD9D125839F4F6010A3DF0ECEE7C9C3 6A9F479A71B1B5FF67FB5AA4BCFB7183B7F4DAC514A7D7AF7D42E3ADAB8DA4FFBF9865294373 8A6F3C4A83C092DD3D3A216191F20553495F4B84967CBB9FC4A93867238EB962591CCAF3CDE1 4E3346586E071765AD1CE394961CE62CC7D350AB460F259C892629E43A28D962706FF4BBA884 4218E92F5F44F3CEC43F859310A87B9784D7BBF5B3A1A2B6FED456A3DC66A0B9A4120CE4B939 3302C6C16F84498D9CABE442A8649B2726B606A789B07FF191FCCB9302A33E37C02D6D885558 3A1AC9EAC0403A516485BE7D2295147F1565DBB4D94CC99093DDFB28CE69F98CF8D32425554B 8BB12B6E422DA74F0A0EAE29E2CFED43C7B792D01536198078CC1B808CFB832C1B1CC4FC1AC5 7184A122CF4DE7B74A4CA514DDB4BBBF416A4DFAF58E1B13569D37B7E684678EBC8F0CA02D74 CC63DF94704523EE11EB3580A4A8A4FEB953ACF0B5675E3123FD9147CB2294C6128D0206F4E3 7DA2DF94B68FBFD67080FCB703634B7F3100B05BD65D6FB487A9129C0EAFB7B4D25D888695C9 4978F7E04F3C64216651AD4B7C87F78664B0AFF198E99927FB5574FFD13D2B912EF5A40CF66E 3C7A55BC3B45930417B82B8B954AE35211A8CDE6C7F87292F513E10FB9F0C64E5634575A08E5 3EDD811F27E114A7F608B227CAE54986AB8DE8E71B48CF448CF14BBEFAE7E03337DD85AFB08D F1BED43DDDB78A57DD3328B56FA5C846509A399EAEABE8F14B80484E271D9DA7AEA73DA0FFCA C4A977579043335AFAC4DFF4AAFC0A9DEEA7EB027CC331441CFB31BA8CF299F4A63C776F1CF0 2BF5065E1392538E9D4EBBF44743BB3E3BD11DF7A534231D803B82D940E78EE7F910994A290C F6775C846E8BE66D8033627A43BC73D7965037565F99BE1C2A758934328F33F7731DC43411F1 49746140DF097A178FC386AEB43E522F97C5DB8327C47FF97188BAF80DB26D8725041FDB34F6 2D116E24BD0B260BCA31D9611FD84B252A31DA6A7E2CEFC2A847F68A20A613466F5DD5179A8E 911F529C9A95C93451F07805CDFA2810830384219BBD83B0DA83666BBBA52D0E416C79D0FC7F CDA354E3E83CA7E0DA9B817C4AB29BC43A7A63ACCCC53B160200145E7173A0AD5B7F3C7E071D 04B958045691676EEC67D318BCAE3FD19716EADD10EAA20D0B578F39564516C0287F36755359 70FCCD8D2F1B610BC707D4B1B602B54012EA862EA24C1593DDA7B39D8710A03A126901ED2EF4 E8F72E198EA1DA8810F2484D90393930CFFCFD90EE4EAA1C1A09FA74EA71D824B7ABFBFC3710 A73E720F25704B21C67DDFC89F652D5F8F4FA209050076B23D80B24815F3393DBCFC2727A52A 74587BD189CDA73990B990CB0D1B32632F66DDF1CBDF41AA640C1C296DF79084802CFAF90024 87786A9EBCE3AC03D7495172EBB2786ED1492CCE5CCC23E0D5E4A786121F7B199C5C56A46FAA 17BE9D9C86AD24400AF371A25A1B9F12B0FDCEB108AD235864475C22AA6C9D0F61549EB8C5B4 5FA87657A1FDFA3BD6375C9D8F017178572FBE7EC02ECB1A91EEF15AAFF083F193BCB3CB2763 A5DC3099EFCAF81F2F5C4B1AEF2D1E3AB862C21DBB8BC89B0FBC88FE3436A8A1FE153B85E972 C6C5D8EE89DCF0523620CD7E510CA59BBE62D87790D56B2629EB5FB06120E5FA9824788E3029 FA450D2201B8CD12718F69B9B508D9AEE75D4354314D354906625EBB7C5ADAC87935479E7D48 1F665D3F3EEEA40A72FCD721A11D14E005F1059E8D58ACEBA7A2B8D194A65CC35A9B6DE2E3F8 EF279F2A632915DC4511FD90BE9697E80D177CB0BFA581EFB68A77387464E40F2A19B9743F2B 948419D3AF5D85D205F938F5D789EF7B54414D9097B8EBE86CC7D0F8BD8736021FAA2205680C A41E363024E92137FA7195194C27903D79209BE5DD0E029EB97ADD784CD5E5DF33DA0B6ECA60 C2A0071CA09536AF186E2D24C5DA9CD3CD0A42039F7B93A85A723EABE2F41E7309233EFDEE65 A7CFF0A6D2BFEEF83F67F50ACD8A67C1EAA556326DCDF624472160C746480655F145B60F4583 EF50AAEF66045000CD756C0F9391161EDA709F00F8FE77897B6F57D3EE01BD1722179B24FECE 4B5D79906B0AC63B6A8BABCB172A08558099AAAF9716E99CBCB7D957EC1BB06FCD2A4E935095 CCD915969E64BE6FDA20AEA8D09424832ACB86135202386E7F268854947590F72AC998EC03FD DCAB18FDDAC8BD1313AE0AF2402385CC693BADD6BBDE073CBD50CA243A3A76A1C05C38460F8C CD00EAC94B6833B51FCEE09AEDFED745CE221D54C1E78D9BD982268FD517F9E86572FB87E057 EA8F3E997B3404D800D7E5FB5AD46FEEBB2EB8B2D5AAEB900DB97DA8C4B68E761E0B11E5E4F2 5E4DC6A68B136B1713604AD9F2EE76FE37C9B6FE0CCF3AF880F80E18CE05F3F0D9E729FB8F81 901718FD95B50D8E2A21C8F11C69FC9BA0E24BE96A292A604CAE73E90B7E413A485D0B1F06E0 FE2A218CC25F5E7117C9BEDF0A5F31F300D02EDF8085FA23336C76D3415DBA2276ECC0AF1112 729BA1E2A312512746F8477B59B7DC4912A6CC59CDC63C8BB73C5DF9693FE79FEE97F33CF252 222AA9DC07A6BF8753C700FD6A52441C5D89AA64221F271D337D8C1C00B256F7D36D38B0B6B9 7F91D1B968D94ADB0AB8E5E27744149A69B1A435EB48E934113FAFDC2D80DF6E5C475A31BD7B 0A9ED6F01AD538E86781221AE821752502235E38CDEDB6FE154C3F1962B6A8BE3F0909C4DB82 166D03562C6FA7AC67088FE3152513C41C3DFD7B1A605D17FD46D25C93DC6BB204821EE602E9 088E8931D9D55A7F61DED150E9B88355F07382EC5063F74BB5A94EFC5656ACA98C3B724C58CB BB0D73AE6A1C536B1CE412B364E23D65CF6D640AC4F1EF335E3D7ADF4E0A692CD51A03E02868 9FAC28CC396159F1005D60E8328076A563B9A76CC48066D8C0D5EAEED0D498D2F8A273E0A02C 9AD2B88FCEE6ADB5085D4B357668EB1DA95C09FFA89A771DF4A4AC46483DE6FB88C43A4A4249 3069CE1E4198163B65A06F7EE69A3E0E384AE1B991D0B1294E3B899C83A21B150AA53DF69AC6 EBE03BB5A5DAA496EBBD83ECA8BD60734A1C3441109467D46600475CF9E6ED68A00147F57C45 713F547CE1BEF406689C2EE891A1762B9F4F4DDC8D9873B6C45C324176CC45D794A4840AC0AF 0FEE21356CEC5FC1AF49C0EE6DEF2298A5609C262F2F6023AD47E4E4F13D1FB00F6AF834894B 8B21DB93AD9B28AD7F3512636C5B0B2889A7594D65953D70BA7DC92372DE5FF92D7A06378CED 41FC3B9E6BCBCCD87431603936B3993B9A8AAABE931E510E609C50BF8BF7039F20A8BC41B616 99E04D8A2B094F8DBE45159ACA1C43BE629D0BC888B82818BF16C39A17787FED1604E63C4234 3014BED8B4EEEA3CB1700A8F0DA8883A104591AAF69DAB04ABB86FB93A3867BF79E013686497 B5F5368F32FBC16CD6BE856A0AB1A521E6A71734C5584820A29C0EC77CC57806817D66477571 7A4D29BCAC844307F6003C36E1F0FA5E14EE6DABA30D669361F4F9FD0ADD685822D63B00A6ED B055786F8A9B241D7D759231443BF8A503F6DE62439630CCA9B03128822A94479C825C8B5ADA 41C1482FB1A399A74575BD206CFBE4F48C19714805D7529CC7B269F183F20B93F67F016D32C4 D8A16BD1A967E770F21C552BB22703822DE6E1F27DC4621CF738A995FFC1D827A0C88BF23D76 3E2294E25821EFD55A996587A2C5BBE5449D10577DA83A201185B3348B61AD4BB4CB430DE81A BAE2E428DD656183B19A5D24D828019D3D75A6837A8E07C8B18942BF8CF635D39642F3887A42 EED168B7C1BBA6E3298F4BD3F3FE3A51318FD139F4E6B29D65981022FACC9749ADB61C3B0918 CE7309A0DA4339904C8F9FE4C731B7530D78C1337A5F857DE7A08A099396C6C89BF7C90E4816 F43780167A828AEDA66558CED0C0803FB30352584B4534C4ACCD77113D8B64D723CF946C6E22 C9CB33BA406946125EC1C2AEC94C972581EAFA36E8804147CEF312332951FD0237C8C6934D6E 5A365FB4B9D927834AF0D9B44E326D5A8872FFBE52E51BE9BC3C52E30D846BAC97C5EE0655F3 5C70205C0E35E62EBECCC390B99DD2F6CE93E69E24B94ED99683A00FB94CC1C0451A2857DCAD 432110E69D7E5E56AFBCBB769088AAB243574FCCDD31C5F96894505738F8396D69C645678653 ACE4183064E220C8828D02A565B906AD100CC99E4EFD036AD096AB3CB724053BEF8E42C22A8F 846B44744E4BDD5BFC1FF20553FDAAEB566B907F842ACB77698F5DCD47A6E783E09ED73E50FA B376B6CF8D1A9229ABF54653070C0B146BD217321D12D936F3AC91B21C4B3777451862640CFD 2394007FEC0DD83FB80656FF127C3D30D14D32C0F648B866F945DAA97191E6C5C2FD5FE98A7A 842FB4DCABA30033D30424251895112F94EFDA3468CC3225D4339F161AA62FEB3FE30C25D835 9301484E81B93B9F371A0AAC5FFB061C64E41DE77965CF128EADF74395F95022B46168603AED 96FEC807519E9F615D209941B0D3BB73E0231C5DBCC437F2E901FFB1E81760E71FB2F0262960 F00D99BFB0D95CC8CF2D8071B86F446513CC9FE2B5708752D61F8EF6A8A530B592A1C5B326C8 2D49380B585F96EF04318ADB8D237291608916D3977EF34282F440A3C53D12834B42523AA4D5 E5E4245B5F7D57609E14319C5B1203920C993BAF64F31F992A771950040A58EFD5E1DBB22F61 0A47529A82BA9644814F5E4996CA9DE92637EA5744598798379C8FA7B8B514C305B4B423D01B 11F3F9656C0E836D0195318C8D128F42EEB32A27A92BDEA8DD5790E75AB70EA6CA905B6BB746 609608D528D8912B8AE2573D3794A4B3DF1094313F467C39EB54BD787AA7F9D05B09F0F5E170 84C97B840D5F5FA804E27625BFD9A98AC0CDE8E040C9B7A405B50795D93223D3680D52A85A06 4CE06F5D79C879770E2BA425E1DCC72C53EEF5060556CF377BD2AA6FC9935C1E60A285760A08 062C1ED9F28EEFF65691021115F684EA4EB55ED5CB6ACC0CD71764B442BD4DF41D19252A6FF3 577D962A983F87E70A18EFC6E908AF810074FBBB5C79092FFD67EE261F46575938005510D051 6099F680EF73B67AA29BBCB355919D535891E13C174777F51A1A94BDB6D84EDF28ED16493E91 BDF93D0BE70707E64A533B6D758BA3C3AFE4770A3239C84E7CC83F0703A85DB43924A5E8E816 30969DCF05F9FE2BB5B6685A2147C9C865482B79EB609CA261246E7779F27354B87861DB881F 908F531007FF8454C647C282F7AD8D97F983299F8AE55B38BF92B2C78CD2438824BE5F103F41 9ACC5E6DBF109EC85294B13660F104240E1DED8A9417A40BB9B435C0B8270A275AD25F4222C4 5E4763D9A238E0AEF6DD39E05F8C75D0786D5D9B06D5D12F1CB77D89FADBB0C6731BD133C5AD ED590660926155F469833B48742C71B12C5B96634D496F5D541FACBAF153D15E8B50A69DAA98 2812A5EC4C0CFF2C6138F2EB005542C278B76EF71F3DBB090C26CE20779CD0EA3F208A33199B D287B38EB1A8BEAF87F1BC644F92DE45DB0070B71B9E5A1516066CF0C3F36716B9804FE1B54F EA3A5550C650277C84A969589574FD94996C88C42DE93D364398D30F53BD91574C8D84DDD133 D5CC74E1FD424BCDF89771C80D9B442FC851ADEB90E4F8331C56C5F8040C15450FC10A509D44 CD2E41EA5744AC578B2825CD7D30548E38C3DD95F635D42D1E7BFAD84887FF9DF30EC9A405EF D05F1070CDC5F49A6B24CBB15B61A9188F05B83C6E232A1D2FF04DE847E4883C5962D86BDAA3 AE8DB4FD04EE8420516858B7BBB8A5AB25C65824D953818146D42A61E3FE13C9ABBF7591DEB3 2A0BFA1C35F798F465575A122BF95394CFEC68C6A2CE552ED1B539CDF2BFDA675D4B8D020FCC 554DEB1B2A3A762D62A9E6039A444D14ABBC9D7D226A50F0CDB7DEF282B7F33E636FED0F7898 EC1BA042D8A688F196789CFE8FA2E579ACB825F82B99AD5B7AFB7BB3D2D7DFC460E302497430 B08B74B2745B66535EC1A22824349C2B5959E883ECAD7F386F453FA3C67183BB3F77C617529C CE3C84DA5A4182DE3111003E483EE8E4AE80E04950AD2E005BCF5BC76C2165071675798C39A3 1DF22253478F9642787E1CCB3012B6F4F7F4766E1D137B9281AF4BB908D5F5DC7D97F52268C8 4F68627DB3CAA835AE65912404E0066F87C72FD0D261F666F40916BE921410F4EDB4C4C260C4 76C29164EA84A69D98103C925C6765AF5787BA7DA78E4F725E6F251B558C1704A8EC97AE075E 82B804D1E6D17A492B6F5F0373813EDFAEC10DFB8761A838AE8105B28264BB956BEA7DD88411 D785FCD1212C3475750F2DF8461D2E7AF4A4D6C7745447297265AF6EEDA2403715757CE4A55C 5EEF3DAEF862108F1536751A75B2E670E139A749AEB914071B1F0546B50F73548C4627C1BD5D 0B88598FD9C6CDDB596FB0F704B0AEF0B0D4A3ABDCF1E5F3EABD32F153CB81BD53DAA7B30DE9 6913A3CE36B0DA00E2D944E3A18669A3394FE3EE84EF113E5C1D390EB2C972E7A14FF6A4B74C CA0C18BEF23B41C5FE0A6F1EE524717DA4E020B8462F7671B884CF6549EC78FBB73D4D0F20C9 CA058F287BE871401EBD2D60B62A30DF8568E27EFE7C7384261280E27A5B6F9ED870FA20EF3A 43719F7ABADF0404AF7959F2C46F8D7A124F88749334EAC1786B2B2319F1E87CB25CC44B72CE 435205C073602A0945F49EB0A8AE44EF4F80D7CEC09B7EAF5BF72AF3D011FC044C5D39C1948F 74F36F87E516AF3B9788E0BAF82BEF7B19A1FDC032FC4EA5759776B74E431DCE09032F184BFB 85BF3EC7D8B8189BA25E86F3FB83E3C39A71DD45F3ACB79050EE2785400F25E95E5C203D3867 06053A260BC12C64194F8E8C84FD8F43662CE5CE9E73FF6EBBACFC27CB05652BBEF89FB1A310 2B45982C97033EC7682018CC305A7209F2B17DD2B0D95D435D86E421E48B2DAECE31D67E21AF F6D751EAA27CC1C3A787B6DF26D7F3AD2460FC40BD0E331DBDB309FFB032E059A9989E9234B6 0B34AF417F42EA25A445BA13E05917EADC34A30D3C80910D5A17F2956F16805D64DBB2502674 C1836E3796349574A7FA76D910F0436C47AC476818A5146B825AD806ABDC65C14E99D4D3F0CC 34872EE0D26FED52B8316EE7E4C82AFA0C181E4899F9BC74EB1A2794CA366E8606ABFAC1E0A5 63E4DE05B7DD55A74853F64C107B9A7B4C57BCBE6F84FD4C306B005780AEDD8C530F5CC6A19A 82C478ED38EC0AF857D2C07CAC321F59EF827231B36FC0103EB8755EFF80A1D11D8916C1CB84 F06A6A457D50CB492CBF6F9BC0CB9C1C3F766182301801D005249AAD76A39DAD287D2A8D9E9A DE455FE966CE158FE1312E15AE287A7E45E33A6AAED9235D5DDE310514718AE2C84241858B3A A23BE5D4A583A3169D324FF7C0271542D3258DECDF1D85322EB397FC34E66875A825A5235FDB AC4B3E5CFF44C0AE631163A5BC2EF0B491DCEB5E2F4B45B2D3DF2402191A8726195B50559B16 8A6D2C6111A672397479E3374BD75B937BCE72491C754974A8DA5D6BEB79C1888CC6D3CD515B E3038E05AAE4ABD13581081ECC3D4971B68C31DA1AACB53A1896C76993074DAEF7ADACA07FEB 7C11424214D696294AAC53C9577D30EEF6CD382D9123AA78002CE0EBE7341AA66A09D1ABD3E1 7B5390FF02F35B59D36E09A3AA4BED531420133871C3E1520B8FF160AD01AD6DEA0B7900FE5D 128453C9F1B696A8CB9200C01CD391B7A11B75DD12D6FFD3F8F9D6FBE5B74DE1854A5C2062BE E3B885A507971BA112670477FCBB033E7D6833B1D37070756ED16DE3C1359F9E2E87E56A56B4 81F4C9AE915CA98278B92DE38DD4D21EA57EF33954252FB243ADA71F27B76E8680B20462A071 B210C700AD7362311217598989A3387B5306A322345FEB1B388413B26604A2FCFA080F38ACF5 7C4071AF926B30F9B2947826C00FAF800ECCDFDD9D42D10A5FDE30A22C8B28C284E39AFEC04F A8BB6CC6E3C109F18FD7B163F110BE7897F293E915CB212A4309465306634BAD1DEAD7FB35B6 A3834DA65CCBCDD5EC42D414D896B27419DFC949E65A475B5FAFC0BB04CACC57AC19077D9512 2AC246D53BFB41D8FE0F4AFC49C0E61BCFF1DEC8A30290E6B4FD09E156EAC5863E3944E4FC24 5557FAD3A468FB5C52F15BD8811957E719BE7079D74CC2FDAEF2BE6B193463BD07E2D5CA8FF0 586722D43F795C6F0B3EFFC8CC75D1B95531A4B9A04A15E7E8419A09F7576E8A62118B53E0A2 856B82FAE651384A3815F96E1F18A04FFB2A3B7AD3157D7494E92B7179B163D22115D9659F57 84E49CCEE254B1AB0D4D58CBF1672B5CCD0BFE474CDEC8CDFABB6D9AB65272A07EFD420F2C8F 97D744DCD2547ED5A2E21AE010B949A64CF9F6BCDA6168D891820FA0D084FE75D4AB3A126EFA B3EF1B6D14766DDE0D6788B8A6BF4652AE0B2D4E3E53550F92800D265B5E59568973411CFB51 21BBEBE648FA281B51F5CA6FCC42073AB15E966DCA424E4D37399C09C65094F32238D248CD7E C39F10103DE59436F45939FAF6CE81F84C1BAE0B9B733D96B43EC6145A93B850DEEBE1F8DAA0 BB4217211D66182AEA59B9006A0DC87F414FA61E52D97EA987AB412C73EE8A2983D83ECF6819 6057C4F0167704478592389B1B66D375E4581F223F91B78885F42BA3F81FD1B05F162F366194 CB003F9D1FA05ADF4B20197DEEB350662248E35AA50117B84A6AD26DDD6A6D950894B4737186 0AA3D107C3727147ACB6712BDF2C8059ED500D0CBB1169B1C5F9758DDB08CA84AD8EF23AA7CC 5F8C9D3BE1C95BF4A23E7A369A03AB88E8B2D95F62F71C0AB5819B3F5EB554A3E3E9C665997F 181CC3100053E1DA814311102FFA1E22474D9C762E5B880707D1C9A891F2E54536E28C3B4C1C 353457E594F14B53C0B8489C62EB19BE48E709E83D706BAE9DA2D443FD27203341840E9816B0 72C2941EC6FC5517D911A4B15349E89084210C5A03F9AACF80D054D339EC311F06068C2D0474 CEC2DB63B98EACAE17A4B2003990A40252F66AD4CEA5649780BE4365F204CA7B301AE6B38D5F A7EA6507DEB2973AACE8DF69C6A7C6F7E10AFB9E8C3EE4DC79D21AEEC9F35A0076ABD68FDACD D4AF9CB59E42A017A34CC1854D6E6C63C1AB970FDE4108B2B03CE2E460CEF471B7871778DF3F 00F21FAB5F64FCCEAB2053CB92391B204BE991B8E81C731121FE2AB5C99DFDCC9BFB161F9D92 D6C85832940D1FD9FF8EB232D97FDCB82973307C30C02BE64E8E91014A83B4E21A0BF591C3AC 16CD2A532D75030BD5753FC05C8832BC1CB6935CB8D344217291C59F17C9518515040F9B6EF8 743FE19C9CC266DDDA647F717DF4C2E3C38168E389E92FD307CB82EF4BA662C984402542E556 16818DC0B91BE3EF03FC2CA42111D3525631CC12E2F05CCB66FE27CBD4D774EEA2E4953967DA A2004A37ED7528272D8248B75F7A891A7D3A7C2D1E2F9305C164AA209EC6A5C2E32D2118946D 73C44C7863BB2E98C41F0E460306D47FB7B7225090BD37BD27ADBF282C74277B1D93047AA72A 6F7FEAC9245957C17A7120BD76347641C9571C89A9E560FDAEDFF1DA48B475D5D24B1F08B836 EA514174929FF34F718EAE5DE79B72C53B690D59A97CC1542B7D1B08D8D83832CA58058A46EE 406C12F1DFF6310C31FB511F2CB74EC69CDE66DD86CBD15B81D79A27586495D7F9CF0057D4BD A10C5E8641A0CE52994D480132064C9219662092D9F6A9E48B64AFBAF589FFF6C15A396BF1DC 1C4131C51CD5E4111761D133D5CC74D32D6FDABA8AE520E9034DE4BB7D14E723957B8D205356 8414874640CCB017E17F7434C60674191DF8B6121398B57CF8EECC06BB8D4C6D0585E623AD56 574EB659AA32FB9DED14F44E8DF26A35C3A287927C012FE1F533B551223BD6C2C783D15C1D00 CE552D6C2DBAC9402352DD3E63851E7C947BD1C224C6D86E1E81EE2275D813F8837E2D7C85BD D39B64CD21A3AEC008A928540926BAD821622ACC7E667817D27846ABBDF2329947B3B1451D3A 224ACE1AECAA8624E1C178671A2BD6C2E5427CF3B14657E5FB89488D781EC26DBC41515C3E11 2D39DB843023D0B95B250DFE6E08DBDA63A5BCDF232BA8E2E2CEB9EDAFFA420E9B36D586F38A E859149C4FC64581ADE1E60AA9F6DC7ACFEC0C6CB37C726D2ACE521DA680D177E4B443553303 E7FB337416B37B0301381FAFD86E96B0F386910E21628A8B6CCEF4535EB67F1D544649756E88 2F3C6D94181EE7A3003A5DFD8D587009219AF54CB11FBD0E5C8D75DC77336A5D96454B7A479E 5DDCA8096C927394977AB86DF8B548598A37AC2D3018FC071A92C613E6DD2E9B68004F72A054 32A32EA41599F4D307C8020FB456090A95B16B48809BE99575FD59577581F6141773733F9085 4BF379D17710EDE8FCADF2F6FFF4DCC9C1A2F824C81C7A49375268256CE1D248E465193B4981 A1084E9A74E0551A372D81E0B81B374BC127B6F042C79AA66F1182DB177E43F7558C8343DB75 F664AB67470915C7E83B7329F404A02356408358EFA4FDF95F35B4CD71A601AF7025286B6750 1B0B52B24B1D5C877C5A305C30B0031C2395B283B43584693347BD772DE25EC75EC5D5F8F906 E70AD2C894A4A2FCE31EC103EA816B6E0D2EEADF29DABF409018FD022D06329B67AE368F4666 6D668E27FD12F1F405CCB78E44288788D745DC1FB616AD7E287F3FCCAA6F31F41C3C78599604 9827964F1D174DDFBBA4633CBAFC7871046A9F038B880A643FED8DCD2A734C1AC1AE2F0FCCAA AC4E54C5CE9CC183D5A4B42C5EA3BFBED3A0E8A6042297F07D706F6589FA03C952E22180C6DD F40A5180A364785EBB503CAF26BC9B5B903B54950E26B96EA32619C48167B75672E86AF48665 811D7210EB94C0AE00751EF9F1E4C8281D19D3834F93712D5DAD75D84BCA0344D8DBCCF0FA0A 5602DCAA1F318F5A386A033EEB737F7B12D5CE74A271E6A8240D34F5DEDDFD9E743A935ED7D6 FB8AF9C534304637EA9C6BB19D64C668FCC5EDD67FD17FD085AD378ABA944FAC474C42A79B37 54C0F156198312E03E4C5171CDC18F36837E5B6CB6C1C756C0761E58BB9A98D65226713823E8 3AEA3E5D23B23E4D9138BBC7EEB415F987FDBD31250043683C74C3EDFF93096A6AAA8C74046D 527FF78F997E83DCAE549ED6F1E644E94616146289E360AEE1EB5BFDE543885636E8CB325AA2 551250352C0772EB7DC08AC6E34B2FC3AB29A0984FA556A2CBF0D9A4B20BD194FE62292FEA21 0E56C8ABDF011998F227443EE95020112395A946AFD1DBB7BD9740E984D3A8A25D9B0D114C76 48DBB8473AEAE164CAD81C01962A55C6C498E04035A608EF63D681CB278189947A77F64D4D26 AB24AC70F22BFCBD40817738507D58D8D006EF8475F202B9BA9CAD05E3C2A7A1F254B6F07BCA 0025FE2F3F0938ADBD4F787EF4DCD64DBB55EEC6D07B19EEF40402BEF4A854A8812999F9F698 3997ADF6A6258974436162D7CAEBEB8F7823F02A0A9A5F7DE3393084A98A47C9BC6B00E0A73B 08B2713510A5371A93F5591AEC5E3537936417F90F37DA6166162A71E3603174A5A0311F1E52 D204F96EE2F9DB1CC6601F4989A5D1F195461DDF2D7C60E243A670A2D0418B35AA467486494D 4A3A0BBEAFB175F386CC02A2232B72A246832872A7A0E3DEC96B804269C2BEAFFFFB66B9C456 76894F0FD8D28B2D9FDB118CE8E940AA3C292672BC8427120000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginProcSet: texps.pro TeXDict begin /rf{findfont dup length 1 add dict begin{1 index /FID ne 2 index /UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics exch def dict begin Encoding{exch dup type /integertype ne{pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def} ifelse}forall Metrics /Metrics currentdict end def[2 index currentdict end definefont 3 -1 roll makefont /setfont load]cvx def}def /ObliqueSlant{dup sin S cos div neg}B /SlantFont{4 index mul add}def /ExtendFont{3 -1 roll mul exch}def /ReEncodeFont{/Encoding exch def}def end %%EndProcSet TeXDict begin 40258431 52099146 1000 600 600 () @start /Fa 180[38 1[18 1[38 5[38 65[{}4 53.333282 /Times-Roman rf /Fb 136[40 1[40 40 40 40 1[40 40 40 40 3[40 40 1[40 40 1[40 1[40 38[40 10[40 40 46[{}18 66.666664 /Courier rf /Fc 47[59 33[33 52[29 29 44 29 33 18 26 26 1[33 33 33 48 18 29 18 18 33 33 18 29 33 29 33 33 9[55 2[37 33 2[41 48 44 55 37 1[29 22 1[48 41 41 48 44 1[41 6[22 33 2[33 1[33 33 33 33 1[18 1[22 5[22 39[{}52 66.666664 /Times-Italic rf /Fd 69[29 8[33 2[37 3[29 47[29 33 33 48 33 33 18 26 22 33 33 33 33 52 18 33 18 18 33 33 22 29 33 29 33 29 22 2[22 1[22 3[63 48 48 41 37 44 1[37 48 48 59 41 48 26 22 48 48 37 41 48 44 44 48 5[18 18 33 33 33 33 33 33 33 33 33 33 18 17 22 17 37 1[22 22 22 39[{}75 66.666664 /Times-Roman rf /Fe 144[45 1[45 45 8[45 1[45 97[{}5 75.000000 /Courier rf /Ff 133[31 2[55 1[39 23 31 23 2[39 39 1[20 35 1[20 39 1[23 35 39 31 39 35 97[{EKAEncoding ReEncodeFont}18 70.833336 /Syntax-Bold rf /Fg 3 107 df<000E0000000E0000000E0000000E0000 000E0000000E0000000E0000600E00C0F80E03E0FC0E07E0FE0E0FE03F8E3F800FCE7E00 03FFF80000FFE000003F8000003F800000FFE00003FFF8000FCE7E003F8E3F80FE0E0FE0 FC0E07E0F80E03E0600E00C0000E0000000E0000000E0000000E0000000E0000000E0000 000E00001B207BA226>3 D<003FE00000FFF80003FFFE0007FFFF000FFFFF801FFFFFC0 3FFFFFE03FFFFFE07FFFFFF07FFFFFF07FFFFFF0FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF8 FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF87FFFFFF07FFFFFF07FFFFFF03FFFFFE03FFFFFE0 1FFFFFC00FFFFF8007FFFF0003FFFE0000FFF800003FE0001D1E7CA126>15 D<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F060044B78B715>106 D E /Fh 28[42 104[31 35 35 55 35 39 23 27 23 39 39 39 39 59 20 35 1[20 39 35 23 35 39 31 39 35 3[23 1[23 3[71 1[51 39 35 43 1[39 3[35 2[20 1[51 35 2[47 1[47 3[42 1[20 11[31 20 1[20 42 1[23 23 20 4[39 21[39 12[{EKAEncoding ReEncodeFont}51 70.833336 /Syntax-Italic rf /Fi 134[33 33 3[22 26 29 1[37 33 37 55 18 2[18 3[29 1[29 1[33 12[44 3[41 52 9[44 48 48 67[{}20 66.666664 /Times-Bold rf /Fj 26[42 42 42 31 23 23 101[31 35 35 55 35 39 23 27 23 39 39 39 39 59 16 35 16 16 39 39 23 35 39 31 39 35 3[23 39 23 2[43 71 47 51 39 35 43 1[39 59 51 67 35 43 1[20 51 51 35 35 51 47 39 47 3[42 1[20 20 3[39 39 39 1[39 39 39 31 1[27 20 42 39 23 23 1[51 71 1[39 39 24 19[39 39 12[{EKAEncoding ReEncodeFont}80 70.833336 /Syntax-Roman rf /Fk 81[37 51[29 1[33 50 1[37 21 29 29 1[37 37 37 54 21 2[21 37 37 21 33 37 33 37 37 26[46 11[25 11[19 46[{}25 75.000000 /Times-Italic rf /Fl 180[43 1[20 1[43 5[43 65[{}4 59.999973 /Times-Roman rf /Fm 47[75 21[33 10[42 42 3[33 47[33 37 37 54 37 37 21 29 25 37 37 37 37 58 21 37 21 21 37 37 25 33 37 33 37 33 25 2[25 1[25 3[71 54 54 46 42 50 1[42 54 54 66 46 54 29 25 54 54 42 46 54 50 50 54 5[21 21 37 37 37 37 37 37 37 37 37 37 21 19 25 19 42 1[25 25 25 39[{}76 75.000000 /Times-Roman rf /Fn 133[41 46 46 66 46 51 30 36 41 1[51 46 51 76 25 51 1[25 51 46 30 41 51 41 51 46 9[91 1[66 1[51 66 1[56 71 5[36 3[61 66 66 1[66 6[30 1[46 46 46 46 46 46 46 46 2[23 30 45[{}46 91.666664 /Times-Bold rf /Fo 138[55 55 55 55 3[55 55 55 2[55 1[55 1[55 55 55 34[55 17[55 46[{}14 91.666664 /Courier rf /Fp 134[46 1[66 1[46 25 36 30 1[46 46 46 71 25 2[25 1[46 30 41 46 41 46 41 11[66 56 51 61 4[81 56 2[30 3[56 66 61 1[66 7[46 5[46 46 46 46 1[23 1[23 44[{}37 91.666664 /Times-Roman rf /Fq 139[39 45 52 1[65 58 65 97 32 2[32 1[58 1[52 65 52 1[58 23[45 73[{}15 116.666672 /Times-Bold rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 334 228 a Fq(Incor)o(porating)27 b(application)i(semantics)f (and)g(contr)n(ol)h(into)f(compilation)1615 453 y Fp(Da)o(wson)20 b(R.)j(Engler)1209 566 y(M.I.T)-7 b(.)23 b(Laboratory)f(for)h(Computer) f(Science)1388 679 y(Cambridge,)g(MA)h(02139,)e(U.S.A)1457 792 y Fo(engler@lcs.mit.edu)0 1428 y Fn(Abstract)0 1588 y Fm(Programmers)32 b(ha)o(v)o(e)f(traditionally)g(been)h(passi)n(v)o (e)g(users)g(of)f(com-)0 1671 y(pilers,)f(rather)f(than)g(acti)n(v)o(e) g(e)o(xploiters)g(of)f(their)g(transformational)0 1754 y(abilities.)60 b(This)30 b(paper)h(presents)g(M)p Fl(A)n(GIK)p Fm(,)h(a)f(system)f(that)g(allo)n(ws)0 1837 y(programmers)19 b(to)f(easily)g(and)h(modularly)g(incorporate)g(application-)0 1920 y(speci\256c)g(e)o(xtensions)h(into)f(the)g(compilation)h (process.)112 2003 y(The)f(M)p Fl(A)n(GIK)h Fm(system)g(gi)n(v)o(es)g (programmers)g(tw)o(o)g(signi\256cant)f(ca-)0 2086 y(pabilities.)60 b(First,)31 b(it)e(pro)o(vides)i(mechanisms)h(that)d(implementors)0 2169 y(can)19 b(use)g(to)g(incorporate)h(application)g(semantics)f (into)g(compilation,)0 2253 y(thereby)32 b(enabling)g(both)g (optimizations)g(and)g(semantic)g(checking)0 2336 y(impossible)24 b(by)h(other)f(means.)42 b(Second,)26 b(since)e(e)o(xtensions)h(are)e (in-)0 2419 y(v)o(ok)o(ed)14 b(during)g(the)f(translation)g(from)g (source)h(to)f(machine)h(code,)g(code)0 2502 y(transformations)24 b(\(such)g(as)f(softw)o(are)g(f)o(ault)h(isolation)f([14]\))g(can)h(be) 0 2585 y(performed)e(with)f(full)g(access)h(to)f(the)g(symbol)h(and)g (data)g(\257o)n(w)f(infor)o(-)0 2668 y(mation)26 b(a)o(v)n(ailable)h (to)f(the)g(compiler)g(proper)m(,)j(allo)n(wing)d(them)h(both)0 2751 y(to)c(e)o(xploit)h(source)g(semantics)g(and)g(to)g(ha)o(v)o(e)f (their)g(transformations)0 2834 y(\(automatically\))c(optimized)h(as)f (an)o(y)g(other)g(code.)0 3064 y Fn(1)91 b(Intr)n(oduction)0 3225 y Fm(This)16 b(paper)h(presents)f(M)p Fl(A)n(GIK)p Fm(,)h(a)f(system)g(that)g(can)h(be)g(used)f(to)g(incor)o(-)0 3308 y(porate)e(both)g(application)g(semantics)g(and)g(control)g(into)g (compilation.)0 3391 y(M)p Fl(A)n(GIK)g Fm(is)f(moti)n(v)n(ated)h(by)g (tw)o(o)g(sets)f(of)g(insights.)26 b(First,)13 b(programmer)o(-)0 3474 y(de\256ned)j(data)f(structures)h(and)g(functions)g(de\256ne)f(a)h (semantically)f(rich)0 3557 y(\(albeit)28 b(syntactically)h(poor\))g (language,)j(b)o(uilt)c(on)h(top)f(of)h(the)f(lan-)0 3640 y(guage)j(the)g(programmer)g(uses)g(to)f(de\256ne)g(them.)61 b(Unfortunately)-5 b(,)0 3723 y(these)26 b Fk(meta)f(langua)o(g)o(es)j Fm(ha)o(v)o(e)d(not)h(had)g(optimizers:)40 b(optimization)0 3806 y(occurs)30 b(at)f(the)g(lo)n(wer)o(-le)n(v)o(el)g(of)g(the)g (programming)i(language,)h(b)o(ut)0 3889 y(not)25 b(at)f(the)h(high-le) n(v)o(el)g(de\256ned)g(by)g(their)f(interf)o(ace.)45 b(Our)24 b(belief)h(is)0 3972 y(that)j(since)h(high-le)n(v)o(el)g (operations)g(are)f(hea)o(vy-weight)h(\(e.g.,)h(the)o(y)0 4055 y(deal)g(with)g(\256le)f(I/O,)h(windo)n(w)g(manipulations,)k (transactions,)f(and)0 4138 y(thread)19 b(creation\),)f(optimizations)i (which)e(understand)i(their)f(seman-)0 4221 y(tics)k(of)n(fer)h(the)f (hope)i(of)f(signi\256cant)f(speed)i(impro)o(v)o(ements,)g(poten-)0 4304 y(tially)14 b(e)o(xceeding)j(the)e(impact)g(of)g(all)g(other)g (compiler)h(optimizations.)0 4387 y(Second,)23 b(programming)h(has)f (historically)f(been)h(passi)n(v)o(e:)34 b(with)22 b(the)0 4470 y(e)o(xception)d(of)g(restricted)f(local)g(code)h(transformations) g(pro)o(vided)h(by)0 4553 y(macro)14 b(systems,)g(programmers)h(are)e (limited)g(to)g(writing)g(code,)i(while)0 4636 y(the)j(po)n(wer)h(to)g (transform)f(the)h(code)g(has)f(been)i(reserv)o(ed)f(for)f(compil-)0 4719 y(ers.)37 b(Our)22 b(belief)g(is)g(that)g(gi)n(ving)h(programmers) g(safe,)g(ready)g(access)0 4802 y(to)16 b(the)g(compilation)h(process)f (will)f(signi\256cantly)i(impro)o(v)o(e)f(the)g(scope)0 4885 y(of)j(programmer)h(capabilities.)112 4968 y(The)33 b(M)p Fl(A)n(GIK)f Fm(system)h(has)g(been)h(b)o(uilt)e(to)g(test)h (these)f(beliefs.)0 5051 y(M)p Fl(A)n(GIK)25 b Fm(pro)o(vides)h(a)f (simple,)h(modular)g(mechanism)g(for)f(program-)0 5134 y(mers)k(to)g(dynamically)h(incorporate)g(e)o(xtensions)h(into)e(the)g (M)p Fl(A)n(GIK)0 5217 y Fm(compiler)l(.)d(User)13 b(e)o(xtensions,)j (written)e(in)g(ANSI)f(C,)g(are)h(dynamically)0 5300 y(link)o(ed)24 b(into)g(M)p Fl(A)n(GIK)g Fm(during)g(compilation.)42 b(Extensions)25 b(are)e(gi)n(v)o(en)2050 1428 y(access)f(to)g(M)p Fl(A)n(GIK)p Fm(')l(s)g(intermediate)g(representation)h(\(IR\))e (through)i(a)2050 1511 y(set)i(of)g(interf)o(aces)h(that)f(allo)n(w)h (them)f(to)h(easily)f(create,)i(delete,)g(and)2050 1594 y(augment)k(IR)f(at)g(compile)h(time.)60 b(Both)31 b(this)f(IR)f(and)i (M)p Fl(A)n(GIK)g Fm(are)2050 1677 y(b)o(uilt)22 b(on)h(top)g(of)g(the) g Fj(lcc)g Fm(compiler)h([3],)f(which)g(is)g(used)g(to)g(compile)2050 1760 y(the)k(source)i(language)g(\(ANSI)e(C\).)g(The)h(control)g(M)p Fl(A)n(GIK)g Fm(gi)n(v)o(es)g(to)2050 1843 y(programmers)d(enables)g(a) f(broad)h(class)f(of)g(optimization)g(and)h(code)2050 1926 y(transformations.)37 b(This)22 b(paper)h(presents)g(ten)f(such)h (e)o(xtensions)g(and)2050 2009 y(sk)o(etches)d(of)f(man)o(y)g(more.) 2162 2092 y(This)11 b(paper)g(concentrates)g(on)g(tw)o(o)g(abilities)g (pro)o(vided)g(by)h(M)p Fl(A)n(GIK)p Fm(.)2050 2175 y(First,)23 b(it)h(pro)o(vides)h(a)e(w)o(ay)i(for)f(implementors)g(to)g(include)h (domain-)2050 2258 y(speci\256c)20 b(semantics)g(into)g(compilation.)31 b(Using)20 b(this)g(ability)-5 b(,)20 b(imple-)2050 2341 y(mentors)29 b(can)h(b)o(uild)e(both)i(interf)o(ace)f(optimizers)h (\(for)e(speed\))i(and)2050 2424 y(interf)o(ace)g(check)o(ers)h(\(for)f (safety\).)60 b(Interf)o(ace)30 b(optimizers)h(e)o(xploit)2050 2507 y(application-speci\256c)18 b(kno)n(wledge)g(in)f(order)h(to)f (obtain)g(performance)2050 2590 y(impro)o(v)o(ements.)27 b(Such)17 b(optimizers)f(are)h(applicable)g(to)g(a)f(wide)h(range)2050 2673 y(of)24 b(interf)o(aces:)39 b(\252bignums\272,)28 b(message)d(passing)h(and)f(I/O)f(libraries,)2050 2756 y(math)c(libraries,)h(matrix)f(transformations)i(for)e(graphics,)i(e)n (v)o(en)f(sim-)2050 2839 y(ple)d(queue)i(operations.)27 b(From)18 b(a)h(compiler)f(perspecti)n(v)o(e)i(this)e(ability)2050 2922 y(is)g(useful)h(in)f(an)o(y)h(situation)g(where)g(pro)o(viding)h (a)e(compiler)h(\252b)o(uiltin\272)2050 3005 y(w)o(ould)27 b(allo)n(w)g(more)g(aggressi)n(v)o(e)h(optimization.)51 b(From)27 b(an)g(imple-)2050 3088 y(mentor)16 b(perspecti)n(v)o(e)h (the)o(y)f(are)g(useful)h(in)f(situations)g(where)g(an)h(inter)o(-)2050 3171 y(f)o(ace)24 b(implementor)g(could)g(look)h(at)e(a)h(call)f(or)h (sequence)h(of)e(calls)h(to)2050 3254 y(his)c(implementation)h(and)g (craft)g(specialized)g(call\(s\))f(that)g(e)o(xploited)2050 3337 y(local)h(uses.)36 b(F)o(or)22 b(e)o(xample,)h(a)e(\256le)h (system)g(implementor)g(can)g(write)2050 3421 y(a)g(optimizer)h(that)g (e)o(xploits)g(kno)n(wledge)i(of)e(\256le)f(system)h(operations)2050 3504 y(to)g(perform)h(optimizations)g(such)g(as)f(hiding)h(disk)g (latenc)o(y)f(by)h(both)2050 3587 y(inserting)c(disk)h(block)g (prefetching)h(commands,)g(and)f(transforming)2050 3670 y(synchronous)27 b(\256le)e(I/O)g(operations)h(into)f(asynchronous)j (ones.)47 b(In-)2050 3753 y(terf)o(ace)16 b(check)o(ers)h(use)f (application-speci\256c)h(kno)n(wledge)h(to)e(enforce)2050 3836 y(stricter)22 b(semantic)i(checks.)40 b(F)o(or)23 b(e)o(xample,)h(by)g(requiring)g(that)f(sys-)2050 3919 y(tem)f(call)g(error)h(codes)h(be)f(check)o(ed)h(\(or)f(inserting)g (such)g(checks\))h(or)2050 4002 y(by)19 b(ensuring)h(that)f(assertion)g (conditions)h(do)g(not)f(ha)o(v)o(e)g(side)g(ef)n(fects.)2162 4085 y(The)h(second)h(main)g(ability)f(M)p Fl(A)n(GIK)g Fm(pro)o(vides)h(is)f(an)g(easy)-5 b(,)21 b(mod-)2050 4168 y(ular)j(w)o(ay)h(to)g(do)g(general)h(code)f(transformations)h (with)e(full)g(access)2050 4251 y(to)17 b(source)i(information.)27 b(Using)18 b(this)f(ability)-5 b(,)18 b(programmers)h(can)f(in-)2050 4334 y(strument)j(code,)h(augment)g(it)e(\(e.g.,)h(by)g(introducing)i (softw)o(are)e(f)o(ault)2050 4417 y(isolation)26 b(code)g([14)q(])f(or) h(garbage)g(collection)h(reference)f(counters\))2050 4500 y(or)i(enforce)g(in)m(v)n(ariants)h(about)g(it)e(\(e.g.,)j(that)e (no)g(pointer)h(casts)f(are)2050 4583 y(allo)n(wed\).)43 b(Unlik)o(e)24 b(object)h(code)g(modi\256ers)f(such)h(as)g(A)-8 b(T)o(OM)23 b([11],)2050 4666 y(M)p Fl(A)n(GIK)d Fm(clients)g(are)g (tightly)g(inte)o(grated)g(with)g(the)g(source)h(compiler)l(.)2050 4749 y(Performing)i(transformations)g(during)h(the)f(translation)g (from)g(high-)2050 4832 y(le)n(v)o(el)15 b(source)h(language)h(to)f (machine)g(code)h(has)f(tw)o(o)f(important)h(char)o(-)2050 4915 y(acteristics.)53 b(First,)29 b(it)e(pro)o(vides)i(access)g(to)f (the)g(full)f(semantics)i(of)2050 4998 y(the)22 b(high-le)n(v)o(el)h (language,)h(information)f(that)f(source)h(transformers)2050 5081 y(can)h(e)o(xploit)g(\(or)g(require\))g(during)g(code)h (transformation.)42 b(Second,)2050 5164 y(the)17 b(IR)g(produced)i (from)e(these)g(user)h(transformations)g(is)e(a)i(\256rst)e(class)2050 5247 y(citizen,)23 b(optimized)h(no)g(dif)n(ferently)f(than)h(the)f(IR) f(produced)j(by)f(the)2050 5330 y(compiler)15 b(itself.)25 b(As)15 b(a)g(result,)g(the)g(compiler)g(optimizes)h(these)f(trans-)p eop %%Page: 2 2 2 1 bop 0 83 a Fm(formations)19 b(as)g(it)g(w)o(ould)g(an)o(y)h(other)f (code.)112 166 y(This)29 b(paper)h(is)f(or)o(ganized)h(as)g(follo)n (ws:)47 b(Section)30 b(2)f(discusses)0 249 y(related)24 b(w)o(ork.)43 b(Section)24 b(3)h(pro)o(vides)g(an)f(o)o(v)o(ervie)n(w)h (of)f(the)g(system.)0 332 y(Section)12 b(4)g(pro)o(vides)g(tw)o(o)g(e)o (xamples)g(of)g(incorporating)h(user)o(-le)n(v)o(el)f(se-)0 415 y(mantics)19 b(into)h(optimization,)f(while)g(Section)g(5)g (presents)h(tw)o(o)f(trans-)0 498 y(formations)14 b(that)f(e)o(xploit)h (the)g(information)g(a)o(v)n(ailable)g(at)f(source)h(le)n(v)o(el)0 581 y(to)24 b(augment)h(the)f(code.)42 b(Section)24 b(6)g(presents)g (further)g(e)o(xamples)h(of)0 664 y(ho)n(w)12 b(to)g(use)g(e)o (xtensible)g(compilation,)18 b(Section)12 b(7)g(discusses)g(issues)g (in)0 747 y(the)j(current)h(system)f(and)h(directions)g(for)f(future)g (w)o(ork)h(and)g(Section)f(8)0 830 y(concludes.)0 1061 y Fn(2)91 b(Related)22 b(W)-7 b(ork)0 1221 y Fm(Examples)16 b(of)f(including)h(application-le)n(v)o(el)g(information)g(into)f(com-) 0 1304 y(pilation)j(are)h(compiler)o(-directed)g(prefetching)g(and)g (management)h(of)0 1387 y(I/O)d([9])h(and)g(P)o(araSoft')l(s)f (Insure++)h([8)q(],)f(which)h(can)g(check)h(for)f(Unix)0 1470 y(system)e(call)g(errors)g(\(similar)f(to)h(the)g(M)p Fl(A)n(GIK)h Fm(check)o(er)g(sho)n(wn)g(in)f(Fig-)0 1553 y(ure)j(2\).)26 b(Using)19 b(a)f(M)p Fl(A)n(GIK)p Fm(-based)i (approach,)g(systems)e(such)h(as)g(these)0 1636 y(could)h(be)f(b)o (uilt)f(without)h(compiler)g(modi\256cations.)112 1719 y(W)-6 b(e)15 b(compare)i(M)p Fl(A)n(GIK)f Fm(to)g(macro)g(systems,)h (semantic-based)g(op-)0 1802 y(timizers,)h(e)o(xtensible)i(compilers,)f (and)g(object)h(code)f(modi\256ers.)112 1885 y(Macro)30 b(systems)g(are)g(the)g(most)f(v)o(enerable)i(instance)f(of)g(user)o(-) 0 1968 y(le)n(v)o(el)22 b(code)g(transformers.)36 b(An)21 b(adv)n(antage)j(of)d(such)i(systems)f(\(Lisp)0 2051 y(is)g(a)g(good)h(e)o(xample\))f(o)o(v)o(er)h(M)p Fl(A)n(GIK)f Fm(is)g(their)f(tight)h(inte)o(gration)h(with)0 2134 y(the)f(source)g(language)h(\320)e(e)o(xtensions)h(are)g(typically)g (written)f(in)g(the)0 2217 y(same)28 b(language)g(and)g(style)g(as)f (the)g(rest)g(of)h(the)f(application.)53 b(The)0 2300 y(main)31 b(adv)n(antage)i(M)p Fl(A)n(GIK)f Fm(pro)o(vides)g(is)f(po)n (wer)l(.)64 b(Macro)32 b(systems)0 2383 y(such)c(as)e(W)-6 b(eise)27 b(and)g(Cre)n(w')l(s)f(recent)h(w)o(ork)h([16])f(are)g (restricted)f(to)0 2467 y(f)o(airly)16 b(localized)h(code)g (transformations,)g(while)g(M)p Fl(A)n(GIK)f Fm(e)o(xtensions)0 2550 y(can)c(perform)g(global)g(transformations)g(across)g(man)o(y)g (interf)o(ace)g(calls,)0 2633 y(using)j(symbol)h(table)f(and)g(\257o)n (w)g(graph)g(information)h(pro)o(vided)g(by)f(the)0 2716 y(compiler)l(.)112 2799 y(Mark)30 b(V)-8 b(ande)n(v)o(oorde)31 b(and)f(John)g(Guttag)g([12)q(,)e(13)q(])h(describe)h(a)0 2882 y(system)k(that)g(pro)o(vides)h(programmers)g(with)f(a)g(safe)g(w) o(ay)h(to)f(im-)0 2965 y(part)c(some)g(classes)h(of)f(semantic)g (information)h(to)e(the)h(optimizer)l(.)0 3048 y(User)o(-le)n(v)o(el)d (speci\256cations)i(for)f(a)f(restricted)h(functional)h(language)0 3131 y(are)g(consumed)j(by)e(a)f(theorem)h(pro)o(v)o(er)g(that)f (optimizes)h(based)h(on)0 3214 y(the)23 b(speci\256c)f(situation)h(in)g (which)g(function)g(calls)f(are)h(used.)39 b(While)0 3297 y(their)16 b(system)g(is)f(more)h(automatic)h(than)f(M)p Fl(A)n(GIK)p Fm(,)g(it)g(is)f(less)h(po)n(werful.)0 3380 y(F)o(or)h(instance,)h(M)p Fl(A)n(GIK)f Fm(gi)n(v)o(es)h(programmers)g (the)g(ability)f(to)g(perform)0 3463 y(optimizations)i(that)g(appear)g (dif)n(\256cult)f(to)h(e)o(xpress)g(as)g(speci\256cations.)0 3546 y(The)29 b(cost)h(of)f(this)g(po)n(wer)g(is)g(that)g(M)p Fl(A)n(GIK)h Fm(more)f(dif)n(\256cult)g(to)g(use.)0 3629 y(Further)15 b(practical)h(e)o(xperience)h(is)e(needed)i(to)f (determine)g(if)f(M)p Fl(A)n(GIK)p Fm(')l(s)0 3712 y(added)20 b(po)n(wer)g(is)e(w)o(orth)h(this)g(cost.)112 3795 y(M)p Fl(A)n(GIK)27 b Fm(follo)n(ws)f(in)h(the)f(footsteps)h(of)g(the)f(Atom) g(object)h(code)0 3878 y(modi\256cation)k(system)f([11)q(])f (\(foreshado)n(wed)j(by)f(the)f(object)g(code)0 3961 y(modi\256ers)c(of)g(W)-6 b(all)25 b([15])h(and)g(Sri)n(v)n(asta)o(v)n (a)g(and)g(W)-6 b(all)25 b([10)q(]\),)i(which)0 4044 y(pro)o(vides)35 b(users)f(with)g(the)g(ability)f(to)h(modify)g(object) h(code)f(in)g(a)0 4127 y(clean,)j(simple)c(manner)l(.)70 b(Atom)33 b(w)o(as)h(one)g(of)f(the)g(\256rst)f(tools)h(to)0 4210 y(gi)n(v)o(e)13 b(programmers)i(ready)e(access)h(to)f(the)g (transformational)h(abilities)0 4293 y(encased)31 b(in)f(compilers.)62 b(M)p Fl(A)n(GIK)30 b Fm(complements)h(this)f(w)o(ork,)j(and)0 4376 y(trades)23 b(the)f(practical)g(generality)h(of)f(dealing)h(with)f (object)h(code)g(for)0 4459 y(impro)o(v)o(ed)g(information)f(and)h (code)f(ef)n(\256cienc)o(y)g(gained)h(by)f(w)o(orking)0 4542 y(within)f(a)g(high-le)n(v)o(el)h(source)g(compiler)l(.)34 b(Since)21 b(M)p Fl(A)n(GIK)h Fm(has)g(access)0 4625 y(to)27 b(all)g(the)h(information)g(a)o(v)n(ailable)g(to)f(the)h (source)g(compiler)g(\(e.g.,)0 4708 y(symbol)20 b(table,)f(\257o)n(w)g (graph)h(information,)f(high-le)n(v)o(el)h(semantics\))g(it)0 4791 y(can)14 b(deri)n(v)o(e)g(f)o(acts)g(lost)f(at)h(the)f(object)h (code)h(le)n(v)o(el.)25 b(F)o(or)13 b(instance,)i(it)e(can)0 4874 y(easily)h(insert)g(reference)h(counts)f(around)i(all)d(accesses)i (to)f(a)g(particular)0 4957 y(pointer)28 b(type;)33 b(an)28 b(object)g(code)g(modi\256er)m(,)i(w)o(orking)f(solely)f(at)f(the)0 5040 y(le)n(v)o(el)d(of)g(loads)g(and)h(stores,)g(cannot.)43 b(Furthermore,)25 b(since)f(M)p Fl(A)n(GIK)0 5123 y Fm(e)o(xtensions)31 b(are)e(inte)o(grated)h(with)f(the)h(optimization)g(done)g(by)g(the)0 5206 y(compiler)m(,)18 b(the)o(y)g(can)g(be)g(implemented)h(more)f(ef)n (\256ciently:)26 b(IR)17 b(added)0 5289 y(by)23 b(an)g(e)o(xtension)h (is)e(optimized)h(no)g(dif)n(ferently)g(than)g(IR)f(produced)2050 83 y(from)12 b(source.)26 b(In)13 b(contrast,)h(object)f(code)h(ha)o(v) o(e)f(to)g(both)g(w)o(ork)h(without)2050 166 y(much)25 b(source-le)n(v)o(el)h(information)g(and)g(cannot)g(bootstrap)f(e)o (xisting)2050 249 y(compiler)i(optimizers)g([15)q(].)51 b(An)27 b(important)h(practical)f(dif)n(ference)2050 332 y(between)h(M)p Fl(A)n(GIK)g Fm(and)h(object)f(code)h(modi\256ers)f (is)f(that)h(M)p Fl(A)n(GIK)g Fm(is)2050 415 y(signi\256cantly)16 b(easier)f(to)h(implement.)26 b(The)16 b(system)g(described)g(in)g (this)2050 498 y(paper)26 b(took)g(the)f(author)h(less)g(than)g(a)f (month)h(to)g(implement)f(and)h(it)2050 581 y(runs)19 b(on)h(all)f(tar)o(gets)g(that)g(the)h(base)g(compiler)f(supports)i (\(x86,)f(Mips,)2050 664 y(Sparc\).)58 b(In)30 b(contrast,)i (duplicating)e(the)g(functionality)g(of)g(A)-8 b(T)o(OM)2050 747 y(for)17 b(e)n(v)o(en)i(a)f(single)g(architecture)g(w)o(ould)g (require)g(signi\256cantly)g(more)2050 830 y(w)o(ork)h(\(especially)g (on)h(an)f(architecture)g(such)h(as)f(the)g(x86\).)2162 913 y(There)j(are)h(man)o(y)g(compilers)g(designed)h(to)f(support)g (easy)g(addi-)2050 996 y(tion)13 b(of)g(optimizations)h(\(e.g.,)g(SUIF) e([1]\).)24 b(These)14 b(system)f(could)i(ha)o(v)o(e)2050 1079 y(been)j(used)f(to)g(implement)h(M)p Fl(A)n(GIK)p Fm(;)f Fj(lcc)h Fm(w)o(as)f(chosen)h(because)h(of)e(the)2050 1162 y(author')l(s)e(f)o(amiliarity)g(with)g(it.)25 b(T)-6 b(o)15 b(the)g(best)h(of)f(our)g(kno)n(wledge,)j(none)2050 1245 y(of)h(these)g(compilers)h(ha)o(v)o(e)f(been)h(used)g(e)o (xplicitly)f(for)g(e)o(xtending)i(the)2050 1328 y(optimizer)e(with)f (user)o(-le)n(v)o(el)h(semantics)g(or)g(transformations.)2162 1411 y(M)p Fl(A)n(GIK)e Fm(can)h(be)g(vie)n(wed)h(as)e(an)h(\252Open)g (System\272)g(in)f(the)h(spirit)f(of)2050 1494 y(Kiczale')l(s)h(w)o (ork)i([7].)2162 1577 y(Of)14 b(course,)j(programmers)f(ha)o(v)o(e)f (long)h(performed)g(interf)o(ace)f(op-)2050 1660 y(timizations)22 b(by)h(hand.)40 b(The)22 b(adv)n(antages)j(of)e(automated)h(optimiza-) 2050 1743 y(tion)19 b(are)f(well)h(kno)n(wn.)2050 1973 y Fn(3)91 b(System)21 b(Ov)o(er)o(view)2050 2133 y Fm(M)p Fl(A)n(GIK)31 b Fm(pro)o(vides)h(a)f(frame)n(w)o(ork)h(to)f(e)o(xtend)h (compilation.)65 b(User)2050 2216 y(e)o(xtensions)24 b(are)f(implemented)i(as)e(dynamically-link)o(ed)i(functions.)2050 2299 y(User)32 b(e)o(xtensions)h(come)g(in)f(tw)o(o)g(classes:)53 b Fk(code)33 b(e)o(xtensions)g Fm(and)2050 2382 y Fk(data)21 b(structur)m(e)g(e)o(xtensions)p Fm(.)33 b(Code)22 b(e)o(xtensions)f (are)g(in)m(v)o(ok)o(ed)h(at)e(e)n(v-)2050 2465 y(ery)g(function)i (de\256nition)f(and)g(are)g(able)f(to)h(enumerate,)h(add,)f(delete,) 2050 2548 y(and)e(modify)g(M)p Fl(A)n(GIK)p Fm(')l(s)f(IR)g(as)g(it)g (mak)o(es)h(the)f(transition)h(from)f(source)2050 2631 y(language)26 b(to)f(machine)h(code.)46 b(Data)25 b(structure)g(e)o (xtensions)h(are)f(in-)2050 2714 y(v)o(ok)o(ed)j(at)f(e)n(v)o(ery)i (data)e(structure)h(de\256nition)g(and)g(are)f(able)h(to)f(add,)2050 2797 y(delete)15 b(and)g(modify)h(structure)f(elements.)26 b(Since)14 b(compiler)i(internals)2050 2880 y(are)h(in)h(\257ux,)f (implementation)i(portability)e(is)h(pro)o(vided)h(by)f(isolating)2050 2963 y(e)o(xtensions)28 b(from)g(internal)f(IR)g(details)h(via)f(a)h (set)f(of)g(standardized)2050 3046 y(interf)o(aces;)22 b(multiple)e(interf)o(aces)h(are)g(pro)o(vided,)h(specialized)g(to)f (the)2050 3129 y(main)e(domains)h(M)p Fl(A)n(GIK)f Fm(is)f(used)i(in.) 2162 3212 y(A)12 b(gi)n(v)o(en)g(compilation)g(may)g(use)g(man)o(y)g (dif)n(ferent)g(e)o(xtensions.)27 b(T)-6 b(o)2050 3295 y(mak)o(e)14 b(the)f(system)h(usable,)h(it)d(is)h(crucial)h(that)f(e)o (xtension)i(composition)2050 3378 y(is)j(modular)l(.)28 b(The)19 b(tw)o(o)g(main)g(requirements)g(of)g(modularity)h(are)f(that) 2050 3461 y(e)o(xtensions)i(be)f(able)g(to)f(inspect)i(the)e(code)i (produced)h(by)e(others)g(and)2050 3544 y(that)26 b(e)o(xtensions)h (can)g(be)g(obli)n(viously)g(composed.)51 b(M)p Fl(A)n(GIK)27 b Fm(meets)2050 3627 y(these)14 b(requirements)g(by)h(pro)o(viding)g (three)f(dif)n(ferent)f(e)o(xtension)i(types)2050 3710 y(\()p Fk(tr)o(ansformer)o(s)p Fm(,)27 b Fk(optimizer)o(s)p Fm(,)f(and)g Fk(inspector)o(s)p Fm(\))g(that)f(correspond)i(to)2050 3793 y(the)i(three)h(main)f(functional)h(uses)g(of)g(e)o(xtensions.)59 b(T)m(ransformers)2050 3876 y(are)24 b(used)h(to)f(perform)g(code)h (transformations)g(that)f(do)h(not)f(depend)2050 3959 y(on)17 b(inte)o(gration)h(with)e(global)i(optimization)g(\(e.g.,)e (partially)h(e)n(v)n(aluat-)2050 4042 y(ing)24 b(a)g(C)f Fj(printf)i Fm(call\).)42 b(Optimizers)23 b(are)h(used)h(to)f(perform)g (iterati)n(v)o(e)2050 4125 y(optimization)30 b(and)g(are)f(repeatedly)h (in)m(v)o(ok)o(ed)h(during)f(global)g(opti-)2050 4208 y(mization)25 b(until)g(no)g(IR)g(modi\256cations)g(occur)l(.)46 b(\(Optimizers)25 b(dif)n(fer)2050 4291 y(from)20 b(both)h (transformers)g(and)h(inspectors)f(in)g(that)f(the)o(y)h(may)g(be)g (in-)2050 4374 y(v)o(ok)o(ed)i(multiple)f(times.\))37 b(Inspectors)23 b(are)f(similar)g(in)g(functionality)2050 4458 y(to)12 b(transformers)i(e)o(xcept)f(their)g(placement)h(in)e(the) h(e)o(xtension)h(pipeline)2050 4541 y(ensures)19 b(that)g(the)o(y)g (see)g(all)g(IR)f(that)h(will)f(be)h(compiled)h(to)f(code.)2162 4624 y(The)h(main)g(implementation)h(limitation)e(of)h(the)g(M)p Fl(A)n(GIK)g Fm(system)2050 4707 y(is)29 b(that)h(since)g Fj(lcc)f Fm(pro)o(vides)i(no)f(global)h(optimization)f(frame)n(w)o(ork) 2050 4790 y(optimizers)g(are)f(gi)n(v)o(en)i(only)f(weak)g(data)g (\257o)n(w)f(information.)60 b(W)-6 b(e)2050 4873 y(are)19 b(in)m(v)o(estigating)g(methods)i(of)e(remo)o(ving)h(this)f(limitation) g(\(e.g.,)f(by)2050 4956 y(using)h(the)g(SUIF)f(compiler)h(system)g([1) q(]\).)2162 5039 y(An)33 b(operational)h(o)o(v)o(ervie)n(w)f(of)g(the)g (e)o(xtension)h(process)g(is)f(as)2050 5122 y(follo)n(ws:)2143 5257 y(1.)k(Programmers)c(implement)g(e)o(xtensions)g(using)g(the)g(M)p Fl(A)n(GIK)2236 5340 y Fm(libraries;)25 b(these)e(e)o(xtensions)h(are)f (compiled)g(to)g(object)g(code.)p eop %%Page: 3 3 3 2 bop 187 83 a Fm(The)26 b(location)i(of)e(this)h(code)g(is)g(either) f(speci\256ed)h(to)g(M)p Fl(A)n(GIK)187 166 y Fm(using)19 b(command-line)h(\257ags)e(or)h(by)g(embedding)h(the)f(location)187 249 y(in)h(source)g(\256les.)29 b(F)o(or)20 b(instance,)g(header)h (\256les)e(can)h(specify)h(an)187 332 y(e)o(xtension)f(to)f(optimize)g (the)g(interf)o(aces)g(the)o(y)g(de\256ne.)93 471 y(2.)38 b(M)p Fl(A)n(GIK)16 b Fm(compiles)g(high-le)n(v)o(el)g(source)g(\(ANSI) f(C\))g(to)g(its)g(inter)o(-)187 554 y(nal)21 b(IR)g(in)g(the)h (traditional)f(manner)l(.)35 b(As)21 b(M)p Fl(A)n(GIK)h Fm(encounters)187 637 y(e)o(xtension)d(location)f(directi)n(v)o(es)g (\(either)g(as)g(compiler)g(\257ags)g(or)187 720 y(embedded)f(in)d (source\))i(it)e(uses)h(the)g Fj(dld)g Fm(dynamic)h(link)o(er)f([5)q(]) f(to)187 803 y(dynamically)h(link)g(the)g(named)g(e)o(xtensions)h(into) e(the)h(compiler)187 886 y(proper)l(.)93 1025 y(3.)38 b(At)19 b(e)n(v)o(ery)h(function)h(M)p Fl(A)n(GIK)f Fm(encounters)h(it) e(in)m(v)o(ok)o(es)h(all)f(code)187 1108 y(e)o(xtensions,)27 b(be)o(ginning)f(with)e(transformer)h(e)o(xtensions.)46 b(At)187 1191 y(this)29 b(point)h(the)g(e)o(xtensions)h(are)f(free)g (to)f(augment,)34 b(modify)187 1274 y(and)28 b(delete)g(parts)g(of)g (the)g(IR.)f(As)h(part)g(of)g(the)g(global)g(opti-)187 1357 y(mization)14 b(loop,)h(M)p Fl(A)n(GIK)f Fm(calls)f(each)h (optimization)g(e)o(xtension.)187 1440 y(These)20 b(e)o(xtensions)h(ha) o(v)o(e)g(access)g(to)f(an)o(y)h(data)f(\257o)n(w)g(informa-)187 1523 y(tion)26 b(computed)i(by)e(the)h(compiler)f(\(e.g.,)i(use)e(and)h (def)g(sets,)187 1606 y(v)n(alues)32 b(of)f(procedure)i(parameters,)h (etc.\))63 b(T)-6 b(o)31 b(ensure)h(that)187 1689 y(code)25 b(produced)g(by)g(an)o(y)f(e)o(xtension)h(is)f(visible)g(to)f(all)h (others)187 1772 y(\(a)18 b(requirement)h(for)f(modular)i(composition)f (of)g(dif)n(ferent)f(e)o(x-)187 1855 y(tensions\))25 b(M)p Fl(A)n(GIK)f Fm(loops)h(through)h(the)e(e)o(xtensions)i(until)e (no)187 1938 y(more)18 b(modi\256cations)h(occur)g(to)f(the)g(IR.)g(A)g (nice)g(result)g(of)g(this)187 2021 y(or)o(ganization)e(is)f(that)h (the)g(code)g(produced)i(by)e(an)g(e)o(xtension)h(is)187 2104 y(optimized)f(as)f(aggressi)n(v)o(ely)h(as)f(the)g(code)h (produced)h(from)e(ap-)187 2187 y(plication)20 b(source.)29 b(After)19 b(all)g(optimization)h(e)o(xtensions)h(ha)o(v)o(e)187 2270 y(run,)i(and)h(no)f(modi\256cations)g(occur)m(,)h(M)p Fl(A)n(GIK)e Fm(runs)h(inspector)187 2353 y(e)o(xtensions)d(in)f(their) f(speci\256ed)i(order)l(.)93 2492 y(4.)38 b(At)14 b(e)n(v)o(ery)h (structure)g(de\256nition)g(M)p Fl(A)n(GIK)g Fm(in)m(v)o(ok)o(es)h(all) e(structure)187 2575 y(e)o(xtensions.)26 b(These)14 b(e)o(xtensions)g (can)g(add,)h(modify)f(and)g(delete)187 2658 y(structure)32 b(entries.)66 b(T)-6 b(ypically)32 b(these)g(e)o(xtensions)h(are)f (also)187 2741 y(paired)20 b(with)e(code)j(e)o(xtensions)f(that)f (augment)h(data)g(structure)187 2824 y(\256eld)e(uses)i(and)f (de\256nitions.)93 2963 y(5.)38 b(M)p Fl(A)n(GIK)19 b Fm(emits)f(code.)112 3098 y(M)p Fl(A)n(GIK)p Fm(')l(s)27 b(lo)n(west-le)n(v)o(el)h(IR)f(interf)o(ace,)i(based)g(closely)e(on)h (that)0 3181 y(the)19 b(the)g(underlying)i(compiler)f(\()p Fj(lcc)p Fm(\))f(is)f(terse,)h(simple)g(and)h(portable.)0 3264 y(Structurally)-5 b(,)26 b(the)g(IR)e(is)h(a)g(tree)g(language.)48 b(Lea)o(v)o(es)25 b(are)g(v)n(ariables,)0 3347 y(labels,)j(or)f (constants;)k(internal)26 b(nodes)i(represent)f(operations)h(per)o(-)0 3430 y(formed)g(on)h(them)f(\(e.g.,)h(addition,)i(indirection,)f (jumps,)g(function)0 3514 y(calls\).)56 b(When)29 b(operands)h(are)f (created)g(the)o(y)g(are)g(associated)h(with)0 3597 y(a)23 b(type)g(selected)h(from)f(M)p Fl(A)n(GIK)p Fm(')l(s)g(base)g(types)h (\(sho)n(wn)g(in)f(T)-6 b(able)22 b(1\).)0 3680 y(Thereafter)m(,)17 b(types)h(are)g(implicit:)25 b(operations)19 b(infer)e(their)h(o)n(wn)g (types)0 3763 y(based)h(on)f(the)g(type)h(of)f(their)f(operands.)29 b(An)o(y)18 b(con)m(v)o(ersions)h(required)0 3846 y(by)14 b(ANSI)f(C)g(are)h(performed)h(by)f(M)p Fl(A)n(GIK)g Fm(\(e.g.,)g(as)f(required)i(by)f(ANSI)0 3929 y(C)25 b(a)g(character)h(v)n(ariable)g(will)f(be)g(con)m(v)o(erted)i(to)e(an)h (inte)o(ger)g(before)0 4012 y(addition)20 b(with)e(an)h(inte)o(ger\).) 112 4095 y(User)o(-created)33 b(IR)g(\(type:)55 b Fj(I)p 886 4095 22 4 v 25 w(IR)p Fm(\))33 b(is)g(of)g(a)g(dif)n(ferent)g(type) h(than)0 4178 y(nati)n(v)o(e)17 b(IR)e(\(type:)26 b Fj(X)p 533 4178 V 26 w(IR)p Fm(\).)15 b(This)g(distinction)i(is)f(helpful)g (because)i(user)o(-)0 4261 y(constructed)27 b(IR)e(typically)h (requires)g(preprocessing)h(before)g(it)e(can)0 4344 y(be)c(sensibly)g(incorporated)i(into)d Fj(lcc)p Fm(')l(s)h(internal)g (representation.)33 b(By)0 4427 y(e)o(xploiting)17 b(static)e (type-checking,)k(M)p Fl(A)n(GIK)d Fm(can)h(pre)n(v)o(ent)g(users)f (from)0 4510 y(blithely)j(intermixing)g(the)g(dif)n(ferent)g (representations.)112 4593 y(The)k(interf)o(aces)h(are)f(presented)i (in)e(the)g(follo)n(wing)h(tables:)36 b(rou-)0 4676 y(tines)25 b(to)g(allocate,)h(lookup)h(and)f(manipulate)f(symbols)h(in)f(T)-6 b(able)25 b(4,)0 4759 y(routines)i(to)g(construct)g(IR)f(in)h(T)-6 b(able)27 b(5,)h(and)f(routines)h(to)e(na)o(vigate)0 4842 y(the)31 b(IR)f(in)h(T)-6 b(able)31 b(2.)62 b(Higher)o(-le)n(v)o (el)31 b(interf)o(aces)g(are)g(discussed)h(in)0 4925 y(Section)19 b(4)g(and)g(Section)g(5.)112 5008 y(W)-6 b(e)25 b(e)o(xpect)i(M)p Fl(A)n(GIK)f Fm(to)f(e)n(v)o(olv)o(e)i(with)e (further)h(e)o(xperience.)48 b(T)-6 b(o)0 5091 y(aid)30 b(iterati)n(v)o(e)f(design,)j(the)e(current)g(implementation)g(has)g (empha-)0 5174 y(sized)23 b(simplicity)e(at)h(all)g(le)n(v)o(els.)37 b(M)p Fl(A)n(GIK)22 b Fm(is)g(b)o(uilt)f(on)i(top)g(of)f(the)g Fj(lcc)0 5257 y Fm(retar)o(getable)28 b(ANSI)f(C)h(compiler)g([3],)i (and)e(uses)h(its)e(IR)h(language)0 5340 y(as)34 b(its)f(fundamental)i (interf)o(ace)f([4])f(\(higher)o(-le)n(v)o(el)h(interf)o(aces)g(are)p 2592 80 766 4 v 2590 154 4 75 v 2637 132 a Fi(T)-5 b(ype)p 2819 154 V 91 w(C)16 b(name)p 3356 154 V 2592 158 766 4 v 2590 233 4 76 v 2637 211 a Fj(V)p 2819 233 V 182 w(void)p 3356 233 V 2590 309 V 2637 287 a(C)p 2819 309 V 182 w(signed)k(char)p 3356 309 V 2590 385 V 2637 362 a(UC)p 2819 385 V 131 w(unsigned)h(char)p 3356 385 V 2590 460 V 2637 438 a(S)p 2819 460 V 194 w(signed)f(short)p 3356 460 V 2590 536 V 2637 513 a(US)p 2819 536 V 143 w(unsigned)h(short)p 3356 536 V 2590 611 4 75 v 2637 588 a(I)p 2819 611 V 209 w(int)p 3356 611 V 2590 686 4 76 v 2637 664 a(U)p 2819 686 V 178 w(unsigned)p 3356 686 V 2590 762 V 2637 739 a(L)p 2819 762 V 194 w(long)p 3356 762 V 2590 837 V 2637 815 a(UL)p 2819 837 V 143 w(unsigned)g(long)p 3356 837 V 2590 913 V 2637 891 a(F)p 2819 913 V 194 w(\015oat)p 3356 913 V 2590 989 V 2637 966 a(D)p 2819 989 V 178 w(double)p 3356 989 V 2590 1064 V 2637 1042 a(P)p 2819 1064 V 190 w(void)f(*)p 3356 1064 V 2592 1068 766 4 v 2264 1212 a Fm(T)-6 b(able)19 b(1:)27 b(M)p Fl(A)n(GIK)19 b Fm(types)h(\(superset)f(of)g Fj(lcc)p Fm(')l(s)g(types\).)2050 1461 y(crafted)24 b(on)g(top)g(of)g(this\).)41 b(The)23 b(re)o(gularity)h(and)h(small)e(size)h(of)g Fj(lcc)p Fm(')l(s)2050 1544 y(IR)f(has)h(been)g(a)f(major)h(asset.)41 b(Importantly)-5 b(,)25 b(since)f(mapping)g(other)2050 1627 y(IR')l(s)g(to)h(the)g(M)p Fl(A)n(GIK)g Fm(IR)g(and)g(back)h (should)g(be)g(straightforw)o(ard,)g(it)2050 1710 y(can)19 b(be)g(realistically)f(used)h(as)g(a)f(basis)h(for)g(de\256ning)g(a)g (standardized,)2050 1793 y(compiler)o(-independent,)g(e)o(xtension)g (interf)o(ace)f(similar)f(in)g(a)o(v)n(ailabil-)2050 1876 y(ity)h(to)h(ANSI)f(C')l(s)g(standardized)j(libraries.)2162 1959 y(While)11 b(the)g(implementation)g(e)o(xploits)g Fj(lcc)p Fm(')l(s)g(infrastructure,)k(there)2050 2042 y(is)g(no)g(fundamental)i(tie)e(to)g Fj(lcc)p Fm(.)26 b(As)15 b(e)o(xperience)i(with)e(the)g(system)h(and)2050 2125 y(its)22 b(uses)h(gro)n(ws,)h(reimplementations)g(will)e(occur)h (in)g(more)g(aggres-)2050 2208 y(si)n(v)o(e)12 b(compilers)g(\(or)m(,)i (alternati)n(v)o(ely)-5 b(,)14 b(M)p Fl(A)n(GIK)e Fm(will)g(be)g(used)g (to)g(enhance)2050 2291 y(the)19 b(optimization)g(frame)n(w)o(ork)h(of) f Fj(lcc)p Fm(\).)2162 2374 y(One)k(of)f(the)h(common)h(uses)f(of)f(M)p Fl(A)n(GIK)h Fm(is)f(to)h(incorporate)g(ne)n(w)2050 2457 y(functions)g(as)g(\252b)o(uilt-ins\272)g(into)f(the)h(compiler)l(.)39 b(Since)22 b(there)h(can)g(be)2050 2540 y(tens)30 b(or)h(\(at)f (aggressi)n(v)o(e)h(sites\))f(hundreds)i(of)f(b)o(uiltins,)h(it)e(is)g (criti-)2050 2623 y(cal)f(that)f(the)h(e)o(xtension)h(process)g(itself) f(is)f(ef)n(\256cient.)57 b(T)-6 b(o)29 b(achie)n(v)o(e)2050 2706 y(the)e(required)g(ef)n(\256cienc)o(y)-5 b(,)29 b(M)p Fl(A)n(GIK)f Fm(dynamically)g(links)f(e)o(xtensions)2050 2789 y(rather)22 b(than)g(isolating)g(them)h(in)f(sub-processes)h(that) f(communicate)2050 2872 y(via)g(shared)h(memory)-5 b(.)38 b(In)22 b(most)g(cases)h(this)f(process)h(has)f(no)h(signif-)2050 2955 y(icant)f(impact)g(on)h(compilation)g(speed.)37 b(F)o(or)22 b(implementations)h(that)2050 3038 y(wish)c(to)h(remo)o(v)o (e)h(all)e(o)o(v)o(erhead)i(\(at)e(some)i(cost)f(in)f(reduced)i(\257e)o (xibil-)2050 3121 y(ity\))e(M)p Fl(A)n(GIK)h Fm(pro)o(vides)g(an)g (interf)o(ace)g(that)g(can)g(be)g(used)h(to)e(statically)2050 3204 y(link)d(e)o(xtensions)i(into)e(the)h(compiler)f(proper)i (\(similar)d(to)h(the)h(process)2050 3287 y(of)i(adding)h(de)n(vice)f (dri)n(v)o(ers)h(to)e(most)h(operating)h(systems\).)2162 3370 y(The)k(follo)n(wing)h(tw)o(o)g(sections)g(discuss)h(the)e(interf) o(aces)i(M)p Fl(A)n(GIK)2050 3453 y Fm(pro)o(vides)i(for)g (incorporating)g(application)h(semantics)f(\(e.g.,)h(inter)o(-)2050 3536 y(f)o(ace)17 b(optimization)h(and)f(checking\))i(and)f(for)f (general)g(code)h(transfor)o(-)2050 3620 y(mation.)2050 3850 y Fn(4)91 b(Incor)o(porating)19 b(A)n(pplication)k(Semantics)2050 4010 y Fm(As)j(discussed)h(pre)n(viously)-5 b(,)29 b(user)o(-le)n(v)o (el)d(data)g(structures)h(and)f(func-)2050 4093 y(tions)e(de\256ne)h(a) g(high-le)n(v)o(el)g(language,)i(the)e(semantics)g(of)f(which)h(is)2050 4177 y(una)o(v)n(ailable)h(to)g(traditional)f(compilers.)48 b(M)p Fl(A)n(GIK)26 b Fm(pro)o(vides)g(mech-)2050 4260 y(anisms)35 b(that)h(allo)n(w)f(applications)i(to)e(construct)h(e)o (xtensions)h(that)2050 4343 y(can)19 b(e)o(xploit)g(these)h(languages') g(semantics)g(for)e(impro)o(v)o(ed)i(semantic)2050 4426 y(checking,)g(optimization,)f(and)h(general)g(transformations.)29 b(The)19 b(tw)o(o)2050 4509 y(main)26 b(constructs)g(of)g(interest)g (are)g(functions)g(and)h(data)f(structures.)2050 4592 y(In)f(the)h(case)g(of)f(functions,)j(clients)e(are)f(mainly)h (interested)g(in)g(tw)o(o)2050 4675 y(pieces)e(of)f(data-\257o)n(w)g (information:)37 b(the)23 b(location)h(of)g(calls)f(in)g(rela-)2050 4758 y(tion)h(to)f(each)i(other)m(,)g(and)g(the)f(de\256nitions)g(and)g (uses)h(of)f(each)g(call')l(s)2050 4841 y(operands)i(and)f(results.)43 b(Clients)24 b(also)g(require)h(semantic)g(informa-)2050 4924 y(tion)e(about)i(each)g(call)e(site')l(s)g(operands:)39 b(their)23 b(type,)i(whether)f(the)o(y)2050 5007 y(are)29 b(constants,)k(and)e(if)e(so,)j(what)e(their)g(v)n(alues)g(are.)60 b(In)30 b(the)f(case)2050 5090 y(of)18 b(data)g(structures)h(clients)f (are)h(primarily)f(interested)g(in)g(de\256nitions)2050 5173 y(and)h(uses)h(of)e(structures)i(and)f(their)g(\256elds.)2162 5256 y(T)-6 b(o)18 b(mak)o(e)i(IR)e(manipulations)i(easier)m(,)e(M)p Fl(A)n(GIK)h Fm(e)o(xploits)g(the)f(lim-)2050 5339 y(ited)27 b(information)i(needed)g(in)e(this)h(area)g(to)f(pro)o(vide)i(a)f(def)o (ault)g(in-)p eop %%Page: 4 4 4 3 bop 0 83 a Fm(terf)o(ace)23 b(that)f(is)g(simpler)g(than)g(the)h (general)g(M)p Fl(A)n(GIK)f Fm(IR.)g(It)f(includes)0 166 y(basic)29 b(block)h(structures,)i(function)e(calls,)h(details)d (about)i(function)0 249 y(ar)o(guments)25 b(and)f(results)g(\(e.g.,)h (whether)f(the)o(y)h(are)f(constants,)h(their)0 332 y(type,)17 b(possible)g(v)n(alues,)g(etc.\))26 b(and)17 b(information)g(about)h (structure)e(ac-)0 415 y(cesses.)30 b(A)19 b(library)g(of)h(routines)g (are)g(pro)o(vided)h(that)e(allo)n(w)h(clients)f(to)0 498 y(add,)k(modify)-5 b(,)23 b(delete)f(and)g(augment)h(function)g (calls)e(and)h(code)h(eas-)0 581 y(ily)-5 b(.)45 b(Additional)26 b(routines)f(are)g(pro)o(vided)i(to)d(search)i(for)f(particular)0 664 y(functions)j(and)f(lists)f(of)h(functions)h(in)f(the)g(IR)f (\(easing)i(IR)e(na)o(viga-)0 747 y(tion\),)k(tra)o(v)o(erse)e(ar)o (gument)g(lists,)i(and)e(routines)h(that)f(compute)h(the)0 830 y(set)21 b(of)h(v)n(ariables)g(de\256ned)g(and)h(used)f(by)g(a)g (gi)n(v)o(en)g(call)f(site.)35 b(T)-6 b(able)21 b(6)0 913 y(presents)16 b(M)p Fl(A)n(GIK)p Fm(')l(s)g(interf)o(ace)g(for)g (\256nding,)h(manipulating,)g(and)g(con-)0 996 y(structing)31 b(call)f(sites.)60 b(T)-6 b(able)31 b(7)f(presents)h(M)p Fl(A)n(GIK)p Fm(')l(s)g(interf)o(ace)f(for)0 1079 y(\256nding)22 b(IR)f(tree)g(patterns,)i(and)f(both)g(structure)g(and)g(structure)g (\256eld)0 1162 y(uses.)112 1245 y(Clients)i(that)h(need)g(access)h(to) e(the)h(full)f(po)n(wer)h(of)g(M)p Fl(A)n(GIK)p Fm(')l(s)g(IR)0 1328 y(can,)h(of)f(course,)i(use)e(it;)h(the)f(layering)h(pro)o(vided)g (by)f(def)o(ault)g(is)f(in-)0 1411 y(tended)c(as)f(syntactic)g(sugar)g (rather)g(than)h(a)e(barrier)l(.)112 1494 y(The)c(follo)n(wing)h (subsections)g(present)g(M)p Fl(A)n(GIK)p Fm(')l(s)f(semantic)h(inter)o (-)0 1577 y(f)o(ace)20 b(and)g(four)f(e)o(xample)i(clients.)28 b(The)19 b(\256rst)f(client)h(e)o(xploits)h(M)p Fl(A)n(GIK)0 1660 y Fm(to)30 b(perform)g(the)g(general)g(transformation)g(of)g (adding)h(a)f(compiler)0 1743 y(\252b)o(uiltin\272)16 b(output)i(function)f(that)g(is)f(implicitly)g(a)o(w)o(are)h(of)g(its)f (operand)0 1826 y(types)e(\(eliminating)g(the)g(need)g(for)f Fj(printf)p Fm(-style)j(format)d(strings\).)25 b(The)0 1910 y(second)g(client)f(adds)h(more)f(rigorous)h(semantic)f(checking)i (of)e(Unix)0 1993 y(system)19 b(calls)f(by)h(inserting)g(checks)g (around)h(call)e(sites)g(that)g(ignore)h(a)0 2076 y(system)h(call')l(s) g(return)g(v)n(alue.)32 b(The)20 b(third)g(client)g(ensures)h(that)f (signal)0 2159 y(handlers)30 b(call)e(only)h(reentrant)g(functions.)58 b(Finally)-5 b(,)30 b(the)f(four)g(e)o(x-)0 2242 y(tension)20 b(optimizes)f(RPC)f(call)h(sites)f(by)i(using)f(partial)g(e)n(v)n (aluation)h(to)0 2325 y(generate)g(specialized)f(ar)o(gument)h (marshaling)g(code.)0 2547 y Fn(4.1)90 b(Example:)33 b(adding)22 b(type-awar)n(e)f(functions)0 2680 y Fm(ANSI)11 b(C)g(suf)n(fers)g(from)g(the)g(lack)g(of)g(a)g(graceful)g(mech)q (anism)h(to)f(h)q(andle)0 2763 y(poly-typed)28 b(functions.)50 b(Programmers)27 b(are)f(typically)h(reduced)g(to)0 2846 y(specifying)c(ar)o(gument)f(types)h(using)f(a)g(manually-constructed)i (type)0 2929 y(string.)40 b(This)22 b(methodology)k(is)c(clumsy)i(and)g (error)f(prone.)41 b(One)23 b(of)0 3012 y(the)d(more)f(painful)h(ef)n (fects)g(of)f(this)g(lack)h(is)f(that)g(C)g(is)g(one)h(of)g(the)f(fe)n (w)0 3095 y(languages)h(in)f(use)h(that)e(does)i(not)f(ha)o(v)o(e)g (type-a)o(w)o(are)h(I/O)e(routines.)112 3178 y(Figure)13 b(1)h(presents)f(a)h(M)p Fl(A)n(GIK)f Fm(e)o(xtension)h(that)f(adds)h (a)f(type-a)o(w)o(are)0 3261 y(output)26 b(routine,)h Fj(output)p Fm(.)47 b(It)24 b(w)o(orks)i(by)g(re)n(writing)f(all)f (calls)h(to)g(the)0 3344 y(poly-typed)k(function)f(it)f(de\256nes)h(\() p Fj(output)p Fm(\))h(to)e(call)g Fj(printf)i Fm(using)f(a)0 3427 y(type)20 b(string)g(\()p Fj(typestring)p Fm(\))i(it)c(constructs) j(from)e(the)h(type)g(of)g Fj(output)p Fm(')l(s)0 3510 y(ar)o(guments.)28 b(An)19 b(operational)g(vie)n(w)g(is)g(as)g(follo)n (ws:)93 3670 y(1.)38 b(The)21 b(e)o(xtension)h(iterates)f(o)o(v)o(er)h (all)e(calls)h(to)g Fj(output)i Fm(using)f(the)187 3753 y(M)p Fl(A)n(GIK)d Fm(functions)h Fj(FirstCall)f Fm(and)h Fj(NextCall)p Fm(.)93 3896 y(2.)38 b(F)o(or)15 b(each)i(callsite,)f(it) f(b)o(uilds)h(up)h(a)f Fj(printf)p Fm(-style)h(type)g(string)f(by)187 3979 y(iterating)24 b(o)o(v)o(er)g Fj(output)p Fm(')l(s)h(ar)o(gument)g (list)e(\(using)i(the)f(M)p Fl(A)n(GIK)187 4062 y Fm(functions)19 b Fj(FirstAr)n(g)i Fm(and)e Fj(NextAr)n(g)p Fm(\))h(and)f(appending)h (the)f(type)187 4145 y(of)g(each)g(ar)o(gument)h(to)f Fj(typestring)p Fm(.)93 4288 y(3.)38 b(After)13 b Fj(typestring)j Fm(has)e(been)h(constructed,)g(the)f(e)o(xtension)h(uses)187 4371 y Fj(RewriteCall)23 b Fm(to)f(modify)h(the)g(call)f(site)g(to)g (call)g Fj(printf)i Fm(instead)187 4454 y(of)19 b Fj(output)h Fm(and)g(inserts)f Fj(typestring)i Fm(as)e(the)g(\256rst)f(ar)o (gument.)112 4613 y(A)h(sample)g(usage:)229 4809 y Fj(void)j (example\(int)h(i,)d(int)i(j\))f(\340)293 4892 y(output\(\\i)i(=)f(",)f (i,)f(\\j)h(=)h(",)f(j\);)229 4975 y(\341)112 5231 y Fm(While)d(some)g(languages)i(\(such)f(as)f(C++\))g(support)h(this)f (capabil-)0 5314 y(ity)i(for)h(simple)g(scalers,)g(our)g(e)o(xtension)h (can)f(be)g(easily)g(modi\256ed)g(to)2236 113 y Fh(/)p Fg(\003)h Fh(Add)g(a)f(type\343aware)k(output)e(function.)f Fg(\003)p Fh(/)2236 196 y Fj(int)g(RewriteOutput\(X)p 2858 196 22 4 v 29 w(IR)f(c\))h(\340)2236 279 y(#)43 b(de\014ne)22 b(MAXARGS)g(64)2318 362 y(X)p 2365 362 V 26 w(IR)e(a;)2300 528 y Fh(/)p Fg(\003)i Fh(Foreach)h(callsite,)f (rewrite)g(the)h(output)g(call.)d Fg(\003)p Fh(/)2300 611 y Ff(for)p Fj(\()r(c)h(=)h(FirstCall\(c,)g(\\output"\);)2410 694 y(c)f(!=)g(NULL;)2410 777 y(c)g(=)h(NextCall\(c,)g(\\output"\)\))j (\340)2363 943 y Fh(/)p Fg(\003)d Fh(String)h(to)f(hold)f(derived)i (typestring.)h Fg(\003)p Fh(/)2363 1026 y Fj(char)f(typestring[MAXARGS) p Fg(\003)p Fj(2+1])j(=)c(\3400\341;)2363 1192 y Fh(/)p Fg(\003)g Fh(Foreach)i(argument,)f(create)g(a)e(typestring.)j Fg(\003)p Fh(/)2363 1275 y Ff(for)p Fj(\(a)g(=)d(FirstAr)n(g\(c\);)k(a) c(!=)g(NULL;)h(a)f(=)g(NextAr)n(g\(a\)\))k(\340)2427 1358 y Ff(switch)p Fj(\(OpT)-5 b(ype\(a\)\))25 b(\340)2490 1441 y Ff(case)e Fj(I:)d(str)o(cat\(typestring,)27 b(\\\045d)21 b("\);)h Ff(break)p Fj(;)2490 1524 y Ff(case)h Fj(P:)2533 1607 y Fh(/)p Fg(\003)f Fh(Print)g(strings)h(dif)o(ferently)2681 1690 y(than)f(pointers.)h Fg(\003)p Fh(/)2533 1773 y Ff(if)p Fj(\(RawPtrT)-5 b(ype\(NodeT)g(ype\(a\)\))28 b(==)22 b(C\))2599 1856 y(str)o(cat\(typestr)q(ing,)k(\\\045s)c("\);) 2533 1939 y Ff(else)2596 2022 y Fj(str)o(cat\(typestring)q(,)k (\\0x\045p)c("\);)2533 2105 y Ff(break)p Fj(;)2490 2188 y Fh(/)p Fg(\003)g Fh(...)e Fg(\003)p Fh(/)2490 2271 y Ff(default)p Fj(:)j(panic\(\\Bogus)h(type"\);)2490 2355 y(\341)2363 2438 y(\341)2363 2521 y Fh(/)p Fg(\003)e Fh(Add)g(newline)f Fg(\003)p Fh(/)2363 2604 y Fj(str)o(cat\(typestr)q (ing,)26 b(\\\342n"\);)2363 2687 y Fh(/)p Fg(\003)c Fh(Change)h(call)e (to)h(output)h(to)f(call)f(to)h(printf.)g Fg(\003)p Fh(/)2363 2770 y Fj(RewriteCall\(c,)h(\\printf"\);)2363 2853 y Fh(/)p Fg(\003)f Fh(Add)g(typestring)i(as)e(printf's)h(\014rst)g (argument.)g Fg(\003)p Fh(/)2363 2936 y Fj(PushAr)n(g\(c,)h (Cnststr\(typestring\))q(\);)2300 3019 y(\341)2300 3102 y Ff(return)f Fj(MAGIK)p 2737 3102 V 25 w(OK;)2236 3185 y(\341)2112 3540 y Fm(Figure)c(1:)27 b(Routine)20 b(to)e(add)i(a)f (type-a)o(w)o(are)h(output)f(routine)h(to)e(C)2050 3789 y(print)k(the)g(\256elds)g(in)g(aggre)o(gate)h(types,)h(freeing)e (programmers)i(from)2050 3872 y(ha)o(ving)30 b(to)g(tediously)h(write)e (data)h(structure-speci\256c)h(output)g(rou-)2050 3955 y(tines)f(\(this)g(functionality)g(w)o(as)h(elided)f(for)g(bre)n (vity\).)62 b(Extensible)2050 4038 y(code)28 b(synthesis)f(is)g(po)n (werful.)52 b(Example)28 b(uses)f(include)h(the)f(auto-)2050 4121 y(matic)11 b(generation)g(of)g(routines)g(to)g(translate)g(data)g (structures)g(be)q(tween)2050 4204 y(\252in-core\272)23 b(and)g(on-disk)h(representations)g(and)f(the)g(construction)h(of)2050 4287 y(link)o(ed-list,)29 b(hash-tables,)i(and)d(associati)n(v)o(e)g (arrays)g(specialized)h(to)2050 4370 y(particular)21 b(data)h(structure)g(types.)35 b(A)21 b(similar)g(technique)i(is)e (used)h(in)2050 4453 y(Subsection)j(4.4)g(to)f(construct)h(an)g(ef)n (\256cient)g(ar)o(gument)g(marshaling)2050 4536 y(routine)19 b(for)g(a)g(remote)g(procedure)h(call)f(system.)2050 4758 y Fn(4.2)90 b(Example:)33 b(safe)21 b(system)h(calls)2162 4892 y Fm(C)31 b(and)i(Unix)f(are)h(notorious)g(for)f(using)h(inte)o (ger)f(error)g(codes)2050 4975 y(to)23 b(indicate)g(e)o(xceptional)h (conditions.)41 b(C)23 b(and)g(Unix)h(programmers)2050 5058 y(are)h(notorious)i(for)e(not)h(checking)i(these)d(codes.)48 b(This)26 b(problem)g(is)2050 5141 y(a)i(signi\256cant)h(one,)j (especially)d(with)f(the)h(pre)n(v)n(alence)h(of)f(netw)o(ork)2050 5224 y(computing)d(\(where)f(\256le)f(I/O)g(operations)i(ha)o(v)o(e)f (to)g(be)g(retried)g(with)2050 5307 y(some)15 b(frequenc)o(y\).)26 b(Figure)15 b(2)g(presents)g(an)g(an)g(e)o(xtension)g(that)g(inserts)p eop %%Page: 5 5 5 4 bop 187 1114 a Fh(/)p Fg(\003)22 b Fh(Add)f(checks)j(around)e (unchecked)i(Unix)d(system)i(calls.)e Fg(\003)p Fh(/)187 1197 y Fj(int)g(RewriteUnix\(X)p 727 1197 22 4 v 28 w(IR)g(c\))h(\340) 250 1280 y Fh(/)p Fg(\003)g Fh(list)g(of)f(all)g(calls)h(we)f(insert)i (checks)g(for)f Fg(\003)p Fh(/)250 1363 y Fj(char)h Fg(\003)p Fj(unixcalls[])g(=)f(\340\\r)o(ead",\\write",\\seek",)p Fh(/)p Fg(\003)k Fh(...)20 b Fg(\003)p Fh(/)i Fj(0\341;)250 1446 y(I)p 274 1446 V 25 w(IR)f(r)o(es,)i(err)-6 b(,)22 b(stmt;)250 1529 y(char)h Fg(\003)p Fj(n;)250 1695 y Fh(/)p Fg(\003)f Fh(foreach)i(callsite,)d(rewrite)i(the)f(output)h (call)e Fg(\003)p Fh(/)250 1778 y Ff(for)p Fj(\(r)o(es)k(=)c(NULL,)h(c) f(=)h(FirstCallV\(c,)g(unixcalls\);)356 1862 y(c)g(!=)f(NULL;)g(c)h(=)f (NextCallV\(c,)h(unixcalls\)\))h(\340)314 2028 y(n)e(=)h (CallName\(c\);)314 2194 y Fh(/)p Fg(\003)g Fh(If)f(anyone)i(uses)f (the)h(result,)f(assume)h(it)e(is)g(checked.)i Fg(\003)p Fh(/)314 2277 y Ff(if)p Fj(\(Uses\(c\)\))380 2360 y Ff(continue)p Fj(;)314 2443 y Ff(else)377 2526 y Fj(warning\(\\system)i(call)c (\344\045s\345)h(is)f(not)i(checked\342n",)g(n\);)314 2692 y Fh(/)p Fg(\003)f Fh(Create)h(a)e(temp)h(to)g(hold)g(syscall's)g (return)h(value)f Fg(\003)p Fh(/)314 2775 y Ff(if)p Fj(\(!r)o(es\))380 2858 y(r)o(es)h(=)f(T)-6 b(emp\(inttype,)23 b(MAGIK)p 1225 2858 V 25 w(REG\);)314 3024 y Fh(/)p Fg(\003)f Fh(Create)h(IR)e (to)h(assign)g(the)g(return)i(value)e(to)g(res.)g Fg(\003)p Fh(/)314 3107 y Fj(stmt)g(=)g(AddStmt\(c,)h(Asgn\(r)o(es,)h (ImportExprRef\(c\)\)\);)314 3273 y Fh(/)p Fg(\003)e Fh(Create)h(a)e(call)g(to)h(error)h(routine;)g(it)e(expects)j(the)441 3356 y(syscall)e(name,)g(and)f(the)i(return)g(code.)f Fg(\003)p Fh(/)314 3439 y Fj(err)g(=)g(Call\(\\err)o(or",)i(voidtype,)e (Cnststr\(n\),)j(r)o(es,)d(NULL\);)314 3522 y Fh(/)p Fg(\003)g Fh(Insert)g(check)h(for)g(syscall)f(failure.)g Fg(\003)p Fh(/)314 3605 y Fj(AddStmt\(stmt,)i(IfStmt\(Lt\(r)o(es,)h (Cnsti\(0\)\),)f(err\)\);)271 3688 y(\341)250 3771 y Ff(return)g Fj(MAGIK)p 688 3771 V 25 w(OK;)187 3854 y(\341)0 4209 y Fm(Figure)14 b(2:)25 b(Extension)15 b(that)g(places)g(error)f (checks)i(around)g(uncheck)o(ed)0 4292 y(system)j(calls.)2050 83 y(error)11 b(condition)g(checks)g(around)g(unc)q(hecked)h(Unix)g (system)g(calls)f(an)q(d)2050 166 y(prints)19 b(out)g(errors)g(that)f (occur)l(.)2162 249 y(The)h(e)o(xtension)h(w)o(orks)f(as)g(follo)n(ws:) 2143 392 y(1.)37 b(It)32 b(iterates)g(o)o(v)o(er)h(all)f(calls)g(to)g (the)g(functions)h(listed)f(in)h(the)2236 475 y(array)18 b Fj(unixcalls)f Fm(using)h(the)f(M)p Fl(A)n(GIK)g Fm(functions)g Fj(FirstCallV)h Fm(and)2236 558 y Fj(NextCallV)p Fm(.)2143 701 y(2.)37 b(F)o(or)17 b(each)g(call)g(site)f(it)g(checks)i(if)f(the)g (result)f(of)h(the)g(call)g(is)f(used)2236 784 y(\(using)28 b(the)e(M)p Fl(A)n(GIK)h Fm(routine)g Fj(Uses)p Fm(\).)51 b(Unfortunately)-5 b(,)29 b(a)d(use)2236 867 y(does)17 b(not)f(guarantee)i(that)e(the)g(call')l(s)f(result)h(is)g(check)o(ed)h (\320)f(for)2236 950 y(simplicity)-5 b(,)19 b(we)g(elide)g(more)g (aggressi)n(v)o(e)h(checking.)2143 1093 y(3.)37 b(F)o(or)16 b(call)g(sites)g(that)g(do)h(not)g(use)f(the)h(result)f(of)g(the)h (system)f(call,)2236 1176 y(the)g(e)o(xtension)h(creates)e(IR)g(to)h (check)g(the)g(system)g(call')l(s)f(return)2236 1259 y(v)n(alue)k(and,)f(if)f(it)g(is)g(an)h(error)m(,)g(call)f(an)h(error)g (procedure)h(\()p Fj(err)o(or)p Fm(\))2236 1342 y(to)h(print)f(it)g (out.)29 b(It)19 b(then)h(inserts)g(this)f(IR)g(into)h(the)f(original)h (IR)2236 1425 y(using)g Fj(AddStmt)p Fm(.)2050 1647 y Fn(4.3)90 b(Example:)33 b(safe)21 b(signal)i(handlers)2050 1780 y Fm(Unix)k(signal)g(handlers)h(represent)f(primiti)n(v)o(e)g (threads)h(of)f(controls.)2050 1863 y(Unfortunately)-5 b(,)28 b(the)o(y)d(are)h(used)g(by)g(man)o(y)g(programmers)h(who)f(are) 2050 1946 y(unf)o(amiliar)j(with)f(the)h(dangers)g(of)g(threaded)h (programs.)57 b(A)28 b(com-)2050 2029 y(mon)h(mistak)o(e)g(made)h(is)e (to)h(call)f(non-reentrant)i(library)f(functions)2050 2112 y(from)23 b(these)i(handlers.)42 b(If)24 b(the)f(application)i(w)o (as)f(suspended)i(in)e(the)2050 2195 y(middle)29 b(of)g(a)h(call)e(to)i (the)f(same)g(function)h(\(or)g(to)f(a)g(function)h(that)2050 2278 y(manipulates)20 b(state)f(it)g(depends)j(on\))d(the)h (application)h(program)f(will,)2050 2361 y(non-deterministically)-5 b(,)19 b(e)o(xhibit)g(incorrect)h(beha)o(vior)l(.)2162 2444 y(T)-6 b(o)20 b(help)h(pre)n(v)o(ent)g(this)f(class)h(of)f (problems)h(we)g(ha)o(v)o(e)f(de\256ned)h(an)2050 2528 y(e)o(xtension)30 b(that)g(pre)n(v)o(ents)h(calls)e(to)h(non-reentrant) h(functions)f(in)g(a)2050 2611 y(signal)18 b(handler)g(\(the)g(e)o (xtension')l(s)g(code)h(is)e(elided)h(for)g(bre)n(vity\).)27 b(The)2050 2694 y(e)o(xtension)20 b(w)o(orks)f(as)g(follo)n(ws:)2161 2853 y Fg(\017)37 b Fm(T)-6 b(o)33 b(trigger)g(checking)i(all)d(signal) i(handlers)g(adhere)g(to)f(the)2236 2936 y(naming)26 b(con)m(v)o(ention)h(of)e(pre\256xing)h(their)f(name)g(with)g(\252)p Fj(sig)p 3845 2936 V 26 w Fm(\272)2236 3019 y(\(e.g.,)19 b Fj(sig)p 2493 3019 V 25 w(pr)o(otection)p 2824 3019 V 29 w(fault)p Fm(\).)2161 3162 y Fg(\017)37 b Fm(The)16 b(e)o(xtension)g(scans)g(for)g(all)f(functions)h(be)o(ginning)h(with)e (this)2236 3245 y(pre\256x)j(and,)g(for)g(each)g(callsite,)f(checks)h (that)g(the)f(call)h(is)f(either)2236 3328 y(to)32 b(one)h(of)f(a)g (list)f(of)h(kno)n(wn)i(reentrant)e(functions)h(or)f(to)g(a)2236 3411 y(function)17 b(that)f(is)g(pre\256x)o(ed)h(with)f Fj(sig)p 3190 3411 V 25 w Fm(.)26 b(An)o(y)17 b(call)f(that)g(does)h (not)2236 3494 y(satisfy)i(these)g(requirements)h(is)f(\257agged.)2161 3637 y Fg(\017)37 b Fm(T)-6 b(o)31 b(ensure)g(that)g(only)g(check)o(ed) h(handlers)g(are)e(installed)h(as)2236 3720 y(signal)17 b(handlers)g(it)f(also)g(looks)h(for)f(handler)h(installation)f(calls) 2236 3803 y(and)33 b(checks)g(that)f(the)o(y)g(only)g(install)g (functions)g(be)o(ginning)2236 3886 y(with)19 b(the)g Fj(sig)p 2584 3886 V 44 w Fm(pre\256x.)2050 4108 y Fn(4.4)90 b(Example:)33 b(RPC)22 b(specialization)2050 4241 y Fm(Remote)i (procedure)h(call)e(\(RPC\))f(is)i(a)f(widely)h(used)h(abstraction)f (in)2050 4324 y(distrib)o(uted)17 b(programming.)28 b(A)17 b(signi\256cant)h(o)o(v)o(erhead)g(of)g(a)f(general-)2050 4407 y(purpose)11 b(RPC)g(call)g(is)g(the)g(cost)g(of)g(cop)o(ying)g (th)q(e)g(ca)q(ll')l(s)g(ar)o(guments)h(into)2050 4490 y(a)21 b(message)h(b)o(uf)n(fer)f(\(\252ar)o(gument)h (marshaling\272\).)35 b(Figure)21 b(3)g(presents)2050 4573 y(a)i(M)p Fl(A)n(GIK)g Fm(e)o(xtension)i(that)e(uses)h(partial)f (e)n(v)n(aluation)h(to)g(remo)o(v)o(e)g(the)2050 4656 y(main)h(contrib)o(utor)h(to)f(this)g(o)o(v)o(erhead,)j(the)d (interpretation)g(of)h(ar)o(gu-)2050 4740 y(ment)c(types,)i(by)f (crafting)g(marshaling)g(code)h(specialized)f(to)g(a)f(par)o(-)2050 4823 y(ticular)c(callsite.)2162 4906 y(The)i(e)o(xtensions)h (infrastructure)f(is)g(similar)f(to)h(that)g(used)h(to)f(im-)2050 4989 y(plement)i Fj(output)p Fm(:)36 b(it)21 b(scans)i(for)g(calls)f (to)g Fj(rpc)h Fm(and)g(e)o(xamines)g(the)f(its)2050 5072 y(ar)o(gument)17 b(which,)g(syntactically)-5 b(,)17 b(is)f(a)h(call)f(to)g(a)h(remote)f(function.)27 b(It)2050 5155 y(decomposes)19 b(this)d(call)h(into)g(its)f(constituent)i(pieces) f(and)g(then)h(b)o(uilds)2050 5238 y(marshaling)i(code)g(to)f(cop)o(y)h (each)g(ar)o(gument)g(in)f(the)g(RPC)g(call)g(into)g(a)2050 5321 y(memory)e(v)o(ector)l(.)27 b(It)16 b(then)i(re)n(writes)e(the)h (call)g(to)f Fj(rpc)i Fm(to)f(tak)o(e)g(a)g(pointer)p eop %%Page: 6 6 6 5 bop 0 83 a Fm(to)17 b(a)h(local)f(cop)o(y)i(of)f(the)f(remote)h (procedure)h(along)g(with)e(a)g(pointer)h(to)0 166 y(the)g(constructed) h(message)f(b)o(uf)n(fer)g(and)g(its)f(size.)27 b(A)17 b(sample)h(usage)h(is)0 249 y(as)g(follo)n(ws:)250 445 y Fj(int)j(k,j,i;)250 528 y(double)g(d;)250 611 y Fh(/)p Fg(\003)g Fh(...)e Fg(\003)p Fh(/)250 777 y(/)p Fg(\003)i Fh(call)f(remote)i(procedure)h(remote)p 1250 777 22 4 v 27 w(foo)e Fg(\003)p Fh(/)250 860 y Fj(rpc\(r)o(emote)p 583 860 V 29 w(foo\(j,)g(i,)f(k,)g(d\)\);)112 1116 y Fm(Of)16 b(course,)i(this)e(usage)h(can)g(be)g(made)g(prettier)f(by)h (communicat-)0 1199 y(ing)22 b(the)h(names)f(of)g(remote)h(procedures)g (to)f(the)h(e)o(xtension,)g(thereby)0 1282 y(eliminating)d(the)f(need)h (for)g(the)f Fj(rpc)i Fm(annotation.)29 b(F)o(or)19 b(simplicity)g(we)0 1365 y(do)28 b(not)f(perform)h(this)f(syntactic)h(cleanup)h(\(we)e (also)g(ignore)h(result)0 1448 y(passing\).)0 1678 y Fn(5)91 b(Code)22 b(transf)n(ormations)0 1839 y Fm(Code)32 b(transformations)f(in)m(v)o(olv)o(e)h(re)n(writing)f(or)g(augmenting)i (gen-)0 1922 y(eral)20 b(code)h(\(i.e.,)e(unlik)o(e)i(the)f(e)o (xtensions)h(described)h(in)e(the)g(pre)n(vious)0 2005 y(section,)34 b(their)c(domain)i(is)f(not)g(limited)f(to)h(a)f (speci\256c)h(interf)o(ace\).)0 2088 y(Example)18 b(code)h (transformations)f(are)g(softw)o(are)g(f)o(ault)g(isolation,)g(the)0 2171 y(translation)25 b(of)f(pointers)h(from)g(one)g(representation)g (to)g(another)m(,)h(or)0 2254 y(the)19 b(insertion)g(of)g(checks)h(to)f (ensure)h(a)e(pointer)i(use)f(is)g(not)g(nil.)112 2337 y(In)c(M)p Fl(A)n(GIK)p Fm(,)h(code)g(transformations)g(are)g (typically)f(implemented)0 2420 y(by)24 b(searching)h(for)f(speci\256c) f(IR)g(trees)h(and)g(\(possibly\))h(replacing)f(or)0 2503 y(augmenting)j(them.)47 b(T)-6 b(o)25 b(mak)o(e)h(this)f(style)h (of)f(usage)i(easy)-5 b(,)27 b(M)p Fl(A)n(GIK)0 2586 y Fm(pro)o(vides)17 b(an)f(interf)o(ace)g(specialized)g(to)g(this)f (domain.)27 b(IR)15 b(na)o(vigation)0 2669 y(can)35 b(be)g(implemented) h(using)f(M)p Fl(A)n(GIK)p Fm(-pro)o(vided)h(pattern)f(match-)0 2752 y(ing)29 b(routines)h(that)f(iterate)g(o)o(v)o(er)h(IR,)e (returning)i(all)e(locations)i(that)0 2835 y(e)o(xtension-speci\256ed)f (IR)e(trees)g(occur)h(at.)53 b(Re)n(writing)27 b(support)h(in-)0 2918 y(cludes)20 b(procedures)h(that)e(insert,)g(delete)h(and)g (augment)g(IR)f(subtrees.)0 3001 y(These)k(routines)h(isolate)e(the)h (programmer)h(from)f(implementation-)0 3084 y(speci\256c)d(details)g (of)f(IR)h(modi\256cation)g(\(e.g.,)f(the)h(need)h(to)f(update)h(all)0 3167 y(pointers)e(to)g(a)g(node)h(that)f(has)g(been)h(used)f(as)g(a)g (CSE\).)0 3389 y Fn(5.1)90 b(Example:)33 b(structur)n(e)21 b(packing)0 3523 y Fm(Dense)12 b(structure)g(layout)g(can)g(be)g(used)g (to)g(impro)o(v)o(e)g(locality)-5 b(.)26 b(Figure)12 b(4)0 3606 y(presents)32 b(a)f(data)g(structure)h(e)o(xtension)g(that)f (rearranges)h(structure)0 3689 y(\256elds)e(to)g(reduce)h(structure)g (size.)61 b(Using)30 b(the)g(same)h(capabilities)0 3772 y(e)o(xtensions)17 b(can)f(perform)g(man)o(y)h(useful)f(structure)g (transformations:)0 3855 y(\256elds)22 b(can)h(be)g(automatically)g (arranged)h(to)e(be)h(endian-neutral)g(and)0 3938 y(on)j(machines)g (that)f(lack)g(sub-w)o(ord)i(operations,)g(shorts)f(and)g(chars)0 4021 y(can)19 b(be)h(promoted)g(to)e(ints.)0 4243 y Fn(5.2)90 b(Example:)33 b(softwar)n(e)22 b(addr)n(ess)e(translation)0 4377 y Fm(Softw)o(are)j(address)h(translation)g(is)e(useful.)41 b(It)22 b(allo)n(ws)i(dif)n(ferent)f(ad-)0 4460 y(dressing)32 b(conte)o(xts)h(to)e(modularly)i(and)f(easily)g(share)g(of)f(pointer)o (-)0 4543 y(based)17 b(data)g(structures.)27 b(It)16 b(also)g(supports)i(easy)f(\252swizzling\272)g(where,)0 4626 y(for)22 b(instance,)h(the)f(disk)g(block)h(pointers)f(are)g (translated)g(to)g(their)f(in-)0 4709 y(core)e(equi)n(v)n(alents.)112 4792 y(A)24 b(common)i(trick)e(programmers)i(use)f(to)f(sa)o(v)o(e)h (space)g(is)f(to)g(re-)0 4875 y(place)19 b(pointers)f(with)g(small)g (inte)o(gers.)27 b(The)18 b(optimization)h(w)o(orks)g(by)0 4958 y(\256rst)27 b(de\256ning)h(a)f(base)h(of)n(fset)g(\(say)g(the)f (base)h(of)g(a)f(memory)i(arena)0 5041 y(that)c(all)g(data)h (structures)g(of)f(a)h(certain)f(type)h(are)g(allocated)g(out)f(of\))0 5124 y(and)d(then)g(replacing)g(pointers)g(with)g(small)f(inte)o(gers)g (that)h(record)g(an)0 5207 y(object')l(s)k(relati)n(v)o(e)f(of)n(fset)g (from)h(this)f(base.)46 b(Pointer)25 b(reconstitution)0 5290 y(is)i(performed)h(by)g(adding)h(the)e(of)n(fset)g(and)h(base)g (together)l(.)53 b(While)2236 839 y Fh(/)p Fg(\003)22 b Fh(Search)h(for)g(RPC)e(calls)h(and)g(generate)i(marshalling)e(code.) g Fg(\003)p Fh(/)2236 922 y Fj(int)g(MarshalGen\(X)p 2773 922 V 28 w(IR)e(r\))j(\340)2300 1005 y Fh(/)p Fg(\003)f Fh(foreach)h(callsite,)f(rewrite)h(the)f(output)h(call)e Fg(\003)p Fh(/)2300 1088 y Ff(for)p Fj(\()r(r)g(=)h(FirstCall\(r)-6 b(,)23 b(\\rpc"\);)2410 1171 y(r)e(!=)g(NULL;)h(r)f(=)h(NextCall\(r)-6 b(,)23 b(\\rpc"\)\))g(\340)2363 1254 y(I)p 2387 1254 V 25 w(IR)e(index,)h(marshalv;)43 b Fh(/)p Fg(\003)22 b Fh(marshalling)g(vector.)h Fg(\003)p Fh(/)2363 1337 y Fj(int)f(of)o(fset,)h(sz;)2363 1420 y(X)p 2410 1420 V 26 w(IR)e(a,)g(c;)2363 1586 y Fh(/)p Fg(\003)h Fh(Allocate)g (marshaling)h(array)g(on)f(stack.)g Fg(\003)p Fh(/)2363 1669 y Fj(marshalv)h(=)f(Array\(doubletype,)j(Nar)n(gs\(c\)\);)2363 1752 y(of)o(fset)f(=)d(0;)2363 1835 y(c)h(=)f(FirstAr)n(g\(r\);)k Fh(/)p Fg(\003)d Fh(Remote)h(call)e(is)g(\014rst)i(argument.)g Fg(\003)p Fh(/)2363 2001 y(/)p Fg(\003)f Fh(Store)h(each)g(argument)g (in)e(marshalling)h(vector.)h Fg(\003)p Fh(/)2363 2084 y Ff(for)p Fj(\(a)h(=)d(FirstAr)n(g\(c\);)k(a)c(!=)g(NULL;)h(a)f(=)g (NextAr)n(g\(a\)\))k(\340)2427 2167 y Fh(/)p Fg(\003)d Fh(ensure)h(correct)h(alignment.)e Fg(\003)p Fh(/)2427 2250 y Fj(of)o(fset)h(=)f(r)o(oundup\(of)o(fset,)k(NodeAlign\(a\)\);) 2427 2333 y(sz)c(=)f(NodeSize\(a\);)2427 2499 y Fh(/)p Fg(\003)h Fh(Form)g(expression)i(")p Fg(\003)p Fh(\(type)f Fg(\003)p Fh(\)\(marshal)h(+)e(of)o(fset\)")2575 2582 y(where)h(type)f(is)f(typeof\(a\).)j Fg(\003)p Fh(/)2427 2665 y Fj(index)e(=)f(Index\()2660 2748 y(Cast\(Copy\(marshalv\),)26 b(Ptr\(NodeT)-5 b(ype\(a\)\)\),)2745 2831 y(Cnsti\(of)o(fset/sz\)\);) 2427 2914 y Fh(/)p Fg(\003)22 b Fh(marshalv[of)o(fset])k(=)21 b(a)h Fg(\003)p Fh(/)2427 2997 y Fj(PushStmt\(c,)i(Asgn\(index,)f (ImportExprCopy\(a\)\)\);)2427 3163 y Fh(/)p Fg(\003)f Fh(Add)g(size)f(of)h(argument.)h Fg(\003)p Fh(/)2427 3246 y Fj(of)o(fset)g(+=)f(NodeSize\(a\);)2363 3329 y(\341)2363 3412 y Fh(/)p Fg(\003)g Fh(Replace)h(rpc)f(call)f(with)g(message)i (send;)f(send)h(takes)g(a)2427 3495 y(pointer)g(to)f(a)f(local)g(copy)i (of)f(the)g(remote)h(function)2427 3578 y(and)f(the)g(marshal)g(vector) i(and)e(size)g(as)f(arguments.)j Fg(\003)p Fh(/)2363 3661 y Fj(c)e(=)f(ReplaceExpr\(c,)2490 3744 y(Call\()q(\\send",)h (inttype,)2628 3827 y(CallName\(c\),)g(Copy\(marshalv\),)2766 3911 y(Cnsti\(of)o(fset\),)j(NULL\)\);)2321 3994 y(\341)2300 4077 y Ff(return)e Fj(MAGIK)p 2737 4077 V 25 w(OK;)2236 4160 y(\341)2050 4515 y Fm(Figure)g(3:)35 b(Extension)24 b(that)f(creates)h(specialized)g(marshaling)g(code)2050 4598 y(based)19 b(on)h(remote)f(procedure)h(call)f(ar)o(gument)h (types.)p eop %%Page: 7 7 7 6 bop 187 113 a Fh(/)p Fg(\003)22 b Fh(Used)g(by)f(qsort)j(to)d (compare)i(element)g(sizes.)f Fg(\003)p Fh(/)187 196 y Ff(static)g Fj(int)g(pack)p 616 196 22 4 v 27 w(cmp\()p Ff(const)h Fj(void)f Fg(\003)p Fj(p,)f Ff(const)i Fj(void)f Fg(\003)p Fj(q\))g(\340)229 279 y Ff(return)i Fj(FieldSize\()p Fg(\003)p Fj(\(Field)f Fg(\003)p Fj(\)p\))g(\343)e(FieldSize\()p Fg(\003)p Fj(\(Field)j Fg(\003)p Fj(\)q\);)187 362 y(\341)187 528 y Fh(/)p Fg(\003)e Fh(Look)g(for)g(structures)j(with)d("pack)p 1212 528 V 27 w(")f(pre\014x)i(and)293 611 y(minimize)d(their)j (storage)g(size)f(by)g(sorting)h(their)293 694 y(elements)f(by)g(size.) 43 b Fg(\003)p Fh(/)187 777 y Fj(void)21 b(Packer\(Symbol)k(p\))c(\340) 229 860 y(unsigned)i(n;)229 943 y(Field)e Fg(\003)p Fj(\015;)229 1109 y Ff(if)p Fj(\()q(strncmp\(StructName\(p\),)27 b(\\pack)p 1229 1109 V 27 w(",)21 b(5\))h(!=)f(0\))296 1192 y Ff(return)p Fj(;)229 1275 y Fh(/)p Fg(\003)h Fh(Get)g(\014elds)g Fg(\003)p Fh(/)229 1358 y Fj(\015)g(=)f(ImportFields\(p,)i(&n\);)229 1441 y Fh(/)p Fg(\003)f Fh(Sort)h(them.)e Fg(\003)p Fh(/)229 1524 y Fj(qsort\(\015,)j(n,)d Ff(sizeof)h Fj(\015[0],)g(pack)p 1077 1524 V 27 w(cmp\);)229 1607 y Fh(/)p Fg(\003)g Fh(W)o(rite)f(them) h(out.)g Fg(\003)p Fh(/)229 1690 y Fj(ExportFields\(p,)i(\015,)d(n\);) 187 1773 y(\341)0 2129 y Fm(Figure)26 b(4:)41 b(Routine)27 b(to)f(minimize)g(structure)g(size)g(by)h(sorting)f(ele-)0 2212 y(ments)19 b(by)h(alignment)f(requirements.)0 2460 y(pro\256table)j(\(especially)g(on)g(64-bit)g(machines\))g(manual)g (application)0 2543 y(of)g(this)g(optimization)h(is,)f(unsurprisingly) -5 b(,)25 b(some)n(what)e(prone)g(to)f(er)o(-)0 2627 y(rors.)k(W)-6 b(e)18 b(present)g(an)g(e)o(xtension)h(that)f (automatically)g(performs)g(this)0 2710 y(transformation.)52 b(\()p Fk(F)-8 b(or)26 b(time)h(r)m(easons)h(we)f(elide)g(this)f(e)o (xample:)44 b(it)0 2793 y(will)18 b(be)h(contained)h(in)f(the)g (\256nal)h(paper)-8 b(.)p Fm(\))0 3023 y Fn(6)91 b(Extensible)22 b(compilation:)33 b(patter)o(ns)21 b(of)i(use)0 3183 y Fm(This)c(section)h(delineates)g(some)g(broad)g(classes)g(of)g(e)o (xtensible)g(com-)0 3267 y(piler)13 b(uses.)26 b(Both)13 b(simple)h(and)g(ambitious)g(e)o(xamples)g(are)g(included)g(to)0 3350 y(gi)n(v)o(e)20 b(a)f(\257a)o(v)o(or)g(of)g(the)h(range)g(of)f (operations)i(that)e(can)h(be)f(performed.)0 3433 y(Man)o(y)j(of)f(the) f(e)o(xamples)i(pro)o(vide)g(programmers)g(with)e(capabilities)0 3516 y(not)f(pre)n(viously)h(a)o(v)n(ailable.)0 3708 y Fn(User)43 b(semantic)f(optimization)75 b Fm(As)36 b(described)i(in)e(Sec-)0 3791 y(tion)19 b(4,)h(the)f(languages)i (de\256ned)f(by)g(interf)o(ace')l(s)g(functions)g(and)g(data)0 3874 y(structures)30 b(ha)o(v)o(e)g(not)f(had)i(optimizers)e(that)h (understood)h(their)e(se-)0 3957 y(mantics.)37 b(Since)23 b(the)f(operations)i(de\256ned)f(by)g(these)f(languages)i(are)0 4040 y(hea)o(vy-weight,)15 b(pro)o(viding)f(a)e(mechanism)i(to)f (incorporate)g(this)g(infor)o(-)0 4123 y(mation)23 b(of)n(fers)g(the)g (potential)g(of)g(speed)h(impro)o(v)o(ements)g(e)o(xceeding)0 4206 y(the)19 b(impact)g(of)g(all)f(other)i(compiler)f(optimizations.) 112 4289 y(An)28 b(e)o(xample)h(of)f(this)f(style)h(of)g(use)g(is)g(an) g(e)o(xtension)h(that)f(un-)0 4372 y(derstands)22 b(remote)g(procedure) g(call)f(\(RPC\).)f(When)h(it)g(encounters)h(a)0 4455 y(series)k(of)h(RPCs,)g(it)f(can)h(aggre)o(gate)g(them)g(into)f(a)g (single)h(message)0 4538 y(\(impro)o(ving)20 b(throughput\))g(and)g(by) f(looking)h(for)f(de\256nitions)g(of)g(their)0 4621 y(operands)26 b(and)f(uses)g(of)g(their)f(results,)i(replace)f(synchronous)i(RPC)0 4704 y(with)g(asynchronous,)32 b(and)c(push)g(the)f(call)h(higher)g(in) f(the)g(program)0 4787 y(te)o(xt,)19 b(and)h(the)f(check)h(for)g (completeness)g(right)f(before)h(an)o(y)g(use)g(\(im-)0 4870 y(pro)o(ving)27 b(latenc)o(y\).)50 b(Similar)25 b(optimizations)i(can)g(be)f(done)i(for)e(\256le)0 4953 y(I/O.)112 5036 y(Another)e(e)o(xample)f(is)g(an)g(e)o(xtension)h(that) f(optimizes)h(calls)e(to)h(a)0 5119 y(graphics)29 b(library)-5 b(.)54 b(Consider)28 b(a)g(sequence)h(of)f(calls)g(that)f(manipu-)0 5202 y(late)f(a)g(matrix.)48 b(Using)27 b(a)f(library-speci\256c)g(e)o (xtension,)j(it)c(is)h(possi-)0 5285 y(ble)20 b(to)f(optimize)h(across) g(these)g(calls,)f(reusing)h(intermediate)g(results)2050 83 y(the)o(y)13 b(compute,)i(eliminating)e(intermediate)h(copies,)g (and)g(performing)2050 166 y(cache)19 b(optimizations)h(across)f(them.) 2162 249 y(Finally)-5 b(,)21 b(a)h(\252big)g(num\272)g(package)h(can)g (optimize)e(across)i(calls)e(to)2050 332 y(its)d(operations.)2162 415 y(Operationally)-5 b(,)35 b(this)c(approach)i(can)f(pro)o(vide)g(a) f(performance)2050 498 y(gain)g(for)g(an)o(y)h(situation)g(where)g(a)f (system')l(s)h(implementor)g(could)2050 581 y(look)15 b(at)f(a)g(section)g(of)h(code)g(and)g(implement)g(a)f(specialized)h (operation)2050 664 y(to)33 b(capture)h(the)g(same)g(functionality)-5 b(.)72 b(The)34 b(challenge)g(with)g(the)2050 747 y(e)o(xtensions)20 b(is)e(to)h(codify)h(this)e(kno)n(wledge.)2050 939 y Fn(Extension)c(of)i(compiler)e(b)n(uiltins)76 b Fm(Incorporating)14 b(kno)n(wl-)2050 1023 y(edge)27 b(of)f(functions)i(into)e(compilers)h (in)f(the)h(form)f(of)h(\252b)o(uiltins\272)f(is)2050 1106 y(pro\256table)17 b(both)h(in)g(terms)f(of)h(syntactic)f(sugar)h (and)g(in)g(performance.)2050 1189 y(Unfortunately)-5 b(,)25 b(the)f(inclusion)h(of)f(b)o(uiltins)f(requires)h(the)g(interv)o (en-)2050 1272 y(tion)13 b(\(and)g(interest\))g(of)g(compiler)h (writers)e(rather)h(than)g(system)h(imple-)2050 1355 y(mentors.)35 b(Consequently)-5 b(,)24 b(it)d(has)h(been)h(put)f(to)f (limited)g(use)h(despite)2050 1438 y(its)f(utility)-5 b(.)34 b(Using)22 b(M)p Fl(A)n(GIK)p Fm(,)h(implementors)f(can)g (easily)g(add)g(b)o(uiltin)2050 1521 y(procedures.)2162 1604 y(There)28 b(are)g(man)o(y)h(simple)f(routines)h(\(sorting,)h (searching,)h(tree)2050 1687 y(and)c(list)f(manipulations\))i(that)f (are)f(constantly)i(reimplemented)g(in)2050 1770 y(order)20 b(to)g(w)o(ork)h(on)f(dif)n(ferent)g(types.)31 b(Using)21 b(M)p Fl(A)n(GIK)f Fm(these)g(routines)2050 1853 y(can)29 b(be)h(de\256ned)g(once,)i(by)e(an)f(e)o(xtension,)k(and)d(then)g(used) g(by)f(all)2050 1936 y(application)16 b(writers.)25 b(T)-6 b(o)14 b(illustrate)h(this)g(capability)g(we)h(ha)o(v)o(e)f(imple-)2050 2019 y(mented)25 b(a)f(simple)g(e)o(xtension)h(that)f(de\256nes)h(a)f Fj(max)g Fm(procedure)i(that)2050 2102 y(w)o(orks)19 b(on)h(an)o(y)f(scaler)g(ar)o(gument)h(type.)2162 2185 y(T)-6 b(o)23 b(sho)n(w)g(ho)n(w)h(M)p Fl(A)n(GIK)f Fm(can)h(be)f(used) h(to)f(de\256ne)h(b)o(uiltin)e(proce-)2050 2268 y(dures)j(for)f(impro)o (v)o(ed)h(performance)h(we)e(ha)o(v)o(e)h(also)f(written)g(an)h(e)o(x-) 2050 2351 y(tension)15 b(that)g(recognizes)i(the)e(ANSI)f(C)h Fj(memcpy)g Fm(\(\252memory)h(cop)o(y\272\))2050 2434 y(function.)28 b(The)20 b(e)o(xtension)g(e)o(xploits)f(information)h(M) p Fl(A)n(GIK)g Fm(pro)o(vides)2050 2517 y(to)25 b(specialize)g(to)g (the)g(local)g(characteristics)g(of)g(each)h(callsite.)44 b(F)o(or)2050 2600 y(e)o(xample,)21 b(in)g(the)g(general)g(case,)h Fj(memcpy)f Fm(must)g(treat)f(its)g(operands)2050 2683 y(as)13 b(unaligned.)26 b(Ho)n(we)n(v)o(er)m(,)15 b(using)f(the)g (semantic)g(information)g(M)p Fl(A)n(GIK)2050 2766 y Fm(pro)o(vides,)i(the)e(e)o(xtension)h(can)g(determine)g(when)g(a)g (call)f(site')l(s)f(pointer)2050 2849 y(operands)18 b(are)f(aligned)g (and)g(specialize)h(accordingly)-5 b(.)27 b(Additionally)-5 b(,)2050 2932 y(it)16 b(unrolls)i(and)g(inlines)f(the)g(memory)h(cop)o (ying)h(loop)f(when)g(the)f(num-)2050 3015 y(ber)e(of)g(bytes)h(to)f (cop)o(y)h(is)f(a)g(constant,)h(Static)e(specialization)i(remo)o(v)o (es)2050 3098 y(runtime)d(selection)g(o)o(v)o(erhead,)i(and)e(shrinks)h (the)f(function')l(s)g Fj(memcpy)2050 3181 y Fm(footprint)j(\(due)i(to) e(the)h(f)o(act)f(that)h(the)f(gaps)h(introduced)h(by)f(non-tak)o(en) 2050 3264 y(cases)j(is)g(eliminated\).)31 b(These)21 b(optimizations)g(are)f(pro\256table)h(in)f(the)2050 3347 y(conte)o(xt)13 b(of)h(operating)g(system)f(de)n(vice)h(dri)n(v)o (er)g(and)g(netw)o(orking)g(code,)2050 3430 y(which)i(can)g(e)o(xtensi) n(v)o(ely)h(access)f(\256x)o(ed-sized)g(quantities)g(of)g(partially) 2050 3513 y(unaligned)k(memory)-5 b(.)2050 3705 y Fn(P)o(artial)25 b(e)o(v)o(aluation)73 b Fm(A)21 b(more)h(general)g(form)f(of)g(b)o (uiltin)g(spe-)2050 3789 y(cialization)e(is)g(full)g(partial)h(e)n(v)n (aluation.)30 b(Using)19 b(an)h(e)o(xtensible)g(com-)2050 3872 y(piler)m(,)c(both)i(automated)g(systems)g(and)f(programmers)h (construct)g(par)o(-)2050 3955 y(tial)i(e)n(v)n(aluators)i(for)f (important)g(routines.)34 b(F)o(or)21 b(e)o(xample,)h(Section)f(4)2050 4038 y(described)14 b(an)g(e)o(xtension)g(that)f(generated)h (specialized)h(code)f(for)f(RPC)2050 4121 y(marshaling.)2050 4313 y Fn(Structur)n(e)28 b(awar)n(eness)72 b Fm(The)24 b(ability)h(to)f(automatically)h(tra-)2050 4396 y(v)o(erse,)13 b(rearrange,)i(rede\256ne,)f(and)e(augment)g(data)g(structure)g (members)2050 4479 y(enables)21 b(interesting)f(operations.)32 b(Data)20 b(structure)g(tra)o(v)o(ersal)g(allo)n(ws)2050 4562 y(the)33 b(de\256nition)g(of)g(structure)g(independent)i(routines) f(for)f(sorting,)2050 4645 y(searching,)21 b(marshaling,)h(and)f (printing.)32 b(Control)21 b(of)g(data)g(structure)2050 4728 y(layout)33 b(can)g(impro)o(v)o(e)h(performance)g(by)g(allo)n (wing)f(e)o(xtensions)h(to)2050 4811 y(group)18 b(member)g(\256elds)f (that)g(are)g(used)h(close)f(together)h(into)f(the)g(same)2050 4894 y(cache)j(line,)g(impro)o(ving)h(cache)g(beha)o(vior)l(.)31 b(It)19 b(can)i(also)f(enhance)i(us-)2050 4977 y(ability)d(by)h (enabling)g(e)o(xtensions)h(to)e(abstract)g(a)o(w)o(ay)h(such)h (details)e(as)2050 5060 y(endianness)28 b(by)e(automatically)h (rearranging)g(structures)g(to)f(be)h(en-)2050 5143 y(dian)18 b(neutral.)27 b(Data)18 b(structure)h(rede\256nition)f(can)h(impro)o(v) o(e)g(speed)g(on)2050 5226 y(machines)26 b(that)g(do)h(not)f(pro)o (vide)g(sub-w)o(ord)i(memory)e(instructions)2050 5309 y(by)e(allo)n(wing)g(an)h(e)o(xtension)g(to)f(replace)g(sub-w)o(ord)h (sized)g(structure)p eop %%Page: 8 8 8 7 bop 187 113 a Fh(/)p Fg(\003)22 b Fh(Look)g(for)g(function)h(calls) f(or)g(assignments)i Fg(\003)p Fh(/)187 196 y Ff(static)e Fj(int)g(HasSideEf)o(fect\(X)p 949 196 22 4 v 29 w(IR)f(c\))h(\340)250 279 y Ff(if)p Fj(\()q(!c\))317 362 y Ff(return)h Fj(0;)250 445 y Ff(else)f(if)p Fj(\(Op\(c\))h(==)f(ASGN)f Fg(jj)h Fj(Op\(c\))h(==)f(CALL\))314 528 y Ff(return)h Fj(1;)250 611 y Ff(else)314 694 y(return)g Fj(HasSideEf)o(fect\(Left\(c\))q(\)) 462 777 y Fg(jj)f Fj(HasSideEf)o(fect\(Right\(c\)\);)187 860 y(\341)187 1026 y Fh(/)p Fg(\003)g Fh(Check)g(that)h(assertions)h (do)e(not)g(contain)335 1109 y(side\343ef)o(fecting)i(optations.)f Fg(\003)p Fh(/)187 1192 y Fj(int)e(AssertCk\(X)p 620 1192 V 29 w(IR)g(c\))h(\340)250 1275 y Ff(for)p Fj(\()r(c)g(=)f (FirstCall\(c,)i(\\assert"\);)360 1358 y(c)f(!=)f(NULL;)360 1441 y(c)h(=)f(NextCall\(c,)h(\\assert"\)\))j(\340)356 1607 y Fh(/)p Fg(\003)d Fh(The)g(assertion)i(expression)f(is)f(the)g (call's)504 1690 y(\014rst)h(argument.)g Fg(\003)p Fh(/)335 1773 y Ff(if)p Fj(\()q(HasSideEf)o(fect\(FirstAr)n(g\(c)q(\)\))q(\))402 1856 y(warning\(\\assert)i(has)d(a)g(side\343ef)o(fect\342n"\);)250 1939 y(\341)250 2022 y Ff(return)i Fj(MAGIK)p 688 2022 V 25 w(OK;)187 2105 y(\341)0 2461 y Fm(Figure)18 b(5:)27 b(Routine)19 b(to)f(guarantee)i(that)e(assertions)h(are)f(free)h(of)f (side-)0 2544 y(ef)n(fects.)0 2777 y(elements)24 b(with)f(w)o (ord-sized)h(ones.)41 b(Data)23 b(structure)h(augmentation)0 2860 y(allo)n(ws)19 b(functionality)h(enhancements)h(such)f(as)f (automatic)g(addition)0 2943 y(of)26 b(bookk)o(eeping)j(\256elds)c (needed)i(by)g(reference)f(counting)h(garbage)0 3026 y(collectors.)0 3219 y Fn(Added)35 b(safety)74 b Fm(M)p Fl(A)n(GIK)30 b Fm(of)n(fers)g(impro)o(v)o(ed)h(softw)o(are)f(quality)0 3302 y(in)h(addition)h(to)f(higher)h(performance.)65 b(Using)31 b(it,)i(implementors)0 3385 y(can)d(construct)h(check)o(ers) g(more)g(stringent)f(than)g(pro)o(vided)i(by)e(the)0 3468 y(compiler)25 b(proper)g(as)f(well)g(as)g(inserting)g(code)i(to)e (check)h(for)f(errors)0 3551 y(at)30 b(runtime.)60 b(F)o(or)29 b(e)o(xample,)k(to)d(ensure)g(stronger)h(pointer)f(safety)-5 b(,)0 3634 y(M)p Fl(A)n(GIK)17 b Fm(can)g(be)g(used)g(to)g(construct)g (a)f(code)i(inspector)f(that)g(statically)0 3717 y(checks)23 b(the)f(IR)f(generated)i(at)e(compile)h(time)g(to)f(disallo)n(w)h(all)f (casts,)0 3800 y(implicit)15 b(con)m(v)o(ersions,)j(and)f(adds)f (runtime)g(checks)h(to)f(guard)h(against)0 3883 y(o)o(v)o(er)27 b(and)g(under\257o)n(w)g(of)g(numbers,)i(nil)d(and)h(bogus)h(pointers,) g(and)0 3966 y(out-of-bound)f(array)f(accesses.)47 b(Figure)26 b(5)f(presents)h(an)g(e)o(xtension)0 4049 y(that)19 b(guards)h(against) f(side-ef)n(fects)g(in)g(assertion)g(macros.)112 4132 y(The)36 b(ability)f(to)h(insert)g(inte)o(grity)g(checks)g(without)g (requiring)0 4215 y(source)g(modi\256cation)g(is)f(a)h(po)n(werful)g (prophylactic)g(measure)g(to)0 4298 y(guard)28 b(against)f(errors,)h (and)g(can)f(serv)o(e)g(to)g(ele)n(v)n(ate)g(C)f(\(some)n(what\))0 4381 y(to)19 b(the)g(realm)g(of)g(modern)g(languages.)0 4573 y Fn(P)o(assing)14 b(compiler)g(inf)n(ormation)g(to)g (applications)69 b Fm(Com-)0 4656 y(pilers)22 b(compute)h(much)g (useful)f(information.)37 b(M)p Fl(A)n(GIK)22 b Fm(pro)o(vides)h(an)0 4739 y(infrastructure)15 b(that)f(can)i(be)f(used)g(to)g(pass)g(this)f (information)h(to)g(appli-)0 4822 y(cations.)26 b(T)-6 b(w)o(o)14 b(e)o(xample)h(e)o(xtensions)g(we)f(ha)o(v)o(e)h(b)o(uilt)e (in)i(this)f(spirit)f(are)0 4905 y(an)23 b(e)o(xtension)g(that,)g(gi)n (v)o(en)g(a)f(pointer)h(to)f(a)g(type,)h(returns)g(the)f(align-)0 4988 y(ment)d(of)g(that)f(type)h(\(this)f(is)h(useful)g(for)f(memory)i (allocators\))f(and)g(an)0 5071 y(e)o(xtension)f(that)f(tak)o(es)h(a)f (single)g(ar)o(gument)h(and)g(indicates)f(whether)h(it)0 5154 y(is)h(a)f(constant)i(e)o(xpression)g(\(useful)f(in)g(making)h (inline)f(decisions\).)2050 83 y Fn(Code)25 b(transf)n(ormations)72 b Fm(The)22 b(ability)f(to)g(augment)i(code)f(is)2050 166 y(po)n(werful.)39 b(Using)24 b(M)p Fl(A)n(GIK)p Fm(')l(s)f(interf)o (aces,)h(applications)f(can)h(imple-)2050 249 y(ment)16 b(a)h(v)n(ast)g(set)f(of)h(code)g(transformations)g(such)h(as)e(the)h (insertion)g(of)2050 332 y(reference)k(counting,)h(softw)o(are)f (address)g(translation)g(\(as)g(described)2050 415 y(in)f(Section)g (5\),)h(or)f(pro)o(viding)i(protection)f(via)g(softw)o(are)g(f)o(ault)f (isola-)2050 498 y(tion)f([14].)2162 581 y(An)14 b(interesting)h (optimization)f(is)g(to)g(encode)i(the)e(e)o(xpected)i(result)2050 664 y(of)23 b(interf)o(ace)h(calls)g(in)f(an)h(e)o(xtension.)42 b(These)24 b(\252annotations\272)h(allo)n(w)2050 747 y(the)c(e)o(xtension)i(to)e(rearrange)h(code)h(so)e(that)h(the)f (conditional)i(bodies)2050 830 y(of)d(une)o(xpected)h(cases)g(are)f(mo) o(v)o(ed)g(of)n(f)g(of)g(the)g(commonly)i(e)o(x)o(ecuted)2050 913 y(path,)14 b(thereby)g(impro)o(ving)f(both)h(instruction)f (prefetching)h(queue)g(and)2050 996 y(instruction)19 b(cache)h(utilization.)2050 1189 y Fn(Exploiting)40 b(type)h(inf)n (ormation)74 b Fm(The)33 b(ability)h(to)f(access)2050 1272 y(symbol)17 b(table)f(information)g(enables)h(operations)h(not)e (typically)g(sup-)2050 1355 y(ported)30 b(in)f(Algol)h(languages.)61 b(F)o(or)29 b(e)o(xample,)j(programmers)f(can)2050 1438 y(use)e(M)p Fl(A)n(GIK)g Fm(to)f(pass)i(types)f(as)g(ar)o(guments)g(to) g(functions)g(such)h(as)2050 1521 y Fe(malloc)17 b Fm(so)i(it)g(can)g (track)g(the)g(pointer)g(type)h(it)e(is)h(allocating)g(and)g(be)2050 1604 y(accurate)14 b(\(rather)g(than)h(conserv)n(ati)n(v)o(e\))h(in)e (the)g(alignment)h(it)e(pro)o(vides.)2050 1796 y Fn(In)l(v)o (estigation)73 b Fm(Ready)25 b(access)g(to)f(a)h(semantically-rich)g (inter)o(-)2050 1879 y(mediate)17 b(language)h(can)g(be)f(used)g(to)g (answer)g(man)o(y)h(questions)g(about)2050 1962 y(source-le)n(v)o(el)25 b(code.)46 b(F)o(or)24 b(e)o(xample,)j(it)d(can)h(be)h(used)f(to)g(v)o (erify)g(hy-)2050 2045 y(pothesis)17 b(about)g(softw)o(are)g (engineering)h(by)f(correlating)g(b)o(ug)g(reports)2050 2128 y(to)j(ho)n(w)h(man)o(y)g(times)f(an)h(abstraction)g(layer)g(is)f (brok)o(en)i(\(perhaps)f(by)2050 2211 y(tracking)c(structure)f (accesses\))h(or)f(by)h(correlating)g(ease)f(of)h(modi\256ca-)2050 2294 y(tion)23 b(to)g(the)g(number)i(of)e(intermodule)h(dependencies)h (a)f(source)g(\256le)2050 2377 y(has.)k(Checks)20 b(can)f(be)h (inserted)f(to)g(check)i(for)e(the)g(aliasing)g(of)g(point-)2050 2460 y(ers)14 b(to)h(determine)h(what)f(optimizations)g(w)o(ould)h(be)f (pro\256table.)26 b(It)14 b(can)2050 2543 y(also)24 b(be)h(used)g(to)g (support)g(graphical)h(performance)f(monitoring)h(in)2050 2626 y(the)14 b(spirit)f(of)h(Jef)n(fery)g(and)g(Grisw)o(old)g([6])g (by)g(automatically)g(inserting)2050 2709 y(display)19 b(calls)g(around)h(interf)o(ace)f(uses.)2050 2902 y Fn(Other)c(Uses)74 b Fm(There)13 b(are)h(man)o(y)g(other)g(uses)g(for)f(e)o(xtensible)h (com-)2050 2985 y(pilation.)44 b(F)o(or)23 b(e)o(xample,)k(man)o(y)e (uses)g(of)g(Atom)f(can)h(also)g(be)g(done)2050 3068 y(using)c(M)p Fl(A)n(GIK)p Fm(\(the)f(tradeof)n(f)h(is)f(less)h (generality)g(for)f(more)h(informa-)2050 3151 y(tion)e(and)g (optimization\).)28 b(It)18 b(pro)o(vides)i(an)g(easy)f(w)o(ay)h(to)f (incorporate)2050 3234 y(annotations)25 b(into)f(the)g(optimization)h (phase)f(by)h(looking)g(for)f(anno-)2050 3317 y(tations)f(in)g(the)h (form)f(of)g(function)i(in)m(v)o(ocations.)41 b(It)22 b(can)i(be)g(used)g(to)2050 3400 y(restrict)d(allo)n(w)o(able)i (operations)g(in)f(the)g(input)h(language)g(in)f(order)h(to)2050 3483 y(mak)o(e)30 b(it)f(more)h(amenable)g(to)f(optimization.)60 b(Or)29 b(it)f(can)i(be)g(used)2050 3566 y(augment)h(the)g(base)f (language)i(with)e(abilities)g(such)h(as)g(e)o(xception)2050 3649 y(handling.)2162 3732 y(W)m(ith)i(a)h(suf)n(\256ciently)f(rich)h (intermediate)g(language)i(M)p Fl(A)n(GIK)p Fm(')l(s)2050 3815 y(e)o(xtension)29 b(frame)n(w)o(ork)h(can)f(be)h(used)f(to)g(mak)o (e)g(its)g(compiler)g(into)2050 3898 y(a)k(truly)h(open)h(system,)j (where)c(a)g(v)n(ariety)g(of)g(implementors)g(can)2050 3981 y(augment)15 b(its)f(core)g(optimization)h(abilities)f(with)g(ne)n (w)g(optimizations.)2050 4064 y(In)h(this)g(manner)m(,)i(compiler)e (optimizations)h(w)o(ould)g(become)h(an)e(order)2050 4147 y(of)k(magnitude)h(easier)f(to)f(disseminate.)2050 4377 y Fn(7)91 b(Discussion)2050 4538 y Fm(M)p Fl(A)n(GIK)17 b Fm(attempts)h(to)g(literally)f(mak)o(e)h(\252library)g(design)g (language)i(de-)2050 4621 y(sign.)-5 b(\272)51 b(It)27 b(does)g(this)g(by)h(attacking)g(the)f(three)g(crucial)g(dif)n (ferences)2050 4704 y(between)22 b(writing)f(a)g(function-le)n(v)o(el)h (interf)o(ace)g(and)g(de\256ning)g(an)g(in-)2050 4787 y(put)29 b(language)h(and)g(compiler)l(.)57 b(The)29 b(\256rst)f(dif)n(ference)h(is)g(ob)o(vious:)2050 4870 y(languages)23 b(ha)o(v)o(e)g(syntactic)g(sugar)m(,)g(libraries)f(do)g (not.)37 b(By)23 b(enabling)2050 4953 y(interf)o(ace)f(designers)g(to)g (include)g(conte)o(xt-)h(and)f(semantic-sensiti)n(v)o(e)2050 5036 y(code)f(transformers,)f(sugar)g(can)h(be)g(judiciously)g(added)g (to)f(function)2050 5119 y(interf)o(aces)31 b(\(e.g.,)i(as)d(done)i(in) e(the)h Fj(output)i Fm(and)e Fj(rpc)g Fm(e)o(xamples)h(in)2050 5202 y(Section)23 b(4\).)42 b(The)23 b(second)i(dif)n(ference)g(is)e (more)h(subtle:)37 b(languages)2050 5285 y(allo)n(w)32 b(semantic)g(checks)h(that)f(can)h(be)f(dif)n(\256cult)g(for)g(a)g (library)g(to)p eop %%Page: 9 9 9 8 bop 0 83 a Fm(replicate)23 b(in)h(terms)f(of)g(its)g (implementation)h(language.)42 b(By)23 b(gi)n(ving)0 166 y(e)o(xtensions)g(access)g(to)e(both)i(the)f(symbol)h(table)f(and)g (function-le)n(v)o(el)0 249 y(IR)k(this)g(barrier)h(can)g(be)f (eliminated.)50 b(Finally)-5 b(,)28 b(languages)g(can)f(be)0 332 y(optimized.)50 b(Encoding)27 b(their)f(semantics)h(in)f(a)g (compiler)h(allo)n(ws)f(a)0 415 y(ready)f(implementation)g(of)e(both)i (local)f(\(e.g.,)h(peephole)g(optimiza-)0 498 y(tion\))20 b(and)h(global)g(\(e.g.,)f(CSE\))f(optimizations.)32 b(Current)21 b(compilers)0 581 y(are)30 b(blind)g(to)g(interf)o(ace)g (semantics,)j(precluding)e(analogous)g(opti-)0 664 y(mizations.)46 b(M)p Fl(A)n(GIK)25 b Fm(pro)o(vides)i(mechanisms)f(that)f(can)h(be)f (used)h(to)0 747 y(b)o(uild)18 b(interf)o(ace)h(optimizers)f(that)g (optimize)h(interf)o(ace)f(primiti)n(v)o(es)g(as)0 830 y(aggressi)n(v)o(ely)i(as)f(source)h(language)g(constructs.)0 1052 y Fn(7.1)90 b(Interface)21 b(issues)0 1186 y Fm(An)12 b(interesting)g(research)g(question)g(is)g(determining)g(the)h(design)g (rules)0 1269 y(for)22 b(b)o(uilding)g(interf)o(aces)g(that)g(are)g (amenable)h(to)e(language-lik)o(e)j(op-)0 1352 y(timization)30 b(techniques.)63 b(T)-6 b(w)o(o)30 b(principles)h(seem)g(relati)n(v)o (ely)f(safe.)0 1435 y(First,)d(high-le)n(v)o(el)g(optimization)g(is)f (aided)h(by)f(the)h(use)f(of)h(declara-)0 1518 y(ti)n(v)o(e,)22 b(high-le)n(v)o(el)g(interf)o(aces)g(that)f(can)h(then)g(be)g (\252strength-reduced\272)0 1601 y(to)32 b(the)g(characteristics)g(of)g (local)h(usage.)67 b(Second,)36 b(optimization)0 1684 y(across)20 b(interf)o(ace)f(calls)g(is)g(eased)h(if)f(the)g(result)g (of)g(one)h(interf)o(ace)f(call)0 1767 y(is)29 b(immediately)g(used)h (by)f(another:)48 b(function)30 b(call)f(nesting)g(is)g(an)0 1850 y(ideal)d(w)o(ay)h(of)f(eliminating)g(data-\257o)n(w)h (ambiguities.)49 b(Thoroughly)0 1933 y(codifying)20 b(practical)f (precepts)h(will)e(be)h(challenging.)112 2016 y(Careful)g(\(b)o(ut,)f (unfortunately)-5 b(,)20 b(iterati)n(v)o(e\))f(design)h(of)f(the)g(M)p Fl(A)n(GIK)0 2099 y Fm(system)j(has)g(allo)n(wed)g(us)g(b)o(uild)f(it)g (so)h(that)g(it)f(is)g(inte)o(grated)h(with)f(the)0 2182 y(infrastructure)15 b Fj(lcc)h Fm(uses)f(to)g(construct)h(its)f (internal)g(IR.)g(An)g(important)0 2265 y(result)24 b(of)h(this)f(inte) o(gration)g(is)g(that)g(we)h(ha)o(v)o(e)f(been)h(able)g(to)f(use)h(the) 0 2348 y(frontend)30 b(routines)g Fj(lcc)g Fm(pro)o(vides)g(for)g (constructing)g(abstract)g(syn-)0 2431 y(tax)23 b(trees.)41 b(Using)23 b(this)g(code)h(has)g(tw)o(o)g(signi\256cant)f(bene\256ts.) 41 b(First,)0 2514 y(it)23 b(allo)n(ws)h(users)g(to)g(only)g(specify)h (types)f(when)h(de\256ning)f(constants)0 2597 y(and)f(symbols:)36 b(the)23 b(remaining)g(IR-construction)h(routines)f(can)g(de-)0 2680 y(ri)n(v)o(e)d(required)g(types)g(from)g(conte)o(xt)h(\(e.g.,)e Fj(Add)h Fm(can)g(determine)g(it)g(is)0 2763 y(an)26 b(inte)o(ger)g(addition)h(by)g(e)o(xamining)g(its)e(operands\).)49 b(Eliminating)0 2846 y(the)17 b(need)i(to)e(e)o(xplicitly)g(encode)i (types)f(has)g(dramatically)f(simpli\256ed)0 2929 y(M)p Fl(A)n(GIK)p Fm(')l(s)27 b(code)i(construction)f(interf)o(ace.)53 b(Second,)29 b Fj(lcc)p Fm(')l(s)f(routines)0 3012 y(are)g(designed)i (to)e(perform)g(implicit)g(con)m(v)o(ersions)i(as)e(required)h(by)0 3095 y(the)22 b(rules)f(for)g(ANSI)g(C.)g(As)g(a)g(result,)h(the)o(y)g (type-check)h(their)e(ar)o(gu-)0 3178 y(ments)h(\(pro)o(viding)h(users) e(with)h(safety\))f(and)h(perform)g(coercions)h(as)0 3261 y(necessary)d(\(pro)o(viding)g(users)f(with)g(con)m(v)o (enience\).)112 3344 y(There)g(are)h(a)f(fe)n(w)g(challenges)h(to)g (using)f(the)h(current)f(IR)g(system.)0 3427 y(The)24 b(\256rst)g(is)g(dealing)h(with)f(IR)g(tree)h(layouts)g(across)g (compiler)g(v)o(er)o(-)0 3510 y(sions.)48 b(Layout)26 b(of)g(IR)f(trees)h(is)g(a)f(f)o(airly)h(v)o(olatile)f(implementation)0 3594 y(feature.)30 b(Currently)-5 b(,)20 b(M)p Fl(A)n(GIK)g Fm(decrees)h(an)f(IR)f(interf)o(ace)h(and)h(layout.)0 3677 y(The)26 b(cost)h(of)f(this)g(solution)h(is)g(that)f(future)g (implementations)i(may)0 3760 y(require)16 b(e)o(xtra)f(mapping)h(code) g(to)g(compile)f(their)g(IR)g(to)g(the)g(standard-)0 3843 y(ized)20 b(M)p Fl(A)n(GIK)f Fm(IR)g(and)h(back.)30 b(An)19 b(alternati)n(v)o(e)h(solution)g(is)f(to)h(specify)0 3926 y(code)k(using)h(a)e(higher)o(-le)n(v)o(el)h(representation.)41 b(The)24 b(main)g(technical)0 4009 y(challenge)j(of)f(using)h(IR)e(to)h (specify)h(patterns)f(is)f(that)h(functionally)0 4092 y(identical)15 b(language)h(e)o(xpressions)f(may)g(be)g(compiled)h(to)e (structurally)0 4175 y(dif)n(ferent)k(trees.)26 b(F)o(ortunately)-5 b(,)19 b(the)f Fj(lcc)g Fm(IR)f(is)h(spare)g(enough)i(that)d(this)0 4258 y(problem)g(is)e(not)h(dif)n(\256cult:)25 b(the)16 b(number)h(of)f(possibilities)f(tends)h(o)o(v)o(er)o(-)0 4341 y(whelmingly)23 b(to)e(one)i(and,)g(in)e(rare)h(cases,)h(tw)o(o.) 35 b(In)22 b(f)o(act,)g(the)g(use)g(of)0 4424 y(a)d(lo)n(w-le)n(v)o(el) h(IR)f(can)h(ha)o(v)o(e)f(a)h(signi\256cant)f(bene\256t)h(o)o(v)o(er)f (both)h(source-)0 4507 y(le)n(v)o(el)e(and)h(machine-code)h(matching)f (in)f(this)g(respect)h(since)g(both,)f(in)0 4590 y(practice,)29 b(can)e(contain)g(signi\256cant)g(numbers)h(of)f(synon)o(yms)h(\(e.g.,) 0 4673 y(consider)22 b(the)f(possible)h(w)o(ays)g(to)f(get)g(v)n(alues) h(to)f(and)h(from)f(memory)0 4756 y(on)16 b(the)g(x86,)g(or)g(the)g (dif)n(ferent)f(b)o(ut)h(equi)n(v)n(alent)g(methods)h(to)e(reference)0 4839 y(an)22 b(array)h(element)f(in)g(C\).)g(Ho)n(we)n(v)o(er)m(,)h (while)f(the)g(IR)g(representation)0 4922 y(has)28 b(been)g(suf)n (\256cient)f(for)h(all)f(e)o(xamples)h(we')l(v)o(e)g(w)o(anted)g(to)f (imple-)0 5005 y(ment,)34 b(there)e(are)f(times)g(when)h(a)g(less)f (strenuous)i(mechanism)f(of)0 5088 y(code)17 b(speci\256cation)f(is)g (preferable.)26 b(W)-6 b(e)15 b(are)h(currently)h(in)m(v)o(estigating)0 5171 y(alternati)n(v)o(es.)2050 83 y Fn(7.2)90 b(System)22 b(limitations)2050 216 y Fm(There)13 b(are)g(a)g(number)i(of)e (limitations)g(with)f(the)i(current)f(system;)j(most)2050 300 y(were)g(deliberately)h(chosen)g(in)g(order)f(to)g(allo)n(w)h(it)e (to)i(be)f(b)o(uilt)g(quickly)2050 383 y(so)e(that)g(real)g (programmers)i(could)f(use)f(it)g(in)g(the)g(near)h(future,)g(thereby) 2050 466 y(allo)n(wing)h(the)g(wheel)h(of)f(iterati)n(v)o(e)f(design)i (to)f(be)o(gin)h(turning)g(with)f(the)2050 549 y(least)i(amount)i(of)f (delay)-5 b(.)28 b(F)o(our)18 b(main)h(limitations)g(are)g(discussed.) 2162 632 y(First,)29 b(constructing)h(lar)o(ge)f(pieces)g(of)g(code)g (is)f(tedious.)57 b(This)2050 715 y(w)o(ould)14 b(naturally)g(be)g (remedied)g(with)f(language)i(support.)26 b(A)14 b(promis-)2050 798 y(ing)k(a)o(v)o(enue)g(is)g(to)f(use)h(the)g(`C)f(language)j([2])d (\(designed)i(to)f(construct)2050 881 y(code)30 b(dynamically\))g(as)f (a)g(sugary)h(method)h(of)e(dynamically)h(con-)2050 964 y(structing)h(M)p Fl(A)n(GIK)g Fm(IR.)g(`C)g(solv)o(es)g(most)g(of)h (the)f(semantic)g(issues)2050 1047 y(dealing)23 b(with)f(v)n(ariable)g (binding,)i(and)f(code)h(construction,)g(lea)o(ving)2050 1130 y(us)h(with)f(the)h(f)o(airly)g(straightforw)o(ard)g(task)g(of)g (modifying)h(it)e(to)g(dy-)2050 1213 y(namically)19 b(emit)g(M)p Fl(A)n(GIK)g Fm(IR)f(rather)h(than)g(e)o(x)o(ecutable)h(code.)2162 1296 y(Second,)f(the)g(current)g(code)g(speci\256cation)g(M)p Fl(A)n(GIK)g Fm(interf)o(ace)g(\320)2050 1379 y(the)30 b(lo)n(w-le)n(v)o(el)h(IR)g(of)f Fj(lcc)h Fm(\320)f(while)h(simple,)i (is)e(perhaps)h(not)f(the)2050 1462 y(most)15 b(natural)g(for)g (mainstream)h(programmers.)27 b(There)15 b(are)g(tradeof)n(fs)2050 1545 y(in)30 b(this)h(representation:)52 b(a)31 b(lo)n(w-le)n(v)o(el)g (IR)g(can)g(be)g(more)h(precise,)2050 1628 y(ho)n(we)n(v)o(er)m(,)i(it) 29 b(can)i(also)g(be)g(more)f(comple)o(x)i(than)f(necessary)-5 b(.)62 b(W)-6 b(e)2050 1711 y(are)19 b(in)m(v)o(estigating)g(the)g (representation)h(of)f(code)g(templates)g(used)h(for)2050 1794 y(matching)j(via)g(language)h(support:)36 b(here)23 b(to)g(a)g(modi\256cation)g(of)g(the)2050 1877 y(`C)18 b(language)i(seems)g(promising.)2162 1960 y(Third,)25 b(the)f(system)h(is)f(manual,)i(e)n(v)o(en)f(for)f(tasks)g(that)g (could)h(be)2050 2043 y(done)17 b(automatically)g(\(e.g.,)f(in)g(the)h (spirit)f(of)g(V)-8 b(ande)n(v)o(oorde)18 b(and)f(Gut-)2050 2126 y(tag)f([13)q(,)g(12]\).)26 b(As)16 b(we)g(determine)h(which)g(of) f(these)h(tasks)g(are)f(impor)o(-)2050 2209 y(tant)i(and)i(common,)g (automation)g(will)e(be)h(added.)2162 2292 y(Finally)-5 b(,)31 b Fj(lcc)p Fm(,)h(while)e(simple)g(and)g(easy)g(to)f(modify)-5 b(,)33 b(is)c(a)h(poor)2050 2375 y(optimizer)l(.)c(W)-6 b(e)16 b(are)g(e)o(xamining)h(w)o(ays)g(to)g(impro)o(v)o(e)g(its)e (code)j(quality)-5 b(.)2050 2597 y Fn(7.3)90 b(A)23 b(simple)f (language)f(extension)2050 2731 y Fm(Exploitation)29 b(of)g(application)h(semantics)g(is)f(helped)h(if)e(semantics)2050 2814 y(can)i(be)g(clearly)g(and)h(unambiguously)h(indicated.)61 b(F)o(or)29 b(e)o(xample,)2050 2897 y(translating)21 b(shared)g(memory)h(accesses)g(is)e(eased)h(if)g(e)n(v)o(ery)g(such)h (ac-)2050 2980 y(cess)28 b(can)h(be)f(e)o(xplicitly)g(labeled)h(as)f (\252shared.)-5 b(\272)55 b(The)28 b(clean,)j(clear)2050 3063 y(con)m(v)o(e)o(yance)20 b(of)f(semantic)g(information)g(to)g(e)o (xtensions)g(is)g(a)f(general)2050 3146 y(problem.)29 b(F)o(ortunately)-5 b(,)20 b(it)e(has)i(a)g(simple)f(solution:)29 b(the)20 b(addition)g(of)2050 3229 y(a)e(ne)n(w)h(syntax)g(operation)g (to)f(ANSI)g(C)g(\()p Fj(annotation)p Fm(\))i(that)e(is)g(used)h(to) 2050 3312 y(create)j(ne)n(w)-5 b(,)23 b(scoped)g(type)f(quali\256ers.) 37 b(These)22 b(quali\256ers)g(w)o(ould)g(be)2050 3395 y(syntactically)i(parsed)g(and)g(internally)g(stored)g(in)f(the)g (symbol)i(table)2050 3478 y(b)o(ut)20 b(otherwise)h(ignored)h(by)f(the) f(compiler)h(proper)h(\320)e(their)g(seman-)2050 3561 y(tics)e(pro)o(vided)i(solely)f(by)h(e)o(xtensions.)28 b(An)19 b(e)o(xample)h(usage:)2236 3757 y Fh(/)p Fg(\003)i Fh(add)g(''shared'')g(as)g(a)f(new)h(type)g(quali\014er)h Fg(\003)p Fh(/)2236 3840 y Fj(annotation)h(shar)o(ed;)2236 3923 y Fh(/)p Fg(\003)e Fh(Allocate)g(an)g(integer)h(with)e(new)h(type) h(quali\014er.)e Fg(\003)p Fh(/)2236 4006 y Fj(shar)o(ed)j(int)d(x;) 2050 4349 y Fn(8)91 b(Conclusion)2050 4510 y Fm(This)32 b(paper)i(has)g(addressed)h(tw)o(o)e(problems)h(programmers)h(ha)o(v)o (e)2050 4593 y(historically)25 b(f)o(aced.)48 b(First,)26 b(the)g(languages)h(the)o(y)f(de\256ne)g(via)g(inter)o(-)2050 4676 y(f)o(aces)14 b(ha)o(v)o(e)h(not)g(been)g(treated)f(as)g (\256rst-class)g(languages.)27 b(As)14 b(a)g(result,)2050 4759 y(these)f(languages)h(ha)o(v)o(e)g(had)f(no)h(language-speci\256c) g(semantic)g(check-)2050 4842 y(ers,)26 b(transformers,)h(or)f (optimizers.)47 b(Second,)27 b(their)e(programs)i(are)2050 4925 y(passi)n(v)o(ely)e(consumed)g(with)f(little)f(support)i(for)f (acti)n(v)o(e)g(transforma-)2050 5008 y(tion)g(\(such)i(as)f(re)n (writing)f(of)h(structure)g(\256elds)g(and)g(the)g(addition)h(of)2050 5091 y(pro\256ling)19 b(code\).)2162 5174 y(The)30 b(M)p Fl(A)n(GIK)h Fm(system)g(is)f(a)h(\256rst)f(step)h(to)n(w)o(ards)g (solving)g(these)2050 5257 y(problems.)g(M)p Fl(A)n(GIK)20 b Fm(pro)o(vides)h(a)g(modular)g(interf)o(ace)f(implementors)2050 5340 y(can)c(use)f(to)h(e)o(xtend)g(compilation.)27 b(The)15 b(main)h(interaction)f(is)h(through)p eop %%Page: 10 10 10 9 bop 0 83 a Fm(a)13 b(set)f(of)h(interf)o(aces)g(that)g(gi)n(v)o(e) g(e)o(xtensions)g(access)h(to)e(the)h(IR)f(produced)0 166 y(from)23 b(source.)38 b(M)p Fl(A)n(GIK)23 b Fm(thus)g(pro)o(vides) g(a)g(method)g(that)g(system)g(im-)0 249 y(plementors)d(use)g(both)g (to)g(incorporate)g(domain-speci\256c)h(semantics)0 332 y(into)g(compilation)i(\(thereby)f(enjo)o(ying)h(the)e(ob)o(vious)i (adv)n(antages)g(of)0 415 y(automated)d(optimization)g(and)g (checking\))g(and)g(to)f(perform)g(general)0 498 y(transformations)g (on)f(the)g(IR)g(produced)i(from)e(source)g(\(thereby)h(ha)o(v-)0 581 y(ing)h(both)g(access)g(to)f(high-le)n(v)o(el)h(semantic)g (information)g(and)g(the)f(re-)0 664 y(sulting)g(transformation)h(code) g(optimized)f(as)g(aggressi)n(v)o(ely)h(as)f(code)0 747 y(produced)i(from)e(source\).)112 830 y(This)36 b(paper)h(has)f (presented)i(man)o(y)f(e)o(xample)g(clients)f(of)g(the)0 913 y(M)p Fl(A)n(GIK)28 b Fm(system.)54 b(Man)o(y)28 b(of)g(these)g(e)o(xtensions)h(pro)o(vide)g(capabili-)0 996 y(ties)15 b(that)g(programmers)h(did)g(not)f(pre)n(viously)i(ha)o (v)o(e.)25 b(Future)15 b(research)0 1079 y(will)28 b(in)m(v)o(olv)o(e)i (both)f(e)o(xtending)i(these)e(capabilities)g(and)h(e)o(xploring)0 1162 y(their)19 b(consequences.)0 1376 y Fn(Refer)n(ences)33 1520 y Fd([1])38 b(S.)17 b(P)-7 b(.)17 b(Amarasinghe,)i(J.)e(M.)g (Anderson,)i(M.)e(S.)g(Lam,)g(and)h(A.)f(W)-6 b(.)17 b(Lim.)148 1595 y(An)12 b(o)o(v)o(ervie)n(w)i(of)d(the)i(SUIF)e (compiler)j(for)e(scalable)i(parallel)h(machines.)148 1669 y(In)d Fc(Pr)m(oceedings)i(of)e(the)h(6th)f(W)-6 b(orkshop)13 b(on)f(Langua)o(g)o(es)i(and)e(Compiler)o(s)148 1744 y(for)17 b(P)-5 b(ar)o(allel)18 b(Computing)p Fd(,)h(Portland,)f (OR,)e(August)i(1993.)33 1842 y([2])38 b(D.)16 b(R.)h(Engler)m(,)h(W)-6 b(.)16 b(C.)h(Hsieh,)g(and)h(M.)e(F)-5 b(.)16 b(Kaashoek.)26 b(`C:)18 b(A)f(language)148 1917 y(for)e(high-le)n(v)o(el,)j(ef)n (\256cient,)f(and)f(machine-independent)k(dynamic)c(code)148 1992 y(generation.)46 b(In)24 b Fc(Pr)m(oceedings)i(of)e(the)h(23th)g (Annual)g(Symposium)g(on)148 2067 y(Principles)d(of)f(Pr)m(o)o(gr)o (amming)g(Langua)o(g)o(es)p Fd(,)i(pages)e(131\261144,)h(St.)e(Pe-)148 2141 y(tersb)o(ur)o(g,)d(FL,)f(1995.)33 2240 y([3])38 b(C.)27 b(W)-6 b(.)26 b(Fraser)i(and)g(D.)f(R.)g(Hanson.)52 b Fc(A)27 b(r)n(etar)n(g)o(etable)j(C)d(compiler:)148 2314 y(design)k(and)f(implementation)p Fd(.)62 b(Benjamin/Cummings)33 b(Publishing)148 2389 y(Co.,)16 b(Redw)o(ood)j(City)l(,)e(CA,)g(1995.) 33 2488 y([4])38 b(C.W)-6 b(.)20 b(Fraser)h(and)h(D.R.)e(Hanson.)34 b(A)21 b(code)h(generation)i(interf)o(ace)g(for)148 2562 y(ANSI)g(C.)44 b Fc(Softwar)n(e\320Pr)o(actice)29 b(and)24 b(Experience)p Fd(,)29 b(21\(9\):963\261988,)148 2637 y(September)19 b(1991.)33 2736 y([5])38 b(W)-6 b(.)11 b(W)m(ilson)h(Ho)g(and)h(Ronald)g(A.)e(Olsson.)k(An)d(approach)i(to)e (genuine)i(dy-)148 2810 y(namic)21 b(linking.)32 b Fc(Softwar)n (e\320Pr)o(actice)23 b(and)d(Experience)p Fd(,)i(24\(4\):375\261)148 2885 y(390,)17 b(April)h(1991.)33 2983 y([6])38 b(Clinton)18 b(L.)d(Jef)n(fery)i(and)f(Ralph)h(E.)e(Grisw)o(old.)23 b(A)16 b(frame)n(w)o(ork)h(for)f(e)o(x)o(e-)148 3058 y(cution)21 b(monitoring)g(in)e(Icon.)30 b Fc(Softwar)n(e\320Pr)o (actice)23 b(and)c(Experience)p Fd(,)148 3133 y(24\(11\):1025\2611049,) h(No)o(v)o(ember)e(1994.)33 3231 y([7])38 b(Gre)o(gor)20 b(Kiczales,)j(Jim)c(des)h(Ri)n(vieres,)i(and)f(Daniel)g(G.)e(Bobro)n(w) l(.)32 b Fc(The)148 3306 y(Art)16 b(of)i(the)g(Metaobject)i(Pr)m (otocol)p Fd(.)25 b(MIT)16 b(Press,)h(1991.)33 3404 y([8])38 b(Adam)20 b(K)n(ola)o(w)o(a)g(and)h(Arthur)f(Hick)o(en.)33 b(Insure++:)e(A)20 b(tool)g(to)g(support)148 3479 y(total)641 b(quality)h(soft-)148 3554 y(w)o(are.)84 b Fb (http://www.parasoft.com/insure/papers)148 3629 y(/)40 b(tech.htm)p Fd(.)33 3727 y([9])e(T)-5 b(odd)22 b(C.)g(Mo)n(wry)l(,)h (Angela)h(K.)d(Demk)o(e,)j(and)f(Orran)g(Krie)o(ger)l(.)39 b(Auto-)148 3802 y(matic)22 b(compiler)o(-inserted)j(i/o)d(prefetching) j(for)c(out-of-core)i(applica-)148 3876 y(tions.)43 b(In)24 b Fc(Pr)m(oceedings)h(of)f(the)h(Second)g(Symposium)g(on)f(Oper)o (ating)148 3951 y(Systems)18 b(Design)g(and)f(Implementation)p Fd(,)j(1996.)0 4050 y([10])38 b(A.)14 b(Sri)n(v)n(asta)o(v)n(a)j(and)f (D.W)-6 b(.)13 b(W)-5 b(all.)20 b(A)14 b(practical)k(system)d(for)f (intermodule)148 4124 y(code)25 b(optimization)i(at)e(link-time.)44 b Fc(J)n(ournal)25 b(of)f(Pr)m(o)o(gr)o(amming)h(Lan-)148 4199 y(gua)o(g)o(es)p Fd(,)18 b(March)g(1992.)0 4297 y([11])38 b(Amitabh)30 b(Sri)n(v)n(asta)o(v)n(a)i(and)e(Alan)g (Eustace.)57 b(Atom)29 b(-)g(a)h(system)f(for)148 4372 y(b)o(uilding)23 b(customized)g(program)f(analysis)g(tools.)36 b(In)21 b Fc(Pr)m(oceedings)i(of)148 4447 y(the)11 b(SIGPLAN)g('94)g (Confer)n(ence)g(on)g(Pr)m(o)o(gr)o(amming)g(Langua)o(ge)g(De)q(sign) 148 4522 y(and)17 b(Implementation)p Fd(,)j(1994.)0 4620 y([12])38 b(Mark)16 b(T)-5 b(.)13 b(V)-7 b(ande)n(v)o(oorde.)23 b Fc(Exploiting)17 b(Speci\256cations)i(to)c(Impr)m(o)o(ve)i(Pr)m(o-) 148 4695 y(gr)o(am)g(P)-5 b(erformance)p Fd(.)25 b(PhD)16 b(thesis,)i(M.I.T)-5 b(.,)15 b(1994.)0 4793 y([13])38 b(Mark)27 b(T)-5 b(.)25 b(V)-7 b(ande)n(v)o(oorde)28 b(and)f(John)g(V)-9 b(.)26 b(Guttag.)50 b(Using)26 b(specialized)148 4868 y(procedures)11 b(and)g(speci\256cation)q(-base)q(d)g(ana)q(ly)q (sis)g(to)g(re)q(duc)q(e)g(the)h(runt)q(ime)148 4943 y(costs)18 b(of)f(modularity)l(.)26 b(In)17 b Fc(Pr)m(oceedings)i(of)e (the)h(1994)g(A)n(CM/SIGSOFT)148 5017 y(F)-7 b(oundations)18 b(of)g(Softwar)n(e)g(Engineering)h(Confer)n(ence)p Fd(,)g(1994.)0 5116 y([14])38 b(R.)27 b(W)-5 b(ahbe,)29 b(S.)d(Lucco,)k(T)-5 b(.)26 b(Anderson,)k(and)e(S.)e(Graham.)51 b(Ef)n(\256cient)148 5191 y(softw)o(are-based)21 b(f)o(ault)e(isolation.)28 b(In)18 b Fc(Pr)m(oceedings)h(of)f(the)g(F)-7 b(ourteenth)148 5265 y(A)n(CM)20 b(Symposium)h(on)f(Oper)o(ating)i(Systems)f (Principles)p Fd(,)i(pages)e(203\261)148 5340 y(216,)c(December)h (1993.)2050 83 y([15])38 b(D.W)-6 b(.)13 b(W)-5 b(all.)21 b(Systems)15 b(for)h(late)g(code)g(modi\256cation.)23 b Fc(CODE)15 b(91)g(W)-6 b(ork-)2198 158 y(shop)17 b(on)g(Code)h(Gener) o(ation)p Fd(,)g(1991.)2050 266 y([16])38 b(D.)20 b(W)-5 b(eise)22 b(and)g(R.)f(Cre)n(w)l(.)36 b(Programmable)23 b(syntax)g(macros.)36 b(In)21 b Fc(Pr)m(o-)2198 340 y(ceedings)h(of)e (PLDI)f('93)p Fd(,)h(pages)h(156\261165,)g(Alb)o(uquerque,)h(NM,)d (June)2198 415 y(1993.)p eop %%Page: 11 11 11 10 bop 60 245 3780 4 v 58 319 4 75 v 105 297 a Fi(Operation)p 1948 319 V 1600 w(Description)p 3838 319 V 60 323 3780 4 v 58 398 4 76 v 105 376 a Fj(X)p 152 376 22 4 v 26 w(IR)19 b(LeftChild\(X)p 599 376 V 28 w(IR)g(n\))p 1948 398 4 76 v 1228 w Fd(Returns)f Fj(n)p Fd(')l(s)f(left)h(child)h(or)e Fj(nil)f Fd(on)h(error)l(.)p 3838 398 V 60 402 3780 4 v 58 477 4 76 v 105 455 a Fj(X)p 152 455 22 4 v 26 w(IR)i (RightChild\(X)p 643 455 V 27 w(IR)g(n\))p 1948 477 4 76 v 1185 w Fd(Returns)f Fj(n)p Fd(')l(s)f(right)h(child)h(or)e Fj(nil)f Fd(on)h(error)l(.)p 3838 477 V 60 480 3780 4 v 58 555 4 75 v 105 533 a Fj(int)j(OpT)-5 b(ype\(X)p 514 533 22 4 v 27 w(IR)19 b(n\))p 1948 555 4 75 v 1314 w Fd(Returns)f(opcode)g(of)f Fj(n)p Fd(.)p 3838 555 V 60 558 3780 4 v 58 633 4 75 v 105 611 a Fj(int)j(T)-5 b(ype\(X)p 416 611 22 4 v 27 w(IR)19 b(n\))p 1948 633 4 75 v 1412 w Fd(Returns)f(type)g(of)f Fj(n)p Fd(.)p 3838 633 V 60 637 3780 4 v 58 712 4 76 v 105 690 a Fj(int)j(Align\(X)p 430 690 22 4 v 26 w(IR)f(n\))p 1948 712 4 76 v 1399 w Fd(Returns)f(alignment)h(of)e Fj(n)p Fd(.)p 3838 712 V 60 715 3780 4 v 58 790 4 75 v 105 768 a Fj(int)j(Size\(X)p 390 768 22 4 v 27 w(IR)f(n\))p 1948 790 4 75 v 1438 w Fd(Returns)f(size)g(of)f Fj(n)p Fd(.)p 3838 790 V 60 794 3780 4 v 1546 935 a Fm(T)-6 b(able)18 b(2:)28 b(Base)19 b(IR)f(Interf)o(ace.)p 0 1420 3984 4 v -2 1495 4 75 v 45 1472 a Fi(Class)p 944 1495 V 794 w(Examples)p 2092 1495 V 874 w(Pr)o(ototype)p 3982 1495 V 0 1498 3984 4 v -2 1574 4 76 v 45 1551 a Fd(Arithmetic)h(binary)g(operations.)p 944 1574 V 163 w Fj(ADD)h(SUB)g(MUL)g(DIV)f(XOR)h(AND)f(OR)p 2092 1574 V 90 w(I)p 2163 1551 22 4 v 25 w(IR)g(op\(I)p 2391 1551 V 26 w(IR)g(a,)h(I)p 2594 1551 V 25 w(IR)f(b\))p 3982 1574 4 76 v 0 1577 3984 4 v -2 1652 4 75 v 45 1629 a Fd(Arithmetic)g(unary)f(operations.)p 944 1652 V 182 w Fj(NEG)i(COM)p 2092 1652 V 819 w(I)p 2163 1629 22 4 v 25 w(IR)f(op\(I)p 2391 1629 V 26 w(IR)g(a\))p 3982 1652 4 75 v 0 1655 3984 4 v -2 1730 4 75 v 45 1707 a Fd(Con)m(v)o(ersions)g(\(\252con)m(v)o(ert)h(to)d Fc(type)p Fd(\272\).)p 944 1730 V 91 w Fj(CVTI)j(CVTD)g(CVTUS)p 2092 1730 V 553 w(I)p 2163 1707 22 4 v 25 w(IR)c Fc(op)p Fj(\(I)p 2376 1707 V 26 w(IR)j(a\))p 3982 1730 4 75 v 0 1733 3984 4 v -2 1808 4 75 v 45 1786 a Fd(Memory)e(operations.)p 944 1808 V 409 w Fj(ADDR)j(INDIR)p 2092 1808 V 752 w(I)p 2163 1786 22 4 v 25 w(IR)c Fc(op)p Fj(\(I)p 2376 1786 V 26 w(IR)j(a\))p 3982 1808 4 75 v 0 1811 3984 4 v 0 1953 a Fm(T)-6 b(able)26 b(3:)43 b(P)o(artial)25 b(IR-construction)i (Interf)o(ace.)50 b(Functions)27 b(determine)g(the)g(type)g(of)f (opcode)i(to)f(use)f(based)i(on)f(operand)h(type.)50 b(Con)m(v)o(ersion)0 2036 y(con)m(v)o(entions)21 b(are)e(those)g(of)g (ANSI)f(C.)p 60 2513 3780 4 v 58 2587 4 75 v 105 2565 a Fi(Operation)p 1948 2587 V 1600 w(Description)p 3838 2587 V 60 2591 3780 4 v 58 2666 4 76 v 105 2644 a Fj(I)p 129 2644 22 4 v 25 w(IR)i(Local\(T)-5 b(ype)21 b(ty\))p 1948 2666 4 76 v 1338 w Fd(Creates)e(a)e(local)h(v)n(ariable)i(of)d (type)h Fj(t)f Fd(and)h(returns)g(its)f(symbol.)p 3838 2666 V 60 2670 3780 4 v 58 2745 4 76 v 105 2723 a Fj(I)p 129 2723 22 4 v 25 w(IR)j(LocalArray\(T)-5 b(ype)23 b(ty)-6 b(,)20 b(int)g(n\))p 1948 2745 4 76 v 1002 w Fd(Creates)f(a)e(local)h (array)g(of)f(type)h Fj(t)f Fd(and)h(size)g Fj(n)f Fd(and)g(returns)h (its)g(symbol.)p 3838 2745 V 60 2749 3780 4 v 58 2824 4 76 v 105 2802 a Fj(I)p 129 2802 22 4 v 25 w(IR)i(Global\(T)-5 b(ype)21 b(ty\))p 1948 2824 4 76 v 1298 w Fd(Creates)e(a)e(global)h(v)n (ariable)i(of)d(type)h Fj(t)f Fd(and)h(returns)g(its)f(symbol.)p 3838 2824 V 60 2827 3780 4 v 58 2903 4 76 v 105 2881 a Fj(I)p 129 2881 22 4 v 25 w(IR)j(GlobalArray\(T)-5 b(ype)22 b(t,)e(int)g(n\))p 1948 2903 4 76 v 992 w Fd(Creates)f(a)e (global)h(array)g(of)f(type)h Fj(t)f Fd(and)h(size)g Fj(n)f Fd(and)g(returns)h(its)g(symbol.)p 3838 2903 V 60 2906 3780 4 v 58 2981 4 75 v 105 2959 a Fj(I)p 129 2959 22 4 v 25 w(IR)i(Cast\(I)p 412 2959 V 26 w(IR)g(var)-6 b(,)20 b(T)-5 b(ype)21 b(t\))p 1948 2981 4 75 v 1141 w Fd(Creates)e(a)e(cop)o(y)h(of)f(symbol)g Fj(var)h Fd(changing)h(its)e (type)h(to)f Fj(t)p Fd(.)p 3838 2981 V 60 2984 3780 4 v 58 3060 4 76 v 105 3038 a Fj(I)p 129 3038 22 4 v 25 w(IR)j(Lookup\(char)j(*name\))p 1948 3060 4 76 v 1132 w Fd(Lookup)17 b(symbol)g(for)g(v)n(ariable)j Fj(name)p Fd(.)p 3838 3060 V 60 3063 3780 4 v 276 3205 a Fm(T)-6 b(able)19 b(4:)27 b(Symbol)19 b(construction)h(and)g(manipulation)g (routines)f(\(routines)g(to)g(construct)h(ne)n(w)f(aggre)o(gate)h (types)f(are)g(elided\).)p 60 3697 V 58 3772 4 75 v 105 3749 a Fi(Operation)p 1948 3772 V 1600 w(Description)p 3838 3772 V 60 3775 3780 4 v 58 3925 4 150 v 105 3827 a Fj(X)p 152 3827 22 4 v 26 w(IR)g(Copy\(X)p 486 3827 V 27 w(IR)g(n\))p 1948 3925 4 150 v 1342 w Fd(Create)c(a)f(cop)o(y)g (of)f(node)i Fj(n)p Fd(.)22 b(This)13 b(function)j(is)d(typically)j (used)e(when)g(adding)1995 3902 y(a)j(ne)n(w)h(subtree)g(between)h(a)e (node)h(and)f(its)h(child.)p 3838 3925 V 60 3928 3780 4 v 58 4078 4 151 v 105 3981 a Fj(I)p 129 3981 22 4 v 25 w(IR)i(ImportExprRef\(X)p 739 3981 V 29 w(IR)f(expr\))p 1948 4078 4 151 v 994 w Fd(Import)j(a)f(reference)j(to)d Fj(expr)p Fd(.)38 b(This)21 b(reference)j(can)e(then)h(be)e(used)h(as)f (an)1995 4056 y(ar)o(gument)d(to)f(functions)i(that)f(require)h(a)e Fj(I)p 2984 4056 22 4 v 25 w(IR)g Fd(type.)p 3838 4078 4 151 v 60 4082 3780 4 v 58 4231 4 150 v 105 4134 a Fj(I)p 129 4134 22 4 v 25 w(IR)j(ImportExprCopy\(X)p 798 4134 V 29 w(IR)f(expr\))p 1948 4231 4 150 v 935 w Fd(Import)g(a)g(cop)o(y)h (of)f Fj(expr)p Fd(.)30 b(This)19 b(cop)o(y)g(can)h(then)g(be)f(used)g (as)g(an)g(ar)o(gument)1995 4209 y(to)e(functions)i(that)f(require)h(a) e Fj(I)p 2718 4209 22 4 v 25 w(IR)f Fd(type.)p 3838 4231 4 150 v 60 4234 3780 4 v 58 4310 4 76 v 105 4287 a Fj(X)p 152 4287 22 4 v 26 w(IR)j(AddStmt\(X)p 591 4287 V 28 w(IR)g(a,)h(I)p 796 4287 V 25 w(IR)f(stmt\))p 1948 4310 4 76 v 941 w Fd(Add)e Fj(stmt)h Fd(after)g(node)g Fj(a)p Fd(.)24 b(Returns)18 b Fj(stmt)p Fd(.)p 3838 4310 V 60 4313 3780 4 v 58 4389 4 76 v 105 4366 a Fj(X)p 152 4366 22 4 v 26 w(IR)h(PushStmt\(X)p 610 4366 V 28 w(IR)h(a,)f(I)p 815 4366 V 25 w(IR)h(stmt\))p 1948 4389 4 76 v 921 w Fd(Add)d Fj(stmt)h Fd(before)g(node)g Fj(a)p Fd(.)24 b(Returns)18 b Fj(stmt)p Fd(.)p 3838 4389 V 60 4392 3780 4 v 58 4468 4 76 v 105 4445 a Fj(X)p 152 4445 22 4 v 26 w(IR)h(DeleteStmt\(X)p 661 4445 V 28 w(IR)h(stmt\))p 1948 4468 4 76 v 1072 w Fd(Remo)o(v)o(e)e Fj(stmt)p Fd(,)f(returns)h (its)g(successor)l(.)p 3838 4468 V 60 4471 3780 4 v 58 4696 4 226 v 105 4524 a Fj(X)p 152 4524 22 4 v 26 w(IR)h(DeleteExpr\(X) p 653 4524 V 28 w(IR)h(expr)-6 b(,)21 b(I)p 951 4524 V 25 w(IR)e(r)o(eplacement\))p 1948 4696 4 226 v 549 w Fd(Delete)f(node)g Fj(expr)p Fd(;)g(replaces)h(the)e(tree)h(with)g Fj(r)o(eplacement)p Fd(.)26 b(If)16 b Fj(r)o(eplace-)1995 4599 y(ment)g Fd(is)g(nil,)g(M)p Fa(A)n(GIK)g Fd(will)h(coalesce)h(the) f(tree)g Fj(expr)g Fd(w)o(as)f(part)g(of)g(until)h(it)g(is)1995 4674 y(well-formed.)p 3838 4696 V 60 4700 3780 4 v 58 4775 4 76 v 105 4753 a Fj(X)p 152 4753 22 4 v 26 w(IR)i(AddExpr\(X)p 583 4753 V 28 w(IR)g(a,)h(I)p 788 4753 V 25 w(IR)f(b\))p 1948 4775 4 76 v 1042 w Fd(Insert)f Fj(b)f Fd(on)g(top)g(of)g Fj(a)p Fd(.)p 3838 4775 V 60 4778 3780 4 v 58 4854 4 76 v 105 4832 a Fj(I)p 129 4832 22 4 v 25 w(IR)j(If\(I)p 323 4832 V 25 w(IR)g(bool,)f(I)p 623 4832 V 25 w(IR)h(stmt\))p 1948 4854 4 76 v 1113 w Fd(If)d Fj(bool)g Fd(is)g(true,)g(e)o(x)o (ecute)i Fj(stmt)p Fd(.)p 3838 4854 V 60 4857 3780 4 v 58 4933 4 76 v 105 4911 a Fj(I)p 129 4911 22 4 v 25 w(IR)h(IfElse\(I)p 436 4911 V 26 w(IR)f(bool,)h(I)p 737 4911 V 25 w(IR)f(stmt1,)i(I)p 1076 4911 V 25 w(IR)e(stmt2\))p 1948 4933 4 76 v 622 w Fd(If)e Fj(bool)g Fd(is)g(true,)g(e)o(x)o(ecute) i Fj(stmt1)g Fd(otherwise)f(e)o(x)o(ecute)i Fj(stmt2)p Fd(.)p 3838 4933 V 60 4936 3780 4 v 58 5012 4 76 v 105 4990 a Fj(I)p 129 4990 22 4 v 25 w(IR)g(While\(I)p 457 4990 V 24 w(IR)g(bool,)f(I)p 756 4990 V 25 w(IR)h(stmt\))p 1948 5012 4 76 v 980 w Fd(While)e Fj(bool)f Fd(is)g(true,)g(e)o(x)o (ecute)j Fj(stmt)p Fd(.)p 3838 5012 V 60 5015 3780 4 v 1169 5159 a Fm(T)-6 b(able)19 b(5:)27 b(P)o(artial)18 b(High-le)n(v)o(el)h(IR)f(construction)i(Interf)o(ace)p eop %%Page: 12 12 12 11 bop 60 694 3780 4 v 58 769 4 75 v 105 747 a Fi(Operation)p 1948 769 V 1600 w(Description)p 3838 769 V 60 772 3780 4 v 58 848 4 76 v 105 825 a Fj(X)p 152 825 22 4 v 26 w(IR)19 b(FirstCall\(char)k(*name\))p 1948 848 4 76 v 1097 w Fd(Returns)18 b(pointer)h(to)e(\256rst)g(call)i(of)d Fj(name)i Fd(or)f Fj(nil)f Fd(if)h(none)h(is)f(found.)p 3838 848 V 60 851 3780 4 v 58 1002 4 151 v 105 904 a Fj(X)p 152 904 22 4 v 26 w(IR)i(FirstCallV\(char)k(**namelist\))p 1948 1002 4 151 v 929 w Fd(Returns)16 b(pointer)g(to)f(\256rst)f(call)i (of)f(an)o(y)g(function)i(in)e Fj(namelist)g Fd(or)f Fj(nil)g Fd(if)h(none)1995 979 y(is)i(found.)p 3838 1002 V 60 1005 3780 4 v 58 1080 4 76 v 105 1058 a Fj(X)p 152 1058 22 4 v 26 w(IR)i(NextCall\(X)p 584 1058 V 27 w(IR)g(c,)h(char)h (*name\))p 1948 1080 4 76 v 856 w Fd(Returns)d(pointer)h(to)e(ne)o(xt)h (call)h(of)e Fj(name)g Fd(or)g Fj(nil)f Fd(if)h(none)h(is)f(found.)p 3838 1080 V 60 1084 3780 4 v 58 1234 4 151 v 105 1137 a Fj(X)p 152 1137 22 4 v 26 w(IR)i(NextCallV\(X)p 631 1137 V 27 w(IR)g(c,)h(char)h(**namelist\))p 1948 1234 4 151 v 688 w Fd(Returns)15 b(pointer)g(to)g(ne)o(xt)f(call)i(of)d(an)o (y)i(function)h(in)e Fj(namelist)g Fd(or)g Fj(nil)f Fd(if)h(none)1995 1212 y(is)j(found.)p 3838 1234 V 60 1237 3780 4 v 58 1313 4 76 v 105 1291 a Fj(X)p 152 1291 22 4 v 26 w(IR)i(RewriteCall\(X) p 670 1291 V 27 w(IR)g(call,)h(char)h(*newname\))p 1948 1313 4 76 v 574 w Fd(Replace)e(name)f(of)f Fj(call)f Fd(to)i(be)f Fj(newname)p Fd(.)p 3838 1313 V 60 1316 3780 4 v 58 1392 4 76 v 105 1370 a Fj(X)p 152 1370 22 4 v 26 w(IR)i(FirstAr)n(g\(X)p 557 1370 V 29 w(IR)g(call\))p 1948 1392 4 76 v 1210 w Fd(Return)f(\256rst)f(ar)o(gument)h(\(if)g(an)o (y\))f(of)g Fj(call)p Fd(.)p 3838 1392 V 60 1395 3780 4 v 58 1470 4 75 v 105 1448 a Fj(X)p 152 1448 22 4 v 26 w(IR)i(NextAr)n(g\(X)p 577 1448 V 28 w(IR)g(ar)n(g\))p 1948 1470 4 75 v 1194 w Fd(Get)e(ne)o(xt)h(ar)o(gument)h(\(if)e(an)o (y\))h(after)g Fj(ar)n(g)p Fd(.)p 3838 1470 V 60 1473 3780 4 v 58 1549 4 76 v 105 1527 a Fj(X)p 152 1527 22 4 v 26 w(IR)h(Ar)n(g\(X)p 433 1527 V 27 w(IR)g(call,)h(int)g(n\))p 1948 1549 4 76 v 1159 w Fd(Returns)e(the)g Fj(n)p Fd(th)f(ar)o(gument)i (of)e Fj(call)p Fd(;)g(returns)h Fj(nil)e Fd(on)h(error)l(.)p 3838 1549 V 60 1552 3780 4 v 58 1628 4 76 v 105 1606 a Fj(void)j(PushAr)n(g\(X)p 575 1606 22 4 v 28 w(IR)g(call,)f(I)p 843 1606 V 25 w(IR)g(ar)n(g\))p 1948 1628 4 76 v 931 w Fd(Adds)e Fj(ar)n(g)h Fd(as)e(the)i(\256rst)f(ar)o(gument)h(to)g Fj(call)p Fd(.)p 3838 1628 V 60 1631 3780 4 v 58 1707 4 76 v 105 1685 a Fj(void)i(AppendAr)n(g\(X)p 669 1685 22 4 v 29 w(IR)f(call,)g(I)p 937 1685 V 25 w(IR)g(ar)n(g\))p 1948 1707 4 76 v 837 w Fd(Adds)e Fj(ar)n(g)h Fd(as)e(the)i(last)g(ar)o (gument)g(to)g Fj(call)p Fd(.)p 3838 1707 V 60 1710 3780 4 v 58 1786 4 76 v 105 1763 a Fj(int)i(NAr)n(gs\(X)p 458 1763 22 4 v 28 w(IR)f(call\))p 1948 1786 4 76 v 1310 w Fd(Return)f(number)g(of)f(ar)o(guments)h(to)f Fj(call)p Fd(.)p 3838 1786 V 60 1789 3780 4 v 58 1865 4 76 v 105 1842 a Fj(X)p 152 1842 22 4 v 26 w(IR)i(ReplaceAr)n(g\(X)p 667 1842 V 28 w(IR)h(call,)f(int)h(ar)n(gno,)h(I)p 1247 1842 V 25 w(IR)e(ar)n(g\))p 1948 1865 4 76 v 527 w Fd(Replace)g(ar)o (gument)g Fj(ar)n(gno)f Fd(in)f Fj(call)g Fd(with)g Fj(ar)n(g)p Fd(.)p 3838 1865 V 60 1868 3780 4 v 995 2010 a Fm(T)-6 b(able)19 b(6:)27 b(P)o(artial)18 b(Function)h(Na)o(vigation)g(and)g (Modi\256cation)h(Interf)o(ace)p 60 3401 V 58 3476 4 75 v 105 3454 a Fi(Operation)p 1948 3476 V 1600 w(Description)p 3838 3476 V 60 3479 3780 4 v 58 3704 4 226 v 105 3532 a Fj(X)p 152 3532 22 4 v 26 w(IR)f(Sear)o(ch\(X)p 523 3532 V 28 w(IR)h(n,)f(I)p 732 3532 V 25 w(IR)g(pattern\))p 1948 3704 4 226 v 920 w Fd(Search)25 b(for)f(the)h(tree)g Fj(pattern)h Fd(starting)g(at)e(location)i Fj(n)p Fd(.)45 b(If)24 b Fj(n)f Fd(is)h Fj(nil)p Fd(,)h(the)1995 3607 y(search)c(starts)f(at)h(the)f(be)o(ginning)i(of)e(the)g(function.)35 b(Unspeci\256ed)21 b(subtrees)1995 3682 y(in)c Fj(pattern)i Fd(can)f(be)f(created)j(using)d(the)h(function)h Fj(I)p 3216 3682 22 4 v 25 w(IR)g(Any\(T)-5 b(ype)22 b(ty\))p Fd(.)p 3838 3704 4 226 v 60 3708 3780 4 v 58 3783 4 76 v 105 3761 a Fj(X)p 152 3761 22 4 v 26 w(IR)d(FindStruct\(X)p 629 3761 V 29 w(IR)g(n,)h(char)h(*StructName\))p 1948 3783 4 76 v 615 w Fd(Search)d(for)f(use)g(of)g Fj(StructName)j Fd(starting)e(at)g Fj(n)p Fd(.)p 3838 3783 V 60 3787 3780 4 v 58 3937 4 151 v 105 3840 a Fj(X)p 152 3840 22 4 v 26 w(IR)h(FindField\(X)p 596 3840 V 27 w(IR)g(n,)g(char)i (*StructName,)i(char)e(*FieldName\))p 1948 3937 4 151 v 99 w Fd(Search)f(for)f(use)g(of)g(\256eld)g Fj(FieldName)g Fd(of)g(type)h Fj(StructName)h Fd(starting)g(at)1995 3915 y Fj(n)p Fd(.)p 3838 3937 V 60 3940 3780 4 v 58 4091 4 151 v 105 3993 a Fj(Fields)f(*ImportFields\(Symbol)j(p,)c (unsigned)i(*n\))p 1948 4091 V 550 w Fd(Returns)f(a)e(pointer)i(to)f (an)g(array)g(of)g(pointers)h(to)f(data)g(structure)i Fj(p)p Fd(')l(s)d(\256elds.)1995 4068 y(Elements)g(in)f(this)g(v)o (ector)i(can)f(be)f(reordered,)i(deleted,)g(and)e(added.)p 3838 4091 V 60 4094 3780 4 v 58 4170 4 76 v 105 4147 a Fj(Fields)h(*ExportFields\(Symbol)k(p,)c(Fields)g(*\014eldlist,)g (unsigned)h(*n\))p 1948 4170 V 91 w Fd(Export)e(\256elds)g(\(de\256ned) h(by)f Fj(\014eldlist)p Fd(\))g(as)f(the)i(layout)g(for)e(data)i (structure)h Fj(p)p Fd(.)p 3838 4170 V 60 4173 3780 4 v 58 4248 4 76 v 105 4226 a Fj(Field)h(AddField\(Symbol)h(p,)f(Field)g (f1,)f(Field)h(f2\))p 1948 4248 V 609 w Fd(Add)d(\256eld)h Fj(f2)f Fd(after)h(\256eld)g Fj(f1)f Fd(in)g(structure)i Fj(p)p Fd(.)p 3838 4248 V 60 4252 3780 4 v 58 4327 4 76 v 105 4305 a Fj(Field)h(PushField\(Symbol)i(p,)d(Field)h(f1,)g (Field)g(f2\))p 1948 4327 V 589 w Fd(Add)d(\256eld)h Fj(f2)f Fd(before)h(\256eld)g Fj(f1)f Fd(in)g(structure)i Fj(p)p Fd(.)p 3838 4327 V 60 4331 3780 4 v 58 4406 4 76 v 105 4384 a Fj(Field)h(OverrideField\(Symbol)i(p,)e(Field)g(f,)f(T) -5 b(ype)21 b(ty\))p 1948 4406 V 508 w Fd(Change)d(\256eld)g(structure) h Fj(p)p Fd(')l(s)e(\256eld)h Fj(f)f Fd(type)h(to)f Fj(ty)p Fd(.)p 3838 4406 V 60 4410 3780 4 v 58 4485 4 76 v 105 4463 a Fj(Field)j(FirstField\(Symbol)i(p\))p 1948 4485 V 1134 w Fd(Returns)c(the)g(\256rst)f(\256eld)g(in)h(data)g(structure)h Fj(p)p Fd(.)p 3838 4485 V 60 4489 3780 4 v 58 4564 4 76 v 105 4542 a Fj(Field)h(NextField\(Symbol)i(p,)d(Field)h(f\))p 1948 4564 V 891 w Fd(Returns)e(the)g(ne)o(xt)g(\256eld)g(in)f(data)h (structure)h Fj(p)p Fd(.)p 3838 4564 V 60 4568 3780 4 v 991 4709 a Fm(T)-6 b(able)19 b(7:)27 b(P)o(artial)18 b(Structure)g(Na)o(vigation)h(and)h(Modi\256cation)f(Interf)o(ace)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF