# HG changeset patch # User Nobuyasu Oshiro # Date 1321827163 -32400 # Node ID 8bf53f6b12565955c269429b72514b9c672dbebb # Parent db9735be2bf1311f39580ca6a438300c11375e10 modify diff -r db9735be2bf1 -r 8bf53f6b1256 Paper/figure/mercurial_update.eps --- a/Paper/figure/mercurial_update.eps Mon Nov 21 06:55:07 2011 +0900 +++ b/Paper/figure/mercurial_update.eps Mon Nov 21 07:12:43 2011 +0900 @@ -647,7 +647,7 @@ bp sdmtx %RBIBeginFontSubset: HiraKakuProN-W3 -%!FontType1-1.0: AAAAAB+HiraKakuProN-W3 001.003 %%CreationDate: 11/20/11 % Copyright �2003 Apple Computer, Inc. and its licensors, all rights reserved. 11 dict begin /FontInfo 9 dict dup begin /version (001.003) readonly def /FullName (HiraKakuProN-W3) readonly def /Weight (SnapShot) readonly def /isFixedPitch false def /UnderlinePosition -60 def /UnderlineThickness 63 def end readonly def /FontName /AAAAAB+HiraKakuProN-W3 def /PaintType 0 def /FontType 1 def /FontMatrix [0.0010 0 0 0.0010 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for readonly def /FontBBox {-386 -373 1232 1266} readonly def currentdict end currentfile eexec D9D66F633B846A989B9974B0179FC6CC4458BB4CB99E3608702C78822367AAF89059868F63F93207640A6BD5DA214789 139C491E02A37BF3866F2964E8D690D48D9F6C4A5EC22355F8123573812483E06B968AE84B5F20A982A0E65764753516 97AB8C6EA040355C5542F297D7A3AF28AB93EA0771E0D56DBF00F7CA9CE9FB9FC2E0ECB00D04D5F5F3F24B987B546D62 74971A477DEE12C44623C180BCDBA21172627610C4736632D1A4693E79719C3BC43DF5330790A52DCD4CF455ACC213F6 B1C4BA249179DB360225568161552A16682E3A3604BFC39D571B1F8F18375BEF1B05D6DE4413DDBDB2D936EF6A197BC8 7EF3384DF04E6025A3A7EFFF451D52E96886EE4B4169EC3DEEE64932AF4AECA3AAB81853B58042BA51BAD1CF1FE64675 4A29D2100BBA83E7F6E2F5DFB112F838CA7F659DA7A6373BB1B86BF204DA715F2942AD8690FB1C37539822AE991DF19E AFFBD3E70C395C40FA19CBA66F6F776EC20B6398A64B19208F0E64419A3F9DB393F17B6A206EFAE3B72BBB97405C4CB8 2801FFF79A60CA475287D576B5FAE301357949AC6E4F6EF1B8E41EC8819429C31C995A8D02C6F93131B3C3FD0563C5B2 C561EF5E734C7AC2E2F882889F4D04700D54FF4ABFEB4AC7C99214F399F62A2920477FEA7111FBD7B5EC77864EA25A03 88721F3165F5B0867D1C7C29DFA0394F00B032672FD41DA7C59FA55B9E3AF89B81799A0B27F1420BA48F9FA3B4693FDB 053C26BACF8A048849E5C5B195ED71C79113DD547B1468FEEC4C124788537CF90C3E1DB8793BD8E61BC72DD310B89670 021372EA4C700AD16A855D0917C5F105706F3206540AEBA75926DC784B77FAA8F2459B9A468E2A06318839FA8C08FA7A 8241BE54D435D7E1CE8BB877839B32897C38ECC3B2B63BFD6083CBD67A33FDFC81F548A162333DCE29E28232431AF514 37794B82CDAA0282850FBBCB8A0A9CAE35CC3991AA9FBE225251C0E9E3F59F39EC952D556BEDE7BA8BA8BCA5546B665B 2481E6F4EE3929FE02EFB2402EFDBD1FAC1C72B9CFCFE391E0291A712286845FD31A23988776578437DD63EE0C3ED76E A391B35D2355FED30B1FD068D708EA45C4BE46C0F907CAB826ECAA27734D9723CF21C18BB7B30819E095E25833FB53FA 83710AC4E86D305F2EE40138D4BECB08688944C0D68C62E39899104AD6E587EC0F3FC097CE79F16A2C519A3B4ADA4712 EFAA7D9C7A17BC5023789142657BA7D164124537929053C2A7A0D2E8E4E63CFA5179983FDCC84769897719FB24472CCA 9EA1577B22B8B29703CCC51B7A254194DD86210204BEB444EA4A0D95A73FDBE953C0BDD8ED9074555027E745D457D989 412029757A42BCAA87154D3479D568532C656227DECD1A94699177522FB013228446DE961EDC5C6CDBF3CD69FA2B5F7E 2137C9DE65C2B6327032847044CCA017F9B2E8177A4A4B6D7DDBAC578CC2E98EB131C49BE0E818CF78C8DD2B562D74A1 A9CEEEF49606115A53F15F15D080A3ABB6D990CFEA9C58779C7E388C90BF6C7C1ADCA733C293E821F528A8A25B16CEFF 39B103A0000382CE00343EB20473864E5EE271B9F16B48543620B37B95B5C016B6BDF34B868DAE1E3581207508587E0D 44760E91C5E8183D629898CD1FD0E1D2798E7DDBF7A2997AD582AB85DCF50C2301E775AC7AD675A059D273D13E77A7EA 38DA6F3B16DDF2087940136B83C511845E6A91B8D2B8E3D892958966D1E22B2BC977734ECA36565C4A0FD0DE93F30256 40B66827F52733B55B565D4C60B8A3A5AF5EA3F5DDE6901C913366D3952F3FBD1B3FA9E4DE1474E006280D61EF34D830 490F88722027E57AD7F3FAA60FF2172B435493B0B726C9BFFB996459F29609633507AF1DA7A9F84094F7C61B0EEBA767 0540DA3ABAE2EE2C565DC4B7A061BE2B5375121676FDE5B0C37B9D922C0CEF05056E77E641B66DEEDE17E1C6714DC4A7 B16764EA5D4C7331DE2B1472FC3E610FB03B5842F4B7D9D268CF3204EEE860B1B96EB272DF663849EC387B8135065F48 4863D2C1263604ECBA3F3BF4344916C70485FA8B9E61C9F6A83C70EDBBB3E3F5A63B0C9BBAE3A3B457D94E5669B60812 E2B88E0A767E549573484C03CD45364AA230827B160318E25F95D8ADBD664C1DE213CDC3454775A09DA3858AC9622DB9 4A66012A14588548B12011E64B1CAB38834EEA24AA78C7FDA24690D53CE063EF666119954BD289925D2667AB00834FD4 1EC048E6ADAFC36FE8971B9A3B776906C22414478E6D4731FD1125256E30E2ECEB7600643ADFB27EED6B7040DEEF0580 ABAF22E011D407D171ED48A915140FE722E3DDFE39AFB34043406803C8C0CD5D729243F2450E9F7AE57A85910D0C304A 290941ED125758860B66D4CA4E00F1F6BABC431CD4B2E2C0B9C2DADE8EAD2BB86D96EA93D125497F487C77BC15BA284A 04A55EE8DA4D52C365D845AD7D66672664B1B6D113376C4136E18A77579176C5BAEF5D063127ACEB217340F93AC314FE 151AC07E75980038953DE1ADBFF288C3C0CE5974F5ABCEC9B7780CA3A7949C232DCF7C36331A48DF504C45E69BE408DD D4DFAB2CE40717D026086DCD1097B8D79157EC780F6EE40798794591698E8894B0229F5541131FFC3777DA24ED84FA84 EA3C49B49D8B8168764BE94AD9CD73303A9C02C4B30273D995D77E093F9B20716ED7A8D1882A8A3ACE81154B739FDEC7 D3E560D8733BFD7A7FC51BDD337587FB4471C0E735DA3A11DE1CE7510EC7000A78EB103DD08B79D3CDC791077780EECA 983D71377D598198DF0A02F9315A92A1708B997FE3FE467B06970D58C676D1AE871F2A3AAF6E85BD087A77A92918B0AB D6DC855C54CF7A69CF96D20B74AD321DCC3B7018A7444D4F2A193451672F3A720DA457D38F60B5775C157059CC76938A 5E396C70D7FA75E105636F9F2C27F5FAC0A0DE4AC709899A15B85D546B0D6020B509DBADC91624359D5B74575D67408A 0B9D67AD007066510B5D0D1B0EC5244C1AEF02E521DA2BF5ED41CACA27127A53415F188264B610C4C837720CF95B8E78 D7B36D0C3E86CC7CEC6ACF71575B9D28BC7155C67B45CEC4DCB47D8474A1ABFC1CD4A284109F175FABC93B3020C61D0E 31C976A6D252B773FB84F044052F027ACCE86453F830BA312657154C8C25AF0D965497C02E9CD04B3BC66E08E942AC45 1D0ABC63A739E527D5ACDBFC52C6357FC7A5FD91740DB7584C3C12B1F5BEF9A0A44B5DB530603FF7F1696ADE05102600 5919B9E0923BA37B60C7611E7EF96DEAA7552F8B28AD9DD5C3A2A45D37BC3026CBFFC6429C69CB444D4C460BF6F7B15E E6523F1768568E1357DBF96488F4CDF3D9633C8CC2B3732B05A338622C30DAD2966CFF5B3EFCE688EFE2A0AE6040ADD3 567E90A16026A42A2EF287CF3D8ABA5A6E6E251938B96BC6D38EE53F70163447DFB2EFB45D5E609E135AFB66185BB12C E5950CEBFF13E5DB2848616FB0D5277EC40B2C41FA40D086E8164884A49BFB03BAE3E66B099DF735697986BBAEEA8856 2B9730476EE58E06138502D055A88DDE2CE4E944771E1B9D34A739A87A2EA404CFEC8FF65824E74D954EF758DFB4AEBB 875810571F2A6A6F75608E7B52682225EEEF094340B12E03718CACA3E6D5FAE9BBBFCA7FFD14DCFF08A057F4E379D622 A338012DE2C834A83767864DB7C9823DC75AAA381B068E57A6A4FF9773C2183470F1FB20122DBEE76D826337E5D01DDB 295036CE9D5852B3BE4E0CADC66E42B16305CB7368EF293F42E80AEDB791C6E9BD45933A9A2F17FD60E551E1548C1AEF 6B36A262D82C1ABA3C7F6C51DB913E16D8795640B2FC7ADBE003B48B62E096011398F387E77585064C481BDFCA7C47B9 CA1A3B755CEC4A0596120A4E75119FC14B8A6C13E93694D2C319653A413B8E4CBB1A55E7BC555911F2D31678D4A5DF56 8DC4218AD6573BA07D46160134286FCB4C1F803E07723552D7C854CFBC3597DE9BF1B9930B6997AB2E9D384934BD1730 BACB9586D46B81022DF89010B65E3DFBF7178C543A46BFE5CF6B6E3D2A5C74ADFEF13F131FA05AE05251FCF217F92769 26F6E5FBEA94F40F1F9910DC865321A0495A8CBB5487BB2E96CD075E3CD99EF552ECF67C331CDC1CAECA526DBBB3314B 6C8FCFE65278A70C484356867A41DA7D0C0CFCCFBC09DDE65C81D980190E539A67D8D4F02DCC8D9936CBCB796D84C8ED 7A0F35F4E73D5210A625ACB7860AD39B09F4609C1D9FDF1056D9CBA5BBB371A674045316DC6D97B4E3EBA6732EE42A5E CBDD20F8C7DC6B8EAD36AD7931D33445B38B78BF4714466CB9EFDF75F9E88622610759ABDCD6DDF314B21D5ADB663BF0 2B232EC7BE6AAFBF0E60A734037477B8E6F7FFC1290E89E251FBB5F91EF78AC3B71DBE01A7E8F0F8BCB6E62F50E3A415 8803FD7CCD69F45F274EBD2843E77369A66750D7E5C82F42AEE451D6F81E3BF18D2EF5D4A8F7BBC43D5DA3FC1EC142E8 8EFC114D9FD3E758A217D3088B31417DCC3E6658C97BBAF1C35327F1FAAD78512CEE74AE6B4E1863DBB552CCA429AA2C A39563E8FB771E2493F6340014AA43972720FB7449D1569C8EF84EA788CB9FF7B106DFA7C57A4918534F8ABE0DA68652 25D8524B0D74FD65C5981AD546696209E82579650251CA16599FC06D15C79EEC51B71E35D070C5069319943C92B6E25A 96C50995E3D26548716BDF002B6BE74EC140AC12454D62419B00F312C979E0879AB5966CDFD1A4FBFCB7C1057C4D2C01 A6B78DDEF4C368F9DE27AAD7CE33C3DB1BE034122F8E4C7BA559A394E19E1DCA4E55CADA86B0820D2F49AA88C81F0E23 194CF929CF4F3ADC4C89E3FD4900E5D694B0E81A4174F9F8E279FC45B790119811992A209263BE9BEB655592DE9E8132 6E7D45345377E356A7BA1BDF524257EAB9E61752B685890BC824AFA834605712AFE431180E9C87F09A87A1F490A9C64A 7EF8232E3685EA6DE55F4586202D727D15B0AD4ECF9337802641B344E45635D344E82AAB61E083B8DF276C80E82E9960 E00EADE00DA94EF49F30327FD659B8A60318720E9A0BAB66DF457A0191D864A080C99D75BADF49DFC668094A600E561E CF3FE3B0BC981831D569CDBDCE3E7819FC4A706848C2B52097988C0EEF4B0C1CA1B58CF82D3BE14349C5CC7E934B1E0B BA3B8D0C93C9C14E11101DEE66576FA53F7B910EBEB05C26C6BB539FEA91E9FC72B2B25E3BF532A709A4AF8E4609752F 495FDAB446FE4D04629BFCD1C961A52C913E1EAA315C7C4FB8A6C692A16FE0D08B2959FA9B31D3270701B9D050D8B2E9 8350D7416F89404CA56AAF343F1E037873E86B71E6ED894A14A9C8C70A41D6ACAB8236CD51362340C02EDC49996A9530 65999DB2E09F06376F27791E4DA56AE2AE9152B606301BE973621C0F358E3100E07C3ADD21A8EDE860477BFA33A4DB6D 45E8A1D657109D6074FDBB986F3D7CD9F61A0C313A424AFE26359E69848876E1C69D9A76D11A4D20289C2D788B469FF2 850FB4CF98FB96B14347FE1E9C195AC54203021A7E8803AE91C6AA6E4946010582040D6ED65E940D3B8BA5F4FF2BF2CF 35EC93026AD01B6D1C9C3BD77FE4284D1825A0DBD180AFF5BD78AFB25690AD1977D5956D1923802A37A5948FB006AB14 88CBCF39CDC48CFB047794CBCBBD955CA179C92806F60A51C04CD5AF79979284D49C2B8350784E8A77B8ABBDEA6395CB 006DE254798D9DECF3C9FBC7E826F4E445230EEFD7E0FE335F63EEB793AC66C5079A232528504A8729F428CB8AA722C6 B1587E3A385777CA694F072915D24415BA6C7A0014252BDDDA51FB7E8D2EAB6DCE526EB520E289AC9B878C3A79EE36A1 6D0F7B221F7A1B533FC07302411987C8B473482F8105D7987EB492F60952B9F53AE45E8CFEAB3E621040CD0E9F084752 3EDC72070DBDC97BE62602ED1EBE39D065A751A4D4B7E3B7ECB986D9D6ADC861F79C06FD992E99119ACAD8ECBC6972E0 C611266C5E2DF852D48F20BA787820E9797295DD624FDE043E2F8E732F2D40A7056566192C23128595C04B9D57792BED 1110C0698351B733A2950A53BE8E4591747EA5622906D577456D5AFCAA5468D804FCF69D3D331377E99B706E851F604A F7A5BADC977CBF4C3B6EBF0055ED81D9AAD07634B7343CFFEE27F54082BC46EA444C3D45DE9BFCC0569EFACFB45E9972 3D2DA81DCB5A9B61D114C5304C266553816928E3F69816C54B17D249EFC73D73BF7209CDF08116BB080EA8EDCA478543 CB90080BCC142A6BA4629D397CCD33F523F418450B30E53C9961202A56E8F1DC2B26CEB569989AF68BB2C7E22BDCB0D4 8EB53DB93B0F6C56ACE62DD1BC52F368DCCF019CCC499AFC89BE8D75B876F58B7554FB1EADC26C1A15F2D9DA5AA23061 F8CB2CAA187F3BA480B0F3E88453E868E94DD6FC2ACA3BBE5CA690837914603DD8BF52D9B82E345B9418CC69F91C1064 39FF0E34ADD15A95204BFE952FAAB3FD46A6FF972D3E5C01AB858B9076CD1D0056BC203BBC2B6B5BDD7FD3163673CC5E 9385C021ABB8F9BB41C915E0B70A0EB7B375EAD870C2AA26FC330D7B837224915EA521CABD0B05DB0516000EB5441DDD C715F977C4CD8CA71AB98BA5C8C09CF3D9CBBC91989BFC648E9FE64E30AEB9472D8A55A85A2E2AD545802E1FB5DB0ED0 6B3B3E1114767604572EE2ECD482790FC20D9C31C2EADF34DEE0591091BF70725DB3C08DB4829C212B387DB403AEB671 435233F888DB23D61A517A69BC729ACA0DC54DB830AA7A4075252818FD12DA5995826945DA3A02162B87888D04331575 BF739CBF4938643C7E7AC857D1F48D3401EEC9D5EF79F88A9DE5B0A1524CB2054C744F67890295C274BB3DA00754902B 56D0C7378CEB0B4B9691ED0780B2088481764119BF566CE707F88129383883971DC823DB1CC291AB831BD1A9439B31E9 36F7541F59C86DB1D6644AD6394DBFDDA6A34BF8D6CE874979743DA3E086278AB6759773E2A895862CD6BC283068F6CD 341D733D2F25F2ED98AC5FD38746F8E5062203689B2EBB03671ADBFD82E74327481D8E432C461A9EA1DA2538E2379E1F 735152CC244F73E7E61F83540367965AB032BF6FEC717B1DC5268EE16CEA459087212E2DDF2FB95B75195B34CAC09D63 AAB2E9EFA8E091A8FEC9305D43B8D25698DD38AE3144AC6C7536D643C24557BB57F4E7EBA56757AE565CD8E2EBCDC382 21F61D3057E4355F6E9BE1F8D01094ECBC0CE0707E7E97C7D728C52D31C8A7F657126AB268318BAE4314B982024C7E18 65723C492A604052869EB906B36B47959B6F0E1B106BCD9DA911B3F80E83C31E6BF969406297E02261CFA837C8D6D417 FA28CA00BB365B5929F5BF79FA67DF5C07E8C78D7AFAF485258EDEA48F95721EF0B7A60641364F069565A442FF7C0D47 C96E60E03EDDF952A7AA446E62B3B811679AEFAD99DFC2AA8557431A97A61A1CA8FBECD0C8E371A47E6F3337DCDF8D44 B89E343FD527774A47B7EED62A2C42CAEDC6530F93B01D7BBDE0B64FE479DD20288260E6CADC651B15918CA53FA06D5A E37FEB6A39CA039FE8093B9316E7ACDB7DE4192456F6B87923795F364402850D24EB7B86EF1DBA07C2B5766FD717F844 83690C81B2292635A47389310C9D526BD7DB1954261A39A2FFF662AE7C34C7A539CE4ECB5AF35E5051591DA941454754 2516AD530E95647321034441CEFE4C5097BAB5FEDF74D1C78DA517D304CB0865E91FC4BD6B9BE210EDE1A246EE8EA6B8 9685AD1FE94F7BD87F4F23EE64789BB62814BFD39467349768BCD0895ACAF4429ECEC180417BAE4FBEF9162C42464519 DC4553DA98E4A3A410EACF491FA3A91AFD5F499A82A8496618108A2BAE1FCA3F40454602EA4A2E064396D118947A1E85 98CB9DF9ABAC08B3580C52060EF5F3B5F40DBF82D4EA7D9BB075F7D7D552A717312642E28D1D8DD763C048B33A0A58E9 498169ACC4C9E8BD6B4758F8E6A181FE956C2C21B77C4EAF880CBA35004626AE78410CE513F48B923CF078140C6254A5 E6325D2198D244B14BF25335E6DEE22AEB2EF84D8D8F39B41DF5DF85E56F9E52F76751B33A2518E045B4C075BFC88630 D19430F05FE1A7CA8D08C6699954352CE3AEF7CD33355EC1FDC5DBBBDC5FA8A7E63C9B0BBECC0BD36ED093378B6BC8F6 4644AF567945DAA219C41EF808746E9BAFE2F4C2D1EC9FB758A45AAF0FE38F656D39CCB11A8ED3E3000695590CFBD757 0E6AB5CC9A8233189995777FD7D3BC58D9AD6770A67E7B99F3B1D7C27F7E781713D5DEBEF969714EFA224531443DC19A 5A24A2FF30348287C9C3FA0B60EBA57F1D020852B5AFA1C37066BB8045A2D75631964EA9A34813F0D42CA3610CFC9052 F207742D31C0B69D58353D733ABA1BE112A5A75185C138CF29A874B1310EA9F7D7AA800069519198CF3762F9DDF6BBFE 9894E98A45451587A0F2A611FFB73A088280BDAEFFB7130A2536AE538232C139667CDDAE99612166DE4E37CBFB1ECA9F 5BDAD2F3B03BB391034ADE0B84BC134B5CF66869530C3FA2D54E9081AE735EEEB61420AB9D08F856252569A789E4B94B 8A87E827012A4FA8C15EB5F07968B68AB938C5FAD581B6F2CEF87A0E1E96D571D45531A991B9879516AAF044AB17C780 93C359905990AB0E0E797DBDB99A64188AE12BD30CFD0ECA81990CC369CD1D746BF85DE8767900436BA57F9256E691BB A74FFA2F121BE405D8039B4045FE792A4EC34A5D7EAE59D3E8AFB9C36031F5179672C1EF4F482F348E081D6D161E6CCB F051B080A225D62FB0344E238635ADBFC239596B219F56100E14BE80B4EEAB7DA57ECB4E790FD76B9F1840AAA7C25510 38304F079A04AA1B65D9835E5527F7E9768F5C3ACEAF824805B580B4920707A305EED377A0BC64F28696ABA5872573AC BCA8 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %!FontType1-1.0: AAAAAC+HiraKakuProN-W3 001.003 %%CreationDate: 11/20/11 % Copyright �2003 Apple Computer, Inc. and its licensors, all rights reserved. 11 dict begin /FontInfo 9 dict dup begin /version (001.003) readonly def /FullName (HiraKakuProN-W3) readonly def /Weight (SnapShot) readonly def /isFixedPitch false def /UnderlinePosition -60 def /UnderlineThickness 63 def end readonly def /FontName /AAAAAC+HiraKakuProN-W3 def /PaintType 0 def /FontType 1 def /FontMatrix [0.0010 0 0 0.0010 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /uni5BB6.1352 put dup 1 /uni672C.3722 put readonly def /FontBBox {-386 -373 1232 1266} readonly def currentdict end currentfile eexec D9D66F633B846A989B9974B0179FC6CC4458BB4CB99E3608702C78822367AAF89059868F63F93207640A6BD5DA214789 139C491E02A37BF3866F2964E8D690D48D9F6C4A5EC22355F8123573812483E06B968AE84B5F20A982A0E65764753516 97AB8C6EA040355C5542F297D7A3AF28AB93EA0771E0D56DBF00F7CA9CE9FB9FC2E0ECB00D04D5F5F3F24B987B546D62 74971A477DEE12C44623C180BCDBA21172627610C4736632D1A4693E79719C3BC43DF5330790A52DCD4CF455ACC213F6 B1C4BA249179DB360225568161552A16682E3A3604BFC39D571B1F8F18375BEF1B05D6DE4413DDBDB2D936EF6A197BC8 7EF3384DF04E6025A3A7EFFF451D52E96886EE4B4169EC3DEEE64932AF4AECA3AAB81853B58042BA51BAD1CF1FE64675 4A29D2100BBA83E7F6E2F5DFB112F838CA7F659DA7A6373BB1B86BF204DA715F2942AD8690FB1C37539822AE991DF19E AFFBD3E70C395C40FA19CBA66F6F776EC20B6398A64B19208F0E64419A3F9DB393F17B6A206EFAE3B72BBB97405C4CB8 2801FFF79A60CA475287D576B5FAE301357949AC6E4F6EF1B8E41EC8819429C31C995A8D02C6F93131B3C3FD0563C5B2 C561EF5E734C7AC2E2F882889F4D04700D54FF4ABFEB4AC7C99214F399F62A2920477FEA7111FBD7B5EC77864EA25A03 88721F3165F5B0867D1C7C29DFA0394F00B032672FD41DA7C59FA55B9E3AF89B81799A0B27F1420BA48F9FA3B4693FDB 053C26BACF8A048849E5C5B195ED71C79113DD547B1468FEEC4C124788537CF90C3E1DB8793BD8E61BC72DD310B89670 021372EA4C700AD16A855D0917C5F105706F3206540AEBA75926DC784B77FAA8F2459B9A468E2A06318839FA8C08FA7A 8241BE54D435D7E1CE8BB877839B32897C38ECC3B2B63BFD6083CBD67A33FDFC81F548A162333DCE29E28232431AF514 37794B82CDAA0282850FBBCB8A0A9CAE35CC3991AA9FBE225251C0E9E3F59F39EC952D556BEDE7BA8BA8BCA5546B665B 2481E6F4EE3929FE02EFB2402EFDBD1FAC1C72B9CFCFE391E0291A712286845FD31A23988776578437DD63EE0C3ED76E A391B35D2355FED30B1FD068D708EA45C4BE46C0F907CAB826ECAA27734D9723CF21C18BB7B30819E095E25833FB53FA 83710AC4E86D305F2EE40138D4BECB08688944C0D68C62E39899104AD6E587EC0F3FC097CE79F16A2C519A3B4ADA4712 EFAA7D9C7A17BC5023789142657BA7D164124537929053C2A7A0D2E8E4E63CFA5179983FDCC84769897719FB24472CCA 9EA1577B22B8B29703CCC51B7A254194DD86210204BEB444EA4A0D95A73FDBE953C0BDD8ED9074555027E745D457D989 412029757A42BCAA87154D3479D568532C656227DECD1A94699177522FB013228446DE961EDC5C6CDBF3CD69FA2B5F7E 2137C9DE65C2B6327032847044CCA017F9B2E8177A4A4B6D7DDBAC578CC2E98EB131C49BE0E818CF78C8DD2B562D74A1 A9CEEEF49606115A53F15F15D080A3ABB6D990CFEA9C58779C7E388C90BF6C7C1ADCA733C293E821F528A8A25B16CEFF 39B103A0000382CE00343EB20473864E5EE271B9F16B48543620B37B95B5C016B6BDF34B868DAE1E3581207508587E0D 44760E91C5E8183D629898CD1FD0E1D2798E7DDBF7A2997AD582AB85DCF50C2301E775AC7AD675A059D273D13E77A7EA 38DA6F3B16DDF2087940136B83C511845E6A91B8D2B8E3D892958966D1E22B2BC977734ECA36565C4A0FD0DE93F30256 40B66827F52733B55B565D4C60B8A3A5AF5EA3F5DDE6901C913366D3952F3FBD1B3FA9E4DE1474E006280D61EF34D830 490F88722027E57AD7F3FAA60FF2172B435493B0B726C9BFFB996459F29609633507AF1DA7A9F84094F7C61B0EEBA767 0540DA3ABAE2EE2C565DC4B7A061BE2B5375121676FDE5B0C37B9D922C0CEF05056E77E641B66DEEDE17E1C6714DC4A7 B16764EA5D4C7331DE2B1472FC3E610FB03B5842F4B7D9D268CF3204EEE860B1B96EB272DF663849EC387B8135065F48 4863D2C1263604ECBA3F3BF4344916C70485FA8B9E61C9F6A83C70EDBBB3E3F5A63B0C9BBAE3A3B457D94E5669B60812 E2B88E0A767E549573484C03CD45364AA230827B160318E25F95D8ADBD664C1DE213CDC3454775A09DA3858AC9622DB9 4A66012A14588548B12011E64B1CAB38834EEA24AA78C7FDA24690D53CE063EF666119954BD289925D2667AB00834FD4 1EC048E6ADAFC36FE8971B9A3B776906C22414478E6D4731FD1125256E30E2ECEB7600643ADFB27EED6B7040DEEF0580 ABAF22E011D407D171ED48A915140FE722E3DDFE39AFB34043406803C8C0CD5D729243F2450E9F7AE57A85910D0C304A 290941ED125758860B66D4CA4E00F1F6BABC431CD4B2E2C0B9C2DADE8EAD2BB86D96EA93D125497F487C77BC15BA284A 04A55EE8DA4D52C365D845AD7D66672664B1B6D113376C4136E18A77579176C5BAEF5D063127ACEB217340F93AC314FE 151AC07E75980038953DE1ADBFF288C3C0CE5974F5ABCEC9B7780CA3A7949C232DCF7C36331A48DF504C45E69BE408DD D4DFAB2CE40717D026086DCD1097B8D79157EC780F6EE40798794591698E8894B0229F5541131FFC3777DA24ED84FA84 EA3C49B49D8B8168764BE94AD9CD73303A9C02C4B30273D995D77E093F9B20716ED7A8D1882A8A3ACE81154B739FDEC7 D3E560D8733BFD7A7FC51BDD337587FB4471C0E735DA3A11DE1CE7510EC7000A78EB103DD08B79D3CDC791077780EECA 983D71377D598198DF0A02F9315A92A1708B997FE3FE467B06970D58C676D1AE871F2A3AAF6E85BD087A77A92918B0AB D6DC855C54CF7A69CF96D20B74AD321DCC3B7018A7444D4F2A193451672F3A720DA457D38F60B5775C157059CC76938A 5E396C70D7FA75E105636F9F2C27F5FAC0A0DE4AC709899A15B85D546B0D6020B509DBADC91624359D5B74575D67408A 0B9D67AD007066510B5D0D1B0EC5244C1AEF02E521DA2BF5ED41CACA27127A53415F188264B610C4C837720CF95B8E78 D7B36D0C3E86CC7CEC6ACF71575B9D28BC7155C67B45CEC4DCB47D8474A1ABFC1CD4A284109F175FABC93B3020C61D0E 31C976A6D252B773FB84F044052F027ACCE86453F830BA312657154C8C25AF0D965497C02E9CD04B3BC66E08E942AC45 1D0ABC63A739E527D5ACDBFC52C6357FC7A5FD91740DB7584C3C12B1F5BEF9A0A44B5DB530603FF7F1696ADE05102600 5919B9E0923BA37B60C7611E7EF96DEAA7552F8B28AD9DD5C3A2A45D37BC3026CBFFC6429C69CB444D4C460BF6F7B15E E6523F1768568E1357DBF96488F4CDF3D9633C8CC2B3732B05A338622C30DAD2966CFF5B3EFCE688EFE2A0AE6040ADD3 567E90A16026A42A2EF287CF3D8ABA5A6E6E251938B96BC6D38EE53F70163447DFB2EFB45D5E609E135AFB66185BB12C E5950CEBFF13E5DB2848616FB0D5277EC40B2C41FA40D086E8164884A49BFB03BAE3E66B099DF735697986BBAEEA8856 2B9730476EE58E06138502D055A88DDE2CE4E944771E1B9D34A739A87A2EA404CFEC8FF65824E74D954EF758DFB4AEBB 875810571F2A6A6F75608E7B52682225EEEF094340B12E03718CACA3E6D5FAE9BBBFCA7FFD14DCFF08A057F4E379D622 A338012DE2C834A83767864DB7C9823DC75AAA381B068E57A6A4FF9773C2183470F1FB20122DBEE76D826337E5D01DDB 295036CE9D5852B3BE4E0CADC66E42B16305CB7368EF293F42E80AEDB791C6E9BD45933A9A2F17FD60E551E1548C1AEF 6B36A262D82C1ABA3C7F6C51DB913E16D8795640B2FC7ADBE003B48B62E096011398F387E77585064C481BDFCA7C47B9 CA1A3B755CEC4A0596120A4E75119FC14B8A6C13E93694D2C319653A413B8E4CBB1A55E7BC555911F2D31678D4A5DF56 8DC4218AD6573BA07D46160134286FCB4C1F803E07723552D7C854CFBC3597DE9BF1B9930B6997AB2E9D384934BD1730 BACB9586D46B81022DF89010B65E3DFBF7178C543A46BFE5CF6B6E3D2A5C74ADFEF13F131FA05AE05251FCF217F92769 26F6E5FBEA94F40F1F9910DC865321A0495A8CBB5487BB2E96CD075E3CD99EF552ECF67C331CDC1CAECA526DBBB3314B 6C8FCFE65278A70C484356867A41DA7D0C0CFCCFBC09DDE65C81D980190E539A67D8D4F02DCC8D9936CBCB796D84C8ED 7A0F35F4E73D5210A625ACB7860AD39B09F4609C1D9FDF1056D9CBA5BBB371A674045316DC6D97B4E3EBA6732EE42A5E CBDD20F8C7DC6B8EAD36AD7931D33445B38B78BF4714466CB9EFDF75F9E88622610759ABDCD6DDF314B21D5ADB663BF0 2B232EC7BE6AAFBF0E60A734037477B8E6F7FFC1290E89E251FBB5F91EF78AC3B71DBE01A7E8F0F8BCB6E62F50E3A415 8803FD7CCD69F45F274EBD2843E77369A66750D7E5C82F42AEE451D6F81E3BF18D2EF5D4A8F7BBC43D5DA3FC1EC142E8 8EFC114D9FD3E758A217D3088B31417DCC3E6658C97BBAF1C35327F1FAAD78512CEE74AE6B4E1863DBB552CCA429AA2C A39563E8FB771E2493F6340014AA43972720FB7449D1569C8EF84EA788CB9FF7B106DFA7C57A4918534F8ABE0DA68652 25D8524B0D74FD65C5981AD546696209E82579650251CA16599FC06D15C79EEC51B71E35D070C5069319943C92B6E25A 96C50995E3D26548716BDF002B6BE74EC140AC12454D62419B00F312C979E0879AB5966CDFD1A4FBFCB7C1057C4D2C01 A6B78DDEF4C368F9DE27AAD7CE33C3DB1BE034122F8E4C7BA559A394E19E1DCA4E55CADA86B0820D2F49AA88C81F0E23 194CF929CF4F3ADC4C89E3FD4900E5D694B0E81A4174F9F8E279FC45B790119811992A209263BE9BEB655592DE9E8132 6E7D45345377E356A7BA1BDF524257EAB9E61752B685890BC824AFA834605712AFE431180E9C87F09A87A1F490A9C64A 7EF8232E3685EA6DE55F4586202D727D15B0AD4ECF9337802641B344E45635D344E82AAB61E083B8DF276C80E82E9960 E00EADE00DA94EF49F30327FD659B8A60318720E9A0BAB66DF457A0191D864A080C99D75BADF49DFC668094A600E561E CF3FE3B0BC981831D569CDBDCE3E7819FC4A706848C2B52097988C0EEF4B0C1CA1B58CF82D3BE14349C5CC7E934B1E0B BA3B8D0C93C9C14E11101DEE66576FA53F7B910EBEB05C26C6BB539FEA91E9FC72B2B25E3BF532A709A4AF8E4609752F 495FDAB446FE4D04629BFCD1C961A52C913E1EAA315C7C4FB8A6C692A16FE0D08B2959FA9B31D3270701B9D050D8B2E9 8350D7416F89404CA56AAF343F1E037873E86B71E6ED894A14A9C8C70A41D6ACAB8236CD51362340C02EDC49996A9530 65999DB2E09F06376F27791E4DA56AE2AE9152B606301BE973621C0F358E3100E07C3ADD21A8EDE860477BFA33A4DB6D 45E8A1D657109D6074FDBB986F3D7CD9F61A0C313A424AFE26359E69848876E1C69D9A76D11A4D20289C2D788B469FF2 850FB4CF98FB96B14347FE1E9C195AC54203021A7E8803AE91C6AA6E4946010582040D6ED65E940D3B8BA5F4FF2BF2CF 35EC93026AD01B6D1C9C3BD77FE4284D1825A0DBD180AFF5BD78AFB25690AD1977D5956D1923802A37A5948FB006AB14 88CBCF39CDC48CFB047794CBCBBD955CA179C92806F60A51C04CD5AF79979284D49C2B8350784E8A77B8ABBDEA6395CB 006DE254798D9DECF3C9FBC7E826F4E445230EEFD7E0FE335F63EEB793AC66C5079A232528504A8729F428CB8AA722C6 B1587E3A385777CA694F072915D24415BA6C7A0014252BDDDA51FB7E8D2EAB6DCE526EB520E289AC9B878C3A79EE36A1 6D0F7B221F7A1B533FC07302411987C8B473482F8105D7987EB492F60952B9F53AE45E8CFEAB3E621040CD0E9F084752 3EDC72070DBDC97BE62602ED1EBE39D065A751A4D4B7E3B7ECB986D9D6ADC861F79C06FD992E99119ACAD8ECBC6972E0 C611266C5E2DF852D48F20BA787820E9797295DD624FDE043E2F8E732F2D40A7056566192C23128595C04B9D57792BED 1110C0698351B733A2950A53BE8E4591747EA5622906D577456D5AFCAA5468D804FCF69D3D331377E99B706E851F604A F7A5BADC977CBF4C3B6EBF0055ED81D9AAD07634B7343CFFEE27F54082BC46EA444C3D45DE9BFCC0569EFACFB45E9972 3D2DA81DCB5A9B61D114C5304C266553816928E3F69816C54B17D249EFC73D73BF7209CDF08116BB080EA8EDCA478543 CB90080BCC142A6BA4629D397CCD33F523F418450B30E53C9961202A56E8F1DC2B26CEB569989AF68BB2C7E22BDCB0D4 8EB53DB93B0F6C56ACE62DD1BC52F368DCCF019CCC499AFC89BE8D75B876F58B7554FB1EADC26C1A15F2D9DA5AA23061 F8CB2CAA187F3BA480B0F3E88453E868E94DD6FC2ACA3BBE5CA690837914603DD8BF52D9B82E345B9418CC69F91C1064 39FF0E34ADD15A95204BFE952FAAB3FD46A6FF972D3E5C01AB858B9076CD1D0056BC203BBC2B6B5BDD7FD3163673CC5E 9385C021ABB8F9BB41C915E0B70A0EB7B375EAD870C2AA26FC330D7B837224915EA521CABD0B05DB0516000EB5441DDD C715F977C4CD8CA71AB98BA5C8C09CF3D9CBBC91989BFC648E9FE64E30AEB9472D8A55A85A2E2AD545802E1FB5DB0ED0 6B3B3E1114767604572EE2ECD482790FC20D9C31C2EADF34DEE0591091BF70725DB3C08DB4829C212B387DB403AEB671 435233F888DB23D61A517A69BC729ACA0DC54DB830AA7A4075252818FD12DA5995826945DA3A02162B87888D04331575 BF739CBF4938643C7E7AC857D1F48D3401EEC9D5EF79F88A9DE5B0A1524CB2054C744F67890295C274BB3DA00754902B 56D0C7378CEB0B4B9691ED0780B2088481764119BF566CE707F88129383883971DC823DB1CC291AB831BD1A9439B31E9 36F7541F59C86DB1D6644AD6394DBFDDA6A34BF8D6CE874979743DA3E086278AB6759773E2A895862CD6BC283068F6CD 341D733D2F25F2ED98AC5FD38746F8E5062203689B2EBB03671ADBFD82E74327481D8E432C461A9EA1DA2538E2379E1F 735152CC244F73E7E61F83540367965AB032BF6FEC717B1DC5268EE16CEA459087212E2DDF2FB95B75195B34CAC09D63 AAB2E9EFA8E091A8FEC9305D43B8D25698DD38AE3144AC6C7536D643C24557BB57F4E7EBA56757AE565CD8E2EBCDC382 21F61D3057E4355F6E9BE1F8D01094ECBC0CE0707E7E97C7D728C52D31C8A7F657126AB268318BAE4314B982024C7E18 65723C492A604052869EB906B36B47959B6F0E1B106BCD9DA911B3F80E83C31E6BF969406297E02261CFA837C8D6D417 FA28CA00BB365B5929F5BF79FA67DF5C07E8C78D7AFAF485258EDEA48F95721EF0B7A60641364F069565A442FF7C0D47 C96E60E03EDDF952A7AA446E62B3B811679AEFAD99DFC2AA8557431A97A61A1CA8FBECD0C8E371A47E6F3337DCDF8D44 B89E343FD527774A47B7EED62A2C42CAEDC6530F93B01D7BBDE0B64FE479DD20288260E6CADC651B15918CA53FA06D5A E37FEB6A39CA039FE8093B9316E7ACDB7DE4192456F6B87923795F364402850D24EB7B86EF1DBA07C2B5766FD717F844 83690C81B2292635A47389310C9D526BD7DB1954261A39A2FFF662AE7C34C7A539CE4ECB5AF35E5051591DA941454754 2516AD530E95647321034441CEFE4C5097BAB5FEDF74D1C78DA517D304CB0865E91FC4BD6B9BE210EDE1A246EE8EA6B8 9685AD1FE94F7BD87F4F23EE64789BB62814BFD39467349768BCD0895ACAF4429ECEC180417BAE4FBEF9162C42464519 DC4553DA98E4A3A410EACF491FA3A91AFD5F499A82A8496618108A2BAE1FCA3F40454602EA4A2E064396D118947A1E85 98CB9DF9ABAC08B3580C52060EF5F3B5F40DBF82D4EA7D9BB075F7D7D552A717312642E28D1D8DD763C048B33A0A58E9 498169ACC4C9E8BD6B4758F8E6A181FE956C2C21B77C4EAF880CBA35004626AE78410CE513F48B923CF078140C6254A5 E6325D2198D244B14BF25335E6DEE22AEB2EF84D8D8F39B41DF5DF85E56F9E52F76751B33A2518E045B4C075BFC88630 D19430F05FE1A7CA8D08C6699954352CE3AEF7CD33355EC1FDC5DBBBDC5FA8A7E63C9B0BBECC0BD36ED093378B6BC8F6 4644AF567945DAA219C41EF808746E9BAFE2F4C2D1EC9FB758A45AAF0FE38F656D39CCB11A8ED3E3000695590CFBD757 0E6AB5CC9A8233189995777FD7D3BC58D9AD6770A67E7B99F3B1D7C27F7E781713D5DEBEF969714EFA224531443DC19A 5A24A2FF30348287C9C3FA0B60EBA57F1D020852B5AFA1C37066BB8045A2D75631964EA9A34813F0D42CA3610CFC9052 F207742D31C0B69D58353D733ABA1BE112A5A75185C138CF29A874B1310EA9F7D7AA800069519198CF3762F9DDF1B347 379D624CCBE3728B3FCEB06CAD89F683033F68423A0045251C1D05B98F791A7080A26D7D62EFFDBEF6CE4DFB44C8A789 CFAD7CA84E7DAD78569556AFD5107D5BC2998E752D38CCF8A5C31B93D304B4416C683A8953F08EC406B919BB1D4BB27C 23488028B8EFBFB302DD47D108000486F05639CF7CACBA17E08C161A29CBFB06128991FC5A39576B3B90B798AE5ADFC1 3F550646CF0DEF06188790214BAF5EFA41CB77ABF53BC8C6E902C2A4C89396C6DEAF3ED8A0CB7DB454796B533E6974F9 9C7649F786B2E5E81B63E9CC5ADD1F2E4E33BB0BC5D6F45BD6E01DFDD487D07453431E5A991A63A65A2C999EA4E545D2 0932EA9063F00A10E16225AA36E6A120ED35A9488016DC83CC9CA577B7CA507265215102ABB96AE8A9B1DDB35F348D71 EC2CC8D7425B810F37143D376ED2B99E7E5F822C54C895C8B4F13D1B5EC3D9752ECE43239717EDFACCD1DD329A69879F 76C425ACC7754E334F44A9D2752EC40698F9F6925F13C9FA591B2981F93DF52A203A893CC99A7460DADFF94C530E480B 83155BF682D5F1603D8AE122484A6DBE73F4BB9BECFC8BA295F86F8B6FC6CE4EC0CC55B4FFAD86CCF2707D48ADA7773E FDD4A4769CA6BD7221C52EFF48D4C3595BE8002433166AEA1098BDE93BA9B5084AFBFEA4F25E8F183B50CC4027AE941F 85477B6649772873F3B852994AF72891F2576A4C1C106CB6B0CFA8872E9050C95764EE3262EE70790A7FEA57369F571C 7E2E249563D17B477A9E48A57AB936C3179FFA3E414F10CEF9820E37D268937DD3D50D7D5D5D59A88AC46489E8B7ED78 8A046C83FA64A79E7A43AB87A7BD604AA2DD934AAE6634CDC34EDDBF12492519DCC09D3A63C7875B6B17FC5AE15F5A72 B7B240B5B9A0324ECA4B9A9C2E193B1BAA08DC46A85A10B17AE83CFA536F83A1CC55A8E32F86025FFF0873FCC0D097A2 13C247EE21DF9BF67ADC93DDBD272F74304B6BB367EC9EE53DF3AD9691D422B564291DE35AAC80CD1AEA5637C0933CD0 BDB5FD03029BAD0DB9A53A32BB58864C71CBB2D6FADC2FC59EADA0F02A7EC8B6737B4A02264A84776B9522EF68C78966 FE717B28B2D6E643A24C420A9E06053254C1086EF10A14244E529D1F83F47D170C24D7C2B43BCD00D2970C7C327EBB37 9E8C84D8B42F87AEF4E4CE87E31E9F92C0CC1616AF751EAB03AF5299E0F9503FDC25A2727D727742C9403D9519CB05B0 DD6653ED38B9658464AA627066F39BBED5949AA3E989B5B1C6FC206C712A4FB42F884E3A79FB2AABD8D6502637A4888C CD41F2AC8D1F6665A656E225D5CD86D90B41097261C0D73CB60C7BF1DFFEB5D049F687984A2E114D21A3DC2F5C23981F A9B5F7261C1428DFE25031B800B42A1EE23968D44736545FC5D3E287E496FCCDFAFB2CA7C58369DC8DAADBE69BBAC480 B7AB8ACC65C7E3D9E887533F24E5098A323F593F49115CA0EEC0B21E27D8273969 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %!FontType1-1.0: AAAAAD+HiraKakuProN-W3 001.003 %%CreationDate: 11/20/11 % Copyright �2003 Apple Computer, Inc. and its licensors, all rights reserved. 11 dict begin /FontInfo 9 dict dup begin /version (001.003) readonly def /FullName (HiraKakuProN-W3) readonly def /Weight (SnapShot) readonly def /isFixedPitch false def /UnderlinePosition -60 def /UnderlineThickness 63 def end readonly def /FontName /AAAAAD+HiraKakuProN-W3 def /PaintType 0 def /FontType 1 def /FontMatrix [0.0010 0 0 0.0010 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /uni0020.1 put dup 1 /uni002E.15 put dup 2 /uni0030.17 put dup 3 /uni0033.20 put dup 4 /uni0034.21 put dup 5 /uni0035.22 put dup 6 /uni0036.23 put dup 7 /uni0043.36 put dup 8 /uni0047.40 put dup 9 /uni0061.66 put dup 10 /uni0062.67 put dup 11 /uni0063.68 put dup 12 /uni0065.70 put dup 13 /uni0068.73 put dup 14 /uni0069.74 put dup 15 /uni006F.80 put dup 16 /uni0070.81 put dup 17 /uni0072.83 put dup 18 /uni0073.84 put dup 19 /uni0074.85 put dup 20 /uni0075.86 put dup 21 /uni0079.90 put readonly def /FontBBox {-386 -373 1232 1266} readonly def currentdict end currentfile eexec D9D66F633B846A989B9974B0179FC6CC4458BB4CB99E3608702C78822367AAF89059868F63F93207640A6BD5DA214789 139C491E02A37BF3866F2964E8D690D48D9F6C4A5EC22355F8123573812483E06B968AE84B5F20A982A0E65764753516 97AB8C6EA040355C5542F297D7A3AF28AB93EA0771E0D56DBF00F7CA9CE9FB9FC2E0ECB00D04D5F5F3F24B987B546D62 74971A477DEE12C44623C180BCDBA21172627610C4736632D1A4693E79719C3BC43DF5330790A52DCD4CF455ACC213F6 B1C4BA249179DB360225568161552A16682E3A3604BFC39D571B1F8F18375BEF1B05D6DE4413DDBDB2D936EF6A197BC8 7EF3384DF04E6025A3A7EFFF451D52E96886EE4B4169EC3DEEE64932AF4AECA3AAB81853B58042BA51BAD1CF1FE64675 4A29D2100BBA83E7F6E2F5DFB112F838CA7F659DA7A6373BB1B86BF204DA715F2942AD88E29CAAB54CD3EF15782538A8 1D74026DEC736D8AF4AFBB3A61B02C2473EF0FD459B95AB8B57E30D32B1CD63EA03ED9692EE2DB9C1503764887683F6D 914C93A66FA6150517CC716FB7206FF634C472E436B450CCCE95143EACD3D63090442B5824AB9EA741DD127DCBB5E760 855E3A8885C51C56E564C6DD55E122AF4A5F259ECF1860079165ACA84C4B8B9E4A329FC22C6D00BB3A5B99D137A53CE3 717949FC27C5D46312C7FAA842485F1722F221DE5E4FC55611939BBF34D6E699C9834FCFBB4DEBD57C02ED0B3ACBE19B 749315C676868357E5805CE5C47086AA457385E62F2FB51705A8E0343182FDB73F4A2761DB2B63AC0D4DF1CF2A2054B1 DABE1DFAF586B67F680739C10FF2A4397E21366C2949A1C2888809C58BE8464FEE5434AC57C4280F8E59C21149F31E1F CC411FB4FB7D1F4DCA1B114B12DBC86FFA234FC3BCE18DA7225727658F187D8B350AD8FF93D71777F313341F1F8A7D8C AE27D0E6AA149FB6C4C6BCF8855C07534F2B073B83B3267F14DFD93314991C3D5E06385B2AF2D297E504EDCAF63B254F 4566A61B1E1AB03872219675F3EE43DFAB961FAB215DB70886C876A97D6FDBAB65E46138ED9CB63FB37258D47FFF77C1 399AD3C525A50983657219148704BC886B45C13C8156CA07971B2DA0ECC38DE63788F541B13EE9D8C964A9D0585EB78E 331993EAEB3466D917D1A7D2748955DC247C166C802C6F0D2B612109773D6F19E5F8BD41365DB854F495C72CF35ECC9F C289C92D798A7BBC45176507A1DE3A8885CD04978B34DC0153EA45EB5A143DB8BC4AEAF6500551EE9CD43412C55796DB 01FC26514DAB0A98CA549D7EE337EB1D8646DEB04845DA6E6602932A36E039BB190C771EE9153D2F289BFBCD56A36AE3 0BF92DA9FE3ACA22C01CB34ED28F94F8ED7DB3A228B7002BE0B08CD285A2316AFF5A20131D98AF761C42C9BC5A163AA1 445E897850B07D11A72CE5032353F43AB4B5087A7208230EB440C8A725D2622AB432F7AB756B655E1E6C459D705E60E4 1FD2E11EB7D43D729C1312E8E1A83D3140CE19FE11CEA6A42352E58810F732438A80C16E21F6D87219C0B767FE28DBB3 21B5FDA5AC6A07F154D74FF668CC1BC2714FCBE6B3E103AE5C1FB54B4C94343EFB77794F7F86EC245B956EB659E5F972 FADE93C7084AFC6044B346CEAF3B0B17B665B6B86CAB12653EB605E42D08D51A5B45CB85F0CC7DCC690ABBC55D64448F F196A8A5E1E618AEB59C1C4244123A66F3D60D3ABE0E86BC707768B0B4509579CD6B906041EAFE205673BFA858A62816 3605BDBF87CE463545F453851C67F01C7F64AC71E8E5CD7ACEB317368651BD87B79AFC562C191BA6EFE95427D72554FD 7D1D2116173A3484F9AF0D6E0FB360CA6FAE1538DD9E78BAF5D750D077763CBB0E8EAFBB4F5EB7F46349644F0FD29C09 417A56F7BF7A7BD33340D600790288DD22EA11662DF25B73FE624E33319D927FB8A42352E58858C89742C1D91AB02F15 F6DABBCE5D6C8F6F6ACE2073F113B873AD227203B3A617DA8C3E30CF07C2EFF49CE030B9E43198C6FFA072B96AA1F367 9BC7603F88B67A7D4E6A0F6B06F135115EBEEE12F663854C24584DE6D4BFDE1D01949F57C32137E88510AC5493FDADCD 9B298A38C69AEA93035743AB143166FA7127FBD33CB922E69AA320BDA0EF4BBF4C35869196A7DDF8B8682B24CDFEF1BD 067BC2424A419AF54DB346266109C0C20A3E29521E4DFC14EB295FB22D6153F1105C6D7ADE73984BC55BFBC76D50B9A4 FD2742FECFC1EE123E19D38F0FC66196FF8AF5793D5A71B67B5A0F265B0EA00486D4C74EDC08C8667C6E2DB3DE71623B 1A18B22E65902200E5D694B0E85BE4945AC7C7AF887AB748F37684E4DEFB57BAAB2D925D4B7DBC48A647BD4B128622D3 2893960192A3B744DA54C5F2BE1F00B0D23D8C25A9CA58D4823F4EF496E821624C6EC20E8EF183A2D14441359EC6585F 942B53ADFC253DA6C2FF212234C6027DF8F89E0D4C56CB09272C285B9581CECD3E8C4E7E18CF39F7085CDBBA1E861492 D756F3453E810871716B3BB7AD7F1BE3071EEC056D8FA00270928C30F5A59884AABA91C4E212229EF2C8CB0F205A3716 2CFE1BCB949E8326435093A8D24CA4509FBAECE4C1DA794CE4192F9D49EC9E39A34D0324A56E1B84D367149848B12EA3 A5DF299C7A5BBCAA762C7919AAB7A01625917CF8C83D35330B38A4637092D8DE21ED41A858E8FDFDDECF6939FEA5EC15 A6E7F46BEADE268D5FA9CFF768CACB0EA5B2978453FA3D24E31A9A4C4E1AA3159554101855187E8F190B89B3B711301E 45F53D6736751E73CF97118D5DB63F3F289F0E40753DC9E37065A211326A2C945CC0961B186DA3383B9B3E40C19323FF CD23978F003224A3BF6A553C28868AC6E8EFAA5DC265F81E8353FD73D56DE12E76FF8FD7F767A6D95AD91BCB251D2E5C 894CBF58F8BB22D80B20A9096480D9EE0D264570F3D85A29CA3BA96AF25AFA4FB83E5438253C528AE51EEDC59E5A9F2B 1CC166A5CBE077275B2B5B87327FC2B2D5BA577CAE7552CE3EB31C3A403A5BAAB90E430F617464247D4C70227CA92EE5 516F471EE9A34C5945AABF6121EAF8B37822752BDA70C91631D4E90F417AC6FA53795C13A27F43320DD8531D42894D9B 10A688CE3F08DF163E65D7BFA08D4CC2B3034A81437BD8ADE192A1BC8C40DF3DCEE49AE5C989999221B6DE931327B79D 4A03E40D66F307F758ECC243D4A9316382942146A387E1B02C267B95D9E57BFB0754900621E1D2A26FB6C3281C1936E0 EB8F676FE853789EBA4B6194247C7615153DD622A626C01A1A6B39F128E3402879D67CAB0B1DC5B129398ED4565646A5 00511C98DA8A64EED3E45996B66A2A0BB2873066ECB49E2802E4D56F872D448B6951583AC2A9FAAE2ED7B0E3910A30A1 0BBAD7FAAA76A5FCD86365C91C08BA8F6E5E310FE4F559CFC2BEB2ECA3FB7E9F2D582698D618D149443D1412433C9ACF F2E39F58EDEE83E70B9EA327C7133BC68EE1827AF0B604DD21B91836DE3F787942306A2857ED247AFD7578EEAAE6E206 872A63F382463417931F969EBC63BEE9C7505069396A5BA6A78001A10FB92F51CB512F86D8902B817A0248E58A592311 04D32A9CFEDA5388520D0F6768CB91F369B9364FA6E046231696AED256506909A0ECC873A00E181AA5963596F49DE101 038BBAC42F15522EA076A6F2D232F5FF8345EB2C24969E8C63B6F67620CD343F770CECDB6DDBFC5546A02622F3810CC7 E5C43E71A51540A4841E9481F5A4A0AAB89F26225EE34CAC64F8484B00F7D54B27ED1F1B08D2EE7B76DB310F80E70993 D3AF698C1A786A9B31E1F60ED4748E84DE297D8D83310ACE4FD0062FFC94FFADC092BAF3CF5B4ED27AB200AE75869F34 6AC14D3BACC026B5E2957D4C269CEC2146A1533168AECDB73079D2351797CAE9B70D5A8E6AE1A58B6A1AA9F2781AC0EC EE33EA7761B81C4C1DD439A9243F547E48F426138FAD7501B091BCCCFDC81309C6D831162F5A05B62D10F92AD30562CA 2D192EB513AB6346868370747A2CACB9D898EED7000FE6151EF3354A8889377941D43E9B3F3CC8393FBBD71109B6B149 6EFB8693DA6ACFE364DE137B54C6722FDBA3ECBB58353C2574FA98992D64EC6E500DC098057C06F8FED87A3235677E9C D6D02430DFAE5B12B61BB8686C33A10752E0573A8587AEF34A4518136AF01A073AC40F13C6032B99AFBBFEC6B59A0868 78AB4D6418FB72CD8D77927D08FC3CF15857A84327FFFF1AAC2AD75CFCB8ECEB962451F03C1E145FD4E2AB67BE6D6EEC 0D5EE752F29B15C23BFF199062AE90050C18E9462B1C5F996C7034D864D2119ACF2EED88D929536B15BB6BD536049CF7 B2F0C92C9494AF09F6D8DE41C6B3678D0EC7C9B79014F899F998B80F38AD8056DA85F27DB7878B0D8A36CE2C261C0C8F E99DCEC8D40C0ECC34E19750835E1E7979ADD205906272231086F74998B4A6742496848DD420B677700FB3CB8FDE8808 2EBF8002B983B4AE2A6E6231EF55A5F3F732C7D903AF8549C82DB398E83E3AD14299E574201BB16763D3269F544421D3 5B89792487CDCD4D0B1CD62B9F8351EF92F0D0436594A33DFA4BCEF78820D1EB1875CE451CA57F55838AC3C7EB3A1039 09AF1FA9DFB232127B182A051B9C111F5D82B5D3A179F289328C8DDC2CB0AD34AA97107B78DEB8B275F582DF3229DAEC EBFEA7F4FACE636A7E256517D9044C1B407329D5D0A7D34CC5F8DF728FF52AA3FF16DB57CE1F15CD1F8C80953145B086 7158CDD27471A17F39340FFBE27BDFB6304D3C97E24DC283A29E100326A6980B7A3968A6A2034FDBAFB27E4218C313A2 CC02A1A162019D466A2FF0309A29D32DA11A653A55C523661B3B9E90E24ECCA12A603C71CF2546BB6D6B341C8482C20B 56FF7AD8A8A656DDC9CFDF550B5B0F71630F30EC4BA32D8554BF581D09F9EEEE8F8A37DDBC4711FAE6E4E2360C8EF1FA 2902416C0578BB0E69B79BA54012F4EC4C2542D05CAD7106C241462BF68FFE99992816B1DB79D16F41D61F5DCAE49CF6 87A16C70A8565B222DAF5342B53AF7D57A85CCF910F0AE7338A660D17818A1F9B2511E5CFA7AB86591D920E0C23B794B 3C2D2AEE86F764B060DCB3796DA423EEB18D701E489B57694710B1BC63B93A3FF45A14FD2090EF847B266504A232A642 FE77304A8D4A401EDCC700D9B0565CB3FFF1DFB34FDD56AA683F1FEFE549C181B0C59D57370C301EC265D6DAF938B724 2EF0C72F97CCAF47AE7B29645D2BE64C7A16D7D05ACEEA26E03F175FCBD6954A5FAF48E74445333C904E469481A84901 770B50E88F90C06678B8A4B011ADD95B3632223996DC0560DD18810263BEB7F60E90D8FEB20309A1B880B6C36BE83286 55C4BDC50210430324DF1133C07AC2F0C38E4C7C0E5FBD41AB57D88AF146D3FF926743DD5AF41F0DE7DCD2003CEF103A 0173227179666DD0A84D84988721D8A897DD56B821C577AC3134B78B57337D5706C586111B19FF0A7975817D91C84519 47B5D24329B29F15B85D53EE1AB40A769652AA24C938530BCBBC0988C45F0817AE7CDA7AD66126965C72479EFF1CEC69 BF47BBB5744B9D98E314259E79735DDD62E099C0DFFD0EE0EDDE515DE39B80F28E17A57DA5B19EEDD3669576F555D4F0 CF040C9F9D5B04DC2EA078938276E8D5F8C69EC718F2D01800A8F737EDE7068F8C0137BC08AA41AE298D0395281B541B A81F1D96E88EE1486F6D0A47EABC13C6DF2D6F68E573D9A6015D57C5F0C600E3A4DCF3BD45F7B8F6C902363C57AFEE09 56F0BE0314BC59001DC5317FA191CF6634CB80A6096A0415E72286D28237B63459BEA54581387962B1D4250D173C9DB7 635F6ACE09427E0CA6271EBB6BB7FE35D6A744AA1B3F5FBEA0A02A2696FE4ABD739AE7F0E817629BE25DFA03AF50C65A D2455746861C45C40418A9D90BB23493541A8BBB9245ED107A2FE652F2420A0A41DD55167357B769345F018EC875621B 5FD0F19DD4DDF248E3ABF7C577A971B214CA53057BA6310B97F620F889B9153ABA23FCA9CC826246264BF095B9BAAFDD C35ECCAD6F214FBC7E5820333C13542A62FC1754E2F9525CC2FD12D7F874FB08AD666D1989B9400DF3980F4AC5C4F4F6 4323D939E5A78807D40BAB56DB564A712FD06E8C741B173C39ECC99F7823A6F597AFC42E994A7A6D0EB36BEE41A7D3E8 1CC7CCE9DC65529319EF2FB60E047DF312746DA21D32E32F10DCE0B49EFEC07038A8EDE860374DB20F8348641840EACE F9127AC98EF3F84C38AFB7A4038FDBC7BD2B8E2B15031BB4A9A8B68057354830A5BCC4BD2EF9DF087CB0C6E4E6A86E35 347C5D741AC4B915580FFFE987D0D2D5C2E98DCBFB72B8B9FEACEBEE66BDBFDF75C476DE99574D5656C5FC51792A8670 2F8A65466A62756919F359263D96AA3FC6C4FD3446308B5F89E362CAC95CA04184E5809DB96A341C28C63DAAC6851627 85C290DED743B902843D9E8F6BBB0902CDD8C3327E92B7F8F2D697AA5A4EEA8CED8A914D2276C8A6CFA3D9082B337041 BFEA8812E6CDF538127ECABE8616B7ECF21EF675AFF7C24B9712E9E54899992925C629E3922E0F193D025D40DAE4F524 8707F6BD29B2FB42E8E797CA38CE4D09C76F9EA5CDFD56A9522AE6045D42859A5739EB5393CAF17F9745182F35ADFD7B C254131DC005911637E81F2342B186C324900AE497F30FF8145E3738E5A7DB0B075EFC1D7A2A416B46B25E7FB3345ECB B7AF85286B66FFC56890BC6746ABEF05F5C2AD61D89D5D22E8AD701E1C2EFA3A5968F7C2C9A3BEF7E0224470A64A0D9F 9EE7DDE40232C8F0D75207EA38E8AA576AE75936D3DD620FC2DB2A31AB6D790DC07FC00AD107F2C35ECEA65DE126D771 95150BEAFC4B11E0F094317B657C7F6F9C0401AE14BB1C5A42EE5DC80F1AA77BFEEF08A104475D7124BBD858F369BBA9 FEA19A57CFD0FC5B486114F46112461A3CF3BB70532CDA169303961806090B2D3DFD7F0572EAF1F0F280CF6237D38DEE F0BB03DF19A4CF2E9E868628AF054A575D657BE788E8722C33D008109E13F238240E8D0ACE64A5BD4BF2610E3CD71656 066EC53A6E0233780FDB4EA493874B2C6D5BB3B4EA2F0A56E84253A4FE7122C93225599795BA41621314CEE3ED41414E 1310327484CD29A8D8F6940A4561E9E731AD6C92B67207B418AC15F00B6B021D0B0BDF294F000173E012A29992310B82 EA393C36A69CF874D1AD6A3B54C9B5F4391465CF8A536B0D80C9666EB05F86CA68742C6D9ECADE9FE97F51A47381BBB3 D0499861D73FC2A93E49E0333CFAB3CF46D704CE3082CFBB7BE3EEC20AA2209D12ED4CFFF6D9A078BA914746ED093A91 712B8C203330FF74371758657723EF010C832BB6E65DE5E596B46BAB3B0275BCEFEEA6785E2B43B73BAE6EACEE39EA47 DB4076DD800D02CEF10050CB4FC41E8D816F886D38787D68C63DC56D3EA87626E61DD85ADBB6C49C32278F2C2B9E7D2D 21A26037D8A161742525362250ABCB1A5BC5FF6DDC31F88AB616D61937FB5CD8484C167DFBB37B7A4A58E88937D2A162 8F167D85C544227D7D739FD06EAB5922D6CFDEC94BDEF59A702FFCEAEFCF64AB6B83A91BEF6817D46133690391655E44 6AE98B37949BB97C5380FB71B6A2D33F1232218A5DBFD3B7A798B9A3A5A207D2AFC638D707539BE3078FDE405154DD53 6CD4DDB9619C513493D9B48D40E1C81A6FA2A4AAACE506510A1C045699862B589434ABD0E36CBDD3C6D4BFD54C1358D0 0B5BE7AD471F402674F96F5A439E72985384F166CC7B8E68CCA282C8489F1F42FC3C95A81C14165B449BDFEAB8615FAC 5B32228DB0E783DC51F76D668D1627F62592A798CCB660A80F92B3956C85E21366FAC64526832C6D80BF0D9F8B3DBB75 4BC2EF4C46110F4ACFAA233612794B5648B563BCCE90C711A79679D4671455A6915D8F988CA42D6FB97065C261504234 A20E8C3823B329D6CC0B185FC1B6DF1222C8DEC2ED9412FDCD3B201853830413B46123196DE0D3F61C77EDE81D698775 0E9CF1BC60AB316D3F651F8D28C913A0308E285B022140B6F27B193AA0FBA8B34EACF97E499049858CAD3A6D3A007611 5A6B07668AA7EB552E5AAB6BA6EC21FF5013779F871E753AB0BB89428A16AB10E32EC0289F1757900449BBA7EDD21AE6 C11079E4B34705516837307DB8AC9CD8C7F67AC150B722B0DD4480912DD23CD9C3E697EA13C4D16D537657DE842DE3E0 146BBECDA46E640D666F7B05EAD8DEDA4A22996596290A1C922F0A05C8A82F2CA3502FEE8046365C433500A197C67D24 3EB029D88F6649C2FF13D5B77E33F72FEB2D3C62959137D67CB1CCDA2A0DE53724AD69B466820C0145BC83928E28CFC0 22133C28A6F80839F0C7FB7B8DAEE58E9BA82506DC269713E0A134DDBA7E6555A26533244D9C5420BAF10CE21B2D7FA4 DE9580789FE00FE12FBC99B8CC63CD3BB1864DCF4A48A0BCAA9701BA3958A84BBA43C5F885BCD70AB8642CFC4B623F0A F00C9BAE46A46D5DF5D32F1B7F2A0C2F4C363E7256D18948A1809DAD1A33B4B241E3D1A74ABBC9CA2D2D8CABCB2997FE 205B90C2383375288227B0739F0C4B01F5BBAEDA206B673866086A2EB8197A5BFCD4C847028E8871771B498A1B603CF6 ADF1A6D525C70A359EFA4F29EF52D50C7155E66FE8D04F575EB00CBF2D3F36BF4CD1F848C413A0284813B298DD1D7E76 F62A3A2B5BD21F9491D5DC2B740EA15D1EC957CBDC99C8E610006C5A8AAE03F300E1057ADD539F4534C5C5D304F07EAC 09A88BA9DBCBE4F2601164A12FE3072698DA29793E9F0B05E76D1C9A6F541F900DDDF179AC15DD952873E1624D2B4A4C 0A519EE740C423C6D365F75317F9967CC9D040CBFE4061EEA45F2284642A73F16D15A5469ACF8960FBFC6B947B5C91DF 2376C3BCCB41DEB453939E4356947544C482B8FEA912C53D9E4C60B8D6D934E7E31C006C37F15D1EC75E4797308C5E0E A9C1DF3B96EF259D075FB02EF363DA0BECE90C0562B45824DE08C81AD59E15785F7C0348A03531E0D7DFDE2AF8D25965 6EEE012771F314CB3AE69B11AE499482703C7B646D64C9348FD17D41F78325CA190CBBA666F21C3440DBCB8E3E41F142 1C8D2D7CE4EB4862412759CC252044D2CDBC2C4A148770217A0A4F212500AD45F67A5D7692B70D11328ED1E3EB23849E D840875FB7DDB296BBAC85AB72E0962FA572E7A8AC6A0386929F3103755BD9F34E6894F14940BA57356F5E87875B0FD2 EA2196B71408E17D59F8ECF8FCAE4AD4FCEEB8E76FDF1E4DAF69BF3F8B06F1040340B10E82332F8008C44F155FE50B0B 183BFCE1C9FA3ABB56C89938FACB8EA155AFB3B04548DD9F8B1326924A4E0DADC66258C4934B7C432BCD0CCC8B324C7C DEF9012DFA33BCAB30862D8E8C7FD2ED301F486957020C16B8DBA09D434C2F1D5ED0C49B0645048CA680EFEDEC68B91C 95EFC911060587E540E2DF5C5F2C765D806915BC9EA735C8A545D6975A18D4868D2B50794E55AFBEAB24DA10C58128BB 84FEBE03B616E9F7890B750EBE82E6DF06DADB7ACAAEAABF9C1076EFCEED18CCA0CB6F8A5D406F6238FCEAC2650E48B2 6DFE724481262665DDEB176D65D96A52E41FFBE8D982D4760CEE627C184F4A7D8755D663E6755E2CA0086B8D2146CDD8 50CFD94562CF6B871913DD0C9EB9D9BB7FD20743D7AC9C4F6CD5629A56E0ADEBDD0917DBB4D673477C354B26C71E4553 E897AEC62BB70D1ADBD47F145F289E5F086BB02D2ECA9F434B7E114E13BF9FC57963A12AFA6A93FE5D22F5D417B1C85A 7B32E3B41DB1A398A60B6F19874C8BD3AA8B189747424F80BC38AF6F500C0522BE5925292AB091D5F1A6BBE4002D4AF7 5A1369EB48E32EA2E3CF107BCD9DED860484B628EDE59A6EBF07B2A7AEBB3D625C7A4F3EE5D04B939EBFB2831EE3681C DC60A620E45214B209C5AC943F10FFBED723F0E32DA5C3282CB1D8B55CA37FCC6AE267ED872EEB2F458F5E1330CD8588 D56F5D849A34A76E3E3E3BC2577FC623B79AC3A21B9801301FCA73265F3DC0E36911976BB5D02E011802288BCC3FC09C 6DDE2DBEF7779FE129CB9AF3AFD441A89D2718161C292A2684C07A8B48802611AC71363D101386D7DC63131C67887566 2132FBC1E8804C58FE1EA7C8477E64333F8171C891F5BA80A32ADED37D995E5002A8191FDA622B4717F9A8AAD8901922 8C108FABC13F43D1FC89A8E5FCA087CEE59B20F6941263FCF5E53E18D84A4405FAB912D6998A3F0BB5CB81020D1DEB22 E71D8B1081244C8DA189F3ABBEE787537F47386A45E5EBC96106467E4A13A2228B7BB42E4303663D7E465F531F880C80 FB5A8CE71B55E7FD8DB1FD0D957157460D29BEDCB4CA221F7498871C85BE9F7EC9EABB39A72D11342EFF1284E12BEBE1 99D919BC0E7166CDF19E2133139B339F50308E747A7D113B571EFC6BA2CE055437F09BF3DA15E61F62F1E84DC0324C84 77D6DA13453CDC11B0BF9553E082DF3A38397FA3749BAFA29E117858C397BD138748D0F9854A8E0173EC29283823D7ED A7DFBAFFEF3976CE50648B6B60F2E0C8DA89E044F27DA8FCADFFBE8E4F563FC1D57029AEE2AF02FAC653DD7FDD00675B 3036E1302CE9EB25EB79E01B3B4579768FDBF1784C34ADBC9DB6F6C448DBD758E074E5B3BDA50C14E350048046C0F85E 698D703E8DDEE9EA78A57AB5064ECBE2BE595E2FCCEA7FD5299AF0029C4D57464EC37B024746E35621719AEE4353A775 3C31A4B624853641BB167FC6E31BD983897F03426D46450DD05073EFEC6C778353C94B54157B3DDC2E65E6E1569E0223 72458E3341CEFFAFE0BD38B2283307C728F03D8FE75B3979EB1EC42D7992D5D2FD23366643C470B6627BB75B97AB25DB C4C05BF80052DA4F4ABBC54134EDECF8D9E8F72779ACC2437CB1520DEBE0DA2FDC07A5D49B4CD1D627ECAC0312FF3005 56F559C1D3B195B03A1DD608679B8E94D8FE9A0A6495833C5B7A310893BB4C8ED3D2A1763E75D787B47F9585EFC94400 BA6F64E304BFBD6B1C3B39577D4164A389C1A809B9081B31042565F2E3962E04B62FF2BC2A13CF6B7A532CB300479063 ED73E5FE981E0BECEDA9DEC43B0A196708C0B7FECDB06FA34AE4FADB001103D781AB33EFF2EB2DE0D3A186E774A26B7E 71E24D9B56787B7CED7B62C586306503A6DA7C1D2F06A5DF1E25CC81C0A3046C3EA712D747E3589A64B68CEAC8A8C821 B5CFE6231B4D14ED8B8A4CE0EC4410C57CEAB37F29BEA7C05B3E6EC3F2C7538F0943F32341369298C535C6C0AFBB97D3 45C4519D32FE039A984F041E6A03467C2DF12F8555F43E9C447CB06C7EE95A3BED9314ACBE49391382CE4857ACCA35AE B4E7ED7FF952A33F8847982A1EEA2073428095FB3C4572CC57CE223D71F4CC19BD4A3207022155D78698CB8B509A9648 7CAA659D96D771B3205A20FBF6D80BEF76146F82A02904B4CE76FA599CEB8C0C863267079FBF8FF9E35071C7E9A37943 F7A0BF303DCCD6B5046D6192E7838C5F1D87EC18A31617B3EA330E2EF7FD604F6694A25DC1F24356E86708ACB47F35DC B27088204DA53F5B62EF2351A4F063E622E68F56152FD035D27254BA673B2356EE0B81EEAA17021564FFE0BE5CCB40CC C6BBF3F95E7E46C3292E46FBC79509D72D146AA12D75A7265C48B35C6CA1835105B9762214D3F3773EC567345C1E066B 690CAA39BA47A9E6D0DAEF784FAA4C47CB018DB31892BB1F443AFFA87B23AF2D01AE71FB54AF349FCFD493C427303FD5 1648F3A6767064EA4E5F461EFA5498F802D18C1F42EE0BFAFB572781185FF790778D73E1F6CF32D2D81519B2152700FC 2E14285A587090615BF57B88DCC5C77B90D72E8690C67E0A773D25FF9A1CF1F5BD50E1652B0C0947F1E78C09BE726641 D963029C63A22FF6712A0F9374AE78062F23C0AFD5A5CD128C1F4727BF7B874B47EF36C820DB59AB6BA66A4D18AECAB7 8CB2AAAC86E3F308EAF3351675F3C6A4DBF0DD896EA4408665DD3662FFE1451454B1A8B3E00B97E415D95300FA82945E AF75BBFA28F172D46B6B94412EFCC827064FB4B960F74B77D90FAFAF8D3FA5A5F94D9E1FE92E550C4ABDDFEE56408F51 8B12E4BA993C347C4B20599FB85D5B111A0867A66E1AE42EBDAB7969E176E6307456D8D6074283A465C36117907D3020 8851F7C13AAEC2638E823C77E8C7836F903EC09983B96A36F4664A3DE943EC04DB1CA9B59C9AD4C738ED052FDC3C28A3 FAEEAB0064C5277B9726AEECF36DDB77A122ADAE06D200212DFBD09A9C90B11B4787B4311DAFE1F4FBD9DA8D6E356FAF 622C54EDB989461900459AAC77B4497B0E6622D1EE92C1F054005D18E23B083FAE5AFEF034836D595EF3DECC07116A05 B5D654185FEAE3FE09B5D8A6FEFA3CF4F37DB8C7D3BD389A1862250431D753B04433CC885087402358CBCF073745F2B2 DFACCB559298210ACAAD99B3434B25A29C4A76C80E616F3AA95EF138DA57528CDED3708C975B8D8BD683F748726AEAB2 5128CE41BE8444FF2445114954CB2145747ABAA1D17359FBF56A14D6456EB85755DEF38A5E899E6D55B2B973D182F6AC 8E0713EDF523C97EAAFFA726E1A5BB35C489BFC63EE2F9E022D6B00A4EB10F62E6C2F732739BE417A0F090DF7E0BD467 6C4156B5092BB8F7132A7E0797EC8969FE92B7FE8DFA75F4AD2A3DBCAC577FD51F853BF709D5C97D51016C30917009C2 A53DC3C3F14A86CA295A20A6F580011A187C2107993E2B8CE2CE82079988624D25AC03F64C2E0A3CE53596F655979455 0B9D7A8301E313918637D83E173545764E0A305A179035288039297B4D925CEE6528DAD0266D6741AD13A42797AEB4AB E271DEE6910439B6FF91790F8EC178BE25810FE125B542BA38706EF0BA67413248CE791011404B62D5279979F50DBC6D 3A355F04D967F902F2FC48AD24ABB282211EF5626385A4D6EDF0B9A1D01A50918DC2D9FE3994A3728621FF39ACF06473 6504C85E257F09EE66DF30D7820F37C88F74D3E92A1E7A952A8AB35104B213270E4BB61BA88D580415AAAF74CB5BAE4B 49D51DFFAFB088C6B6A84668343B9FEC7557A94233109BC7C8D103DB92052B5BAA320A4AAAF63ADC4953D067CC438666 AF47BC6765E9299BCFFB38BCB81E67918257F082AE2BDE83E736724A3082007DE8AE7DE33B21F67B9C7F5DDD6AFFD274 1BDB094EA9054FCA9C1EB8189548F41E273F5D65DF78688242582665D2D1108191B321E966325BC5C77CAEBC9055813F 58F9C7C0DAD0B77B3CC101BBAFE8AFA456D2467E7286A10CC97191FAE03048CDDE9470CC5152071E9BE4DEFE313E3284 D5ED43368F3CDC4ED06635BF688EDC987F0105C350292BABF08C53084F57D3E9F583461AB0B92B85372AE6759B3934A3 1E37B7CF67C57B1015139054CC2F434E0E6131B34371CBED1ACF773C050F095A2334D1DDEF615A3719F437A6ADE724C0 3F40A86FD7DEFCB4349A6E4C194D2B7C30A7DCF61A899B34DF69F5A882A8E7C809F5A92151A58D8012A3D35C81DDC68F 230611CC01E590E90D9CAD2FE8CCE0DDC01D216230D3A5F27343275DBCF6546D89290B01126C81A452B5E7AADF315E9E 62A80257B0CF5D07B02C711B0608188DF5DB19AAE90EF7223D3CC291B7F42F05881C03E9BB445ACA090802A452BE78EF 365145CAE2C19FEACC1F6D932DCCAC9AE5E531299A1D8BA1D1BF3B729E038F6AAB04E7EBBDAD9076BB377729E06F75F0 ED136646198B314CAC7EDDA62928C4F55FB60C80D04FB3ED6E1EA300FCF498444ABC97142F487898DC5A4AE7A139B046 86A5007EFDD8AD42F1B0E24465393EF0ACE315BB69DE71B7A82D7A27ED9B747E26125E600313A8EF2F540CD017C1C113 94F5589D82936D34B36AF8AC28F8EF02A3FECF092AECF25AFE13 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %!FontType3-1.0: HiraKakuProN-W3 19 dict dup begin /FontType 3 def /FontMatrix matrix def /FontBBox {0 0 0 0} readonly def /PaintType 0 def /StrokeWidth 0 def /BuildGlyph{save 3 1 roll 1 index dup begin /ShowProc get 3 1 roll 1 index /CharProcs get exch get exec 7 -1 roll exec end restore } bind def /BuildChar{1 index /Encoding get exch get 1 index /BuildGlyph get exec} bind def /$SP{3 -1 roll dup /SetupSubFont get exec dup setfont exch 0 0 2 index stringwidth } bind def /$SPW{4 -1 roll dup /SetupSubFont get exec dup setfont 3 1 roll 0 0 0 4 2 roll} bind def /$SPTW{5 -1 roll dup /SetupSubFont get exec dup setfont 4 1 roll neg 0 3 -1 roll 0} bind def /$RP{6 -1 roll dup /SetupSubFont get exec dup setfont 5 1 roll translate -90 rotate 0 0 0 4 2 roll} bind def /SetupSubFont{dup /PaintType get 1 index /StrokeWidth get 3 -1 roll /$SubFontArray get 4 1 roll 3 index 3 index get dup /PaintType known{dup /PaintType get}{0}ifelse 1 index /StrokeWidth known{1 index /StrokeWidth get}{0}ifelse 3 index ne exch 4 index ne or {dup length 2 add dict begin {1 index /FID eq {pop pop}{def}ifelse}forall /StrokeWidth exch def /PaintType exch def currentdict end dup /CIDFontName known {/Anonymous exch /CIDFont defineresource}{/Anonymous exch definefont}ifelse dup 4 1 roll put }{ pop pop pop get}ifelse } bind def /ShowProc{systemdict /rectfill known {0 setcachelimit}if 6 -1 roll dup /FontMatrix get exch /FontBBox get aload pop 4 index transform 4 2 roll 5 -1 roll transform 4 2 roll setcachedevice moveto dup type /stringtype eq {show}{glyphshow} ifelse } bind def /FontInfo 4 dict dup begin /Registry (Adobe/) def /Ordering (Japan1/) def /Supplement 6 def end readonly def /FontName /HiraKakuProN-W3 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /uni672C.3722 put dup 34 /uni5BB6.1352 put dup 35 /uni0047.40 put dup 36 /uni0043.36 put dup 37 /uni0020.1 put dup 38 /uni0072.83 put dup 39 /uni0065.70 put dup 40 /uni0070.81 put dup 41 /uni006F.80 put dup 42 /uni0073.84 put dup 43 /uni0069.74 put dup 44 /uni0074.85 put dup 45 /uni0079.90 put dup 46 /uni0062.67 put dup 47 /uni0034.21 put dup 48 /uni002E.15 put dup 49 /uni0033.20 put dup 50 /uni0035.22 put dup 51 /uni0030.17 put dup 52 /uni0036.23 put dup 53 /uni0063.68 put dup 54 /uni0061.66 put dup 55 /uni0075.86 put dup 56 /uni0068.73 put readonly def /$SubFontArray [/AAAAAB+HiraKakuProN-W3 findfont /AAAAAC+HiraKakuProN-W3 findfont /AAAAAD+HiraKakuProN-W3 findfont ] def /CharProcs 26 dict dup /uniFFFD.0 {(\000) 0 $SP} 2 index /.notdef 2 index put put dup /uni0020.1 {(\000) 2 $SP} put dup /uni002E.15 {(\001) 2 $SP} put dup /uni0030.17 {(\002) 2 $SP} put dup /uni0033.20 {(\003) 2 $SP} put dup /uni0034.21 {(\004) 2 $SP} put dup /uni0035.22 {(\005) 2 $SP} put dup /uni0036.23 {(\006) 2 $SP} put dup /uni0043.36 {(\007) 2 $SP} put dup /uni0047.40 {(\010) 2 $SP} put dup /uni0061.66 {(\011) 2 $SP} put dup /uni0062.67 {(\012) 2 $SP} put dup /uni0063.68 {(\013) 2 $SP} put dup /uni0065.70 {(\014) 2 $SP} put dup /uni0068.73 {(\015) 2 $SP} put dup /uni0069.74 {(\016) 2 $SP} put dup /uni006F.80 {(\017) 2 $SP} put dup /uni0070.81 {(\020) 2 $SP} put dup /uni0072.83 {(\021) 2 $SP} put dup /uni0073.84 {(\022) 2 $SP} put dup /uni0074.85 {(\023) 2 $SP} put dup /uni0075.86 {(\024) 2 $SP} put dup /uni0079.90 {(\025) 2 $SP} put dup /uni5BB6.1352 {(\000) 1 $SP} put dup /uni672C.3722 {(\001) 1 $SP} put def end dup /FontName get exch definefont pop %RBIEndFontSubset +%!FontType1-1.0: AAAAAB+HiraKakuProN-W3 001.003 %%CreationDate: 11/20/11 % Copyright �2003 Apple Computer, Inc. and its licensors, all rights reserved. 11 dict begin /FontInfo 9 dict dup begin /version (001.003) readonly def /FullName (HiraKakuProN-W3) readonly def /Weight (SnapShot) readonly def /isFixedPitch false def /UnderlinePosition -60 def /UnderlineThickness 63 def end readonly def /FontName /AAAAAB+HiraKakuProN-W3 def /PaintType 0 def /FontType 1 def /FontMatrix [0.0010 0 0 0.0010 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for readonly def /FontBBox {-386 -373 1232 1266} readonly def currentdict end currentfile eexec D9D66F633B846A989B9974B0179FC6CC4458BB4CB99E3608702C78822367AAF89059868F63F93207640A6BD5DA214789 139C491E02A37BF3866F2964E8D690D48D9F6C4A5EC22355F8123573812483E06B968AE84B5F20A982A0E65764753516 97AB8C6EA040355C5542F297D7A3AF28AB93EA0771E0D56DBF00F7CA9CE9FB9FC2E0ECB00D04D5F5F3F24B987B546D62 74971A477DEE12C44623C180BCDBA21172627610C4736632D1A4693E79719C3BC43DF5330790A52DCD4CF455ACC213F6 B1C4BA249179DB360225568161552A16682E3A3604BFC39D571B1F8F18375BEF1B05D6DE4413DDBDB2D936EF6A197BC8 7EF3384DF04E6025A3A7EFFF451D52E96886EE4B4169EC3DEEE64932AF4AECA3AAB81853B58042BA51BAD1CF1FE64675 4A29D2100BBA83E7F6E2F5DFB112F838CA7F659DA7A6373BB1B86BF204DA715F2942AD8690FB1C37539822AE991DF19E AFFBD3E70C395C40FA19CBA66F6F776EC20B6398A64B19208F0E64419A3F9DB393F17B6A206EFAE3B72BBB97405C4CB8 2801FFF79A60CA475287D576B5FAE301357949AC6E4F6EF1B8E41EC8819429C31C995A8D02C6F93131B3C3FD0563C5B2 C561EF5E734C7AC2E2F882889F4D04700D54FF4ABFEB4AC7C99214F399F62A2920477FEA7111FBD7B5EC77864EA25A03 88721F3165F5B0867D1C7C29DFA0394F00B032672FD41DA7C59FA55B9E3AF89B81799A0B27F1420BA48F9FA3B4693FDB 053C26BACF8A048849E5C5B195ED71C79113DD547B1468FEEC4C124788537CF90C3E1DB8793BD8E61BC72DD310B89670 021372EA4C700AD16A855D0917C5F105706F3206540AEBA75926DC784B77FAA8F2459B9A468E2A06318839FA8C08FA7A 8241BE54D435D7E1CE8BB877839B32897C38ECC3B2B63BFD6083CBD67A33FDFC81F548A162333DCE29E28232431AF514 37794B82CDAA0282850FBBCB8A0A9CAE35CC3991AA9FBE225251C0E9E3F59F39EC952D556BEDE7BA8BA8BCA5546B665B 2481E6F4EE3929FE02EFB2402EFDBD1FAC1C72B9CFCFE391E0291A712286845FD31A23988776578437DD63EE0C3ED76E A391B35D2355FED30B1FD068D708EA45C4BE46C0F907CAB826ECAA27734D9723CF21C18BB7B30819E095E25833FB53FA 83710AC4E86D305F2EE40138D4BECB08688944C0D68C62E39899104AD6E587EC0F3FC097CE79F16A2C519A3B4ADA4712 EFAA7D9C7A17BC5023789142657BA7D164124537929053C2A7A0D2E8E4E63CFA5179983FDCC84769897719FB24472CCA 9EA1577B22B8B29703CCC51B7A254194DD86210204BEB444EA4A0D95A73FDBE953C0BDD8ED9074555027E745D457D989 412029757A42BCAA87154D3479D568532C656227DECD1A94699177522FB013228446DE961EDC5C6CDBF3CD69FA2B5F7E 2137C9DE65C2B6327032847044CCA017F9B2E8177A4A4B6D7DDBAC578CC2E98EB131C49BE0E818CF78C8DD2B562D74A1 A9CEEEF49606115A53F15F15D080A3ABB6D990CFEA9C58779C7E388C90BF6C7C1ADCA733C293E821F528A8A25B16CEFF 39B103A0000382CE00343EB20473864E5EE271B9F16B48543620B37B95B5C016B6BDF34B868DAE1E3581207508587E0D 44760E91C5E8183D629898CD1FD0E1D2798E7DDBF7A2997AD582AB85DCF50C2301E775AC7AD675A059D273D13E77A7EA 38DA6F3B16DDF2087940136B83C511845E6A91B8D2B8E3D892958966D1E22B2BC977734ECA36565C4A0FD0DE93F30256 40B66827F52733B55B565D4C60B8A3A5AF5EA3F5DDE6901C913366D3952F3FBD1B3FA9E4DE1474E006280D61EF34D830 490F88722027E57AD7F3FAA60FF2172B435493B0B726C9BFFB996459F29609633507AF1DA7A9F84094F7C61B0EEBA767 0540DA3ABAE2EE2C565DC4B7A061BE2B5375121676FDE5B0C37B9D922C0CEF05056E77E641B66DEEDE17E1C6714DC4A7 B16764EA5D4C7331DE2B1472FC3E610FB03B5842F4B7D9D268CF3204EEE860B1B96EB272DF663849EC387B8135065F48 4863D2C1263604ECBA3F3BF4344916C70485FA8B9E61C9F6A83C70EDBBB3E3F5A63B0C9BBAE3A3B457D94E5669B60812 E2B88E0A767E549573484C03CD45364AA230827B160318E25F95D8ADBD664C1DE213CDC3454775A09DA3858AC9622DB9 4A66012A14588548B12011E64B1CAB38834EEA24AA78C7FDA24690D53CE063EF666119954BD289925D2667AB00834FD4 1EC048E6ADAFC36FE8971B9A3B776906C22414478E6D4731FD1125256E30E2ECEB7600643ADFB27EED6B7040DEEF0580 ABAF22E011D407D171ED48A915140FE722E3DDFE39AFB34043406803C8C0CD5D729243F2450E9F7AE57A85910D0C304A 290941ED125758860B66D4CA4E00F1F6BABC431CD4B2E2C0B9C2DADE8EAD2BB86D96EA93D125497F487C77BC15BA284A 04A55EE8DA4D52C365D845AD7D66672664B1B6D113376C4136E18A77579176C5BAEF5D063127ACEB217340F93AC314FE 151AC07E75980038953DE1ADBFF288C3C0CE5974F5ABCEC9B7780CA3A7949C232DCF7C36331A48DF504C45E69BE408DD D4DFAB2CE40717D026086DCD1097B8D79157EC780F6EE40798794591698E8894B0229F5541131FFC3777DA24ED84FA84 EA3C49B49D8B8168764BE94AD9CD73303A9C02C4B30273D995D77E093F9B20716ED7A8D1882A8A3ACE81154B739FDEC7 D3E560D8733BFD7A7FC51BDD337587FB4471C0E735DA3A11DE1CE7510EC7000A78EB103DD08B79D3CDC791077780EECA 983D71377D598198DF0A02F9315A92A1708B997FE3FE467B06970D58C676D1AE871F2A3AAF6E85BD087A77A92918B0AB D6DC855C54CF7A69CF96D20B74AD321DCC3B7018A7444D4F2A193451672F3A720DA457D38F60B5775C157059CC76938A 5E396C70D7FA75E105636F9F2C27F5FAC0A0DE4AC709899A15B85D546B0D6020B509DBADC91624359D5B74575D67408A 0B9D67AD007066510B5D0D1B0EC5244C1AEF02E521DA2BF5ED41CACA27127A53415F188264B610C4C837720CF95B8E78 D7B36D0C3E86CC7CEC6ACF71575B9D28BC7155C67B45CEC4DCB47D8474A1ABFC1CD4A284109F175FABC93B3020C61D0E 31C976A6D252B773FB84F044052F027ACCE86453F830BA312657154C8C25AF0D965497C02E9CD04B3BC66E08E942AC45 1D0ABC63A739E527D5ACDBFC52C6357FC7A5FD91740DB7584C3C12B1F5BEF9A0A44B5DB530603FF7F1696ADE05102600 5919B9E0923BA37B60C7611E7EF96DEAA7552F8B28AD9DD5C3A2A45D37BC3026CBFFC6429C69CB444D4C460BF6F7B15E E6523F1768568E1357DBF96488F4CDF3D9633C8CC2B3732B05A338622C30DAD2966CFF5B3EFCE688EFE2A0AE6040ADD3 567E90A16026A42A2EF287CF3D8ABA5A6E6E251938B96BC6D38EE53F70163447DFB2EFB45D5E609E135AFB66185BB12C E5950CEBFF13E5DB2848616FB0D5277EC40B2C41FA40D086E8164884A49BFB03BAE3E66B099DF735697986BBAEEA8856 2B9730476EE58E06138502D055A88DDE2CE4E944771E1B9D34A739A87A2EA404CFEC8FF65824E74D954EF758DFB4AEBB 875810571F2A6A6F75608E7B52682225EEEF094340B12E03718CACA3E6D5FAE9BBBFCA7FFD14DCFF08A057F4E379D622 A338012DE2C834A83767864DB7C9823DC75AAA381B068E57A6A4FF9773C2183470F1FB20122DBEE76D826337E5D01DDB 295036CE9D5852B3BE4E0CADC66E42B16305CB7368EF293F42E80AEDB791C6E9BD45933A9A2F17FD60E551E1548C1AEF 6B36A262D82C1ABA3C7F6C51DB913E16D8795640B2FC7ADBE003B48B62E096011398F387E77585064C481BDFCA7C47B9 CA1A3B755CEC4A0596120A4E75119FC14B8A6C13E93694D2C319653A413B8E4CBB1A55E7BC555911F2D31678D4A5DF56 8DC4218AD6573BA07D46160134286FCB4C1F803E07723552D7C854CFBC3597DE9BF1B9930B6997AB2E9D384934BD1730 BACB9586D46B81022DF89010B65E3DFBF7178C543A46BFE5CF6B6E3D2A5C74ADFEF13F131FA05AE05251FCF217F92769 26F6E5FBEA94F40F1F9910DC865321A0495A8CBB5487BB2E96CD075E3CD99EF552ECF67C331CDC1CAECA526DBBB3314B 6C8FCFE65278A70C484356867A41DA7D0C0CFCCFBC09DDE65C81D980190E539A67D8D4F02DCC8D9936CBCB796D84C8ED 7A0F35F4E73D5210A625ACB7860AD39B09F4609C1D9FDF1056D9CBA5BBB371A674045316DC6D97B4E3EBA6732EE42A5E CBDD20F8C7DC6B8EAD36AD7931D33445B38B78BF4714466CB9EFDF75F9E88622610759ABDCD6DDF314B21D5ADB663BF0 2B232EC7BE6AAFBF0E60A734037477B8E6F7FFC1290E89E251FBB5F91EF78AC3B71DBE01A7E8F0F8BCB6E62F50E3A415 8803FD7CCD69F45F274EBD2843E77369A66750D7E5C82F42AEE451D6F81E3BF18D2EF5D4A8F7BBC43D5DA3FC1EC142E8 8EFC114D9FD3E758A217D3088B31417DCC3E6658C97BBAF1C35327F1FAAD78512CEE74AE6B4E1863DBB552CCA429AA2C A39563E8FB771E2493F6340014AA43972720FB7449D1569C8EF84EA788CB9FF7B106DFA7C57A4918534F8ABE0DA68652 25D8524B0D74FD65C5981AD546696209E82579650251CA16599FC06D15C79EEC51B71E35D070C5069319943C92B6E25A 96C50995E3D26548716BDF002B6BE74EC140AC12454D62419B00F312C979E0879AB5966CDFD1A4FBFCB7C1057C4D2C01 A6B78DDEF4C368F9DE27AAD7CE33C3DB1BE034122F8E4C7BA559A394E19E1DCA4E55CADA86B0820D2F49AA88C81F0E23 194CF929CF4F3ADC4C89E3FD4900E5D694B0E81A4174F9F8E279FC45B790119811992A209263BE9BEB655592DE9E8132 6E7D45345377E356A7BA1BDF524257EAB9E61752B685890BC824AFA834605712AFE431180E9C87F09A87A1F490A9C64A 7EF8232E3685EA6DE55F4586202D727D15B0AD4ECF9337802641B344E45635D344E82AAB61E083B8DF276C80E82E9960 E00EADE00DA94EF49F30327FD659B8A60318720E9A0BAB66DF457A0191D864A080C99D75BADF49DFC668094A600E561E CF3FE3B0BC981831D569CDBDCE3E7819FC4A706848C2B52097988C0EEF4B0C1CA1B58CF82D3BE14349C5CC7E934B1E0B BA3B8D0C93C9C14E11101DEE66576FA53F7B910EBEB05C26C6BB539FEA91E9FC72B2B25E3BF532A709A4AF8E4609752F 495FDAB446FE4D04629BFCD1C961A52C913E1EAA315C7C4FB8A6C692A16FE0D08B2959FA9B31D3270701B9D050D8B2E9 8350D7416F89404CA56AAF343F1E037873E86B71E6ED894A14A9C8C70A41D6ACAB8236CD51362340C02EDC49996A9530 65999DB2E09F06376F27791E4DA56AE2AE9152B606301BE973621C0F358E3100E07C3ADD21A8EDE860477BFA33A4DB6D 45E8A1D657109D6074FDBB986F3D7CD9F61A0C313A424AFE26359E69848876E1C69D9A76D11A4D20289C2D788B469FF2 850FB4CF98FB96B14347FE1E9C195AC54203021A7E8803AE91C6AA6E4946010582040D6ED65E940D3B8BA5F4FF2BF2CF 35EC93026AD01B6D1C9C3BD77FE4284D1825A0DBD180AFF5BD78AFB25690AD1977D5956D1923802A37A5948FB006AB14 88CBCF39CDC48CFB047794CBCBBD955CA179C92806F60A51C04CD5AF79979284D49C2B8350784E8A77B8ABBDEA6395CB 006DE254798D9DECF3C9FBC7E826F4E445230EEFD7E0FE335F63EEB793AC66C5079A232528504A8729F428CB8AA722C6 B1587E3A385777CA694F072915D24415BA6C7A0014252BDDDA51FB7E8D2EAB6DCE526EB520E289AC9B878C3A79EE36A1 6D0F7B221F7A1B533FC07302411987C8B473482F8105D7987EB492F60952B9F53AE45E8CFEAB3E621040CD0E9F084752 3EDC72070DBDC97BE62602ED1EBE39D065A751A4D4B7E3B7ECB986D9D6ADC861F79C06FD992E99119ACAD8ECBC6972E0 C611266C5E2DF852D48F20BA787820E9797295DD624FDE043E2F8E732F2D40A7056566192C23128595C04B9D57792BED 1110C0698351B733A2950A53BE8E4591747EA5622906D577456D5AFCAA5468D804FCF69D3D331377E99B706E851F604A F7A5BADC977CBF4C3B6EBF0055ED81D9AAD07634B7343CFFEE27F54082BC46EA444C3D45DE9BFCC0569EFACFB45E9972 3D2DA81DCB5A9B61D114C5304C266553816928E3F69816C54B17D249EFC73D73BF7209CDF08116BB080EA8EDCA478543 CB90080BCC142A6BA4629D397CCD33F523F418450B30E53C9961202A56E8F1DC2B26CEB569989AF68BB2C7E22BDCB0D4 8EB53DB93B0F6C56ACE62DD1BC52F368DCCF019CCC499AFC89BE8D75B876F58B7554FB1EADC26C1A15F2D9DA5AA23061 F8CB2CAA187F3BA480B0F3E88453E868E94DD6FC2ACA3BBE5CA690837914603DD8BF52D9B82E345B9418CC69F91C1064 39FF0E34ADD15A95204BFE952FAAB3FD46A6FF972D3E5C01AB858B9076CD1D0056BC203BBC2B6B5BDD7FD3163673CC5E 9385C021ABB8F9BB41C915E0B70A0EB7B375EAD870C2AA26FC330D7B837224915EA521CABD0B05DB0516000EB5441DDD C715F977C4CD8CA71AB98BA5C8C09CF3D9CBBC91989BFC648E9FE64E30AEB9472D8A55A85A2E2AD545802E1FB5DB0ED0 6B3B3E1114767604572EE2ECD482790FC20D9C31C2EADF34DEE0591091BF70725DB3C08DB4829C212B387DB403AEB671 435233F888DB23D61A517A69BC729ACA0DC54DB830AA7A4075252818FD12DA5995826945DA3A02162B87888D04331575 BF739CBF4938643C7E7AC857D1F48D3401EEC9D5EF79F88A9DE5B0A1524CB2054C744F67890295C274BB3DA00754902B 56D0C7378CEB0B4B9691ED0780B2088481764119BF566CE707F88129383883971DC823DB1CC291AB831BD1A9439B31E9 36F7541F59C86DB1D6644AD6394DBFDDA6A34BF8D6CE874979743DA3E086278AB6759773E2A895862CD6BC283068F6CD 341D733D2F25F2ED98AC5FD38746F8E5062203689B2EBB03671ADBFD82E74327481D8E432C461A9EA1DA2538E2379E1F 735152CC244F73E7E61F83540367965AB032BF6FEC717B1DC5268EE16CEA459087212E2DDF2FB95B75195B34CAC09D63 AAB2E9EFA8E091A8FEC9305D43B8D25698DD38AE3144AC6C7536D643C24557BB57F4E7EBA56757AE565CD8E2EBCDC382 21F61D3057E4355F6E9BE1F8D01094ECBC0CE0707E7E97C7D728C52D31C8A7F657126AB268318BAE4314B982024C7E18 65723C492A604052869EB906B36B47959B6F0E1B106BCD9DA911B3F80E83C31E6BF969406297E02261CFA837C8D6D417 FA28CA00BB365B5929F5BF79FA67DF5C07E8C78D7AFAF485258EDEA48F95721EF0B7A60641364F069565A442FF7C0D47 C96E60E03EDDF952A7AA446E62B3B811679AEFAD99DFC2AA8557431A97A61A1CA8FBECD0C8E371A47E6F3337DCDF8D44 B89E343FD527774A47B7EED62A2C42CAEDC6530F93B01D7BBDE0B64FE479DD20288260E6CADC651B15918CA53FA06D5A E37FEB6A39CA039FE8093B9316E7ACDB7DE4192456F6B87923795F364402850D24EB7B86EF1DBA07C2B5766FD717F844 83690C81B2292635A47389310C9D526BD7DB1954261A39A2FFF662AE7C34C7A539CE4ECB5AF35E5051591DA941454754 2516AD530E95647321034441CEFE4C5097BAB5FEDF74D1C78DA517D304CB0865E91FC4BD6B9BE210EDE1A246EE8EA6B8 9685AD1FE94F7BD87F4F23EE64789BB62814BFD39467349768BCD0895ACAF4429ECEC180417BAE4FBEF9162C42464519 DC4553DA98E4A3A410EACF491FA3A91AFD5F499A82A8496618108A2BAE1FCA3F40454602EA4A2E064396D118947A1E85 98CB9DF9ABAC08B3580C52060EF5F3B5F40DBF82D4EA7D9BB075F7D7D552A717312642E28D1D8DD763C048B33A0A58E9 498169ACC4C9E8BD6B4758F8E6A181FE956C2C21B77C4EAF880CBA35004626AE78410CE513F48B923CF078140C6254A5 E6325D2198D244B14BF25335E6DEE22AEB2EF84D8D8F39B41DF5DF85E56F9E52F76751B33A2518E045B4C075BFC88630 D19430F05FE1A7CA8D08C6699954352CE3AEF7CD33355EC1FDC5DBBBDC5FA8A7E63C9B0BBECC0BD36ED093378B6BC8F6 4644AF567945DAA219C41EF808746E9BAFE2F4C2D1EC9FB758A45AAF0FE38F656D39CCB11A8ED3E3000695590CFBD757 0E6AB5CC9A8233189995777FD7D3BC58D9AD6770A67E7B99F3B1D7C27F7E781713D5DEBEF969714EFA224531443DC19A 5A24A2FF30348287C9C3FA0B60EBA57F1D020852B5AFA1C37066BB8045A2D75631964EA9A34813F0D42CA3610CFC9052 F207742D31C0B69D58353D733ABA1BE112A5A75185C138CF29A874B1310EA9F7D7AA800069519198CF3762F9DDF6BBFE 9894E98A45451587A0F2A611FFB73A088280BDAEFFB7130A2536AE538232C139667CDDAE99612166DE4E37CBFB1ECA9F 5BDAD2F3B03BB391034ADE0B84BC134B5CF66869530C3FA2D54E9081AE735EEEB61420AB9D08F856252569A789E4B94B 8A87E827012A4FA8C15EB5F07968B68AB938C5FAD581B6F2CEF87A0E1E96D571D45531A991B9879516AAF044AB17C780 93C359905990AB0E0E797DBDB99A64188AE12BD30CFD0ECA81990CC369CD1D746BF85DE8767900436BA57F9256E691BB A74FFA2F121BE405D8039B4045FE792A4EC34A5D7EAE59D3E8AFB9C36031F5179672C1EF4F482F348E081D6D161E6CCB F051B080A225D62FB0344E238635ADBFC239596B219F56100E14BE80B4EEAB7DA57ECB4E790FD76B9F1840AAA7C25510 38304F079A04AA1B65D9835E5527F7E9768F5C3ACEAF824805B580B4920707A305EED377A0BC64F28696ABA5872573AC BCA8 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %!FontType1-1.0: AAAAAC+HiraKakuProN-W3 001.003 %%CreationDate: 11/20/11 % Copyright �2003 Apple Computer, Inc. and its licensors, all rights reserved. 11 dict begin /FontInfo 9 dict dup begin /version (001.003) readonly def /FullName (HiraKakuProN-W3) readonly def /Weight (SnapShot) readonly def /isFixedPitch false def /UnderlinePosition -60 def /UnderlineThickness 63 def end readonly def /FontName /AAAAAC+HiraKakuProN-W3 def /PaintType 0 def /FontType 1 def /FontMatrix [0.0010 0 0 0.0010 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /uni5BB6.1352 put dup 1 /uni672C.3722 put readonly def /FontBBox {-386 -373 1232 1266} readonly def currentdict end currentfile eexec D9D66F633B846A989B9974B0179FC6CC4458BB4CB99E3608702C78822367AAF89059868F63F93207640A6BD5DA214789 139C491E02A37BF3866F2964E8D690D48D9F6C4A5EC22355F8123573812483E06B968AE84B5F20A982A0E65764753516 97AB8C6EA040355C5542F297D7A3AF28AB93EA0771E0D56DBF00F7CA9CE9FB9FC2E0ECB00D04D5F5F3F24B987B546D62 74971A477DEE12C44623C180BCDBA21172627610C4736632D1A4693E79719C3BC43DF5330790A52DCD4CF455ACC213F6 B1C4BA249179DB360225568161552A16682E3A3604BFC39D571B1F8F18375BEF1B05D6DE4413DDBDB2D936EF6A197BC8 7EF3384DF04E6025A3A7EFFF451D52E96886EE4B4169EC3DEEE64932AF4AECA3AAB81853B58042BA51BAD1CF1FE64675 4A29D2100BBA83E7F6E2F5DFB112F838CA7F659DA7A6373BB1B86BF204DA715F2942AD8690FB1C37539822AE991DF19E AFFBD3E70C395C40FA19CBA66F6F776EC20B6398A64B19208F0E64419A3F9DB393F17B6A206EFAE3B72BBB97405C4CB8 2801FFF79A60CA475287D576B5FAE301357949AC6E4F6EF1B8E41EC8819429C31C995A8D02C6F93131B3C3FD0563C5B2 C561EF5E734C7AC2E2F882889F4D04700D54FF4ABFEB4AC7C99214F399F62A2920477FEA7111FBD7B5EC77864EA25A03 88721F3165F5B0867D1C7C29DFA0394F00B032672FD41DA7C59FA55B9E3AF89B81799A0B27F1420BA48F9FA3B4693FDB 053C26BACF8A048849E5C5B195ED71C79113DD547B1468FEEC4C124788537CF90C3E1DB8793BD8E61BC72DD310B89670 021372EA4C700AD16A855D0917C5F105706F3206540AEBA75926DC784B77FAA8F2459B9A468E2A06318839FA8C08FA7A 8241BE54D435D7E1CE8BB877839B32897C38ECC3B2B63BFD6083CBD67A33FDFC81F548A162333DCE29E28232431AF514 37794B82CDAA0282850FBBCB8A0A9CAE35CC3991AA9FBE225251C0E9E3F59F39EC952D556BEDE7BA8BA8BCA5546B665B 2481E6F4EE3929FE02EFB2402EFDBD1FAC1C72B9CFCFE391E0291A712286845FD31A23988776578437DD63EE0C3ED76E A391B35D2355FED30B1FD068D708EA45C4BE46C0F907CAB826ECAA27734D9723CF21C18BB7B30819E095E25833FB53FA 83710AC4E86D305F2EE40138D4BECB08688944C0D68C62E39899104AD6E587EC0F3FC097CE79F16A2C519A3B4ADA4712 EFAA7D9C7A17BC5023789142657BA7D164124537929053C2A7A0D2E8E4E63CFA5179983FDCC84769897719FB24472CCA 9EA1577B22B8B29703CCC51B7A254194DD86210204BEB444EA4A0D95A73FDBE953C0BDD8ED9074555027E745D457D989 412029757A42BCAA87154D3479D568532C656227DECD1A94699177522FB013228446DE961EDC5C6CDBF3CD69FA2B5F7E 2137C9DE65C2B6327032847044CCA017F9B2E8177A4A4B6D7DDBAC578CC2E98EB131C49BE0E818CF78C8DD2B562D74A1 A9CEEEF49606115A53F15F15D080A3ABB6D990CFEA9C58779C7E388C90BF6C7C1ADCA733C293E821F528A8A25B16CEFF 39B103A0000382CE00343EB20473864E5EE271B9F16B48543620B37B95B5C016B6BDF34B868DAE1E3581207508587E0D 44760E91C5E8183D629898CD1FD0E1D2798E7DDBF7A2997AD582AB85DCF50C2301E775AC7AD675A059D273D13E77A7EA 38DA6F3B16DDF2087940136B83C511845E6A91B8D2B8E3D892958966D1E22B2BC977734ECA36565C4A0FD0DE93F30256 40B66827F52733B55B565D4C60B8A3A5AF5EA3F5DDE6901C913366D3952F3FBD1B3FA9E4DE1474E006280D61EF34D830 490F88722027E57AD7F3FAA60FF2172B435493B0B726C9BFFB996459F29609633507AF1DA7A9F84094F7C61B0EEBA767 0540DA3ABAE2EE2C565DC4B7A061BE2B5375121676FDE5B0C37B9D922C0CEF05056E77E641B66DEEDE17E1C6714DC4A7 B16764EA5D4C7331DE2B1472FC3E610FB03B5842F4B7D9D268CF3204EEE860B1B96EB272DF663849EC387B8135065F48 4863D2C1263604ECBA3F3BF4344916C70485FA8B9E61C9F6A83C70EDBBB3E3F5A63B0C9BBAE3A3B457D94E5669B60812 E2B88E0A767E549573484C03CD45364AA230827B160318E25F95D8ADBD664C1DE213CDC3454775A09DA3858AC9622DB9 4A66012A14588548B12011E64B1CAB38834EEA24AA78C7FDA24690D53CE063EF666119954BD289925D2667AB00834FD4 1EC048E6ADAFC36FE8971B9A3B776906C22414478E6D4731FD1125256E30E2ECEB7600643ADFB27EED6B7040DEEF0580 ABAF22E011D407D171ED48A915140FE722E3DDFE39AFB34043406803C8C0CD5D729243F2450E9F7AE57A85910D0C304A 290941ED125758860B66D4CA4E00F1F6BABC431CD4B2E2C0B9C2DADE8EAD2BB86D96EA93D125497F487C77BC15BA284A 04A55EE8DA4D52C365D845AD7D66672664B1B6D113376C4136E18A77579176C5BAEF5D063127ACEB217340F93AC314FE 151AC07E75980038953DE1ADBFF288C3C0CE5974F5ABCEC9B7780CA3A7949C232DCF7C36331A48DF504C45E69BE408DD D4DFAB2CE40717D026086DCD1097B8D79157EC780F6EE40798794591698E8894B0229F5541131FFC3777DA24ED84FA84 EA3C49B49D8B8168764BE94AD9CD73303A9C02C4B30273D995D77E093F9B20716ED7A8D1882A8A3ACE81154B739FDEC7 D3E560D8733BFD7A7FC51BDD337587FB4471C0E735DA3A11DE1CE7510EC7000A78EB103DD08B79D3CDC791077780EECA 983D71377D598198DF0A02F9315A92A1708B997FE3FE467B06970D58C676D1AE871F2A3AAF6E85BD087A77A92918B0AB D6DC855C54CF7A69CF96D20B74AD321DCC3B7018A7444D4F2A193451672F3A720DA457D38F60B5775C157059CC76938A 5E396C70D7FA75E105636F9F2C27F5FAC0A0DE4AC709899A15B85D546B0D6020B509DBADC91624359D5B74575D67408A 0B9D67AD007066510B5D0D1B0EC5244C1AEF02E521DA2BF5ED41CACA27127A53415F188264B610C4C837720CF95B8E78 D7B36D0C3E86CC7CEC6ACF71575B9D28BC7155C67B45CEC4DCB47D8474A1ABFC1CD4A284109F175FABC93B3020C61D0E 31C976A6D252B773FB84F044052F027ACCE86453F830BA312657154C8C25AF0D965497C02E9CD04B3BC66E08E942AC45 1D0ABC63A739E527D5ACDBFC52C6357FC7A5FD91740DB7584C3C12B1F5BEF9A0A44B5DB530603FF7F1696ADE05102600 5919B9E0923BA37B60C7611E7EF96DEAA7552F8B28AD9DD5C3A2A45D37BC3026CBFFC6429C69CB444D4C460BF6F7B15E E6523F1768568E1357DBF96488F4CDF3D9633C8CC2B3732B05A338622C30DAD2966CFF5B3EFCE688EFE2A0AE6040ADD3 567E90A16026A42A2EF287CF3D8ABA5A6E6E251938B96BC6D38EE53F70163447DFB2EFB45D5E609E135AFB66185BB12C E5950CEBFF13E5DB2848616FB0D5277EC40B2C41FA40D086E8164884A49BFB03BAE3E66B099DF735697986BBAEEA8856 2B9730476EE58E06138502D055A88DDE2CE4E944771E1B9D34A739A87A2EA404CFEC8FF65824E74D954EF758DFB4AEBB 875810571F2A6A6F75608E7B52682225EEEF094340B12E03718CACA3E6D5FAE9BBBFCA7FFD14DCFF08A057F4E379D622 A338012DE2C834A83767864DB7C9823DC75AAA381B068E57A6A4FF9773C2183470F1FB20122DBEE76D826337E5D01DDB 295036CE9D5852B3BE4E0CADC66E42B16305CB7368EF293F42E80AEDB791C6E9BD45933A9A2F17FD60E551E1548C1AEF 6B36A262D82C1ABA3C7F6C51DB913E16D8795640B2FC7ADBE003B48B62E096011398F387E77585064C481BDFCA7C47B9 CA1A3B755CEC4A0596120A4E75119FC14B8A6C13E93694D2C319653A413B8E4CBB1A55E7BC555911F2D31678D4A5DF56 8DC4218AD6573BA07D46160134286FCB4C1F803E07723552D7C854CFBC3597DE9BF1B9930B6997AB2E9D384934BD1730 BACB9586D46B81022DF89010B65E3DFBF7178C543A46BFE5CF6B6E3D2A5C74ADFEF13F131FA05AE05251FCF217F92769 26F6E5FBEA94F40F1F9910DC865321A0495A8CBB5487BB2E96CD075E3CD99EF552ECF67C331CDC1CAECA526DBBB3314B 6C8FCFE65278A70C484356867A41DA7D0C0CFCCFBC09DDE65C81D980190E539A67D8D4F02DCC8D9936CBCB796D84C8ED 7A0F35F4E73D5210A625ACB7860AD39B09F4609C1D9FDF1056D9CBA5BBB371A674045316DC6D97B4E3EBA6732EE42A5E CBDD20F8C7DC6B8EAD36AD7931D33445B38B78BF4714466CB9EFDF75F9E88622610759ABDCD6DDF314B21D5ADB663BF0 2B232EC7BE6AAFBF0E60A734037477B8E6F7FFC1290E89E251FBB5F91EF78AC3B71DBE01A7E8F0F8BCB6E62F50E3A415 8803FD7CCD69F45F274EBD2843E77369A66750D7E5C82F42AEE451D6F81E3BF18D2EF5D4A8F7BBC43D5DA3FC1EC142E8 8EFC114D9FD3E758A217D3088B31417DCC3E6658C97BBAF1C35327F1FAAD78512CEE74AE6B4E1863DBB552CCA429AA2C A39563E8FB771E2493F6340014AA43972720FB7449D1569C8EF84EA788CB9FF7B106DFA7C57A4918534F8ABE0DA68652 25D8524B0D74FD65C5981AD546696209E82579650251CA16599FC06D15C79EEC51B71E35D070C5069319943C92B6E25A 96C50995E3D26548716BDF002B6BE74EC140AC12454D62419B00F312C979E0879AB5966CDFD1A4FBFCB7C1057C4D2C01 A6B78DDEF4C368F9DE27AAD7CE33C3DB1BE034122F8E4C7BA559A394E19E1DCA4E55CADA86B0820D2F49AA88C81F0E23 194CF929CF4F3ADC4C89E3FD4900E5D694B0E81A4174F9F8E279FC45B790119811992A209263BE9BEB655592DE9E8132 6E7D45345377E356A7BA1BDF524257EAB9E61752B685890BC824AFA834605712AFE431180E9C87F09A87A1F490A9C64A 7EF8232E3685EA6DE55F4586202D727D15B0AD4ECF9337802641B344E45635D344E82AAB61E083B8DF276C80E82E9960 E00EADE00DA94EF49F30327FD659B8A60318720E9A0BAB66DF457A0191D864A080C99D75BADF49DFC668094A600E561E CF3FE3B0BC981831D569CDBDCE3E7819FC4A706848C2B52097988C0EEF4B0C1CA1B58CF82D3BE14349C5CC7E934B1E0B BA3B8D0C93C9C14E11101DEE66576FA53F7B910EBEB05C26C6BB539FEA91E9FC72B2B25E3BF532A709A4AF8E4609752F 495FDAB446FE4D04629BFCD1C961A52C913E1EAA315C7C4FB8A6C692A16FE0D08B2959FA9B31D3270701B9D050D8B2E9 8350D7416F89404CA56AAF343F1E037873E86B71E6ED894A14A9C8C70A41D6ACAB8236CD51362340C02EDC49996A9530 65999DB2E09F06376F27791E4DA56AE2AE9152B606301BE973621C0F358E3100E07C3ADD21A8EDE860477BFA33A4DB6D 45E8A1D657109D6074FDBB986F3D7CD9F61A0C313A424AFE26359E69848876E1C69D9A76D11A4D20289C2D788B469FF2 850FB4CF98FB96B14347FE1E9C195AC54203021A7E8803AE91C6AA6E4946010582040D6ED65E940D3B8BA5F4FF2BF2CF 35EC93026AD01B6D1C9C3BD77FE4284D1825A0DBD180AFF5BD78AFB25690AD1977D5956D1923802A37A5948FB006AB14 88CBCF39CDC48CFB047794CBCBBD955CA179C92806F60A51C04CD5AF79979284D49C2B8350784E8A77B8ABBDEA6395CB 006DE254798D9DECF3C9FBC7E826F4E445230EEFD7E0FE335F63EEB793AC66C5079A232528504A8729F428CB8AA722C6 B1587E3A385777CA694F072915D24415BA6C7A0014252BDDDA51FB7E8D2EAB6DCE526EB520E289AC9B878C3A79EE36A1 6D0F7B221F7A1B533FC07302411987C8B473482F8105D7987EB492F60952B9F53AE45E8CFEAB3E621040CD0E9F084752 3EDC72070DBDC97BE62602ED1EBE39D065A751A4D4B7E3B7ECB986D9D6ADC861F79C06FD992E99119ACAD8ECBC6972E0 C611266C5E2DF852D48F20BA787820E9797295DD624FDE043E2F8E732F2D40A7056566192C23128595C04B9D57792BED 1110C0698351B733A2950A53BE8E4591747EA5622906D577456D5AFCAA5468D804FCF69D3D331377E99B706E851F604A F7A5BADC977CBF4C3B6EBF0055ED81D9AAD07634B7343CFFEE27F54082BC46EA444C3D45DE9BFCC0569EFACFB45E9972 3D2DA81DCB5A9B61D114C5304C266553816928E3F69816C54B17D249EFC73D73BF7209CDF08116BB080EA8EDCA478543 CB90080BCC142A6BA4629D397CCD33F523F418450B30E53C9961202A56E8F1DC2B26CEB569989AF68BB2C7E22BDCB0D4 8EB53DB93B0F6C56ACE62DD1BC52F368DCCF019CCC499AFC89BE8D75B876F58B7554FB1EADC26C1A15F2D9DA5AA23061 F8CB2CAA187F3BA480B0F3E88453E868E94DD6FC2ACA3BBE5CA690837914603DD8BF52D9B82E345B9418CC69F91C1064 39FF0E34ADD15A95204BFE952FAAB3FD46A6FF972D3E5C01AB858B9076CD1D0056BC203BBC2B6B5BDD7FD3163673CC5E 9385C021ABB8F9BB41C915E0B70A0EB7B375EAD870C2AA26FC330D7B837224915EA521CABD0B05DB0516000EB5441DDD C715F977C4CD8CA71AB98BA5C8C09CF3D9CBBC91989BFC648E9FE64E30AEB9472D8A55A85A2E2AD545802E1FB5DB0ED0 6B3B3E1114767604572EE2ECD482790FC20D9C31C2EADF34DEE0591091BF70725DB3C08DB4829C212B387DB403AEB671 435233F888DB23D61A517A69BC729ACA0DC54DB830AA7A4075252818FD12DA5995826945DA3A02162B87888D04331575 BF739CBF4938643C7E7AC857D1F48D3401EEC9D5EF79F88A9DE5B0A1524CB2054C744F67890295C274BB3DA00754902B 56D0C7378CEB0B4B9691ED0780B2088481764119BF566CE707F88129383883971DC823DB1CC291AB831BD1A9439B31E9 36F7541F59C86DB1D6644AD6394DBFDDA6A34BF8D6CE874979743DA3E086278AB6759773E2A895862CD6BC283068F6CD 341D733D2F25F2ED98AC5FD38746F8E5062203689B2EBB03671ADBFD82E74327481D8E432C461A9EA1DA2538E2379E1F 735152CC244F73E7E61F83540367965AB032BF6FEC717B1DC5268EE16CEA459087212E2DDF2FB95B75195B34CAC09D63 AAB2E9EFA8E091A8FEC9305D43B8D25698DD38AE3144AC6C7536D643C24557BB57F4E7EBA56757AE565CD8E2EBCDC382 21F61D3057E4355F6E9BE1F8D01094ECBC0CE0707E7E97C7D728C52D31C8A7F657126AB268318BAE4314B982024C7E18 65723C492A604052869EB906B36B47959B6F0E1B106BCD9DA911B3F80E83C31E6BF969406297E02261CFA837C8D6D417 FA28CA00BB365B5929F5BF79FA67DF5C07E8C78D7AFAF485258EDEA48F95721EF0B7A60641364F069565A442FF7C0D47 C96E60E03EDDF952A7AA446E62B3B811679AEFAD99DFC2AA8557431A97A61A1CA8FBECD0C8E371A47E6F3337DCDF8D44 B89E343FD527774A47B7EED62A2C42CAEDC6530F93B01D7BBDE0B64FE479DD20288260E6CADC651B15918CA53FA06D5A E37FEB6A39CA039FE8093B9316E7ACDB7DE4192456F6B87923795F364402850D24EB7B86EF1DBA07C2B5766FD717F844 83690C81B2292635A47389310C9D526BD7DB1954261A39A2FFF662AE7C34C7A539CE4ECB5AF35E5051591DA941454754 2516AD530E95647321034441CEFE4C5097BAB5FEDF74D1C78DA517D304CB0865E91FC4BD6B9BE210EDE1A246EE8EA6B8 9685AD1FE94F7BD87F4F23EE64789BB62814BFD39467349768BCD0895ACAF4429ECEC180417BAE4FBEF9162C42464519 DC4553DA98E4A3A410EACF491FA3A91AFD5F499A82A8496618108A2BAE1FCA3F40454602EA4A2E064396D118947A1E85 98CB9DF9ABAC08B3580C52060EF5F3B5F40DBF82D4EA7D9BB075F7D7D552A717312642E28D1D8DD763C048B33A0A58E9 498169ACC4C9E8BD6B4758F8E6A181FE956C2C21B77C4EAF880CBA35004626AE78410CE513F48B923CF078140C6254A5 E6325D2198D244B14BF25335E6DEE22AEB2EF84D8D8F39B41DF5DF85E56F9E52F76751B33A2518E045B4C075BFC88630 D19430F05FE1A7CA8D08C6699954352CE3AEF7CD33355EC1FDC5DBBBDC5FA8A7E63C9B0BBECC0BD36ED093378B6BC8F6 4644AF567945DAA219C41EF808746E9BAFE2F4C2D1EC9FB758A45AAF0FE38F656D39CCB11A8ED3E3000695590CFBD757 0E6AB5CC9A8233189995777FD7D3BC58D9AD6770A67E7B99F3B1D7C27F7E781713D5DEBEF969714EFA224531443DC19A 5A24A2FF30348287C9C3FA0B60EBA57F1D020852B5AFA1C37066BB8045A2D75631964EA9A34813F0D42CA3610CFC9052 F207742D31C0B69D58353D733ABA1BE112A5A75185C138CF29A874B1310EA9F7D7AA800069519198CF3762F9DDF1B347 379D624CCBE3728B3FCEB06CAD89F683033F68423A0045251C1D05B98F791A7080A26D7D62EFFDBEF6CE4DFB44C8A789 CFAD7CA84E7DAD78569556AFD5107D5BC2998E752D38CCF8A5C31B93D304B4416C683A8953F08EC406B919BB1D4BB27C 23488028B8EFBFB302DD47D108000486F05639CF7CACBA17E08C161A29CBFB06128991FC5A39576B3B90B798AE5ADFC1 3F550646CF0DEF06188790214BAF5EFA41CB77ABF53BC8C6E902C2A4C89396C6DEAF3ED8A0CB7DB454796B533E6974F9 9C7649F786B2E5E81B63E9CC5ADD1F2E4E33BB0BC5D6F45BD6E01DFDD487D07453431E5A991A63A65A2C999EA4E545D2 0932EA9063F00A10E16225AA36E6A120ED35A9488016DC83CC9CA577B7CA507265215102ABB96AE8A9B1DDB35F348D71 EC2CC8D7425B810F37143D376ED2B99E7E5F822C54C895C8B4F13D1B5EC3D9752ECE43239717EDFACCD1DD329A69879F 76C425ACC7754E334F44A9D2752EC40698F9F6925F13C9FA591B2981F93DF52A203A893CC99A7460DADFF94C530E480B 83155BF682D5F1603D8AE122484A6DBE73F4BB9BECFC8BA295F86F8B6FC6CE4EC0CC55B4FFAD86CCF2707D48ADA7773E FDD4A4769CA6BD7221C52EFF48D4C3595BE8002433166AEA1098BDE93BA9B5084AFBFEA4F25E8F183B50CC4027AE941F 85477B6649772873F3B852994AF72891F2576A4C1C106CB6B0CFA8872E9050C95764EE3262EE70790A7FEA57369F571C 7E2E249563D17B477A9E48A57AB936C3179FFA3E414F10CEF9820E37D268937DD3D50D7D5D5D59A88AC46489E8B7ED78 8A046C83FA64A79E7A43AB87A7BD604AA2DD934AAE6634CDC34EDDBF12492519DCC09D3A63C7875B6B17FC5AE15F5A72 B7B240B5B9A0324ECA4B9A9C2E193B1BAA08DC46A85A10B17AE83CFA536F83A1CC55A8E32F86025FFF0873FCC0D097A2 13C247EE21DF9BF67ADC93DDBD272F74304B6BB367EC9EE53DF3AD9691D422B564291DE35AAC80CD1AEA5637C0933CD0 BDB5FD03029BAD0DB9A53A32BB58864C71CBB2D6FADC2FC59EADA0F02A7EC8B6737B4A02264A84776B9522EF68C78966 FE717B28B2D6E643A24C420A9E06053254C1086EF10A14244E529D1F83F47D170C24D7C2B43BCD00D2970C7C327EBB37 9E8C84D8B42F87AEF4E4CE87E31E9F92C0CC1616AF751EAB03AF5299E0F9503FDC25A2727D727742C9403D9519CB05B0 DD6653ED38B9658464AA627066F39BBED5949AA3E989B5B1C6FC206C712A4FB42F884E3A79FB2AABD8D6502637A4888C CD41F2AC8D1F6665A656E225D5CD86D90B41097261C0D73CB60C7BF1DFFEB5D049F687984A2E114D21A3DC2F5C23981F A9B5F7261C1428DFE25031B800B42A1EE23968D44736545FC5D3E287E496FCCDFAFB2CA7C58369DC8DAADBE69BBAC480 B7AB8ACC65C7E3D9E887533F24E5098A323F593F49115CA0EEC0B21E27D8273969 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %!FontType1-1.0: AAAAAD+HiraKakuProN-W3 001.003 %%CreationDate: 11/20/11 % Copyright �2003 Apple Computer, Inc. and its licensors, all rights reserved. 11 dict begin /FontInfo 9 dict dup begin /version (001.003) readonly def /FullName (HiraKakuProN-W3) readonly def /Weight (SnapShot) readonly def /isFixedPitch false def /UnderlinePosition -60 def /UnderlineThickness 63 def end readonly def /FontName /AAAAAD+HiraKakuProN-W3 def /PaintType 0 def /FontType 1 def /FontMatrix [0.0010 0 0 0.0010 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /uni0020.1 put dup 1 /uni002D.14 put dup 2 /uni002E.15 put dup 3 /uni0030.17 put dup 4 /uni0033.20 put dup 5 /uni0034.21 put dup 6 /uni0035.22 put dup 7 /uni0036.23 put dup 8 /uni0043.36 put dup 9 /uni0047.40 put dup 10 /uni0061.66 put dup 11 /uni0062.67 put dup 12 /uni0063.68 put dup 13 /uni0065.70 put dup 14 /uni0068.73 put dup 15 /uni0069.74 put dup 16 /uni006F.80 put dup 17 /uni0070.81 put dup 18 /uni0072.83 put dup 19 /uni0073.84 put dup 20 /uni0074.85 put dup 21 /uni0075.86 put dup 22 /uni0079.90 put readonly def /FontBBox {-386 -373 1232 1266} readonly def currentdict end currentfile eexec D9D66F633B846A989B9974B0179FC6CC4458BB4CB99E3608702C78822367AAF89059868F63F93207640A6BD5DA214789 139C491E02A37BF3866F2964E8D690D48D9F6C4A5EC22355F8123573812483E06B968AE84B5F20A982A0E65764753516 97AB8C6EA040355C5542F297D7A3AF28AB93EA0771E0D56DBF00F7CA9CE9FB9FC2E0ECB00D04D5F5F3F24B987B546D62 74971A477DEE12C44623C180BCDBA21172627610C4736632D1A4693E79719C3BC43DF5330790A52DCD4CF455ACC213F6 B1C4BA249179DB360225568161552A16682E3A3604BFC39D571B1F8F18375BEF1B05D6DE4413DDBDB2D936EF6A197BC8 7EF3384DF04E6025A3A7EFFF451D52E96886EE4B4169EC3DEEE64932AF4AECA3AAB81853B58042BA51BAD1CF1FE64675 4A29D2100BBA83E7F6E2F5DFB112F838CA7F659DA7A6373BB1B86BF204DA715F2942AD88E29CAAB54CD3EF15782538A8 1D74026DEC736D8AF4AFBB3A61B02C2473EF0FD459B95AB8B57E30D32B1CD63EA03ED9692EE2DB9C1503764887683F6D 914C93A66FA6150517CC716FB7206FF634C472E436B450CCCE95143EACD3D63090442B5824AB9EA741DD127DCBB5E760 855E3A8885C51C56E564C6DD55E122AF4A5F259ECF1860079165ACA84C4B8B9E4A329FC22C6D00BB3A5B99D137A53CE3 717949FC27C5D46312C7FAA842485F1722F221DE5E4FC55611939BBF34D6E699C9834FCFBB4DEBD57C02ED0B3ACBE19B 749315C676868357E5805CE5C47086AA457385E62F2FB51705A8E0343182FDB73F4A2761DB2B63AC0D4DF1CF2A2054B1 DABE1DFAF586B67F680739C10FF2A4397E21366C2949A1C2888809C58BE8464FEE5434AC57C4280F8E59C21149F31E1F CC411FB4FB7D1F4DCA1B114B12DBC86FFA234FC3BCE18DA7225727658F187D8B350AD8FF93D71777F313341F1F8A7D8C AE27D0E6AA149FB6C4C6BCF8855C07534F2B073B83B3267F14DFD93314991C3D5E06385B2AF2D297E504EDCAF63B254F 4566A61B1E1AB03872219675F3EE43DFAB961FAB215DB70886C876A97D6FDBAB65E46138ED9CB63FB37258D47FFF77C1 399AD3C525A50983657219148704BC886B45C13C8156CA07971B2DA0ECC38DE63788F541B13EE9D8C964A9D0585EB78E 331993EAEB3466D917D1A7D2748955DC247C166C802C6F0D2B612109773D6F19E5F8BD41365DB854F495C72CF35ECC9F C289C92D798A7BBC45176507A1DE3A8885CD04978B34DC0153EA45EB5A143DB8BC4AEAF6500551EE9CD43412C55796DB 01FC26514DAB0A98CA549D7EE337EB1D8646DEB04845DA6E6602932A36E039BB190C771EE9153D2F289BFBCD56A36AE3 0BF92DA9FE3ACA22C01CB34ED28F94F8ED7DB3A228B7002BE0B08CD285A2316AFF5A20131D98AF761C42C9BC5A163AA1 445E897850B07D11A72CE5032353F43AB4B5087A7208230EB440C8A725D2622AB432F7AB756B655E1E6C459D705E60E4 1FD2E11EB7D43D729C1312E8E1A83D3140CE19FE11CEA6A42352E58810F732438A80C16E21F6D87219C0B767FE28DBB3 21B5FDA5AC6A07F154D74FF668CC1BC2714FCBE6B3E103AE5C1FB54B4C94343EFB77794F7F86EC245B956EB659E5F972 FADE93C7084AFC6044B346CEAF3B0B17B665B6B86CAB12653EB605E42D08D51A5B45CB85F0CC7DCC690ABBC55D64448F F196A8A5E1E618AEB59C1C4244123A66F3D60D3ABE0E86BC707768B0B4509579CD6B906041EAFE205673BFA858A62816 3605BDBF87CE463545F453851C67F01C7F64AC71E8E5CD7ACEB317368651BD87B79AFC562C191BA6EFE95427D72554FD 7D1D2116173A3484F9AF0D6E0FB360CA6FAE1538DD9E78BAF5D750D077763CBB0E8EAFBB4F5EB7F46349644F0FD29C09 417A56F7BF7A7BD33340D600790288DD22EA11662DF25B73FE624E33319D927FB8A42352E58858C89742C1D91AB02F15 F6DABBCE5D6C8F6F6ACE2073F113B873AD227203B3A617DA8C3E30CF07C2EFF49CE030B9E43198C6FFA072B96AA1F367 9BC7603F88B67A7D4E6A0F6B06F135115EBEEE12F663854C24584DE6D4BFDE1D01949F57C32137E88510AC5493FDADCD 9B298A38C69AEA93035743AB143166FA7127FBD33CB922E69AA320BDA0EF4BBF4C35869196A7DDF8B8682B24CDFEF1BD 067BC2424A419AF54DB346266109C0C20A3E29521E4DFC14EB295FB22D6153F1105C6D7ADE73984BC55BFBC76D50B9A4 FD2742FECFC1EE123E19D38F0FC66196FF8AF5793D5A71B67B5A0F265B0EA00486D4C74EDC08C8667C6E2DB3DE71623B 1A18B22E65902200E5D694B0E85BE4945AC7C7AF887AB748F37684E4DEFB57BAAB2D925D4B7DBC48A647BD4B128622D3 2893960192A3B744DA54C5F2BE1F00B0D23D8C25A9CA58D4823F4EF496E821624C6EC20E8EF183A2D14441359EC6585F 942B53ADFC253DA6C2FF212234C6027DF8F89E0D4C56CB09272C285B9581CECD3E8C4E7E18CF39F7085CDBBA1E861492 D756F3453E810871716B3BB7AD7F1BE3071EEC056D8FA00270928C30F5A59884AABA91C4E212229EF2C8CB0F205A3716 2CFE1BCB949E8326435093A8D24CA4509FBAECE4C1DA794CE4192F9D49EC9E39A34D0324A56E1B84D367149848B12EA3 A5DF299C7A5BBCAA762C7919AAB7A01625917CF8C83D35330B38A4637092D8DE21ED41A858E8FDFDDECF6939FEA5EC15 A6E7F46BEADE268D5FA9CFF768CACB0EA5B2978453FA3D24E31A9A4C4E1AA3159554101855187E8F190B89B3B711301E 45F53D6736751E73CF97118D5DB63F3F289F0E40753DC9E37065A211326A2C945CC0961B186DA3383B9B3E40C19323FF CD23978F003224A3BF6A553C28868AC6E8EFAA5DC265F81E8353FD73D56DE12E76FF8FD7F767A6D95AD91BCB251D2E5C 894CBF58F8BB22D80B20A9096480D9EE0D264570F3D85A29CA3BA96AF25AFA4FB83E5438253C528AE51EEDC59E5A9F2B 1CC166A5CBE077275B2B5B87327FC2B2D5BA577CAE7552CE3EB31C3A403A5BAAB90E430F617464247D4C70227CA92EE5 516F471EE9A34C5945AABF6121EAF8B37822752BDA70C91631D4E90F417AC6FA53795C13A27F43320DD8531D42894D9B 10A688CE3F08DF163E65D7BFA08D4CC2B3034A81437BD8ADE192A1BC8C40DF3DCEE49AE5C989999221B6DE931327B79D 4A03E40D66F307F758ECC243D4A9316382942146A387E1B02C267B95D9E57BFB0754900621E1D2A26FB6C3281C1936E0 EB8F676FE853789EBA4B6194247C7615153DD622A626C01A1A6B39F128E3402879D67CAB0B1DC5B129398ED4565646A5 00511C98DA8A64EED3E45996B66A2A0BB2873066ECB49E2802E4D56F872D448B6951583AC2A9FAAE2ED7B0E3910A30A1 0BBAD7FAAA76A5FCD86365C91C08BA8F6E5E310FE4F559CFC2BEB2ECA3FB7E9F2D582698D618D149443D1412433C9ACF F2E39F58EDEE83E70B9EA327C7133BC68EE1827AF0B604DD21B91836DE3F787942306A2857ED247AFD7578EEAAE6E206 872A63F382463417931F969EBC63BEE9C7505069396A5BA6A78001A10FB92F51CB512F86D8902B817A0248E58A592311 04D32A9CFEDA5388520D0F6768CB91F369B9364FA6E046231696AED256506909A0ECC873A00E181AA5963596F49DE101 038BBAC42F15522EA076A6F2D232F5FF8345EB2C24969E8C63B6F67620CD343F770CECDB6DDBFC5546A02622F3810CC7 E5C43E71A51540A4841E9481F5A4A0AAB89F26225EE34CAC64F8484B00F7D54B27ED1F1B08D2EE7B76DB310F80E70993 D3AF698C1A786A9B31E1F60ED4748E84DE297D8D83310ACE4FD0062FFC94FFADC092BAF3CF5B4ED27AB200AE75869F34 6AC14D3BACC026B5E2957D4C269CEC2146A1533168AECDB73079D2351797CAE9B70D5A8E6AE1A58B6A1AA9F2781AC0EC EE33EA7761B81C4C1DD439A9243F547E48F426138FAD7501B091BCCCFDC81309C6D831162F5A05B62D10F92AD30562CA 2D192EB513AB6346868370747A2CACB9D898EED7000FE6151EF3354A8889377941D43E9B3F3CC8393FBBD71109B6B149 6EFB8693DA6ACFE364DE137B54C6722FDBA3ECBB58353C2574FA98992D64EC6E500DC098057C06F8FED87A3235677E9C D6D02430DFAE5B12B61BB8686C33A10752E0573A8587AEF34A4518136AF01A073AC40F13C6032B99AFBBFEC6B59A0868 78AB4D6418FB72CD8D77927D08FC3CF15857A84327FFFF1AAC2AD75CFCB8ECEB962451F03C1E145FD4E2AB67BE6D6EEC 0D5EE752F29B15C23BFF199062AE90050C18E9462B1C5F996C7034D864D2119ACF2EED88D929536B15BB6BD536049CF7 B2F0C92C9494AF09F6D8DE41C6B3678D0EC7C9B79014F899F998B80F38AD8056DA85F27DB7878B0D8A36CE2C261C0C8F E99DCEC8D40C0ECC34E19750835E1E7979ADD205906272231086F74998B4A6742496848DD420B677700FB3CB8FDE8808 2EBF8002B983B4AE2A6E6231EF55A5F3F732C7D903AF8549C82DB398E83E3AD14299E574201BB16763D3269F544421D3 5B89792487CDCD4D0B1CD62B9F8351EF92F0D0436594A33DFA4BCEF78820D1EB1875CE451CA57F55838AC3C7EB3A1039 09AF1FA9DFB232127B182A051B9C111F5D82B5D3A179F289328C8DDC2CB0AD34AA97107B78DEB8B275F582DF3229DAEC EBFEA7F4FACE636A7E256517D9044C1B407329D5D0A7D34CC5F8DF728FF52AA3FF16DB57CE1F15CD1F8C80953145B086 7158CDD27471A17F39340FFBE27BDFB6304D3C97E24DC283A29E100326A6980B7A3968A6A2034FDBAFB27E4218C313A2 CC02A1A162019D466A2FF0309A29D32DA11A653A55C523661B3B9E90E24ECCA12A603C71CF2546BB6D6B341C8482C20B 56FF7AD8A8A656DDC9CFDF550B5B0F71630F30EC4BA32D8554BF581D09F9EEEE8F8A37DDBC4711FAE6E4E2360C8EF1FA 2902416C0578BB0E69B79BA54012F4EC4C2542D05CAD7106C241462BF68FFE99992816B1DB79D16F41D61F5DCAE49CF6 87A16C70A8565B222DAF5342B53AF7D57A85CCF910F0AE7338A660D17818A1F9B2511E5CFA7AB86591D920E0C23B794B 3C2D2AEE86F764B060DCB3796DA423EEB18D701E489B57694710B1BC63B93A3FF45A14FD2090EF847B266504A232A642 FE77304A8D4A401EDCC700D9B0565CB3FFF1DFB34FDD56AA683F1FEFE549C181B0C59D57370C301EC265D6DAF938B724 2EF0C72F97CCAF47AE7B29645D2BE64C7A16D7D05ACEEA26E03F175FCBD6954A5FAF48E74445333C904E469481A84901 770B50E88F90C06678B8A4B011ADD95B3632223996DC0560DD18810263BEB7F60E90D8FEB20309A1B880B6C36BE83286 55C4BDC50210430324DF1133C07AC2F0C38E4C7C0E5FBD41AB57D88AF146D3FF926743DD5AF41F0DE7DCD2003CEF103A 0173227179666DD0A84D84988721D8A897DD56B821C577AC3134B78B57337D5706C586111B19FF0A7975817D91C84519 47B5D24329B29F15B85D53EE1AB40A769652AA24C938530BCBBC0988C45F0817AE7CDA7AD66126965C72479EFF1CEC69 BF47BBB5744B9D98E314259E79735DDD62E099C0DFFD0EE0EDDE515DE39B80F28E17A57DA5B19EEDD3669576F555D4F0 CF040C9F9D5B04DC2EA078938276E8D5F8C69EC718F2D01800A8F737EDE7068F8C0137BC08AA41AE298D0395281B541B A81F1D96E88EE1486F6D0A47EABC13C6DF2D6F68E573D9A6015D57C5F0C600E3A4DCF3BD45F7B8F6C902363C57AFEE09 56F0BE0314BC59001DC5317FA191CF6634CB80A6096A0415E72286D28237B63459BEA54581387962B1D4250D173C9DB7 635F6ACE09427E0CA6271EBB6BB7FE35D6A744AA1B3F5FBEA0A02A2696FE4ABD739AE7F0E817629BE25DFA03AF50C65A D2455746861C45C40418A9D90BB23493541A8BBB9245ED107A2FE652F2420A0A41DD55167357B769345F018EC875621B 5FD0F19DD4DDF248E3ABF7C577A971B214CA53057BA6310B97F620F889B9153ABA23FCA9CC826246264BF095B9BAAFDD C35ECCAD6F214FBC7E5820333C13542A62FC1754E2F9525CC2FD12D7F874FB08AD666D1989B9400DF3980F4AC5C4F4F6 4323D939E5A78807D40BAB56DB564A712FD06E8C741B173C39ECC99F7823A6F597AFC42E994A7A6D0EB36BEE41A7D3E8 1CC7CCE9DC65529319EF2FB60E047DF312746DA21D32E32F10DCE0B49EFEC07038A8EDE860374DB20F8348641840EACE F9127AC98EF3F84C38AFB7A4038FDBC7BD2B8E2B15031BB4A9A8B68057354830A5BCC4BD2EF9DF087CB0C6E4E6A86E35 347C5D741AC4B915580FFFE987D0D2D5C2E98DCBFB72B8B9FEACEBEE66BDBFDF75C476DE99574D5656C5FC51792A8670 2F8A65466A62756919F359263D96AA3FC6C4FD3446308B5F89E362CAC95CA04184E5809DB96A341C28C63DAAC6851627 85C290DED743B902843D9E8F6BBB0902CDD8C3327E92B7F8F2D697AA5A4EEA8CED8A914D2276C8A6CFA3D9082B337041 BFEA8812E6CDF538127ECABE8616B7ECF21EF675AFF7C24B9712E9E54899992925C629E3922E0F193D025D40DAE4F524 8707F6BD29B2FB42E8E797CA38CE4D09C76F9EA5CDFD56A9522AE6045D42859A5739EB5393CAF17F9745182F35ADFD7B C254131DC005911637E81F2342B186C324900AE497F30FF8145E3738E5A7DB0B075EFC1D7A2A416B46B25E7FB3345ECB B7AF85286B66FFC56890BC6746ABEF05F5C2AD61D89D5D22E8AD701E1C2EFA3A5968F7C2C9A3BEF7E0224470A64A0D9F 9EE7DDE40232C8F0D75207EA38E8AA576AE75936D3DD620FC2DB2A31AB6D790DC07FC00AD107F2C35ECEA65DE126D771 95150BEAFC4B11E0F094317B657C7F6F9C0401AE14BB1C5A42EE5DC80F1AA77BFEEF08A104475D7124BBD858F369BBA9 FEA19A57CFD0FC5B486114F46112461A3CF3BB70532CDA169303961806090B2D3DFD7F0572EAF1F0F280CF6237D38DEE F0BB03DF19A4CF2E9E868628AF054A575D657BE788E8722C33D008109E13F238240E8D0ACE64A5BD4BF2610E3CD71656 066EC53A6E0233780FDB4EA493874B2C6D5BB3B4EA2F0A56E84253A4FE7122C93225599795BA41621314CEE3ED41414E 1310327484CD29A8D8F6940A4561E9E731AD6C92B67207B418AC15F00B6B021D0B0BDF294F000173E012A29992310B82 EA393C36A69CF874D1AD6A3B54C9B5F4391465CF8A536B0D80C9666EB05F86CA68742C6D9ECADE9FE97F51A47381BBB3 D0499861D73FC2A93E49E0333CFAB3CF46D704CE3082CFBB7BE3EEC20AA2209D12ED4CFFF6D9A078BA914746ED093A91 712B8C203330FF74371758657723EF010C832BB6E65DE5E596B46BAB3B0275BCEFEEA6785E2B43B73BAE6EACEE39EA47 DB4076DD800D02CEF10050CB4FC41E8D816F886D38787D68C63DC56D3EA87626E61DD85ADBB6C49C32278F2C2B9E7D2D 21A26037D8A161742525362250ABCB1A5BC5FF6DDC31F88AB616D61937FB5CD8484C167DFBB37B7A4A58E88937D2A162 8F167D85C544227D7D739FD06EAB5922D6CFDEC94BDEF59A702FFCEAEFCF64AB6B83A91BEF6817D46133690391655E44 6AE98B37949BB97C5380FB71B6A2D33F1232218A5DBFD3B7A798B9A3A5A207D2AFC638D707539BE3078FDE405154DD53 6CD4DDB9619C513493D9B48D40E1C81A6FA2A4AAACE506510A1C045699862B589434ABD0E36CBDD3C6D4BFD54C1358D0 0B5BE7AD471F402674F96F5A439E72985384F166CC7B8E68CCA282C8489F1F42FC3C95A81C14165B449BDFEAB8615FAC 5B32228DB0E783DC51F76D668D1627F62592A798CCB660A80F92B3956C85E21366FAC64526832C6D80BF0D9F8B3DBB75 4BC2EF4C46110F4ACFAA233612794B5648B563BCCE90C711A79679D4671455A6915D8F988CA42D6FB97065C261504234 A20E8C3823B329D6CC0B185FC1B6DF1222C8DEC2ED9412FDCD3B201853830413B46123196DE0D3F61C77EDE81D698775 0E9CF1BC60AB316D3F651F8D28C913A0308E285B022140B6F27B193AA0FBA8B34EACF97E499049858CAD3A6D3A007611 5A6B07668AA7EB552E5AAB6BA6EC21FF5013779F871E753AB0BB89428A16AB10E32EC0289F1757900449BBA7EDD21AE6 C11079E4B34705516837307DB8AC9CD8C7F67AC150B722B0DD4480912DD23CD9C3E697EA13C4D16D537657DE842DE3E0 146BBECDA46E640D666F7B05EAD8DEDA4A22996596290A1C922F0A05C8A82F2CA3502FEE8046365C433500A197C67D24 3EB029D88F6649C2FF13D5B77E33F72FEB2D3C62959137D67CB03DB1DF5DB78041B9F6716D3FF1E1817A61B65FBA25EB FEF5D8A2B777010C1E685F759A1F2286051CDD05DA6D721508E2ABF28420428B1E6343F5E56F5482F74FF0E4ACEFC7D5 6ABD60912885F759FB6BCA346A6C8177D1FF85E9EA2B5DDDC083E2C868F4C521ABD3F375AB625ADE3B7B215EC6237F07 A5B82906C1DFE2D925CDA796A00D33E901542A0D5915969AF272C2A07E24FE7FE5C5D324C5CE0080A33C037FB566FA05 94311AB8EF7F7A7CB99AD1D9F0FE29D1F1B0706DB96DC604A8724443324346662ECEED8280F6B0CBB050F85AE7276328 2183E03093B2AD52250370AA7C5C41B57CA91D98BEC54156EE85848E8A12F422EFC7F891CE762B2609BC68E93A4E789B B38B6316465A6B1C1384DD4C3427E7D7AB4E8FE7CAFDE14913B22B6848FE7ACC7FD2589B830A288C7D3E6EA4276507C3 DAEB823C6F6243E2FBEC44DFD788DA33F652FEB662C3E8C3EF90D686E99FA284E6C29512F4AD28A9FF3DD74D295935EE 45E99C50B78FAC6A62D74E222AA5D49EFBAB2D509BBBD7A24205946D444ABD7E0EC69A3E022E31F38C20A440F44BF59E 2AD1AC986594E4C39B51A761B45A45A02B0BA54EE3B778657BE32510AA9D66E8D0FEFE25B144463D8F216B079978878B 24945629B5921861B788C6474E3AE5DBBC31274CDAF99AA68851782C9D1716BB336AF2C900D000A22F1FC66AD6F07859 EB120EC887463EDA1AD249A738C5167D5D72C27213195AD04BAEBE415D0E4198B68D0FAFAB90768614B9A518846FD67E B7871879E0D19321DA2DA00D528469E79910286E8FBF82AE30B286A6DAEA604626B2E4B47868FBE78813BFF1AB9069C6 0AD89FD62F39C5D54CFD50E9561DE63034441AB3521B72F706EEFBB953FF1F8EAECF0720D1E979E18736976C03A76714 BCAFC6561277E9104BC346EBF9C879949CBD9C2B0898E95D7D52947CA7D3BD3B8344F2AC7D1DD1E728CCEB04D10D2F64 69808486BFB71D799C8CB4E9874B37CA79B182842CEBD2D27519FB8FD79932ED914EE465387EE05DF4C59ABD75FC6AD5 1E062563461F974DE0F03C4C02464CD96450200E8EC2FAE8187DB3588F0B2C498157355BF5B467DB32CFED050166F142 80C1BA475B61DB7F4C99932976A8D60625240959D35FDFBC9EFD6D696A35867EA0C56A25AFF6CF5D9B1E73F284183509 5C8DE3B310E8DE486435DC15F351E11938EA9518BFBFF08D63CD0948F6DF7BC2BF0B9E1C535B5E670AC9286F197F4B37 A75FD9452107EF3DCB720D7CABDB47DE5CA5831F84CCE9C7C9E6301FA36BFFC794E3BDB90F647AEF5D7B45F2CAF408A0 37FD0E55DBF22129332C82921824874EC8A2DAC9B5787A0DD1A0674EC91BD5AC094351576B2960F1296A7957B03CCC8C 1D0084E77BC9BEA472A9CBC6CDC5C1BC2807049F9CB9E84A3377DB7F15E26AD52F0374F7C58FF05A3542E36C31F37512 142611205589FACCF02EC754078B8D9486D292F3808482E27815C42C2B77174E9252D9011904B91FC2F966C914643865 A8E86DC6826A1008A5168898AD9D0B2E63AB0FD6E6A13148C8AFCBE1707EB3A55FE74BDA4D7C5C5231B3D6BC77C51079 21758B40B11D410D39FA47A53FE5750D34B174C12C81D1DADD62D0489662328ACB12F181E036723A0DD9D7F41B254491 30FA109FB2EA6AFE879998D36855879941C82CCF5D066A556B847E32C4623CA28C15035555C4797AA1EEFC6DA2E962AB F2D62EDF676B5025F1911946024D7E2159C5ED42B84A555AFA05510C32AC4E3FB3E64340399FFBF6FE47624F71834BDD 3CD9ABB7AE74D44CBCA3B97E5FD9C24C902912DF1271080C214AB7497453939709CC0042DDF7AD81050655EAC4ECDE9E F70B03E9C6A60EF8EFAE7B839888980AB75CA8A9591DF24AF8B94B2E8A2CE97739359D5A306674949FA8D38BEF52006B D19B31BC3F12CFCABDD9FB45415E92098BF2489917DBA10E3CE008F91D8656DAE0667EBD68D21EB65466156A235ECA20 5DCE71F7509E7045C49DD10FF6855AC25805971C0BB6E799F4A28D68A729DCAD363B01B263053E11EDF181A4A09C7581 D00AE9859BA155C59E96DF164B42DA6091323113496791C3B3CD5594838D0D0D065BFF673670BC0E8FE6D06BD9F470CE 604B82B35FB2F7A593A6A55B09E92197C62CC3A867B178BAECE90D8AE43C7C3F6E89096328754DB26FA87F195F3511A0 9DC772E2BC12A2D4B599469E0EC7B9F067149099D9949BC033CB7E621FCBF6E4C321874DBE4B2EFA3270329C6F04477F A2F0344AFC3D7588E7018204A466DFCD55957CCB3FF2B19FAD93CE2DB970B7CFB54B85DCA54B467FEA545DCB787D27A5 F924F789F135C36C5E9E5B7DDD2AEE05F1B3282C225B664629B56F50AE62A4DFE02984C8E3CEAEA9E4602446BD73E431 152C3EACE866B58EED21B22A889832470B17715A94F9931882EF74468AC7CBEF39AC582136B56D59DBBADA53B568DDF9 FD23F8F666AD1490E00281E41B6602A4880BF3A58EE3D8250C7D10D7DCEE39263EA5CE12703314A3C6D67FF71484B05B D56FB997CF5482C540976600A90CEEC60DBED82B836295A76645F6E735482237BC9D4A8B038E9D516CAD82168B66AE97 8EBD6A98126A81D10FD881B9F317F5D02840ECC23A58170C684B25FC6075172F65883D9D55EF94EE1E9AE3498D6F7ABD 45F7CD47D53EEF52B7190E3EDEECBD474A580BEDCA7FE8486639966DD761A87557DEE42970C8B70DFC66B685B31667EE AECFE93E08DD9B7A5C22752C6C0149903E1614DAC1034257C703AF6A7D8173400FF0879E0B1DBB44D617EF526A5EA217 7B18DB21A03B9A05EF020835BAF98BB6DFFF1DD15CBB75E16CFFEB450C38ACABE92069AB47B020C2C5C7E1E84D197FF8 1B3145834AAFD91CD225DCC2D6426FDB740A81884ED728D3FFA2F76B7A77446977B16DE84B6410559D8FF63CC2B4B887 75CB03DC4D5F06742904A2B7D00A2A88A1EA311903ED65FB631CA347F18A1F88393168A6CB3895A349A1BC7B3041A3A8 6B517E2F0729194D4F991FB6226DD5E1A8AD446F2D14B1678DF386235794AFA56EEAE9B133AD3F1617E53B0260B6AFD6 C19DFD17F12E5B359A111A1D3DEA47793C938DDA1298BFB31DA1A591E469E00EDB6AA9C9E66DCFAEF68CA01BECA5E5A5 E7CDE89E673580747D41623064B9DFB087DFFDCFABA81BDC0A8A11A5EB487CDFB58771416AF6BD870F165B8F18BCAA15 161BD2A4A94128BF61BEBB181478623B2D746BD619BB7FF524CD47AEDE1DB5239F0328AD3DF293FFF94B9AEEFBBAB856 E9A8787612CB956A35BD16C1B3659AD88C6E68B5EE315488C1042A6C201B8748C1016272162EEB52386D16253A4AD97D 5A29A2E069D525B19A5462977F970BC7884C6DC9C616A2A50D8FB0A2E074138F5531C5AE2A726E0E7B42645B4374EDC6 4CA47E80F586289FEB98BE73E2EF7801BEAA79C680C5FE71EE997B0351E01D78EBCB049B92EEFDAF0A61B6588581E0FC 2D972CF02A7975101779751E1E43CD9B6E8D60B982F22242EFAAFCCD71BCEA418F2926916FB3093335BB237C0A79BF14 67648C0CDA984AA90F6987010FD93026CE81DC0EEDE2B8055BFEF755360E023D9933F6AE6F690EB82FB628D6F6DD0F4E 509B7AE254A45FB351FD0BE79E9ED3F60DA00D595F035AC98894F26EE0ED6B7427990DC333B197A92FF0EAED66382B09 BFD0251FD1A257E255AB27BE54ECFCB30C33E13753BE70E4B8E68A3EF625B04020D8EA16F5FB4C4D3527444BB6EBC534 8E509CE7EACCEDFB2FC99A28463BEF637C4ADD96ECB6A6626E5FDE94658B8F97480B15C50A9B5A2620DFA7E57FA7EDCF 1ACC254863B2458E029C20642C62A8898EBB92BCD70F60FB87D43ACAE1934231459F3530439700E9346F6896D802E29D 17E3A4376C2FB5A0077CE8149BBE482D686641B26402E06F5CC2C7531B266464AB39805FBBC1D7954C53E337F83182A0 B1025D26A526ED690F9239CC8B345B6EEC695594A2FB3494810D4B4DF2D028668FC8B9D69D250CCA69A117FAEB99C6FB 4D8319F5FA268D16C5854C0E3F4D0C84C8AF2BD27CF2A5730DB15373FEC59A610FA4004E8F00BD7F299DE848C4F18A10 7955319D475E1E46D3D5F4FC88334BDBF156F951423C4EDB0BC61B5534D75818BD1AF6AB64968598BDFAA972ED1B8068 22B6D90BAB1C735A2C577BD9D2C129262217A583E19D8C7CAFE5220065F7029F31DE786B67C97B75FE843C746158ECC3 FA546F2DFF067438F48DCFB33D98A842AEE2A8E6322F1EA0ADD0780323FE976D9EC86879EF3C02D54FEAF1D0DEF360F4 98DEC028FF4F42A6ED46BEEC791E3BAD2BFF1B4B14EA91628B7957E89D9B792184EA24C79AB680495159BAC9A8714202 1C305AF6EF78336A3ADC070FD510C645361900BB56309CF1CE3A9F880005CF821C0B3CDBFB99DCC8E7BAC1CEA19E7B3F 4AD5AD33E9D4B9259E687E26035BA9475FF550F72A28B21AD5FFC3D23DE77530CC9ED6E60CD16206A84A8C8C50F24652 052960D0491F9F7E2EDE1D2E19EEA4DD8639913D92739D30297F511E7E4C87DA22E59DD6ADCAF8630DD9D146F0CF95FD 463E8D18319FEADB8A42D7D8ECC69FF1BDF0792787044FF1FB7D1D3388017CA45DBB843ED88C69986E238ACC3A750E94 CFD54274EF7544F1CEF155BF6AD3B2BE60B2F69B0DE872C6AEFB1C569C514A959D17C1EF4364C1EDC7B5E7D74025CAA7 C31C259027BD94055A972F724F6299B2FA86333604AC7ED8ACA622EBBB78D13537131423CD96480915C73872BC1B0D93 A765112254981C4D90E689CCAB6D979E784D22B1BB71DA7838B9F81A21C7CDA0140C6AFEACDE53A5CBF260054110F432 90AD13F8CCCF86F548DD2C6EB1738A03E9C22A69399FB314A5667CE7E3387761E3B1A44B053AAEC23E364299D1E9F820 D2B1C9B1598B2E6846EF2C232C24B38E5EE5C87616E4F0A79EE160FB17F9AD15E80F0E67012E6D6B2F3B32603F4DB75C C7E04CF191AEBA5EE2B052CA1A798313ABCFCE165A1548642CEF43A6A6E6D210FE83A77C9326E5AD451A4FB1ED4C8A75 F87CC72411BE33F7C47D29392AC2A1E6CF01EDEF0DB1B2A768FCBA71B3434B872E070B2B42407A77487E28E2D8809920 C0A7C161F311486D4AA5342783DF88F44B9F9CC1F4DF5E9BB7F1CF36C795C01396115D3D6BE3047B8275E98F7A7C07FC 54114B71D4C5C344DB6DF9FBDFE0BD499A60D93C87A365E30E0927C1199759D515A02261F4032D2B0E2DA0ED8CA20CE7 D6A1D090F6B68CBDB73614EDFC442F74C32DA4EEFBB8CF62AB00AB5CF090A4F920AB13C15F8B02DCB19B48CC93FB125D C585F7337A8AB39DE0BD16B6DF3B551910E8A8611310930EEAA5FC877D2E73E049896F01C1A481E945FD898A7133E4D2 C8319B283B12CB01DD50011DDB41020F80051438CE66460C76F2377E0133DE97F6D7E20568AA7B4A28AF833759DEFCEA B56E125A66F00F713909C3DB5EA2AC77716800A026EEE3466CC4717D3A1F57A8FC6ABCFFE19B8ABA0E755A8BB04FF5BF F6E7B6882AAAB2FD80D2C71B855EEB2F41249CC5A3B30B63C8E30843B992841697C14CE4E0BC1EE0E3CE6C6E3867FB92 AF1FE2089868404E3D4BF6A48F27AF2EE64A9735A07219444E3505047198D0DF38973CE3A6DFB3036FDD867C2FCA1C95 5967625EB4A6 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %!FontType3-1.0: HiraKakuProN-W3 19 dict dup begin /FontType 3 def /FontMatrix matrix def /FontBBox {0 0 0 0} readonly def /PaintType 0 def /StrokeWidth 0 def /BuildGlyph{save 3 1 roll 1 index dup begin /ShowProc get 3 1 roll 1 index /CharProcs get exch get exec 7 -1 roll exec end restore } bind def /BuildChar{1 index /Encoding get exch get 1 index /BuildGlyph get exec} bind def /$SP{3 -1 roll dup /SetupSubFont get exec dup setfont exch 0 0 2 index stringwidth } bind def /$SPW{4 -1 roll dup /SetupSubFont get exec dup setfont 3 1 roll 0 0 0 4 2 roll} bind def /$SPTW{5 -1 roll dup /SetupSubFont get exec dup setfont 4 1 roll neg 0 3 -1 roll 0} bind def /$RP{6 -1 roll dup /SetupSubFont get exec dup setfont 5 1 roll translate -90 rotate 0 0 0 4 2 roll} bind def /SetupSubFont{dup /PaintType get 1 index /StrokeWidth get 3 -1 roll /$SubFontArray get 4 1 roll 3 index 3 index get dup /PaintType known{dup /PaintType get}{0}ifelse 1 index /StrokeWidth known{1 index /StrokeWidth get}{0}ifelse 3 index ne exch 4 index ne or {dup length 2 add dict begin {1 index /FID eq {pop pop}{def}ifelse}forall /StrokeWidth exch def /PaintType exch def currentdict end dup /CIDFontName known {/Anonymous exch /CIDFont defineresource}{/Anonymous exch definefont}ifelse dup 4 1 roll put }{ pop pop pop get}ifelse } bind def /ShowProc{systemdict /rectfill known {0 setcachelimit}if 6 -1 roll dup /FontMatrix get exch /FontBBox get aload pop 4 index transform 4 2 roll 5 -1 roll transform 4 2 roll setcachedevice moveto dup type /stringtype eq {show}{glyphshow} ifelse } bind def /FontInfo 4 dict dup begin /Registry (Adobe/) def /Ordering (Japan1/) def /Supplement 6 def end readonly def /FontName /HiraKakuProN-W3 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /uni672C.3722 put dup 34 /uni5BB6.1352 put dup 35 /uni0047.40 put dup 36 /uni0043.36 put dup 37 /uni0020.1 put dup 38 /uni0072.83 put dup 39 /uni0065.70 put dup 40 /uni0070.81 put dup 41 /uni006F.80 put dup 42 /uni0073.84 put dup 43 /uni0069.74 put dup 44 /uni0074.85 put dup 45 /uni0079.90 put dup 46 /uni0062.67 put dup 47 /uni002D.14 put dup 48 /uni0034.21 put dup 49 /uni002E.15 put dup 50 /uni0033.20 put dup 51 /uni0035.22 put dup 52 /uni0030.17 put dup 53 /uni0036.23 put dup 54 /uni0063.68 put dup 55 /uni0061.66 put dup 56 /uni0075.86 put dup 57 /uni0068.73 put readonly def /$SubFontArray [/AAAAAB+HiraKakuProN-W3 findfont /AAAAAC+HiraKakuProN-W3 findfont /AAAAAD+HiraKakuProN-W3 findfont ] def /CharProcs 27 dict dup /uniFFFD.0 {(\000) 0 $SP} 2 index /.notdef 2 index put put dup /uni0020.1 {(\000) 2 $SP} put dup /uni002D.14 {(\001) 2 $SP} put dup /uni002E.15 {(\002) 2 $SP} put dup /uni0030.17 {(\003) 2 $SP} put dup /uni0033.20 {(\004) 2 $SP} put dup /uni0034.21 {(\005) 2 $SP} put dup /uni0035.22 {(\006) 2 $SP} put dup /uni0036.23 {(\007) 2 $SP} put dup /uni0043.36 {(\010) 2 $SP} put dup /uni0047.40 {(\011) 2 $SP} put dup /uni0061.66 {(\012) 2 $SP} put dup /uni0062.67 {(\013) 2 $SP} put dup /uni0063.68 {(\014) 2 $SP} put dup /uni0065.70 {(\015) 2 $SP} put dup /uni0068.73 {(\016) 2 $SP} put dup /uni0069.74 {(\017) 2 $SP} put dup /uni006F.80 {(\020) 2 $SP} put dup /uni0070.81 {(\021) 2 $SP} put dup /uni0072.83 {(\022) 2 $SP} put dup /uni0073.84 {(\023) 2 $SP} put dup /uni0074.85 {(\024) 2 $SP} put dup /uni0075.86 {(\025) 2 $SP} put dup /uni0079.90 {(\026) 2 $SP} put dup /uni5BB6.1352 {(\000) 1 $SP} put dup /uni672C.3722 {(\001) 1 $SP} put def end dup /FontName get exch definefont pop %RBIEndFontSubset /HiraKakuProN-W3 cguidfix /F1.1/HiraKakuProN-W3 renmfont %RBIBeginFontSubset: Helvetica @@ -756,19 +756,19 @@ -30.396 11 m (&'\(\)*+,\)&-)[ 5.160000 7.056000 7.764000 7.500000 6.444002 2.855999 4.704000 7.499998 5.159998 0.000000 ] xS 1.5 0 0 -1.5 407.25 469.5 cm --12.948 -7 m -($.$%)[ 9.072001 7.752000 9.072001 0.000000 ] xS +-28.691999 -7 m +($.$/#$$)[ 9.072001 7.752002 9.072001 4.296000 9.048002 9.072001 0.000000 ] xS -30.396 11 m (&'\(\)*+,\)&-)[ 5.160000 7.056000 7.764000 7.500000 6.444002 2.855999 4.704000 7.499998 5.159998 0.000000 ] xS 1.5 0 0 -1.5 74.25 466.5 cm -14.754 2 m -(/0/01)[ 7.932001 2.880000 7.932001 2.880000 0.000000 ] xS +(01012)[ 7.932001 2.880000 7.932001 2.880000 0.000000 ] xS 1.5 0 0 -1.5 74.25 361.5 cm -14.73 2 m -(/0203)[ 7.932001 2.880000 7.884001 2.880000 0.000000 ] xS +(01314)[ 7.932001 2.880000 7.884001 2.880000 0.000000 ] xS 1.5 0 0 -1.5 74.25 255 cm -14.73 2 m -(/0403)[ 7.932001 2.880000 7.884001 2.880000 0.000000 ] xS +(01514)[ 7.932001 2.880000 7.884001 2.880000 0.000000 ] xS 1 w 1 J 1 j @@ -863,16 +863,16 @@ 0 i 1.5 0 0 -1.5 191.25 433.5 cm -18.906 2 m -(5&'6,')[ 6.936000 5.160001 7.055999 6.900001 4.704000 0.000000 ] xS +(6&'7,')[ 6.936000 5.160001 7.055999 6.900001 4.704000 0.000000 ] xS 1.5 0 0 -1.5 191.25 318 cm -14.424 2 m -(5\)\(-)[ 6.936000 7.500001 7.764001 0.000000 ] xS +(6\)\(-)[ 6.936000 7.500001 7.764001 0.000000 ] xS 1.5 0 0 -1.5 191.25 210.75 cm -14.424 2 m -(5\)\(-)[ 6.936000 7.500001 7.764001 0.000000 ] xS +(6\)\(-)[ 6.936000 7.500001 7.764001 0.000000 ] xS 1.5 0 0 -1.5 329.25 379.5 cm -18.906 2 m -(5&'6,')[ 6.936000 5.160001 7.055999 6.900001 4.704000 0.000000 ] xS +(6&'7,')[ 6.936000 5.160001 7.055999 6.900001 4.704000 0.000000 ] xS 1 J 1 j 0.60000002 i @@ -903,7 +903,7 @@ 0 i 1.5 0 0 -1.5 332.25 252 cm -14.514 2 m -(\(7*8)[ 7.764000 7.416000 6.444001 0.000000 ] xS +(\(8*9)[ 7.764000 7.416000 6.444001 0.000000 ] xS 1 J 1 j 0.60000002 i @@ -934,7 +934,7 @@ 0 i 1.5 0 0 -1.5 330 148.5 cm -14.514 2 m -(\(7*8)[ 7.764000 7.416000 6.444001 0.000000 ] xS +(\(8*9)[ 7.764000 7.416000 6.444001 0.000000 ] xS ep end %%Trailer diff -r db9735be2bf1 -r 8bf53f6b1256 Paper/nobu-prosym.tex --- a/Paper/nobu-prosym.tex Mon Nov 21 06:55:07 2011 +0900 +++ b/Paper/nobu-prosym.tex Mon Nov 21 07:12:43 2011 +0900 @@ -1,1 +1,1 @@ -\documentclass[private]{ipsjpapers} %\documentstyle{ipsjpapers} \usepackage[dvipdfmx]{graphicx} \usepackage{url} \usepackage{multirow} %% tabularの上下の結合 \usepackage{slashbox} %% tabularでの斜め線 \usepackage{listings} \usepackage{jtygm} % 巻数,号数などの設定 %\setcounter{巻数}{41} %\setcounter{号数}{6} %\setcounter{volpageoffset}{1234} %\受付{12}{2}{4} %\採録{12}{5}{11} \pagestyle{empty} % ユーザが定義したマクロなど. \makeatletter \let\@ARRAY\@array \def\@array{\def\<{\inhibitglue}\@ARRAY} \def\<{\(\langle\)} \def\>{\(\rangle\)} %\def\|{\verb|} \def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline} \def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\} \def\LATEX{\iLATEX\Large} \def\LATEx{\iLATEX\normalsize} \def\LATex{\iLATEX\small} \def\iLATEX#1{L\kern-.36em\raise.3ex\hbox{#1\bf A}\kern-.15em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX} \def\LATEXe{\ifx\LaTeXe\undefined \LaTeX 2e\else\LaTeXe\fi} \def\LATExe{\ifx\LaTeXe\undefined \iLATEX\scriptsize 2e\else\LaTeXe\fi} \def\Quote{\list{}{}\item[]} \let\endQuote\endlist \def\TT{\if@LaTeX@e\tt\fi} \def\CS#1{\if@LaTeX@e\tt\expandafter\string\csname#1\endcsname\else $\backslash$#1\fi} %\checklines % 行送りを確認する時に使用 \begin{document}%{ % 和文表題 \title[Continuation based C の GCC 4.6 上の実装について]% {Continuation based C の GCC 4.6 上の実装について} % 英文表題 \etitle{The implementation of Continuation based C Compiler on GCC 4.6} % 所属ラベルの定義 \affilabel{URYUKYU}{琉球大学\\University of the Ryukyu} % 和文著者名 \author{大城 信康\affiref{URYUKYU}\nomember\and 河野 真治\affiref{URYUKYU}\member{19841765}} % 英文著者名 \eauthor{Nobuyasu Oshiro\affiref{URYUKYU}\and Shinji Kono\affiref{URYUKYU}} % 連絡先(投稿時に必要.製版用では無視される.) \contact{大城 信康\\ 〒903-0213 沖縄県中頭郡西原町字千原1番地\\ 琉球大学 情報工学科\\ TEL: (098)895-8723\qquad FAX: (098)895-8727\\ email: dimolto@cr.ie.u-ryukyu.ac.jp} % 和文概要 \begin{abstract} GCC-4.6 をベースとした CbC コンパイラの実装を行った. CbC のコンパイラは GCC-4.2 ベースのコンパイラが2008年に開発されており, 以来 GCC のアップデートにあわせて CbC のコンパイラもアップデートが行われてきた. 本論文では GCC-4.6 への CbC の具体的な実装について述べる。 %当研究室では継続を基本としたプログラミング言語 Continuation basede C (以下CbC) を開発している. %また,CbC 自体の開発と共に CbC のコンパイラの開発も行っている. %お陰で GCC の最適化やデバッグの機能を CbC のプログラミングで扱うことができるようになった. \end{abstract} % 英文概要 \begin{eabstract} We implemented Continuation based C Compiler on GCC-4.6. CbC Compiler on GCC-4.2 was developed on 2008. Since then we kept to update it. In this paper, we introduce implemented Continuation based C Compiler on GCC-4.6. %Continuation based C is programming language. It is developing our laboratory. \end{eabstract} % 表題などの出力 \maketitle \thispagestyle{empty} % }{ % 本文はここから始まる \section{歴史的経緯} %当研究室では, 継続により処理を行うプログラミング言語 Continuation based C (以下CbC) を開発している. %CbC の構文は C と同じであるが,継続によりループ制御や関数コールが取り除かれる. 当研究室ではコードセグメント (Code Segment) 単位で記述するプログラミング言語 Continuation based C (以下CbC) を開発している. コードセグメントは並列実行の単位として使うことができ, プログラムの正しさを示す単位としても使用することができる.これにより, Many Core での並列実行を高い性能と高い信頼性で実現することができると考えている. CbC のコンパイルには元々 Micoro-C 版の独自のコンパイラを用いていたが, 2008年の研究において GCC-4.2 ベースの CbC コンパイラが開発され, 2010年には GCC-4.4 へとアップデートが行われた. GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった. %以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている. %今回,CbC コンパイラを GCC-4.6 へとアップデートを行った. %本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる. だが, GCC をベースとした CbC のコンパイラ (以下 CbC-GCC)は, GCC のアップデートに合わせて変更する必要がある. 本研究では, GCC-4.5.0 をベースとしていた CbC-GCC を GCC-4.6.0 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う. % }{ \section{Continuation based C (CbC)} CbC のプログラムはコードセグメント毎に記述され, コード間をgoto(軽量継続)により処理を移る. 構文は C と同じであるが, ループ制御や関数コールが取り除かれる. %Continuation based C (以下CbC) は当研究室で開発しているプログラミング言語である. %構文は C と同じであるが,ループ制御や関数コールを取り除き継続(goto)を用いている. %また,コードセグメント単位で処理を記述するという特徴がある. %図\ref{fig:cs}は CbC におけるプログラムの処理の流れを表している. \subsection{継続(goto)} コードセグメントの記述は C の関数の構文と同じで, 型に ``\verb+__code+'' を使うことで宣言できる. コードセグメントへの移動は ``goto'' の後にコードセグメント名と引数を並べて記述することで行える. 図\ref{fig:cs}はコードセグメント間の処理の流れを表している. %コードセグメントへと移った処理は C の関数と違って呼び出し元の関数に戻ることはない. %コードセグメントは自身の処理が終えると goto により次のコードセグメントへと処理に移る. %この goto によるコードセグメント間の移動を継続と言う. %継続の実態は jmp による関数の移動となる. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/codesegment.eps}} \end{center} \caption{コードセグメント間の継続(goto)} \label{fig:cs} \end{figure} \subsection{コードセグメント(code segment)} コードセグメントは C の関数と違って返り値を持たず, 処理が終われば次のコードセグメントへと処理を移る. C において関数呼び出しを繰り返し行う場合, 呼び出された関数の引数の数だけスタックに値が積まれていく. だが, 返り値を持たないコードセグメントではスタックに値を積んでいく必要な無く, スタックは変更されない. 軽量継続により並列化, ループ制御, 関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる. 図\ref{fig:factorial}は CbC で書いたプログラムの例である. 与えられた数 x の階上を計算して出力するプログラムとなっている. \begin{figure} \begin{footnotesize} \lstinputlisting[language=c]{source/factorial.cbc} \caption{階上を計算する CbC プログラムの例} \label{fig:factorial} \end{footnotesize} \end{figure} \section{GCCの3つの内部表現} GCC-4.6 への実装の前に,GCC で扱われる3つの内部表現について触れておく. GCC は内部で Generic Tree, GIMPLE Tree, RTL という3つの内部表現を扱う. それぞれが 読み込んだソースコードは Generic Tree, GIMPLE Tree, RTL の順に変換されていき, 最後にアセンブラ言語へと出力される. 図\ref{fig:ir}は GCC がソースコードを読み込みアセンブラ言語出力までの流れを表した図である. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/ir.eps}} \end{center} \caption{GCC によるコンパイルの一連の流れ} \label{fig:ir} \end{figure} \subsection{Generic Tree} ソースコードより読み込んだ関数の情報を木構造で表したものが Generic Tree となる. 関数の戻値,引数,変数の型,条件式とプログラムの処理全てが木構造で表される. CbC の実装では parse の部分からこの Generic Tree 生成の部分に手が加わっている. \subsection{GIMPLE Tree} Generic Tree で表現されたデータは GIMPLE Tree に変換される. GIMPLE Tree は Generic Tree より制約がかかった状態で作成された構文木となる. 制約は「1つの枝に4つ以上の子を持たせない」等といったもので, GIMPLE Tree へと変換されたデータは Generic Tree より簡単な命令で表されることになり最適化がかけやすくなる. CbC の実装では特に修正は加えていない. \subsection{Register Transfer Language (RTL)} GIMPLE Tree は解析が行われた後 RTL へと変換される. RTL はレジスタの割り当てといった低レベルの表現で,アセンブラとほぼ同じ表現を行うことができる. プログラム内部では RTL も木構造で表される. CbC における継続は,この RTL への変換で行われる最適化の1つ Tail Call Elimination が重要となってくる. \section{GCC-4.6 への実装} 前節までで CbC の基本仕様と GCC でのアセンブラ出力までの流れを確認した. ここからは GCC-4.6 への実装について述べていく. \subsection{``\_\_code'' のパース} C の予約後は \verb+gcc/c-family/c-common.c+ の \verb+c_common_reswords+ 構造体で定義されている. ここに,図\ref{fig:code-parse}のように \verb+__code+ 型の登録を行う. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/code-parse.eps}} \end{center} \caption{\_\_code のパース} \label{fig:code-parse} \end{figure} これで \verb+__code+ は \verb+RID_CbC_CODE+ として判定されるようになる. 次に, id を用意する. Genric Tree が生成されるデータは一度 \verb+c_declspecs+ 構造体に保存される. そこに登録するコードセグメント判定用 id ``\verb+cts_CbC_code+'' を用意する. これは gcc/c-Tree.h で定義される(図\ref{fig:code-id}). \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/code-id.eps}} \end{center} \caption{cts\_CbC\_code の定義} \label{fig:code-id} \end{figure} 後は\verb+c_declspecs+ 構造体にこの id を登録する. id の登録は \verb+declspecs_add_type+ 関数の中で行われる(図\ref{fig:regi-id}). \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/regi-id.eps}} \end{center} \caption{id の登録(declspecs\_add\_type 関数)} \label{fig:regi-id} \end{figure} 図\ref{fig:regi-id} のプログラムは void 型の id 登録を元に作られている. 違うところは \verb+cts_CbC_code+ を登録するところだけである. 最後に, \verb+finish_declspecs+ 関数にて id 毎に Tree タイプの決定をする. コードセグメントは void 型として扱ってもらうために \verb+void_type_node+ を Tree のタイプと して登録している(図\ref{fig:regi-node}). \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/regi-node.eps}} \end{center} \caption{declspecs\_add\_type 関数} \label{fig:regi-node} \end{figure} \subsection{goto シンタックスの追加} 通常 goto のシンタックスは ``goto ラベル名;'' となっている. CbC では通常の goto に加え ``goto cs();'' の形でコードセグメントを呼び出すシンタックスを追加する必要がある. 図\ref{fig:rid-goto}は, 追加した goto のシンタックスである (通常のシンタックスは省いてある). \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/rid-goto.eps}} \end{center} \caption{goto へのシンタックスの追加} \label{fig:rid-goto} \end{figure} %具体的には, 読み込んだ CPP_NAME が関数の場合の処理を追加した. 具体的には void 型の Tree を作成している.加えてコードセグメントと判定するフラグ と Tail Call のフラグ を付けた関数とした Tree となる. %の作成を行なっている. \verb+cbc_replace_argments+ 関数と \verb+c_finish_return+ 関数の動作については CbC においても重要になるので後に詳しく説明する. \subsection{Tail Call Elimination} CbC の継続の実装には GCC の最適化の1つ, Tail Call Elimination (末尾除去) を強制することで実装する. これにより, コードセグメント間の移動を, call ではなく jmp 命令で実現する. %Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に, %call ではなく jmp を用いることができるという最適化である. 図\ref{fig:continue}は Tail Call Elimination が行われた際のプログラムの処理を表している. \begin{figure}[htpb] \begin{center} \scalebox{0.30}{\includegraphics{figure/continuation.eps}} \end{center} \caption{Tail Call Elimination} \label{fig:continue} \end{figure} funcB は jmp 命令で funcC を呼び出す. funcC は, 戻値を funcB ではなく funcA へと返すことになる. \subsubsection{expand\_call} \verb+expand_call+ 関数は, 関数を表す Tree から RTL を生成する関数である. Tail Call Elimination を行えるかどうかもこの関数で判断される. 内部でチェックされる Tail Call Elimination の条件は以下になる. %\verb+expand_call+ 関数内でチェックされる Tail Call Elimination が行える条件は以下になる. %\begin{itemize} \begin{enumerate} \item caller 側と callee 側の戻値の型が一致している. \item 関数呼び出しがリターンの直前に行われている. \item 呼出先関数の引数に用いられるスタックサイズが呼出元関数のそれより少ない. \item 引数の並びのコピーに上書きがない. \end{enumerate} %\end{itemize} CbC の実装では上記の条件を,以下の様にして解決させている. \begin{enumerate} %\begin{itemize} % \item コードセグメントは void 型で統一する. Cの関数からコードセグメントに goto する場合は返す値の型チェックを行わない. \item コードセグメントは void 型で統一する. 最適化(-O2)の強制付与. \item goto の直後に retrun を置く. \item スタックサイズは関数宣言時に決まったサイズにする. \item 引数は一旦, 一時変数にコピーして重なりがないようにする. %\end{itemize} \end{enumerate} %1 については自明だろう.コードセグメントは戻値を持たない為 void 型の扱いになる. %2, 3 と 4 については以下で詳しく説明を行う. 戻値を持たない為, コードセグメントを void 型で統一するのは自明だろう. 最適化の強制付与及び 2, 3 と 4 については以下で詳しく説明を行う. \subsubsection{末尾最適化の強制付与} Tail Call Elimination は C のプログラムにおいて末尾最適化を有効にすることで行われる. 以前の CbC-GCC の実装では \verb+expand_call+ 関数を元にした \verb+expand_cbc_call+ 関数を作成して, 条件をクリアするようにしていた. しかし, その方法では \verb+expand_call+ 関数が改良される度に \verb+expand_cbc_call+ 関数にも 変更を加える必要があり, 手間となっていた. そこで, 最適化フラグを強制的に付与させることで \verb+expand_cbc_call+ 関数を取り除くことに 成功した(図\ref{fig:tail_call}:2行目). \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/tail_call_flag.eps}} \end{center} \caption{コードセグメントの末尾最適化の付与} \label{fig:tail_call} \end{figure} \verb+expand_call+ 関数内では, Tail Call Eliminatino にかけるためのフラグ, \verb+try_tail_call+ 変数があり, コードセグメントはこのフラグには初め 1 がセットされている. コードセグメントの時はこの \verb+try_tail_call+ 変数に 0 を代入させないように実装を行った. また, 万が一 \verb+try_tail_call+ 変数に 0 を代入された時の為にフラグに 1 を代入するコードの挿入も行った. これにより末尾最適化の強制付与がなされた. \subsubsection{goto の直後に return の配置} 図\ref{fig:factorial}のコードセグメント factorial0 をlisting\ref{code:return}の様に, goto の直後に return を 置く必要がある.だがそれをプログラマが記述することは実用的でない. \begin{figure}[h] \begin{footnotesize} \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=goto の直後に return を置く,label=code:return] __code factorial0(int prod, int x) { if ( x >= 1) { goto factorial0(prod*x, x-1); return; }else{ goto print_factorial(prod); return; } } \end{lstlisting} \end{minipage} \hfill \end{footnotesize} \end{figure} CbC では Generic Tree の生成時に継続の直後に return を自動で組み込むことで解決している. 図\ref{fig:rid-goto}の\verb+c_finish_return+ 関数がそれにあたる. %goto でコードセグメントの継続を行うプログラムの直後に return を表す情報を Generic Tree に追加を行う. \subsubsection{スタックサイズの固定化} CbC では継続によりスタックに値が積まれていくということはない為サイズを固定することができる. また, サイズが固定な為, スタックポインタを変えずにスタックを扱うことができる. これも CbC の1つの特徴である. 図\ref{fig:cs_stack}はコードセグメントの継続の際にスタックに積まれる引数を表している. \begin{figure}[htpb] \begin{center} \scalebox{0.30}{\includegraphics{figure/cs_stack.eps}} \end{center} \caption{継続による引数のスタック格納の様子} \label{fig:cs_stack} \end{figure} %GCCでは, この他にもTCEを禁止するルールがあり, GCC-4.5, 4.6 でも %Tail Call Elimination にかからないコードセグメントがある. %この点を改善する必要がある. %\subsection{引数の一時変数への避難} %\subsection{スタック書き換えの問題} \subsubsection{引数の並びの上書きコピー} CbC の継続では, 引数渡しでスタックを入れ替える為値が書き換えられる可能性がでてくる. 例えばlistlising\ref{code:cs_prog}のような継続である. \begin{figure}[h] \begin{footnotesize} \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=スタックの上書きが起こる継続の例,label=code:cs_prog] __code cs_a(int a, int b) { goto cs_b(b, a) } \end{lstlisting} \end{minipage} \hfill \end{footnotesize} \end{figure} \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/cs_prog.eps}} \end{center} \caption{スタック書き換えの問題} \label{fig:cs_prog} \end{figure} この時のスタックの様子を表したのが図\ref{fig:cs_prog}となる. 数字の 1 と 2 は \verb+cs_b+ の引数をスタックに乗せる順を表している. CbC ではこの問題を一時変数に引数の値を代入することで問題を解決している. \subsubsection{一時変数へのコピー} 一時変数へのコピーは, goto が行れるコードセグメントの Generic Tree を生成時する時に行われる. 図\ref{fig:cbc_replace}に示す \verb+cbc_replace_arguments+ 関数が実際のコードとなる. %\begin{figure} %\lstinputlisting[language=c]{source/cbc_replace_arguments.c} %\caption{引数の一時変数へのコピー} %\label{fig:cbc_replace} %\end{figure} \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/cbc_replace.eps}} \end{center} \caption{引数の一時変数へのコピー} \label{fig:cbc_replace} \end{figure} 具体的には, 内部で以下の事が行われている. \begin{itemize} \item 引数と同じ型の一時変数を作成 \item 一時変数に引数の値を代入 \item 関数に渡す引数のポインタを一時変数に変更 \end{itemize} Tree call は継続を行うコードセグメントを指す. コードセグメントに渡された引数の情報を抜き出す部分が \verb+FOR_EACH_CALL_EXPR_ARG+ である. \verb+tmp_decl+ という一時変数を作り,最後に \verb+CALL_EXPR_ARG+ を使って引数の情報が入っていた ところへ一時変数を入れている. \subsection{環境付き継続} CbC には通常の C の関数からコードセグメントに継続する際, その関数から値を戻す処理への継続を得ることができる. これを環境付き継続という. これらは, 以下の二種類の CbC で定義した特殊変数である. \verb+__environment+ は, 環境を表す情報である. \verb+__return+ は, これを環境付き継続の行き先であり, 関数の戻値と \verb+__environment+ の二つの引数を持つ コードセグメントである. 例えば, 以下のように使うと, \verb+main()+ は 1 を返す. \begin{verbatim} __code c1(__code ret(int,void *),void *env) { goto ret(1,env); } int main() { goto c1(__return, __environment); } \end{verbatim} GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す. 戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:_ret_val}). \begin{figure}[h] \begin{footnotesize} \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=環境付き継続を行うコード,label=code:_ret_val] __label__ _cbc_exit0; static int retval; void _cbc_internal_return(int retval_, void *_envp){ retval = retval_; goto _cbc_exit0; } if (0) { _cbc_exit0: return retval; } _cbc_internal_return; \end{lstlisting} \end{minipage} \hfill \end{footnotesize} \end{figure} \subsubsection{環境付き継続の問題} 現在環境付き継続は このコードを GCC 内部で生成することで実現している. これは正しく動作しているが, \verb+retval+に static を指定してしまうと, スレッドセーフな実装でなくなる. これを通常の変数にすると, 関数内の関数は closure として実装される. しかし, GCC 4.6 と Lion の 組合せでは closure は正しく動作してないことがわかった. Thread local 変数を用いると, やはり closure が出力されてしまう. 本来, 戻値用のレジスタが使用されれば問題ないが, 戻値の型は整数やポインタとは限らず, 浮動小数点や構造体自体である可能性があり複雑である. 一つの解決策はレジスタ渡しと考えているが, 他の方法もありえる. 少し重いが setjmp を用いた実装方法もある. \subsection{引数渡し} 通常コードセグメントの継続において, 引数は C の関数と同じスタックを用いて渡される. GCC には引数渡しをスタックではなくレジスタを用いて行う機能として fastcall がある. fastcall を用いてコードセグメント間を継続することで, 速度の向上を図る. \subsubsection{fastcall} C において fastcall を用いる場合は関数にキーワード ``\verb+__attribute__ ((fastcall))+'' をつけて行う. だが, コードセグメントを全てこのキーワードをつけて宣言することは実用的ではない. そこで, コードセグメントで宣言された場合, fastcall が自動で付くように実装を行う. 図\ref{fig:fastcall}はコードセグメントの生成を行なっているコードである. %\lstinputlisting[language=c]{source/fastcall.c} \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/fastcall.eps}} \end{center} \caption{コードセグメントへのfastcall属性付与} \label{fig:fastcall} \end{figure} 13,14 行目が fastcall 属性を付与している部分になる. if 文で条件を決めているのは, 64 bit の場合 fastcall が標準で行われていて, warning を出すからである. \subsection{typedefrecの実装の構想} C では関数や構造体の宣言の時に自分自身を引数にすることができない。 そこで ``typedefrec'' という構文を作り、図\ref{code:typedefrec}のような宣言を行えるようにしたい。 %C を基本としている CbC には型推論がない. \begin{figure}[h] \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=typedefrecの例,label=code:typedefrec] typedefrec void *funcA(int, funcA); typedefrec struct { NODE left; NODE right; } *NODE; \end{lstlisting} \end{minipage} \hfill \end{figure} typedefrec によりコードセグメントは自分自身に戻る構成ができるようになる. より柔軟なプログラミングが行えるように typdefrec の実装を行う予定である. \section{評価} 今回実装を行った GCC-4.6 ベースのコンパイラを GCC-4.4 ベース, Micro-C コンパイラとそれぞれ比較を行った. 比較を行うのはクイックソートのプログラムである. %クイックソートは再帰的にプログラムされる為 CbC に向いている %プログラムだと言える. クイックソートは再帰的なプログラムな為スタック操作が行われる. 比較を行うのは以下のアーキテクチャと OS になる. %\begin{description} \begin{itemize} \item x86/Linux \item x86/OS X \end{itemize} %\end{description} また,比較を行うプログラムは最適化(-O0 オプション)を行わないものと, 速度最適化(-O2 -fomit-frame-pointer)を行うものの2つ, それと -m32 オプションと -m64 オプションをつけたものそれぞれで行う. 表\ref{tab:speed-mc-vs-gcc-nonopt}が最適化無し, 表\ref{tab:speed-mc-vs-gcc-opt}が速度最適化有りとなる. \begin{table}[htpb] \centering \small \begin{tabular}{|c|c|c|c|} \hline CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline x86/Linux & 7.378 & 0.833 & 2.923 \\ \hline x86\_64/OS X(-m32)& 5.951 & 0.507 & 2.871\\ \hline x86\_64/OS X & 6.420 & 0.621 & \\ \hline \end{tabular} \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(最適化無し)} \label{tab:speed-mc-vs-gcc-nonopt} \end{table} \begin{table}[htpb] \centering \small \begin{tabular}{|c|c|c|c|} \hline CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline x86/Linux & 3.253 & 2.906 & 2.71 \\ \hline x86\_64/OS X(-m32)& 2.726 & 2.418 & 2.857\\ \hline x86\_64/OS X & 1.390 & 1.509 & \\ \hline \end{tabular} \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(速度最適化)} \label{tab:speed-mc-vs-gcc-opt} \end{table} \section{CbC のアップデート手法} 最後に, CbC のアップデート手法について述べる. 現在 GCC は年に数回アップデートが行われている. GCC に合わせて CbC のアップデートを行うのが好ましいが, その度新しいソースコードに合わせていくのは負担が大きい. GCC の正式な機能として CbC を組み込んで貰うことが最良の方法だが 現時点ではまだそこまで至っていない. そこで Mercurial を使ってアップデート方法を行なっている. \subsection{Mercurial によるアップデート} Mercurial はバージョン管理システムである. 当研究室では CbC のソースコードは Mercurial によって管理されている. Mercurial では本家 GCC のソースコードも管理されており, これら 2 つのリポジトリを使って CbC のアップデートは行われる(図\ref{fig:mercurial}). 具体的な方法は以下になる. \begin{itemize} \item GCC リポジトリ \begin{enumerate} \item GCC リポジトリの中身を削除 (バージョン管理情報以外) \item 新しい GCC のソース入れる \item hg status で追加ファイルと削除ファイルを確認 \item 追加, 削除するファイルに対して hg add, hg remove を行う \item コミット \item gcc version タグを追加 \end{enumerate} \item CbC リポジトリ \begin{enumerate} \item GCC リポジトリから hg pull を行う \item hg merge でマージを行う \item 衝突が発生したファイルのマージを行う \item ビルドを行い動作確認 \item コミット \item gcc version タグを追加 \end{enumerate} \end{itemize} \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/mercurial_update.eps}} \end{center} \caption{CbConGCC リポジトリの管理(左:本家GCC 中央:独自のGCCリポジトリ 右:CbConGCC リポジトリ)} \label{fig:mercurial} \end{figure} \subsection{リポジトリ管理方法の評価} 上記のリポジトリ管理方法を用いて GCC-4.5.0 から GCC-4.6.0 へのアップデートを行った. この手法を用いらない場合は手動で diff を行い差分を探すことになる. %この手法を用いらない場合は手動で diff をとり差分を適用するという方法を, % ファイル全てに行う必要があった. だが, 上記の手法ではほとんどの差分を Mercurial 自身がおこなってくれた. 手動で差分を直したのは CbC の実装を行ったファイルだけで済んだ. 若干ファイルの移動や追加があり戸惑ったが, アップデートは楽に行えた. \section{まとめと今後の課題} 今回 CbC コンパイラを GCC-4.6 へとアップデートを行った. アップデートに伴い不具合の修正と Intel64 ビットへの対応を行った. だが, 環境付き継続等未だ幾つかの問題を残している. また, typedefrec の様に新たに実装を行いたい機能もでてきている. \nocite{kono:2002a, kono:2000a, kono:2008a, yogi:2008a, yogi:2008b, yan:2002a,gcc_internals} \bibliographystyle{junsrt} \bibliography{cbc.bib} \end{document} \ No newline at end of file +\documentclass[private]{ipsjpapers} %\documentstyle{ipsjpapers} \usepackage[dvipdfmx]{graphicx} \usepackage{url} \usepackage{multirow} %% tabularの上下の結合 \usepackage{slashbox} %% tabularでの斜め線 \usepackage{listings} \usepackage{jtygm} % 巻数,号数などの設定 %\setcounter{巻数}{41} %\setcounter{号数}{6} %\setcounter{volpageoffset}{1234} %\受付{12}{2}{4} %\採録{12}{5}{11} \pagestyle{empty} % ユーザが定義したマクロなど. \makeatletter \let\@ARRAY\@array \def\@array{\def\<{\inhibitglue}\@ARRAY} \def\<{\(\langle\)} \def\>{\(\rangle\)} %\def\|{\verb|} \def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline} \def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\} \def\LATEX{\iLATEX\Large} \def\LATEx{\iLATEX\normalsize} \def\LATex{\iLATEX\small} \def\iLATEX#1{L\kern-.36em\raise.3ex\hbox{#1\bf A}\kern-.15em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX} \def\LATEXe{\ifx\LaTeXe\undefined \LaTeX 2e\else\LaTeXe\fi} \def\LATExe{\ifx\LaTeXe\undefined \iLATEX\scriptsize 2e\else\LaTeXe\fi} \def\Quote{\list{}{}\item[]} \let\endQuote\endlist \def\TT{\if@LaTeX@e\tt\fi} \def\CS#1{\if@LaTeX@e\tt\expandafter\string\csname#1\endcsname\else $\backslash$#1\fi} %\checklines % 行送りを確認する時に使用 \begin{document}%{ % 和文表題 \title[Continuation based C の GCC 4.6 上の実装について]% {Continuation based C の GCC 4.6 上の実装について} % 英文表題 \etitle{The implementation of Continuation based C Compiler on GCC 4.6} % 所属ラベルの定義 \affilabel{URYUKYU}{琉球大学\\University of the Ryukyu} % 和文著者名 \author{大城 信康\affiref{URYUKYU}\nomember\and 河野 真治\affiref{URYUKYU}\member{19841765}} % 英文著者名 \eauthor{Nobuyasu Oshiro\affiref{URYUKYU}\and Shinji Kono\affiref{URYUKYU}} % 連絡先(投稿時に必要.製版用では無視される.) \contact{大城 信康\\ 〒903-0213 沖縄県中頭郡西原町字千原1番地\\ 琉球大学 情報工学科\\ TEL: (098)895-8723\qquad FAX: (098)895-8727\\ email: dimolto@cr.ie.u-ryukyu.ac.jp} % 和文概要 \begin{abstract} GCC-4.6 をベースとした CbC コンパイラの実装を行った. CbC のコンパイラは GCC-4.2 ベースのコンパイラが2008年に開発されており, 以来 GCC のアップデートにあわせて CbC のコンパイラもアップデートが行われてきた. 本論文では GCC-4.6 への CbC の具体的な実装について述べる。 %当研究室では継続を基本としたプログラミング言語 Continuation basede C (以下CbC) を開発している. %また,CbC 自体の開発と共に CbC のコンパイラの開発も行っている. %お陰で GCC の最適化やデバッグの機能を CbC のプログラミングで扱うことができるようになった. \end{abstract} % 英文概要 \begin{eabstract} We implemented Continuation based C Compiler on GCC-4.6. CbC Compiler on GCC-4.2 was developed on 2008. Since then we kept to update it. In this paper, we introduce implemented Continuation based C Compiler on GCC-4.6. %Continuation based C is programming language. It is developing our laboratory. \end{eabstract} % 表題などの出力 \maketitle \thispagestyle{empty} % }{ % 本文はここから始まる \section{歴史的経緯} %当研究室では, 継続により処理を行うプログラミング言語 Continuation based C (以下CbC) を開発している. %CbC の構文は C と同じであるが,継続によりループ制御や関数コールが取り除かれる. 当研究室ではコードセグメント (Code Segment) 単位で記述するプログラミング言語 Continuation based C (以下CbC) を開発している. コードセグメントは並列実行の単位として使うことができ, プログラムの正しさを示す単位としても使用することができる.これにより, Many Core での並列実行を高い性能と高い信頼性で実現することができると考えている. CbC のコンパイルには元々 Micoro-C 版の独自のコンパイラを用いていたが, 2008年の研究において GCC-4.2 ベースの CbC コンパイラが開発され, 2010年には GCC-4.4 へとアップデートが行われた. GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった. %以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている. %今回,CbC コンパイラを GCC-4.6 へとアップデートを行った. %本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる. だが, GCC をベースとした CbC のコンパイラ (以下 CbC-GCC)は, GCC のアップデートに合わせて変更する必要がある. %本研究では, GCC-4.5.0 をベースとしていた CbC-GCC を GCC-4.6.0 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う. 本研究では, GCC-4.5.0 をベースとしていた CbC-GCC を GCC-4.6.0 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う. % }{ \section{Continuation based C (CbC)} CbC のプログラムはコードセグメント毎に記述され, コード間をgoto(軽量継続)により処理を移る. 構文は C と同じであるが, ループ制御や関数コールが取り除かれる. %Continuation based C (以下CbC) は当研究室で開発しているプログラミング言語である. %構文は C と同じであるが,ループ制御や関数コールを取り除き継続(goto)を用いている. %また,コードセグメント単位で処理を記述するという特徴がある. %図\ref{fig:cs}は CbC におけるプログラムの処理の流れを表している. \subsection{継続(goto)} コードセグメントの記述は C の関数の構文と同じで, 型に ``\verb+__code+'' を使うことで宣言できる. コードセグメントへの移動は ``goto'' の後にコードセグメント名と引数を並べて記述することで行える. 図\ref{fig:cs}はコードセグメント間の処理の流れを表している. %コードセグメントへと移った処理は C の関数と違って呼び出し元の関数に戻ることはない. %コードセグメントは自身の処理が終えると goto により次のコードセグメントへと処理に移る. %この goto によるコードセグメント間の移動を継続と言う. %継続の実態は jmp による関数の移動となる. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/codesegment.eps}} \end{center} \caption{コードセグメント間の継続(goto)} \label{fig:cs} \end{figure} \subsection{コードセグメント(code segment)} コードセグメントは C の関数と違って返り値を持たず, 処理が終われば次のコードセグメントへと処理を移る. C において関数呼び出しを繰り返し行う場合, 呼び出された関数の引数の数だけスタックに値が積まれていく. だが, 返り値を持たないコードセグメントではスタックに値を積んでいく必要な無く, スタックは変更されない. 軽量継続により並列化, ループ制御, 関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる. 図\ref{fig:factorial}は CbC で書いたプログラムの例である. 与えられた数 x の階上を計算して出力するプログラムとなっている. \begin{figure} \begin{footnotesize} \lstinputlisting[language=c]{source/factorial.cbc} \caption{階上を計算する CbC プログラムの例} \label{fig:factorial} \end{footnotesize} \end{figure} \section{GCCの3つの内部表現} GCC-4.6 への実装の前に,GCC で扱われる3つの内部表現について触れておく. GCC は内部で Generic Tree, GIMPLE Tree, RTL という3つの内部表現を扱う. それぞれが 読み込んだソースコードは Generic Tree, GIMPLE Tree, RTL の順に変換されていき, 最後にアセンブラ言語へと出力される. 図\ref{fig:ir}は GCC がソースコードを読み込みアセンブラ言語出力までの流れを表した図である. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/ir.eps}} \end{center} \caption{GCC によるコンパイルの一連の流れ} \label{fig:ir} \end{figure} \subsection{Generic Tree} ソースコードより読み込んだ関数の情報を木構造で表したものが Generic Tree となる. 関数の戻値,引数,変数の型,条件式とプログラムの処理全てが木構造で表される. CbC の実装では parse の部分からこの Generic Tree 生成の部分に手が加わっている. \subsection{GIMPLE Tree} Generic Tree で表現されたデータは GIMPLE Tree に変換される. GIMPLE Tree は Generic Tree より制約がかかった状態で作成された構文木となる. 制約は「1つの枝に4つ以上の子を持たせない」等といったもので, GIMPLE Tree へと変換されたデータは Generic Tree より簡単な命令で表されることになり最適化がかけやすくなる. CbC の実装では特に修正は加えていない. \subsection{Register Transfer Language (RTL)} GIMPLE Tree は解析が行われた後 RTL へと変換される. RTL はレジスタの割り当てといった低レベルの表現で,アセンブラとほぼ同じ表現を行うことができる. プログラム内部では RTL も木構造で表される. CbC における継続は,この RTL への変換で行われる最適化の1つ Tail Call Elimination が重要となってくる. \section{GCC-4.6 への実装} 前節までで CbC の基本仕様と GCC でのアセンブラ出力までの流れを確認した. ここからは GCC-4.6 への実装について述べていく. \subsection{``\_\_code'' のパース} C の予約後は \verb+gcc/c-family/c-common.c+ の \verb+c_common_reswords+ 構造体で定義されている. ここに,図\ref{fig:code-parse}のように \verb+__code+ 型の登録を行う. \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/code-parse.eps}} \end{center} \caption{\_\_code のパース} \label{fig:code-parse} \end{figure} これで \verb+__code+ は \verb+RID_CbC_CODE+ として判定されるようになる. 次に, id を用意する. Genric Tree が生成されるデータは一度 \verb+c_declspecs+ 構造体に保存される. そこに登録するコードセグメント判定用 id ``\verb+cts_CbC_code+'' を用意する. これは gcc/c-Tree.h で定義される(図\ref{fig:code-id}). \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/code-id.eps}} \end{center} \caption{cts\_CbC\_code の定義} \label{fig:code-id} \end{figure} 後は\verb+c_declspecs+ 構造体にこの id を登録する. id の登録は \verb+declspecs_add_type+ 関数の中で行われる(図\ref{fig:regi-id}). \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/regi-id.eps}} \end{center} \caption{id の登録(declspecs\_add\_type 関数)} \label{fig:regi-id} \end{figure} 図\ref{fig:regi-id} のプログラムは void 型の id 登録を元に作られている. 違うところは \verb+cts_CbC_code+ を登録するところだけである. 最後に, \verb+finish_declspecs+ 関数にて id 毎に Tree タイプの決定をする. コードセグメントは void 型として扱ってもらうために \verb+void_type_node+ を Tree のタイプと して登録している(図\ref{fig:regi-node}). \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/regi-node.eps}} \end{center} \caption{declspecs\_add\_type 関数} \label{fig:regi-node} \end{figure} \subsection{goto シンタックスの追加} 通常 goto のシンタックスは ``goto ラベル名;'' となっている. CbC では通常の goto に加え ``goto cs();'' の形でコードセグメントを呼び出すシンタックスを追加する必要がある. 図\ref{fig:rid-goto}は, 追加した goto のシンタックスである (通常のシンタックスは省いてある). \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/rid-goto.eps}} \end{center} \caption{goto へのシンタックスの追加} \label{fig:rid-goto} \end{figure} %具体的には, 読み込んだ CPP_NAME が関数の場合の処理を追加した. 具体的には void 型の Tree を作成している.加えてコードセグメントと判定するフラグ と Tail Call のフラグ を付けた関数とした Tree となる. %の作成を行なっている. \verb+cbc_replace_argments+ 関数と \verb+c_finish_return+ 関数の動作については CbC においても重要になるので後に詳しく説明する. \subsection{Tail Call Elimination} CbC の継続の実装には GCC の最適化の1つ, Tail Call Elimination (末尾除去) を強制することで実装する. これにより, コードセグメント間の移動を, call ではなく jmp 命令で実現する. %Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に, %call ではなく jmp を用いることができるという最適化である. 図\ref{fig:continue}は Tail Call Elimination が行われた際のプログラムの処理を表している. \begin{figure}[htpb] \begin{center} \scalebox{0.30}{\includegraphics{figure/continuation.eps}} \end{center} \caption{Tail Call Elimination} \label{fig:continue} \end{figure} funcB は jmp 命令で funcC を呼び出す. funcC は, 戻値を funcB ではなく funcA へと返すことになる. \subsubsection{expand\_call} \verb+expand_call+ 関数は, 関数を表す Tree から RTL を生成する関数である. Tail Call Elimination を行えるかどうかもこの関数で判断される. 内部でチェックされる Tail Call Elimination の条件は以下になる. %\verb+expand_call+ 関数内でチェックされる Tail Call Elimination が行える条件は以下になる. %\begin{itemize} \begin{enumerate} \item caller 側と callee 側の戻値の型が一致している. \item 関数呼び出しがリターンの直前に行われている. \item 呼出先関数の引数に用いられるスタックサイズが呼出元関数のそれより少ない. \item 引数の並びのコピーに上書きがない. \end{enumerate} %\end{itemize} CbC の実装では上記の条件を,以下の様にして解決させている. \begin{enumerate} %\begin{itemize} % \item コードセグメントは void 型で統一する. Cの関数からコードセグメントに goto する場合は返す値の型チェックを行わない. \item コードセグメントは void 型で統一する. 最適化(-O2)の強制付与. \item goto の直後に retrun を置く. \item スタックサイズは関数宣言時に決まったサイズにする. \item 引数は一旦, 一時変数にコピーして重なりがないようにする. %\end{itemize} \end{enumerate} %1 については自明だろう.コードセグメントは戻値を持たない為 void 型の扱いになる. %2, 3 と 4 については以下で詳しく説明を行う. 戻値を持たない為, コードセグメントを void 型で統一するのは自明だろう. 最適化の強制付与及び 2, 3 と 4 については以下で詳しく説明を行う. \subsubsection{末尾最適化の強制付与} Tail Call Elimination は C のプログラムにおいて末尾最適化を有効にすることで行われる. 以前の CbC-GCC の実装では \verb+expand_call+ 関数を元にした \verb+expand_cbc_call+ 関数を作成して, 条件をクリアするようにしていた. しかし, その方法では \verb+expand_call+ 関数が改良される度に \verb+expand_cbc_call+ 関数にも 変更を加える必要があり, 手間となっていた. そこで, 最適化フラグを強制的に付与させることで \verb+expand_cbc_call+ 関数を取り除くことに 成功した(図\ref{fig:tail_call}:2行目). \begin{figure}[htpb] \begin{center} \scalebox{0.35}{\includegraphics{figure/tail_call_flag.eps}} \end{center} \caption{コードセグメントの末尾最適化の付与} \label{fig:tail_call} \end{figure} \verb+expand_call+ 関数内では, Tail Call Eliminatino にかけるためのフラグ, \verb+try_tail_call+ 変数があり, コードセグメントはこのフラグには初め 1 がセットされている. コードセグメントの時はこの \verb+try_tail_call+ 変数に 0 を代入させないように実装を行った. また, 万が一 \verb+try_tail_call+ 変数に 0 を代入された時の為にフラグに 1 を代入するコードの挿入も行った. これにより末尾最適化の強制付与がなされた. \subsubsection{goto の直後に return の配置} 図\ref{fig:factorial}のコードセグメント factorial0 をlisting\ref{code:return}の様に, goto の直後に return を 置く必要がある.だがそれをプログラマが記述することは実用的でない. \begin{figure}[h] \begin{footnotesize} \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=goto の直後に return を置く,label=code:return] __code factorial0(int prod, int x) { if ( x >= 1) { goto factorial0(prod*x, x-1); return; }else{ goto print_factorial(prod); return; } } \end{lstlisting} \end{minipage} \hfill \end{footnotesize} \end{figure} CbC では Generic Tree の生成時に継続の直後に return を自動で組み込むことで解決している. 図\ref{fig:rid-goto}の\verb+c_finish_return+ 関数がそれにあたる. %goto でコードセグメントの継続を行うプログラムの直後に return を表す情報を Generic Tree に追加を行う. \subsubsection{スタックサイズの固定化} CbC では継続によりスタックに値が積まれていくということはない為サイズを固定することができる. また, サイズが固定な為, スタックポインタを変えずにスタックを扱うことができる. これも CbC の1つの特徴である. 図\ref{fig:cs_stack}はコードセグメントの継続の際にスタックに積まれる引数を表している. \begin{figure}[htpb] \begin{center} \scalebox{0.30}{\includegraphics{figure/cs_stack.eps}} \end{center} \caption{継続による引数のスタック格納の様子} \label{fig:cs_stack} \end{figure} %GCCでは, この他にもTCEを禁止するルールがあり, GCC-4.5, 4.6 でも %Tail Call Elimination にかからないコードセグメントがある. %この点を改善する必要がある. %\subsection{引数の一時変数への避難} %\subsection{スタック書き換えの問題} \subsubsection{引数の並びの上書きコピー} CbC の継続では, 引数渡しでスタックを入れ替える為値が書き換えられる可能性がでてくる. 例えばlistlising\ref{code:cs_prog}のような継続である. \begin{figure}[h] %\begin{footnotesize} \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=スタックの上書きが起こる継続の例,label=code:cs_prog] __code cs_a(int a, int b) { goto cs_b(b, a) } \end{lstlisting} \end{minipage} \hfill %\end{footnotesize} \end{figure} \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/cs_prog.eps}} \end{center} \caption{スタック書き換えの問題} \label{fig:cs_prog} \end{figure} この時のスタックの様子を表したのが図\ref{fig:cs_prog}となる. 数字の 1 と 2 は \verb+cs_b+ の引数をスタックに乗せる順を表している. CbC ではこの問題を一時変数に引数の値を代入することで問題を解決している. \subsubsection{一時変数へのコピー} 一時変数へのコピーは, goto が行れるコードセグメントの Generic Tree 生成時に行われる. 図\ref{fig:cbc_replace}に示す \verb+cbc_replace_arguments+ 関数が実際のコードとなる. %\begin{figure} %\lstinputlisting[language=c]{source/cbc_replace_arguments.c} %\caption{引数の一時変数へのコピー} %\label{fig:cbc_replace} %\end{figure} \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/cbc_replace.eps}} \end{center} \caption{引数の一時変数へのコピー} \label{fig:cbc_replace} \end{figure} 具体的には, 内部で以下の事が行われている. \begin{itemize} \item 引数と同じ型の一時変数を作成 \item 一時変数に引数の値を代入 \item 関数に渡す引数のポインタを一時変数に変更 \end{itemize} Tree call は継続を行うコードセグメントを指す. コードセグメントに渡された引数の情報を抜き出す部分が \verb+FOR_EACH_CALL_EXPR_ARG+ である. \verb+tmp_decl+ という一時変数を作り,最後に \verb+CALL_EXPR_ARG+ を使って引数の情報が入っていた ところへ一時変数を入れている. \subsection{環境付き継続} CbC には通常の C の関数からコードセグメントに継続する際, その関数から値を戻す処理への継続を得ることができる. これを環境付き継続という. これらは, 以下の二種類の CbC で定義した特殊変数である. \verb+__environment+ は, 環境を表す情報である. \verb+__return+ は, これを環境付き継続の行き先であり, 関数の戻値と \verb+__environment+ の二つの引数を持つ コードセグメントである. 例えば, 以下のように使うと, \verb+main()+ は 1 を返す. \begin{verbatim} __code c1(__code ret(int,void *),void *env) { goto ret(1,env); } int main() { goto c1(__return, __environment); } \end{verbatim} GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す. 戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:_ret_val}). \begin{figure}[h] \begin{footnotesize} \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=環境付き継続を行うコード,label=code:_ret_val] __label__ _cbc_exit0; static int retval; void _cbc_internal_return(int retval_, void *_envp){ retval = retval_; goto _cbc_exit0; } if (0) { _cbc_exit0: return retval; } _cbc_internal_return; \end{lstlisting} \end{minipage} \hfill \end{footnotesize} \end{figure} \subsubsection{環境付き継続の問題} 現在環境付き継続は このコードを GCC 内部で生成することで実現している. これは正しく動作しているが, \verb+retval+に static を指定してしまうと, スレッドセーフな実装でなくなる. これを通常の変数にすると, 関数内の関数は closure として実装される. しかし, GCC 4.6 と Lion の 組合せでは closure は正しく動作してないことがわかった. Thread local 変数を用いると, やはり closure が出力されてしまう. 本来, 戻値用のレジスタが使用されれば問題ないが, 戻値の型は整数やポインタとは限らず, 浮動小数点や構造体自体である可能性があり複雑である. 一つの解決策はレジスタ渡しと考えているが, 他の方法もありえる. 少し重いが setjmp を用いた実装方法もある. \subsection{引数渡し} 通常コードセグメントの継続において, 引数は C の関数と同じスタックを用いて渡される. GCC には引数渡しをスタックではなくレジスタを用いて行う機能として fastcall がある. fastcall を用いてコードセグメント間を継続することで, 速度の向上を図る. \subsubsection{fastcall} C において fastcall を用いる場合は関数にキーワード ``\verb+__attribute__ ((fastcall))+'' をつけて行う. だが, コードセグメントを全てこのキーワードをつけて宣言することは実用的ではない. そこで, コードセグメントで宣言された場合, fastcall が自動で付くように実装を行う. 図\ref{fig:fastcall}はコードセグメントの生成を行なっているコードである. %\lstinputlisting[language=c]{source/fastcall.c} \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/fastcall.eps}} \end{center} \caption{コードセグメントへのfastcall属性付与} \label{fig:fastcall} \end{figure} 13,14 行目が fastcall 属性を付与している部分になる. if 文で条件を決めているのは, 64 bit の場合 fastcall が標準で行われていて, warning を出すからである. \subsection{typedefrecの実装の構想} C では関数や構造体の宣言の時に自分自身を引数にすることができない。 そこで ``typedefrec'' という構文を作り、図\ref{code:typedefrec}のような宣言を行えるようにしたい。 %C を基本としている CbC には型推論がない. \begin{figure}[h] \begin{minipage}[b]{.45\textwidth} \begin{lstlisting}[caption=typedefrecの例,label=code:typedefrec] typedefrec void *funcA(int, funcA); typedefrec struct { NODE left; NODE right; } *NODE; \end{lstlisting} \end{minipage} \hfill \end{figure} typedefrec によりコードセグメントは自分自身に戻る構成ができるようになる. より柔軟なプログラミングが行えるように typdefrec の実装を行う予定である. \section{評価} 今回実装を行った GCC-4.6 ベースのコンパイラを GCC-4.4 ベース, Micro-C コンパイラとそれぞれ比較を行った. 比較を行うのはクイックソートのプログラムである. %クイックソートは再帰的にプログラムされる為 CbC に向いている %プログラムだと言える. クイックソートは再帰的なプログラムな為スタック操作が行われる為テストに向いている. 比較を行うのは以下のアーキテクチャと OS になる. %\begin{description} \begin{itemize} \item x86/Linux \item x86/OS X \end{itemize} %\end{description} また,比較を行うプログラムは最適化(-O0 オプション)を行わないものと, 速度最適化(-O2 -fomit-frame-pointer)を行うものの2つ, それと -m32 オプションと -m64 オプションをつけたものそれぞれで行う. 表\ref{tab:speed-mc-vs-gcc-nonopt}が最適化無し, 表\ref{tab:speed-mc-vs-gcc-opt}が速度最適化有りとなる. \begin{table}[htpb] \centering \small \begin{tabular}{|c|c|c|c|} \hline CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline % x86/Linux & 7.378 & 0.833 & 2.923 \\ \hline x86/Linux & 7.378 & & 2.923 \\ \hline % x86\_64/OS X(-m32)& 5.951 & 0.507 & 2.871\\ \hline x86\_64/OS X(-m32)& 5.951 & & 2.871\\ \hline % x86\_64/OS X & 6.420 & 0.621 & \\ \hline x86\_64/OS X(-m64) & 6.420 & & \\ \hline \end{tabular} \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(最適化無し)} \label{tab:speed-mc-vs-gcc-nonopt} \end{table} \begin{table}[htpb] \centering \small \begin{tabular}{|c|c|c|c|} \hline CPU/OS &GCC-4.4& GCC-4.6 &Micro-C \\ \hline x86/Linux & 3.253 & 2.906 & 2.71 \\ \hline x86\_64/OS X(-m32)& 2.726 & 2.418 & 2.857\\ \hline x86\_64/OS X(-m64) & 1.390 & 1.509 & \\ \hline \end{tabular} \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(速度最適化)} \label{tab:speed-mc-vs-gcc-opt} \end{table} GCC-4.6 バージョンの最適化無しは, 末尾最適化が強制的に行われる為 除外している. 最適化有りと無しの比較が 4.6 でも行えないのは残念だが, 最適化の効果はでている ように思われる.GCC-4.4 では最適化により 2 倍以上の性能がでている. また 64bit 版の最適化有りは 32bit 版に比べてどちらも 1.6 倍以上の速度がでている のが確認できた. Micro-C と比較では GCC の 32bit 版が若干早く, 64bit 版は 2 倍の差がでているのが 確認できた. \section{CbC のアップデート手法} 最後に, CbC のアップデート手法について述べる. 現在 GCC は年に数回アップデートが行われている. GCC に合わせて CbC のアップデートを行うのが好ましいが, その度新しいソースコードに合わせていくのは負担が大きい. GCC の正式な機能として CbC を組み込んで貰うことが最良の方法だが 現時点ではまだそこまで至っていない. そこで Mercurial を使ってアップデート方法を行なっている. \subsection{Mercurial によるアップデート} Mercurial はバージョン管理システムである. 当研究室では CbC のソースコードは Mercurial によって管理されている. Mercurial では本家 GCC のソースコードも管理されており, これら 2 つのリポジトリを使って CbC のアップデートは行われる(図\ref{fig:mercurial}). 具体的な方法は以下になる. \begin{itemize} \item GCC リポジトリ \begin{enumerate} \item GCC リポジトリの中身を削除 (バージョン管理情報以外) \item 新しい GCC のソース入れる \item hg status で追加ファイルと削除ファイルを確認 \item 追加, 削除するファイルに対して hg add, hg remove を行う \item コミット \item gcc version タグを追加 \end{enumerate} \item CbC リポジトリ \begin{enumerate} \item GCC リポジトリから hg pull を行う \item hg merge でマージを行う \item 衝突が発生したファイルのマージを行う \item ビルドを行い動作確認 \item コミット \item gcc version タグを追加 \end{enumerate} \end{itemize} \begin{figure}[htpb] \begin{center} \scalebox{0.33}{\includegraphics{figure/mercurial_update.eps}} \end{center} \caption{CbConGCC リポジトリの管理(左:本家GCC 中央:独自のGCCリポジトリ 右:CbConGCC リポジトリ)} \label{fig:mercurial} \end{figure} \subsection{リポジトリ管理方法の評価} 上記のリポジトリ管理方法を用いて GCC-4.5.0 から GCC-4.6.0 へのアップデートを行った. この手法を用いらない場合は手動で diff を行い差分を探すことになる. %この手法を用いらない場合は手動で diff をとり差分を適用するという方法を, % ファイル全てに行う必要があった. だが, 上記の手法ではほとんどの差分を Mercurial 自身がおこなってくれた. 手動で差分を直したのは CbC の実装を行ったファイルだけで済んだ. 若干ファイルの移動や追加があり戸惑ったが, アップデートは楽に行えた. \section{まとめと今後の課題} 今回 CbC コンパイラを GCC-4.6 へとアップデートを行った. アップデートに伴い不具合の修正と Intel64 ビットへの対応を行った. だが, 環境付き継続等未だ幾つかの問題を残している. また, typedefrec の様に新たに実装を行いたい機能もでてきている. \nocite{kono:2002a, kono:2000a, kono:2008a, yogi:2008a, yogi:2008b, yan:2002a,gcc_internals} \bibliographystyle{junsrt} \bibliography{cbc.bib} \end{document} \ No newline at end of file