.img/logo.ai .img/logo.svg LICENSE example/main.dart lib/platform_info.dart lib/src/base_host_platform.dart lib/src/constants.dart lib/src/default_host_platform.dart lib/src/enums.dart lib/src/io_host_platform.dart lib/src/methods.dart lib/src/platform.dart lib/src/stub_host_platform.dart lib/src/web_host_platform.dart test/platform_info_test.dart <<<<<< network # path=./coverage/lcov.info SF:/__w/platform_info/platform_info/lib/platform_info.dart DA:46,2 LF:1 LH:1 end_of_record SF:/__w/platform_info/platform_info/lib/src/default_host_platform.dart DA:10,5 DA:13,1 DA:17,1 DA:20,1 DA:23,1 DA:26,1 LF:6 LH:6 end_of_record SF:/__w/platform_info/platform_info/lib/src/enums.dart DA:5,1 DA:19,2 DA:22,2 DA:25,2 DA:28,1 DA:34,1 DA:36,1 DA:46,1 DA:52,1 DA:62,1 DA:73,2 DA:76,2 DA:79,1 DA:83,1 DA:94,1 DA:120,2 DA:123,2 DA:126,2 DA:129,2 DA:132,2 DA:135,2 DA:138,2 DA:141,1 DA:151,1 DA:153,1 DA:155,1 DA:157,1 DA:159,1 DA:161,1 DA:171,1 DA:180,1 LF:31 LH:31 end_of_record SF:/__w/platform_info/platform_info/lib/src/io_host_platform.dart DA:9,2 DA:13,1 DA:15,1 DA:16,2 DA:18,2 DA:35,1 DA:36,1 DA:37,1 DA:39,1 DA:41,1 DA:43,1 DA:45,1 DA:47,1 DA:51,1 DA:54,1 DA:55,1 DA:56,1 DA:58,1 DA:61,1 DA:62,1 DA:63,1 DA:65,1 DA:68,1 DA:69,1 DA:70,1 DA:71,1 DA:72,1 DA:73,1 DA:74,1 DA:75,1 DA:76,4 DA:77,1 LF:32 LH:32 end_of_record SF:/__w/platform_info/platform_info/lib/src/stub_host_platform.dart DA:8,1 LF:1 LH:1 end_of_record SF:/__w/platform_info/platform_info/lib/src/platform.dart DA:55,1 DA:56,2 DA:58,1 DA:59,2 DA:61,1 DA:62,2 DA:64,1 DA:65,2 DA:67,1 DA:68,2 DA:73,1 DA:74,3 DA:76,1 DA:77,3 DA:91,1 DA:92,2 DA:94,1 DA:95,2 DA:97,1 DA:98,2 DA:100,1 DA:101,2 DA:103,1 DA:104,2 DA:106,1 DA:107,2 DA:115,2 DA:120,1 DA:127,2 DA:130,2 DA:133,2 DA:136,3 DA:139,2 DA:140,1 DA:141,1 DA:145,1 DA:150,2 DA:151,2 DA:152,2 DA:154,2 DA:156,2 DA:158,1 DA:161,1 DA:162,1 DA:164,1 DA:165,2 DA:173,1 DA:180,1 DA:182,1 DA:183,1 DA:185,1 DA:186,1 DA:187,1 DA:189,1 DA:198,1 LF:55 LH:55 end_of_record SF:/__w/platform_info/platform_info/lib/src/methods.dart DA:68,1 DA:89,1 DA:91,1 DA:93,1 DA:95,1 DA:97,1 DA:99,1 DA:101,1 DA:108,1 DA:110,1 DA:117,1 DA:119,1 DA:126,1 DA:128,1 DA:135,2 DA:137,2 DA:139,2 LF:17 LH:17 end_of_record <<<<<< EOF # path=./.dart_tool/pub/incremental/coverage/format_coverage.dart.incremental.dill «ÍïE0000000000 €ÚAGGvZ BJ]xQNQ €Ú€Ç€õG*Z@€™Ÿ‹)`€É` Ÿ `? €ËÌð‚@jÍ`€Éø‚]€Ì`€Í`]Jûjû]€Ì`€Í`]‚‚.‚B@j‚`€É‚7‚B]€Ì`€Í` J‚:j‚:]€Ì`€Í` ‚F‚[‚x@ j‚G`€É‚p‚x`€ÎJ‚s*‚|‚‘‚§@ j‚}`€É‚ ‚§`€ÎJ‚£) ‚«‚À‚×@ j‚¬`€É‚Ђ×`€ÏJ‚Ó+‚Ü‚òƒ„@ j‚Ý`€É‚üƒ„ƒ `€Íƒ` j`€Ñ` >ƒƒ„=0ƒ%ƒ+€Ô'ƒ‰ƒš„Ü@jƒŠ`€Éƒ¡„܃© `€Íƒ¾`€Íj`€ÑƒÒ`€Íj`€Ñƒä`€Îjƒñ`€Î„`€Îj„`€Î„0a`€Î\j`€Ñ„E`€Îj„L`€Î„f]€Õ`€Íj„p]€Õ`€Í\>„{„Ü=0„„‡€Ô'„á„ò†Ó@j„â`€É„û†Ó … `€Í …`€Íj`€Ñ…,`€Íj`€Ñ…@`€Íj`€Ñ…c]€Ö`€Íj`€Ñ…‡]€Ì`€Í`€Íj`€Ñ…¢`€Íj`€Ñ…Ìa`€Í\j`€Ñ…á`€Îj…ñ`€Î†`€Îj`€Ñ†`€Îj†(`€Î†:`€Îj†A`€Î†[]€Õ`€Íj†e]€Õ`€Í\>†p†Ó=0†v†|€Ô' †Ø†éˆ©@!j†Ù`€É†÷ˆ© †ÿ `€Í ‡`€Íj`€Ñ‡(`€Íj`€Ñ‡<`€Íj`€Ñ‡_]€Ö`€Íj`€Ñ‡ƒ]€Ì`€Í`€Íj`€Ñ‡¨]€Ö`€Íj`€Ñ‡×a]€Õ`€Í\j`€Ñ‡ì`€Îj‡ú`€Îˆ `€Îjˆ`€Îˆ,]€Õ`€Íjˆ6]€Õ`€Í\>ˆAˆ©=0ˆGˆM€Ô'"ˆ®ˆ¿‰?@#jˆ¯`€ÉˆË‰?ˆÓ$`€Í\>ˆÙ‰?=0ˆßˆå€Ô'%‰D‰[‰«@&j‰E`€É‰`‰«‰r']€Ö`€Í`JJ‰x‰¤‰€ +.‰š€Ù`€Í€‰…â&a`J€‘ ‰°‰Ç‰Ò@(j‰±`€É‰Í‰Ò`€ÍJ‰Ð'‰×‰ëŠ=@)j‰Ø`€É‰õŠ=‰ý*`€Í[>ŠŠ==0РЀÜ$Š8'+€Š1†}ŠBŠVЍ@,jŠC`€ÉŠ`ЍŠh*`€Í[>ŠpЍ=0ŠvŠ|€Ü$Š£'+€Šœ†ÌŠ­ŠÁŠè@-jŠ®`€ÉŠÓŠèŠÛ`€Í`]JŠä+Ší‹‹'@.jŠî`€É‹‹'‹ `€Í`]J‹#+ ‚;‚;€À/]€Ì`€Í` J‚;&‚; x‚;.0€àj‚;`€á”j]€Õ`€â j]€Õ[‚;€ä`€á[j]€Ì`€á[ a`€å[€ç]€Ì`€Í`  ‚š‚š€À1]€Ì`€Í`€ÍJ‚š&‚š x‚š.0€àj‚š`€á ”j]€Õ`€â j]€Õ[‚š€ä`€á[j]€Ì`€á[ a`€å[€ç]€Ì`€Í`€Íªª €À2 `€Í`€Í`€Í`€Í]€Ö`€Í]€Ì`€Í`€Í[`€è3`x`€Îj`€Î`€Îj`€Ñ`€Îj`€Î`€Îj`€Î]€Õ`€Íj]€Õ`€Í\Jª xª .0€àjª `€á “j]€Õ`€â €ê[1[ €ˆªˆ´‚ˆ¾ƒˆÈ„ˆÒ…ˆá†ˆô‡ˆû‰ª €ä`€á[2`€á[j`€á ‰ j`€á‰ j`€á‰1 j`€á‰B j`€á‰S a`€å[€çƒÊƒÊ€À4]€Õ[JƒÊ&ƒÊ xƒÊ.0€àjƒÊ`€á”j]€Õ`€â j]€Õ[ƒÊ€ä`€á[j]€Ì`€á[ a`€å[€ç]€Õ[‚‚€À5]€Ì`€Í`]J‚&‚ x‚.0€àj‚`€á”j]€Õ`€â j]€Õ[‚€ä`€á[j]€Ì`€á[ a`€å[€ç]€Ì`€Í`]Ö`޼êCWzÀ,[ªù1iü‘ 2 ¹ L ¬˜ © ¬ €Ú€Ç€õG5ZK€a€¡ äêµð`€É #‚‚€5]€Ì`€Í`]$‚;‚D€/]€Ì`€Í` %‚š‚¢€1]€Ì`€Í`€Í(‚ûƒ€]€Ì`€Í`])ƒ_ƒg€]€Ì`€Í` &ƒÊƒä€4]€Õ[ƒâ€í[“*„R„f€ `€Î+†¯†¾€ `€Ï'ê6[1[0@ŠÍŠÍŒ;7ŠØŒ;Ší]€Ì`€Í`]‹ ]€Ì`€Í` ‹"1]€Ì`€Í`€Í‹8 `€Îj‹O`€Î‹Z `€Ïj`€Ñ` ?%‚++„S#€‹(‹š€ð`€Í`]€‹®$‹Ì)‹é€ð`€Í` ‹ý*ƒŒ'@ ŠÍ€Ë,‡‡(‡?@ ‡7‡?`€ÎJ‡:*/ˆwˆ‰xAˆˆ‰xˆ `€Îjˆ¦`€Îˆ± `€Ïj`€Ñ` JˆÌˆÖ@2ˆè`€Í`]2ˆÿ`€Í` 2‰`€Í`€Í €‰7Ž ‰hŽ!0БЙŠÈQ8аŠÈ` =59[2ßéŽö@ óŽöû `€ÍŽ ` j`€Ñ` >ŽŽöIŽDxŽRvŽH./]€Ì`€Í` $:€Ž^޼a`€É`€Î€ò>Žeޤ=0ŽmŽs€Ü$Ž';€Ž–޼'<?=#޲ޫŽÇ‰Ž«ŽÇ޶/+` =xŽÐvŽÇ./]€Ì`€Í` $=€ŽÑ޼ŽÙŽÇ` a`€Í` \€óJŽåŽìŽÇ` 3”I”N–W@”U–W”] `€Í”r`€Íj`€Ñ”†`€Íj`€Ñ”˜`€Îj”¥`€Î”·`€Îj”Ã`€Î”äa`€Î\j`€Ñ”ù`€Îj•`€Î•]€Õ`€Íj•$]€Õ`€Í\>•/–W=x•5.2 €•I»•WÇ‚•eÙ+++ƒ•ë#•º…•±+4•˕˕í•Ì>[\J•Ö}•Þ•Öa`€Î\&•å•ß›`€Îa`€Î\a[\j–`x„–þ†–4'‡–K:^  `€Í`€Í`€Í`€Í]€Ö`€Í]€Ì`€Í`€Í[`€è`x]€Õ`€Í`€Î`€Î`€Î`€Î\74ÅÊŸÁ@ÓŸÁ Û `€Í ð`€Íj`€Ñž`€Íj`€Ñž`€Íj`€Ñž;]€Ö`€Íj`€Ñž_]€Ì`€Í`€Íj`€Ñžz`€Íj`€Ñž¤a`€Í\j`€Ñž¹`€ÎjžÅ`€Îž×`€ÎjžÞ`€Îžø]€Õ`€ÍjŸ]€Õ`€Í\>Ÿ ŸÁ=xŸ.2 €Ÿ‘oŸ$‘{‚Ÿ*‘ƒŸ0‘Ÿ„Ÿ;‘±…ŸD‘ȆŸQ‘㇟e‘õjŸz`xŸ•’ Ÿ¦’ Ÿµ’1 ^  `€Í`€Í`€Í`€Í]€Ö`€Í]€Ì`€Í`€Í[`€è`x]€Õ`€Í`€Î`€Î`€Î`€Î\75§Z§_ª@!§mª §u `€Í §Š`€Íj`€Ñ§ž`€Íj`€Ñ§²`€Íj`€Ñ§Õ]€Ö`€Íj`€Ñ§ù]€Ì`€Í`€Íj`€Ñ¨]€Ö`€Íj`€Ñ¨Ma]€Õ`€Í\j`€Ñ¨b`€Îj¨p`€Î¨`€Îj¨ˆ`€Î¨¢]€Õ`€Íj¨¬]€Õ`€Í\>¨·ª=x¨½.2 €¨Ñ“!¨ß“-‚¨í“?ƒ¨û“Q„©“c…©“z5©I©4]€Õ`€Í5©4©4]€Ö`€Í†©4“•#©4©4”S +x©@©4”S ]€Ö`€Í?^@`€Î]€Õ`€Í€õ]€Õ`€Í#©4©4”@ ©T€í`€Í“©4”@ ]€Õ`€Í]€Õ`€Í#©i‡©`“¬+4©z©z©¤©{>[\J©…}©©…“¬a]€Õ`€Í\&©”©Ž”ý ]€Õ`€Ía]€Õ`€Í\a[\j©¹`x©Ø“Ç©ó“Ú ª “í ^  `€Í`€Í`€Í`€Í]€Ö`€Í]€Ì`€Í`€Í[`€è`x]€Õ`€Í`€Î`€Î`€Î`€Î\77ªª ¯×@2ª*¯× ª9 `€ÍªM`€Íªa`€Íªu`€Íª˜]€Ö`€Íª¼]€Ì`€Í`€ÍªÏ[ªë`€è«3`x«`€Îj«$`€Î«7`€Îj`€Ñ«O`€Îj«[`€Î«m`€Îj«t`€Î«Ž]€Õ`€Íj«˜]€Õ`€Í\>«£¯×N«­«¶A]€Õ`€ÍRN«¸]€Õ`€Í«¸€÷`€Í€«¹•ç=x«Â«¸–ÛB«Â–  a]€Ö`€Í\€ù«¸–ÛI«Ðx«Ý«Ô–ÇC4«á«á¬ «â `€Í`€ÎJ«ë!¬x«ë..«ý—Na`€Í`]=aa`€Í`€Î`€Î€ú>¬ ¬T=0¬¬€Ü$¬M'D€¬F•ç'<?I¬—!¬ ¬›•ò>¬©­mN¬µ¬¾E`]x¬À.-¬Ó•ò`€Ía`€Í`]<I¬à!¬í¬ä—Ð>¬ö­g=0­­€Ü$­^'F­1•ò`€Í'Gv­V­M—Ð`] `€Í_'<??I­·"­»–z !­Ó†­È–7>­Ü®J=0­ä­ê€Ü$®C'H€®•ç'I?N®U®\*`]®^\ €®h•ç®n•ò‚®t•ýƒ®z–„®…–…®Ž–#†®£–7‡®¯–?®¹–J®Ò–U ®ò–h ¯–z ¯+– ¯B–  =x¯Xv¯P.5]€Ì`€Í`]#=€¯Y•ç¯a˜a`€Í`]\€ó=x¯ƒv¯m.4]€Õ[&J¯‡˜a[\€û>N¯¦K]€ü`€Ív¯¦¯¦–  L]€ü`€Í€þEx¯¦™SMa`€Î>N¯N`€Ív¯¯™SO`€Í>¯¯¯Ó=x¯¿v¯·.1]€Ì`€Í`€Í%=¯À™Ÿ€¯É•ça`€Í`€Í\€ó8°°”°×@#° °×°¨$`€Í\>°®°×=x°Êv°´.4]€Õ[&J€°Îša[\€û9±t±±Ï@&±„±Ï±–']€Ö`€Í`JJ±¥x±È±¥€ +.±¾€Ù`€Í€±Ášn&a`J€‘-²j²u²Í@(²{²Í`€Í>²{²ÍJ²²ˆ€£v²–.4]€Õ[&Pv²¹. `€Ï+:³³³Ã@)³³Ã³*`€Í[>³"³ÃN³,³2>`]x³4..€³F›"a`€Í`]=I³S³]³W›8>³f³¢=0³n³t€Ü$³›'+€³”›"?J³¨v³µ³¯›8`][e;³È³ù´(@,j³É`´´(´ *`€Í[J´x´.)€´!›Áa`€Í[:<´–´žµ0@-´°µ0´¸`€Í`]>´¾µ0>N´ßK]€ü`]v´ßv´ßv´×.]€Ì`€Í`](Q]€Ö`]L]€ü`]€þEx´ßœ$Ma`€Î>N´Í*`]v´çœ$O`]>´çµI´ï´ÿv´ú‚´óœ‰`€Í`€µœa`€É`€ÎJµ‚µœ‰?Jµ!+=µ¥µ­µî@.µ¾µîµÆ `€Í`]JµÏxµÖvµÏ.]€Ì`€Í`](R5µæµß`€Íxµßvµ×.1]€Ì`€Í`€Í%R€µàœúa`€É`€Í#µßµß/€µéœúµß/`€Í`€Ía`€É`] Í ór¢¡UÌþT¸Ÿîà™á Þá AB‚†` DÒÚ€]€Õ`€ÍFßß‚„ñ‚„ùS`€Í‚]€Ö`€Íj`€Ñ`B?D#‚<‚3žVj‚F]€Õ`€Í‚V€ê`€Í‚cžV]€Ö`€Í]€Õ`€Í ‚v €‚|žKÅÑÎÑ G€Ú€Ç€õJƒ…ƒ‹ŒÞ`€ÉMƒíƒô€TG` N„M„T€UG]€Ì`€Í[O„݄ဠ`€ÍP…ƒ…Š€V`JQ†µ†¹€W]€Õ`€ÍR‡‡ €X]€Õ`€ÍY‡‡‡ß7G‡‡ß‡ T` ‡.U]€Ì`€Í[‡< `€Í‡GV`J‡cW]€Õ`€Í‡vX]€Õ`€Í`J?M€Ÿ«NŸµO‚ŸÆPƒŸÑQ‡`€Í„‡¥ŸÛR‡À`€Í…‡ÕŸë ‡€ËUˆiˆz‰J@Rˆ|‰Jˆ„ `€Í[>ˆŠ‰JIˆ!xˆ¥vˆvˆ•.TG` M]€Ì`€Í`](:€ˆ± na`€É`€Î€ò>ˆ¸‰=0ˆÀˆÆ€Ü$ˆý'Y€ˆö n'<?J‰ x‰)u‰'x‰!v‰v‰.TG` M]€Ì`€Í`](R€‰" na`€É`]Zx‰?v‰8.UG]€Ì`€Í[NR€‰@ na`€É[a[[sSŠŠ#‹@Š+‹]€Ö`€Í>Š+‹NŠ5Š<[]`€ÍxŠKvŠFvŠ>.UG]€Ì`€Í[N\]€Ö`€Í]a]`€Í=xŠ˜vŠvŠˆ.TG` M]€Ì`€Í`](^4Š Š ŠíŠ¡ `€ÍЧ*`]\>НŠìIŠ·!ŠÍvŠÂ‚Š»¢![e=xŠÝ€ŠÖ¡‘JŠá¢a`€Í`€Î?aa`€Í`]\\JŠõ€Šü¡‘VŒŒ ŒÜ@_Œ)ŒÜŒ1 `€Í`€Î>Œ7ŒÜIŒ=!xŒRvŒJvŒB.TG` M]€Ì`€Í`](:€Œ^¢£a`€É`€Î€ò>ŒeŒ±=0ŒmŒs€Ü$Œª'Y€Œ£¢£'<?JŒ¸xŒÇvŒ¿.UG]€Ì`€Í[N:€ŒÓ¢£a`€É`€Î€ò T!d"‰#PIÒÝ‚ÊA`ê‚Êú` ‚a]€Ì`€Í[‚/ `€Í‚EV`J‚_W]€Õ`€Í‚vX]€Õ`€Í`J>‚‚ÊJ‚…‚—Y€‚™£‚‚¡£Œ‚‚©£ƒ‚¯£¨„‚¸£²…‚¾£Â$#e#h$ Z]„O„U“Í`€É_„¯„³€ `€Í`…w…{€`€Ía…²…¶€`€Íb…÷†€`€Íc†G†N€]€Õ`€Íd†¶†Á€]€Ì`€Í`€Íe‡"‡,€[fˆ"ˆ+€`€Îgˆˆ˜€`€èhˆü‰€3`xi‰„‰€`€Îj‰Ý‰æ€`€ÎkŠ;Š?€`€ÎlŠuŠ|€]€Õ`€Ín“ž“Ë€…bZ`“®'cw‹«‹«‘g7Z‹³‘g ‹À `€Í‹Ñ`€Í‹â`€Í‹ó`€ÍŒ]€Ö`€ÍŒ:]€Ì`€Í`€ÍŒR[Œi`€èŒ„3`xŒ–`€Îj`€ÑŒ­`€Îj`€ÑŒÅ`€ÎjŒÑ`€ÎŒã`€ÎjŒê`€ÎŒü]€Õ`€Íj]€Õ`€Í`]>Žw‘gIŽ}vކvŽ. `€Í_d`€Î>ŽŽÉ=0Ž—Ž€Ü'eIŽÐxŽÙvŽÔ. `€Í_f'g^``€Ï`€Î>Žê0=0ŽòŽø€Ü$)'hv . `€Í_'i?Isx…wnjvŽ. `€Í_a`€Í`€Î>•ã=0£€Ü$Ü'kv¹. `€Í_'l?Nîó`€Ívú.`€Í`I! §9>‘cI!.v'"§9`€Ím`€Ï”a`€É`€Î!>4ˆ=0>D€Ü'nI˜“§9`€Í'ga`€É`€Î> ä=0ª°€Ü'o?Iíxÿñnj‘§9`€Ía`€Í`€Î>‘‘]=0‘‘€Ü'p??_€¥{`¥†a‚¥‘bƒ¥œe†¥Ëg‡¥Óf¥é j¦ k¦ l¦3 c#+„#¥§+A€ê`€ÍN¥§]€Ö`€Í]€Õ`€Íd#†…z¥·+›€ä`€Í`€Í¨¥·]€Ì`€Í`€Í]€Ì`€Í`€ÍhÅ¥Þi5ŽXŽL`€ÎŽL¥û #ŽLŽL¨òŽ`Ž[¥ÞjŽn`xa`€É`€Î"ŽL¨ò`€Î`€Î ‹«€ËoвлŠÜ@qŠÂŠÜ`€ÎJŠÅŠÊvŠÅ.3`xhjŠØ`xa`€É`€Î"p‹‹‹>@r‹"‹>`€ÎJ‹%‹*v‹%.3`xhj‹8`xa`€É`€Î"q‹t‹}‹¦@s‹ˆ‹¦`€ÎJ‹‹‹v‹‹.3`xhj‹ž`xa`€É`€Î"s’“’›“&@Z’©“&’ª>[[>’±“&I’·!’Á€’»ª;J’Ê€’Ѫ;?I’Üv’à.s`€ÎqJ’ì5’þ’ó[v’ó.[e#’ó’óªy“ €í`€Í“’óªy[?J“v“.[et“+“`“Œ@tj“,`“l“Œ“m>[[J“wx“w.Z€“†ªØa[[s)I)‘)Ù*!*¶*ÿx“ü”—G `€Éz”¨”΀†u`xj”º`x{•®•Ø€†v`xj•Â`x|–ß— €†w`xj–õ`x}——#€ `€Í€€—(—.—E 7Z—:—E—@ `€Í`x?}€«¡ —.€Ë+Æ\”›ƒæAx¤ƒæ ± `€ÍÃ`€ÍÕ`€Íç`€Í‚]€Ö`€Í‚*]€Ì`€Í`€Í‚;[‚U`€è‚n3`x‚`€Îj`€Ñ‚”`€Îj`€Ñ‚ª`€Îj‚¶`€Î‚Æ`€Îj‚Í`€Î‚å]€Õ`€Íj‚ï]€Õ`€Í`]>‚úƒæJ‚þƒ w €ƒ«ìƒ«÷‚ƒ¬ƒƒ ¬ „ƒ+¬…ƒ4¬(†ƒA¬<‡ƒS¬Dƒ]¬Oƒt¬Z ƒ’¬l ƒ°¬~ ƒÇ¬‘ ƒÜ¬¤ -/$3++Ï+Ò-/ €€Ú€Ç€õA3GNZ€†‚/‚5¯6y`€É€‰‚Ö‚â€z€`€Í€Šƒdƒk€{€`€†€‹ƒ ƒ¨€|€` €Œƒãƒè€}€]#`€Í€„7„<€~€]€Õ`€Í€Ž„‚„ €€]€Ì`€Í[2„ž`€Í[€ „¥„¥…„«…„±z`€Í„Ä|` „Ó}]#`€Í„æ{`€†j`€Ñ„ýW]€Õ`€Íj`€Ñ`€†?€‰€®B€‹®M€Œ‚®W€Šƒ®g€RN…]€Õ`€Í…€í`€Í“N…]€Ö`€Í„…®yI…!…†…®ß=x………®ÀB…®ß]€Ö`€Ía]€Ö`€Í\€ù?……®À „¥€Ë€…L…W…n@€€€…`…n`€ÍJ…cv…iv…c.}€]#`€Í€Œ€`€Í$€‘…­…¸Žð@&…½Žð`J>…ÀŽðN…Ê…ÔX]€Õ`€Íx…Üv…Ö.}€]#`€Í€Œ?^@`€Î]€Õ`€Í€õI…êv…÷v…î.|€` €‹ `€Î,>††rJ††Iv†/.|€` €‹j†9]€Ì`€Í[v†C.z€`€Í€‰+€†W¯³€†b¯³?N†…€‚`JAC†±v†¾v†¸.}€]#`€Í€Œ€ƒ`€Î%A>†ÊŒI†Ò†ßv†Ö.€€€`€Í€'€„a`€É`€Î>†è‡V=x‡2v‡,.}€]#`€Í€Œ€…a`€Í'B‡I?N‡î‡öV` xˆ vˆv‡ø.|€` €‹]€Ì`€Í` )Rvˆ .€€€`€Í€a`€É` Iˆ!ˆ'‚ˆ°ö>ˆ0=xˆ:.€†€vˆJvˆD.~€]€Õ`€Í€d`€Î('€‡a`€Î`€Í\€›NˆŽˆš€ˆ`€Íxˆ¢vˆœ.}€]#`€Í€Œ€…a`€Í'Nˆ½ˆË€‰`€†ˆÍ€ ƒˆÔ±œˆá°ö` vˆê.}€]#`€Í€Œ.vˆ÷.~€]€Õ`€Í€K>‰ ‰H=‰‰°bx‰7„‰)±Ó&a`J€‘‰J`B‰g€Š`B>‰n‰Ü=0‰z‰€Fv‰¨…‰¢²NS`€Í*RN‰±]€Õ`€Í‰±€÷`€Íƒ‰²±œ=x‰È†‰±²Bv‰È…‰Â²N]€Õ`€ÍDa]€Ö`€Í\€ù†‰±²=xŠ;vŠ5.~€]€Õ`€Í€€‹a\+BŠL?IŠÆxŠÊ.€Œ€a`€Î€”BŠÞ?IŠîxŠò.€€.a`€†`€Î€–B‹ ?I‹x‹ .€Ž€a`€Î€™B‹4?I‹Å!v‹Óv‹Ê.|€` €‹ `€Î*B‹é?=x‹üv‹ö.~€]€Õ`€Í€JxŒvŒ.}€]#`€Í€Œ€…a`€Í'a`€Í\€û=xŒkvŒcvŒZ.|€` €‹]€Ì`€Í`](^4ŒsŒsŽŒt `€ÍŒz*`]\>Œ‚ŽNŒŽŒ›€[xŒ¥vŒ.€]€Ì`€Í[€ŽR‚Œ¦´a`€É[I "vƒ´&`€Îj0„#´;>9=0CIF$x'€‚e´'€‘?NŽ—`€èv ƒ™´&`€ègI°½…´´´JÆ?=}ÜÔ´´`€èxäƒÝ´&Z„ó´;a[[s[aa`€Í`]\\=xŽevŽ_.~€]€Õ`€Í€BvŽl.}€]#`€Í€Œa]€Ö`€Í\€ù=xŽ~vŽx.}€]#`€Í€Œ€‹a\,JދޒIvŽ©.|€` €‹v޳.€]€Ì`€Í[€Žv޽.z€`€Í€‰ŽË°bvŽÛ.~€]€Õ`€Í€€Žâ¯³€“v{s@€’€Žs–*`]\>žs=xä.€†€vôvî.}€]#`€Í€Œ€ƒ`€Î%$('€“v €¶ `€Í_'<a`€Î`€Í\€›=x0.€”€v;.€]€Ì`€Í[€Ž€E¶vM.€€€`€Í€a]€Ì[[`]`€Í\€œ=xbv\.}€]#`€Í€Œ€…a`€Í'€”‘z‘’Û@€Œ€‘’Û`€Î>‘’’ÛI’!’v’v’ .€€€`€Í€m`€Ï•a`€É`€Î!J’ *?I’2!x’@v’7.€€€`€Í€f'g^``€Ï`€ÎJ’Q*?N’g’k€•`€Íx’uv’m.€€€`€Í€R”a`€Ï`€Í-I’~!’ƒ€„x’˜€’”·Œ€–“a`€Ï`€Ï.J’¨*?J’ºx’Á.€—€€’Ó·Œa`€Í`€Î€•€•’à’唯@€—€’ö”¯’þ€•`€Í`€Î>“”¯N“ “*`]x“v“.|€` €‹-€“2¸7a`€Í`]<I“<“G“@¸Q>“P”=x“Œ.€†€!“žv“–.{€`€†€Š$“Ò'€˜€“̸7'<a`€Î`€Í\€›J“Ûx“ëu“év“â.{€`€†€Š€—€€“ý¸7a`€Í`€Î€•?=x”v”.}€]#`€Í€Œ€…a`€Í'I”(v”3”,¸Q`]q`€Îo>”;”i=x”C.€™€v”L.€]€Ì`€Í[€Ž”V¸Q`])a]€Ì[[`]`€Î\€>”p”™=x”x.€’€”Œ¸Q`]a`]\€“J” )€–•s•x˜ø@€€•Š˜ø•’€š`€†`€Î>•¤˜ø I–:x–Nv–Gv–>.€€€`€Í€m`€Ï€›•a``€Î/J–S*?I–e!x–sv–j.€€€`€Í€f'g^``€Ï`€ÎJ–„*?N–Жրœ`€Ï”C–ß"x–ì–æºz€›v–÷v–î.€€€`€Í€m`€Ïa``€Î/— €„x—#v—.€€€`€Í€€–—.ºza`€Ï`€Ï.>—7—L=‰—Aºzx—?—Aºz€”a``€Ï0I—|—†—€ºz”a`€É`€Î!J—Œ*?N˜˜ €ž`€Íx˜+v˜".€€€`€Í€€Ÿ”˜8ºz^`€Ï`€Ï`€Í1N˜H˜MW`€Íx˜Xv˜O.€€€`€Í€€Ÿ˜bºz^`€Ï`€Ï`€Í1I˜n"x˜wƒ˜r»€ '€¡^``€Ï`€Î2x˜Žƒ˜‰»€ '€¢^``€Ï`€Î2J˜ž*?J˜°x˜·.€£€‚˜Ë»Jƒ˜Ý»€˜ã¹äa`€Í`€Í`€†`€Î€—€—˜ý™ž@€£€™ž™$€ž`€Í™=W`€Í™J€š`€†`€Î>™\žN™f™h€¤`€Íx™{€™j¼‡€Ÿ“”^`€Ï`€Ï`€Í1N™”™š€`]x™¥v™œ.|€` €‹-ƒ™¸¼¸a`€Í`]<I™À™Ê„™Ä¼ï>™ÓšÍ=xš.€†€!š,vš$.{€`€†€Š$šf'€¥ƒšb¼¸'<a`€Î`€Í\€›JšoxšŠuš}všv.{€`€†€Š€£€€šž¼‡š°¼“‚š¶¼ža`€Í`€Í`€†`€Î€—IšÔ!všßšÙ¼ï`]q`€Îo>šç›­N›N›T>`€Í$›}x›j€›Y¼‡€Ÿ”^`€Ï`€Ï`€Í1›x¼“=x›….€”€v›.€]€Ì`€Í[€Ž›š¼ï`]…›¡½Üa]€Ì[[`]`€Í\€œ>›´ža=xœ<.€†€œVœQ¼“'a`€É`€Î$œ['€¦ƒœr¼¸'€§'€¨xœ¸€œ§¼‡€Ÿ”^`€Ï`€Ï`€Í1œÆ¼“'<a`€Î`€Í\€›E¾ÇÉ€©`€Ï“xЅξ‛vã€Ò¼‡m`€Ïa``€Î/ë¾âxì…ë¾â€”a``€Ï0>ðž[Nþž€¤`€Íxž€ž¼‡€Ÿ…ž¾âxž"…ž ¾â€”a``€Ï0^`€Ï`€Ï`€Í1=xžA‚ž0¼ž€ª€†žQ¿La`€Í\€˜=xžnvžh.}€]#`€Í€Œ€…a`€Í'Jž)€˜ž•žš Í@€ª€ž© Íž±€¤`€Í\>ž´ ÍNž¾žÅ*`]xžÐvžÇ.|€` €‹-€žãÀ@a`€Í`]<IžëžöžïÀ@+>žÿŸÊ=xŸ;.€†€!ŸXvŸP.{€`€†€Š$Ÿ’'€¥€ŸŽÀ@'<a`€Î`€Í\€›=xŸ¤uŸ¢vŸ›.{€`€†€Š€ª€€Ÿ´À@a`€Í\€˜JŸ¾?=x H.€†€v b [À@+`]q`€Îo$ ¡'€¦€ uÀ@'€«a`€Î`€Í\€›=x ©.€™€v ².€]€Ì`€Í[€Ž ¼À@+`])a]€Ì[[`]`€Î\€€™¡d¡i¤Q@€Ž€¡y¤Q`€Î>¡|¤QI¢H!x¢Vv¢M.€€€`€Í€f'€„^``€Ï`€ÎJ¢h*?N¢¢…€œ`€Ïx¢v¢‡.€€€`€Í€€¬'€­^``€Ï`€Ï3N¢¦¢« `€Í#¢»€¢µÀAâx¢¾”€®a`€Ï5a`€É`€Î!x¢Ìv¢Ã.€€€`€Í€€Ÿ•^`€Ï`€Ï`€Í1x¢äv¢Û.€€€`€Í€€Ÿ•€¢ñÀAâ^`€Ï`€Ï`€Í1`€ÍE¢ý££€©`€Ï“!£‚£ ÀBÖv££ÀB%m`€Ïa`€É`€Î!Š£!ÀBÖx£‚£!ÀBÖ€”a``€Ï0>£$£yI£,!£1€…x£W£RÀB%€–‚£bÀBÖa`€Ï`€Ï.J£g*?N£ƒ£‰>`€Í#£‘€£‹ÀAâx£””€®a`€Ï5a`€É`€Î!+x£©v£ .€€€`€Í€€Ÿx£¹€£³ÀA—a``€Ï0^`€Ï`€Ï`€Í1`€ÍI£Ã"!£Í‚£ÇÀC{"x£ß£ÙÀC{`€Í€ '€¡^``€Ï`€Î2x£÷£ñÀC{`€Í€ '€¢^``€Ï`€Î2>¤¤"J¤*?J¤(x¤/.€¯€¤AÀB%‚¤GÀC{a`€Í`€Í`€Î€š€š¤V¤[©é@€¯€¤l©é¤t `€Í¤‚>`€Í`€Î>¤‰©éN¤“¤š*`]x¤¥v¤œ.|€` €‹.€¤·ÀDáa`€Í`]=I¤Â!¤Í‚¤ÆÀE>¤Ö¦›=x¤äv¤Þ.}€]#`€Í€Œ€…a`€Í'I¤ùv¥¤ýÀE`]q`€Îo>¥ ¥¢=x¥.€†€¥3¥-ÀDì$¥n'€°€¥KÀDá'€±a`€Î`€Í\€›=x¥z.€™€v¥ƒ.€]€Ì`€Í[€Ž¥ÀE`])a]€Ì[[`]`€Î\€I¥©!¥³¥­ÀDì>¥¼¦=x¥ñ.€”€v¥ü.€]€Ì`€Í[€Ž¦ÀE`]¦ÀDì`€Ía]€Ì[[`]`€Í\€œ>¦#¦•=x¦r.€’€¦†ÀE`]a`]\€“I¦¢x¦«€¦¦ÀDáf'€²^``€Ï`€Î>¦¾©N¦ï¦ü€³`€Íx§€¦þÀDဟv§'€²m`€Ï^`€Ï`€Ï`€Í1=Ч"ÀEx§4v§+.|€` €‹.ƒ§FÀFÞa`€Í`]=I§[§f‚§_ÀE>§o¨4=x§¯.€†€!§Áv§¹.{€`€†€Š$§ó'Y€§ìÀDá'<a`€Î`€Í\€›J§þx¨u¨ v¨.{€`€†€Š€¯€€¨ ÀDá¨&ÀDìa`€Í`€Í`€Î€š?=x¨Cv¨=.}€]#`€Í€Œ€…a`€Í'=x¨X.€†€v¨i¨bÀE`]q`€Îo$¨™'€´€¨’ÀDá'<a`€Î`€Í\€›=x¨¢.€†€u¨¼v¨³¨¬ÀE`]`€Îf$¨Þ'€µ€¨×ÀDá'<a`€Î`€Í\€›=x¨è.€™€v¨ñ.€]€Ì`€Í[€Ž¨ûÀE`]*a]€Ì[[`]`€Î\€>©©Ó=x©R.€†€!©dv©\.{€`€†€Š$©–'Y€©ÀDá'<a`€Î`€Í\€›J©Ÿx©¯u©­v©¦.{€`€†€Š€¯€€©ÁÀDá©ÇÀDìa`€Í`€Í`€Î€šJ©Ú)€›ªkªpªÕ@€†€ªyªÕª€¶`€Îª‘S`€Í\>ªšªÕIª !€ª¥ÀI–=0ª°ª¶FªÉÀI¢?€œ«8«=­@@€”€«G­@«L€·]€Ì[[«\*`]«k>`€Í\>«r­@@!v«‡«€ÀJq`€Îo««I«•!v«¡«šÀJs`€Îq>«­¬ =x«µ.€¸€«ÆÀJ‚«ÎÀJ a`]`€Í\€ž=x«ã€«ÜÀIô=v«ë«äÀJ `€Í_‚«óÀJ a[[\€óJ¬?N¬¬€¹[x¬&€¬ÀIô€ºv¬9¬2ÀJ `€Í_4¬?¬?¬O]€Õ`€ÍJ¬E¬M€í`€Í“a[a[[6I¬Wv¬b¬[ÀJ`€Îi>¬o¬ñ>N¬‘K]€ü`€Ív¬‘x¬‘‚¬‹ÀJ €»'€¼a`]€Õ`€Í7L]€ü`€Í€þEx¬‘„ÀKBMa`€Î>N¬€€½`€Ív¬„ÀKBO`€Í>¬¬ë=x¬§.€¸€¬¸ÀJ…¬ÀÀK¯a`]`€Í\€ž=|¬×ƒ¬ÒÀJ¼J…¬ÛÀK¯>¬ø­<=x­.€¸€­ÀJ‚­ÀJ a`]`€Í\€ž=|­,ƒ­'ÀJ¼J‚­0ÀJ €­Ÿ­¤®@€™€­¬®­±€·]€Ì[[­Á*`]­Î>`€Î\>­Õ®@v­é­âÀLŒq`€Îo­â­ï=x­ý€­öÀL}=v®­þÀLŒ `€Í_‚® ÀL–a[[\€ó€ž®[®`¯4@€¸€®p¯4®x*`]®‡>`€Í\>®Ž¯4I®”®§v®Ÿ€®˜ÀM]€Õ`€ÍcJ®°?=x®½.€†€x®×u®Õv®Î€®ÇÀM]€Õ`€Íc€ ®àÀMa`€É`€Î8$¯/'€¨®óÀM'€¾v¯'€¯ ÀM `€Í_'<a`€Î`€Í\€›/A/‹5é6ë89ưA€¿€¯N°¯S€À`€Ï`€ÎJ¯~"""x¯ˆ€¯ÀN5€Á7Aa``€Î9x¯š€¯‘ÀN5€Â7Za``€Î:"x¯Ì€¯ÃÀN5€Á7aa``€Î9x¯Þ€¯ÕÀN5€Â7za``€Î:"x°€¯ýÀN5€Á70a``€Î9x°€°ÀN5€Â79a``€Î:€…°!°&°ÄA€Ã€°F°Ä°K€À`€Ï`€ÎJ°\""°\€„€°mÀO@°–€°ÀO@7-a`€É`€Î!°¿€°¶ÀO@7_a`€É`€Î!OŸ-ƒNNO"OŸ €¡€Ú;€Ä€÷€Â€¤„Œ„’Ÿ|€Å`€É€§„τ߀†€Æ€¡`€Ïj„Þ`€Ï€¨…4…I€4€¡]€Õ[€©…‹…£€€Ç€¡`<…•>€ª€°†{†€€€È€¡`€Ï“€«†Ë†ó€¡€É€¡]€Õ`€Ïx†Û.€Ê€¡a]€Õ`€Ï€»€¬€±ˆˆ€€€Ë€¡`€Ï“€­‰‰ €P`€Ï€Á‰‰‰C‰‰C‰4]€Õ[‰8P`€Ï`€¤?€¨€ÀP߀­ÀPì ‰€Ë €³‰Ø‰ß‹+@€Ì‰ç‹+`€Í>‰ê‹+>NŠK]€ü[vŠvŠ.4€¡]€Õ[€¨L]€ü[€þExŠ€ÀQMMa`€Î>N‰ù€Í[vŠ%€ÀQMO[A>Š%‹IŠ-%ŠCŠ1ÀQ`€Í>ŠNŠ”=xŠX.€Î€¡ŠhÀQ`€Ía`€Í\€µBŠ„?NРЧ*`]&лЩÀQ`]IŠÌvŠ×‚ŠÐÀR`€ÎkBŠÝ?=xŠí.€Ï€¡‚ŠúÀRa`]\€¶J‹x‹v‹.€Ç€¡`<€©€Ða`€Í@€µ‹0‹5Œ@€Î€¡‹DŒ‹L€Ñ`€Í\>‹WŒI‹ v‹¬v‹¤.€Ç€¡`<€©€ƒ`€ÎB=x‹Àv‹¸.€Ç€¡`<€©€Ò'€Óa`€É\C?=x‹Ûv‹Ó.€Ç€¡`<€©€Ò€‹áÀR›a`€É\C=w‹ñ.€Ë€¡”€±€¶Œ Œ@@€Ï€¡Œ@Œ&*`]\>Œ.@=xŒ4.€Ô€¡“xŒ>.€Õ€¡€ŒLÀSVa`]`€Í€·a`€Ï`€Í\€½=xŒZ.€Ô€¡”$Œ—xŒg.€Ö€¡€ŒsÀSVa`]`€Í€¸xŒ}.€×€¡€ŒŽÀSVa`]`€Í€¹a`€Ï`€Í\€½IŒŸ!Œ¯vŒª€Œ£ÀSV`€Ía=xŒ¸.€Ô€¡•uŒÍvŒÉ€ŒÂÀSV`€Íaa`€Ï`€Í\€½?IŒÖ!ŒívŒá€ŒÚÀSV]€Ì`€Í`€Íd>ŒöŽN€Ø]€Õ`€Íx*v%u#v€ÀSV]€Ì`€Í`€Íd\]€Ö`€Í?^@`€Î]€Õ`€Í€õ=xG:ÀT‰€Ù^a`€Í`€Í`€Ï\D=xU.€Ú€¡a\€¼>NxK]€ü`€ÍvxxÀT‰L]€ü`€Í€þExx‚ÀU7Ma`€Î>Np `€Ív†‚ÀU7O`€Í>†í=x.€Ô€¡”xš.€Û€¡€¨ÀSVƒ°ÀUƒa`]`€Í`€Í€ºa`€Ï`€Í\€½=xÀ.€Ô€¡•uãxÝuÜvÑ€ÊÀSV]€Ì`€Í`€ÍdRƒÞÀUƒa`€É`€Ía`€Ï`€Í\€½=xõ.€Ú€¡a\€¼IŽ !ŽvŽ€ŽÀSV]€Õ`€Íc>Ž(ŽZ=xŽ0.€Ô€¡•xŽ:.€Ü€¡€ŽLÀSVa`]`€Í€¿a`€Ï`€Í\€½IŽavŽl€ŽeÀSVq`€Îo>ŽtŽÐIŽ|Ž’vއ€Ž€ÀSV[e)a`€É`€Î">Ž›ŽÊ=xŽ¥.€Ô€¡•'€Ýa`€Ï`€Í\€½?IŽ×vŽâ€ŽÛÀSVs`€Îq>Žî×IŽö"! v€ŽúÀSV[e&) z)v€ÀSV[e€ƒ`€Î>5ÑNCL€Þ`€Íx‘xv&mvb€[ÀSV[e]€Õ[€ß`€Í4zz{>[`€ÍJ…$'€¨ˆÀWÒ'€¨aa[`€Í]€Ö`€ÍE€à'€á^`€Í`€ÍF=x¥.€Ô€¡•$È'€â¾ÀW‹'€ãa`€Ï`€Í\€½?IÞ!ôvé€âÀSV[e>ý<=x.€Ô€¡•$5'€äv'€ ÀSV[e'€åa`€Ï`€Í\€½?€·EL @€Õ€¡Y a*`]`€ÍJr#~vy€rÀXÎ`€Í`'$ 'gv˜€‘ÀXÎ`€Í`'€á`€Í€¸¥¬‘´@€Ö€¡·‘´¿*`]`€Í>Ç‘´NÔ[`€ÍIàuôvë€äÀY9`€Îf>÷‘%=‰ÿÀYQ$‘'€æv‘€‘ÀY9 `€Í_>‘,‘U=‰‘4ÀYQ$‘O'€„v‘I€‘BÀY9 `€Í_I‘\!‘qv‘g€‘`ÀY9`€Íb=‰‘zÀYQx‘‘zÀYQ€$‘œ'€çv‘€‘‰ÀY9`€Íb'€èa`€Í`€ÍG?J‘£‘ªÀYQ€¹‘¹‘À’@€×€¡‘Ð’‘Ø*`]`€Í>‘à’J‘æ#v‘ô€‘íÀZI`€Îj'€é'`€Í€º’’#“@€Û€¡’0“’8*`]’G`€Í`€Í>’P“N’Z’d€ê[#%’xv’m€’fÀZŸ[e]€Õ[|’œv’‘€’ŠÀZŸ[e€ ’¥ÀZ©’Êv’¿€’¸ÀZŸ[e’ÍÀZ©a`€É`€Î"[J’Úx’ô$’ô'€ë’êÀZ©'€ì€#&’÷ ‚’÷ÀZÂ`€Î'€í'`€Ía`€Í`€ÍG€»““(–/@€Ê€¡“>–/]€Õ`€Ï>“A–/N“K“P`€Ï“N“]“c€î`€Ï“>N“K]€ü[v“v“.4€¡]€Õ[€¨L]€ü[€þEx“‚À[ÉMa`€Î>N“u*[v“–‚À[ÉO[A>“–•ÕI“ž!%“©ƒ“¢À\`]B“µ?I“Åv“ГÉÀ\`]`€ÎkB“Ö?=ˆ”*À[¨”1I`€Ï€”:À[¨v”Vx”@.€Õ€¡”NÀ\`]a`]`€Í€·m`€Ï=‰”‰À[¶”‘I`€Ï”¥À[¶x”Çv”Àx”¬.€Ö€¡”¸À\`]a`]`€Í€¸m`€Ï€v”âx”É.€×€¡”ÚÀ\`]a`]`€Í€¹m`€Ïa``€Ï0I•!•2v•&•À\`]]€Ì`€Í`€Íd>•;•Ï>N•mK]€ü`€Ív•mv•mu•kv•`•YÀ\`]]€Ì`€Í`€Íd\]€Ö`€ÍL]€ü`€Í€þEx•m„À]‰Ma`€Î>N•N`€Ív•s„À]‰O`€Í>•s•Ç=‰•À[¶•‡I`€Ï•À[¶v•¶x•—.€Û€¡•¥À\`]…•­À^a`]`€Í`€Í€ºm`€Ï?=‰–À[¶x– –À[¶€—a``€Ï0J––J`€Ï€–À[¨–%À[¶€¼–4–9–w@€Ú€¡–A–w\>–D–w=w–J.€Ë€¡x–Yv–J.€Ë€¡`€Ï€¬€”a``€Ï0€±=w–a.€È€¡“€°€½–|–™T@€Ô€¡–‡™T–Œ€ï`€Ï–›$`€Í\>–¡™TN–«–±€ð]€Õ`€Íx–¸–³À__€»'€¡a`]€Õ`€Í7I—"—€— À_Sv—$v—.€É€¡]€Õ`€Ï€«m`€ÏLa`€É`€Î!!—9v—..P`€Ï€­>—B˜'N—N—T€ñ`€Ïx—{x—nv—`.€É€¡]€Õ`€Ï€«€ò€—sÀ_Sa`€Ï]€Ö`€ÏM€ó4—‚—‚—¡—ƒ€ñ`€Ï—Š€ô`€Ï`€ÏJ—”x—šƒ—”À`d€„—œÀ`pa``€Ï0aa`€Ï`€Ï`€Ï`€ÏN=Š—ªÀ_uRN—²]€Õ`€Í—²€í`€Í“>N—ÍK]€ü`€Ív—Í‚—ÍÀ_uL]€ü`€Í€þEx—Í…À`öMa`€Î>N—Å€õ`€Ív…À`öO`€Í=x—á„—²À`ÓB—á€Æ†—ñÀaB€ñƒ—þÀ`mv˜ .P`€Ï€­a]€Ö`€Í\€ù„—²À`Ó?C˜]"v˜j‚˜dÀ_u€ƒ`€Î%˜‹x˜„v˜~‚˜xÀ_u€`€Í$€öa`€ÍO'a`€É`€Î>˜’˜±=x˜ ‚˜šÀ_u€÷“a`€Ï`€ÍPC˜·"v˜Ä‚˜¾À_u€ƒ`€Î%˜äx˜Ýv˜Ø‚˜ÒÀ_u€ø`€ÍQ€öa`€ÍO'a`€É`€Î>˜ë™ =x˜ù‚˜óÀ_u€ùa`€ÍR>N™#K]€ü`€Ív™#‚™#À_uL]€ü`€Í€þEx™#ƒÀbªMa`€Î>N™€õ`€Ív™*ƒÀbªO`€Í>™*™P=x™2.€ú€¡€™=À_S„™EÀböa`€Ï`€Í\€¾€¾™Y™^;@€ú€¡™h;™m€ï`€Ï™|$`€Í\>™‚;C™«x™Âv™².€Ë€¡`€Ï€¬€è“a``€ÎS>™Çš=x™×v™Ï.€Ç€¡`<€©€Ò'€¡a`€É\C=w™ê.€Ë€¡x™ùv™ê.€Ë€¡`€Ï€¬g”a``€ÏT€±Cšq!š‡všx.€È€¡`€Ï€ª€šŠÀcda`€É`€Î!>š’›sIššxš­všž.€È€¡`€Ï€ª€›xš¼jš¯`€Ïg”a``€ÏTa``€Î/>šÁ›=xšÓvšË.€Ç€¡`<€©€ÒxšÝ'€û€üxšìvšß.€É€¡]€Õ`€Ï€«Rvší.€È€¡`€Ï€ªa`€Ï`€ÏUa`€Ï`€ÍVa`€É\C>› ›1=x›v›.€Ç€¡`<€©€Ò'€¡a`€É\C=w›9.€È€¡x›_x›Zv›K.€È€¡`€Ï€ª€”a``€Ï0€ýj›a`€Ïa``€ÏW€°I›zx›…€›~Àcd€›v›•v›‡.€É€¡]€Õ`€Ï€«m`€ÏLa``€Î/>›œ=x›Ôv›Ì.€Ç€¡`<€©€Òx›ß›ÚÀcp€þx›õv›è.€É€¡]€Õ`€Ï€«R€›öÀcda`€Ï`€ÏU^`€Ï`€Í`€ÍXa`€É\C>œ œY=xœHvœ@.€Ç€¡`<€©€ÒœNÀcpa`€É\C=wœƒ.€È€¡xœ©xœ¤vœ•.€È€¡`€Ï€ª€”a``€Ï0€ýjœ«`€Ïa``€ÏW€°I€ Àcdx!j`€Ïg”a``€ÏTa`€É`€Î!=w&.€Ë€¡x5v&.€Ë€¡`€Ï€¬€”a``€Ï0€±?€¿@GŸz@€Ü€¡XŸz`*`]`€Í>hŸzNr|€ê[#%v…€~Àg‘[e]€Õ[z´v©€¢Àg‘[e€ 4ÇÇìÈ>[`€ÎJÒØÒÀgðvâ€ÛÀg‘[ea`€É`€Î"[N÷ž€ÿ`<ž>=xž)‚žÀh-€Ò'a`€É\CNž=žC€`€Î)>NžqK]€ü`€Ívžqužqvžj€žcÀg‘]€Õ`€ÍcL]€ü`€Í€þExžq„ÀhxMa`€Î>NžX`€Ívžt„ÀhxO`€Í>žtŸ3Iž|!ƒžÀhe=xž–‚žˆÀh-€Ò'€áa`€É\C?=xž·‚ž©Àh-€Ò…ž½Àh×a`€É\CIžÍ&žÚ |žÚžÑÀg©…žÛÀh×`€Î>žåŸ=xžý‚žïÀh-€Ò'€ía`€É\C?=‹Ÿ Àhe*=xŸG‚Ÿ9Àh-€Ò'€ìa`€É\CJŸWxŸl‚Ÿ^Àh-€Ða`€Í@QR}S8X°YZ+Z[w^È_5cFgsiá €£„ „„‰A„ „‰„&]€Õ[„BP`€Ïj`€Ñ`€ÍJ„Vx„„V€Á€„]Àj9„sÀjH€Ìa`€Í€³jOçjjj €Â€Ù;€Ä€Ä18ŠA€þ@ŠH`€ÍTm`€Ï`€ÍJcxj€cÀjä€xp'€û€üxzsÀjðgvƒ€|Àjäm`€Ïa``€ÏTa`€Ï`€ÍVa`€Í`€ÍG€Å…… ŠèA…Šè…$`€Í…'m`€Ïj`€Ñ…4`€Ïj`€Ñ`€Í>…DŠèI…H…S…LÀkœJ…\€…cÀk?=#…y‚…kÀk®Š…kÀk®“+`€ÏN…†…]€Õ`€Íx…—€…’Àk€»'€¡a`]€Õ`€Í7N…ª…±[]€Õ`€Í…»€í`€Í“>N…ÒK]€ü`€Ív…Òƒ…ÒÀlL]€ü`€Í€þEx…Ò…Àl`Ma`€Î>N…Ê€õ`€Ív…Ý…Àl`O`€Í>…ÝŠÊN…ç…ó`€Íx…ú†…õÀl¬ a`€ÍYN††" `€Íx†1††,Àl¬€Ÿ“x†Jv†C††>Àl¬m`€Ïgv†X‡†LÀlÑm`€Ïa``€ÏT^`€Ï`€Ï`€Í1N†r ]€Õ`€ÍI†ƒ!†•†‡Àk®`€Ï“a`€É`€Î!>†›ˆúN‡f‡t ]€Õ`€Í‡v€Æ‡‡†ÀlÑmx‡¬‡¥Àkœ`€Ïgv‡À‡®Àlûm`€Ïa``€ÏT=‡ÏÀmq ‡Ý€÷`€Íx‡ì‡ÞÀm¬ €÷“a`€Ï`€ÍP=ˆÀlÑxˆ;xˆ‡ˆÀlÑ€Ÿvˆ3xˆ/ˆ$Àmq R“a`€Ï`€ÍUm`€Ï^`€Ï`€Ï`€Í1 a`€ÍYIˆMvˆ_ˆQÀm¬ €ƒ`€Î%>ˆkˆô=xˆˆuÀmq Bˆˆ€Æ‡ˆ˜ÀlÑmxˆÛxˆÀˆ¹Àkœ`€ÏgvˆÔˆÂÀlûm`€Ïa``€ÏTgˆÝÀk®`€Ïa``€ÏTa]€Ö`€Í\€ù?>‰‰n=‰ Àmq ‰€Æ‡‰'ÀlÑmx‰M‰FÀkœ`€Ïgv‰a‰OÀlûm`€Ïa``€ÏTN‰| `€Í=x‰œ„‰•Àl‰ÉŠÃIŠvŠŠÀp d`€ÎJŠ!'?NŠ6Š=[`€Í$Št5ŠVŠB`€ÍŠBÀoÅ #ŠBŠBÀpS 'ŠBÀpS `€Í`€ÍŠ]ÀlûŠoÀp =#ŠŠ|ÀoÅ Š|ÀoÅ xŠ˜'€û€üuЧ‚ŠšÀk®a`€Ï`€ÍV+`€ÍJаŠ·Àp@ aa`€Í`€Í]€Ö`€ÍEa]€Ö`€Í\€ùJŠÎxŠÜ„ŠÕÀl<€à'€¡^`€Í`€ÍF€Æ“ÈA-“È5$`€Í@€ñ`€ÏjH`€Ï Pm`€Ïj`€Ñ]€Õ`€Í>Y“È@xjdÀqi€Á“a``€Î9dnOŽŽ$a`€Í`€Ï`€ÎŽ0ÑŽ8$`€ÍŽB€œ`€Ï`€Î>ŽIÑNŽSŽX`€ÏxŽ_„ŽZÀq쀖…ŽjÀq÷a`€Ï`€Ï.JŽv""""""""""""xŽ‚†Ž}Àr€Á7 a``€Î9xŽ”†ŽÀr€Â7 a``€Î:Ž®†Ž©Àr7 a`€É`€Î!ŽÈ†ŽÃÀr7€…a`€É`€Î!Žâ†ŽÝÀr7–€a`€É`€Î!Žü†Ž÷Àr7˜a`€É`€Î!"x†Àr€Á7 a``€Î9x(†#Àr€Â7  a``€Î:B†=Àr7 (a`€É`€Î!\†WÀr7 )a`€É`€Î!v†qÀr7 /a`€É`€Î!†‹Àr7 _a`€É`€Î!ª†¥Àr7°a`€É`€Î!Ć¿Àr7Àþÿa`€É`€Î!IÖá‚ÚÀq}Jêxö€ñÀq]€»'€¡a`]€Õ`€Í7?N []€Õ`€Í€í`€Í“N%5`€Ï7I`€ÏxG@Àq}`€ÏgIÀqia``€ÏT7 >NmK]€ü`€Ívmxm€hÀq]€»'€¡a`]€Õ`€Í7L]€ü`€Í€þExm†Àt¤Ma`€Î>N`€õ`€Ívz†Àt¤O`€ÍA>z“µ=€ÀuxŒ‡‡Àu€öa`€ÍOI˜x¨v¡‡œÀum`€Ï€Â…«ÀtWa``€Î:>¼ê=xË„ÄÀt7J‡ÏÀua`€Í\€ûBÜ?Nõ‘`€Ï“N‘`€ÏE‘(‘1‘3€©`€Ï“x‘:‘8Àuß €›v‘A‡‘<Àum`€Ïa``€Î/‘KÀuß x‘I‘KÀuß €”a``€Ï0>‘N“xI‘V‘ZÀqʇ‘gÀu‘mÀuß a`€Í`€Ï`€Î=‘qÀuÏ ‘‚Àuß ?I‘Œx‘¥x‘’‘Àuß g‘”ÀuÀa``€ÏT€Á…‘¨ÀtWa``€Î9>‘¹“rI’““,=“Àuß x“ “Àuß €”a``€Ï0=“7ÀuÀ“JÀuß =“UÀuÏ +?=x“…„“~Àt7Jx“ªx“އ“‰Àu€Ÿ“˜ÀuÀ^`€Ï`€Ï`€Í1€öa`€ÍOa`€Í\€ûJ“¹„“ÀÀt7x jÅjÈktqAx  Ofile:///github/home/.pub-cache/hosted/pub.dartlang.org/args-2.3.0/lib/args.dart§// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. export 'src/arg_parser.dart' show ArgParser; export 'src/arg_parser_exception.dart' show ArgParserException; export 'src/arg_results.dart' show ArgResults; export 'src/option.dart' show Option, OptionType; NN<-@/2package:args/args.dartdfile:///github/home/.pub-cache/hosted/pub.dartlang.org/args-2.3.0/lib/src/allow_anything_parser.dart‹*// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'arg_parser.dart'; import 'arg_results.dart'; import 'option.dart'; import 'parser.dart'; /// An ArgParser that treats *all input* as non-option arguments. class AllowAnythingParser implements ArgParser { @override Map get options => const {}; @override Map get commands => const {}; @override bool get allowTrailingOptions => false; @override bool get allowsAnything => true; @override int? get usageLineLength => null; @override ArgParser addCommand(String name, [ArgParser? parser]) { throw UnsupportedError( "ArgParser.allowAnything().addCommands() isn't supported."); } @override void addFlag(String name, {String? abbr, String? help, bool? defaultsTo = false, bool negatable = true, void Function(bool)? callback, bool hide = false, List aliases = const []}) { throw UnsupportedError( "ArgParser.allowAnything().addFlag() isn't supported."); } @override void addOption(String name, {String? abbr, String? help, String? valueHelp, Iterable? allowed, Map? allowedHelp, String? defaultsTo, void Function(String?)? callback, bool allowMultiple = false, bool? splitCommas, bool mandatory = false, bool hide = false, List aliases = const []}) { throw UnsupportedError( "ArgParser.allowAnything().addOption() isn't supported."); } @override void addMultiOption(String name, {String? abbr, String? help, String? valueHelp, Iterable? allowed, Map? allowedHelp, Iterable? defaultsTo, void Function(List)? callback, bool splitCommas = true, bool hide = false, List aliases = const []}) { throw UnsupportedError( "ArgParser.allowAnything().addMultiOption() isn't supported."); } @override void addSeparator(String text) { throw UnsupportedError( "ArgParser.allowAnything().addSeparator() isn't supported."); } @override ArgResults parse(Iterable args) => Parser(null, this, Queue.of(args)).parse(); @override String get usage => ''; @override dynamic defaultFor(String option) { throw ArgumentError('No option named $option'); } @override dynamic getDefault(String option) { throw ArgumentError('No option named $option'); } @override Option? findByAbbreviation(String abbr) => null; @override Option? findByNameOrAlias(String name) => null; } lNN<B1 / 3 * # $ ;E  %*A !(("*C #!($-*H #F -2  &4 &4 3 2+package:args/src/allow_anything_parser.dartYfile:///github/home/.pub-cache/hosted/pub.dartlang.org/args-2.3.0/lib/src/arg_parser.dartµñ// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'allow_anything_parser.dart'; import 'arg_results.dart'; import 'option.dart'; import 'parser.dart'; import 'usage.dart'; /// A class for taking a list of raw command line arguments and parsing out /// options and flags from them. class ArgParser { final Map _options; final Map _commands; /// A map of aliases to the option names they alias. final Map _aliases; /// The options that have been defined for this parser. final Map options; /// The commands that have been defined for this parser. final Map commands; /// A list of the [Option]s in [options] intermingled with [String] /// separators. final _optionsAndSeparators = []; /// Whether or not this parser parses options that appear after non-option /// arguments. final bool allowTrailingOptions; /// An optional maximum line length for [usage] messages. /// /// If specified, then help messages in the usage are wrapped at the given /// column, after taking into account the width of the options. Will refuse to /// wrap help text to less than 10 characters of help text per line if there /// isn't enough space on the line. It preserves embedded newlines, and /// attempts to wrap at whitespace breaks (although it will split words if /// there is no whitespace at which to split). /// /// If null (the default), help messages are not wrapped. final int? usageLineLength; /// Whether or not this parser treats unrecognized options as non-option /// arguments. bool get allowsAnything => false; /// Creates a new ArgParser. /// /// If [allowTrailingOptions] is `true` (the default), the parser will parse /// flags and options that appear after positional arguments. If it's `false`, /// the parser stops parsing as soon as it finds an argument that is neither /// an option nor a command. factory ArgParser({bool allowTrailingOptions = true, int? usageLineLength}) => ArgParser._({}, {}, {}, allowTrailingOptions: allowTrailingOptions, usageLineLength: usageLineLength); /// Creates a new ArgParser that treats *all input* as non-option arguments. /// /// This is intended to allow arguments to be passed through to child /// processes without needing to be redefined in the parent. /// /// Options may not be defined for this parser. factory ArgParser.allowAnything() = AllowAnythingParser; ArgParser._(Map options, Map commands, this._aliases, {bool allowTrailingOptions = true, this.usageLineLength}) : _options = options, options = UnmodifiableMapView(options), _commands = commands, commands = UnmodifiableMapView(commands), allowTrailingOptions = allowTrailingOptions; /// Defines a command. /// /// A command is a named argument which may in turn define its own options and /// subcommands using the given parser. If [parser] is omitted, implicitly /// creates a new one. Returns the parser for the command. /// /// Note that adding commands this way will not impact the [usage] string. To /// add commands which are included in the usage string see `CommandRunner`. ArgParser addCommand(String name, [ArgParser? parser]) { // Make sure the name isn't in use. if (_commands.containsKey(name)) { throw ArgumentError('Duplicate command "$name".'); } parser ??= ArgParser(); _commands[name] = parser; return parser; } /// Defines a boolean flag. /// /// This adds an [Option] with the given properties to [options]. /// /// The [abbr] argument is a single-character string that can be used as a /// shorthand for this flag. For example, `abbr: "a"` will allow the user to /// pass `-a` to enable the flag. /// /// The [help] argument is used by [usage] to describe this flag. /// /// The [defaultsTo] argument indicates the value this flag will have if the /// user doesn't explicitly pass it in. /// /// The [negatable] argument indicates whether this flag's value can be set to /// `false`. For example, if [name] is `flag`, the user can pass `--no-flag` /// to set its value to `false`. /// /// The [callback] argument is invoked with the flag's value when the flag /// is parsed. Note that this makes argument parsing order-dependent in ways /// that are often surprising, and its use is discouraged in favor of reading /// values from the [ArgResults]. /// /// If [hide] is `true`, this option won't be included in [usage]. /// /// If [aliases] is provided, these are used as aliases for [name]. These /// aliases will not appear as keys in the [options] map. /// /// Throws an [ArgumentError] if: /// /// * There is already an option named [name]. /// * There is already an option using abbreviation [abbr]. void addFlag(String name, {String? abbr, String? help, bool? defaultsTo = false, bool negatable = true, void Function(bool)? callback, bool hide = false, List aliases = const []}) { _addOption( name, abbr, help, null, null, null, defaultsTo, callback == null ? null : (value) => callback(value as bool), OptionType.flag, negatable: negatable, hide: hide, aliases: aliases); } /// Defines an option that takes a value. /// /// This adds an [Option] with the given properties to [options]. /// /// The [abbr] argument is a single-character string that can be used as a /// shorthand for this option. For example, `abbr: "a"` will allow the user to /// pass `-a value` or `-avalue`. /// /// The [help] argument is used by [usage] to describe this option. /// /// The [valueHelp] argument is used by [usage] as a name for the value this /// option takes. For example, `valueHelp: "FOO"` will include /// `--option=` rather than just `--option` in the usage string. /// /// The [allowed] argument is a list of valid values for this option. If /// it's non-`null` and the user passes a value that's not included in the /// list, [parse] will throw a [FormatException]. The allowed values will also /// be included in [usage]. /// /// The [allowedHelp] argument is a map from values in [allowed] to /// documentation for those values that will be included in [usage]. /// /// The [defaultsTo] argument indicates the value this option will have if the /// user doesn't explicitly pass it in (or `null` by default). /// /// The [callback] argument is invoked with the option's value when the option /// is parsed, or with `null` if the option was not parsed. /// Note that this makes argument parsing order-dependent in ways that are /// often surprising, and its use is discouraged in favor of reading values /// from the [ArgResults]. /// /// If [hide] is `true`, this option won't be included in [usage]. /// /// If [aliases] is provided, these are used as aliases for [name]. These /// aliases will not appear as keys in the [options] map. /// /// Throws an [ArgumentError] if: /// /// * There is already an option with name [name]. /// * There is already an option using abbreviation [abbr]. void addOption(String name, {String? abbr, String? help, String? valueHelp, Iterable? allowed, Map? allowedHelp, String? defaultsTo, void Function(String?)? callback, bool mandatory = false, bool hide = false, List aliases = const []}) { _addOption(name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo, callback, OptionType.single, mandatory: mandatory, hide: hide, aliases: aliases); } /// Defines an option that takes multiple values. /// /// The [abbr] argument is a single-character string that can be used as a /// shorthand for this option. For example, `abbr: "a"` will allow the user to /// pass `-a value` or `-avalue`. /// /// The [help] argument is used by [usage] to describe this option. /// /// The [valueHelp] argument is used by [usage] as a name for the value this /// argument takes. For example, `valueHelp: "FOO"` will include /// `--option=` rather than just `--option` in the usage string. /// /// The [allowed] argument is a list of valid values for this argument. If /// it's non-`null` and the user passes a value that's not included in the /// list, [parse] will throw a [FormatException]. The allowed values will also /// be included in [usage]. /// /// The [allowedHelp] argument is a map from values in [allowed] to /// documentation for those values that will be included in [usage]. /// /// The [defaultsTo] argument indicates the values this option will have if /// the user doesn't explicitly pass it in (or `[]` by default). /// /// The [callback] argument is invoked with the option's value when the option /// is parsed. Note that this makes argument parsing order-dependent in ways /// that are often surprising, and its use is discouraged in favor of reading /// values from the [ArgResults]. /// /// If [splitCommas] is `true` (the default), multiple options may be passed /// by writing `--option a,b` in addition to `--option a --option b`. /// /// If [hide] is `true`, this option won't be included in [usage]. /// /// If [aliases] is provided, these are used as aliases for [name]. These /// aliases will not appear as keys in the [options] map. /// /// Throws an [ArgumentError] if: /// /// * There is already an option with name [name]. /// * There is already an option using abbreviation [abbr]. void addMultiOption(String name, {String? abbr, String? help, String? valueHelp, Iterable? allowed, Map? allowedHelp, Iterable? defaultsTo, void Function(List)? callback, bool splitCommas = true, bool hide = false, List aliases = const []}) { _addOption( name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo?.toList() ?? [], callback == null ? null : (value) => callback(value as List), OptionType.multiple, splitCommas: splitCommas, hide: hide, aliases: aliases); } void _addOption( String name, String? abbr, String? help, String? valueHelp, Iterable? allowed, Map? allowedHelp, defaultsTo, Function? callback, OptionType type, {bool negatable = false, bool? splitCommas, bool mandatory = false, bool hide = false, List aliases = const []}) { var allNames = [name, ...aliases]; if (allNames.any((name) => findByNameOrAlias(name) != null)) { throw ArgumentError('Duplicate option or alias "$name".'); } // Make sure the abbreviation isn't too long or in use. if (abbr != null) { var existing = findByAbbreviation(abbr); if (existing != null) { throw ArgumentError( 'Abbreviation "$abbr" is already used by "${existing.name}".'); } } // Make sure the option is not mandatory with a default value. if (mandatory && defaultsTo != null) { throw ArgumentError( 'The option $name cannot be mandatory and have a default value.'); } var option = newOption(name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo, callback, type, negatable: negatable, splitCommas: splitCommas, mandatory: mandatory, hide: hide, aliases: aliases); _options[name] = option; _optionsAndSeparators.add(option); for (var alias in aliases) { _aliases[alias] = name; } } /// Adds a separator line to the usage. /// /// In the usage text for the parser, this will appear between any options /// added before this call and ones added after it. void addSeparator(String text) { _optionsAndSeparators.add(text); } /// Parses [args], a list of command-line arguments, matches them against the /// flags and options defined by this parser, and returns the result. ArgResults parse(Iterable args) => Parser(null, this, Queue.of(args)).parse(); /// Generates a string displaying usage information for the defined options. /// /// This is basically the help text shown on the command line. String get usage { return generateUsage(_optionsAndSeparators, lineLength: usageLineLength); } /// Returns the default value for [option]. dynamic defaultFor(String option) { var value = findByNameOrAlias(option); if (value == null) { throw ArgumentError('No option named $option'); } return value.defaultsTo; } @Deprecated('Use defaultFor instead.') dynamic getDefault(String option) => defaultFor(option); /// Finds the option whose abbreviation is [abbr], or `null` if no option has /// that abbreviation. Option? findByAbbreviation(String abbr) { for (var option in options.values) { if (option.abbr == abbr) return option; } return null; } /// Finds the option whose name or alias matches [name], or `null` if no /// option has that name or alias. Option? findByNameOrAlias(String name) => options[_aliases[name] ?? name]; } rNN<%L!&*7&:%;)F$M#<MQOJM1<K$OQOQQ6-OH?2;L@025QM=PO;('9DMO$DO*QO#MOP$EL<$1> %*F,DMQ$FOAHKMQFGQAQ>MNEL<$5>!((*N%=4MQ$FOCHMMQFGNCQOP$OHEL<$5>#!($-*,N"!(*'CA</LC+MN$"'!*M6#%PH-2OAN.&+6);P,).K%M package:args/src/arg_parser.dart[€Ëcfile:///github/home/.pub-cache/hosted/pub.dartlang.org/args-2.3.0/lib/src/arg_parser_exception.dart‚‡// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// An exception thrown by `ArgParser`. class ArgParserException extends FormatException { /// The command(s) that were parsed before discovering the error. /// /// This will be empty if the error was on the root parser. final List commands; ArgParserException(String message, [Iterable? commands]) : commands = commands == null ? const [] : List.unmodifiable(commands), super(message); } NN<(3D>CN*package:args/src/arg_parser_exception.dartZfile:///github/home/.pub-cache/hosted/pub.dartlang.org/args-2.3.0/lib/src/arg_results.dartŒß// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'arg_parser.dart'; /// Creates a new [ArgResults]. /// /// Since [ArgResults] doesn't have a public constructor, this lets [ArgParser] /// get to it. This function isn't exported to the public API of the package. ArgResults newArgResults( ArgParser parser, Map parsed, String? name, ArgResults? command, List rest, List arguments) { return ArgResults._(parser, parsed, name, command, rest, arguments); } /// The results of parsing a series of command line arguments using /// [ArgParser.parse()]. /// /// Includes the parsed options and any remaining unparsed command line /// arguments. class ArgResults { /// The [ArgParser] whose options were parsed for these results. final ArgParser _parser; /// The option values that were parsed from arguments. final Map _parsed; /// The name of the command for which these options are parsed, or `null` if /// these are the top-level results. final String? name; /// The command that was selected, or `null` if none was. /// /// This will contain the options that were selected for that command. final ArgResults? command; /// The remaining command-line arguments that were not parsed as options or /// flags. /// /// If `--` was used to separate the options from the remaining arguments, /// it will not be included in this list unless parsing stopped before the /// `--` was reached. final List rest; /// The original arguments that were parsed. final List arguments; ArgResults._(this._parser, this._parsed, this.name, this.command, List rest, List arguments) : rest = UnmodifiableListView(rest), arguments = UnmodifiableListView(arguments); /// Returns the parsed ore default command-line option named [name]. /// /// [name] must be a valid option name in the parser. dynamic operator [](String name) { if (!_parser.options.containsKey(name)) { throw ArgumentError('Could not find an option named "$name".'); } return _parser.options[name]!.valueOrDefault(_parsed[name]); } /// The names of the available options. /// /// Includes the options whose values were parsed or that have defaults. /// Options that weren't present and have no default are omitted. Iterable get options { var result = _parsed.keys.toSet(); // Include the options that have defaults. _parser.options.forEach((name, option) { if (option.defaultsTo != null) result.add(name); }); return result; } /// Returns `true` if the option with [name] was parsed from an actual /// argument. /// /// Returns `false` if it wasn't provided and the default value or no default /// value would be used instead. /// /// [name] must be a valid option name in the parser. bool wasParsed(String name) { if (!_parser.options.containsKey(name)) { throw ArgumentError('Could not find an option named "$name".'); } return _parsed.containsKey(name); } } fNN< PN!GDHC9&O'<IN MM/ D1+5G8%.FA*KD!'/-7IP#8 .F&!package:args/src/arg_results.dartUfile:///github/home/.pub-cache/hosted/pub.dartlang.org/args-2.3.0/lib/src/option.dart—H// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Creates a new [Option]. /// /// Since [Option] doesn't have a public constructor, this lets `ArgParser` /// get to it. This function isn't exported to the public API of the package. Option newOption( String name, String? abbr, String? help, String? valueHelp, Iterable? allowed, Map? allowedHelp, defaultsTo, Function? callback, OptionType type, {bool? negatable, bool? splitCommas, bool mandatory = false, bool hide = false, List aliases = const []}) { return Option._(name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo, callback, type, negatable: negatable, splitCommas: splitCommas, mandatory: mandatory, hide: hide, aliases: aliases); } /// A command-line option. /// /// This represents both boolean flags and options which take a value. class Option { /// The name of the option that the user passes as an argument. final String name; /// A single-character string that can be used as a shorthand for this option. /// /// For example, `abbr: "a"` will allow the user to pass `-a value` or /// `-avalue`. final String? abbr; /// A description of this option. final String? help; /// A name for the value this option takes. final String? valueHelp; /// A list of valid values for this option. final List? allowed; /// A map from values in [allowed] to documentation for those values. final Map? allowedHelp; /// The value this option will have if the user doesn't explicitly pass it. final dynamic defaultsTo; /// Whether this flag's value can be set to `false`. /// /// For example, if [name] is `flag`, the user can pass `--no-flag` to set its /// value to `false`. /// /// This is `null` unless [type] is [OptionType.flag]. final bool? negatable; /// The callback to invoke with the option's value when the option is parsed. final Function? callback; /// Whether this is a flag, a single value option, or a multi-value option. final OptionType type; /// Whether multiple values may be passed by writing `--option a,b` in /// addition to `--option a --option b`. final bool splitCommas; /// Whether this option must be provided for correct usage. final bool mandatory; /// Whether this option should be hidden from usage documentation. final bool hide; /// All aliases for [name]. final List aliases; /// Whether the option is boolean-valued flag. bool get isFlag => type == OptionType.flag; /// Whether the option takes a single value. bool get isSingle => type == OptionType.single; /// Whether the option allows multiple values. bool get isMultiple => type == OptionType.multiple; Option._( this.name, this.abbr, this.help, this.valueHelp, Iterable? allowed, Map? allowedHelp, this.defaultsTo, this.callback, OptionType type, {this.negatable, bool? splitCommas, this.mandatory = false, this.hide = false, this.aliases = const []}) : allowed = allowed == null ? null : List.unmodifiable(allowed), allowedHelp = allowedHelp == null ? null : Map.unmodifiable(allowedHelp), type = type, // If the user doesn't specify [splitCommas], it defaults to true for // multiple options. splitCommas = splitCommas ?? type == OptionType.multiple { if (name.isEmpty) { throw ArgumentError('Name cannot be empty.'); } else if (name.startsWith('-')) { throw ArgumentError('Name $name cannot start with "-".'); } // Ensure name does not contain any invalid characters. if (_invalidChars.hasMatch(name)) { throw ArgumentError('Name "$name" contains invalid characters.'); } var abbr = this.abbr; if (abbr != null) { if (abbr.length != 1) { throw ArgumentError('Abbreviation must be null or have length 1.'); } else if (abbr == '-') { throw ArgumentError('Abbreviation cannot be "-".'); } if (_invalidChars.hasMatch(abbr)) { throw ArgumentError('Abbreviation is an invalid character.'); } } } /// Returns [value] if non-`null`, otherwise returns the default value for /// this option. /// /// For single-valued options, it will be [defaultsTo] if set or `null` /// otherwise. For multiple-valued options, it will be an empty list or a /// list containing [defaultsTo] if set. dynamic valueOrDefault(value) { if (value != null) return value; if (isMultiple) return defaultsTo ?? []; return defaultsTo; } @Deprecated('Use valueOrDefault instead.') dynamic getOrDefault(value) => valueOrDefault(value); static final _invalidChars = RegExp(r'''[ \t\r\n"'\\/]'''); } /// What kinds of values an option accepts. class OptionType { /// An option that can only be `true` or `false`. /// /// The presence of the option name itself in the argument list means `true`. static const flag = OptionType._('OptionType.flag'); /// An option that takes a single value. /// /// Examples: /// /// --mode debug /// -mdebug /// --mode=debug /// /// If the option is passed more than once, the last one wins. static const single = OptionType._('OptionType.single'); /// An option that allows multiple values. /// /// Example: /// /// --output text --output xml /// /// In the parsed `ArgResults`, a multiple-valued option will always return /// a list, even if one or no values were passed. static const multiple = OptionType._('OptionType.multiple'); final String name; const OptionType._(this.name); } €ÃNN<LN&(Q GBQI$..H*N7Q9PNI+>E1./216 !( GHNC4'@<(HL <*FMJL+"%5-8>,4P7+A;-%N4?!package:args/src/option.dart€€€Ë[Ufile:///github/home/.pub-cache/hosted/pub.dartlang.org/args-2.3.0/lib/src/parser.dart°Å// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'arg_parser.dart'; import 'arg_parser_exception.dart'; import 'arg_results.dart'; import 'option.dart'; /// The actual argument parsing class. /// /// Unlike [ArgParser] which is really more an "arg grammar", this is the class /// that does the parsing and holds the mutable state required during a parse. class Parser { /// If parser is parsing a command's options, this will be the name of the /// command. For top-level results, this returns `null`. final String? _commandName; /// The parser for the supercommand of this command parser, or `null` if this /// is the top-level parser. final Parser? _parent; /// The grammar being parsed. final ArgParser _grammar; /// The arguments being parsed. final Queue _args; /// The remaining non-option, non-command arguments. final List _rest; /// The accumulated parsed options. final Map _results = {}; Parser(this._commandName, this._grammar, this._args, [this._parent, List? rest]) : _rest = [...?rest]; /// The current argument being parsed. String get _current => _args.first; /// Parses the arguments. This can only be called once. ArgResults parse() { var arguments = _args.toList(); if (_grammar.allowsAnything) { return newArgResults( _grammar, const {}, _commandName, null, arguments, arguments); } ArgResults? commandResults; // Parse the args. while (_args.isNotEmpty) { if (_current == '--') { // Reached the argument terminator, so stop here. _args.removeFirst(); break; } // Try to parse the current argument as a command. This happens before // options so that commands can have option-like names. var command = _grammar.commands[_current]; if (command != null) { _validate(_rest.isEmpty, 'Cannot specify arguments before a command.'); var commandName = _args.removeFirst(); var commandParser = Parser(commandName, command, _args, this, _rest); try { commandResults = commandParser.parse(); } on ArgParserException catch (error) { throw ArgParserException( error.message, [commandName, ...error.commands]); } // All remaining arguments were passed to command so clear them here. _rest.clear(); break; } // Try to parse the current argument as an option. Note that the order // here matters. if (_parseSoloOption()) continue; if (_parseAbbreviation(this)) continue; if (_parseLongOption()) continue; // This argument is neither option nor command, so stop parsing unless // the [allowTrailingOptions] option is set. if (!_grammar.allowTrailingOptions) break; _rest.add(_args.removeFirst()); } // Check if mandatory and invoke existing callbacks. _grammar.options.forEach((name, option) { var parsedOption = _results[name]; // Check if an option was mandatory and exist // if not throw an exception if (option.mandatory && parsedOption == null) { throw ArgParserException('Option $name is mandatory.'); } var callback = option.callback; if (callback == null) return; callback(option.valueOrDefault(parsedOption)); }); // Add in the leftover arguments we didn't parse to the innermost command. _rest.addAll(_args); _args.clear(); return newArgResults( _grammar, _results, _commandName, commandResults, _rest, arguments); } /// Pulls the value for [option] from the second argument in [_args]. /// /// Validates that there is a valid value there. void _readNextArgAsValue(Option option) { // Take the option argument from the next command line arg. _validate(_args.isNotEmpty, 'Missing argument for "${option.name}".'); _setOption(_results, option, _current); _args.removeFirst(); } /// Tries to parse the current argument as a "solo" option, which is a single /// hyphen followed by a single letter. /// /// We treat this differently than collapsed abbreviations (like "-abc") to /// handle the possible value that may follow it. bool _parseSoloOption() { // Hand coded regexp: r'^-([a-zA-Z0-9])$' // Length must be two, hyphen followed by any letter/digit. if (_current.length != 2) return false; if (!_current.startsWith('-')) return false; var opt = _current[1]; if (!_isLetterOrDigit(opt.codeUnitAt(0))) return false; return _handleSoloOption(opt); } bool _handleSoloOption(String opt) { var option = _grammar.findByAbbreviation(opt); if (option == null) { // Walk up to the parent command if possible. _validate(_parent != null, 'Could not find an option or flag "-$opt".'); return _parent!._handleSoloOption(opt); } _args.removeFirst(); if (option.isFlag) { _setFlag(_results, option, true); } else { _readNextArgAsValue(option); } return true; } /// Tries to parse the current argument as a series of collapsed abbreviations /// (like "-abc") or a single abbreviation with the value directly attached /// to it (like "-mrelease"). bool _parseAbbreviation(Parser innermostCommand) { // Hand coded regexp: r'^-([a-zA-Z0-9]+)(.*)$' // Hyphen then at least one letter/digit then zero or more // anything-but-newlines. if (_current.length < 2) return false; if (!_current.startsWith('-')) return false; // Find where we go from letters/digits to rest. var index = 1; while (index < _current.length && _isLetterOrDigit(_current.codeUnitAt(index))) { ++index; } // Must be at least one letter/digit. if (index == 1) return false; // If the first character is the abbreviation for a non-flag option, then // the rest is the value. var lettersAndDigits = _current.substring(1, index); var rest = _current.substring(index); if (rest.contains('\n') || rest.contains('\r')) return false; return _handleAbbreviation(lettersAndDigits, rest, innermostCommand); } bool _handleAbbreviation( String lettersAndDigits, String rest, Parser innermostCommand) { var c = lettersAndDigits.substring(0, 1); var first = _grammar.findByAbbreviation(c); if (first == null) { // Walk up to the parent command if possible. _validate( _parent != null, 'Could not find an option with short name "-$c".'); return _parent! ._handleAbbreviation(lettersAndDigits, rest, innermostCommand); } else if (!first.isFlag) { // The first character is a non-flag option, so the rest must be the // value. var value = '${lettersAndDigits.substring(1)}$rest'; _setOption(_results, first, value); } else { // If we got some non-flag characters, then it must be a value, but // if we got here, it's a flag, which is wrong. _validate( rest == '', 'Option "-$c" is a flag and cannot handle value ' '"${lettersAndDigits.substring(1)}$rest".'); // Not an option, so all characters should be flags. // We use "innermostCommand" here so that if a parent command parses the // *first* letter, subcommands can still be found to parse the other // letters. for (var i = 0; i < lettersAndDigits.length; i++) { var c = lettersAndDigits.substring(i, i + 1); innermostCommand._parseShortFlag(c); } } _args.removeFirst(); return true; } void _parseShortFlag(String c) { var option = _grammar.findByAbbreviation(c); if (option == null) { // Walk up to the parent command if possible. _validate( _parent != null, 'Could not find an option with short name "-$c".'); _parent!._parseShortFlag(c); return; } // In a list of short options, only the first can be a non-flag. If // we get here we've checked that already. _validate( option.isFlag, 'Option "-$c" must be a flag to be in a collapsed "-".'); _setFlag(_results, option, true); } /// Tries to parse the current argument as a long-form named option, which /// may include a value like "--mode=release" or "--mode release". bool _parseLongOption() { // Hand coded regexp: r'^--([a-zA-Z\-_0-9]+)(=(.*))?$' // Two hyphens then at least one letter/digit/hyphen, optionally an equal // sign followed by zero or more anything-but-newlines. if (!_current.startsWith('--')) return false; var index = _current.indexOf('='); var name = index == -1 ? _current.substring(2) : _current.substring(2, index); for (var i = 0; i != name.length; ++i) { if (!_isLetterDigitHyphenOrUnderscore(name.codeUnitAt(i))) return false; } var value = index == -1 ? null : _current.substring(index + 1); if (value != null && (value.contains('\n') || value.contains('\r'))) { return false; } return _handleLongOption(name, value); } bool _handleLongOption(String name, String? value) { var option = _grammar.findByNameOrAlias(name); if (option != null) { _args.removeFirst(); if (option.isFlag) { _validate( value == null, 'Flag option "$name" should not be given a value.'); _setFlag(_results, option, true); } else if (value != null) { // We have a value like --foo=bar. _setOption(_results, option, value); } else { // Option like --foo, so look for the value as the next arg. _readNextArgAsValue(option); } } else if (name.startsWith('no-')) { // See if it's a negated flag. var positiveName = name.substring('no-'.length); option = _grammar.findByNameOrAlias(positiveName); if (option == null) { // Walk up to the parent command if possible. _validate(_parent != null, 'Could not find an option named "$name".'); return _parent!._handleLongOption(name, value); } _args.removeFirst(); _validate(option.isFlag, 'Cannot negate non-flag option "$name".'); _validate(option.negatable!, 'Cannot negate option "$name".'); _setFlag(_results, option, false); } else { // Walk up to the parent command if possible. _validate(_parent != null, 'Could not find an option named "$name".'); return _parent!._handleLongOption(name, value); } return true; } /// Called during parsing to validate the arguments. /// /// Throws an [ArgParserException] if [condition] is `false`. void _validate(bool condition, String message) { if (!condition) throw ArgParserException(message); } /// Validates and stores [value] as the value for [option], which must not be /// a flag. void _setOption(Map results, Option option, String value) { assert(!option.isFlag); if (!option.isMultiple) { _validateAllowed(option, value); results[option.name] = value; return; } var list = results.putIfAbsent(option.name, () => []); if (option.splitCommas) { for (var element in value.split(',')) { _validateAllowed(option, element); list.add(element); } } else { _validateAllowed(option, value); list.add(value); } } /// Validates and stores [value] as the value for [option], which must be a /// flag. void _setFlag(Map results, Option option, bool value) { assert(option.isFlag); results[option.name] = value; } /// Validates that [value] is allowed as a value of [option]. void _validateAllowed(Option option, String value) { if (option.allowed == null) return; _validate(option.allowed!.contains(value), '"$value" is not an allowed value for option "${option.name}".'); } } bool _isLetterOrDigit(int codeUnit) => // Uppercase letters. (codeUnit >= 65 && codeUnit <= 90) || // Lowercase letters. (codeUnit >= 97 && codeUnit <= 122) || // Digits. (codeUnit >= 48 && codeUnit <= 57); bool _isLetterDigitHyphenOrUnderscore(int codeUnit) => _isLetterOrDigit(codeUnit) || // Hyphen. codeUnit == 45 || // Underscore. codeUnit == 95; oNN<$'POM;P "7&=7*)&:$#I :M>1P/N20$@ NM(.(M31&9.)4#6@&$5OMH3,@K,P*N4.@,1<#'34O.( #QN 53?+15&8*"N9*BJG.04OJ K;* J6<7;OK:6-#14O#H/Q&ME;N<2'L-ODK+73P*"+-E%)%796O8JE) 4M67@37P>'$C.+ 'N :"@7(/J'*+(7"package:args/src/parser.dartTfile:///github/home/.pub-cache/hosted/pub.dartlang.org/args-2.3.0/lib/src/usage.dartŸ}// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:math' as math; import '../args.dart'; import 'utils.dart'; /// Generates a string of usage (i.e. help) text for a list of options. /// /// Internally, it works like a tabular printer. The output is divided into /// three horizontal columns, like so: /// /// -h, --help Prints the usage information /// | | | | /// /// It builds the usage text up one column at a time and handles padding with /// spaces and wrapping to the next line to keep the cells correctly lined up. /// /// [lineLength] specifies the horizontal character position at which the help /// text is wrapped. Help that extends past this column will be wrapped at the /// nearest whitespace (or truncated if there is no available whitespace). If /// `null` there will not be any wrapping. String generateUsage(List optionsAndSeparators, {int? lineLength}) => _Usage(optionsAndSeparators, lineLength).generate(); class _Usage { /// Abbreviation, long name, help. static const _columnCount = 3; /// A list of the [Option]s intermingled with [String] separators. final List _optionsAndSeparators; /// The working buffer for the generated usage text. final _buffer = StringBuffer(); /// The column that the "cursor" is currently on. /// /// If the next call to [write()] is not for this column, it will correctly /// handle advancing to the next column (and possibly the next row). int _currentColumn = 0; /// The width in characters of each column. late final _columnWidths = _calculateColumnWidths(); /// How many newlines need to be rendered before the next bit of text can be /// written. /// /// We do this lazily so that the last bit of usage doesn't have dangling /// newlines. We only write newlines right *before* we write some real /// content. int _newlinesNeeded = 0; /// The horizontal character position at which help text is wrapped. /// /// Help that extends past this column will be wrapped at the nearest /// whitespace (or truncated if there is no available whitespace). final int? lineLength; _Usage(this._optionsAndSeparators, this.lineLength); /// Generates a string displaying usage information for the defined options. /// This is basically the help text shown on the command line. String generate() { for (var optionOrSeparator in _optionsAndSeparators) { if (optionOrSeparator is String) { _writeSeparator(optionOrSeparator); continue; } var option = optionOrSeparator as Option; if (option.hide) continue; _writeOption(option); } return _buffer.toString(); } void _writeSeparator(String separator) { // Ensure that there's always a blank line before a separator. if (_buffer.isNotEmpty) _buffer.write('\n\n'); _buffer.write(separator); _newlinesNeeded = 1; } void _writeOption(Option option) { _write(0, _abbreviation(option)); _write(1, '${_longOption(option)}${_mandatoryOption(option)}'); if (option.help != null) _write(2, option.help!); if (option.allowedHelp != null) { var allowedNames = option.allowedHelp!.keys.toList(); allowedNames.sort(); _newline(); for (var name in allowedNames) { _write(1, _allowedTitle(option, name)); _write(2, option.allowedHelp![name]!); } _newline(); } else if (option.allowed != null) { _write(2, _buildAllowedList(option)); } else if (option.isFlag) { if (option.defaultsTo == true) { _write(2, '(defaults to on)'); } } else if (option.isMultiple) { if (option.defaultsTo != null && option.defaultsTo.isNotEmpty) { var defaults = (option.defaultsTo as List).map((value) => '"$value"').join(', '); _write(2, '(defaults to $defaults)'); } } else if (option.defaultsTo != null) { _write(2, '(defaults to "${option.defaultsTo}")'); } } String _abbreviation(Option option) => option.abbr == null ? '' : '-${option.abbr}, '; String _longOption(Option option) { String result; if (option.negatable!) { result = '--[no-]${option.name}'; } else { result = '--${option.name}'; } if (option.valueHelp != null) result += '=<${option.valueHelp}>'; return result; } String _mandatoryOption(Option option) { return option.mandatory ? ' (mandatory)' : ''; } String _allowedTitle(Option option, String allowed) { var isDefault = option.defaultsTo is List ? option.defaultsTo.contains(allowed) : option.defaultsTo == allowed; return ' [$allowed]' + (isDefault ? ' (default)' : ''); } List _calculateColumnWidths() { var abbr = 0; var title = 0; for (var option in _optionsAndSeparators) { if (option is! Option) continue; if (option.hide) continue; // Make room in the first column if there are abbreviations. abbr = math.max(abbr, _abbreviation(option).length); // Make room for the option. title = math.max( title, _longOption(option).length + _mandatoryOption(option).length); // Make room for the allowed help. if (option.allowedHelp != null) { for (var allowed in option.allowedHelp!.keys) { title = math.max(title, _allowedTitle(option, allowed).length); } } } // Leave a gutter between the columns. title += 4; return [abbr, title]; } void _newline() { _newlinesNeeded++; _currentColumn = 0; } void _write(int column, String text) { var lines = text.split('\n'); // If we are writing the last column, word wrap it to fit. if (column == _columnWidths.length && lineLength != null) { var start = _columnWidths.take(column).reduce((start, width) => start + width); lines = [ for (var line in lines) ...wrapTextAsLines(line, start: start, length: lineLength), ]; } // Strip leading and trailing empty lines. while (lines.isNotEmpty && lines.first.trim() == '') { lines.removeAt(0); } while (lines.isNotEmpty && lines.last.trim() == '') { lines.removeLast(); } for (var line in lines) { _writeLine(column, line); } } void _writeLine(int column, String text) { // Write any pending newlines. while (_newlinesNeeded > 0) { _buffer.write('\n'); _newlinesNeeded--; } // Advance until we are at the right column (which may mean wrapping around // to the next line. while (_currentColumn != column) { if (_currentColumn < _columnCount - 1) { _buffer.write(' ' * _columnWidths[_currentColumn]); } else { _buffer.write('\n'); } _currentColumn = (_currentColumn + 1) % _columnCount; } if (column < _columnWidths.length) { // Fixed-size column, so pad it. _buffer.write(text.padRight(_columnWidths[column])); } else { // The last column, so just write it. _buffer.write(text); } // Advance to the next column. _currentColumn = (_currentColumn + 1) % _columnCount; // If we reached the last column, we need to wrap to the next line. if (column == _columnCount - 1) _newlinesNeeded++; } String _buildAllowedList(Option option) { var isDefault = option.defaultsTo is List ? option.defaultsTo.contains : (value) => value == option.defaultsTo; var allowedBuffer = StringBuffer(); allowedBuffer.write('['); var first = true; for (var allowed in option.allowed!) { if (!first) allowedBuffer.write(', '); allowedBuffer.write(allowed); if (isDefault(allowed)) { allowedBuffer.write(' (default)'); } first = false; } allowedBuffer.write(']'); return allowedBuffer.toString(); } } NN<HL'18NOOON+F9%!E$7"4NG.7OLIGHE7OA;),0!+C3%&D6&<'0/), ''$GO.,9)6&( #F+38..(A'0'!C;#P)(8J +)"?@N F /;: -#"P'/<<)'; ,#:H7,.%1(+-$ +%package:args/src/usage.dartTfile:///github/home/.pub-cache/hosted/pub.dartlang.org/args-2.3.0/lib/src/utils.dart“É// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:math' as math; /// Pads [source] to [length] by adding spaces at the end. String padRight(String source, int length) => source + ' ' * (length - source.length); /// Wraps a block of text into lines no longer than [length]. /// /// Tries to split at whitespace, but if that's not good enough to keep it /// under the limit, then it splits in the middle of a word. /// /// Preserves indentation (leading whitespace) for each line (delimited by '\n') /// in the input, and indents wrapped lines the same amount. /// /// If [hangingIndent] is supplied, then that many spaces are added to each /// line, except for the first line. This is useful for flowing text with a /// heading prefix (e.g. "Usage: "): /// /// ```dart /// var prefix = "Usage: "; /// print(prefix + wrapText(invocation, hangingIndent: prefix.length, length: 40)); /// ``` /// /// yields: /// ``` /// Usage: app main_command /// [arguments] /// ``` /// /// If [length] is not specified, then no wrapping occurs, and the original /// [text] is returned unchanged. String wrapText(String text, {int? length, int? hangingIndent}) { if (length == null) return text; hangingIndent ??= 0; var splitText = text.split('\n'); var result = []; for (var line in splitText) { var trimmedText = line.trimLeft(); final leadingWhitespace = line.substring(0, line.length - trimmedText.length); List notIndented; if (hangingIndent != 0) { // When we have a hanging indent, we want to wrap the first line at one // width, and the rest at another (offset by hangingIndent), so we wrap // them twice and recombine. var firstLineWrap = wrapTextAsLines(trimmedText, length: length - leadingWhitespace.length); notIndented = [firstLineWrap.removeAt(0)]; trimmedText = trimmedText.substring(notIndented[0].length).trimLeft(); if (firstLineWrap.isNotEmpty) { notIndented.addAll(wrapTextAsLines(trimmedText, length: length - leadingWhitespace.length - hangingIndent)); } } else { notIndented = wrapTextAsLines(trimmedText, length: length - leadingWhitespace.length); } String? hangingIndentString; result.addAll(notIndented.map((String line) { // Don't return any lines with just whitespace on them. if (line.isEmpty) return ''; var result = '${hangingIndentString ?? ''}$leadingWhitespace$line'; hangingIndentString ??= ' ' * hangingIndent!; return result; })); } return result.join('\n'); } /// Wraps a block of text into lines no longer than [length], /// starting at the [start] column, and returns the result as a list of strings. /// /// Tries to split at whitespace, but if that's not good enough to keep it /// under the limit, then splits in the middle of a word. Preserves embedded /// newlines, but not indentation (it trims whitespace from each line). /// /// If [length] is not specified, then no wrapping occurs, and the original /// [text] is returned after splitting it on newlines. Whitespace is not trimmed /// in this case. List wrapTextAsLines(String text, {int start = 0, int? length}) { assert(start >= 0); /// Returns true if the code unit at [index] in [text] is a whitespace /// character. /// /// Based on: https://en.wikipedia.org/wiki/Whitespace_character#Unicode bool isWhitespace(String text, int index) { var rune = text.codeUnitAt(index); return rune >= 0x0009 && rune <= 0x000D || rune == 0x0020 || rune == 0x0085 || rune == 0x1680 || rune == 0x180E || rune >= 0x2000 && rune <= 0x200A || rune == 0x2028 || rune == 0x2029 || rune == 0x202F || rune == 0x205F || rune == 0x3000 || rune == 0xFEFF; } if (length == null) return text.split('\n'); var result = []; var effectiveLength = math.max(length - start, 10); for (var line in text.split('\n')) { line = line.trim(); if (line.length <= effectiveLength) { result.add(line); continue; } var currentLineStart = 0; int? lastWhitespace; for (var i = 0; i < line.length; ++i) { if (isWhitespace(line, i)) lastWhitespace = i; if (i - currentLineStart >= effectiveLength) { // Back up to the last whitespace, unless there wasn't any, in which // case we just split where we are. if (lastWhitespace != null) i = lastWhitespace; result.add(line.substring(currentLineStart, i).trim()); // Skip any intervening whitespace. while (isWhitespace(line, i) && i < line.length) { i++; } currentLineStart = i; lastWhitespace = null; } } result.add(line.substring(currentLineStart).trim()); } return result; } €NN<;.->K=Q=LL% T )L"B#$ '=NN#761M&8I 16!:>#J4 >QKMHLQJIK.'/,/6'*,55M,8@,; 9package:args/src/utils.dartxÆz⇠¾ôÂÏåèn< !\[]`€Í`]`]`€Í` ``€Í/`€â]`€á[`1245x}x}x}bb]`€Í[`–“ '(*,25;HKNQTWZ]`cfloux~‰Œ”¡£!b   ( / 1 4 5 !#&),-.2 !"5"/"1"4"6!!! ! ! !( ..8 1 111!1621#1&1)1,1-1. >?7 ABCBE!GH`GJK!LTLUK KVKWKXKJTRT_JW!X7"Z[xZ]^ ^^^^^^^^^3^^^^^"mb^q^r^s]rZrt]u"v7Zxyuyvywy x~"7#€€‚#€ƒ€¿€ƒ€Ã€y€†€‡#€ˆz€ˆ{€ˆ|€ˆ}€ˆ~€ˆ€ˆ€€€†€&€#€’€’€’€Œ€’€—€’€€’€£€’€ª€’€Ž€’€¯€’€†€’€”€’€™€’€¸€†€Ÿ$€¡€¢€¡€Å€¤€¥$€¦€Æ€¦4€¦€Ç€¦€È€¦€É€¦€Ë€¥P€¤%€®$€¯€È€¯€Ë€¤€²€Ì€²$€´€Î€´€Ï€´€Õ€´€Ö€´€×€´€Û€´€Ê€´€Ú€´€Ô€´€ú€´€Ü€¤€À&€Â€Ã€þ€Ã€Ã'(€È)€É€Ê€È*€È+€È,€È-(€Ð.€È/€Ò€Ó€È0€È1€Ç2€×€Ø3€È4€Ú€Û€È5€Ý€Þ(€ß6€È7€È8€Ì€ã9€È:€É€æ0€È;€Õ€é9€È<€ë€ì€Ç=€î€ï€Ì€ñ:€ñ=€Ö€ô?€ì(€ö>€Õ€øB€ôC€øJ€È?€Ö€ýL€ü€ÿM€üO€È@€ÌQ€ÍA€ñR€ÈB  €ÇC  €ÈD\€ô]J€ñ^€ÈE€Íd€ÈFfjm€ÈG A€æA€ÇH€ý€€ý€ƒ#&€…€ýd )S€ø€‹&€‹R€– €› €€Ÿ€ €¬€Ï4€®€ñ€º€»€ô€  €Á €ÂI€ÈJ<=<?€Ð<A€ƒ?€Ò€ø€Ù€ô€ß€ô€à€;HK€öL€ÕKm€ô€ò€ô€ó€ö€ø€÷€ý€ø€ø€ù €è g€øR€ü €ý€þ Z€ÈM€ÈN]^(_OaSP %+5HOWky€ˆ€’€–€œ€Ô€Û€ß€ã€í€ö€þ =FOVany‚¸Æ‚‚ ‚‚J‚O‚S‚X‚b‚h‚x‚‚‚”‚¥‚®‚º‚‚̂Ђå‚í‚ú‚ûƒƒƒ'ƒ:ƒ<ƒ?ƒDƒJƒRƒZƒ`ƒcƒ~ƒ†ƒ”ƒªƒµƒãƒæƒø„„„ „„„$„&„-„4„;„B„F„O„o„}„ƒ„‡„Œ„“„œ„©„¯„¼„ʄфæ„ð„ñ„ö… ………9…?…j………ª…°…¸…Â…Î…Ò…Ø…à…é…ï…û†† ††††$†)†7†A†C†N†W††Œ†™†ž†£†³†Å†Õ†á†è†ö‡ ‡‡)‡,‡6‡G‡j‡r‡‚‡ƒ‡ˆ‡‰‡™‡¢‡ª‡«‡¬‡¿‡À‡ë‡ôˆˆˆˆ)ˆSˆZˆ[ˆaˆrˆˆˆ ˆ¬ˆËˆáˆêˆñ‰‰‰‰‰‰‰C‰S‰[‰]‰_‰‰ƒ‰‰‰•‰œ‰ª‰·‰Í‰Ü‰ä‰õŠŠŠŠ!Š&Š(Š.Š;ŠFŠVŠbŠfŠnŠ{ŠŒŠœŠ¤Š§Š«Š­ŠºŠ»ŠÉŠËŠÒŠÔŠÕŠáŠêŠñŠòŠü‹‹‹ ‹‹‹‹ ‹$‹(‹0‹4‹>‹H‹I‹J‹K‹S‹`‹a‹e‹r‹†‹Œ‹”‹¡‹ª‹µ‹½‹Î‹Ù‹æ‹ùŒŒŒŒ'Œ7ŒEŒTŒeŒxŒŒªŒÀŒëŒó(2\}™µÐØóŽŽ ŽŽŽŽŽ!Ž%Ž5Ž9ŽAŽJŽLŽYŽjŽsŽyŽ}މޓޛލ޻ŽÄŽÌŽÖŽØŽçŽûŽþ (+4=JRArgParserArgParserExceptionArgResultsOptionOptionTypeAllowAnythingParseroptionscommandsallowTrailingOptionsallowsAnythingusageLineLengthaddCommandnameparserArgParser.allowAnything().addCommands() isn't supported.addFlagabbrhelpdefaultsTonegatablecallbackhidealiasesArgParser.allowAnything().addFlag() isn't supported.addOptionvalueHelpallowedallowedHelpallowMultiplesplitCommasmandatoryArgParser.allowAnything().addOption() isn't supported.addMultiOptionArgParser.allowAnything().addMultiOption() isn't supported.addSeparatortextArgParser.allowAnything().addSeparator() isn't supported.parseargsusagedefaultForoptionNo option named getDefaultfindByAbbreviationfindByNameOrAlias_commandsnoSuchMethod_aliases_addOptiontype_optionsAndSeparators_options_redirecting#_allowAnything#redirecting_factorycontainsKeyDuplicate command "".[]=valuetoListgrowableallNamesaddAllanyDuplicate option or alias "existingAbbreviation "" is already used by "The option cannot be mandatory and have a default value.add:sync-for-iteratoriteratormoveNextaliascurrentlineLengthvalues[]message_parser_parsedcommandrestargumentsCould not find an option named "valueOrDefaultresultkeystoSetforEachwasParsednewArgResultsparsed_invalidChars[ \t\r\n"'\\/]isEmptyName cannot be empty.startsWith-Name cannot start with "-".hasMatchName "" contains invalid characters.lengthAbbreviation must be null or have length 1.Abbreviation cannot be "-".Abbreviation is an invalid character.isFlagisSingleisMultiplegetOrDefaultflagsinglemultiplenewOptionParser_commandName_parent_grammar_args_rest_results_currentfirstcommandResultsisNotEmpty--removeFirst_validateCannot specify arguments before a command.commandNamecommandParsererrorclear_parseSoloOption_parseAbbreviation_parseLongOptionparsedOptionOption is mandatory._readNextArgAsValueMissing argument for "_setOptionoptcodeUnitAt_handleSoloOptionCould not find an option or flag "-_setFlaginnermostCommand=<=_isLetterDigitHyphenOrUnderscoremath_Usage_columnCount_buffer_currentColumn_columnWidths_calculateColumnWidths_newlinesNeededgenerateoptionOrSeparator_writeSeparator_writeOptiontoStringseparatorwrite _write_abbreviation_longOption_mandatoryOptionallowedNamessort_newline_allowedTitle_buildAllowedList(defaults to on)defaultsmapjoin, (defaults to )(defaults to "")--[no-]=<> (mandatory)isDefault [] (default)titlecolumnlinesstarttakereducewidthlinetrimremoveAtlastremoveLast_writeLine *%padRightallowedBuffer[callgenerateUsageoptionsAndSeparatorssourcewrapTexthangingIndentsplitTexttrimmedTexttrimLeftleadingWhitespacenotIndentedfirstLineWraphangingIndentStringwrapTextAsLinesisWhitespaceruneeffectiveLengthcurrentLineStartlastWhitespaceOptionType.flagOptionType.singleOptionType.multipleUse defaultFor instead.Use valueOrDefault instead.package:args/args.dartpackage:args/src/allow_anything_parser.dart@getterspackage:args/src/arg_parser.dart@methods@constructors@factoriespackage:args/src/arg_parser_exception.dartpackage:args/src/arg_results.dartpackage:args/src/option.dartpackage:args/src/parser.dartpackage:args/src/usage.dart@setterspackage:args/src/utils.dartdart:collectiondart:coreObjectMapStringboolintNullUnsupportedErrorListIterableListQueueofArgumentError_InvocationMirror_withTypeSymbolTypeunmodifiableInvocationFunction_GrowableListUnmodifiableMapView_literal1IteratorDeprecated==FormatExceptionUnmodifiableListViewSetRegExpPatternnumQueuedart:mathStringBuffermax_literal2_Override_ImmutableMap_kvPairsxÂPÿQ¤R,V¨V¨V¬h•f Çûë$&-QOÁj®x hð«ÍïE0000000000 €ÚFk=¢VÕl‚€Š‚&€Æ‚BF‚bK‚‚P‚ŸY‚ƽ‚æÒƒ ‚*ƒ+‚ƒI‚üƒfƒƒŽƒ'ƒ·ƒŠE„p„q  >Wm€—€™€–€š€˜€”€•?3€ß€Ê€Ô€æ€í€÷) GLTRVSUXW¼»¹µ¸º¶·¾‚)‚(‚‚A‚+‚ƃ ƒƒ?ƒ<ƒwƒiƒaƒ²ƒº„ƒüƒä„>„R>;> /„rPƒ…™™™­€† `„tj™«`„t‚ۂ߃”A‚ `„u[‚÷ ]„v_ƒ _ƒ% a__`„tj`„x`„t>ƒ/ƒ”=#ƒ;‚ƒ3ÏŠƒ3Ïjƒ?a`„u`„u`„t+a__`„tJƒQƒX__€ƒm³6jƒy^`„u[___ƒƒÏa__`„tƒŒÃ……!‡=A…5‡= `„u[`„u[…> ]„v_…`a__…~ a__`„t…‰ _…™`„tj…¡`„t…©`„tj`„x`„t>…¯‡==…³ƒ…Ä„{„…Ô‚ñ……Ûƒv…ë€…à‚®`„t„}N…ú…þ`„t„†‚ñN† †`„t†ƒ`„tN††"_}†)†$‚¾ƒ†*‚æa__C†4x†?††;ƒN‡†Aƒ`a`„~`„„>†F‡.N†P†T`„tx†Z††VƒNx†ix†b‡†^ƒ`††dƒNa`„~`„t„‚”a`„t`„t„„a`„~`„t„…N†x†€_x†Œ€†‚‚®†ƒÍ a`„t_„‡N†›† `„t}†©‚†¢‚Ð}†¯†ª‚¾†°„2 a__†ºƒxa__`„tI†Ä†Í†È„c “a`„u`„„ˆJ†Ó†ÚƒÍ ?I†ãx†ì†ç„c “a`„~`„„>†ñ‡ =ކùƒNx‡†ÿƒÍ ”a`„~`„t„…>‡‡*=‡ƒ`‡!ƒÍ J‡2x‡9” a`„t„‰ ˆü‰‰­A‰ ‰­ `„u[‰ ]„v_‰$ _‰@ a__`„tj`„x`„t>‰J‰­=#‰V‚‰N…“ЉN…“j‰Za`„u`„u`„t+a__`„tJ‰l‰s __€‰†…w6j‰’^`„u[___‰œ…“a__`„t‰¥…‡ ‹‚‹†‚A!‹˜‚ `„u[`„u[‹¡ ]„v_‹Ãa__‹á a__`„t‹ì _‹ü`„tjŒ`„tŒ `„tj`„x`„t>Œ‚=Œ†ÈŒ'„{„Œ7†µ…Œ>†ÈvŒN€ŒC†r`„t„}NŒ]Œa`„t„Œc†µNŒpŒt`„tŒv†È`„tNŒŒ…_}ŒŒŒ‡†‚ƒŒ†ªa__CŒ—xŒ¢†Œž‡‡Œ¤‡$a`„~`„„>Œ©rNŒ³Œ·`„txŒ½†Œ¹‡xŒÌxŒÅ‡ŒÁ‡$†ŒÇ‡a`„~`„t„‚”a`„t`„t„„a`„~`„t„…NŒÛŒã_xŒï€Œå†rŒð‡‘ a`„t_„‡NŒþ`„t} ‚†”} †‚‡ö a__‡<a__`„tI'x0+ˆ' “a`„~`„„>5P=Ž=‡xGC‡‘ ”a`„~`„t„…>Wn=_‡$e‡‘ Jv†}‡ Ž˜ŽÿAޤÿŽª"]„v[޹`„tjŽÁ`„tŽÉ`„tj`„xŽÖ#`„Šj`„x\>Žßÿ=#ŽêƒŽã‰,‹Žã‰,Žî„Œ+`„Š=#Žþ‚Žú‰ŠŽú‰v €ˆú`„t„}+`„tN `„tx&"‰`„t(‰a`„~`„t„‚C1x?„8‰$”a`„~`„„>DýNNR%`„tx[T‰,`„Š&„c‰a`„t`„t„=Œp‰xv„p‰”a`„~`„t„‚N‚‡'[x‘€‰ˆúx˜’‰…š‰éa`„~`„t„…a`„t[„‡=x¬€¤ˆú(x³­‰…µ‰éa`„~`„t„…xÄ€¼ˆúxËʼn„͉a`„~`„t„…a`„t[„‡a`„t[\„=xâ€Úˆú(xé㉄ë‰a`„~`„t„…†õŠBa`„t[\„ 6;ÛAEÛ `„u[N"]„v_]`„tje`„tm`„tj`„x\>sÛ=Šw‹Šˆ„{˜‹w‚Ÿ‹Šv­€¤‹g`„t„}=¸_€Ä‹g΋wÕ‹Š`„t‘‘‘ÝA)‘)‘Ý `„u[‘2"]„v_‘@`„t‘K`„t\>‘P‘ÝE‘T‘]‘_*`„t‘aŒ&‘h‘j+`„tx‘p‚‘lŒ1”a`„~`„t„‚x‘wƒ‘uŒJ„‘yŒ[a`„~`„„‹‘|ŒJx‘}ƒ‘|ŒJ”a`„~`„t„…Œ‘Œ[x‘‚„‘Œ[”a`„~`„t„‚>‘†‘ÛN‘‘”,_x‘ž€‘–Œƒ‘ŸŒJa`„t_„‡=x‘¯€‘§Œ(ƒ‘°ŒJx‘½€‘µŒ„‘¾Œ[a`„t_„‡a`„t_\„=x‘΀‘ÆŒ(„‘ÏŒ[…‘ÔŒöa`„t_\„”ª”¯—€A”¿—€ `„u[”È"]„v_”ë a__`„tj`„x”ø`„tj•`„t•`„tj`„x\>•—€=#•¡•™Ç‰•™Çj•¥a`„u`„u`„t+a__`„t=#•»ƒ•·÷‹•·÷v•È€•¿¶`„t„}+`„tE•Ó•Ü•à%`„tx•è‚•âä”a`„~`„t„…x•ñ„•íŽo•ó÷`„ta`„~`„„Œ•øŽox•û„•øŽo”a`„~`„t„…>•ÿ—~N– – `„t‚–äN––"`„t„–$ŽoN–1–9_x–C€–;¶„–DŽoa`„t_„‡C–Nx–Y…–UŽí†–[Žÿa`„~`„„>–`—%N–l–p`„tx–v…–rŽíx–…x–~†–zŽÿ…–€Žía`„~`„t„‚”a`„t`„t„„a`„~`„t„…N–––¡-`„t}–ª–£Ça__`„t‡–«x–¼€–´¶–½ka`„t_„‡a__`„tI–Êx–Ù–ÎÐ “a`„~`„„>–Þ–ù=Ž–èŽÿ–îk>——=— Žíx——k”a`„~`„t„…=x—4€—+¶.x—A…—=Ží”a`„~`„t„…x—J„—FŽo”a`„~`„t„…€—O¶…—YŽí^`„t`„t]„‘_`„t\„’=x—k€—c¶(…—lŽí‡—sa`„t_\„˜0˜5™OA/˜J™O `„u[`„u[˜S"]„v_˜sa__˜• a__`„t˜§`„tj˜¯`„t˜·`„tj`„x\>˜½™O=Œ˜Á‘«˜Ò„{ƒ˜â‘˜„˜é‘«v˜÷€˜î‘``„t„}=™__€™‘`™!‘p‚™(‘‚ƒ™1‘˜™8‘«`„t€™=‘`ƒ™G‘˜œQœV¢ Aœb¢  `„u[œk"]„v_œ~`„tjœ†`„tœŽ`„tj`„xœ§ a__`„tj`„x\>œ±¢ =Šœµ’rœÆ„{œÖ’_‚œÝ’rvœë€œâ’N`„t„}=#œþƒœö’„‹œö’„ja`„u`„u`„t+a__`„tN `„tx&"’r`„t(’_a`„~`„t„‚I1x<„5“•a`„~`„„JA?IKxV„O“jX`„ta`„~`„„>iÀ=o_€}’N ’„a__`„t ’_¬’r`„tJ¶?NŸ4Ÿ@0`„txŸPxŸGŸC’r`„tŸI’_a`„~`„t„‚”a`„t`„t„„NŸ\Ÿc1`„txŸkŸe’_…Ÿm“Ña`„~`„t„…NŸ€Ÿ2`„txŸ“Ÿ’r`„t†Ÿ•”a`„~`„t„‚NŸèŸõ3]„v_Ÿ÷„•_‡ ”Nx € ’N ’_a`„t_„‡N ¹ ¼4a__6j ¾^`„u[___= ï__€ ú’N¡”É ¡’„a__`„t†¡”¡’r`„t¡”ƒ“N¡6¡B5`„tx¡H¡D’r`„t…¡J“Ña`„~`„t„‚=¡Y__€¡d’N¡n”É ¡r’„a__`„t¡{’_†¡‚”€¡Š’N¡”•K =¡¤ __ ¡«”É ¡¯’„a__`„t€¡¸’N¡Â•K ¡Ï’r`„t¡Ô”ƒ“‡¡å”N€¡ù’N¢’_££ ¨A6£1¨ `„u[`„u[£:"]„v_£Za__£| a__`„t£Ž`„tj£–`„t£ž`„tj`„x\>£¤¨ =Œ£¨–›£¹„{ƒ£É–ˆ„£Ð–›v£Þ€£Õ–P`„t„}N£í£ô`„tx£ú£ö–›`„tƒ£ü–ˆa`„~`„t„‚I¤x¤…¤ –â•a`„~`„„J¤?I¤x¤*…¤#–âj¤,`„ta`„~`„„>¤=¤ž=¤C__€¤X–P¤b–`‚¤i–rƒ¤r–ˆ¤y–›`„t€¤~–Pƒ¤ˆ–ˆJ¤”?N¥ù¦1`„tx¦ƒ¦–ˆx¦…¦ –â”a`„t`„t„„a`„~`„t„…N¦¦+0`„tx¦4†¦-—ªƒ¦6–ˆa`„~`„t„‚N¦C¦P2`„tx¦V¦R–›`„t†¦X—ªa`„~`„t„‚N¦«¦¸3]„v_¦º„•_¦É˜!x¦ß€¦×–Pƒ¦à–ˆa`„t_„‡=¦ë__€¦ö–P§–`‚§–r†§—ª§–›`„t§˜V “N§5§A5`„tx§G§C–›`„t‡§I—òa`„~`„t„‚=§X__€§c–P§m–`‚§t–rƒ§}–ˆ†§„—ª€§Œ–P§–˜Ö =§¦ __ §­–`‚§´–r€§½–P§Ç˜Ö §Ô–›`„t§Ù˜V “§ð˜!€§þ–Pƒ¨–ˆ¨¬¨±«A7¨Ë« `„u[`„u[¨Ù8]„v_¨ùa__© a__`„t©(`„t©7`„t©H9]„v_©X:`„t\>©f«N©n©u`„tx©{„©w™ûƒ©}™ða`„~`„t„‚I©†©‘‡©Šš,“a`„u`„„ˆJ©—?=x©§…©¡š(†©¨šx©¼€©¸™¸ƒ©½™ða`„t_„‡a`„t_\„E©Ç©Ð©Ò*`„t”x©Ù©×šÃ‡©Ûš,a`„~`„„©ãšÃx©ä©ãšÃ”a`„~`„t„…>©è«ŽN©ò©ú_xª€©ü™¸xªƒª™ðª šÃa`„~`„t„…a`„t_„‡Nªª ;_}ª'ª"™Èª(›# a__Nª:ª>`„t†ª@šNªVªZ`„txªi†ª\šªkšÃa`„~`„t„…Cªrxª}ªy› ª›¯ a`„~`„„>ª„«.Nªª”`„txªšª–› xª©xª¢ªž›¯ ª¤› a`„~`„t„‚”a`„t`„t„„a`„~`„t„…Iª¶xªâ}ªÁ‚ªº™ÚªÂ›q }ªÓªÎ™ÈxªÚ…ªÔšªÛœ a`„t_„‡a__a__`„t“a`„~`„„>ªç«=ªñ›¯ ª÷œ >« «(=«› x««œ ”a`„~`„t„…=x«;…«4š.x«H«D› ”a`„~`„t„…x«^x«Z†«Mš«\šÃa`„~`„t„…”a`„~`„t„……«cš«k› ^`„t`„t]„‘_`„t\„’=x«{…«uš(«|› «ƒ›# a`„t_\„¬À¬Å°ÐA<¬Õ°Ð `„u[`„u[¬ã"]„v_­a__­% a__`„t­6`„t­E`„t­V9]„v_­f:`„t\>­t°Ð N­|­ƒ`„tx­‰„­…žlƒ­‹žaa`„~`„t„‚I­”x­Ÿ‡­˜žj­¡`„ta`„~`„„>­²®'=­¸__€­Üž)­æž9‚­ížKƒ­öža„­ýžl…®žw†® ž‡J®?N®/®61`„tx®>ƒ®8žax®H‡®Až”a`„t`„t„„a`„~`„t„…N®U®a0`„tx®j®cŸ3ƒ®lžaa`„~`„t„‚N®y®†2`„tx®Œ„®ˆžl®ŽŸ3a`„~`„t„‚N®Ü®é=`„tx®ø†®ëž‡®úŸ{ a`„~`„t„…=¯D__€¯Ož)¯Yž9‚¯`žK¯iŸ3„¯qžl…¯vžw¯~ŸÝ =¯É__€¯Ôž)¯Þž9‚¯åžKƒ¯îža¯õŸ3€¯ýž)°Ÿ3=°A __ °Hž9‚°OžK€°Xž)°bŸ3x°q°jŸ3°sŸ{ a`„~`„t„……°€žw°ŽŸÝ x°©°œŸÝ °«Ÿ¬ a`„~`„t„……°¹žw†°Áž‡² ²%·çA>²1·ç `„u[`„u[ ²Ma__²k a__`„t²€?]„v_²“@`„t²§A`„t²½B]„v_²ÑC`„t²æD`„t²ý9]„v_³ :`„t\>³·ç @x³Sƒ³H¡k„³U¡va`„~`„„³H³]@x³u†³i¡‘‡³w¡œa`„~`„„³i³€N³‰³‘E`„tƒ³“¡kN³¥³­F`„t†³¯¡‘N³Â³ÏG_x³Ú‚³Ñ¡[5³â³Û`„t³Û¢ 5³â³â`„t³â¢ x³â³Û¢^ ”a`„~`„t„…³Û¢^ a`„t_„‡N³í³öH_}³ý€³ø¡3³þ¢A a__N´´!I_x´-…´#¡5´5´.`„t´.¢/ 5´5´5`„t´5¢/ x´5´.£”a`„~`„t„…´.£a`„t_„‡N´@´JJ_}´Q€´L¡3´R¢ça__AC´d)A>´q·!I´wx´˜}´‚´{¡E´ƒ¢» ´£aa__`„tK“a`„~`„„–>´žµl=x´¬´¦¡§(5´¹´­`„t´­¡· 5´¹´¹`„t´¹¡· x´¹´­£ø”a`„~`„t„…´­£ø´¿¢A a`„t_\„I´Ó´ß´×¢ „´â¡va`„u`„„ˆB´ì?=µ¢A xµ5‚µ,¡[5µ=µ6`„tµ6¢ 5µ=µ=`„tµ=¢ xµ=µ6¤™”a`„~`„t„…µ6¤™a`„t_„‡=µH¢» }µX€µS¡3µY¢A a__>µs·=xµµ{¡§(5µŽµ‚`„tµ‚¡· 5µŽµŽ`„tµŽ¡· xµŽµ‚¥5”a`„~`„t„…µ‚¥5µ”¢ça`„t_\„Iµ©!µµµ­¢/ ‡µ¸¡œa`„u`„„ˆ>µÃ¶6=µÍ¢çxµç…µÝ¡5µïµè`„tµè¢/ 5µïµï`„tµï¢/ xµïµè¥Ø”a`„~`„t„…µè¥Øa`„t_„‡=µü£a}¶ €¶¡3¶¢ça__B¶&?=x¶‚¶|¡§(5¶¶ƒ`„t¶ƒ¡· 5¶¶`„t¶¡· x¶¶ƒ¦s”a`„~`„t„…¶ƒ¦s¶•¢A a`„t_\„=x¶°¶©¡§.¶¹¡· x¶Ô¶Ç¡· x¶à„¶×¡v¶â¢ a`„~`„t„‚a`„~`„t„…‚¶ö¡[·¢ ^`„t`„t]„‘_`„t\„’J·=x·b·\¡§(5·o·c`„t·c¡· 5·o·o`„t·o¡· x·o·c§x”a`„~`„t„…·c§x·u¢ça`„t_\„=x··†¡§.·¡· x·¸·«¡· x·Å‡·»¡œ·Ç¢/ a`„~`„t„‚a`„~`„t„……·Ñ¡·Ý¢/ ^`„t`„t]„‘_`„t\„’¸Ó¸Ø¹ÀAL¸ä¹À `„u[¸í"]„v_¹ a__`„t¹ `„tj¹(`„t¹0`„tj`„x\>¹6¹À=‹¹:¨Á¹K„{‚¹[¨®ƒ¹b¨Áv¹p€¹g¨ˆ`„t„}=¹{__€¹Œ¨ˆ6j¹–^`„u[___¹ ¨˜¹©„Œ‚¹³¨®¹º¨Á`„tºÐºÕ»ÏAMºæ»Ï `„u[`„u[ºô8]„v_»a__». a__`„t»@`„tj»H`„t»P`„tj`„x\>»V»Ï=Œ»Z©Õ»k„{ƒ»{©Â„»‚©Õv»Œ€»‡©Š`„t„}=»—__€»¢©Š»¨©š‚»¯©¬»¸„Œƒ»Â©Â»É©Õ`„t»Ò»×ÀAFAN»çÀAF `„u[`„u[»ð8]„v_¼ a__¼. a__`„t¼>#`„мJ`„t¼U`„t\>¼ZÀAFN¼ƒ¼Š`„tx¼…¼ŒªÓ„¼’ªÈa`„~`„t„‚C¼›x¼©†¼¢ªëOj¼¬`„ta`„~`„„—>¼ÀÀ@÷ N¼Ê¼ÕP`„tx¼îx¼Þƒ¼×ª½&†¼æªëa`„t`„t„„¼ðªÈa`„~`„t„…N¼ÿ½Q_x½ €½ª…‡½ «Ja`„t_„‡N½!½*R_}½1½,ª•½2«–a__N½B½MS`„t„½OªÈN½^½kT`„t…½mªÓN½z½†U`„tx½Œ…½ˆªÓ”a`„~`„t„‚=x½™€½•ª…(‡½š«Jx½¬€½¨ª…½­¬ a`„t_„‡a`„t_\„=x½Ã€½¿ª…(½Ä¬ ½Ó«–a`„t_\„C½Þx½ð½å«ñ ½ò¬ a`„~`„„>½ÿ¿ÙN¾ ¾V_x¾€¾ª…¾«ñ a`„t_„‡N¾1¾:W`„t}¾C‚¾<ª§}¾I¾Dª•¾J¬ä a__¾T«Å a__`„tI¾ex¾r¾i­“a`„~`„„>¾w¾•=¾«ñ x¾‹¾«ñ ”a`„~`„t„…>¾œ¿Ó=¾¦¬ x¾±¾¦¬ ”a`„~`„t„‚N¾Á¾ÏX`„t¾Ñ¬ =x¾ê€¾æª…(¾ë«ñ x¾ý€¾ùª…¾þ¬ a`„t_„‡a`„t_\„I¿x¿!¿­$“a`„~`„„>¿&¿¤=¿2¬ x¿>¿2¬ ”a`„~`„t„‚=¿L­á¿\¬ =x¿x€¿tª…(¿y¬ x¿Œ€¿ˆª…¿¬ a`„t_„‡a`„t_\„?=x¿²€¿®ª…(¿³­á¿Ä¬ä a`„t_\„I¿ßx¿öx¿î¿ã«ñ „¿ðªÈa`„~`„t„‚x¿ü…¿øªÓ¿þ¬ a`„~`„t„‚a`„~`„„>À@ À@q=À@__€À@ª…À@%ª•‚À@,ª§ƒÀ@5ª½„À@=ªÈÀ@D«ñ =ŒÀ@WªÈÀ@_¬ >À@xÀ@Ù=À@€__€À@‹ª…À@‘ª•‚À@˜ª§ƒÀ@¡ª½À@©¬ …À@·ªÓ=À@êÓÀ@É«ñ =ŽÀ@ߪëxÀ@ì…À@èªÓ„À@îªÈa`„~`„t„‚=À@û__€ÀAª…ÀAª•‚ÀA#ª§„ÀA,ªÈ…ÀA3ªÓ€ÀA8ª…„ÀA>ªÈ0Ÿs‚TFà D ò “4+$‹ü!(e)^*T0Ÿ €Ú„o‚3‚9“¿YZ`„u[`„u[[`„u[`„u]„˜__‚€‚€\a__‚ª‚·€]a_`„‚‚߀‘^]„˜_]„™__2‚Ý_]„™__;„q„q…„…„”_a__„¿`a_`„j`„x]___?€„ä±Î… ±á „q„›<†Ý†Ý‡®a†ò‡®†ýb]„˜__‡_a__‡A`a_`„j`„x]___>‡—‡®=x‡.c€‡¤²?a]„˜__\)‡f²S‚‡Œ²f †Ý„›'‡³‡Ëˆc@j‡´`„u‡Íˆc‡Ö`„u_>‡ÛˆcI‡á!x‡æ.d€‡ò²ùa`„u`„9J‡ø+?Nˆ ˆe]„™__xˆvˆ.^]„˜_]„™__5ˆ,ˆ,_&ˆ,€ˆ(²ù_}ˆ'vˆ.\a__ˆ,³za__a`„u]„™__„Jˆ8#ˆDˆ?³:+vˆZˆU³:]„™__ _„Ÿ_(ˆhˆ‚ˆó@(jˆi`„uˆ…ˆóˆˆ_ˆ _\>ˆ–ˆóIˆœ!xˆ¡.d€ˆ­´+a`„u`„9Jˆ³?=xˆÄvˆ¿.^]„˜_]„™__(5ˆÓˆÓ_€ˆÓ´+}ˆÒvˆÅ.\a__‚ˆÓ´ža__ˆÛ„¢__€ˆä´+ˆé´6a_]„™__\„£)ˆø‰ ‰[@cjˆù`„u‰‰[‰b]„˜__\>‰!‰[=x‰-€‰'µ0f4‰5‰5‰V‰6_‰; _\J‰E5‰I‰J_‰Jµk5‰Q‰Q_‚‰Qµv5‰I‰I\x‰I.(ƒ‰JµŒ„‰QµŸa__\(„‰QµŸaa__\\„¤*‰`‰qŠ@gj‰a`„u‰{Љ•h]„‘]„™__\J‰¡x‰§v‰¡.^]„˜_]„™__gx‰Á€‰²¶i]„™_]„™__4‰Å‰ÅЉÆj]„™__]„™_]„™__J‰Ì‰Ì„¢_]„™__5‰å‰å_v‰å‰ã¶“_„¥}‰âv‰Õ.\a__‚‰å¶àa__‰ë„¢__v‰ö‰ô¶“_„¥v‰ý‰û¶“ _„Ÿaa]„™__]„™_]„™__]„‘]„™_]„™__„§a]„‘]„™_]„™__\„¨+Š Š#ŠI@kjŠ `„uŠ/ŠIl`„u[m`„u[]„˜__JŠ5xŠ;vŠ5.^]„˜_]„™__k__a]„˜__„©,ŠNŠ_Š~@njŠO`„uŠdŠ~\>ŠgŠ~=xŠsvŠm.^]„˜_]„™__na\„ª-ŠƒŠ”‹@ojŠ„`„uŠŸ‹Ѝ`„u`„>Š­‹Iг!xЏ.d€ŠÄ¸Òa`„u`„9JŠÊ*?JŠÜxŠévŠã.^]„˜_]„™__o5‹‹_&‹€‹¸Ò_}‹vŠõ.\a__‹¹Aa__a`„u`„„«.‹‹'‹|@pj‹`„u‹4‹|‹= `„u`„J‹Mx‹Zv‹Sv‹M.^]„˜_]„™__q]„‘]„™__„­r4‹^‹^‹{‹_e]„™__`„J‹h‹sv‹m‹hº _„Ÿ€‹v¹¶a`„u`„„¯aa]„™__`„`„„° ‹‹ª‹ù@hj‹‚`„u‹²‹ù]„‘]„™__J‹»x‹Év‹Áv‹».^]„˜_]„™__h]„‘]„™_]„™__„±i]„™__4‹Í‹Í‹ø‹Îj]„™_]„™__]„™__J‹Ô‹Ô„¢__v‹åv‹ß€‹Ý»" ]„™__„Ÿ_„¥v‹òv‹ì€‹ê»" ]„™__„Ÿ _„Ÿaa]„™_]„™__]„™__]„‘]„™__„§/‹þŒŒm@fj‹ÿ`„uŒŒmŒ+sa__\\>Œ.Œm=xŒ:vŒ4.^]„˜_]„™__f4ŒBŒBŒhŒC_ŒHe]„™__\JŒQ}ŒR€ŒQ¼vŒX‚ŒS¼p_„¥vŒb‚Œ]¼p _„Ÿa__\aa_]„™__\\„¤!ŒrŒ‡ŒŸ@tjŒs`„uŒŒŸ`„JŒ’vŒ˜vŒ’.^]„˜_]„™__t`„„²"Œ¤Œ¹Œ×@ujŒ¥`„uŒÄŒ×`„JŒÇvŒÍvŒÇ.^]„˜_]„™__u`„„³#ŒÜŒø$@vjŒÝ`„uŒý$]„‘_Jx vv.^]„˜_]„™__q]„‘]„™__„­i_4#e]„™___Jv €¾_„¥aa]„™___]„‘_„§$)=S@j*`„uDS`„tJGvMvG.^]„˜_]„™__`„t„´0Xpç@ijY`„u{çl`„u[m`„u[œwa__]„™__]„˜__J°x¶v°.^]„˜_]„™__i__4ººæ»x_¾e]„™__]„™__JÇ}ЀǾúvÖ‚Ñ¿v_„¥và‚Û¿v _„Ÿa__]„™__aa_]„™__]„™__]„˜__„µ1ìúŽ“@yjí`„uŽŽ“Ž_Žza__>Ž$Ž“JŽ*vŽŠxŽ@vŽ1.^]„˜_]„™__y5ŽZŽZ_€ŽZÀ@<}ŽYvŽL.\a__‚ŽZÀ@•a__4Ž`Ž`Ž]„™__JŽfŽf„¢__€ŽoÀ@<}Ž|ŽtÀ@Ga_a_a]„™__]„™__„¶ _„Ÿ2Ž˜Ž§5@{jŽ™`„uŽ­5޶`„u_>Ž»5IŽÁ!xŽÆ.d€ŽÒÀAwa`„u`„9JŽØ+?NŽíŽòe]„™__xŽúvŽô.^]„˜_]„™__{5_&€ÀAw_}v.\a__ÀAúa__a`„u]„™__„·J5&&]„™__&ÀAº#&‚&ÀBa+v,&ÀBa]„™__ _„Ÿ_3:K¾@|j;`„uV¾u}a__`„\J„xŠv„.^]„˜_]„™__|4––½—x_še]„™__`„J£}§€£ÀBÑv­‚¨ÀC0_„¥v·‚²ÀC0 _„Ÿa__`„aa_]„™__`„\„¸4ÃÝÿ@~jÄ`„¹ëÿl`„u[m`„u[]„˜__Jñxñ.k__a]„˜__+5‘‘@j`„u‘‘_.a__Eza_j`„x_JYv‘Œx_vY.^]„˜_]„™__5tt_€tÀDB}svf.\a__ƒtÀD®a__4zz‘-{e]„™__]„™__>‘,N• _vœƒ—ÀDü _„ŸN¯¸€€_}ÀºÀDM„ÁÀE'a__IÑÕ„»…ßÀEG„éÀE'JñƒøÀDü?J‘‘ „¢__€‘ÀDB…‘ÀEGz#‘Z‚‘QÀD`+4‘k‘k‘Š]„™__J‘q‘q„¢__€‘zÀDB}‘‡‘ÀD`a_a_a]„™__^_a]„™__]„™__za]„™__]„™__„¼ _„Ÿ6‘–‘§’Å@€j‘—`„u‘°’Å‘Ìa___\J‘Ýx‘ãv‘Ý.^]„˜_]„™__€4‘í‘í’Ä‘îx_‘ñe]„™__]„™__>‘÷’ÃN’’ _v’‚’ ÀG _„ŸN’%’)_v’0‚’+ÀG _„¥N’A’J€€_}’R€’LÀF¬„’SÀGWƒ’XÀG7a___I’h’l„»ƒ’vÀG7…’}ÀGwJ’ˆ‚’ÀG ?J’’¤„¢__„’­ÀGW…’²ÀGwaa_]„™__]„™__\„½%’Ê’æ“@qj’Ë`„u’í“]„‘_J’ðx’ýv’öv’ð.^]„˜_]„™__q]„‘]„™__„­i_4““““e]„™___J“ v“€“ ÀH¨ _„Ÿaa]„™___]„‘_„§7““.“U@€‚j“`„u“6“U`„¾J“<“D„Á.9“Z“_“½@d“j“½“s`„u`„J“"%“†€“‚ÀIQ_"“žv“.]a_`„}“·u“¶v“©.]a_`„“¸ÀIQ_a_`„2×4 55ö7Ç8S8°9”:;ï<ä=<=”>n>Æ@AUB¯C³D F‰H"HþI6IÈJ41J1J4 =€Ú„o€õI>‚¯‚µ…› €ƒ`„u[]„Â_Aƒ-ƒ7€€„=]„‘]„‘_Hƒjƒpƒ• ƒ„ƒ•ƒŠ€„]„‘]„‘_]>_?A€ÀJà ƒp„ÄBƒšƒ¶„@€…jƒ›`„uƒ¿„]„Å_JƒÈƒÈU_vƒþxƒçvƒÜ.€„=]„‘]„‘_Ai]„Å_4ƒëƒëƒüƒì*]„‘_]„Å_Jƒòvƒô€ƒòÀKt€…]„Å_„Çaa]„‘_]„Å_]„‘]„Å_„§€…]„Å]„Å_„ÇF„£„´„û@€†j„¤`„u„¼„û„Å`„u`„J„Ñx„Üv„Ñ.€„=]„‘]„‘_Ar4„à„à„ú„á*]„‘_`„J„çx„é„çÀLS€†€„òÀLa`„u`„„Èaa]„‘_`„`„„°C………B@tj…`„u……B`„J… x…+v… .€„=]„‘]„‘_A€‡4…1…1…A…2*]„‘_`„J…8v…:€…8ÀM t`„„Éaa]„‘_`„`„„ÊD…G…[…™@j…H`„u…b…™`„tJ…ex…pv…e.€„=]„‘]„‘_A€ˆ`„t“4…x…x…˜…y`„t…*]„‘_`„tJ…‡x…Ž€…‡ÀM¸v…’…ÀMÃ`„t„Ëa`„~`„t„…a`„ta`„t]„‘_`„t`„t„ÌJúKëL°MVN3NOJjNLNO IJZ`„¦€‰`„u[`„u]„Å_MQ‚m‚w€€ŠI]„Å]„Å_U‚|‚|‚ý‚Œ‚ý‚£€‹]„Å]„Å_]J_>‚Ç‚ýI‚Í!x‚Ü€‚ÒÀNÓ€Œa`„„Î=w‚è.€ŠI+Q?M€‚½ÀNÓ ‚|„›Nƒƒƒ“@Vjƒ`„uƒƒ“_>ƒƒ“Nƒ&ƒ0€‹]„Å]„Å_vƒ2.€ŠI]„Å]„Å_MIƒB!ƒP€ƒFÀOmJƒYvƒrvƒjƒ`ÀOm]„Å]„Å_V]„Å_„ÐV_„Ð?Jƒ5`„x+#ÀOé&ƒ‹ÀOé_ÀOé__Sƒ˜ƒ©„¤@€Œjƒ™`„uƒ±„¤`„>ƒ´„¤Nƒ¾ƒÈ€‹]„Å]„Å_vƒÊ.€ŠI]„Å]„Å_MIƒÚ!ƒè€ƒÞÀPM>ƒñ„ŽDƒù>ƒü„QI„x„v„„ ÀPM]„Å]„Å_V]„Å_„ЀŒa`„„Î>„(„IJ„4)?x„d„ZÀPM]„Å]„Å_€Œa`„„Î=w„w.€ŠI+Q?J„”*O=PQ#Q7NvQ4Q7 V€Ú„o€õIWƒ)ƒ/ˆ€`„u[]„Ñ_]„p_Z„„!€€ŽV]„v]„v_k„P„P„m„`„m„f€Ž]„v]„v_]W_?Z€ÀQÏ „P„Ó aƒ‚ƒƒÞA€Vƒ•ƒÞb>ƒ˜ƒÞ=0ƒžƒ¤„Ö'€[„r„Ž„Û@€…j„s`„u„—„Û]„Å_J„ „ U_v„Òx„»v„´.€ŽV]„v]„v_Zi]„Å_4„¿„¿„ЄÀ*]„v_]„Å_J„Æv„È€„ÆÀR·€…]„Å_„Çaa]„v_]„Å_]„‘]„Å_„§€…]„Å]„Å_„Çi„à„ð…@j„á`„u„ö…„û`„t\>……=… a\…….…n@j…`„u…5…n`„tJ…8x…?v…8.€ŽV]„v]„v_Z€ˆ`„t“4…G…G…m…H`„t…P8]„v_`„tJ…Yx…`€…YÀSÐv…g…bÀSÛ`„t„}a`„~`„t„…a`„ta`„t]„v_`„t`„t„Ìb…s…І²@j…t`„u…Œ†²…‘€‘`„t_>…˜†²N…¢…¯€’`„t€…±ÀTmE…¼…Å…Ç*`„t“x…΂…ÌÀTŸv…×v…Ð.€ŽV]„v]„v_Z`„t„}a`„~`„„Š…ßÀTŸx…à‚…ßÀTŸ”a`„~`„t„…>…ä†gN…ð…õ8]„v_x…ýv…÷.€ŽV]„v]„v_Z‚…þÀTŸa`„t]„v_„‡I†x†€† ÀTmv†ƒ†ÀU`„t„}a`„~`„„>†!†EJ†+x†6ƒ†2ÀU€†7ÀTma`„t_„‡?=ˆ†MÀTmx†S€†MÀTmv†[ƒ†VÀU`„t„}a`„~`„t„‚=0†m†~„Ù†„ÀT‡.'€‘+v†§.`„t\c†·†Ñ†û@(j†¸`„u†Ô†û†Ù€‘`„t†â _\>†é†û=†ïad‡‡‡+@nj‡`„u‡‡+\>‡‡+=‡ae‡0‡A‡k@{j‡1`„u‡G‡k‡P`„u`„>‡Y‡k=‡_af‡p‡‡¶@|j‡q`„u‡Œ‡¶‡ž}a_`„\>‡¤‡¶=‡ªag‡»‡Ìˆ@€“j‡¼`„u‡×ˆ‡é}a_`„\>‡ïˆ=‡õa^ýý€À€”„o]„‘_Jý&ý xý.€•„Ýjý`„Þ ”j]„v`„ß j]„v[ ý„á`„Þ[j]„˜`„Þ[ a`„â[„ã]„‘_RR=S.SnTKV1V}V²VõW<W„X XLQmXIXL l€Ú„o€õ=mƒÏƒÕ‰€–`„u[[`„u[]„ä__p„+„0€€—l]„‘]„˜__u………!……!…€—]„‘]„˜__]m__?p€ÀXí …„æs…&…>†(@j…'`„u…@†(…I`„u_>…N†(>N…d€˜]„Å]„˜__v…dv…d.€—l]„‘]„˜__p€…]„Å]„˜__„ÇEx…dÀYk€Œa`„„Î>N…]i]„˜__v…kÀYkV]„˜__„Ð>…k†N…ª…° _x…µ‚…²ÀYစ¶ÀYNa`„u_„I…Â"!…̃…ÆÀZx…Û‚…×ÀYáoƒ…çÀZa`„u`„„«>…ï† J…ùƒ†ÀZ?J†+qˆšˆ¶‰@vjˆ›`„uˆ»‰]„‘_Jˆ¾ˆ¾_ˆàH_xˆûvˆõ.€—l]„‘]„˜__pi]„‘_4ˆÿˆÿ‰ ‰€™]„˜__]„‘_J‰v‰€‰À[v]„‘_„çaa]„˜__]„‘_]„‘]„‘_„§Y,Z–[‡v‰P‰V‹« €š`„u[]„Â_y‰¢‰«€€›l]„‘_‰°‰¶‰à ‰Ð‰à‰Ö€›]„‘_]v_?y€À[ì ‰¶„Äz‰åŠŠ7@€…j‰æ`„uŠ Š7]„Å_JŠ Š €‰_vŠ.vŠ$.€›l]„‘_y€…]„Å_„Ç}‹*‹;‹s@€†j‹+`„u‹C‹s‹L`„u`„J‹Xx‹bv‹X.€›l]„‘_y€†€‹kÀ\¦a`„u`„„È{‹x‹‹©@tj‹y`„u‹•‹©`„J‹˜v‹¢v‹˜.€›l]„‘_yt`„„É\\ƒ\ï];€€‹ö‹ün€œ`„u[`„u]„Å_€ƒŒCŒL€€l]„Å_€„ŒWŒn€‘€žl]„è_Œb„ê_€‰ŒsŒsŒ™Œ‰Œ™Œ€]„Å_]€€_?€ƒ€À]Ñ Œs„›€…ŒžŒ°ŒÌ@VjŒŸ`„uŒ¸ŒÌ_JŒ»vŒÅvŒ».€l]„Å_€ƒV_„Ѐ‡ŒÑŒâl@€ŒjŒÒ`„uŒêl`„>ŒílCŒóxvŒú.€l]„Å_€ƒ€Œa`„„Î>VIx%v.€žl]„è_€„€Ÿv).V_€…a_`„„í>3PJ=)?J\*^^S__Xƒ[˜]P__ €Š€€ü€†€ €Š`„tj`„t €Ž&€†€¡€Š`„tj"`„t€2D€†€¢€Š`„tj@`„t€Pb€†€£€Š`„tj^`„t€‘n€€†€¤€Š`„tj|`„t€’Œ €†€¥€Š`„tjœ`„t €”„x„}†ôA€¦„’†ô„š€§`„¾„¤€¨`„¾`„>„§†ôI„«!„¸v„±€„¯À``„t„ïv„½„»À`!`„t„ïa`„u`„„ˆJ„Å*?E„Õ„Þ„à*`„t“x„ç‚„åÀ`v„뀄éÀ``„t„ïa`„~`„„Š„óÀ`x„ô‚„óÀ`”a`„~`„t„…A>„ø†ãN……€©`„tx… €… À`€ª‚…À`a`„t`„t„ñN…#…)€«`„tx…-…+À`!€ª‚…8À`a`„t`„t„ñI…@…Jƒ…DÀ`ï„…MÀa$a`„u`„„ˆB…T?I…±!…Ãx…»ƒ…µÀ`„…½Àa$a`„t`„t„òj…Æ`„ta`„u`„„ˆJ…Õ*?N†G†V€­`„tx†^ƒ†XÀ`j†``„ta`„t`„t„óI†s"x†ƒj†w`„tK…††ÀaÊa`„~`„„–x†§…†˜ÀaÊKj†ª`„ta`„~`„„–>†·†ÍB†¿?J†Ó*J†ç)€•‡Ë‡ÏŠûA€¯‡âŠû‡ê€°`„¾`„t>‡òŠûNˆ»ˆÀ€±`„t“EˆÇˆÐˆÒ*`„t“xˆÙ‚ˆ×Àb¯vˆâ€ˆÛÀbƒ`„t„ïa`„~`„„ŠˆêÀb¯xˆë‚ˆêÀb¯”a`„~`„t„…>ˆïŠsNˆùˆþ€²`„tx‰€‰Àbƒ€ª‚‰Àb¯a`„t`„t„ñI‰µ"x‰Åj‰¹`„tKƒ‰ÈÀca`„~`„„–x‰Õƒ‰ÐÀcKj‰Ø`„ta`„~`„„–=‹‰åÀcx‰êƒ‰åÀcj‰í`„ta`„~`„t„‚?=‰ŠÀbxŠ7ßÿÿÿ€³xŠŠÀbƒŠÀca`„~`„t„…a`„t`„t„ô=‰Š'ÀbxŠ97ßÿÿÿ€³xŠAŠ<ÀbxŠXxŠP7Àÿÿ€³ŠRÀba`„t`„t„ô€´7 a`„t`„t„õa`„~`„t„…a`„t`„t„ô=‰ŠeÀbxŠjŠeÀb7a`„t`„t„„=‰ŠwÀbxЉ7ßÿÿÿ€³xŠ‘ŠŒÀbxЍxŠ 7Ãÿÿÿ€³Š¢Àba`„t`„t„ô€´–a`„t`„t„õa`„~`„t„…a`„t`„t„ô=‰Š²ÀbxзвÀb7 a`„t`„t„„JŠÁxŠÓ7ßÿÿÿ€³xŠÛŠÖÀbxŠòxŠê7¿ÿ€³ŠìÀba`„t`„t„ô€´7a`„t`„t„õa`„~`„t„…a`„t`„t„ô€–ûÿùA€µŽùŽ€§`„¾Ž&€¨`„¾`„t>Ž)ùNŽ1Ž?€¶`„t“EŽjŽsŽu*`„t“xŽ|ƒŽzÀfOvŽ€€Ž~Àf`„t„ïa`„~`„„‹ŽˆÀfOxމƒŽˆÀfO”a`„~`„t„…A>Ž´ IŽ“xŽ™ƒŽ—ÀfOOvŽžŽœÀf#`„t„ïa`„~`„„—Jަ”?Nޏ޾€©`„txŽÂ€ŽÀÀf€ªƒŽÍÀfOa`„t`„t„ñNŽÙŽß€«`„txŽãŽáÀf#€ªƒŽîÀfOa`„t`„t„ñIŽö„ŽúÀfú…Àg/a`„u`„„ˆB ?N:E€·`„t„GÀfúNVa€¸`„t…cÀg/In"x~jr`„tK„Àfúa`„~`„„–x„ŠÀfúKj“`„ta`„~`„„–> É=ލÀg‹x³†¨Àg‹j¶`„ta`„~`„t„‚?IÏ"xßjÓ`„tK…âÀg/a`„~`„„–xñ…ëÀg/Kjô`„ta`„~`„„–>*= Àg x‡ Àg j`„ta`„~`„t„‚?I0!?†4Àg‹‡BÀg a`„u`„„ˆJNvoxa†VÀg‹‡cÀg a`„~`„t„‚€¹`„t„÷?Iy‹‚}Àf=“a`„u`„„ˆ=Š‘Àf=x¨„¢Àfú…ªÀg/a`„~`„t„‚?I¸xÅv¾¼Àf#`„t„ï$vÉ€ÇÀf`„t„ïa`„~`„„JÑxØ” a`„t„‰?JÞvó‚åÀf=€¹`„t„÷€—“Ù“Ý–·A€º“ò–·“ú€§`„¾”€¨`„¾`„t>”–·N””€¶`„t“E”$”-”/*`„t“x”6ƒ”4Àj3v”:€”8Àiû`„t„ïa`„~`„„‹”BÀj3x”Cƒ”BÀj3”a`„~`„t„…A>”G–r I”Mx”Sƒ”QÀj3Ov”X”VÀj`„t„ïa`„~`„„—J”`”?N”r”x€©`„tx”|€”zÀiû€ªƒ”‡Àj3a`„t`„t„ñN”“”™€«`„tx””›Àj€ªƒ”¨Àj3a`„t`„t„ñI”°”º„”´ÀjÞ…”½Àka`„u`„„ˆB”Ä?N”֔ျ`„t„”ãÀjÞN”ò”ý€¼`„t…”ÿÀkI•."x•>j•2`„tK…•AÀka`„~`„„–x•P…•JÀkKj•S`„ta`„~`„„–>•`•‰=•hÀk„x•s‡•hÀk„j•v`„ta`„~`„t„…?I•"x•Ÿj•“`„tK„•¢ÀjÞa`„~`„„–x•±„•«ÀjÞKj•´`„ta`„~`„„–>•Á•ê=Ž•ÉÀkox•Ô†•ÉÀkoj•×`„ta`„~`„t„…?I•ð!•ÿ†•ôÀko‡–Àk„a`„u`„„ˆJ–v–/x–!†–Àko‡–#Àk„a`„~`„t„‚€¹`„t„÷?I–9–K‚–=Àj!“a`„u`„„ˆ=Š–QÀj!x–g„–aÀjÞ…–iÀka`„~`„t„‚?I–vx–ƒv–|–zÀj`„t„ï$v–‡€–…Àiû`„t„ïa`„~`„„J–x––” a`„t„‰?J–œv–±‚–£Àj!€¹`„t„÷€˜™ƒ™‡šÃA€½™•šÃ™€§`„¾™§€¨`„¾`„t>™ªšÃE™®™·™¹*`„t“x™À‚™¾Ànv™Ä€™ÂÀmß`„t„ïa`„~`„„Š™ÌÀnx™Í‚™ÌÀn”a`„~`„t„…>™ÑšI™×x™Ý‚™ÛÀnOv™â™àÀmë`„t„ïa`„~`„„—J™ê”?N™üš€©`„txš€šÀm߀ª‚šÀna`„t`„t„ñNšš#€«`„txš'š%Àm뀪‚š2Àna`„t`„t„ñIš:!šDƒš>Àn²„šGÀnça`„u`„„ˆ>šNš‹JšVš]€œ€šoÀmßšrÀm낚uÀnƒšxÀn²„šÀnç?Iš“xš vš™š—Àmë`„t„ï$vš¤€š¢Àmß`„t„ïa`„~`„„Jš¬xš³” a`„t„‰?J𹓀™  A€¾9  A€§`„¾K€¨`„¾`„t>N  NVd€¶`„t“E˜š*`„t“x¡ƒŸÀp)v¥€£Àoñ`„t„ïa`„~`„„‹­Àp)x®ƒ­Àp)”a`„~`„t„…A>²ŸÛ I¸x¾ƒ¼Àp)OvÃÁÀoý`„t„ïa`„~`„„—JË”?NÝ〩`„txç€åÀoñ€ªƒòÀp)a`„t`„t„ñNþž€«`„txžžÀoý€ªƒžÀp)a`„t`„t„ñIžž%„žÀpÔ…ž(Àq a`„u`„„ˆBž/?NžAžL€»`„t„žNÀpÔNž]žh€¼`„t…žjÀq Ižu"xž…jžy`„tK„žˆÀpÔa`„~`„„–xž—„ž‘ÀpÔKjžš`„ta`„~`„„–>ž§žÐ=Žž¯Àqexžº†ž¯Àqejž½`„ta`„~`„t„…?IžÖ"xžæjžÚ`„tK…žéÀq a`„~`„„–xžø…žòÀq Kjžû`„ta`„~`„„–>ŸŸ1=ŸÀqzxŸ‡ŸÀqzjŸ`„ta`„~`„t„…?IŸ7!ŸF†Ÿ;Àqe‡ŸIÀqza`„u`„„ˆ>ŸUŸœJŸ]Ÿd€œ€ŸvÀoñŸyÀoýƒŸ|Àp)†ŸÀqe‡Ÿ‹Àqz?IŸ¢Ÿ´‚Ÿ¦Àp“a`„u`„„ˆ=ŠŸºÀpxŸÐ„ŸÊÀpÔ…ŸÒÀq a`„~`„t„‚?IŸßxŸìvŸåŸãÀoý`„t„ï$vŸð€ŸîÀoñ`„t„ïa`„~`„„JŸøxŸÿ” a`„t„‰?J v ‚  Àp€¹`„t„÷€š¢u¢y¥XA€¿¢•¥X¢€§`„¾¢§€¨`„¾`„t>¢ª¥XN¢²¢À€¶`„t“E¢Ç¢Ð¢Ò*`„t“x¢Ùƒ¢×Àt v¢Ý€¢ÛÀsÔ`„t„ïa`„~`„„‹¢åÀt x¢æƒ¢åÀt ”a`„~`„t„…A>¢ê¥ I¢ðx¢öƒ¢ôÀt Ov¢û¢ùÀsà`„t„ïa`„~`„„—J£”?N££€©`„tx£€£ÀsÔ€ªƒ£*Àt a`„t`„t„ñN£6£<€«`„tx£@£>Àsà€ªƒ£KÀt a`„t`„t„ñI£S£]„£WÀt·…£`Àtìa`„u`„„ˆB£g?N£y£„€·`„t„£†Àt·N£•£ €¸`„t…£¢ÀtìI£­"x£½j£±`„tK„£ÀÀt·a`„~`„„–x£Ï„£ÉÀt·Kj£Ò`„ta`„~`„„–>£ß¤=Ž£çÀuHx£ò†£çÀuHj£õ`„ta`„~`„t„‚?I¤"x¤j¤`„tK…¤!Àtìa`„~`„„–x¤0…¤*ÀtìKj¤3`„ta`„~`„„–>¤@¤i=¤HÀu]x¤S‡¤HÀu]j¤V`„ta`„~`„t„‚?I¤o!¤~†¤sÀuH‡¤Àu]a`„u`„„ˆ>¤¤ÔJ¤•¤œ€œ€¤®ÀsÔ¤±Àsàƒ¤´Àt †¤·ÀuH‡¤ÃÀu]?I¤Ú¤ì‚¤ÞÀsú“a`„u`„„ˆ=ФòÀsúx¥„¥Àt·…¥ Àtìa`„~`„t„‚?I¥x¥$v¥¥Àsà`„t„ï$v¥(€¥&ÀsÔ`„t„ïa`„~`„„J¥0x¥7” a`„t„‰?J¥=v¥R‚¥DÀsú€¹`„t„÷€œ§W§[©ñA€À€Š§l©ñ§t€§`„¾§~€¨`„¾§…€‘`„t§€©`„t§›€«`„t`„t>§¢©ñ@!§³ƒ§­ÀwÝ„§¶Àwéa`„u`„„ˆ§­§»N§Ä§Í€Á`„§Ï€Ÿƒ§ØÀwÝN§æ§ï€Â`„§ñ€Ÿ„§úÀwéI¨…¨Àx)>¨¨õI¨†¨ÀxG>¨&¨iJ¨.¨5€€¨IÀw¹¨LÀwѨOÀwÝ„¨VÀw邨]ÀwÑI¨p"x¨z‚¨tÀwÑ$“a`„~`„„¨€Ÿx¨Œ€¨ŠÀw¹€ªx¨‚¨—ÀwÑ”a`„~`„t„‚a`„t`„t„ñ>¨¤¨ñJ¨ã”?I¨ü""†©ÀxGx©‚© ÀwÑ$“a`„~`„„©€Ÿx©$©"ÀwÅ€ªx©5‚©/ÀwÑ”a`„~`„t„‚a`„t`„t„ñ>©<©„J©wx©~” a`„t„‰?J©Ôv©ëx©âƒ©ÜÀwÝ„©äÀwéa`„~`„t„‚€¹`„t„÷€««´KA€Ã€Š«/´K«7€§`„¾«A€¨`„¾«H€©`„t«S€«`„t«^€‘`„t`„t>«e´K I«Õ«Ù€ €«ðÀz„«óÀzJ>«û­(N¬S¬Z€Ä`„t¬\€ž€¬oÀz¬rÀz&„¬uÀzJ„¬|ÀzJI¬ˆ!¬“…¬ŒÀz„“a`„u`„„ˆJ¬™…¬ Àz„?J­ v­ x­‚­Àz2ƒ­Àz>a`„~`„t„‚€¹`„t„÷?N­­—€Å`„t„­™ÀzJN­¦­­€Æ`„t„­¯ÀzJI­¸­Â‚­¼Àz2j­Å`„t a`„u`„„ˆ>­Ì®›D­Ò>­Õ®Z=­ÝÀ{x­ã…­ÝÀ{”a`„~`„t„…I­í­ø…­ñÀ{v­ý€­ûÀz`„t„ïa`„u`„„ˆJ®x® ” a`„t„‰?=Š®8Àz2x®B€®@Àz€ª…®MÀ{a`„t`„t„ñ®i‚®cÀz2j®l`„t a`„u`„„ˆI®x!®}€Ÿ‚®†Àz2J®Žx®•” a`„t„‰?I®¢®¬ƒ®¦Àz>j®¯`„t a`„u`„„ˆ>®¶¯ƒD®¼>®¿¯C=Ž®ÇÀ{-x®Í†®ÇÀ{-”a`„~`„t„…I®×®â†®ÛÀ{-v®ç®åÀz&`„t„ïa`„u`„„ˆJ®ï”?=‹¯!Àz>x¯+¯)Àz&€ª†¯6À{-a`„t`„t„ñ¯Rƒ¯LÀz>j¯U`„t a`„u`„„ˆI¯a!¯f€Ÿƒ¯oÀz>J¯w”??I¯‡!¯‘‚¯‹Àz2ƒ¯”Àz>a`„u`„„ˆ>¯›°N¯¥¯¬€Ä`„t¯®€ž€¯ÁÀz¯ÄÀz&…¯ÇÀ{†¯ÏÀ{-I¯Ü!¯ç‡¯àÀ}‚“a`„u`„„ˆJ¯í‡¯ôÀ}‚?J°v°x°‚°Àz2ƒ°Àz>a`„~`„t„‚€¹`„t„÷?AC°‰)A>°–³¯N° °©€Á`„*N°º°Ã€Â`„*=аÐÀz2“=‹°ßÀz>“I°îx°û°ôÀ{x°ò…°ôÀ{”a`„~`„t„…v°ÿ€°ýÀz`„t„ïa`„~`„„>±±S=бÀz2x±€±Àz€ª…±$À{a`„t`„t„ñ=±3À~"±>€Ÿ‚±GÀz2?I±Yx±fޱ_À{-x±]†±_À{-”a`„~`„t„…v±j±hÀz&`„t„ïa`„~`„„>±r±¾=‹±zÀz>x±„±‚Àz&€ª†±À{-a`„t`„t„ñ=±žÀ~1±©€Ÿƒ±²Àz>?I±Ä‡±ÈÀ~">±Ò²˜I±Ú±ÞÀ~1>±è²MI±ò±ü‚±öÀz2ƒ±ÿÀz>a`„u`„„ˆB²?B²@?J²Š”I²Ÿ²£À~1>²­²ÜJ²µx²¼” a`„t„‰>²ã³«J³ˆv³¡x³—…³À{†³™À{-a`„~`„t„‚€¹`„t„÷N³×³Þ€Ä`„t³à€ž€³óÀz³öÀz&…³ùÀ{†´À{-I´ !´‡´À€T“a`„u`„„ˆJ´‡´$À€T?J´.v´Ex´<‚´6Àz2ƒ´>Àz>a`„~`„t„‚€¹`„t„÷€žµ µ¶ÚA€Ç€Šµ#¶Úµ+€§`„¾µ5€¨`„¾µ<*`„tµC+`„t`„t>µF¶ÚCµJxµUеSÀxµQ‚µSÀ”a`„~`„t„…vµY€µWÀ`„t„ïa`„~`„„A>µa¶„Nµkµt€Á`„µv€Ÿxµ€µÀ€ª‚µŒÀa`„t`„t„ñIµ•µ‹µ›À'xµ™ƒµ›À'”a`„~`„t„…vµ¢µ À`„t„ïa`„u`„„ˆJµª#„µ±Àœ”“`„t?NµËµÔ€Â`„µÖ€ŸxµáµßÀ€ªƒµìÀ'a`„t`„t„ñIµõ„µùÀœ>¶¶7I¶ …¶À‚…¶BÀ‚<>¶L¶cJ¶Tx¶[” a`„t„‰>¶j¶€J¶r“I¶ˆ"x¶‹¶ŽÀ'x¶Œƒ¶ŽÀ'”a`„~`„t„…v¶”¶’À`„t„ïa`„~`„„¶ž€Ÿx¶©¶§À€ªƒ¶´À'a`„t`„t„ñ>¶¹¶ÌJ¶¿x¶Æ” a`„t„‰?J¶Ð“€Ÿ¶Ý¶â·A€È€Š¶ê·¶ï€É`„t`„J¶üx·x·€¶ýÀƒ›€¬j·`„t a`„t`„t„òK7 a`„~`„„–€ ¸'¸,¸ãA€Ê€Š¸B¸ã¸J€°`„¾¸V€‘`„t`„>¸]¸ãC¸ax¸p‰¸jÀ„x¸h¸jÀ„”a`„~`„t„‚O“a`„~`„„—>¸v¸ÑN¸€¸…€²`„tx¸Ž€¸‡À„€ª¸™À„a`„t`„t„ñI¸¥!¸®‚¸©À„j¸±`„t a`„u`„„ˆJ¸¸¸¿€Ÿ‚¸ÈÀ„?J¸Õ*„ó_H_ùbgeûißmÃoÕs¸w›yü€æƒ}ƒô„ó  €¡ €Ú„o€õ#ƒ'€¢ ……ä-€Ë `„u[]„Â_]ƒi_€° ]€¢_? „Ä €¤ ……€Âk„ø€Ì`„u[]„ë_€¥ ‘-‘>‘V@€Ÿj‘.`„u‘A‘V‘D _`„J‘N‘Nƒl€¦ ‘´‘Å‘í@cj‘µ`„u‘Ë‘í‘Ø"]„‘_\J‘å‘åƒl€§ ’K’\’}@{j’L`„u’b’}’k `„u`„J’u’uƒl€¨ ’Û’ì“@€Íj’Ü`„u’õ“’ÿ"]„‘[\J“ “ ƒl€© “r“ƒ“«@€Îj“s`„u“Œ“«“–"]„‘[\J“£“£ƒl€ª ” ””H@|j” `„u”%”H”7}a_`„\J”@”@ƒl€« ”¦”·”å@€“j”§`„u””å”Ô}a_`„\J”Ý”݃l€¬ •C•T•g@nj•D`„u•Y•g\J•_•_ƒl€® tÏA€ƒ'‡Ïb>ŠÏ=0–„Ö'€Ï…¸…è†+†o†±†ó‡5‡{‡Â‡öˆ/ €± ……ä €Ð `„u[]€¢_]ƒa_€Å ‚‚‚ ‚‚]€±_? ‚€°€³ ‚!‚=‚e@€…j‚"`„u‚F‚e]„Å_J‚Iv‚]‚I„ü_€…]„Å_„Ç€´ ‚i‚}‚ˆ@j‚j`„u‚„‚ˆ`„tJ‚‡“€¸ ‚Œ‚°‚Ö@kj‚`„u‚·‚Ö`„u[]€±_J‚½‚½€Å_€¹ ‚Ú‚ëƒ @€†j‚Û`„u‚óƒ ‚ü`„u`„Jƒ*€º ƒƒ"ƒW@€Ñjƒ`„uƒ-ƒWƒ@b]„‘`„u`„JƒJvƒP€ƒJÀ‰êt`„„É€» ƒ[ƒsƒ­@€Òjƒ\`„uƒ}ƒ­ƒŠb]„‘_]„‘_Jƒ”ƒ”ƒ¹_€ƒ§ÀŠ<€¼ ƒ±ƒÀƒß@€Ójƒ²`„uƒÆƒßƒÏ`„u_JƒÛ+€½ ƒã„„=@~jƒä`„¹jƒò`„u„„=`„u[]€±_J„$„$€Å_€¾ „A„O„Í@€Ôj„B`„u„Z„Í„l}a_`„„€Õa_j`„x_J„“#!„š„“À‹3}„ª„¤À‹3a_a_0„¯„µ„ÿ'€Ö_€¿ „Ñ„é… @€×j„Ò`„u„õ… `„u[]„‘_J„û…„ü_€À ……"…/@€Øj…`„u…'…/]„ë_J…-RN]„ë_…_€ÀŒ€Á …3…F…j@€Ùj…4`„u…K…j…Sb]„ë_]„ë_J…]…a…_€…dÀŒX€Â …n……§@€Új…o`„u……§…›b]„ë`„u]„ë_J…¥RN]„ë_…_ÀŒÓ€Ã …«…¾…â@€Ûj…¬`„u…È…â…Öb]„ë`„u]„ë_J…àRN]„ë_…_À;€¶  M M€À^ƒŠ]„ë_J M& M x M.€•„Ýj M`„Þ”j]„v`„ß j]„v[  M„á`„Þ[j]„˜`„Þ[ a`„â[„ã]„ë_ˆÀ‰‰B‰‹‰ÆŠŠpŠ«Šü‹’‹ÜŒ4ŒŒŒô\ì Ž4…^ˆ`Ž1Ž4 €Æ €Ú„o€õ€Š€Ê apƒ¨€Ü `„u[`„u€Í p€Ý€Æ[1[€Ï€Ï €Ž­Y–­ `„u[]€Ê_=5€Þ[€å5€ß_+€Ñ ‚‚‚,B€à‚ ‚,‚#€á_‚)€â_`„€Ò ‚͂тÚB€±‚Õ‚Ú‚Øj_`„t€Ó ƒŒƒ‘ƒ¦B`ƒ›ƒ¦ƒ¤€ã`„u`„ެŽü7e“€Ô …f…l‡Ý€ä `„u[€å`„u[`„u]€Ê_€× …¬…º€€æ€Æa__€Ø …Ñ…×€€ç€Æ]€Ê_€Þ …܅܆~…æ†~…õ€èa__†€é]€Ê_j†%]€ßb]€Ô__?€×€†YÀ.€Ø†yÀA …Ü„›€Ú †ƒ†”†å@€àj†„`„u†š†å†€á_†£€â_`„J†°x†·v†°.€ç€Æ]€Ê_€Ø€à5†Í†Í_€†ÍÀ´}†Ìv†¾.€æ€Æa__€×‚†ÍÀùa__5†á†á_†áÀÀ}†àv†Ò.€æ€Æa__€×‚†áÀ‘?a__a__`„€Ñ€Û †ê†ú‡%@€±j†ë`„u†þ‡%‡j_`„tJ‡x‡v‡.€ç€Æ]€Ê_€Ø€±5‡"‡"_€‡"À‘¹}‡!v‡.€æ€Æa__€×‡"À‘ña__a_`„t€Ò€Ü ‡*‡;‡Û@`j‡+`„u‡E‡Û‡N€ã`„u`„>‡Q‡ÛI‡W%‡]€‡[À’f_>‡c‡ÅN‡q‡w _5‡ˆ‡ˆ_‡ˆÀ’f_}‡‡v‡y.€æ€Æa__€×‡ˆÀ’§a__J‡’"%‡Ÿ‡™À’˜_x‡®v‡§.€ç€Æ]€Ê_€Ø`‡¹À’˜a`„u`„€Ó?J‡Ë*‘•’C“?€ß ‰ƒ‰‰Šr €ê `„u[`„u]€Ê_€å ‰·‰½‰Î ‰Ì‰Î]€ß_? ‰½„›€á ‰Ò‰ãŠ @€àj‰Ó`„u‰éŠ ‰ò€á`„u‰þ€â`„u`„JŠŠ€ŠÀ“ÓŠ À“ßa`„u`„„¯€â ŠŠ!Š>@€±jŠ`„uŠ%Š>Š.j`„u`„tJŠ4vŠ6€Š4À”9€ë`„t…€ã ŠBŠSŠp@`jŠC`„uŠ]ŠpŠf€ã`„u`„JŠl)“¯””c”ž€æ нŠÃ‹® €ì `„u[`„u]€Ê_€ì ŠòŠø‹ ‹‹ ]€æ_? Šø„›€è ‹‹‹F@€àj‹`„u‹%‹F‹(€á_‹.€â_`„J‹5‹5„»€‹?À•2‹CÀ•>€é ‹J‹Z‹z@€±j‹K`„u‹^‹z‹aj_`„tJ‹g‹g…€‹xÀ•€ê ‹~‹‹¬@`j‹`„u‹™‹¬‹¢€ã`„u`„J‹¨)••l•¶•ñ€í ŒÃŒÉ‘Ï €í `„u[`„u]€Ê]„‘_€ð %€€î€Æ]€Ê_€ö )/± ?±T€ï]€Ê_jl]€ßb]€í_?€ð€¢À–g /„›€ò ¶Ç—@€àj·`„uÍ—Û€ð]„‘_ó€ñ]„‘_`„>þ—IŽŽ„»€ŽÀ–ËŽÀ–ÜJŽ))?IŽ:"ŽH€Ž>À–ËŽ]ŽSÀ–ÜJŽf*?NŽ|Ž€€ò]„Å_vŽŒŽ‚À–Ë]„‘_€…]„Å_„ÇNŽžŽ¢€ó]„Å_vŽ®ޤÀ–Ü]„‘_€…]„Å_„ÇC޼)>ŽÉ“NŽÕŽÝ€ô`„xŽã‚ŽßÀ—:€Œa`„„ÎIŽõ!„ŽùÀ—²xƒÀ—q€Œa`„„Îa`„u`„„¯J*?I(!„-À—²J6)?II!x_vN.€î€Æ]€Ê_€ð€àvj‚fÀ—:V_„ÐvwƒsÀ—qV_„Ða__`„€ÑJ*?€ó œ¬‘Ž@€±j`„u°‘޾"]„‘_`„t>È‘ŽIÎÛ€ÒÀ˜°Jävð+€ë`„t…?N05€±`„t“>NR€˜]„Å_vRRÀ˜°]„‘_€…]„Å_„ÇExR‚À™€Œa`„„Î>NG_v\‚À™V_„Ð>\‘Nhj€õ`„tx}vl.€î€Æ]€Ê_€ð€±ƒ‚À™[a_`„t€Ò=‰’À˜îx¤xŸšÀ˜î„¡À™a`„~`„t„…€³j¦`„ta`„t`„t„ô=‰¸À˜îxÕxÅÀÀ˜îxÍÈÀ˜î€´7 a`„t`„t„õa`„~`„t„…€³j×`„ta`„t`„t„ô=‰éÀ˜îxîéÀ˜î€¬x÷òÀ˜î7a`„t`„t„„a`„t`„t„ò=‰‘À˜îx‘$x‘‘À˜îx‘‘À˜î€´–a`„t`„t„õa`„~`„t„…€³j‘&`„ta`„t`„t„ô=‰‘6À˜îx‘;‘6À˜î€¬x‘D‘?À˜î7 a`„t`„t„„a`„t`„t„ò=‰‘PÀ˜îx‘mx‘]‘XÀ˜îx‘e‘`À˜î€´7a`„t`„t„õa`„~`„t„…€³j‘o`„ta`„t`„t„ôJ‘‘†À˜î€ô ‘“‘¤‘Í@`j‘”`„u‘®‘Í‘·€ã`„u`„J‘½%‘¿€‘½Àœ ]„‘_–§˜Œ›êœ8€÷ “~“„˜˜ €ö `„u[`„u]€Ê]„v_€ú “Ǔ׀€î€Æ]€Ê_ “Û“á”_ “í”_”€ï]€Ê_j”]€ßb]€÷_?€ú€”PÀœ® “á„›€ü ”d”u•Õ@€àj”e`„u”{•Õ”…€÷]„v_”•€ø]„v_`„>”œ•ÕI”¢”¦„»€”°À”·À#J”¿)?I”Ð"”Ú€”ÔÀ”ë”åÀ#J”ô*?N• •`„tv••À]„v_`„t„}I•%!•0‚•)Àv•9•3À#]„v_`„t„}a`„u`„„ˆJ•A*?E•S•\•^*`„t“x•eƒ•cÀï‚•gÀa`„~`„„‹•oÀïx•pƒ•oÀï”a`„~`„t„…>•t•ÀI•|!x•’v•.€î€Æ]€Ê_€ú€àx•ž•™À]„v_ƒ•ŸÀïa`„t_„‡x•¨•£À#]„v_ƒ•©Àïa`„t_„‡a__`„€ÑJ•®*?J•Æ)€ý •Ú•ê˜[@€±j•Û`„u•î˜[•ø8]„v_`„t>•þ˜[I–– €–ÀŸJ–v–"+€ë`„t…?N–õ–ú€±`„t“E—— —*`„t“x—‚—ÀŸhv——ÀŸ]„v_`„t„}a`„~`„„Š—$ÀŸhx—%‚—$ÀŸh”a`„~`„t„…>—)—ÏN—5—7€õ`„tx—Jv—9.€î€Æ]€Ê_€ú€±x—S—OÀŸ]„v_‚—TÀŸha`„t_„‡a_`„t€Ò=‰—_ÀŸVx—qx—l—gÀŸVƒ—nÀŸâa`„~`„t„…€³j—s`„ta`„t`„t„ô=‰—…ÀŸVx—¢x—’—ÀŸVx—š—•ÀŸV€´7 a`„t`„t„õa`„~`„t„…€³j—¤`„ta`„t`„t„ô=‰—¶ÀŸVx—»—¶ÀŸV€¬x—Ä—¿ÀŸV7a`„t`„t„„a`„t`„t„ò=‰—ÕÀŸVx—ñx—â—ÝÀŸVx—ê—åÀŸV€´–a`„t`„t„õa`„~`„t„…€³j—ó`„ta`„t`„t„ô=‰˜ÀŸVx˜˜ÀŸV€¬x˜˜ ÀŸV7 a`„t`„t„„a`„t`„t„ò=‰˜ÀŸVx˜:x˜*˜%ÀŸVx˜2˜-ÀŸV€´7a`„t`„t„õa`„~`„t„…€³j˜<`„ta`„t`„t„ôJ˜L˜SÀŸV€þ ˜`˜q˜–@`j˜a`„u˜{˜–˜„€ã`„u`„J˜Š%˜Œ€˜ŠÀ¢š]„v_œîžô¢w¢Å ˜›˜ªP!€ù `„u[]„‘_]„‘[`„u]€Ê_ ™ ™€€î€Æ]€Ê_ ™™$™M ™6™M™<€î]€Ê_]__?€À£I ™$„› ™R™c›Þ@€àj™S`„u™i›Þ™l€ð_™y€ñ_`„>™„›ÞI™Š™Ž„»€™˜À£¥™£À£±J™¯)?I™À"™Î€™ÄÀ£¥™ã™ÙÀ£±J™ì*?Nšš €ú]… _[š … _[€àyš5vš$.€î€Æ]€Ê_€àa__`„€Ñ€ëyš`všO.€î€Æ]€Ê_€±a_`„t€Ò`yš‹všz.€î€Æ]€Ê_`a`„u`„€ÓNš š§`„t“>Nš¾€˜]„Å_vš¾š¾À£¥_]„‘_€…]„Å_„ÇExš¾„À¤Á€Œa`„„Î>Nš¹j_všÉ„À¤ÁV_„Ð>šÉ›NšÕšÛ€û[5šçšã[xšã‚šÝÀ¤ …šäÀ¥a`„u[„#šã†šãÀ¥P“†šãÀ¥P[=xšù‚šóÀ¤ (…šúÀ¥|›†šÿÀ¥C”a_[\„£=‹›À¤¯x›ƒ›À¤¯”a`„~`„t„…>N›2€˜]„Å_v›2›2À£±_]„‘_€…]„Å_„ÇEx›2„À¥ó€Œa`„„Î>N›-j_v›=„À¥óV_„Ð>›=›ÂN›I›O€û[x›W‚›QÀ¤ …›XÀ¦Qa`„u[„I›b"›l†›fÀ¦u›}†›wÀ¦u“a`„u`„„¯J›ƒ*?=x›‚›—À¤ (…›žÀ¦Q|›©†›£À¦u”a_[\„£=‹›´À¤¯x›ºƒ›´À¤¯”a`„~`„t„‚J›È›Öƒ›ÏÀ¤¯“a`„u`„„ˆ ›ã›óN@€±j›ä`„u›÷N›ú"_`„t>œNIœ œ€œÀ§oJœ vœ,+€ë`„t…?Nœ>œC€±`„t“>Nœ^€˜]„Å_vœ^œ^À§o_]„‘_€…]„Å_„ÇExœ^‚À§»€Œa`„„Î>NœS_vœh‚À§»V_„Ð>œhœÂNœtœv€õ`„txœ‰vœx.€î€Æ]€Ê_€±ƒœŽÀ¨a_`„t€Ò=‰œžÀ§¨xœ°xœ«œ¦À§¨„œ­À¨=a`„~`„t„…€³jœ²`„ta`„t`„t„ô=‰œÈÀ§¨xœäxœÕœÐÀ§¨xœÝœØÀ§¨€´–a`„t`„t„õa`„~`„t„…€³jœæ`„ta`„t`„t„ô=‰œöÀ§¨xœûœöÀ§¨€¬xœÿÀ§¨7 a`„t`„t„„a`„t`„t„ò=‰À§¨x-xÀ§¨x% À§¨€´7a`„t`„t„õa`„~`„t„…€³j/`„ta`„t`„t„ôJ?FÀ§¨£§K©õ žižoŸ‚ €ü `„u[]_]„‘_ ž¼žÂŸA žÛŸAžð€ï]€Ê_jŸ]€ßb] _? Ÿ+ €Ÿ1ÀªM ŸFŸWŸ€@`jŸG`„uŸaŸ€Ÿj€ã`„u`„JŸp%Ÿr€ŸpÀª¬]„‘_ª‰ª× ¡Œ¡’¢ €ý `„u[]_]„ë_ ¡Ì¡Ò¢C ¡Ý¢C¡ò€ï]€Ê_j¢ ]€ßb]_? ¢- €¢3À«+ ¢H¢Y¢}@`j¢I`„u¢c¢}¢l€ã`„u`„J¢r%¢t€¢rÀ«Š]„ë_«g«µ £*£0¤ü€þ`„u £P£X€€ÿ][[ £b£e€[ £o£t€ [ £x£x£¦££¦£‡€ÿ][[£–[£  [`?€À¬&À¬5‚À¬= £x„› £«£¿¤=@€ëj£¬`„u£È¤=`„tJ£Ñx¤+x£öx£Ô–x£ìv£ßv£Ö.€ÿ][[€Æ]€Ê[!€±v£ñ.[a[`„t€Òa`„~`„t… x¤7x¤v¤v¤.€ÿ][[€Æ]€Ê["€±v¤#. [a[`„t€Òa`„~`„t… a`„~`„t„…€³j¤3`„ta`„t`„t„ô ¤B¤\¤ú@j¤C`„u¤^¤ú¤fb`„u`„J¤v""%¤|€¤vÀ­¼`x¤¨v¤›v¤’.€ÿ][[€Æ]€Ê[!€àv¤¯.[v¤º¤´À­¼`[a[[`„€Ñx¤àv¤Ñv¤È.€ÿ][[€Æ]€Ê["€àv¤ç. [v¤ô¤îÀ­¼` [a[[`„€Ñ¬w­˜®— ¦O¦U¬l `„u[[`„u[`„u]€Ê]„˜__! ¦œ¦¨€€Æ]€Ê_" ¦¾¦Ì€€Æ]€Ê_( ¦Ð¦Ö§• ¦á§•¦öv]€Ê_j§]€ßb§/q]€Ê_j§>]€ßb]__?!€§pÀ¯1"§À¯L ¦Ö„›$ §š§«ªn@€àj§›`„u§±ªn§½]„˜__§Î]„˜__`„>§ÔªnI§Ú§Þ„»€§èÀ¯½§îÀ¯ÒJ§õ)?I¨"¨€¨ À¯½¨¨À¯ÒJ¨(*?N¨>¨E`„tv¨L¨GÀ¯½]„˜__`„t„´I¨X!¨c‚¨\À°4v¨k¨fÀ¯Ò]„˜__`„t„´a`„u`„„ˆJ¨s*?N¨™¨¬]„˜``„t¨®… ``„t>N¨Ò€˜]„Å_v¨Òv¨Ò¨ÍÀ¯½]„˜__v]„‘_„瀅]„Å_„ÇEx¨Ò„À°Ó€Œa`„„Î>N¨Æ_v¨Ø„À°ÓV_„Ð>¨Ø©pN¨ä¨ê`¨ì.…¨üÀ±Bx©©À¯½]„˜__…©À±Ba`„u_„N©©€û`„t5©9©1`„tx©1ƒ©À°§†©2À±fa`„u`„t„#©1‡©1À±Ê“©1À±Ê`„t`„t=x©Wƒ©EÀ°§(†©XÀ±fx©g‡©aÀ±º”a`„~`„t„…a``„t\„£>N©‹€˜]„Å_v©‹v©‹©†À¯Ò]„˜__v]„‘_„瀅]„Å_„ÇEx©‹„À²f€Œa`„„Î>N©_v©‘„À²fV_„Ð>©‘ªYN©©£`©¥.…©µÀ²Õx©¾©ºÀ¯Ò]„˜__…©¿À²Õa`„u_„N©Ð©Ö€û`„tx©êƒ©ØÀ°§†©ëÀ²ùa`„u`„t„I©ù"ª‡©ýÀ³MªªÀ³M`„t“a`„u`„„ˆJª*?=xª@ƒª.À°§(†ªAÀ²ùxªPªJÀ³M`„t”a`„~`„t„‚a``„t\„£Jª_)% ªsªƒ¬-@€±jªt`„uª‡¬-ª“i]„˜__`„t>ª˜¬-Iªžª¦€ª¢À´+Jª¯vª»+€ë`„t…?NªÍªÒ€±`„t“>Nªï€˜]„Å_vªïvªïªëÀ´+]„˜__v]„‘_„瀅]„Å_„ÇExªï‚À´€€Œa`„„Î>Nªä_vªõ‚À´€V_„Ð>ªõ«¡N«« `„tx«v« .€Æ]€Ê_!€±ƒ«À´ïa_`„t€ÒN«-«7 `„tx«Hv«9.€Æ]€Ê_"€±5_x«P«MÀ´+]„˜__ƒ«QÀ´ïa`„u_„#…Àµ„&«V…Àµ„_Àµ„__a_`„t€Ò=‰«cÀ´mx«x«~x«p«kÀ´mx«t–„«vÀµa`„~`„t… a`„~`„t„…x«‚7…«„ÀµVa`„~`„t… a`„~`„t„…€³j«‘`„ta`„t`„t„ô=‰«§À´mx«Ãx«´«¯À´mx«¼«·À´m€´–a`„t`„t„õa`„~`„t„…€³j«Å`„ta`„t`„t„ô=‰«ÕÀ´mx«Ú«ÕÀ´m€¬x«ã«ÞÀ´m7 a`„t`„t„„a`„t`„t„ò=‰«ïÀ´mx¬ x«ü«÷À´mx¬«ÿÀ´m€´7a`„t`„t„õa`„~`„t„…€³j¬`„ta`„t`„t„ôJ¬¬%À´m& ¬2¬C¬j@`j¬3`„u¬M¬j¬V€ã`„u`„J¬\%¬^€¬\À·ç]„˜__¯™´·Ä¸) ¯T¯Z±Ø  `„u[`„u]€Ê_, ¯¢¯­€ €Æ]„‘]€Ê_2 ¯²¯¸° ¯Å°¯Ü ]„‘]€Ê_])_?,€¯þÀ¸Œ ¯¸„›. ° °°»@€àj°`„u°$°»°'€á_°-€â_`„>°1°»>N°F€˜]„Å]€Ê_v°Fv°F. €Æ]„‘]€Ê_,€…]„Å]€Ê_„ÇEx°F‚À¹€Œa`„„Î>N°@]€Ê_v°S‚À¹V]€Ê_„Ð>°S°¥I°[x°bƒ°_À¹€`€°mÀ¸êa`„u`„€ÓJ°r"x°|ƒ°yÀ¹€`°‡À¸öa`„u`„€Óx°‘ƒ°ŽÀ¹€€à€°˜À¸ê°œÀ¸öa__`„€Ñ?J°«*/ °À°Ð±C@€±j°Á`„u°Ô±C°×j_`„t>°Ú±C>N°ï€˜]„Å]€Ê_v°ïv°ï. €Æ]„‘]€Ê_,€…]„Å]€Ê_„ÇEx°ïÀº|€Œa`„„Î>N°é]€Ê_v°üÀº|V]€Ê_„Ð>°ü±1I±x± ‚±Àºè`€±Àº_a`„u`„€ÓJ±x±$‚±!Àºè€±€±)Àº_a_`„t€Ò?J±7“0 ±H±Y±Ö@`j±I`„u±c±Ö±l€ã`„u`„>±o±Ö>N±„€˜]„Å]€Ê_v±„v±„. €Æ]„‘]€Ê_,€…]„Å]€Ê_„ÇEx±„À»±€Œa`„„Î>N±~]€Ê_v±‘À»±V]€Ê_„Ð>±‘±ÀI±™x± ‚±À¼`€±«À»“a`„u`„€ÓJ±¯)?J±Æ*¸Æº;»p¼3 ´9´?» `„u]€Ê[6 ´}´‚€^€Æ]€Ê[7 ´‘´›€€Æ`„= ´Ÿ´¥µ ´»µ´Æ]€Ê[j´Ó]€ßb`3?6€´þÀ¼õ7* ´¥„›> µâµè¶q ¶¶q¶]€Ê[j¶']€ßb`3?6€¶RÀ½J7) µè„›9 ¶v¶‡¹@€àj¶w`„u¶¹¶Ž€á[¶’€â[`„>¶–¹I¶œ%¶£€¶ À½«]„ë[>¶«¶íJ¶³"%¶½¶ºÀ½´]„ë[x¶Ù¶Ç[.€à¶àÀ½«]„ë[¶äÀ½´]„ë[a]„ë[]„ë[`„?I¶ó%¶ú€¶÷À½«]„˜[[>··XJ· "%··À½´]„˜[[x·D·([[v.q.€à·KÀ½«]„˜[[·OÀ½´]„˜[[a]„˜[[]„˜[[`„$?I·^!v·c.€Æ`„7>·o¸AI·w%·~€·{À½«]„v[>·‡·ÏJ·‘"%·›·˜À½´]„v[x·¹·¦[.€à·ÀÀ½«]„v[·ÄÀ½´]„v[a]„v[]„v[`„€ü?I·×%·Þ€·ÛÀ½«]„‘[>·ë¸;J·õ"%·ÿ·üÀ½´]„‘[x¸%¸€ö[.€à¸,À½«]„‘[¸0À½´]„‘[a]„‘[]„‘[`„€ò?I¸H%¸O€¸LÀ½«]„‘[>¸\¸ãI¸d!¸s%¸k¸hÀ½«]„‘[]„v[%¸y¸vÀ½´]„v[a`„u`„„¯J¸‚*?J¸–"%¸ ¸À½´]„‘[x¸Ï¸¯[.€à¸ÖÀ½«]„‘[¸ÚÀ½´]„‘[a]„‘[]„‘[`„?J¸éx¸öv¸ð.^€Æ]€Ê[6€à€¸ýÀ½«¹À½´a[[`„€Ñ: ¹ ¹º²@€±j¹`„u¹!º²¹*€ã`„u`„t>¹-º²I¹3%¹9€¹7ÀÀý]„ë[J¹Ax¹Z¹H[.€±¹_ÀÀý]„ë[a]„ë[`„t?I¹g%¹m€¹kÀÀý]„˜[[J¹ux¹¢¹|([[v.q.€±¹§ÀÀý]„˜[[a]„˜[[`„t%?I¹¯!v¹´.€Æ`„7>¹Àº>I¹È%¹Î€¹ÌÀÀý]„v[J¹×x¹ñ¹Þ[.€±¹öÀÀý]„v[a]„v[`„t€ý?Iº%º€ºÀÀý]„‘[Jºxº1º€ö[.€±º6ÀÀý]„‘[a]„‘[`„t€ó?IºE%ºK€ºIÀÀý]„‘[>ºXº”Jº`xº‡ºg[.€±ºŒÀÀý]„‘[a]„‘[`„t?Jºšxº§vº¡.^€Æ]€Ê[6€±€º¬ÀÀýa[`„t€Ò; º·ºÈ»@`jº¸`„uºÒ»ºÛ€ã`„u`„Jºç""%ºé€ºçÀÃ]„‘[%ºú€ºøÀÃ]„˜[[x» v».^€Æ]€Ê[6`€»ÀÃa`„u`„€Ó½‡ÀÙÂõÆ? »¦»¬¼ý `„u]€Ê`„¾E »ä»ê¼ ¼¼`?? »ê„›A ¼¼¼p@€àj¼ `„u¼¼p¼'`„¾¼7`„¾`„J¼I¼I€”€¼_ÀÄ ¼hÀÄB ¼u¼…¼·@€±j¼v`„u¼‰¼·¼‘€°`„¾`„tJ¼œ¼œ€•€¼°ÀÄjC ¼¼¼Í¼û@`j¼½`„u¼×¼û¼à`„u`„J¼ë%¼ò€¼ëÀÄ´`„¾ÃèÄFÄ‘ÄÚ€É 2€†€Æ`„tj(`„t ÅŽr¬“T”³–œM¢Úªªä«Â®¨¸+¼”ÛÄïÅ F €Ú„o€õ€Æ ƒŠG lr„z`„u[[`„u[]„__I ÛÛ‚‘æ‚‘ó€ÿ]€Ê_]G__? ‚„.‚ …__€ày‚7€‚.ÀÅ΀àa__`„€Ñ€ëy‚^€‚UÀÅ΀±a_`„t€Ò`y‚…€‚|ÀÅÎ`a`„u`„€ÓJ ƒ”ƒ”„xaƒ¤„xƒ±€ÿ]€Ê_ƒÅb]„˜__]G__>„a„x=x„g.c„nÀÆŽa]„˜__\„ ƒÔ„.ƒÚ…__€ày„€ƒýÀÆ}€àa__`„€Ñ€ëy„-€„$ÀÆ}€±a_`„t€Ò`y„T€„KÀÆ}`a`„u`„€ÓÇU ÇaŃÇ^Ça K€Ú„o€õ€Æ ƒŠLlr„r `„u[]ƒä_NÕÕ‚‹à‚‹í€ÿ]€Ê_]L_? ÿƒû‚…_€ày‚1€‚(ÀÇ߀àa__`„€Ñ€ëy‚X€‚OÀÇ߀±a_`„t€Ò`y‚€‚vÀÇß`a`„u`„€ÓOƒŠƒŠ„paƒš„pƒ§€ÿ]€Ê_ƒ½b]„‘_]L_>„Y„p=x„_.c„fÀÈ—a]„‘_\ƒë ƒÌƒûƒÒ…_€àyƒþ€ƒõÀȆ€àa__`„€Ñ€ëy„%€„ÀȆ€±a_`„t€Ò`y„L€„CÀȆ`a`„u`„€ÓÉNÉZÇ¡ÉWÉZ P€Ú„o€ô„rƒ…Rç‚.ƒ—Ajè`„¹‚Dƒ—`„u[`„u[l`„u[m`„u[‚Qi]„˜__‚pa___j`„x‚Š a___j`„x]„˜__>‚’ƒ—N‚š‚ a___5‚¦‚¢a___‚¢ÀÉý#‚¢ƒ‚¢ÀÊh4‚©‚©‚Ä‚ª_‚²x__J‚¸&‚¿„‚¸ÀÊž_‚¢ÀÊha___a___N‚Ì‚Ô a___5‚Ü‚Öa___‚‚ÖÀÊ#‚Ö„‚ÖÀË4‚߂߂þ‚àx_‚ã!__J‚ð&‚ù†‚ðÀËT_‚ÖÀËa___a___Nƒƒ€Ä]„˜__2ƒ__=xƒ"€ƒÀÉèf4ƒ*ƒ*ƒƒƒ+_ƒ3!_\>ƒ=ƒ‚=xƒI…ƒCÀË£(}ƒOƒƒJÀÊM†ƒPÀË䇃XÀËða___}ƒl„ƒeÀÊø†ƒmÀË䇃uÀËða___a__\„£aa__\\„¤Jƒˆ…ƒÀË£S„ɄӆA"„â†`„u[[`„u[„í]„˜__„ý]„˜__… a___j`„x]„˜__>…"†N…*…1€Ä]„˜__…3…__€…@ÀÌÌI…I…S‚…MÀÌ÷J…\5…c…c]„˜__ƒ…cÀÍ*R=x…k„…cÀÍlc…rÀÌáa]„˜__\…„…cÀÍl?=x……|ÀÌáf4…‰…‰†…Š_…!_\>…™…ÿ=x…¥ƒ…ŸÀÍ*(„…¦ÀÍÝ#x…¼ƒ…µÀÍ*o„…ÈÀÍÝa`„u`„„«}…Ô…ÏÀÌ÷a___5_x…Ûƒ…ÕÀÍ*„…ÜÀÍÝa`„u_„#†ÀÎ^&…á†ÀÎ^_ÀÎ^__……çÀÍèa___……óÀÍè_a__\„£aa__\\„¤J†ƒ† ÀÍ*T‡‡(‡ÚA#‡5‡Ú$`„u[`„u[‡Bq]„‘_‡Xa__]„˜_]„v_>‡]‡ÚN‡e‡ii]„˜_]„v_2‡w_]„v_>N‡‘€˜]„Å_v‡‘€‡‘ÀÏ7€…]„Å_„ÇEx‡‘ƒÀÏ¥€Œa`„„Î>N‡†_v‡™ƒÀÏ¥V_„Ð>‡™‡Ê=x‡º5‡²‡ ]„˜_]„v_‚‡ ÀÏu5‡§‡§_}‡§‡¤ÀÏG„‡¨ÀÏôa__5‡£‡£]„v_x‡£…‡ ÀÐ †‡§ÀÐCa`„u]„v_„#‡²‡‡£ÀÐr5‡¶‡¶]„v_‡¶…_“5‡£‡£\x‡£…‡ ÀÐ (†‡§ÀÐC‡¶Àлa_]„v_\„£‡¶Àл‡£ÀÐr]„v_]„v_€Ÿ„‡¾ÀÏôa_\…J‡Î‚‡ÕÀÏuU‰6‰9ŠÂA%‰DŠÂ$`„u[`„u[‰Qq]„‘_‰g&a__‰‰ a__`„tj`„x_>‰“ŠÂ=#‰Ÿ‚‰—ÀÑ´Š‰—ÀÑ´j‰£a`„u`„u`„t+a__`„tN‰¹'_N‰È(_>N‰ê€˜]„Å_v‰ê€‰êÀÑ€…]„Å_„ÇEx‰ê…ÀÒ3€Œa`„„Î>N‰ß_v‰ò…ÀÒ3V_„Ð>‰òŠ­N‰üŠ )_}ŠŠ ÀÑ †ŠÀÒ‚a__IŠ#"Š2„Š'ÀÒ"xŠa}ŠDŠ=ÀÑ´a__`„t‡ŠEÀÒ¦ŠUÀÒ"_`„ua__`„t“a`„~`„„>ŠfŠ©=‹ŠnÀÒ†ŠyÀÒ‚=ŒŠˆÀÒ"‡Š•ÀÒ¦?JбƒŠ¸ÀÒVŒŒ!­A*Œ,­$`„u[`„u[Œ9q]„‘_ŒP&a__Œs a__`„tj`„x_>Œ}­=#Œ‰‚ŒÀÓÆŠŒÀÓÆjŒa`„u`„u`„t+a__`„tNŒ£+_NŒ²,_>NŒÔ€˜]„Å_vŒÔ€ŒÔÀÓ¢€…]„Å_„ÇExŒÔ…ÀÔE€Œa`„„Î>NŒÉ_vŒÜ…ÀÔEV_„Ð>ŒÜ˜NŒæŒõ)_}ŒþŒ÷ÀÓ²†ŒÿÀÔ”a__I "„ÀÔ4xLuJ}.'ÀÓÆa__`„t‡/ÀÔ¸?ÀÔ4_`„ua__`„t$“a`„~`„„>Q”=‹YÀÔ'†dÀÔ”=ŒsÀÔ4‡€ÀÔ¸?Jœƒ£ÀÔ'Wëú“(A-“(`„u[#.]„˜_]„‘_]„˜_]„ë_>*“(N‘‘!€Ä]„˜_]„ë_2‘._]„ë_=x‘:€‘4ÀÕ­f4‘B‘B‘€‘C/_‘K0]„‘_\>‘R‘=x‘^‘XÀÕã(‚‘_ÀÖ.‘i…_ƒ‘uÀÖ:a_]„ë_\„£aa_]„‘_\\„¤N‘ñ‘öv]„v_x’v‘þ€‘øÀÕ­v]„‘_„ç1^2`„]„v_…>N’#€˜]„Å_v’#‚’#ÀÖ°€…]„Å_„ÇEx’#ƒÀ×€Œa`„„Î>N’3_v’)ƒÀ×V_„Ð>’)“>N’C€˜]„Å_v’C‚’CÀÖ°€…]„Å_„ÇEx’C…À×|€Œa`„„Î>N’84_v’I…À×|V_„Ð>’I“>N’e€˜]„Å_v’e‚’eÀÖ°€…]„Å_„ÇEx’e‡À×ô€Œa`„„Î>N’Z5_v’k‡À×ôV_„Ð>’k“ I’u"x’Šu’ˆx’’yÀÕ㆒€À×Ëa`„u]„ë_„€†„’“À×Sa`„u`„…x’¼u’ºx’±’«ÀÕã„’²À×Sa`„u]„ë_„€†’ÅÀØCa`„u`„…>’Ï“=x’ìu’êx’á’ÛÀÕ㆒âÀ×Ëa`„u]„ë_„€Ÿ’ðÀØCa_`„„í?J““ ÀÕãX• •­›­A6•Ë›­`„u[•à.]„˜_]„‘_]„v]„ë_>•ç›­ N–‡–€‘`„t“N–˜–ž7]„v_–¤…_“N–®–µ€Ä]„v]„ë_–¿…]„ë_“N—:—B8]… _`„t—D… _`„tN—]—f9]… _`„t—h… _`„tN——‰:]„è_—‹„ê_O—œ—¡;a_\—®š­—±/_\>—¹š­=x—Æ„—¿ÀÚ(—ÇÀÚ¬—ÑÀÙÄa_`„t\„£=x—ä…—ÜÀÚG(—åÀÚ¬—ïÀÙÄa_`„t\„£=‰—úÀÙÄx—ÿ—úÀÙÄ”a`„~`„t„…=x˜‚˜ÀÙÓ€Ÿ˜ÀÚ¬a_\…=x˜'†˜ÀÚo€Ÿ˜+ÀÚ¬a_`„„í>N˜\€˜]„Å_v˜\u˜\x˜T€˜OÀÙ’˜UÀÚ¬a`„u]„‘_„€…]„Å_„ÇEx˜\ÀÛ¢ €Œa`„„Î>N˜B<_v˜_ÀÛ¢ V_„Ð>˜_™ˆI˜g!x˜t„˜lÀÚo˜€ÀÜ a`„u`„„«>˜Œ™=˜–ÀÚ‘˜¤ÀÜ a_\=x˜À…˜¸ÀÚG(˜ÁÀÚ¬˜Ë…`„tu˜äx˜Ü…˜ÔÀÚG˜ÝÀÚ¬a`„u`„t„u˜úx˜ï…˜çÀÚG˜ðÀÜ a`„u`„t„a_`„t\„£I™ x™†™ÀÚo€†™ ÀÜ a`„u`„…>™,™‚=x™>…™6ÀÚG(™?ÀÚ¬™I…`„tu™bx™Z…™RÀÚG™[ÀÚ¬a`„u`„t„u™xx™m…™eÀÚG™nÀÜ a`„u`„t„a_`„t\„£?I™™¤x™›…™“ÀÚG™œÀÚ¬a`„u`„t„x™®„™§ÀÚ™¯ÀÚ¬a`„u`„t„a`„u`„„ˆ>™¸š©N™Ä™Î=]„ë_RN]„ë_…_ÀÞ_ N™à>_D™ð>™óšj=™ýÀÞƒ xš‚šÀÙÓ?a_…=xš,†š$ÀÚo{š3ÀÞƒ a`„u`„…=xšPšFÀÞJ €Ÿ5_šTÀÞƒ #ÀÞü &š]ÀÞü _ÀÞü __a_`„„í!š|šsÀÞƒ _šÀÚ¬a`„u`„„¯=xš•ƒšŽÀÙô€Ÿš™ÀÞJ a]„ë_\…?>NšË€˜]„Å_všËvšË€šÅÀÙ’v]„‘_„瀅]„Å_„ÇExšËÀߤ€Œa`„„Î>Nš»/_všÑÀߤV_„Ð>šÑ›Iš×!xšä„šÜÀÚošðÀà a`„u`„„«=šùÀÚ‘›Àà a_\?J›Œx›£v›šƒ›“ÀÙô@]„‘]„ë_…1^2`„]„v]„ë_…àÄɛɞ̞ÏÑaÓsÕˆÙmàÄ Y€Ú„r€ûƒ…(sµA‚Ô`„u[]„‘_EB[B\C]C^D_D`EaEbFcFdGeGfHgHhIiIjJkJlKmKnLoLpMqMrNsNtOuOvPxPwQyQzR{R|S}S~TT€UV‚VƒW„W…X†Y‡YˆZ‰ZŠ[‹\Œ\]Ž]^^‘_’_“`”`•a—a–b˜b™cšc›dœdežeŸs¶fÀFŒ`„u`„u]„‘_g g¡s·hÀH‹]„‘`„~i¢j£s¸kÀKÃ]„‘`„ti¤j¥s¹lÀPÅ]„‘`…i¦sºmÀR`„u[]„‘]„‘_n§s»oÀT¾]… _]… []„‘_p¨©qª«D¬D­G®G¯s¼rÀ_c`„u[^__W…"_`„ts°t±t²u³u´Z[……"‡=av…(‡=`„u[…"w]„‘_…-€û`„t…=#`„Šj`„x]„v_>…F‡==…W…#…hÀäz'€ûN……Š€…]„Å_v…‘€…ŒÀäi€…]„Å_„ÇN…£…ªx]„v_…¯…_“E…·…À…Â*`„t“x…É……ÇÀå…ËÀäza`„~`„„…ÒÀåx…Ó……ÒÀå”a`„~`„t„…>…׆RI…ßx…샅ãÀä¿€Œa`„„Î>…ø†&=x† „†Àä뀟v†ƒ† Àä¿V_„Ða_\…>†-†LJ†7„†>ÀäëN†\†b€‘`„t†dÀäz=#†v‚†oÀ䆊†oÀ䆆z„Œ+`„ŠC†ˆx†˜ƒ†Àä¿€Œa`„„Î>†¤‡&=†¬ÀåÙx†±…†¬ÀåÙ”a`„~`„t„…N†¿†Èy`„tx†Ñ†ÊÀä†`„Š&…†ÙÀåÙa`„t`„t„I†çx†ô††ëÀæ]†öÀäza`„~`„„=x‡„†ýÀäë(†‡Àæ]v‡ƒ‡Àä¿V_„Ða`„t_\„?J‡,„‡3Àäë\…"‡=az…"‡=`„u[…"w]„‘_^`„t`„Š]„v_J…"4…"…"‡=…-€û`„t…=#`„Šj`„x]„v_J…"…"[_€…"Àç*…"Àçi‚…"Àçu]‡q‡}‡Ða{‡…‡Ð`„u[‡}w]„‘_‡Ÿ}a_`„]„‘_J‡®x‡®€‡®ÀçÞ|4‡´‡´‡Ï‡µ_`„J‡Á!}‡Æ‡ÂÀçÇÀè0a_`„aa_`„]„‘_…$^‡}‡Ða}‡}‡Ð`„u[‡}w]„‘_aa_`„]„‘_J‡}4‡}‡}‡Ð‡Ÿ}a_`„]„‘_J‡}‡}]_€‡}À觇}Àèä_ˆVˆ^ˆ—a~ˆdˆ—`„u[ˆ^w]„‘_ˆs ^__W…"_`„t]„v_Jˆ5ˆˆ]„v_RNˆ]„v_ˆ…&_€ˆƒÀéF‚ˆÀé¡R=xˆŠ‚ˆÀ鎈ÀéW^a__`„t\…'‚ˆÀéŽ`ˆ^ˆ—a€ˆ^ˆ—`„u[ˆ^w]„‘_a^__W…"_`„t]„v_Jˆ^4ˆ^ˆ^ˆ—ˆs ^__W…"_`„t]„v_Jˆ^ˆ^__€ˆ^Àê.ˆ^Àê}a‰D‰L‰ýa‰m‰ý`„u[]… _]… [‰Lw]„‘_‰„a__]„v_>‰‹‰ýN‰•‰ž"]„v_RN‰ ]„v_‰ …&_€‰¤À낉 ÀëN=‰¯__‚‰ÁÀë:‰ËÀë6j‰Ò^]… _]… [__`„t_J‰ê‚‰ñÀë:b‰L‰ýa‚‰L‰ý`„u[‰Lw]„‘_^]… _]… [a__]„v_J‰L4‰L‰L‰ý]… _]… [‰„a__]„v_J‰L‰La__€‰LÀëø‰LÀì`cаЏ‹naƒŠÊ‹n`„u[`„u[Џw]„‘_Šèa__Šý ^__W…"_`„t]„v_>‹‹nN‹‹"]„v_RN‹]„v_‹…&_€‹Àìσ‹Àí==‹*__ƒ‹<Àí)‹FÀìà‚‹MÀìòJ‹[ƒ‹bÀí)dЏ‹na„Џ‹n`„u[Џw]„‘_^`„u[a__^__W…"_`„t]„v_JЏ4ЏЏ‹n`„u[Šèa__Šý ^__W…"_`„t]„v_JЏЏc__€Š¸Àí½Š¸Àî.‚ЏÀî@eŒÎŒÓŽ/a…ŒÛŽ/`„u[ŒÓw]„‘_Œê ^__W…"_`„t`„>ŒóŽ/NŒý€…]„Å_v €Àî¿€…]„Å_„ÇI!x)‚ Àa`„„ÎJ5)?NJZ†_ve‚\ÀïV_„ÐCrx‚‚yÀa`„„Î>ŽŽNš¢_v­‚¤ÀïV_„ÐI¼xâ}ÇÀÀîЃÈÀïT„ÙÀïš^__W…"_`„t$“a`„~`„„Jç*?=‹ûÀïT„Ž ÀïšJŽ )fŒÓŽ/a‡ŒÓŽ/`„u[ŒÓw]„‘_a^__W…"_`„t`„JŒÓ4ŒÓŒÓŽ/Œê ^__W…"_`„t`„JŒÓŒÓe_€ŒÓÀðMŒÓÀð—g ~aˆ-~`„u[]… _]… [ w]„‘_Da__`„>K~NU^€…]„Å_ve€`Àñ€…]„Å_„ÇIs!x‚xÀñJ€Œa`„„ÎJ)?N¢®‰_}µ°Àñ*v¿‚¶ÀñJV_„Ða__CÍxÝ‚ÔÀñJ€Œa`„„Î>éiNõù_}ûÀñ*v ‚ÀñJV_„Ða__Ix9x*ƒÀñœŠ„4Àñüa_`„t…)$“a`„~`„„J>*?=‹RÀñœ„`ÀñüJo)h ~a‹ ~`„u[ w]„‘_^]… _]… [a__`„J 4  ~]… _]… [Da__`„J  g__€ Àò¶ Àói‘y‘~“aŒ‘’“`„u[`„u[‘~w]„‘_‘°a__‘Å ^__W…"_`„t`„>‘ΓN‘ؑစ]„Å_v‘耑ãÀ󃀅]„Å_„ÇI‘ö!x’ƒ‘ûÀóØ€Œa`„„ÎJ’)?N’%’1‰_}’8’3Àó”v’Bƒ’9ÀóØV_„Ða__C’Px’`ƒ’WÀóØ€Œa`„„Î>’l’ëN’x’|_}’ƒ’~Àó”v’ƒ’„ÀóØV_„Ða__I’x’»}’¨‚’¡À󦄒©Àô*…’¶ÀôŠ^__W…"_`„t$“a`„~`„„J’À*?=Œ’ÔÀô*…’âÀôŠJ’ñ)j‘~“a‘~“`„u[‘~w]„‘_^`„u[a__^__W…"_`„t`„J‘~4‘~‘~“`„u[‘°a__‘Å ^__W…"_`„t`„J‘~‘~i__€‘~ÀõW‘~Àõ‘~ÀõÕk“Œ“‘”)aŽ“Ÿ”)`„u[“‘w]„‘_“Äa`„t_\\>“Ì”)N“Ö“Ü€‘`„t“>N“ù€˜]„Å_v“ù€“ùÀöO€…]„Å_„ÇEx“ùƒÀö’€Œa`„„Î>N“î_v“ÿƒÀö’V_„Ð>“ÿ”%=}” ”Àö`5””`„t‚”Àö5””`„tŠ”Àöx”…”À÷”a`„~`„t„……”À÷„”Àöáa`„t_\l“‘”)a“‘”)`„u[“‘w]„‘_aa`„t_\\J“‘4“‘“‘”)“Äa`„t_\\J“‘“‘k_€“‘À÷œ“‘À÷Òm”ɔΕIa‘”Ú•I`„u[”Îw]„‘_”ôa_`„\>”ü•IA>N•€˜]„Å_v•€•Àø.€…]„Å_„ÇEx•‚Àøb€Œa`„„Î>N• _v•‚ÀøbV_„Ð>••EI•$!}•/•)Àø?ƒ•0Àø±a_`„B•:?n”ΕIa’”ΕI`„u[”Îw]„‘_aa_`„\J”Î4”ΔΕI”ôa_`„\J”ΔÎm_€”ÎÀù"”ÎÀùWo–%–*–Óa“–=–Ó`„u[–*w]„‘_–ba`„t_`„\>–j–ÓN–t–z€‘`„t“A>N–—€˜]„Å_v–—€–—Àù²€…]„Å_„ÇEx–—ƒÀùù€Œa`„„Î>N–Œ_v–ƒÀùùV_„Ð>––ÏI–¥!}–°–ªÀùÃ5–¶–±`„t‚–±Àùå5–¶–¶`„tŠ–¶Àùåx–¶…–±Àú€”a`„~`„t„……–±Àú€„–ºÀúHa`„t_`„B–Ä?p–*–Óa”–*–Ó`„u[–*w]„‘_aa`„t_`„\J–*4–*–*–Ó–ba`„t_`„\J–*–*o_€–*Àû–*ÀûGq———¼a•—'—¼`„u[€Ì`„u[—w]„‘_—I–a`„t__]„‘_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„‘_€Àû°N–a`„t__ÀûÁOš[—'—¼›]…*[œ[[`„>>—X—¼N—b—h€‘`„t“>N—…€˜]„Å_v—……—…Àü9€…]„Å_„ÇEx—…Àüà €Œa`„„Î>N—z_v—‹Àüà V_„Ð>—‹—¸>=wÀüž„s}— †—™ÀüP5—¦—¡`„t—¡Àü° 5—¦—¦`„t—¦Àü° x—¦—¡Àý^”a`„~`„t„…—¡Àý^—ªÀý a`„t__…-M—“)J—¼*J‡ÀünJ…0_‚Àûêr——¼aŸ——¼`„u[—w]„‘_^€Ì`„u[a`„t__]„‘_J—4———¼€Ì`„u[—I–a`„t__]„‘_J——q__€—Àþ—Àþus—ü˜˜³a ˜˜³`„u[˜w]„‘_˜9}a`„t_`„]„‘_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„‘_€ÀþàN}a`„t_`„ÀþñOš[˜˜³›]…*[œ[[`„>>˜E˜³N˜O˜U€‘`„t“>N˜r€˜]„Å_v˜r…˜rÀÿh€…]„Å_„ÇEx˜rÀÿñ €Œa`„„Î>N˜g_v˜xÀÿñ V_„Ð>˜x˜¯I˜€}˜ˆ†˜„Àÿ5˜Ž˜‰`„t˜‰ÀÿÞ 5˜Ž˜Ž`„t˜ŽÀÿÞ x˜Ž˜‰À{”a`„~`„t„…˜‰À{˜’ÀB a`„t_`„>=wÀÿ¯ž„s˜¢ÀB …-M˜œ)?J˜³*J‡ÀÿœJ…0_‚Àÿt˜˜³a¡˜˜³`„u[˜w]„‘_aa`„t_`„]„‘_J˜4˜˜˜³˜9}a`„t_`„]„‘_J˜˜s_€˜ÀV˜À—u˜ø™™³a¢™™³`„u[™w]„‘_™8}a`„t_`„]„‘_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„‘_€ÀýN}a`„t_`„ÀOš[™™³›]…*[œ[[`„>>™D™³N™N™T€‘`„t“>N™q€˜]„Å_v™q…™qÀ…€…]„Å_„ÇEx™qÀ €Œa`„„Î>N™f_v™wÀ V_„Ð>™w™¯I™!}™ˆ†™„Àœ5™Ž™‰`„t™‰Àû 5™Ž™Ž`„t™ŽÀû x™Ž™‰À™”a`„~`„t„…™‰À™™’À_ a`„t_`„>=wÀÌž„s™¢À_ …-M™œ)?J™³*J‡À¹J…0_‚À6v™™³a£™™³`„u[™w]„‘_aa`„t_`„]„‘_J™4™™™³™8}a`„t_`„]„‘_J™™u_€™Àt™ÀµwššÉa¤ššÉ`„u[šw]„‘_^€Ì`„u[a`„t_]„‘_]„‘_Jš4šššÉ€Ì`„u[šW¥a`„t_]„‘_]„‘_Jššx__€šÀšÀyxšššÉa¦š$šÉ`„u[€Ì`„u[šw]„‘_šW¥a`„t_]„‘_]„‘_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„‘_€ÀóN¥a`„t_]„‘_ÀOš[š$šÉ›]…*[œ[[`„>>šešÉNšošu€‘`„t“>Nš’€˜]„Å_vš’…š’À€…]„Å_„ÇExš’À €Œa`„„Î>Nš‡_vš˜À V_„Ð>š˜šÅ>=wÀΧ„s}š­†š§À˜5š³š®`„tš®Àý 5š³š³`„tš³Àý xš³š®À«”a`„~`„t„…š®À«š·Àa a`„t_]„‘_…1Mš )JšÉ*J‡À»J…0_‚À2yœŠœŒïa¨œ™ï`„u[œŒw]„‘_œÇ©a`„t____>œÐïNœÚœã€…]„Å_vœê€œåÀn€…]„Å_„ÇIœø!x‚œýÀ¨€Œa`„„Î>?=0 „ÿ'ª?NIO€‘`„t”N\c€Ä_vn‚eÀ¨V_„ÐC{x‹‚‚À¨€Œa`„„Î>—Ø=ŒŸÀ }¯¨À5µ°`„tƒ°À 5µµ`„t‹µÀ xµ…°À x”a`„~`„t„……°À x„¹À vÊ‚ÁÀ¨V_„Ða`„t___JÞ„åÀ zœŒïa«œŒï`„u[œŒw]„‘_aa`„t____JœŒ4œŒœŒïœÇ©a`„t____JœŒœŒy_€œŒÀ #œŒÀ c{ŸWŸY Va¬Ÿg V`„u[€Ì`„u[ŸYw]„‘_Ÿq­_Ÿ¬©a`„t____>Ÿµ VNŸ¿ŸÆ€Ä_ŸÈÀ äNŸÞŸä€‘`„t“>N €˜]„Å_v € À Ó€…]„Å_„ÇEx …À A€Œa`„„Î>NŸö_v …À AV_„Ð>  ?=‹ À } ‚ À ð5 %  `„t„  À .5 % %`„tŒ %À .x %‡  À Ì”a`„~`„t„…‡  À ̃ )À † 1À a`„t___J Eƒ LÀ |ŸY Va®ŸY V`„u[ŸYw]„‘_^€Ì`„u[_a`„t____JŸY4ŸYŸY V€Ì`„u[Ÿq­_Ÿ¬©a`„t____JŸYŸY{__€ŸYÀ kŸYÀ È‚ŸYÀ Ô} £ ¦¡:a¯ ¶¡:`„u[ ¦w]„‘_ Ð}a_`„_> Ö¡:>N ð€˜]„Å_v ð€ ðÀ E€…]„Å_„ÇEx ð‚À z€Œa`„„Î>N å_v ö‚À zV_„Ð> ö¡%I þ}¡¡À Vƒ¡À Éa_`„J¡ƒ¡À É?J¡++~ ¦¡:a° ¦¡:`„u[ ¦w]„‘_aa_`„_J ¦4 ¦ ¦¡: Ð}a_`„_J ¦ ¦}_€ ¦ÀE ¦À}¡Ï¡Ò¢”a±¡é¢”`„u[¡Òw]„‘_¢}a`„t_`„_>¢¢”N¢¢$€‘`„t“>N¢A€˜]„Å_v¢A€¢AÀÚ€…]„Å_„ÇEx¢AƒÀ"€Œa`„„Î>N¢6_v¢GƒÀ"V_„Ð>¢G¢I¢O}¢W¢SÀë5¢]¢X`„t‚¢XÀ5¢]¢]`„tŠ¢]Àx¢]…¢XÀ¨”a`„~`„t„……¢XÀ¨„¢aÀqa`„t_`„J¢k„¢rÀq?J¢…+€¡Ò¢”a²¡Ò¢”`„u[¡Òw]„‘_aa`„t_`„_J¡Ò4¡Ò¡Ò¢”¢}a`„t_`„_J¡Ò¡Ò_€¡ÒÀB¡ÒÀ~¢Ö¢Ý£Va³¢é£V`„u[¢Ýw]„‘__>¢é£VN¢ó¢ü€…]„Å_v£€¢þÀ߀…]„Å_„ÇI£x££Àþ€Œa`„„ÎJ£*v£:£1ÀþV_„Ð?J£G+‚£¢£¥¤Ka´£´¤K`„u[£¥w]„‘_£Î}a_`„_>£Ô¤KN£Ý€Ä_>N£ý€˜]„Å_v£ý€£ýÀŠ€…]„Å_„ÇEx£ýƒÀÌ€Œa`„„Î>N£ò_v¤ƒÀÌV_„Ð>¤¤4I¤ }¤¤À›„¤Àa_`„=ФÀ»„¤'À?J¤:‚¤AÀ»ƒ£¥¤Kaµ£¥¤K`„u[£¥w]„‘_aa_`„_J£¥4£¥£¥¤K£Î}a_`„_J£¥£¥‚_€£¥À¡£¥ÀÙ„¤Ô¤×¥«a¶¤í¥«`„u[¤×w]„‘_¥}a`„t_`„_>¥¥«N¥!€Ä_N¥1¥7€‘`„t“>N¥T€˜]„Å_v¥T€¥TÀ6€…]„Å_„ÇEx¥T„À‹€Œa`„„Î>N¥I_v¥Z„À‹V_„Ð>¥Z¥”I¥b}¥j¥fÀG5¥p¥k`„tƒ¥kÀx5¥p¥p`„t‹¥pÀxx¥p†¥kÀ”a`„~`„t„…†¥kÀ…¥tÀÚa`„t_`„=Š¥~Àk…¥‡ÀÚ?J¥š‚¥¡Àk…¤×¥«a·¤×¥«`„u[¤×w]„‘_aa`„t_`„_J¤×4¤×¤×¥«¥}a`„t_`„_J¤×¤×„_€¤×Àµ¤×Àñ†¥ì¥ó¦1a¸¥þ¦1`„u[¥ów]„‘__>¥þ¦1I¦v¦€¦ÀRt`„„ÉJ¦+?J¦"v¦)€¦)ÀR¹_…2‡§§“¨Æaº§¤¨Æ`„u[§“w]„‘_§¾}a_`„_>§Ä¨ÆN§Í€Ä_N§Ý§ã»`„*>N¨€˜]„Å_v¨€¨ÀÉ€…]„Å_„ÇEx¨„À€Œa`„„Î>N§ù_v¨ „ÀV_„Ð>¨ ¨¯I¨}¨¨ÀÚ…¨Àia_`„>¨%¨©I¨/!ƒ¨4À>¨;¨y=ЍGÀú…¨PÀi=‹¨cÀ)>¨€¨¡J¨Œ+?J¨µ‚¨¼Àúˆ§“¨Æa¼§“¨Æ`„u[§“w]„‘_aa_`„_J§“4§“§“¨Æ§¾}a_`„_J§“§“‡_€§“À§“ÀR‰©g©jªËa½©‚ªË`„u[©jw]„‘_©§}a`„t_`„_>©­ªËN©¶€Ä_N©Æ©Ì»`„*N©Ý©ã€‘`„t“>Nª€˜]„Å_vª€ªÀ¯€…]„Å_„ÇExª…À€Œa`„„Î>N©õ_vª…ÀV_„Ð>ªª´Iª}ªªÀÀ5ªª`„t„ªÀ5ªª`„tŒªÀxª‡ªÀ™”a`„~`„t„…‡ªÀ™†ª Àba`„t_`„>ª*ª®Iª4!ƒª9Àñ>ª@ª~=ŠªLÀ䆪UÀb=‹ªhÀñ)>ª…ª¦Jª‘+?Jªº‚ªÁÀ䊩jªËa¾©jªË`„u[©jw]„‘_aa`„t_`„_J©j4©j©jªË©§}a`„t_`„_J©j©j‰_€©jÀh©jÀ¤‹«j«q¬@a¿«~¬@`„u[«qw]„‘__>«~¬@N«ˆ«‘€…]„Å_v«˜€«“À€…]„Å_„ÇI«¦x«³«ªÀ$€Œa`„„Î>«¿¬+N«Ë«Ò€Ä_v«Ý«ÔÀ$V_„ÐI«ì!x«ú«ñÀ$€Œa`„„Î>¬¬%J¬‚¬Àu??J¬1+Œ®¹®Ã¯ÐaÀ®Ô¯Ð`„u[`„u[Á`„u[®Ãw]„‘_®òa__¯©a___]„˜__>¯%¯ÐN¯/¯6€Ä]„˜__2¯>__>N¯Z€˜]„Å_v¯Z€¯ZÀ€…]„Å_„ÇEx¯Z„À}€Œa`„„Î>N¯O_v¯`„À}V_„Ð>¯`¯¹N¯l¯p_}¯w¯rÀ…¯xÀÌa__=x¯Žƒ¯ˆÀV(†¯Àð}¯‚¯–À(x¯¤ƒ¯žÀV†¯¥Àða`„u_„…¯«ÀÌa___a__\„£J¯¿ƒ¯ÆÀV®Ã¯Ða®ïÐ`„u[®Ãw]„‘_^`„u[Á`„u[a__a___]„˜__J®Ã4®Ã®Ã¯Ð`„u[Á`„u[®òa__¯©a___]„˜__J®Ã®ÃŒ___€®ÃÀ¿®ÃÀ:‚®ÃÀLް°°Ñað°Ñ`„u[`„u[°w]„‘_°5a__]„˜_]„ë_>°<°ÑN°F°M€Ä]„˜_]„ë_2°Z_]„ë_>N°v€˜]„Å_v°v€°vÀÏ€…]„Å_„ÇEx°vƒÀ?€Œa`„„Î>N°k_v°|ƒÀ?V_„Ð>°|°º=5°œ°œ]„ë_5°œ°…]„˜_]„ë_‚°…À5°‘°‘_}°‘°ŒÀà„°’ÀŽa__5°‹°‹]„ë_x°‹…°…ÀȆ°‘Àëa`„u]„ë_„#°œ‡°‹À5°£°£]„ë_RN]„ë_…_Àv5°‹°‹\x°‹…°…ÀÈ(†°‘Àë°£Àca_]„ë_\„£°£Àc°‹À]„ë_]„ë_R=x°¨…°œÀµ€Ÿ„°¬ÀŽa_`„„í…°œÀµJ°À‚°ÇÀ°°ÑaݰÑ`„u[°w]„‘_^`„u[a__]„˜_]„ë_J°4°°°Ñ`„u[°5a__]„˜_]„ë_J°°Ž__€°À ^°À »±±±Óaű"±Ó`„u[`„u[±w]„‘_±9a__]„˜_]„v_>±@±ÓN±J±Q€Ä]„˜_]„v_2±__]„v_>N±{€˜]„Å_v±{€±{À!3€…]„Å_„ÇEx±{ƒÀ!£€Œa`„„Î>N±p_v±ƒÀ!£V_„Ð>±±¼=5±¡±¡]„v_5±¡±Š]„˜_]„v_‚±ŠÀ!r5±–±–_}±–±‘À!D„±—À!òa__5±±]„v_x±…±ŠÀ",†±–À"Oa`„u]„v_„#±¡‡±À"~5±¥±¥]„v_±¥…_“5±±\x±…±ŠÀ",(†±–À"O±¥À"Ça_]„v_\„£±¥À"DZÀ"~]„v_]„v_R=x±ª…±¡À"€Ÿ„±®À!òa_\……±¡À"J±Â‚±ÉÀ!r‘±±ÓaƱ±Ó`„u[±w]„‘_^`„u[a__]„˜_]„v_J±4±±±Ó`„u[±9a__]„˜_]„v_J±±__€±À#§±À$’³Î³à´Eadzë´E`„u[³àw]„‘_´}a_`„]„‘]„v_J´´˜_€´À$s4´'´'´D´(x`„t´+_`„J´7}´;´7À$„ƒ´<À$×a_`„“³à´Eaȳà´E`„u[³àw]„‘_aa_`„]„‘]„v_J³à4³à³à´E´}a_`„]„‘]„v_J³à³à’_€³àÀ%3³àÀ%u”¶¶/¶’aɶ9¶’`„u[¶/w]„‘_¶S}a_`„]„‘]„v_J¶b¶bš_€¶bÀ%Ü4¶t¶t¶‘¶ux`„t¶x_`„J¶„}¶ˆ¶„À%탶‰À&@a_`„•¶/¶’aʶ/¶’`„u[¶/w]„‘_aa_`„]„‘]„v_J¶/4¶/¶/¶’¶S}a_`„]„‘]„v_J¶/¶/”_€¶/À&œ¶/À&Þ–¸­¹(a˸­¹(`„u[¸­w]„‘_aa__`„]„‘]„v_J¸­4¸­¸­¹(¸Û}a__`„]„‘]„v_J¸­¸­—_€¸­À'D¸­À'Š—¸›¸­¹(a̸¹¹(`„u[¸­w]„‘_¸Û}a__`„]„‘]„v_J¸ê¸êœ_€¸êÀ'õ4¸þ¸þ¹'¸ÿx`„t¹Í_¹ Î_`„J¹}¹¹À(ƒ¹À(]„¹ À(ia__`„˜»H»Z½aÏ»l½`„u[»Zw]„‘_»˜}a`„t_`„]„‘]„v_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„‘_€À(ÒN}a`„t_`„À(ãOš[»l½›]…*[œ[[`„>>»¤½N»®»·€…]„Å_v»¾…»¹À)_€…]„Å_„ÇI»Ì!x»Ú»ÑÀ)Õ €Œa`„„Î>»æ»úJ»î*?N¼¼ €‘`„t”N¼¼Ð]„v_¼…4_v¼)¼ À)Õ V_„ÐC¼7x¼G¼>À)Õ €Œa`„„Î>¼S¼îN¼_¼g_v¼r¼iÀ)Õ V_„ÐI¼}¼‰†¼…À)v5¼¼Š`„t¼ŠÀ*/ 5¼¼`„t¼À*/ x¼¼ŠÀ*Ï”a`„~`„t„…¼ŠÀ*ϼ“À*ša`„t_`„>¼¼Î>=wÀ)¦ž„s¼­À*> …-M¼§)=¼¼À*> ¼Ä…_“?=x¼Ü¼ÖÀ*> €Ÿ¼àÀ*ša_\…>=wÀ)¦ž„s¼úÀ*> …-M¼ô)J½*J‡À)“J…0]„v_‚À)™»Z½aÑ»Z½`„u[»Zw]„‘_aa`„t_`„]„‘]„v_J»Z4»Z»Z½»˜}a`„t_`„]„‘]„v_J»Z»Z˜_€»ZÀ,»ZÀ,`š¿D¿VÀ@ŽaÒ¿gÀ@Ž`„u[¿Vw]„‘_¿“}a`„t_`„]„‘]„v_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„‘_€À,ÏN}a`„t_`„À,àOš[¿gÀ@Ž›]…*[œ[[`„>>¿ŸÀ@ŽN¿©¿¯€‘`„t“N¿ÁÐ]„v_>N¿à€˜]„Å_v¿à…¿àÀ-\€…]„Å_„ÇEx¿àÀ-û €Œa`„„Î>N¿Õ_v¿æÀ-û V_„Ð>¿æÀ@f=x¿ý5¿õ¿ï]„v_¿ïÀ-å #¿õ¿ïÀ.|¿ïÀ-å ¿ù…_“¿ïÀ.|]„v_]„v_€ŸÀ@À.La_\…IÀ@}À@†À@À-s5À@À@`„tÀ@À-Ö 5À@À@`„tÀ@À-Ö xÀ@À@À/ ”a`„~`„t„…À@À/ À@#À.La`„t_`„>À@-À@`>=wÀ-¥ž„sÀ@=À-å ]„v_…-MÀ@7)=À@LÀ-å +?IÀ@l!À@vÀ@pÀ-å >=wÀ-¥ž„sÀ@…À-å ]„v_…-MÀ@)?JÀ@Ž*J‡À-J…0]„v_‚À- ›¿VÀ@ŽaÓ¿VÀ@Ž`„u[¿Vw]„‘_aa`„t_`„]„‘]„v_J¿V4¿V¿VÀ@Ž¿“}a`„t_`„]„‘]„v_J¿V¿Vš_€¿VÀ0p¿VÀ0¸œÀBÐÀBâÀDÊaÔÀBõÀDÊ`„u[ÀBâw]„‘_ÀC)}a`„t__`„]„‘]„v_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„‘_€À1-N}a`„t__`„À1@Oš[ÀBõÀDÊ›]…*[œ[[`„>>ÀC5ÀDÊNÀC?ÀCH€…]„Å_vÀCO…ÀCJÀ1€…]„Å_„ÇIÀC]!xÀCkÀCbÀ2D €Œa`„„ÎJÀCw*?NÀC‡ÀCÕ_vÀC›ÀC’À2D V_„ÐNÀC¬ÀC²Ð]„v_ÀC·…4_ÀC¸À2¨ NÀCËÀCÑ€‘`„t”CÀCÚxÀCêÀCáÀ2D €Œa`„„Î>ÀCöÀDµNÀDÀD _vÀDÀD À2D V_„ÐIÀD$}ÀD,†ÀD(À1Ù5ÀD2ÀD-`„tÀD-À35ÀD2ÀD2`„tÀD2À3xÀD2ÀD-À3”a`„~`„t„…ÀD-À3ÀD6À2¨ ÀD@À3Ha`„t__`„>ÀDJÀD{>=wÀ2ž„sÀDZÀ2Ó …-MÀDT)=ÀDiÀ2Ó ÀDq…_“?=xÀD‰ÀDƒÀ2Ó €ŸÀDÀ3Ha_\…=ÀDÀ2¨ ÀD¨À3H>=wÀ2ž„sÀDÁÀ2Ó …-MÀD»)JÀDÊ*J‡À1úJ…0]„v_‚À1sÀBâÀDÊaÖÀBâÀDÊ`„u[ÀBâw]„‘_aa`„t__`„]„‘]„v_JÀBâ4ÀBâÀBâÀDÊÀC)}a`„t__`„]„‘]„v_JÀBâÀBâœ_€ÀBâÀ5/ÀBâÀ5ƒžÀEµÀEºÀF8a×ÀE¾ÀF8`„u[ÀEºw]„‘_ÀEÐ}a_`„`„>ÀEÖÀF8>NÀEð€˜]„Å_vÀEð€ÀEðÀ6€…]„Å_„ÇExÀEð‚À6C€Œa`„„Î>NÀEå_vÀEö‚À6CV_„Ð>ÀEöÀF#IÀEþ}ÀFÀFÀ6ƒÀFÀ6ša_`„JÀF*?JÀF))ŸÀEºÀF8aØÀEºÀF8`„u[ÀEºw]„‘_aa_`„`„JÀEº4ÀEºÀEºÀF8ÀEÐ}a_`„`„JÀEºÀEºž_€ÀEºÀ7,ÀEºÀ7n ÀGÔÀGàÀHIaÙÀGìÀHI`„u`„uÀGàw]„‘_]„‘_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„‘_€À7âOš[ÀGìÀHI›]…*[œ[[`„>>ÀGõÀHI>NÀH€˜]„Å_vÀH„ÀHÀ8V€…]„Å_„ÇExÀHÀ8¼ €Œa`„„Î>NÀH_vÀHÀ8¼ V_„Ð>ÀHÀHEIÀH!ÀH)ÀH!À9 >=w†À8…ž„sÀH8À9 _…-MÀH2)?JÀHI*J…À8nJ…0_À8¡ÀGàÀHIaÚÀGàÀHI`„u`„uÀGàw]„‘_a]„‘_JÀGà4ÀGàÀGàÀHI]„‘_JÀGàÀGà _€ÀGàÀ9Ø¢ÀI ÀIÀIaÛÀIÀIÀIw]„‘`„~`„~>ÀIÀINÀI#ÀI*€Ä`„~“>NÀIE€˜]„Å`„~vÀIE€ÀIEÀ:d€…]„Å`„~„ÇExÀIE‚À: €Œa`„„Î>NÀI< `„~vÀIK‚À: V`„~„Ð>ÀIKÀIh=‰ÀISÀ:‰xÀIZÀISÀ:‰ƒÀI]À:÷a`„~`„~„…JÀInÀIuÀ:‰£ÀJWÀJbÀK?aÜÀJjÀK?ÀJbw]„‘`„~`…>ÀJjÀK?NÀJtÀJ{€Ä`…(NÀJŠÀJ€û`„t“>NÀJ«€˜]„Å`„~vÀJ«€ÀJ«À;€…]„Å`„~„ÇExÀJ«ƒÀ;䀌a`„„Î>NÀJ¢ `„~vÀJ±ƒÀ;äV`„~„Ð>ÀJ±ÀJó=ŠÀJ¹À;ÍxÀJ¿‚ÀJ¹À;Í”a`„~`„t„…=‰ÀJËÀ;²xÀJÒÀJËÀ;²xÀJæxÀJÜ„ÀJÖÀ<;ÀJÞÀ;²a`„~`…„‚Ý‚ÀJèÀ;Ía`„~`……6a`„~`……7IÀJùÀK‚ÀJýÀ;Í“a`„u`„„ˆ=0ÀK ÀK„ÿ'Þ?JÀK.ÀK5À;²¤ÀLFÀLNÀL¸aßÀLRÀL¸ÀLNw]„‘`„t`„t>ÀLRÀL¸NÀL\ÀLc€Ä`„t“>NÀL~€˜]„Å`„tvÀL~€ÀL~À=}€…]„Å`„t„ÇExÀL~‚À=¹€Œa`„„Î>NÀLu `„tvÀL„‚À=¹V`„t„Ð>ÀL„ÀL¡=‰ÀLŒÀ=¢xÀL“ÀLŒÀ=¢ƒÀL–À>a`„~`„t„…JÀL§ÀL®À=¢¥ÀNoÀNzÀPCaàÀN‚ÀPCÀNzw]„‘`„t`…>ÀN‚ÀPCNÀNŒÀN”j`„t“NÀN¡ÀN«á`„t“NÀN¸ÀN¾€û`„t“>NÀNÙ€˜]„Å`„tvÀNÙ€ÀNÙÀ>¦€…]„Å`„t„ÇExÀNÙ„À?€Œa`„„Î>NÀNÐ `„tvÀNß„À?V`„t„Ð>ÀNßÀOâ=‹ÀOXÀ>ñxÀO^ƒÀOXÀ>ñ”a`„~`„t„…NÀOnÀOtâ`„txÀO†xÀO|…ÀOvÀ?_ÀO~À>Ëa`„~`„t„‚‚ÀOˆÀ>Þa`„~`„t„…=‰ÀO™À>ËxÀO¡ÀO™À>ËxÀOª†ÀO¤À?¹ãƒÀO­À>ña`„~`„t…8a`„~`„t„…=ŠÀOºÀ>ÞxÀŎÀOÆÀ?¹áƒÀOÖÀ>ña`„~`„t…9IÀOèÀOòƒÀOìÀ>ñ“a`„u`„„ˆ=0ÀOøÀOþ„ÿ'Þ?JÀPxÀP,ÀP$À>ËxÀP8‚ÀP.À>Þ݃ÀP:À>ña`„~`……:a`„~`…„…¦ÀQJÀQUÀQÁaäÀQYÀQÁÀQUw]„‘`…`…>ÀQYÀQÁNÀQcÀQj€Ä`…(>NÀQ‡€˜]„Å`…vÀQ‡€ÀQ‡ÀA]€…]„Å`…„ÇExÀQ‡‚ÀA¡€Œa`„„Î>NÀQ~ `…vÀQ‚ÀA¡V`…„Ð>ÀQÀQª=‰ÀQ•ÀA‚xÀQœÀQ•ÀA‚ƒÀQŸÀAøa`„~`……7JÀQ°ÀQ·ÀA‚§ÀS`ÀSpÀSÂaåÀSzÀSÂ`„u[ÀSpw]„‘]„‘_]„‘_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„‘]„‘_€ÀB—Oš[ÀSzÀS›]…*[œ[[`„>>ÀS€ÀSÂ>NÀS›€˜]„Å]„‘_vÀS›„ÀS›ÀC€…]„Å]„‘_„ÇExÀS›ÀC{ €Œa`„„Î>NÀS"]„‘_vÀS¡ÀC{ V]„‘_„Ð>ÀS¡ÀS¾>=w†ÀCD§„sÀS°ÀCÞ …1MÀS©)JÀSÂ*J…ÀC-J…0_ÀBÁ¨ÀUSÀUZÀV aæÀUdÀV ]… _]… [ÀUZw]„‘__>ÀUdÀV NÀUnÀUw€…]„Å_vÀU~€ÀUyÀDš€…]„Å_„ÇIÀUŒxÀU™ÀUÀD¿€Œa`„„Î>ÀU¥ÀV‹NÀU±ÀU· _vÀUÂÀU¹ÀD¿V_„ÐCÀUÑxÀUáÀUØÀD¿€Œa`„„Î>ÀUíÀVqNÀUûÀV€€_vÀVÀVÀD¿V_„ÐIÀV xÀV>xÀV*‚ÀV$ÀE"ŠƒÀV4ÀEya_`„t…)$“a`„~`„„>ÀVCÀVi=ŠÀVOÀE"ƒÀVWÀEy?JÀVy‚ÀV€ÀE"?JÀV‘+©ÀVúÀWÀXSaçÀWÀXS]… _]… [ÀWw]„‘__>ÀWÀXSNÀWÀW€…]„Å_vÀW€ÀWÀF\€…]„Å_„ÇIÀW,xÀW9ÀW0ÀF€Œa`„„Î>ÀWEÀX+NÀWQÀWW _vÀWbÀWYÀFV_„ÐCÀWqxÀWÀWxÀF€Œa`„„Î>ÀWÀXNÀW›ÀW¤€€_vÀW¯ÀW¦ÀFV_„ÐIÀWÀxÀWÞxÀWÊ‚ÀWÄÀF䊃ÀWÔÀG;a_`„t…)$“a`„~`„„>ÀWãÀX =ŠÀWïÀFäƒÀW÷ÀG;?JÀX‚ÀX ÀFä?=0ÀX1ÀX7„ÿ'€ÖªÀX¥ÀX¬ÀYòaèÀX¶ÀYò]… _]… [ÀX¬w]„‘__>ÀX¶ÀYòNÀXÀÀXÉ€…]„Å_vÀXЀÀXËÀH+€…]„Å_„ÇIÀXÞxÀXëÀXâÀHP€Œa`„„Î>ÀX÷ÀYÝNÀYÀY _vÀYÀY ÀHPV_„ÐCÀY#xÀY3ÀY*ÀHP€Œa`„„Î>ÀY?ÀYÃNÀYMÀYV€€_vÀYaÀYXÀHPV_„ÐIÀYrxÀYxÀY|‚ÀYvÀH³ŠƒÀY†ÀI a_`„t…)“a`„~`„„>ÀY•ÀY»=ŠÀY¡ÀH³ƒÀY©ÀI ?JÀYË‚ÀYÒÀH³?JÀYã+«ÀZLÀZRÀ[¥aéÀZVÀ[¥]… _]… [ÀZRw]„‘__>ÀZVÀ[¥NÀZ`ÀZi€…]„Å_vÀZp€ÀZkÀI퀅]„Å_„ÇIÀZ~xÀZ‹ÀZ‚ÀJ€Œa`„„Î>ÀZ—À[}NÀZ£ÀZ© _vÀZ´ÀZ«ÀJV_„ÐCÀZÃxÀZÓÀZÊÀJ€Œa`„„Î>ÀZßÀ[cNÀZíÀZö€€_vÀ[ÀZøÀJV_„ÐIÀ[xÀ[0xÀ[‚À[ÀJuŠƒÀ[&ÀJÌa_`„t…)“a`„~`„„>À[5À[[=ŠÀ[AÀJuƒÀ[IÀJÌ?JÀ[k‚À[rÀJu?=0À[ƒÀ[‰„ÿ'€Ö¬À\hÀ\pÀ\¬aêÀ\vÀ\¬]… _]… [À\pw]„‘_À\‡ ^__W…"_`„tj`„x]„v_JÀ\”5À\”À\”]„v_RNÀ\”]„v_À\”…&_€À\˜ÀK¼‚À\”ÀL(R=xÀ\Ÿ‚À\”ÀLÀ\¤ÀKÏ^a__`„t\…'‚À\”ÀL­À\pÀ\¬aëÀ\pÀ\¬]… _]… [À\pw]„‘_^^__W…"_`„t]„v_JÀ\p4À\pÀ\pÀ\¬À\‡ ^__W…"_`„tj`„x]„v_JÀ\pÀ\p¬_€À\pÀL×À\pÀM5®À]nÀ]sÀ_,aìÀ]{À_,]… _]… [À]sw]„‘_À]Œ ^__W…"_`„tj`„x`„>À]–À_,IÀ]œ!À]¨À] ÀMá>À]±À]ïJÀ]¹À]Øe_€À]ÒÀMÎÀ]áÀMá^__W…"_`„t?NÀ]ùÀ^€…]„Å_vÀ^ €À^ÀM΀…]„Å_„ÇIÀ^!xÀ^%‚À^ÀN…€Œa`„„ÎJÀ^1)?NÀ^FÀ^V†_vÀ^a‚À^XÀN…V_„ÐCÀ^nxÀ^~‚À^uÀN…€Œa`„„Î>À^ŠÀ_NÀ^–À^ž_vÀ^©‚À^ ÀN…V_„ÐIÀ^¸xÀ^ßxÀ^̃À^¼ÀN犄À^ÖÀO?a_`„t…)$“a`„~`„„JÀ^ä*?=‹À^øÀNç„À_ ÀO?JÀ_)¯À]sÀ_,aíÀ]sÀ_,]… _]… [À]sw]„‘_^^__W…"_`„t`„JÀ]s4À]sÀ]sÀ_,À]Œ ^__W…"_`„tj`„x`„JÀ]sÀ]s®_€À]sÀP À]sÀPd°À_¾À_ÐÀ_óaîÀ_ØÀ_ó`„u[À_Ðw^__W…"_`„t^__W…"_`„tJÀ_Û4À_ÛÀ_ÛÀ_óÀ_Þ€§_À_〨_`„tJÀ_é}À_í€À_éÀPî‚À_îÀQ]À_ñÀQO^__W…"_`„t±À`”À`¢À`óaïÀ`®À`ó`„u[€Ì`„u[À`¢w^__W…"_`„tÀ`½a__^__W…"_`„tJÀ`Í4À`ÍÀ`ÍÀ`óÀ`Ѐ§_À`Õ€¨_`„tJÀ`Û}À`߀À`ÛÀQó}À`åÀ`àÀR‚À`æÀRha__}À`ïÀ`êÀRƒÀ`ðÀRva__^__W…"_`„t²À`¢À`óaðÀ`¢À`ó`„u[À`¢w^__W…"_`„t^€Ì`„u[a__^__W…"_`„tJÀ`¢4À`¢À`¢À`ó€Ì`„u[À`½a__^__W…"_`„tJÀ`¢À`¢±__€À`¢ÀS;À`¢ÀSóÀaåÀaóÀb•añÀa÷Àb•`„u[Àaów^__W…"_`„tÀbò^__W…"_`„t^__W…"_`„tJÀb4ÀbÀbÀb•Àb€§_Àb€¨_`„t>Àb Àb”NÀb.Àb5€Ä`„t}Àb;€Àb7ÀTQ‚Àb<ÀTÙƒÀb?ÀTç^__W…"_`„tIÀbKÀbV„ÀbOÀU“a`„u`„„ˆ=ŒÀb\ÀU}ÀboÀbeÀTx‚ÀbpÀTÙƒÀbsÀTç^__W…"_`„t?JÀb„Àb†ÀU´ÀaóÀb•aóÀaóÀb•`„u[Àaów^__W…"_`„ta^__W…"_`„t^__W…"_`„tJÀaó4ÀaóÀaóÀb•Àbò^__W…"_`„t^__W…"_`„tJÀaóÀaó³_€ÀaóÀVÀaóÀV…VóáäDçç¹èƒé!ê êÌëÔì¡í™îšð)ðáò’óUõ3ö*÷xø øþùúêûý÷þ»2ØPöÄI ÿ ¤ G !µºe}‘-¤öŠDàÍ›¡ :!#ƒ$N%%·&x' 'Ð(­+ö,¦0H0þ55×77°9©:>;g=W>€A7BhDaF#GòI´KƒL¡M•OÕP¿QºST"UØVóZ ½€Ú„o¾‚º‚À„ô`„u[]„Â]„v_Áƒ ƒ€€„½]„‘]„‘_ăƒƒaƒ'ƒaƒ>õ]„‘]„‘_]¾_?Á€ƒXÀXé ƒ„ă؃ú„}@€…jƒÙ`„u„„}]„Å]„v_>„„}N„ „€‹]„v]„Å_x„;x„$v„.€„½]„‘]„‘_Ái]„Å_4„(„(„9„)ö]„‘_]„Å_J„/v„1€„/ÀYµ€…]„Å_„Çaa]„‘_]„Å_]„‘]„Å_„§12*^2`„]„v]„Å_…J„X„_Ñ_€„oÀY_Y#ZZÅ„‚„ˆ†ë÷`„u[`„u]„Å]„v_È„фۀ€Š½]„v]„Å_ÉÍ„è„ð€ž½]„v_+Ñ„õ„õ…7……7…€‹]„v]„Å_]Å_?È€….ÀZé „õ„›Ï…<…M†•@€Œj…=`„u…U†•`„>…X†•I…^v…mv…b.€Š½]„v]„Å_Èt`„„ÉJ…v*?E…ˆ…‘…“*`„t“x…š€…˜À[‡v…§v…œ.€Š½]„v]„Å_È`„t„}a`„~`„„ˆ…¯À[‡x…°€…¯À[‡”a`„~`„t„…>…´†I…¼!x…Ïx…Ëv…Á.€Š½]„v]„Å_È€…ÌÀ[‡a`„t]„Å_„‡€Œa`„„Î>…Û†=w…å.ž½+ÍJ…þ*?=w†.ž½†.…;_v†Bv†7.€Š½]„v]„Å_È`„t„}4†J†J†f†K*`„t_J†Qv†_x†[v†Q.€Š½]„v]„Å_È€†\À\Ãa`„t]„Å_„‡V_„ÐÍJ††)Ê†š†²†é@Vj†›`„u†º†é]„v_J†½5†Æ†½]„v_v†½.ž½]„v_É#†½€†½À]b0†Ê†Ð„ÿ'€Ö†½À]b]„v_]„v_[#],]½]ÑX‡Zg]Î]Ñ Ò „o%„r:Tø|€Æ”ƒ…‚­Ú­àÀBù `„u[]„Ñ_‚®®™€úÒ`„t‚®Ø®Þ€û]„v_‚ ¯¯€`„t‚ ¯1¯7€j¯`„u`„t‚%¯u¯u°#¯~°#¯„û]„v_¯‘`„t¯œ`„t]‚_>¯ä°#=¯õ„{v°.`„t‚ ‚° À^áv°v°.û]„v_‚`„t„}‚€À^Å‚ À^Ö‚ x¯¶‚¯²À^᯸À^Öa`„~`„t„‚‚v¯Ý€¯ÖÀ^Å`„t„} ¯u„Ó‚'°U°U°™xÒ°`°™°fú`„t°yû]„v_°†`„t°’`„t]‚_?‚€À_µ‚À_Á‚ ‚À_Ò‚ ƒÀ_Ý °U„Ó‚ °À°È°Ý@°Ì°Ý`„tJ°Ïx°Õv°Ï.`„t‚ v°×.`„t‚ a`„~`„t„…‚ °â°ù±È@j°ã`„u°û±È±€‘`„t_>±±ÈI± !±v±v±.û]„v_‚`„t„}v±".úÒ`„t‚a`„u`„„ˆ>±0±g=0±8±>…>v±Z.û]„v_‚?=±x…?€±ˆÀ`¤.+v±›.`„t‚ J±¨x±µv±¯.û]„v_‚x±¼v±¶.`„t‚ €±¾À`¤a`„~`„t„…a`„t_„‡‚±Í±ç²Á@(j±Î`„u±ê²Á±ï€‘`„t±ø _\>±ÿ²ÁI²!²v²v² .û]„v_‚`„t„}v².úÒ`„t‚a`„u`„„ˆ>²(²_=0²0²6…>v²R.û]„v_‚?=²p…?€²€ÀaÆ.+v²“.`„t‚ =x²¦v² .û]„v_‚(x²­v²§.`„t‚ €²¯ÀaÆa`„~`„t„…²¸ÀaÒa`„t_\„‚²Æ²×³ý@.j²Ç`„u²ß³ý²ä`„t²ï`„t³ü]„‘_³ý`„tj³`„t\>³³ýI³%!³7v³0v³).û]„v_‚`„t„}v³:.úÒ`„t‚a`„u`„„ˆ>³H³=0³P³V…>v³r.û]„v_‚?=³„{€³ Àbõ³§Àcv³¬.`„t‚ =x³Àv³¹.û]„v_‚.x³Ï€³ÉÀbõ€³ÑÀbõa`„~`„t„…x³Þ€³ØÀbõ³àÀca`„~`„t„…‚³åÀc ƒ³ïÀc^`„t`„t]„‘_`„t\„’‚µÌµÙ¶~@þµÞ¶~µã`„tµð`„tj`„x]‚_>µö¶~=‰µüÀdж „{€¶Àd¶$ÀdŠv¶).`„t‚ J¶6¶G‚'_v¶I.úÒ`„t‚v¶W.û]„v_‚x¶e€¶_Àd€¶gÀda`„~`„t„…x¶r¶nÀdŠ`„t€¶tÀda`„~`„t„‚‚¶ƒ¶”·F@j¶„`„u¶›·F¶¥#`„Šj`„x\>¶®·FI¶´!¶Æv¶¿v¶¸.û]„v_‚`„t„}v¶É.úÒ`„t‚a`„u`„„ˆ>¶×·=0¶ß¶å…>v·.û]„v_‚?=· v·'.û]„v_‚v·/.`„t‚ v·6.`„t‚ €·;Àeƒ‚·K·\¸?@j·L`„u·`¸?·z a__`„tj`„x\>·„¸?I·Š!·œv·•v·Ž.û]„v_‚`„t„}v·Ÿ.úÒ`„t‚a`„u`„„ˆ>·­·ä=0·µ·»…>v·×.û]„v_‚?=#·ò€·êÀfkˆ·êÀfkj·öa`„u`„u`„t+a__`„t=¸ _v¸.û]„v_‚¸Àfka__`„tv¸%.`„t‚ x¸2v¸,.`„t‚ v¸4.`„t‚ a`„~`„t„…‚¸q¸v¹C@ÿ¸¹C¸„`„t¸`„t¸« a__`„t\>¸´¹CI¸º!¸Ìv¸Åv¸¾.û]„v_‚`„t„}v¸Ï.úÒ`„t‚a`„u`„„ˆ>¸Ý¹=0¸å¸ë…>v¹.û]„v_‚?=¹!î_v¹.û]„v_‚€¹+Àgǹ2ÀgÒ‚¹7ÀgÝ‚¹´¹¹ºÒ@‚¹ÅºÒ¹Ê`„t¹Õ`„t¹ã#`„Šj`„x\>¹ìºÒI¹ò!ºv¹ýv¹ö.û]„v_‚`„t„}vº.úÒ`„t‚a`„u`„„ˆ>ººL=0ºº#…>vº?.û]„v_‚?=º]„{€ºmÀhººtÀhÅvºy.`„t‚ =º† vº™.û]„v_‚xº¬vº¦.`„t‚ €º®Àhºa`„~`„t„…xºÀvºº.`„t‚ ºÂÀhÅa`„~`„t„…‚ºÇÀhЂºû»»˜@‚» »˜»`„t»`„t\>»!»˜=»2„{€»BÀj»IÀjv»N.`„t‚ =»bö_v»[.û]„v_‚x»zv»t.`„t‚ €»|Àja`„~`„t„…x»Žv»ˆ.`„t‚ »Àja`„~`„t„…‚#»Á»Ñ¼:@j»Â`„u»×¼:»Ü‚`„t\>»ç¼:=0»í»ó„Ö'‚‚¼?¼P¼¤@€Ÿj¼@`„u¼S¼¤¼V_\>¼_¼¤=0¼e¼k„Ö'‚‚¼©¼º½@‚j¼ª`„u¼À½¼Å€‘`„t¼Î_\>¼×½=0¼Ý¼ã„Ö'‚‚½!½2½¢@‚j½"`„u½;½¢½@€‘`„t½Sü]„‘_\>½]½¢=0½c½i„Ö'‚‚½§½¸¾@cj½¨`„u½¾¾½Ëü]„‘_\>½Õ¾=0½Û½á„Ö'‚‚¾¾0¾’@{j¾ `„u¾6¾’¾?`„u`„>¾H¾’=0¾N¾T„Ö'‚‚¾—¾¨¿@|j¾˜`„u¾³¿¾Í}a_`„\>¾Ó¿=0¾Ù¾ß„Ö'‚‚¿"¿3¿¨@€“j¿#`„u¿>¿¨¿X}a_`„\>¿^¿¨=0¿d¿j„Ö'‚‚¿­¿¾À@ @nj¿®`„u¿ÃÀ@ \>¿ÆÀ@ =0¿Ì¿Ò„Ö'‚‚À@À@À@{@‚ jÀ@`„uÀ@%À@{À@*€‘`„t_>À@1À@{=0À@7À@=„Ö'‚‚À@€À@ŽÀ@å@?jÀ@`„uÀ@˜À@å_>À@›À@å=0À@¡À@§„Ö'‚‚ À@êÀ@ûÀAe@‚ jÀ@ë`„uÀAÀAeÀA `„tÀA`„t\>ÀAÀAe=0ÀA!ÀA'„Ö'‚‚!ÀAjÀA{ÀAÿ@‚ jÀAk`„uÀA‡ÀAÿÀAŒ`„tÀA—`„tÀA¨‚ ]„‘_\>ÀAµÀAÿ=0ÀA»ÀAÁ„Ö'‚`)`a£bÒdce`fGg«hži÷jÑkkck¸llal¬lûmKmŽmñnFn²o1s‚(‚ ë `„u[]„v_*ÔՂւרÙÚÛ‚Ü‚Ý!Þ!ßJàJáKãKâLäLåMæMçNèNéOêOëPìPíÿîÿï‚ð‚ñ‚ò‚ó‚ô‚õ‚ö‚÷‚ø‚ùþúþû€àü€àýs‚)‚¦~ ]… _]… []„v_þÿ‚‚ÿ‚ÿ‚0Ôƒ+ƒ/ƒ­a‚ƒ;ƒ­ `„u[ƒ/w]„v_ƒ>_ƒZ a__`„t`„tJƒlƒl__€ƒŒÀq6jƒ’^`„u[___‚ƒœÀq4ƒ¥Àq)Õƒ/ƒ­a‚ƒ/ƒ­ `„u[ƒ/w]„v_a_a__`„t`„tJƒ/4ƒ/ƒ/ƒ­ƒ>_ƒZ a__`„t`„tJƒ/ƒ/Ô_€ƒ/ÀqÁƒ/Àr‚ƒ/Àr Ö………†pa‚…†p `„u[`„u[……w]„v_…«_…Êa__…ä a__`„t…ü`„tj†`„t† `„tj`„x`„tJ††__€†FÀr}‚†LÀr™ƒ†SÀr«†\ÀrŽ„†eÀrÁ…†lÀrÔ×……†pa‚……†p `„u[……w]„v_^`„u[_a__a__`„t`„t`„t`„tJ……4…………†p`„u[…«_…Êa__…ä a__`„t…ü`„tj`„t† `„tj`„x`„tJ…………Ö__€……ÀsO……Às¹‚……Àsă……ÀsÖ„……Àsì………Àsþ؈OˆS‰8a‚ˆz‰8 `„u[]… _]… [ˆSw]„v_ˆˆ_ˆ§a__ˆ³`„tjˆ»`„tˆÃ`„tj`„x`„tJˆÒˆÒ__€ˆýÀtŽ‚‰Àtª4‰ ‰ ‰"‰ €§_‰€¨_`„tJ‰x‰…‰ÀuІ‰ Àu#a_`„t…)‰$ÀtŸƒ‰-Àt¼„‰4ÀtÏÙˆS‰8a‚ˆS‰8 `„u[ˆSw]„v_^]… _]… [_a__`„t`„t`„tJˆS4ˆSˆS‰8]… _]… [ˆˆ_ˆ§a__ˆ³`„tj`„tˆÃ`„tj`„x`„tJˆSˆSØ__€ˆSÀu›ˆSÀv ‚ˆSÀvƒˆSÀv'„ˆSÀv9Ú‹7‹;‹µa‚‹E‹µ `„u[‹;w]„v_‹H_‹d a__`„t`„tJ‹v‹v __€‹”Àv¯6j‹š^`„u[___‚‹¤ÀvË‹­ÀvÀÛ‹;‹µa‚‹;‹µ `„u[‹;w]„v_a_a__`„t`„tJ‹;4‹;‹;‹µ‹H_‹d a__`„t`„tJ‹;‹;Ú_€‹;ÀwX‹;Àw˜‚‹;Àw£ÜŽLŽPa‚Žf `„u[`„u[ŽPw]„v_Žt_Ž‹a__Ž¥ a__`„t޽`„tjŽÅ`„tŽÍ`„tj`„x`„tJŽÜŽÜ __€ŽôÀx‚ŽúÀx0ƒÀxB Àx%„ÀxX…ÀxkÝŽPa‚ŽP `„u[ŽPw]„v_^`„u[_a__a__`„t`„t`„t`„tJŽP4ŽPŽP`„u[Žt_Ž‹a__Ž¥ a__`„t޽`„tj`„tŽÍ`„tj`„x`„tJŽPŽPÜ__€ŽPÀxæŽPÀyP‚ŽPÀy[ƒŽPÀym„ŽPÀyƒ…ŽPÀy•Þ‘Ƒʒ›a‚‘ï’› `„u[]… _]… [‘Êw]„v_‘ò_’ a__’`„tj’'`„t’/`„tj`„x`„tJ’>’> __€’gÀz%‚’mÀzA6j’t^]… _]… [__`„t_’‡Àz6ƒ’ÀzS„’—Àzfߑʒ›a‚‘Ê’› `„u[‘Êw]„v_^]… _]… [_a__`„t`„t`„tJ‘Ê4‘ʑʒ›]… _]… [‘ò_’ a__’`„tj`„t’/`„tj`„x`„tJ‘Ê‘ÊÞ__€‘ÊÀ{ ‘ÊÀ{z‚‘ÊÀ{…ƒ‘ÊÀ{—„‘ÊÀ{©à“'“,“Æa‚ “:“Æ `„u[“,w]„v_“_a`„t_\\>“g“ÆE“m“v“|€‘`„t“x“‡‚“À|Rv“‰€“‰À|`„t„}a`„~`„„Š“‘À|Rx“–‚“‘À|R”a`„~`„t„…>“š“Â=}“¨“¢À|0‚“©À|Rx“´€“°À|‚“µÀ|Ra`„t_„‡a`„t_\á“,“Æa‚!“,“Æ `„u[“,w]„v_aa`„t_\\J“,4“,“,“Æ“_a`„t_\\J“,“,à_€“,À}.“,À}dâ”k”ýa‚"”k”ý `„u[”kw]„v_aa_`„\J”k4”k”k”ý”‘a_`„\J”k”kã_€”kÀ}¿”kÀ}ôã”f”k”ýa‚#”w”ý `„u[”kw]„v_”‘a_`„\>”™”ýAE”Ÿ”¨”®€‘`„t“x”¹‚”³À~‚v”»€”»À~O`„t„}a`„~`„„Š”ÃÀ~‚x”È‚”ÃÀ~‚”a`„~`„t„…>”Ì”ùI”Ô!}”ß”ÙÀ~`x”䀔àÀ~O‚”åÀ~‚a`„t_„‡a_`„B”î?ä•Ù•Þ–‰a‚$•ñ–‰ `„u[•Þw]„v_–a`„t_`„\>––‰AE–$–-–3€‘`„t“x–>‚–8À–v–@€–@À_`„t„}a`„~`„„Š–HÀ–x–M‚–HÀ–”a`„~`„t„…>–Q–…I–Y!}–d–^Àp‚–eÀ–x–p€–lÀ_‚–qÀ–a`„t_„‡a`„t_`„B–z?å•Þ–‰a‚%•Þ–‰ `„u[•Þw]„v_aa`„t_`„\J•Þ4•Þ•Þ–‰–a`„t_`„\J•Þ•Þä_€•ÞÀ€}•ÞÀ€¶æ–ĖЗta‚&–Ý—t `„u[€Ì`„u[–Ðw]„v_–ÿ–a`„t__]„‘_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„v_€ÀN–a`„t__À0Oš[–Ý—t›]…*[œ[[`„>>——tE———#€‘`„t“x—.—(À‚" v—0…—0À¨`„t„}a`„~`„„—8À‚" x—=—8À‚" ”a`„~`„t„…>—A—p>=wÀðž„s}—V†—OÀ¿—WÀ‚" x—b…—^À¨—cÀ‚" a`„t_„‡a`„t__…-M—I)J—t*J‡ÀÝJ…0_‚ÀYç–Зta‚'–Зt `„u[–Ðw]„v_^€Ì`„u[a`„t__]„‘_J–Ð4–ЖЗt€Ì`„u[–ÿ–a`„t__]„‘_J–Ð–Ðæ__€–ÐÀƒH–ÐÀƒ¢è—´—À˜Ša‚(—̘Š `„u[—Àw]„v_—ñ}a`„t_`„]„‘_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„v_€À„ N}a`„t_`„À„Oš[—̘Š›]…*[œ[[`„>>—ý˜ŠE˜˜ ˜€‘`„t“x˜˜À… v˜…˜À„•`„t„}a`„~`„„˜'À… x˜,˜'À… ”a`„~`„t„…>˜0˜†N˜<˜D_x˜J…˜FÀ„•˜KÀ… a`„t_„‡I˜Y}˜a†˜]À„¬˜bÀ… ˜iÀ…ƒ a`„t_`„>=wÀ„Üž„s˜yÀ…ƒ …-M˜s)?J˜Š*J‡À„ÉJ…0_‚À„Fé—À˜Ša‚)—À˜Š `„u[—Àw]„v_aa`„t_`„]„‘_J—À4—À—À˜Š—ñ}a`„t_`„]„‘_J—À—Àè_€—ÀÀ†W—ÀÀ†˜ê˜Ï˜Û™©a‚*˜ê™© `„u[˜Ûw]„v_™}a`„t_`„]„‘_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„v_€À†þN}a`„t_`„À‡Oš[˜ê™©›]…*[œ[[`„>>™™©E™!™*™0€‘`„t“x™;™5À‡ÿ v™=…™=À‡†`„t„}a`„~`„„™EÀ‡ÿ x™J™EÀ‡ÿ ”a`„~`„t„…>™N™¥N™Z™b_x™h…™dÀ‡†™iÀ‡ÿ a`„t_„‡I™w!}™€†™|À‡™À‡ÿ ™ˆÀˆt a`„t_`„>=wÀ‡Íž„s™˜Àˆt …-M™’)?J™©*J‡À‡ºJ…0_‚À‡7ë˜Û™©a‚+˜Û™© `„u[˜Ûw]„v_aa`„t_`„]„‘_J˜Û4˜Û˜Û™©™}a`„t_`„]„‘_J˜Û˜Ûê_€˜ÛÀ‰I˜ÛÀ‰Šìšzš†›=a‚,š–›= `„u[€Ì`„u[š†w]„v_šÉ‚-a`„t_]„‘_]„‘_>O—aa]…*[[[`„a]…*[[[`„>N˜`„t“N™[Nw]„v_€À‰úN‚-a`„t_]„‘_ÀŠ Oš[š–›=›]…*[œ[[`„>>š×›=EšÝšæšì€‘`„t“xš÷šñÀ‹ všù…šùÀŠˆ`„t„}a`„~`„„›À‹ x››À‹ ”a`„~`„t„…>› ›9>=wÀŠÕ§„s}›†›ÀŠŸ› À‹ x›+…›'ÀŠˆ›,À‹ a`„t_„‡a`„t_]„‘_…1M›)J›=*J‡ÀŠÂJ…0_‚ÀŠ9횆›=a‚.š†›= `„u[š†w]„v_^€Ì`„u[a`„t_]„‘_]„‘_Jš†4š†š†›=€Ì`„u[šÉ‚-a`„t_]„‘_]„‘_Jš†š†ì__€š†ÀŒ2š†ÀŒ‘î›o›t›òa‚/›}›ò `„u[›tw]„v_›‚`„t›`„t›© a__`„t\>›²›ò=›¸__€›ÊÀ6j›Ð^`„u[___ƒ›ÚÀ(›ãÀ‚›êÀï›t›òa‚0›t›ò `„u[›tw]„v_a`„t`„ta__`„t\J›t4›t›t›ò›‚`„t›`„t›© a__`„t\J›t›tî_€›tÀ¼›tÀý‚›tÀŽƒ›tÀŽðœ‰œŽ;a‚1œž; `„u[`„u[œŽw]„v_œ¼a__œÚ a__`„tœî`„tjœö`„tœþ`„tj`„x\>;= __€ÀŽˆÀŽ™‚#ÀŽ«ƒ,ÀŽÁ„3ÀŽÔñœŽ;a‚2œŽ; `„u[œŽw]„v_^`„u[a__a__`„t`„t`„t\JœŽ4œŽœŽ;`„u[œ¼a__œÚ a__`„tœî`„tj`„tœþ`„tj`„x\JœŽœŽð__€œŽÀHœŽÀ«‚œŽÀ½ƒœŽÀÓ„œŽÀåòÖÛž€a‚3úž€ `„u[]… _]… [Ûw]„v_ža__ž#`„tjž+`„tž3`„tj`„x\>ž9ž€=ž?__€žQÀkžWÀ|6jž^^]… _]… [__`„t_‚žqÀŽƒžxÀ¡óÛž€a‚4Ûž€ `„u[Ûw]„v_^]… _]… [a__`„t`„t\JÛ4ÛÛž€]… _]… [ža__ž#`„tj`„tž3`„tj`„x\JÛÛò__€ÛÀ‘?ÛÀ‘§‚ÛÀ‘¹ƒÛÀ‘Ëôž¨ž­Ÿ?a‚5ž¹Ÿ? `„u[ž­w]„v_ž¾`„tžÉ`„tž×#`„Šj`„x\>žàŸ?=žñ„{ŸÀ’H‚ŸÀ’SvŸ €Ÿ À’7`„t„}=Ÿ €Ÿ"À’7Ÿ(À’H‚Ÿ/À’SƒŸ4À’^õž­Ÿ?a‚6ž­Ÿ? `„u[ž­w]„v_^`„t`„t`„Š\Jž­4ž­ž­Ÿ?ž¾`„tžÉ`„tž×#`„Šj`„x\Jž­ž­ô_€ž­À’îž­À“)‚ž­À“4ƒž­À“?öŸxŸ} ]a‚7Ÿ‰ ] `„u[Ÿ}w]„v_ŸŽ`„tŸ™`„t\>Ÿž ]=Ÿ¯„{Ÿ¿À“¸‚ŸÆÀ“ÃvŸË€ŸËÀ“§`„t„}CŸØxŸåŸßÀ“¸ŠŸéÀ“ÃxŸç‚ŸéÀ“Ôa`„~`„t„‚a`„~`„„>Ÿî YNŸúŸþ,_x € À“§ À“¸a`„t_„‡=x € À“§( À“¸x %€ !À“§‚ &À“Ãa`„t_„‡a`„t_\„=x 6€ 2À“§(‚ 7À“à>À”Sa`„t_\„=‰ IÀ“¸x O IÀ“¸”a`„~`„t„…÷Ÿ} ]a‚8Ÿ} ] `„u[Ÿ}w]„v_a`„t`„t\JŸ}4Ÿ}Ÿ} ]ŸŽ`„tŸ™`„t\JŸ}Ÿ}ö_€Ÿ}À•NŸ}À•€‚Ÿ}À•‹ø ‰ Ž¡ta‚9 ’¡t `„u[ Žw]„v_ —‚:`„t £‚;`„t\> «¡t= ¼…? ÌÀ•ö€ ÔÀ•å'‚:= ô…?‚¡À–€¡ À•å'‚;N¡%¡),_x¡/€¡+À•å¡0À•öa`„t_„‡=x¡A€¡=À•å(¡BÀ•öx¡P€¡LÀ•å‚¡QÀ–a`„t_„‡a`„t_\„=x¡b€¡^À•å(‚¡cÀ–ƒ¡mÀ–Oa`„t_\„ù Ž¡ta‚< Ž¡t `„u[ Žw]„v_a`„t`„t\J Ž4 Ž Ž¡t —‚:`„t £‚;`„t\J Ž Žø_€ ŽÀ—" ŽÀ—T‚ ŽÀ—`ú£C£P¤%a‚=£U¤% `„u[£Pw]„v_£Z`„t£g`„tj`„x]‚_>£m¤%=Š£sÀ—×£„„{£”À—Ì‚£›À—×v£ €£ À—»`„t„}N£±£¶‚>]„v_€£¸À—»I£Â%£Ëƒ£ÆÀ˜.]‚[J£Ù£åú_ƒ£àÀ˜.£ëÀ—Ì£òÀ—×`„t?J£ü¤‚%_€¤À—»¤À—̤À—×`„tû£P¤%a‚?£P¤% `„u[£Pw]„v_^`„t`„t]‚_J£P4£P£P¤%£Z`„t£g`„tj`„x]‚_J£P£Pú_€£PÀ˜Ø£PÀ™‚£PÀ™"ü¥=¥B¦7a‚@¥H¦7 `„u[¥Bw]„v_¥Qb]„v_¥e€ÿ]€Ê_j¥v]€ßb`„>¥Š¦7I¥!¥›v¥”€¥”À™‹`„t„}v¥¤¥žÀ™œ`„t„}a`„u`„„ˆJ¥¬*?E¥¾¥Ç¥É*`„t“x¥Ðƒ¥ÎÀšv¥Ò€¥ÒÀ™‹`„t„}a`„~`„„‹¥ÚÀšx¥Ûƒ¥ÚÀš”a`„~`„t„…>¥ß¦"I¥ç!x¥õ‚¥ìÀ™¬€àx¦€¥üÀ™‹ƒ¦Àša`„t_„‡x¦ ¦À™œƒ¦ Àša`„t_„‡a__`„€ÑJ¦*?J¦()ý¥B¦7a‚A¥B¦7 `„u[¥Bw]„v_^]„v_]€Ê_`„J¥B4¥B¥B¦7¥Qb]„v_¥e€ÿ]€Ê_j]€ßb`„J¥B¥Bü_€¥BÀ›+¥BÀ›o‚¥BÀ›þ¨)¨-¨Îa‚B¨9¨Î ]… _]… [¨-w]„v_¨<_¨Z a__`„tj`„x`„tJ¨m¨m__€¨˜À›ö6j¨ž^`„u[___5¨°¨¨a__`„t‚¨¨Àœ#¨¨ƒ¨¨Àœv6j¨³^]… _]… [__`„t_¨¨Àœva__`„ta__`„t¨ÆÀœÿ¨-¨Îa‚C¨-¨Î ]… _]… [¨-w]„v_^_a__`„t`„tJ¨-4¨-¨-¨Î¨<_¨Z a__`„tj`„x`„tJ¨-¨-þ_€¨-À-¨-Àr‚¨-À}‚ª·ª»«Xa‚DªÅ«X ]… _]… [ª»w]„v_ªÈ_ªæ a__`„tj`„x`„tJªùªù __€«"Àö6j«(^`„u[___5«:«2a__`„t‚«2Àž#«2ƒ«2Àžv6j«=^]… _]… [__`„t_«2Àžva__`„ta__`„t«PÀž‚ª»«Xa‚Eª»«X ]… _]… [ª»w]„v_^_a__`„t`„tJª»4ª»ª»«XªÈ_ªæ a__`„tj`„x`„tJª»ª»‚_€ª»ÀŸ-ª»ÀŸr‚ª»ÀŸ}‚«ü¬¬ßa‚F¬ ¬ß ]… _]… [¬w]„v_¬`„t¬`„t¬8 a__`„tj`„x\>¬B¬ß=¬S„{¬cÀ ‚¬jÀ v¬o€¬oÀŸö`„t„}=¬|__€¬¢ÀŸö6j¬¨^`„u[___5¬º¬²a__`„tƒ¬²À #¬²„¬²À ¬6j¬½^]… _]… [__`„t_¬²À ¬a__`„ta__`„t¬ÐÀ ‚¬×À ‚¬¬ßa‚G¬¬ß ]… _]… [¬w]„v_^`„t`„ta__`„t\J¬4¬¬¬ß¬`„t¬`„t¬8 a__`„tj`„x\J¬¬‚_€¬À¡j¬À¡°‚¬À¡»ƒ¬À¡Æ¢^,o–póqrOs+tVuwvŠw4wæxÂyízç{ú} }›~*:€Y€ðƒ$ƒè†3†Ù‰%‰ËŒŒÜ˜ŽZ$3‘’’Ê“‚•*•À–þ—–˜´™f››ÇœÿÇžÿŸÇ¡<¢0 ‚*€Ú„o€õƒ…‚+„I„X•'‚H `„u[`„u‚.„X€Ý‚*[1[‚5‚5†S†[†§Q†h†§ `„u[†~-a__`„tj`„x]‚+_=5€Þ[‚i5€ß_+‚/†Ó†Û†áB†á†á`„t‚0‡‡‡Bt‡‡`„‚1‡G‡P‡ZBu‡Z‡Z`„‚7‰‰‰0B€†‰&‰0‰)_`„‚2ЍЏŠÉB‚IŠÉŠÉ]„‘_‚8‹{‹€‹ŽB€Ÿ‹ƒ‹Ž‹†_\‚9‹»‹À‹ÜBc‹Æ‹Ü‹Ó"]„‘_\‚3Œ£Œ©Œ®BÍŒ®Œ®_‚:ëíúB‚Jøú_‚;„•B{Š•_`„‚<‘‘!‘,B€Í‘*‘,]„‘_‚=‘a‘f‘mBn‘k‘m\‚>’`’h’pB1’n’p]„v_‚?“m“u“†B‚K“„“†]„v_‚@•••%B€Ø•#•%]„ë_£F£³£Õ£÷¤¤H¤p¤›¤Ê¤í¥¥=¥e¥„¥¬¥Ô¥ü‚A™[™aºE‚L `„u[`„u]‚+_‚Dšš²€†‚M‚*`„tjš±`„t‚H››€-^__W…"_`„t‚E‚P›M›~€‚N‚*]„v_›V…@_j›f`„t‚F‚Q›úœ€€‚O‚*`„t“‚G‚Rœnœ„€€‚P‚*`„t“‚iž"ž"ž‡ž3ž‡žI-a__`„tj`„x]‚A_?‚H5žvžka__`„t€žkÀ§-#žkžkÀ§_jžya`„u`„u`„tžkÀ§_a__`„ta__`„t ž"„›‚UžŒžŽžÃ@‚Q‚*ž˜žÃž€‘`„t_Jž§5žµž­_xž­vž§.‚N‚*]„v_‚E€ž®À§ëa`„t_„‡#ž­ž­À¨5`„x+#‚À¨Q&ž¾‚À¨Q_À¨Q__ž­À¨_`„u_‚]žÈžÙŸ@€ŸjžÉ`„užÜŸžß_\>žèŸ=wžî.‚P‚*xŸvžî.‚P‚*`„t‚G”a`„~`„t„…‚R=xŸ.‚R‚*€Ÿ À¨¾a_\‚W‚^ŸŸ/ŸÝ@cjŸ`„uŸ5ŸÝŸB"]„‘_\>ŸLŸÝNŸVŸ_‚S`„t“>NŸ|€˜]„Å_vŸ|€Ÿ|À©M€…]„Å_„ÇExŸ|‚À©{€Œa`„„Î>NŸq_vŸ†‚À©{V_„Ð>Ÿ†Ÿµ=‰ŸŽÀ©h”=xŸ¢.‚R‚*ƒŸ§À©Êa_\‚W=wŸ».‚P‚*xŸÎvŸ».‚P‚*`„t‚GŸÑÀ©ha`„~`„t„…‚R‚_ŸâŸó A@njŸã`„uŸø A\>Ÿû A=w .‚P‚*x v .‚P‚*`„t‚G”a`„~`„t„…‚R=w .‚N‚*j $]„vb‚P=w 2.‚O‚*“‚Q‚` F W @€†j G`„u _  b_`„J mx }x m.‚T‚*€ uÀ«a_`„t‚XO“a`„~`„„—‚I¡¸¡Ô¢ @‚Ij¡¹`„u¡æ¢ ]„‘_J¡é¡é‚p_.‚J¢¢#¢}@Íj¢`„u¢)¢}_>¢)¢}I¢/¢;v¢3.‚O‚*`„t‚F“a`„u`„„ˆ=0¢A¢G„ÿ'€Ö?J¢ex¢l.‚Q‚*“a`„t_‚U‚K¢‚¢—¢®@tj¢ƒ`„u¢Ÿ¢®`„J¢¢¢ªv¢¢.‚O‚*`„t‚F“a`„u`„„ˆ‚L¢³¢È¢â@uj¢´`„u¢Ó¢â`„J¢Ö!¢Þv¢Ö.‚O‚*`„t‚F“a`„u`„„ˆ‚M¢ç¢û£ @j¢è`„u££ `„tJ£v£.‚O‚*`„t‚F‚a££"¤@{j£`„u£(¤£+_`„>£4¤N£>£D€‘`„tx£F.‚T‚*€£NÀ­a_`„t‚XI£\x£f£`À­8“a`„~`„„J£k*?=w£}.‚P‚*x£v£}.‚P‚*`„t‚G”a`„~`„t„…‚RN£›£ ¹_x£¢.‚U‚*a_‚YI£µx£¿£¹À­8v£Á.‚O‚*`„t‚Fa`„~`„„>£Ê¤lN£Ö£Û`„t5£è£è_‚£èÀ­È5£î£î_€£îÀ­}£çv£Ý.-^__W…"_`„t‚Hƒ£èÀ®5„£îÀ®J^__W…"_`„tI£þx¤ƒ¤À®&K“a`„~`„„–>¤ ¤5=x¤.‚V‚*‚¤!À­È¤'À­8a_`„t\‚Z>¤<¤f=x¤F.‚W‚*‚¤RÀ­È¤XÀ­8a_`„t\‚[?J¤r)‚b¥•¥­¦Y@€Íj¥–`„u¥¶¦Y]„‘_>¥¹¦Y=w¥¿.‚P‚*x¥Ñv¥¿.‚P‚*`„t‚G”a`„~`„t„…‚RN¥Ý¥ä€Ä]„v_v¥æ.‚N‚*]„v_‚EN¥ö¥ý`„tv¥ÿ.‚O‚*`„t‚F=w¦ .‚N‚*j¦]„vb‚P=w¦#.‚O‚*“‚QJ¦4x¦Ox¦B€¦;À¯¯‚X¦GÀ¯×a`„t]„‘_…Ak_a]„‘_…B‚c¦^¦l§X@‚Jj¦_`„u¦w§X_>¦z§XI¦€¦Œv¦„.‚O‚*`„t‚F“a`„u`„„ˆ=0¦’¦˜„ÿ'€Ö?=w¦¶.‚P‚*x¦Èv¦¶.‚P‚*`„t‚G”a`„~`„t„…‚RN¦Ô¦Û€Ä_x¦Ý.‚Q‚*“a`„t_‚UN¦ô¦ù¹_x¦û.‚U‚*a_‚YI§x§v§.‚O‚*`„t‚F$“a`„~`„„>§§A=x§'.‚W‚*§3À±/“a_`„t\‚[?J§G€§NÀ±‚d§]§q§¡@1j§^`„u§w§¡]„v_J§}5§}§}]„v_x§}.‚Y‚*a]„v_‚VR=x§‘€§}À±ïv§–.-^__W…"_`„t‚H^a__`„t\…'€§}À±ï‚e§¦§¹¨L@€Øj§§`„u§¾¨L]„ë_>§Á¨LN§Ë§Ï‚Z]…C_§Ñ…E_v§á.-^__W…"_`„t‚HE§ò§û§ý*`„t“x¨¨À²ùv¨.‚O‚*`„t‚Fa`„~`„„‰¨À²ùx¨¨À²ù”a`„~`„t„…>¨¨8=x¨ €¨À²°€Ÿx¨$.‚Q‚*¨/À²ùa`„t_‚Ua_`„…GJ¨>€¨EÀ²°‚f¨Q¨e¨Œ@‚Kj¨R`„u¨t¨Œ]„v_J¨zx¨z.‚Y‚*a]„v_‚V‚V¨‘¨™¨æ@‚Y‚*¨©¨æ]„v_J¨µRN¨µ]„v_¨µ…_“E¨¶¨¿¨Á*`„t“x¨È¨ÆÀ´Wv¨Ê.‚O‚*`„t‚Fa`„~`„„‰¨ÓÀ´Wx¨Ô¨ÓÀ´W”a`„~`„t„…=x¨Ø€¨µÀ´5€Ÿx¨Ø.‚Q‚*¨ãÀ´Wa`„t_‚Ua_\…€¨µÀ´5‚g©c©v©±@€‚j©d`„u©~©±`„¾>©©±J©‡x©£x©•v©Ž.‚N‚*]„v_‚E‚Xv©š.‚O‚*`„t‚Fa`„t]„‘_…A€‚a`„¾…H‚Wªªªy@‚R‚*ªªyª_\>ª'ªyIª-ª9vª1.‚O‚*`„t‚FvªCvª<.‚N‚*]„v_‚E`„t„}a`„u`„„ˆ=xªK.‚[‚*a\‚\?=xªX.‚V‚*€ªbÀµ¯5ªrªk`„tvªk.‚O‚*`„t‚F5ªkªk`„twªk.‚O‚*xªrªkÀ¶8”a`„~`„t„…‚QªkÀ¶8a_`„t\‚Z‚X«I«M±#@‚T‚*«T±#«W_`„t>«_±#I«e«qv«i.‚O‚*`„t‚F“a`„u`„„ˆJ«wx«~” a`„t„‰?N¬°¬¹y`„t”D­A>­‚°ÇN­Ž­”€‘`„tx­Ÿ­–À·”a`„~`„t„‚N­®­¶_x­¸.‚Q‚*‚­ÃÀ·4a`„t_‚UN­Õ­Ú`„t5­ç­ç_ƒ­çÀ·b5­ð­ð_€­ðÀ¶Â}­æv­Ü.-^__W…"_`„t‚H„­çÀ·¡…­ðÀ·¶^__W…"_`„tI­ÿx®„®À·’K“a`„~`„„–>®¯OI®"®!„®À·’“a`„u`„„ˆ®1ƒ®)À·b€®4À¶Âa`„u`„„¯J®<‚®CÀ·4?N®µ®Ç‚\`„tx®Ò®ÉÀ·•a`„~`„t… I®ßx®õ…®ãÀ¸”Kv®ø.‚O‚*`„t‚Fa`„~`„„–>¯¯G=‰¯ À·…¯À¸”B¯5??D¯—>¯š°yC¯¤v¯´¯«À·‚]`„…I>¯»°=‰°À·x°°À·”a`„t`„t„„=‰°dÀ·x°m°dÀ·”a`„~`„t„…x°‹°‚À·$v°.‚O‚*`„t‚Fa`„~`„„!°Ù°ÐÀ·”a`„u`„„ˆJ±x±” a`„t„‰‚Y±(±*±Ë@‚U‚*±5±Ë_>±8±ËN±B±L‚`„tx±Vv±N.‚O‚*`„t‚F”a`„~`„t„‚N±c±h¹_x±j.‚Q‚*€±uÀºa`„t_‚U=x±‹v±….‚N‚*]„v_‚E(€±ŒÀº+a`„t_\„=w±£.‚O‚*€±­Àº‚QJ±¼±ÃÀºJ‚Z²™²ž³¾@‚V‚*²§³¾²ª_²·€‘`„t\>²¾³¾AC²Äx²Ñ²ËÀºù$“a`„~`„„>²Ö³N²â²î‚^`„tx²üx²÷²ñÀºù”a`„~`„t„‚ã•a`„~`„t…8N³ ³‚__x³.‚Q‚*‚³ À»:a`„t_‚UI³4x³T5³C³C_€³CÀºî5³L³L_ƒ³LÀ»‚}³Bv³8.-^__W…"_`„t‚H„³CÀ»½…³LÀ»Ò^__W…"_`„t$“a`„~`„„B³Y?=x³lv³f.‚N‚*]„v_‚E(³mÀºùƒ³vÀ»‚a`„t_\„=‰³„Àºù‚³ŒÀ»:=x³©v³£.‚N‚*]„v_‚E(³ªÀºù€³³Àºîa`„t_\„‚[´´¢¸Ü@‚W‚*´­¸Ü´°_´½€‘`„t\>´Ä¸ÜN´Î´Þ‚``„tx´êx´æ´àÀ½•a`„~`„t… •a`„~`„t„…C´óxµ ‚´úÀ½vµ .‚O‚*`„t‚Fa`„~`„„>µ·« Nµ!µ0‚a`„txµB‚µ2À½”a`„~`„t„‚NµQµ[‚b_xµ].‚Q‚*ƒµhÀ½Ÿa`„t_‚UNµƒµŽ‚c_xµ.‚Q‚*‚µ›À½a`„t_‚UNµ·µ¼`„t5µÉµÉ_„µÉÀ½Í5µÔµÔ_…µÔÀ½þ}µÈvµ¾.-^__W…"_`„t‚H†µÉÀ¾>‡µÔÀ¾S^__W…"_`„tNµë‚d`„tN¶‚e_I¶x¶†¶À¾/“a`„~`„„>¶ ¶n=¶*À¾Ì„¶5À½Í=¶HÀ¾¿ƒ¶XÀ½Ÿ>¶u¶Å=¶À¾Ì…¶ŠÀ½þ=¶žÀ¾¿‚¶®À½=޶ÍÀ¾/5¶ß¶ß_€¶ßÀ¼ý5¶è¶è_¶èÀ¾Ì}¶Þv¶Ô.-^__W…"_`„t‚H¶ßÀ¿P ¶èÀ¿e ^__W…"_`„tI¶ùx·†¶ýÀ¾/K“a`„~`„„–>··A=x·v·.‚N‚*]„v_‚E(·À½€·"À¼ýa`„t_\„J·3?=x·Ov·I.‚N‚*]„v_‚E(·PÀ½·YÀ¾Ìa`„t_\„=‰·iÀ½‡·qÀ¾¿=Š·†À½x·¢x·ž·˜À½•a`„~`„t… •a`„~`„t„…N·µ·Ä‚a`„tx·Ö‚·ÆÀ½”a`„~`„t„‚I·ßx·òƒ·ãÀÀÒv·ô.‚O‚*`„t‚Fa`„~`„„>·ý¸»N¸ ¸‚f_x¸.‚Q‚*ƒ¸ÀÀÒa`„t_‚UN¸7¸<`„t5¸I¸I_€¸IÀ¼ý5¸R¸R_„¸RÀÁ8}¸Hv¸>.-^__W…"_`„t‚H…¸IÀÁx†¸RÀÁ^__W…"_`„tI¸`x¸i…¸dÀÁi$“a`„~`„„>¸n¸µ=x¸~v¸x.‚N‚*]„v_‚E(¸À½„¸ˆÀÁ8a`„t_\„=‰¸—À½ƒ¸ŸÀÀÒ??=x¸Çv¸Á.‚N‚*]„v_‚E(¸ÈÀ½€¸ÑÀ¼ýa`„t_\„‚\¹B¹GºC@‚[‚*¹LºC\>¹OºCN¹Y¹e‚g`„tx¹yx¹uv¹nv¹g.‚N‚*]„v_‚E`„t„}•a`„~`„t… ”a`„~`„t„…I¹‚x¹’€¹†ÀÂÕj¹”`„ta`„~`„„=ˆ¹§ÀÂÕj¹µ`„t?N¹Ð¹Ù‚h]„v_¹Û…@_€¹ëÀÂÕ=xº ºÀÃr.“vº.‚O‚*`„t‚Fvº!.‚N‚*]„v_‚E^`„t`„t]„‘_`„t\„’=wº..‚N‚*º7ÀÃr‚P§Í¨š©*ªSªÜ«S«•¬¬m¬¾¬ü¯B°f±¸²y³³´µµ‘¶¤¹çºÐ¼ß¬Ä‚jº…º‹»`‚i `„u[]„‘_‚mºÜºâ€‚N‚*]‚A_‚pºæºæ» »» »‚N]‚A_]‚j_?‚m€ÀÄÆ ºæ…K‚n»»-»^@€…j»`„u»6»^]„Å_J»9»9‚€_v»W.‚N‚*]‚A_‚mÄúÅP‚q»c»i¾p‚j `„u[`„u]„Å_‚t»½»Ã€‚N‚*]‚A_‚u»Ñ»ê€‚k‚*`„t‚v‚{»ñ»ù€ž‚*_+‚w‚|¼¼ €€‚l‚*`„tx¼ ” a`„t„‰‚€¼¼¼v¼+¼v¼1‚N]‚A_]‚q_?‚t€ÀÆ‚uv¼d€¼]ÀÆ‚P‚*`„t‚G ¼„›‚~¼{¼Œ¾@€Œj¼|`„u¼”¾`„>¼—¾I¼!¼»v¼¡.‚k‚*`„t‚uv¼Åv¼¾.‚N‚*]‚A_‚t‚P‚*`„t‚Ga`„u`„„ˆ>¼Ù½=0¼á¼ç…>v½.‚N‚*]‚A_‚t?N½½$‚m`„tx½-v½&.‚l‚*`„t‚w”a`„~`„t„…I½6"x½<“K€½?ÀÇa`„~`„„–x½V€½LÀÇv½_v½X.‚N‚*]‚A_‚t`„t‚Ma`„~`„„>½g½Å=w½o.ž‚*x½‡v½v½z.‚N‚*]‚A_‚t‚N‚*]„v_‚E€½ˆÀÇa`„t_„‡‚{=w½š.‚l‚*€½£ÀÇ‚|J½´)?=w½Ë.ž‚*+‚{=w½à.‚l‚*x½é• a`„t„‰‚|J½ñ*‚x¾¾¾n@Vj¾`„u¾ ¾n_J¾)#x¾0v¾).‚l‚*`„t‚w“a`„~`„„0¾6¾<„ÿ'€Ö5¾a¾X_v¾X.ž‚*_‚v#¾X€¾XÀȱ5`„x+#ÀÈÙ&¾iÀÈÙ_ÀÈÙ__¾XÀȱ_`„u__Æ^ÈGÉ'É;£ ¦EÄnÅ]É8É; ‚€Ú„o‚‚‚$‚* -‚n `„u[`„u]…L_‚Å ]‚‚_? „›=‚„¢®¢³£8@€Ÿ¢¶£8¢¹_\>¢Â£8=x£.(5£'£!`„tv£!.`„t„}5£!£!`„tw£!.x£'£!ÀÊ ”a`„~`„t„……N£!ÀÊ €£-ÀÉèa`„t_\„‚…£=£B¤@c£H¤£Uü]„‘_\>£_¤N£i£k*`„tv£r.`„t„}>N£€˜]„Å_v£€£ÀÊ“€…]„Å_„ÇEx£‚ÀÊÍ€Œa`„„Î>N£…_v£š‚ÀÊÍV_„Ð>£š¤ @"£µv£®.`„t„}£¸Àʯa`„u`„„ˆ0£¾£Ä…>.£©£æ=x£ï.€Ÿƒ£óÀËa_\…P=‰¤Àʯx¤¤Àʯ”a`„~`„t„…‚†©9©A©g@k©H©g€Ì`„u[]„v_J©N©S…Q__.‚‡ÀD‹ÀD’ÀDÑ@€‚ÀDšÀDÑ`„¾JÀD ÀD­…S.'‚o'‚p‚ˆ©k©mª @?©wª _>©zª I©€©‹v©„.`„t„}“a`„u`„„ˆ>©‘©Å=0©™©´…V?N©Í©Ô€Ä_x©Ú.x©âv©Û.`„t„}”a`„~`„t„‚a`„t_„‡=w©ì.x©òv©ì.`„t„}”a`„~`„t„‚…NJ©ú€ªÀ̬‚ºèîI@ÍôI_>ôIIúvþ.`„t„}“a`„u`„„ˆ=0 &…V?J7xB.“a`„t_„‡‚ÂNW¼@Í\¼_ _\>f¼Ilwvp.`„t„}“a`„u`„„ˆ=0}˜…V?=x­.(“€³ÀÍÆa`„t_\„‚»ÁÇ‘*@¹Ì‘*_>Ì‘*IÒÝvÖ.`„t„}“a`„u`„„ˆ=0ãþ…V?J‘x‘.x‘"v‘.`„t„}”a`„~`„t„‚a`„t_„‡‚Ñ/‘8‘¥@¹‘<‘¥‘? _\>‘F‘¥I‘L‘Wv‘P.`„t„}“a`„u`„„ˆ=0‘]‘x…V?=x‘.(x‘•v‘Ž.`„t„}”a`„~`„t„‚€‘œÀÎæa`„t_\„‚¼ÍÝþ@€…æþ]„Å_Jéé…Y_.‚‰ŽŽŽ(@‚qŽŽ(Ž€‘`„t_JŽxŽ!.€Ž"ÀÏÉa`„t_„‡‚ŠŽ-Ž9Ž‘@€ÒŽCŽ‘ŽPb]„‘_]„‘_JŽ`Ž`…\_.€Ž‹ÀЂ‹Ž–Ž›}@fŽ¢}ލa_\\>Ž»}NŽÅŽÌ`„tvŽÓ.`„t„}EŽßŽèŽê*`„t“xŽñ‚ŽïÀФŽóÀЇa`„~`„„ŠŽûÀФxŽü‚ŽûÀФ”a`„~`„t„…>y=}€ÀÐlx.‚ÀФa`„t_„‡a_\I!*#ÀЇv2.`„t„}a`„u`„„ˆ>:s=0DJ…>.?‚½‚©¿@tjƒ`…]±¿`„J´»v´.`„t„}“a`„u`„„ˆ‚¾ÄÍã@uØã`„JÛ!vÜ.t`„…_‚¿‘ª‘°’F@‚r‘·’F_>‘·’FI‘½‘Èv‘Á.`„t„}“a`„u`„„ˆ=0‘Αé…V?I‘úx’v‘þ.`„t„}$”a`„~`„„=0’ ’%…`?J’4x’?.“a`„t_„‡‚Œ’K’P“R@€†’X“R’a`„u`„>’j“RN’t’{`„tv’‚.`„t„}E’Ž’—’™*`„t“x’ ‚’žÀÒý’¢ÀÒàa`„~`„„Š’ªÀÒýx’«‚’ªÀÒý”a`„~`„t„…>’¯“<I’·’Ãx’¿.‚’ÀÀÒýa`„t_„‡€’ÆÀÒÇa`„u`„„¯J’Ï)?I’â!’í’æÀÒàv’õ.`„t„}a`„u`„„ˆ>’ý“6=0““ …>.?J“B*‚“W“\”\@€‡“a”\“g}a_`„`„>“x”\N“‚“‰`„tv“.`„t„}E“œ“¥“§*`„t“x“®‚“¬ÀÔ<“°ÀÔa`„~`„„Š“¸ÀÔ“½”GI“Å!}“΀“ÊÀÓÿx“Ó.‚“ÔÀÔ<a`„t_„‡a_`„J“Ù*?I“í!“ø“ñÀÔv”.`„t„}a`„u`„„ˆ>””A=0””…>.?J”M)‚Ž”a”f•c@r”i•c”o}a_`„`„>”€•cN”Š”‘`„tv”˜.`„t„}E”¤”­”¯*`„t“x”¶‚”´ÀÕ}”¸ÀÕ`a`„~`„„Š”ÀÀÕ}x”Á‚”ÀÀÕ}”a`„~`„t„…>”Å•MI”Í}”Õ€”ÑÀÕ@x”Ú.‚”ÛÀÕ}a`„t_„‡a_`„J”à)?I”ó!”þ”÷ÀÕ`v•.`„t„}a`„u`„„ˆ>••G=0••…>.?J•S*‚•h•j–ç@‚s•t–ç•z}a_`„•š€Õa_j`„x_>•£–çN•­•´`„tv•».`„t„}E•Ç•ЕÒ*`„t“x•Ùƒ•×ÀÖÔ‚•ÛÀÖ·a`„~`„„‹•ãÀÖÔx•䃕ãÀÖÔ”a`„~`„t„…>•è–ŽN•ò•ú_x–.ƒ–ÀÖÔa`„t_„‡I– }–€–ÀÖ„–À×7a_`„J–„–%À×7?I–4!–?‚–8ÀÖ·v–G.`„t„}a`„u`„„ˆ>–O–ˆ=0–Y–_…>.?I–”!–Ÿ–˜ÀÖ”J–¨}–µ–¯ÀÖ”a_a_?=0–½–Ø…V‚–ì–î˜o@‚t–÷˜o–ý}a_`„—€Õa_j`„x_>—&˜oN—0—7`„tv—>.`„t„}E—J—S—U*`„tx—^‚—WÀØb”a`„~`„t„‚x—eƒ—cÀØO“a`„~`„„—‹—kÀØx—lƒ—kÀØ”a`„~`„t„‚>—p˜N—z—‚_x—ˆ.ƒ—‰ÀØa`„t_„‡I—“}—›€——ÀØ,„—œÀØûa_`„J—¦„—­ÀØû?I—¼!—Ç‚—ÀÀØbv—Ï.`„t„}a`„u`„„ˆ>—ט=0—á—ç…>.?I˜!˜'˜ ÀØ?J˜0}˜=˜7ÀØ?a_a_?=0˜E˜`…V‚‘˜t˜všÇ@€Ô˜šÇ˜‡}a_`„˜§€Õa_j`„x_>˜°šÇN˜º˜Á`„tv˜È.`„t„}N˜Û ‚u_N˜ë˜ö‚v`„*E™™ ™*`„t“x™…™ÀÚ_‚™ÀÚ&a`„~`„„™ÀÚ_x™ …™ÀÚ_”a`„~`„t„…>™$šLN™.™6_x™<.…™=ÀÚ_a`„t_„‡I™G}™O€™KÀÙð†™PÀÚÂa_`„>™Z™êI™d„™hÀÚM>™t™®=0™€™›…`?=Œ™¸ÀÚM)=‹™ÓÀÚ@†™ÛÀÚÂ?I™ò!™ý‚™öÀÚ&vš.`„t„}a`„u`„„ˆ>š šF=0šš…>.?IšR„šVÀÚMJšbƒšiÀÚ@?Išt!ššxÀÚJšˆ}š•šÀÚa_a_?=0šš¸…V‚’šÌšÓ›x@‚wš×›xšà‚x`„¾jšì`„¾`„¾>šñ›xIš÷›všû.`„t„}“a`„u`„„ˆJ›'?N›$›+‚y`…a5›-›-`…a›-…cR=x›=›-ÀÜY‚z.€›LÀÛþ^]„‘[`„¾\…e›-ÀÜYJ›\x›j›cÀÜI€‚a`„¾…f‚“›}›‰›Ä@|›Ž›Ä›”}a_`„]„‘_J›¨›¨…i_.€›¿ÀÜã‚”›É›Õœ@€×›áœ`„u[]„‘_J›ç›ç…l_.‚•œœœM@iœœM`„u[œsa__]„‘_Jœ,œ,…o__.€œKÀÝ‚–œRœ^œ¨@‚-œgœ¨`„u[œtsa_]„‘_]„‘_Jœ‹œ‹…r__.€œ¦ÀÝá‚—œ­œ¯ž@‚{œµžœ¸©a____>œÝžNœçœî`„tvœõ.`„t„}I ÀÞb“a`„u`„„ˆ=0-…V?N@F _xL.“a`„t_„‡EU^`*`„t”xgƒeÀÞÐiÀÞba`„~`„„‹qÀÞÐxrƒqÀÞДa`„~`„t„…>vÿ=Š~ÀÞ¦}€†ÀÞ=‚ŽÀÞ¦x™.ƒšÀÞÐa`„t_„‡a___I¥!°©ÀÞbv¸.`„t„}a`„u`„„ˆ>Àù=0ÊÐ…>.?Jž‚ž ÀÞ¦‚˜žžŸ]@€ˆž#Ÿ]`„u[ž&­_ž6©a____>ž[Ÿ]Nžežk _€žmÀßíNžƒžŠ`„tvž‘.`„t„}Ežž¦ž¨*`„t“xž¯„ž­ÀàOƒž±Àà2a`„~`„„Œž¹ÀàOxžº„ž¹ÀàO”a`„~`„t„…>ž¾ŸG=ŠžÆÀà}žÕžÎÀßù‚žÖÀàxžá.„žâÀàOa`„t_„‡a___Iží!žøƒžñÀà2vŸ.`„t„}a`„u`„„ˆ>ŸŸA=0ŸŸ…>.?JŸM‚ŸTÀà‚™ŸbŸnŸ¦@‚|ŸrŸ¦Ÿw€û`„t]„‘_JŸŸ…u_.€ŸšÀác+‚šŸ«Ÿ· @‚}ŸÀ ŸÆ}a_`„]„‘_>Ÿ× JŸÝŸä…x_.€ŸÿÀ᱂›    o@‚X  o "€û`„t]„‘_J 2 2…u_.“ N…z`„t€ _Àâ '€û‚œ t € Ñ@‚~ ‰ Ñ }a_`„]„‘_>   ÑJ ¦ ­…}_.€ ÈÀâh‚ Ö Þ¢@1 ä¢ ë2`„j ö`„]„v_> ý¢I¡v¡ .t`„…_J¡¡…~_2€¡4ÀâÂ?N¡G¡MÍ_x¡S.“a`„t_„‡N¡`¡g€Ä]„v_¡i…_v¡}.`„t„}¡…Àã2€¡–ÀâÂE¡¥¡®¡°*`„t”x¡·ƒ¡µÀã{v¡¾.`„t„}a`„~`„„‹¡ÆÀã{x¡Çƒ¡ÆÀã{”a`„~`„t„…>¡Ë¡ì=x¡Ù‚¡ÓÀã;(ƒ¡ÚÀã{x¡ã.ƒ¡äÀã{a`„t_„‡a`„t_\„J¡ò‚¡ùÀã;‚ž¢¢¢”@€Ø¢¢”]„ë_>¢¢”N¢$¢+€Ä]„ë_…_E¢;¢D¢F*`„t“x¢M¢KÀä‡v¢O.`„t„}a`„~`„„‰¢WÀä‡x¢X¢WÀ䇔a`„~`„t„…>¢\¢}=x¢k€¢dÀäe€Ÿx¢s.¢tÀä‡a`„t_„‡a_`„„íJ¢ƒ€¢ŠÀäe‚Ÿ¤¤¤Ù@{¤ ¤Ù¤)`„u`„>¤2¤ÙE¤8¤A¤C*`„t“x¤J¤HÀårv¤Q.`„t„}a`„~`„„‰¤YÀårx¤Z¤YÀår”a`„~`„t„…>¤^¤ÃI¤f¤rx¤n.¤oÀåra`„t_„‡€¤uÀåVa`„u`„„¯>¤~¤½=x¤.‚„o¤—Àårx¤œ¤šÀår”a`„~`„t„…a`„t`„t\…J¤ª)?J¤É*‚¡¥Z¥_¦w@‚„o¥h¦w¥m`„t¥x`„t\>¥}¦wN¥‡¥Ž`„tv¥•.`„t„}@x¥ª“K€¥­Àæ‰a`„~`„„–¥¨¥²@x¥Æ€¥ÀÀ扥ÈÀæ”a`„~`„„¥À¥Ë@x¥Ý¥ÙÀæ”K‚¥àÀæªa`„~`„„–¥Ù¥æN¥ñ¥ö‚€`„tx¥ü¥øÀ攀¥þÀæ‰a`„~`„t„‚E¦ ¦¦*`„t¦Àæ”x¦„¦Àçy‚¦Àæªa`„~`„„Œ¦'Àçyx¦(„¦'Àçy”a`„~`„t„…>¦,¦R=x¦8.(x¦;„¦9Àçyƒ¦=ÀçBa`„~`„t„‚x¦I.„¦JÀçya`„t_„‡a`„t_\„=w¦].x¦m‚¦fÀ檃¦oÀçBa`„~`„t„‚…N‚¤¦|¦¦Á@|¦Œ¦Á¦’}a_`„\>¦£¦Á=x¦©.‚„o€¦±Àè*aa_`„`„\…‚‚¥¦Æ¦Ë§ @€“¦Ö§ ¦Ü}a_`„\>¦í§ =x¦ó.‚„o€¦ûÀèò)aa_`„`„\…‚‚¢§§© @‚„o§© §!}a_`„§7‚‚`„\>§G© N§U§^‚ƒ]„v_§c…_“N§o§v`„tv§}.`„t„}E§‰§’§”*`„t“x§›„§™ÀéÀƒ§Àé£a`„~`„„Œ§¥ÀéÀx§¦„§¥ÀéÀ”a`„~`„t„…>§ª¨}N§¶§¾_x§Ä.„§ÅÀéÀa`„t_„‡I§Ï§á}§×€§ÓÀéY…§ØÀê#a_`„§äÀéka`„u`„„¯>§ô¨=x¨‚§þÀé‚€Ÿ…¨ Àê#a_\…?I¨#!¨.ƒ¨'Àé£v¨6.`„t„}a`„u`„„ˆ>¨>¨w=0¨H¨N…>.?I¨ƒ!¨—v¨‚¨‡Àé‚`„t„}v¨Ÿ.`„t„}a`„u`„„ˆ>¨§©=x¨´..“v¨É‚¨ÀÀé‚`„t„}‚¨ÑÀé‚^`„t`„t]„‘_`„t\…ƒ=w¨ç.v¨ù‚¨ðÀé‚`„t„}…N?‚¦©©©4@n©©4\>©©4=w©&.“…N‚§ªªªn@ªªnª3 a__`„tj`„x\>ª=ªn=ªH…†_.5ª[ªSa__`„t€ªSÀëâ#ªSªSÀìjª^a[[`„tªSÀìa__`„ta__`„t‚¨ªêªï¬A@ªö¬A«#`„Šj`„x\>« ¬A=#«€«À쓈«Àì“«„Œ+`„ŠI«(«3«,Àì“`„Š=0«<'‚„?N«z«`„tv«ˆ.`„t„}C«”x«¢«›Àìí$”a`„~`„„>«§¬=N«³«·%`„tx«À«¹Àì“`„Š&«ÈÀìía`„t`„t„=‰«×Àìíx«Þ«×Àìí”a`„~`„t„‚N«î«ò,_x«ø.«ùÀìía`„t_„‡=x¬ .(¬ Àìíx¬.‚¬Àí0a`„t_„‡a`„t_\„=x¬,.(‚¬-Àí0ƒ¬4Àí‘a`„t_\„‚©¬F¬R¬@‚…¬W¬]„˜`„t_>¬Z¬J¬`¬g…‰_.‚ª¬„¬•¬¼@¬–¬¼¬Ÿb]„v_]„v_J¬©RN¬©]„v_¬©…&_.=x¬¶¬©Àîªc€¬¶Àî‡a]„‘_\…Ь©À«¬Á¬É­Õ@‚†¬Ð­Õ¬Õ`„t¬â`„tj`„x]„v_>¬è­ÕN¬ò¬ý‚‡`„tv­.`„t„}=#­­ÀÀï‚­ÀïD+`„tI­(­0­,Àï`„t=0­9'‚„?=­~„{€­ŽÀï­•Àï`„t‚­šÀïDJ­«­·…‹_x­¼.‚ˆ€­ÅÀï­ÌÀï`„ta`„t`„t]„‘_…Œ‚¬­Ú­æ®q@‚ˆ­î®q­ó`„t­þ`„t]„‘_>®®q=®„{€®$Àð"®+Àð-v®5.`„t„}J®B®I…u_.€®bÀð"®iÀð-‚­®v®{¯@‚ ®†¯®‹`„t®–`„t\>®›¯=®¬„{€®¼Àð«®ÃÀð¶v®Í.`„t„}I®Úx®â®ÞÀð¶$€®äÀð«a`„~`„„>®ë¯=x®ó.‚„o€®ýÀð«¯Àð¶a`„t`„t\…?‚®¯¯°g@‚‰¯%°g¯*`„t¯5`„t¯>‚Š_j`„x\>¯E°gN¯Ô¯Ú _5_‚¯ÜÀñ~#ƒÀñª5_ƒÀñª#„ÀñÆ&¯á„ÀñÆ_ÀñÆ__Àñª__=¯ö„{€°Àñh° Àñsv°.`„t„}E°$°-°/*`„t€°1Àñhx°:„°8Àò8°<Àñsa`„~`„„Œ°AÀò8x°B„°AÀò8”a`„~`„t„…>°F°c=x°R.(„°SÀò8ƒ°XÀñœa`„t_\„‚¯°l°q´1@.°y´1°~`„t°‰`„t°šü]„‘_°©ý`„tj°µ`„t\>°¹´1 =°Ê„{€°ÚÀòä°áÀòïv°ë.`„t„}N°ü±`„tx± ±Àò Àòäa`„~`„t„‚I±±!„±ÀóO“a`„u`„„ˆJ±'?=±>…#ƒ±OÀó 'ýN±u‚‹]„v_N±ˆ‚Œ`„tI±Æ%±Ó‚±ÊÀòú]„v_>±ß²=±çÀó·±óÀòú]„v_=޲ÀóɃ²Àó >²&²†=².Àó·x²Sx²C‚²:Àòú‚|ƒ²HÀó a`„t]„‘_…12*^2`„]„v_…=޲rÀóÉ“I²Œx²¤x²›†²ÀóÉ„²ÀóOa`„~`„t„…$v²°…²¦Àó·`„t„}a`„~`„„>²¸²é=0²À²Û…Ž?I²ïx²þ†²óÀóÉ€³Àòäa`„~`„„>³³ºE³Q³Z³\*`„tx³e„³^ÀóO”a`„~`„t„‚x³l‡³jÀõ"O“a`„~`„„—³rÀõ"x³s‡³rÀõ"”a`„~`„t„‚>³w³´=x³….(x³Œ€³†Àò䇳ŽÀõ"a`„~`„t„…x³œ…³“Àó·x³¨†³Àóɇ³ªÀõ"a`„~`„t„…a`„t_„‡a`„t_\„>³Á´-E³É³Ò³Ô*`„t“x³Û‡³ÙÀö-„³ÝÀóOa`„~`„„³åÀö-x³æ‡³åÀö-”a`„~`„t„…>³ê´'=x³ø.(x³ÿ€³ùÀò䇴Àö-a`„~`„t„…x´…´Àó·x´†´Àóɇ´Àö-a`„~`„t„…a`„t_„‡a`„t_\„‚°´6´;¹@‚ ´G¹´L`„t´W`„t´h‚ ]„‘_\>´u¹=´†„{€´–À÷1´À÷´Î´ý=x´Ö.c‚´ÝÀ÷Ga]„‘_\…J´ñ?Iµ!%µ‚µÀ÷G]…[>µ0µ`=е8À÷GxµR‚µFÀ÷G1^2`„]„v_…?Nµjµw‚`„txµ}µyÀ÷<€µÀ÷1a`„~`„t„‚NµŽµ›‚Ž`„tvµ©‚µÀ÷G`„t„ËIµµxµÆƒµ¹Àø/O„µÉÀøca`„~`„„—>µ×¶‘Nµãµí‚`„txµõ€µïÀ÷1„µ÷Àøca`„~`„t„…=x¶..€¶À÷1…¶ Àø³‚¶+À÷G^`„t`„t]„‘_`„t\…ƒI¶?x¶Pƒ¶CÀø/$„¶RÀøca`„~`„„>¶`¶‹=x¶j.‚„o…¶tÀø³¶À÷<a`„t`„t\…?I¶˜¶ ¶œÀ÷¶°·nN¶¼¶¾*`„t€¶ÀÀ÷1>N¶ß€˜]„Å_v¶ß‚¶ßÀ÷G€…]„Å_„ÇEx¶ß†ÀùË€Œa`„„Î>N¶Ô_v¶ì†ÀùËV_„Ð>¶ì·hI¶öx¶ü…¶úÀù³¶þÀ÷<a`„~`„„>··*=x·.(…·Àù³‡·Àúa`„t_\„>·1·S=x·=.€Ÿ‡·AÀúa_\…P=·]Àù³x·^…·]Àù³”a`„~`„t„…>·u¹ N··‡â`„tx·–„·‰Àøcƒ·˜Àø/a`„~`„t„‚N·°·º‚`„tv·Á.`„t„}N·Ó·Ý‚`„tx·å€·ßÀ÷1„·çÀøca`„~`„t„…E¸¸¸*`„tx¸'†¸Àû…¸)Àúéa`„~`„t„‚x¸2¸0Àûo†¸4Àûa`„~`„„¸AÀûox¸?¸AÀûo”a`„~`„t„…>¸D¸n=x¸N.€Ÿx¸V.#x¸Y¸WÀûo$“a`„~`„„¸_Àûo“`„ta`„t_„‡a_\…PI¸vx¸„‡¸zÀû8†¸†Àûa`„~`„„>¸‘¸Ñ=x¸ ..‡¸©Àû8†¸´Àû.¸ÅÀ÷<^`„t`„t]„‘_`„t\…ƒ?=x¸Þ..€¸çÀ÷1‡¸îÀû8‚¸ùÀ÷G^`„t`„t]„‘_`„t\…ƒ‚±¹¹¹Ñ@‚‘¹¹Ñ¹(`„u¹6`„tj¹>`„t`„t>¹B¹ÑI¹Hx¹R¹LÀý:“a`„~`„„=‰¹WÀý:“?E¹f¹o¹q*`„t¹sÀý:x¹|‚¹zÀý‹v¹ƒ.`„t„}a`„~`„„й‹Àý‹x¹Œ‚¹‹Àý‹”a`„~`„t„…>¹¹¾I¹˜¹¤x¹ .‚¹¡Àý‹a`„t_„‡€¹§Àý/a`„u`„„¯J¹°‚¹·Àý‹?J¹Äx¹Ë” a`„t„‰‚²¹Ö¹Úº–@‚’¹äº–¹ê}a_`„º`„tjº`„t`„t>º º–IºxººÀþ‡“a`„~`„„=‰º!Àþ‡“?Eº0º9º;*`„tº=Àþ‡xºF‚ºDÀþØvºM.`„t„}a`„~`„„ŠºUÀþØxºV‚ºUÀþØ”a`„~`„t„…>ºZºƒIºb}ºj€ºfÀþuxºo.‚ºpÀþØa`„t_„‡a_`„Jºu‚º|ÀþØ?Jº‰xº” a`„t„‰‚³º›ºŸ»Ô@‚“ºª»Ôº³`„uºÂ`„tj`„x`„t>ºÊ»ÔIºÐ"ºÚºÔÀÿÏxºëºåÀÿÏ`„tOvºó.`„t„}a`„~`„„—=‰ºûÀÿÏx»v».`„t„}”a`„~`„t„‚?I»O»Y»SÀÿÏ`„t=0»b'‚„?E»r»{»}*`„t»ÀÿÏ`„tx»ˆ‚»†À}O“a`„~`„„—Š»ŽÀ}x»‚»ŽÀ}”a`„~`„t„‚>»“»ÁI»›»§x»£.‚»¤À}a`„t_„‡€»ªÀÿÄa`„u`„„¯J»³‚»ºÀ}?J»Çx»Î” a`„t„‰‚´»Ù»Ý½@‚”»ë½»ñ}a_`„¼`„tj`„x`„t>¼½I¼"¼ ¼Àsx¼1¼+Às`„tOv¼9.`„t„}a`„~`„„—=‰¼AÀsx¼Uv¼N.`„t„}”a`„~`„t„‚?I¼•¼Ÿ¼™Às`„t=0¼¨'‚„?E¼¸¼Á¼Ã*`„t¼ÅÀs`„tx¼Î‚¼ÌÀ!O“a`„~`„„—мÔÀ!x¼Õ‚¼ÔÀ!”a`„~`„t„‚>¼Ù½I¼á}¼é€¼åÀax¼î.‚¼ïÀ!a`„t_„‡a_`„J¼ô‚¼ûÀ!?J½x½” a`„t„‰‚µ½½¾H@‚½%¾H½*€‘`„t½3_\>½<¾H=½B…z`„t€½SÀ'€‘N½l½s`„tv½z.`„t„}=½‘…‘€½¦À“‚½°ÀA'€‘=x½Æ.€Ÿ½ÊÀa_\…PI½Ø!½â€½ÜÀ‚½åÀAa`„u`„„ˆ>½í¾D=x½õ..x¾€½þÀ”a`„~`„t„…x¾‚¾ ÀA”a`„~`„t„….€¾À^`„t`„t]„‘_`„t\…ƒ=x¾-.(€¾.À¾7Àa`„t_\„?‚¶¾M¾O¾·@‚ ¾W¾·¾\€‘`„t_>¾c¾·N¾k¾r€Ä_x¾x.€¾yÀya`„t_„‡=x¾….‚„o€¾Àyx¾œ€¾–Ày”a`„~`„t„…a`„t`„t\…J¾¦¾­À“‚·¾¼¾ÁÀC\@‚¾ÊÀC\¾Ï€‘`„t¾âü]„‘_\>¾ìÀC\ =¾ý…‘€¿À0“v¿.`„t„}'€‘I¿2¿<€¿6À0v¿?.`„t„}a`„u`„„ˆ>¿G¿s=x¿O.c¿VÀ<a]„‘_\…J¿g?I¿y"!%¿†¿}À<]…[¿¥„»¿¯À<.>¿À¿ê=‰¿ÈÀÀ@5À@IJÀ@=?NÀA,ÀA6‚`„tvÀA8.`„t„}EÀADÀAMÀAO*`„txÀA[ƒÀAQÀ‚ÀA]À6a`„~`„t„‚xÀAp„ÀAnÀ¶ƒÀArÀa`„~`„„ŒÀAÀ¶xÀA}„ÀAÀ¶”a`„~`„t„…>ÀA‚ÀA¨=xÀAŠ.€ŸxÀA’.#xÀA•„ÀA“À¶$“a`„~`„„„ÀA›À¶“`„ta`„t_„‡a_\…PIÀA®!ÀAÂvÀA»ÀA²À<`„t„Ë‚ÀAÅÀ6a`„u`„„ˆ>ÀAÖÀB«=wÀBY.xÀB`vÀBY.`„t„}‚ÀBcÀ6a`„~`„t„‚…N=0ÀBzÀB€…>ÀBœÀ<?NÀBµÀB‚–`„txÀBÊ€ÀBÄÀ0‚ÀBÌÀ6a`„~`„t„…IÀBáxÀBò„ÀBåÀ]ƒÀBôÀa`„~`„„>ÀBÿÀC;=xÀC..„ÀCÀ]ƒÀCÀ.€ÀC/À0^`„t`„t]„‘_`„t\…ƒ?=xÀCA.‚—€ÀCHÀ0ÀCOÀ<a`„t]„‘_\…’‚¸ÀCaÀCfÀDH@‚—ÀClÀDHÀCq€‘`„tÀC„ü]„‘_\>ÀCŽÀDHIÀC”%ÀC¡ÀC˜À Š]„v[>ÀCªÀCê=xÀC²..€ÀC»À |xÀCÈ€ÀCÂÀ |vÀCÓÀCÊÀ Š`„t„Ëa`„~`„t„…ÀCÛÀ Š^`„t`„t]„‘_`„t\…ƒ>ÀCñÀDD>NÀD €˜]„Å_vÀD ÀD À Š€…]„Å_„ÇExÀD ‚À Y€Œa`„„Î>NÀD_vÀD‚À YV_„Ð>ÀDÀD>=xÀD#.(5ÀD)ÀD$`„t€ÀD$À |5ÀD)ÀD)`„tˆÀD)À |xÀD)„ÀD$À í”a`„~`„t„…„ÀD$À íƒÀD/À °a`„t_\„‚ÀÀDMÀD]ÀD†@@ÀDfÀD†]„‘_JÀDiÀDi…•_.‚£ªsª~ªåA‚˜„oª‰ªåª’€§[ª€¨[`„t>ª ªåJª¦ª¸…–&ªÂ€ªÀÀ Ê]… [&ªÓªÑÀ Ó]… [ÉÌÊxËÀÌÌLÍ3ͪÎ.ÎÊÏsÏ­ÐÐQÑ|ÑÉÑýÒ«ÓãÕ%ÖeØÙÔÛâÜÇÝÝ]ݼÞ!ßÈáGá•áîâLâ¥ä6å;ækèrèÖé;ë–ëÆìxî(îlîøððñLòÉ÷ýþYÿ¨Eë] V d ¬ =‚Æ‚$‚* ‚™ `„u[]‚‚_]…—_‚É…>…R€†‚š‚`„tj…Q`„t‚ʂЅ_…e€‚›‚]„v_‚˂хm…r€€‚œ‚`„t‚̂҅z…€€‚‚`„t‚솆†d††d†‚ž`„tj`„x]‚Æ_? †5‚î†;‚×€†SÀ À‚†ª‡Z‚Ÿ‚†¹‡Z†¾‚ž`„t]‚Æ_? @†Þ‚Ø€†êÀ†Þ†ú‚ʇ…@_€‡À‚Ë“‚Ì“ †ª‚ł‡š‡Êx‚‡¥‡Ê‡«‚œ`„t‡·‚`„t‡Ã‚›]„v_]‚Æ_?‚Ë€ÀŽ‚ÌÀš‚Ê‚À¦ ‡š‚łք„„˜„êA‚ ‚„§„ê$`„u[`„u[„µû]‚Æ_]‚Æ_>„½„êJ„Äʂû__€„ßÀ‚ꈈ‰œAaˆ)‰œ `„u[ˆ6û]„‘_]‚Æ_>ˆ>‰œIˆD%ˆO€ˆHÀ‚]„v[>ˆX‰^Nˆdˆk`„tvˆt€ˆmÀ‚`„t„ËNˆ†ˆŒ‚¡]‚Æ_ˆŽ‚ì_xˆ¢ˆ›ÀÀ”a`„~`„t„…@xˆÉvˆÂvˆ»‚ˆµÀà‚›‚]„v_‚Ê`„t„}$ˆËÀÀa`„~`„„ˆµˆÑNˆÞˆé‚¢]„‘_€ˆëÀ‚=x‰vˆÿ‚ˆùÀà‚›‚]„v_‚Ê.“‰ÀÀƒ‰Àl“^`„t`„t]„‘_`„t\„’=w‰6‚‰0Àà‚‚‰>ÀÀ‚ÒJ‰L‚‰SÀà>‰e‰˜J‰m5‰t‰t]‚Æ_‰t‚ì_R=x‰„‰tÀc€‰‹À‚a]„‘_\‚߉tÀ‚׉ð‰û‹,A‚£‚Š‹,Š‚ž`„t`„t>Š)‹,IŠ/"ŠC€Š3À{xŠ^ŠNÀ{`„tjŠ``„ta`„~`„„>ŠrŠ—JŠzjŠ`„t?=ˆŠÀ{xŠ­ŠÀ{`„t”a`„~`„t„…IŠ·Š»‚ØŠÇÀ{`„t>ŠÙŠýJŠáŠèÀ{`„t?J‹‹ ‚Ù‹À{`„t‚Þ‹M‹^‹„@€Ÿj‹N`„u‹a‹„‹d_\>‹m‹„=x‹s.‚R‚€‹xÀ€a_\‚Ú‚ß‹‰‹šQ@cj‹Š`„u‹ Q‹­ü]„‘_\>‹·QI‹½%‹Ê€‹ÁÀÙ]„v[>‹ÓŽûN‹ß‹ä8]„‘_€‹æÀÙN‹úŒ‚¤`„tvŒ ŒÀ`„t„ËNŒŒ#`„tvŒ*.`„t‚ÍIŒ8xŒNxŒCƒŒ<ÀI‚ŒEÀ(a`„~`„t„…OvŒXvŒQ.‚›‚]„v_‚Ê`„t„}a`„~`„„—>Œ`*=xŒj.‚¥‚xŒzƒŒsÀI‚Œ|À(a`„~`„t„…a`„t\‚Ý=xŒÛvŒÔ.‚›‚]„v_‚Ê.ƒŒäÀIxŒóƒŒìÀI‚ŒõÀ(a`„~`„t„…ŒÿÀ“^`„t`„t]„‘_`„t\„’=w.‚‚xv.‚‚`„t‚Ì‚À(a`„~`„t„…‚Ò>1ŽõNv‚¦`„txvˆv.‚›‚]„v_‚Ê`„t„}v‘.‚‚`„t‚Ìa`„~`„t„‚I x­‚¤À(„¯ÀÃa`„~`„„>¹Ž=xÌvÅ.‚›‚]„v_‚Ê.vÕ.‚‚`„t‚ÌxâvÜ.‚‚`„t‚Ì‚äÀ(a`„~`„t„…îÀ“^`„t`„t]„‘_`„t\„’=wŽ.‚‚xŽvŽ.‚‚`„t‚Ì‚Ž À(a`„~`„t„…‚Ò>Ž$ŽíNŽ4Ž=‚§`„txŽH‚Ž?À(„ŽJÀÃa`„~`„t„‚=xŽevŽ^.‚›‚]„v_‚Ê.vŽn.‚‚`„t‚ÌxŽ{vŽu.‚‚`„t‚Ì„Ž}ÀÃa`„~`„t„…އÀ“^`„t`„t]„‘_`„t\„’=xŽ¢vŽ›.‚›‚]„v_‚Ê.“…Ž®ÀޏÀ„޾ÀÃ^`„t`„t]„‘_`„t\„’=wŽÓ.‚‚…ŽÛÀ‚Ò>M>N€˜]„Å_v€ÀÙ€…]„Å_„ÇExÀD€Œa`„„Î>N_v(ÀDV_„Ð>(G=x2.‚R‚‚7À“a_\‚Ú‚àVc@kj`„u[]‚Æ_Jpz‚Ö__.‚ᔯÇ@~j•`„¹¸Ç`„u[]‚Æ_J¾x¾.k_a]‚Æ_‚à‚âÌß@€‚jÍ`„uç`„¾Jíú…S.'‚¨'‚©‚ã:Ku@‚ªj;`„uRuU_\>^u=xd.‚R‚€iÀÚa_\‚Ú‚äz‹‘@‚«j{`„u“‘–_\>Ÿ‘=w¥.‚œ‚x¹x´v®.‚œ‚`„t‚Ë”a`„~`„t„‚€³xÊvÃv¼.‚›‚]„v_‚Ê`„t„}”a`„~`„t„‚a`„t`„t„ô‚Ñ=xÚvÔ.‚›‚]„v_‚Ê(vÛ.‚œ‚`„t‚Ë€äÀ4a`„t_\„Iñûvõ.‚œ‚`„t‚Ëvþ.‚‚`„t‚Ìa`„u`„„ˆ=x‘.‚[‚a\‚Û?‚å‘‘#‘î@‚Jj‘`„u‘.‘î_>‘1‘îI‘7‘Av‘;.‚œ‚`„t‚Ëv‘D.‚‚`„t‚Ìa`„u`„„ˆ=0‘K‘Q„ÿ'€Ö?N‘s‘z€Ä_5_x‘‚v‘|.‚›‚]„v_‚Êv‘ƒ.‚œ‚`„t‚Ëa`„t_„‡#€Àé&‘Š€Àé_Àé__=x‘šv‘”.‚›‚]„v_‚Ê(v‘›.‚œ‚`„t‚Ë+a`„t_\„=w‘®.‚œ‚x‘Âx‘½v‘·.‚œ‚`„t‚Ë”a`„~`„t„…€³x‘Óv‘Ìv‘Å.‚›‚]„v_‚Ê`„t„}”a`„~`„t„‚a`„t`„t„ô‚ÑJ‘Ý€‘äÀÚ‚æ‘ó’’Ë@?j‘ô`„u’ ’Ë_>’’ËI’’v’.‚œ‚`„t‚Ëv’!.‚‚`„t‚Ìa`„u`„„ˆ=0’(’.„ÿ'€Ö?=w’L.‚‚x’`x’[v’U.‚‚`„t‚Ì”a`„~`„t„‚€³x’qv’jv’c.‚›‚]„v_‚Ê`„t„}”a`„~`„t„‚a`„t`„t„ô‚ÒN’’†€Ä_5_x’Žv’ˆ.‚›‚]„v_‚Êv’.‚‚`„t‚Ìa`„t_„‡#€À;&’–€À;_À;__=x’¦v’ .‚›‚]„v_‚Ê(v’§.‚‚`„t‚Ì+a`„t_\„J’º€’ÁÀ,‚Í’æ’ú“)@j’ç`„u““)`„tJ“x“x“ v“.‚‚`„t‚Ìv“ .‚œ‚`„t‚Ëa`„~`„t„‚€³x“%v“v“.‚›‚]„v_‚Ê`„t„}”a`„~`„t„‚a`„t`„t„ô‚Ó“.“>–[@j“/`„u“D–[“I `„t\>“P–[I“Vx“`€“ZÀÑ“a`„~`„„=0“e“k…™$“š'‚¬€“ÀÑ'‚­?I“¡"x“«€“¥ÀÑ$v“­.`„t‚Ía`„~`„„!%“¼+_>“Ôl=0“˓фÖ$“á'‚®'‚¯-_'‚°?N”w”}â`„tx”…€”ÀÑv”‡.`„t‚Ía`„~`„t„‚I”“x””—ÀŠO“a`„~`„„—>”£•1I”«x”½v”¶v”¯.‚›‚]„v_‚Ê`„t„}K€”ÀÀÑa`„~`„„–>”Ç”è=x”Ñ.‚¥‚€”ÚÀÑa`„t\‚Ý?=w”ð.‚‚x•x”ÿv”ù.‚‚`„t‚Ì•ÀŠa`„~`„t„…€³x•v•v• .‚›‚]„v_‚Ê`„t„}”a`„~`„t„‚a`„t`„t„ô‚ÒJ•%?N•<•D‚±`„tx•Lv•F.‚‚`„t‚Ì•NÀŠa`„~`„t„…I•qx•}‚•uÀ ìO“a`„~`„„—>•ƒ•·=x•’v•‹.‚›‚]„v_‚Ê‚‰‚•œÀ ìv•¥.‚‚`„t‚Ì+^`„t`„t_\…š>•¾–B=Š•ÆÀ ìx•΂•ÆÀ ìv•Øv•Ñ.‚›‚]„v_‚Ê`„t„}a`„~`„t„…=x•ív•æ.‚›‚]„v_‚Ê‚‰“v•ú.‚‚`„t‚Ì+^`„t`„t_\…š=x–v–.‚›‚]„v_‚Ê‚‰‚–À ìv–/v–(.‚›‚]„v_‚Ê`„t„}+^`„t`„t_\…š=w–H.‚‚‚–PÀ ì‚Ò‚ç–`–w—B@j–a`„u–y—B–~€‘`„t_>–…—BI–‹"x–•€–À"Ô“a`„~`„„x–¢€–œÀ"ÔOv–¥.`„t‚Ía`„~`„„—>–­–þ=0–µ–»…™$–÷'‚²€–ÎÀ"Ô'‚³v–î.`„t‚Í'‚´?J—5_x—v— .‚›‚]„v_‚Êx—#x—v—.‚œ‚`„t‚Ë€—À"Ôa`„~`„t„…€³x—4v—-v—&.‚›‚]„v_‚Ê`„t„}”a`„~`„t„‚a`„t`„t„ôa`„t_„‡#À#y&—:À#y_À#y__‚è—G—a˜2@(j—H`„u—d˜2—i€‘`„t—r _\>—y˜2I—"x—‰€—ƒÀ$}“a`„~`„„x—–€—À$}Ov—™.`„t‚Ía`„~`„„—>—¡—ò=0—©—¯…™$—ë'‚²€—ÂÀ$}'‚³v—â.`„t‚Í'‚´?=x—ÿv—ù.‚›‚]„v_‚Ê(x˜x˜v˜.‚œ‚`„t‚Ë€˜ À$}a`„~`„t„…€³x˜!v˜v˜.‚›‚]„v_‚Ê`„t„}”a`„~`„t„‚a`„t`„t„ô˜)À$‰a`„t_\„‚ؘ¯˜»˜òA‚µ‚˜Æ˜ò˜Ë‚¶`„t`„J˜Ö˜îx˜Þ€˜×À%ú€³x˜è€˜áÀ%ú”a`„~`„t„‚a`„t`„t„ô“a`„u`„„ˆ‚Ù™™™¤š‚A‚·‚™±š‚™¶‚¶`„t`„t>™¾š‚@x™Ò€™ËÀ&$“a`„~`„„™Ë™Õ=ˆ™ÜÀ&x™óx™í€™æÀ&€´”a`„t`„t„õ”a`„~`„t„‚E™ü>šš~Nšš‚¸`„txš%€šÀ&€³xš/€š(À&”a`„~`„t„‚a`„t`„t„ôIš;šJš?À'“a`„u`„„ˆJšP€šWÀ&?=ˆšeÀ&šnÀ'‚ښ̚ћR@‚R‚šÕ›RšØ_\>šá›R=xšívšç.‚›‚]„v_‚Ê(všî.‚‚`„t‚Ì€š÷À'±a`„t_\„=w›.‚‚x›x›v› .‚‚`„t‚Ì”a`„~`„t„…€³x›)v›"v›.‚›‚]„v_‚Ê`„t„}”a`„~`„t„‚a`„t`„t„ô‚ÒI›3›=v›7.‚œ‚`„t‚Ëv›@.‚‚`„t‚Ìa`„u`„„ˆ=x›G.‚[‚a\‚Û?‚Û›w›|œ•@‚[‚›œ•\>›„œ•N›Ž›—‚¹]„v_›™…@_x›·v›°v›©.‚›‚]„v_‚Ê`„t„}•a`„~`„t… N›Ë›Ñ‚º`„tx›áv›Úv›Ó.‚›‚]„v_‚Ê`„t„}v›ã.‚œ‚`„t‚Ëa`„~`„t„‚=x›÷€›îÀ) .“œÀ)dvœ .‚›‚]„v_‚Êvœ.‚œ‚`„t‚Ë^`„t`„t]„‘_`„t\„’=xœ'€œÀ) .œ0À)dxœ=œ7À)dvœ?.‚œ‚`„t‚Ëa`„~`„t„…vœF.‚›‚]„v_‚Ê“^`„t`„t]„‘_`„t\„’=wœV.‚œ‚“‚Ñ=wœe.‚‚vœtvœm.‚›‚]„v_‚Ê`„t„}‚Ò=wœ€.‚›‚€œ‰À) ‚Ð‚ÜœšœžžO@‚»‚œªžOœ´9]„v_`„t>œ¼žO@xœ×vœÐ€œÉÀ+`„t„}OvœÚ.`„t‚Ía`„~`„„—œÉœàIœçxœñvœë.‚œ‚`„t‚ËKvœô.‚‚`„t‚Ìa`„~`„„–>œûiN`„txv.‚‚`„t‚Ìv.‚œ‚`„t‚Ëa`„~`„t„‚=x,€%À+.“8À+¤v@.‚›‚]„v_‚ÊvH.‚œ‚`„t‚Ë^`„t`„t]„‘_`„t\„’JV]À+¤>pžKN|Š‚¼`„txšv“vŒ.‚›‚]„v_‚Ê`„t„}vœ.‚œ‚`„t‚Ëa`„~`„t„‚=x°€©À+.“¼À,ZvË.‚›‚]„v_‚ÊvÓ.‚œ‚`„t‚Ë^`„t`„t]„‘_`„t\„’=xè€áÀ+.ñÀ,ZxžžÀ,Zvž.‚‚`„t‚Ìa`„~`„t„…vž.‚›‚]„v_‚Ê“^`„t`„t]„‘_`„t\„’Jž)xž6vž0.‚‚`„t‚Ìž8À,Za`„~`„t„…‚Ýž‚ž‡ @‚¥‚ž ž”‚½`„t\>ž¥ @xžÂ€ž²À-àOvžÅ.`„t‚Ía`„~`„„—ž²žË=ˆŸ4À-àxŸD€Ÿ4À-àxŸW€ŸGÀ-à”a`„t`„t„„a`„~`„t„…NŸeŸq‚g`„tŸs‚Ù€ŸÀ-àNŸ›Ÿ¤‚¹]„v_Ÿ¦…@_Ÿ¶À.p=wŸÎ.‚‚xŸÖ.‚»‚‚ŸãÀ.Ža]„v_`„t‚Ü‚Ò=wŸò.‚›‚‚ŸûÀ.Ž‚Ð=w  .‚œ‚“‚Ñî^]\¶×w¶c,õ®"±$Z%Ü&c'“(à*é-Â/ ‚ð  !¢#‚¾$`„u[`„u[]‚Æ_‚ó b k€‚¿‚]‚Æ_‚û ó ó¡?¡¡?¡‚¿]‚Æ_]‚ð__?‚ó€À/Î ¡‚ïx¡” a`„t„‰x¡ ” a`„t„‰x¡5v¡.€¡$À/΂›‚]„v_‚Êk_a]„v_…›‚ô¡D¡X¡p@‚œ‚j¡E`„u¡^¡p`„tJ¡av¡kv¡a.‚¿‚]‚Æ_‚󂜂`„t‚Ë‚ø¡u¡…¡°@‚œ‚j¡v`„u¡Š¡°¡ `„t\J¡™w¡£v¡™.‚¿‚]‚Æ_‚󂜂€¡«À0ã‚Ñ‚õ¡µ¡É¡á@‚‚j¡¶`„u¡Ï¡á`„tJ¡Òv¡Üv¡Ò.‚¿‚]‚Æ_‚ó‚‚`„t‚Ì‚ù¡æ¡ö¢!@‚‚j¡ç`„u¡û¢!¢ `„t\J¢ w¢v¢ .‚¿‚]‚Æ_‚ó‚‚€¢À1˜‚Ò0h0½11r1Ò1îÉw /l1ë1î ‚ü€Ú„o€õƒ'‚ý‚}‚ƒŒ ‚À `„u[]…œ_]ƒi_ƒ  ]‚ý_? …ž ‚ÿ ‘-‘>‘V@€Ÿj‘.`„u‘A‘V‘D _`„J‘N‘Nƒlƒ ‘´‘Å‘í@cj‘µ`„u‘Ë‘í‘Ø"]„‘_\J‘å‘åƒlƒ ’K’\’}@{j’L`„u’b’}’k `„u`„J’u’uƒlƒ ’Û’ì“@€Íj’Ü`„u’õ“’ÿ"]„‘[\J“ “ ƒlƒ “r“ƒ“«@€Îj“s`„u“Œ“«“–"]„‘[\J“£“£ƒlƒ ” ””H@|j” `„u”%”H”7}a_`„\J”@”@ƒlƒ ”¦”·”å@€“j”§`„u””å”Ô}a_`„\J”Ý”݃lƒ •C•T•g@nj•D`„u•Y•g\J•_•_ƒlƒ tÏA€ƒ'‡Ïb>ŠÏ=0–„Ö'€Ï2‰2Ì33R3”3Ö44c4—4Ð ƒ ‚}‚ƒŒ ‚Á `„u[]‚ý_ƒƒ ƒ€‚‚ü]„ë]„ë_ƒƒ_ƒh€‚Âü`„ƒ…„…„…ê…Œ…ê…™‚Ä]„ë]„ë_…¥‚Å`„j…°`„ ]ƒ _?ƒ€…ÈÀ5oƒ…âÀ5† …„ƒ ƒˆDˆDˆ°aˆQˆ°ˆc‚Ä]„‘]„ë_ˆo‚Å`„jˆz`„ ]ƒ _? ˆŠƒxˆ”€ˆÀ5߀Øa]„ë]„ë_…Ÿ‚ň§À5öƒˆµˆÉ‰1@jˆ¶`„uˆÐ‰1`„tJˆÓ#vˆÓ.‚Âü`„ƒxˆëvˆå.‚‚ü]„ë]„ë_ƒ€ˆ`„t“4ˆóˆó‰ˆô`„tˆü‚Z]„ë_`„tJ‰x‰ €‰À6Çv‰‰ À6Ò`„t…¡a`„~`„t„…a`„ta`„t]„ë_`„t`„t„Ìv‰+v‰!.€›‚ü]„‘_ƒ`„t„Ë`„tƒ‰6‰R‰p@€…j‰7`„u‰[‰p]„Å_J‰^v‰hv‰^.€›‚ü]„‘_ƒ€…]„Å_„ÇƒŠ ŠŠ@€›‚üŠ$Š]„‘_>Š$ŠNŠ.Š:‚Æ]„‘_xŠBvŠ<.‚‚ü]„ë]„ë_ƒ‚-_4ŠIŠIŠUŠJ‚Z]„ë_]„ë_JŠR€ŠRÀ8=aa]„ë_]„‘_]„‘_…¢JŠ\#vŠc.‚Âü`„ƒ€ŠoÀ7õxЉ€Š}À7õ|yŠ•RN]„ë_…_À8¾€Ÿa_`„„íaa_`„]„‘_…$]„‘_ƒТгŠù@€†jŠ£`„uŠ»ŠùŠÄ`„u`„JŠÐxŠÖvŠÐ.‚‚ü]„ë]„ë_ƒr4ŠÚŠÚŠøŠÛ‚Z]„ë_`„JŠãxŠçŠãÀ9€†€ŠðÀ98a`„u`„…aa]„ë_`„`„„°ƒŠþ‹ ‹Ä@€ÓjŠÿ`„u‹‹Ä‹`„u_>‹%‹Ä>N‹;€˜]„Å]„ë_v‹;v‹;.‚‚ü]„ë]„ë_ƒ€…]„Å]„ë_„ÇEx‹;À:€Œa`„„Î>N‹4‚Z]„ë_v‹BÀ:V]„ë_„Ð>‹B‹¯N‹N‹U€Ä_x‹[‚‹WÀ:Š€Ó€‹bÀ:a`„u_…£I‹r"!‹}ƒ‹vÀ:¹x‹Œ‚‹ˆÀ:Š€†+a`„u`„…J‹œƒ‹£À:¹?J‹µ+ƒ‹É‹ÜŒ @€Øj‹Ê`„u‹áŒ ]„ë_J‹çRN‹ê]„ë_…_>N‹û€˜]„Å]„ë_v‹ûv‹û.‚‚ü]„ë]„ë_ƒ€…]„Å]„ë_„ÇEx‹ûÀ;‡€Œa`„„Î>N‹ô‚Z]„ë_vÀ;‡V]„ë_„Ð=xŒ€‹êÀ;fc‚ŒÀ;óa]„‘_\…¤€‹êÀ;f6Q7i7Ä99Ý;/†ž†¼=x†ªv†¤.‚ƒ]„ë]„ë_ƒ€Ÿ€†®À>a]„ë_`„„íƒ"‡p‡u‡¨@{‡{‡¨‡ƒ=]„ë_`„J‡‘x‡—v‡‘.‚ƒ]„ë]„ë_ƒ{€‡žÀ>†a`„u`„…=ô>k>Û>ï<£>ì>ï ƒ' €Ú€¡ƒŠ„o‚ȂɄp„qƒ( ƒAƒGƒÖ-‚Ê `„u[]ƒº_]ƒ?_ƒ; ]„v_]ƒ(_? ƒã€À?{ƒ* …Z…j…‹@j…[`„u…p…‹…u‚`„t\J…ƒ…ƒƒBƒ, …ø† †!@€Ÿj…ù`„u† †!† _`„J††ƒBƒ- †Ž†Ÿ†Ç@cj†`„u†¥†Ç†²ü]„‘_\J†¿†¿ƒBƒ. ‡4‡E‡m@‚j‡5`„u‡K‡m‡P€‘`„t‡Y_\J‡e‡eƒBƒ/ ‡Ú‡ëˆ!@‚j‡Û`„u‡ôˆ!‡ù€‘`„tˆ ü]„‘_\JˆˆƒBƒ0 ˆŽˆŸˆÀ@{jˆ`„uˆ¥ˆÀˆ® `„u`„Jˆ¸ˆ¸ƒBƒ1 ‰-‰;‰Z@‚ j‰.`„u‰C‰Z‰H€‘`„t_J‰R‰RƒBƒ2 ‰Ç‰Õ‰í@?j‰È`„u‰ß‰í_J‰å‰åƒBƒ3 ŠZŠkŠ™@|jŠ[`„uŠvŠ™Šˆ}a_`„\JББƒBƒ4 ‹‹‹E@€“j‹`„u‹"‹E‹4}a_`„\J‹=‹=ƒBƒ5 ‹²‹Ã‹î@‚ j‹³`„u‹Î‹î‹Ó`„t‹Þ`„t\J‹æ‹æƒBƒ6 Œ[ŒlŒ®@‚ jŒ\`„uŒxŒ®Œ}`„tŒˆ`„tŒ™ü]„‘_\JŒ¦Œ¦ƒBƒ7 ,?@nj`„u1?\J77ƒBƒ9 „„„‘„íA€ƒ'„—„íb>„š„í=0„ „¦„Ö'‚?©?é@,@q@½AAQA•AÍBBZB¥CC5Cnƒ< ƒAƒGƒÖ‚Ë `„u[]ƒ(_ƒ> ƒƒƒÔƒ°ƒÔƒ¹‚Ì]„v_]ƒ<_? ƒÅƒ;€ƒËÀCíDƒ? „F„UA‚Í `„u[`„u]„v_ƒR „U ]ƒ?_? „›ƒB „„„‘„íA€ƒ'„—„íb>„š„í=0„ „¦„Ö'‚ƒP …Z…j…‹@j…[`„u…p…‹…u‚`„t\J…ƒ…ƒƒBƒC …ø† †!@€Ÿj…ù`„u† †!† _`„J††ƒBƒD †Ž†Ÿ†Ç@cj†`„u†¥†Ç†²ü]„‘_\J†¿†¿ƒBƒE ‡4‡E‡m@‚j‡5`„u‡K‡m‡P€‘`„t‡Y_\J‡e‡eƒBƒF ‡Ú‡ëˆ!@‚j‡Û`„u‡ôˆ!‡ù€‘`„tˆ ü]„‘_\JˆˆƒBƒG ˆŽˆŸˆÀ@{jˆ`„uˆ¥ˆÀˆ® `„u`„Jˆ¸ˆ¸ƒBƒH ‰-‰;‰Z@‚ j‰.`„u‰C‰Z‰H€‘`„t_J‰R‰RƒBƒI ‰Ç‰Õ‰í@?j‰È`„u‰ß‰í_J‰å‰åƒBƒJ ŠZŠkŠ™@|jŠ[`„uŠvŠ™Šˆ}a_`„\JББƒBƒK ‹‹‹E@€“j‹`„u‹"‹E‹4}a_`„\J‹=‹=ƒBƒL ‹²‹Ã‹î@‚ j‹³`„u‹Î‹î‹Ó`„t‹Þ`„t\J‹æ‹æƒBƒM Œ[ŒlŒ®@‚ jŒ\`„uŒxŒ®Œ}`„tŒˆ`„tŒ™ü]„‘_\JŒ¦Œ¦ƒBƒN ,?@nj`„u1?\J77ƒBD}D¶DöE9E~EÊFF^F¢FÚG GgG²HHBƒS ŽfŽlÒ-‚Î `„u[]ƒä_]ƒi_ƒ` ]„ë_]ƒS_? ƒû€ÀHÅ ƒU ‘-‘>‘V@€Ÿj‘.`„u‘A‘V‘D _`„J‘N‘NƒlƒV ‘´‘Å‘í@cj‘µ`„u‘Ë‘í‘Ø"]„‘_\J‘å‘åƒlƒW ’K’\’}@{j’L`„u’b’}’k `„u`„J’u’uƒlƒX ’Û’ì“@€Íj’Ü`„u’õ“’ÿ"]„‘[\J“ “ ƒlƒY “r“ƒ“«@€Îj“s`„u“Œ“«“–"]„‘[\J“£“£ƒlƒZ ” ””H@|j” `„u”%”H”7}a_`„\J”@”@ƒlƒ[ ”¦”·”å@€“j”§`„u””å”Ô}a_`„\J”Ý”݃lƒ\ •C•T•g@nj•D`„u•Y•g\J•_•_ƒlƒ^ tÏA€ƒ'‡Ïb>ŠÏ=0–„Ö'€ÏHóI6IzI¼IþJ@J†JÍKK: ƒa ŽfŽlÒ‚Ï `„u[]ƒS_ƒd Žl€Ýƒ'[1[ƒfƒh ŽÁŽÁŽõŽÔŽõŽÜ‚Ð]„ë_]ƒa_? Žçƒ`€ŽíÀK½ƒf ›ÐY‚Ñ´Ð `„u[]ƒa_=5€Þ[€Å5€ß_+KîL?ƒi 7F•i‚Ò `„u[`„u]„ë_ƒv F ]ƒi_? „› ƒl tÏA€ƒ'‡Ïb>ŠÏ=0–„Ö'€Ïƒm ‘-‘>‘V@€Ÿj‘.`„u‘A‘V‘D _`„J‘N‘Nƒlƒn ‘´‘Å‘í@cj‘µ`„u‘Ë‘í‘Ø"]„‘_\J‘å‘åƒlƒo ’K’\’}@{j’L`„u’b’}’k `„u`„J’u’uƒlƒp ’Û’ì“@€Íj’Ü`„u’õ“’ÿ"]„‘[\J“ “ ƒlƒq “r“ƒ“«@€Îj“s`„u“Œ“«“–"]„‘[\J“£“£ƒlƒr ” ””H@|j” `„u”%”H”7}a_`„\J”@”@ƒlƒs ”¦”·”å@€“j”§`„u””å”Ô}a_`„\J”Ý”݃lƒt •C•T•g@nj•D`„u•Y•g\J•_•_ƒlL¢LÛMMbM¤MæN(NnNµNé ƒw •Εݚ0‚Ó`„u[[`„u[`„u]„˜__ƒ„ •Ý ]ƒw__? „›ƒz –––lA€ƒ'–$–lb>–'–l=0–-–3„Ö'‚Ôƒ{ –Ê–ä—@(j–Ë`„u–ç—–ê_–ñ _\J–û–ûƒzƒ| —a—o—¤@yj—b`„u—z—¤—}_—za__J—œ—œƒzƒ} ˜˜˜6@cj˜`„u˜˜6˜$b]„˜__\J˜.˜.ƒzƒ~ ˜”˜¢˜Á@{j˜•`„u˜¨˜Á˜±`„u_J˜¹˜¹ƒzƒ ™™0™C@nj™ `„u™5™C\J™;™;ƒzƒ ™¡™¥™¹@Í™ª™¹™«x[\J™±™±ƒzƒ‚ ššš.@¹šš.š x[\Jš&š&ƒzO}O¶PPPP˜PÚQQCQx Q¤?9C¯D'HƒKgLLOQ¡Q¤ ƒ…ƒ‡‚J‚N‚µA‚Õ‚\‚µ‚e‚Ö`„u‚u‚×`„u`„tJ‚„x‚¤&‚Œ€‚…ÀR]… `„uŠ‚®ÀRa`„u`„t…)ƒˆ‚æ‚èƒA‚Ø‚óƒ`„u[‚ö __Jƒ€ƒÀRƒ‰ƒ4ƒ8ƒ~A‚Ùƒbƒ~]… _]… [ƒe€§_ƒj€¨_`„tJƒpxƒr€ƒpÀRËŠƒ|ÀR×a_`„t…)SQäQçRZRœS ƒŠ €Ú„o€ô„rƒ' ƒ‹ ÷‚‹œ!‚Ú `„u[`„u]„‘_ƒ± ‚V‚\‚u ‚s‚u]ƒ‹_? ‚\„›!ƒŽ ‚<‚L‚QB^ƒŠ‚Q‚Q]„‘_ƒ— ‚z‚‹‚¸@rj‚{`„u‚Ž‚¸‚ }a_`„`„J‚©x‚¯v‚©.^ƒŠ]„‘_ƒŽr€‚³ÀTaa_`„`„„°ƒ˜ ‚½‚Õ‚ñ@kj‚¾`„u‚Ü‚ñ`„u[]„‘_J‚âx‚èv‚â.^ƒŠ]„‘_ƒŽk_a]„‘_…Bƒ™ ‚öƒƒ;@€†j‚÷`„uƒƒ;ƒ`„u`„Jƒ$xƒ*vƒ$.^ƒŠ]„‘_ƒŽ€†€ƒ3ÀTía`„u`„„ȃš ƒ@ƒNƒ|@‚qjƒA`„uƒWƒ|ƒ\€‘`„t_Jƒfxƒlvƒf.^ƒŠ]„‘_ƒŽ‚q€ƒvÀU[a`„t_…¥ƒ› ƒƒ’ƒÃ@€‡jƒ‚`„uƒ—ƒÃƒ©}a_`„`„Jƒ²xƒ¸vƒ².^ƒŠ]„‘_ƒŽ€‡€ƒ¾ÀUÊaa_`„`„„ʃœ ƒÈƒà„@‚-jƒÉ`„uƒé„`„u[„sa_]„‘_]„‘_J„x„v„.^ƒŠ]„‘_ƒŽ‚-_€„ÀVOaa_]„‘_]„‘_…¢ƒ „„.„B@Íj„`„u„4„B_J„7v„=v„7.^ƒŠ]„‘_ƒŽÍ_…¦ƒ „G„U„¾@‚sj„H`„u„_„¾„q}a_`„„†€Õa_j`„x_J„˜x„žv„˜.^ƒŠ]„‘_ƒŽ‚s€„©ÀW3€Õ„·ÀWF^a_`„€Õa__…§ƒž „ÄхC@€ˆj„Ä`„u„Ø…C`„u[„Û­_…©a____J…"x…(v…".^ƒŠ]„‘_ƒŽ€ˆ_€…-ÀWæ…;ÀWòa_a____„̃Ÿ …H…`…˜@€Òj…I`„u…j…˜…wb]„‘_]„‘_J…x…‡v….^ƒŠ]„‘_ƒŽ€Ò€…’ÀX†a]„‘_]„‘_…¨ƒ  ……®…Ý@fj…ž`„u…µ…Ý…Çsa_\\J…Íx…Óv…Í.^ƒŠ]„‘_ƒŽf€…ÛÀYaa_\\…©ƒ …â…÷†@tj…ã`„u…ÿ†`„J†v†v†.^ƒŠ]„‘_ƒŽt`„„Ƀ‘ ††)†G@uj†`„u†4†G`„J†7v†=v†7.^ƒŠ]„‘_ƒŽu`„…ªƒ’ †L†h†‚@€…j†M`„u†q†‚]„Å_J†tv†zv†t.^ƒŠ]„‘_ƒŽ€…]„Å_„ǃ¡ †‡†š†Ð@‚wj†ˆ`„u†ž†Ð†§‚x`„¾j†³`„¾`„¾J†»x†Áv†».^ƒŠ]„‘_ƒŽ‚w€†ÆÀZl^`„¾`„¾…«ƒ“ †Õ†ç†ù@¹j†Ö`„u†ì†ù_J†ïv†õv†ï.^ƒŠ]„‘_ƒŽ¹_…2ƒ¢ †þ‡ ‡s@‚tj†ÿ`„u‡‡s‡'}a_`„‡<€Õa_j`„x_J‡Nx‡Tv‡N.^ƒŠ]„‘_ƒŽ‚t€‡^À[8€Õ‡lÀ[K^a_`„€Õa__…¬ƒ” ‡x‡Œ‡¢@j‡y`„u‡“‡¢`„tJ‡–v‡œv‡–.^ƒŠ]„‘_ƒŽ`„t„˃£ ‡§‡¿‡æ@ij‡¨`„u‡Å‡æ`„u[‡Ôsa__]„‘_J‡Úx‡àv‡Ú.^ƒŠ]„‘_ƒŽi_€‡äÀ\8aa__]„‘_„§ƒ¤ ‡ë‡ùˆ@@‚{j‡ì`„u‡ÿˆ@ˆ©a____Jˆ+xˆ1vˆ+.^ƒŠ]„‘_ƒŽ‚{€ˆ8À\Áaa____…­ƒ¥ ˆEˆ_ˆw@~jˆF`„¹ˆhˆw`„u[]„‘_Jˆnxˆn.k_a]„‘_ƒ˜ƒ• ˆ|ˆŽˆ¤@‚rjˆ}`„uˆ•ˆ¤_Jˆ˜vˆžvˆ˜.^ƒŠ]„‘_ƒŽ‚r_…®ƒ¦ ˆ©ˆ·‰*@€Ôjˆª`„uˆÂ‰*ˆÔ}a_`„ˆé€Õa_j`„x_>ˆò‰*Jˆøx‰vˆÿ.^ƒŠ]„‘_ƒŽ€Ô€‰À]ð€Õ‰À^^a_`„€Õa__…¯ƒ§ ‰/‰G‰c@‚|j‰0`„u‰K‰c‰P‚Û`„t]„‘_J‰Vx‰\v‰V.^ƒŠ]„‘_ƒŽ‚|€‰aÀ^ a`„t]„‘_…ƒ¨ ‰h‰€‰¹@‚}j‰i`„u‰‰‰¹‰›}a_`„]„‘_J‰¤x‰ªv‰¤.^ƒŠ]„‘_ƒŽ‚}€‰´À_aa_`„]„‘_…°ƒ© ‰¾‰Ö‰ò@‚Xj‰¿`„u‰Ú‰ò‰ß‚Û`„t]„‘_J‰åx‰ëv‰å.^ƒŠ]„‘_ƒŽ‚X€‰ðÀ_Ÿa`„t]„‘_…Aƒª ‰÷ŠŠH@‚~j‰ø`„uŠŠHŠ*}a_`„]„‘_JŠ3xŠ9vŠ3.^ƒŠ]„‘_ƒŽ‚~€ŠCÀ`aa_`„]„‘_…±ƒ« ŠMŠaŠ£@1jŠN`„uŠgŠ£Šn2`„jŠy`„]„v_JŠƒxЉvŠƒ.^ƒŠ]„‘_ƒŽ12€ŠšÀ`Ÿ^2`„]„v_…ƒ¬ ЍлŠÓ@€ØjŠ©`„uŠÀŠÓ]„ë_JŠÆxŠÌvŠÆ.^ƒŠ]„‘_ƒŽ€Øa]„ë_…Ÿƒ­ ŠØŠð‹!@|jŠÙ`„uŠõ‹!‹}a_`„]„‘_J‹x‹v‹.^ƒŠ]„‘_ƒŽ|€‹Àa‹aa_`„]„‘_…$ƒ® ‹&‹>‹d@€×j‹'`„u‹J‹d`„u[]„‘_J‹Px‹Vv‹P.^ƒŠ]„‘_ƒŽ€×_a]„‘_…²ƒ¯ ‹i‹|‹š@€‚j‹j`„u‹„‹š`„¾J‹Šx‹v‹Š.^ƒŠ]„‘_ƒŽ€‚a`„¾…HS¹SâT\TÉU7U¦V"V¿WW¹XbXäYRY YîZHZÄ[[¾\ \]"]|]Ì^|^õ_{_ô`zaagaíb\b´!ƒ² Œ˜ŒžÄ ‚Ü `„u[]ƒ‹_ƒµ ŒùŒþ€^ƒŠjŒÜ`„u]„‘_ƒ¹ ?Ex Wxd]„‘_]ƒ²_?ƒµ€tÀc  Eƒ±ƒ· W™ÂA‚ÝjX`„¹"¡Â `„u[«]„‘[]„‘_J´x¹€´Àdk_a]„‘_…BcÕdDƒº ª°Ÿ ‚Þ `„u[]ƒ‹_]„v_ƒ½ ‘‘€^ƒŠjý`„u]„v_ƒã ‘ ‘&‘Q ‘4‘Q‘=]„v_]ƒº_?ƒ½€‘MÀd¹ ‘&ƒ±"ƒÀ “‘“Ë“ðA‚Ýj“’`„¹$“Ó“ð `„u[“Ù]„v[]„v_J“âx“瀓âÀek_a]„v_…›ƒÁ “õ” ”)@j“ö`„u””)”€‘`„t_J”x”"v”.^ƒŠ]„v_ƒ½€”#Àe€a`„t_„‡ƒÂ ”.”H”~@(j”/`„u”K”~”P€‘`„t”Y _\>”`”~=x”kv”f.^ƒŠ]„v_ƒ½(€”lÀeí”uÀeùa`„t_\„ƒÃ ”ƒ” ”Á@j”„`„u”¡”Á”ªb]„v_]„v_J”´x”ºv”´.^ƒŠ]„v_ƒ½€”¼Àfma]„v_]„v_…³ƒÄ ”Æ”×”þ@€Ÿj”Ç`„u”Ú”þ”Ý _\>”ä”þ=x”ðv”ê.^ƒŠ]„v_ƒ½€Ÿ€”ôÀfîa_\…ƒÅ •••Q@cj•`„u••Q•'ü]„‘_\>•1•Q=x•=v•7.^ƒŠ]„v_ƒ½c€•DÀgXa]„‘_\…ŠƒÆ •V•n•†@‚…j•W`„u•s•†]„˜`„t_J•yx•v•y.^ƒŠ]„v_ƒ½‚…a]„˜`„t_…´ƒÇ •‹•Ÿ•»@kj•Œ`„u•¦•»`„u[]„v_J•¬x•²v•¬.^ƒŠ]„v_ƒ½k_a]„v_…›ƒÈ •À•Ñ•ð@nj•Á`„u•Ö•ð\>•Ù•ð=x•åv•ß.^ƒŠ]„v_ƒ½na\…µƒÉ •õ––d@‚‰j•ö`„u––d–`„t–`„t–(‚ß_j`„x\>–4–d=x–@v–:.^ƒŠ]„v_ƒ½‚‰€–JÀh÷–QÀi‚–VÀi ^`„t`„t_\…šƒß –i–y–Ó@Íj–j`„u–~–Ó– _\>–ˆ–ÓI–Žv–’.t`„ƒ=0–›–¬„Ù“.?=x–Ä.(“€–ÊÀi›a`„t_\ƒÂƒÊ –Ø–ð—*@‚ˆj–Ù`„u–ø—*–ý`„t—`„t]„‘_J—x—v—.^ƒŠ]„v_ƒ½‚ˆ€—Àj—&Àj"a`„t`„t]„‘_…¶ƒË —/—?—ƒ@‚‘j—0`„u—F—ƒ—I_—W`„tj—_`„t`„tJ—fx—lv—f.^ƒŠ]„v_ƒ½‚‘€—tÀj¥—}Àj°^_`„t`„t…·ƒÌ —ˆ—˜—ñ@‚’j—‰`„u—¢—ñ—´}a_`„—¿`„tj—Ç`„t`„tJ—Ôx—Úv—Ô.^ƒŠ]„v_ƒ½‚’€—åÀk6—ëÀkH^a_`„`„t`„t…¸ƒÍ —ö˜˜J@‚j—÷`„u˜ ˜J˜€‘`„t˜_\>˜$˜J=x˜0v˜*.^ƒŠ]„v_ƒ½‚€˜7ÀkÕ˜>Àkáa`„t_\…¹ƒÎ ˜O˜`˜µ@‚j˜P`„u˜i˜µ˜n€‘`„t˜ü]„‘_\>˜‹˜µ=x˜—v˜‘.^ƒŠ]„v_ƒ½‚€˜¡ÀlW˜¨Àlca`„t]„‘_\…ºƒà ˜º˜Ê™,@¹j˜»`„u˜Î™,˜Ñ _\>˜Ø™,I˜Þv˜â.t`„ƒ=0˜ë˜ü„Ù“.?=x™.(x™v™.`„tƒ””a`„~`„t„‚€™#Àläa`„t_\ƒÂƒÏ ™1™A™Š@‚“j™2`„u™L™Š™O_™^`„tj`„x`„tJ™ix™ov™i.^ƒŠ]„v_ƒ½‚“€™{Àm…™„Àm^_`„t`„t…»ƒÐ ™™Ÿ™ý@‚”j™`„u™­™ý™¿}a_`„™Ë`„tj`„x`„tJ™Üx™âv™Ü.^ƒŠ]„v_ƒ½‚”€™ñÀn™÷Àn'^a_`„`„t`„t…¼ƒá šššJ@jš`„uššJš‚`„t\>š(šJ=wš4vš..^ƒŠ]„v_ƒ½€š=Àn²…NƒÑ šOš`šŒ@{jšP`„ušfšŒšo `„u`„Jšyxšvšy.^ƒŠ]„v_ƒ½{€š†Àoa`„u`„…½ƒÒ š‘šŸšË@‚ jš’`„uš§šË𬀑`„t_Jš¶xš¼vš¶.^ƒŠ]„v_ƒ½‚ €šÅÀo|a`„t_…¾ƒÓ šÐšÞ›@?jšÑ`„ušè›_Jšîxšôvšî.^ƒŠ]„v_ƒ½?a_…ƒÔ ›››]@‚ j›`„u›!›]›&`„t›1`„t\>›6›]=x›Bv›<.^ƒŠ]„v_ƒ½‚ €›NÀpC›UÀpNa`„t`„t\…¿ƒÕ ›b›s›·@|j›c`„u›~›·›}a_`„\>›–›·=x›¢v›œ.^ƒŠ]„v_ƒ½|€›®ÀpÃaa_`„\…ÀƒÖ ›¼›Íœ6@‚ j›½`„u›Ùœ6›Þ`„t›é`„t›úü]„‘_\>œœ6=xœvœ .^ƒŠ]„v_ƒ½‚ €œÀq;œ$ÀqF‚œ)ÀqQa`„t`„t]„‘_\…Áƒ× œ;œLœ@€“jœ<`„uœWœœi}a_`„\>œoœ=xœ{vœu.^ƒŠ]„v_ƒ½€“€œ‡ÀqÝaa_`„\…ÂƒØ œ•œ·œÏ@~jœ–`„¹jœ¤`„uœÀœÏ`„u[]„v_JœÆxœÆ.k_a]„v_ƒÇƒ¾ œÔœð @@jœÕ`„uœù ]„‘_Jœüvvœü.^ƒŠ]„v_ƒ½@]„‘_…ƒÙ  o@‚—j`„u&o+€‘`„t>ü]„‘_\>Ho=xTvN.^ƒŠ]„v_ƒ½‚—€[ÀsbÀsa`„t]„‘_\…ÃƒÚ t…ž@.ju`„už’`„t`„t®ü]„‘_½ý`„tjÉ`„t\>Íž=xÙvÓ.^ƒŠ]„v_ƒ½.€âÀsžéÀs©‚îÀs´ƒøÀsÅ^`„t`„t]„‘_`„t\„’ƒÛ ž žžZ@jž `„už#žZž2#`„Šj`„x\>ž;žZ=xžGvžA.^ƒŠ]„v_ƒ½€žOÀtb^`„Š\…ÄƒÜ ž_žpž±@jž``„užtž±žŠ a__`„tj`„x\>ž”ž±=xž vžš.^ƒŠ]„v_ƒ½€ž¥ÀtØ^a__`„t\…'ƒÝ ž¶žÊŸ@‚†jž·`„užÑŸžÖ`„tžã`„tj`„x]„v_Jžìxžòvžì.^ƒŠ]„v_ƒ½‚†€žúÀueŸÀup^`„t`„t]„v_…Ådîe]eÊfJfÊg5g©hh€hÓiwiójkk±l3lÀmamñnnìoXoÇpp qq¹r2r”rîs{t?t´uAuÛ"ƒä ŸäŸê§È ‚à `„u[]ƒ‹_]„ë_ƒç  M R€^ƒŠj 5`„u]„ë_ƒû  W ] †  j † r]„ë_]ƒä_?ƒç€ ‚ÀvÔ  ]ƒ±ƒé ¢Ã¢û£A‚Ýj¢Ä`„¹&££ `„u[£]„ë[]„ë_J£x£€£Àw6k_a]„ë_„øƒê £$£5£U@€Ÿj£%`„u£8£U£; _`„J£Ex£Kv£E.^ƒŠ]„ë_ƒç€Ÿ€£OÀwœa_`„„íƒë £Z£k£¨@cj£[`„u£q£¨£~"]„‘_\>£ˆ£¨=x£”v£Ž.^ƒŠ]„ë_ƒçc€£›Àx a]„‘_\…¤ƒì £­£À£Ü@kj£®`„u£Ç£Ü`„u[]„ë_J£Íx£Óv£Í.^ƒŠ]„ë_ƒçk_a]„ë_„øƒí £á£ò¤@nj£â`„u£÷¤\>£ú¤=x¤v¤.^ƒŠ]„ë_ƒçna\…Æƒî ¤¤'¤g@€Ñj¤`„u¤2¤g¤Eb]„‘`„u`„J¤Ox¤Uv¤O.^ƒŠ]„ë_ƒç€Ñ€¤aÀy=a]„‘`„u`„…Çƒï ¤l¤¤¸@€Ûj¤m`„u¤‰¤¸¤—b]„ë`„u]„ë_J¤¡x¤§v¤¡.^ƒŠ]„ë_ƒç€Û€¤²Àyµa]„ë`„u]„ë_…ȃ𠤽¤Ð¥ @€Új¤¾`„u¤Ü¥ ¤êb]„ë`„u]„ë_J¤ôx¤úv¤ô.^ƒŠ]„ë_ƒç€Ú€¥Àz7a]„ë`„u]„ë_…Ƀñ ¥¥!¥Q@€Ój¥`„u¥'¥Q¥0`„u_J¥<x¥Bv¥<.^ƒŠ]„ë_ƒç€Ó€¥IÀz¹a`„u_…£ƒò ¥V¥g¥“@{j¥W`„u¥m¥“¥v `„u`„J¥€x¥†v¥€.^ƒŠ]„ë_ƒç{€¥À{&a`„u`„…ƒó ¥˜¥©¥ò@€Íj¥™`„u¥²¥ò¥Å"]„‘`„u\>¥Ï¥ò=x¥Ûv¥Õ.^ƒŠ]„ë_ƒç€Í€¥åÀ{“a]„‘`„u\…ʃô ¥÷¦¦L@|j¥ø`„u¦¦L¦%}a_`„\>¦+¦L=x¦7v¦1.^ƒŠ]„ë_ƒç|€¦CÀ|aa_`„\…˃õ ¦Q¦b¦«@€Îj¦R`„u¦k¦«¦~"]„‘`„u\>¦ˆ¦«=x¦”v¦Ž.^ƒŠ]„ë_ƒç€Î€¦žÀ|a]„‘`„u\…̃ö ¦°¦Ñ¦é@~j¦±`„¹j¦¿`„u¦Ú¦é`„u[]„ë_J¦àx¦à.k_a]„ë_ƒìƒ÷ ¦î¦ÿ§C@€“j¦ï`„u§ §C§}a_`„\>§"§C=x§.v§(.^ƒŠ]„ë_ƒç€“€§:À}Vaa_`„\…̓ø §H§[§„@€Ùj§I`„u§`§„§hb]„ë_]„ë_J§rx§xv§r.^ƒŠ]„ë_ƒç€Ù€§~À}Ïa]„ë_]„ë_…΃ù §‰§œ§Æ@€Øj§Š`„u§¡§Æ]„ë_J§§§§ƒû_x§¾v§¸.^ƒŠ]„ë_ƒç€Øa]„ë_…Ïw wxwæxYxÆyy‘zz•{{o{ä|[|Ð}2}«~-~œƒü ¨³¨¹¯7 ‚á `„u[]ƒ‹_]…—_ƒÿ ©&©+€^ƒŠj© `„u]…—_„ ©0©6©e ©E©e©O‚¡]…—_]ƒü_?ƒÿ€©`ÀQ ©6ƒ± „ «¨«ä¬ A‚Ýj«©`„¹(«ì¬  `„u[«ó]…—[]…—_J«üx¬€«üÀ³k_a]…—_…Ñ„ ¬¬ ¬G@€Ÿj¬`„u¬#¬G¬& _\>¬-¬G=x¬9v¬3.^ƒŠ]…—_ƒÿ€Ÿ€¬=À€a_\…Ò„ ¬L¬]¬š@cj¬M`„u¬c¬š¬pü]„‘_\>¬z¬š=x¬†v¬€.^ƒŠ]…—_ƒÿc€¬À€ƒa]„‘_\…Ó„ ¬Ÿ¬°¬á@‚«j¬ `„u¬¸¬á¬» _\>¬Â¬á=x¬Îv¬È.^ƒŠ]…—_ƒÿ‚«€¬×À€øa_\…Ô„ ¬æ¬÷­&@‚ªj¬ç`„u¬þ­&­ _\>­­&=x­v­.^ƒŠ]…—_ƒÿ‚ª€­Àca_\…Õ„ ­+­@­\@kj­,`„u­G­\`„u[]…—_J­Mx­Sv­M.^ƒŠ]…—_ƒÿk_a]…—_…Ñ„ ­a­r­‘@nj­b`„u­w­‘\>­z­‘=x­†v­€.^ƒŠ]…—_ƒÿna\…Ö„ ­–­§­Õ@{j­—`„u­­­Õ­¶`„u`„J­Áx­Çv­Á.^ƒŠ]…—_ƒÿ{€­ÎÀ‚a`„u`„…ׄ ­Ú­ë®/@|j­Û`„u­ö®/®}a_`„\>®®/=x®v®.^ƒŠ]…—_ƒÿ|€®&À‚úaa_`„\…Ø„ ®4®E®‰@€“j®5`„u®P®‰®b}a_`„\>®h®‰=x®tv®n.^ƒŠ]…—_ƒÿ€“€®€Àƒraa_`„\…Ù„ ®Ž®±®É@~j®`„¹j®`„u®º®É`„u[]…—_J®Àx®À.k_a]…—_„„ ®Î®Ü¯@‚Jj®Ï`„u®ç¯_J®íx®óv®í.^ƒŠ]…—_ƒÿ‚Ja_…Ú„ ¯¯¯5@?j¯`„u¯¯5_J¯#x¯)v¯#.^ƒŠ]…—_ƒÿ?a_…Û†õ€`€Ô?ª‚‚j‚׃NƒÇ„)„„Ù „ °(°.º ‚â`„u[[`„u[`„u]„˜__„ °k°p€^ƒŠ]„˜__„. °u°{°§ °ˆ°§°“]„˜__]„__?„€°£À…‚ °{„›„ ³³P³zA‚Ýj³`„¹*³[³z`„u[[`„u[³`]„˜[[]„˜__J³ix³n€³iÀ…õk__a]„˜__„©„ ³³—³´@j³€`„u³™³´³¢`„u_J³ªx³¯v³ª.^ƒŠ]„˜__„€³°À†ga`„u_„„ ³¹³Ó´@(j³º`„u³Ö´³Ù_³à _\>³ç´=x³òv³í.^ƒŠ]„˜__„(€³óÀ†×³úÀ†âa__\„£„ ´´´N@cj´ `„u´´N´*b]„˜__\>´1´N=x´=v´7.^ƒŠ]„˜__„c€´DÀ‡Za]„˜__\…„ ´S´d´´@gj´T`„u´n´´´ˆh]„‘]„™__\>´‘´´=x´v´—.^ƒŠ]„˜__„g€´¨À‡Ùa]„‘]„™__\„¨„ ´¹´Ê´é@nj´º`„u´Ï´é\>´Ò´é=x´Þv´Ø.^ƒŠ]„˜__„na\„ª„! ´îµµ,@kj´ï`„uµµ,l`„u[m`„u[]„˜__Jµxµvµ.^ƒŠ]„˜__„k__a]„˜__„©„" µ1µBµt@ojµ2`„uµMµtµV`„u`„Jµ^xµdvµ^.^ƒŠ]„˜__„o€µpÀ‰?a`„u`„„«„# µyµŠµÄ@pjµz`„uµ—µÄµ  `„u`„Jµªxµ°vµª.^ƒŠ]„˜__„p€µ¾À‰¯a`„u`„…Ü„ µÉµò¶ @hjµÊ`„uµú¶ ]„‘]„™__Jµýv¶vµý.^ƒŠ]„˜__„h]„‘]„™__„±„$ ¶¶ ¶Y@fj¶`„u¶'¶Y¶<sa__\\>¶?¶Y=x¶Kv¶E.^ƒŠ]„˜__„f€¶SÀŠaa__\\„¤„ ¶^¶s¶‹@tj¶_`„u¶{¶‹`„J¶~v¶„v¶~.^ƒŠ]„˜__„t`„„²„ ¶¶¥¶Ã@uj¶‘`„u¶°¶Ã`„J¶³v¶¹v¶³.^ƒŠ]„˜__„u`„„³„ ¶È¶ä¶ö@vj¶É`„u¶é¶ö]„‘_J¶ìv¶òv¶ì.^ƒŠ]„˜__„v]„‘_„ç„ ¶û··%@j¶ü`„u··%`„tJ·v·v·.^ƒŠ]„˜__„`„t„´„% ·*·B·–@ij·+`„u·M·–l`„u[m`„u[·nwa__]„™__]„˜__J·‚x·ˆv·‚.^ƒŠ]„˜__„i__€·ŒÀŒnaa__]„™__]„˜__„µ„& ·›·©·ü@yj·œ`„u·´·ü··_·Éza__J·Üx·âv·Ü.^ƒŠ]„˜__„y€·îÀ ·óÀ+a_a__„¶„' ¸¸¸8@{j¸`„u¸¸8¸`„u_J¸'x¸-v¸'.^ƒŠ]„˜__„{€¸4À¬a`„u_„·„( ¸=¸N¸Ž@|j¸>`„u¸Y¸Ž¸n}a__`„\J¸wx¸}v¸w.^ƒŠ]„˜__„|€¸‰ÀŽaa__`„\„¸„) ¸“¸­¸Ï@~j¸”`„¹¸»¸Ïl`„u[m`„u[]„˜__J¸Áx¸Á.k__a]„˜__„!„ ¸Ô¸ð¹@qj¸Õ`„u¸÷¹]„‘_J¸úv¹v¸ú.^ƒŠ]„˜__„q]„‘_„­„* ¹ ¹¹<@€‚j¹ `„u¹&¹<`„¾J¹,x¹2v¹,.^ƒŠ]„˜__„€‚a`„¾…Ý„+ ¹A¹O¹Ã@j¹B`„u¹U¹Ã¹X_¹ka__¹‚za_j`„x_J¹–x¹œv¹–.^ƒŠ]„˜__„€¹£Àù¨ÀÎz‚¹ºÀá^_a__za__„¼„, ¹È¹Ùº@€j¹É`„u¹âº¹ôa___\J¹ÿxºv¹ÿ.^ƒŠ]„˜__„€€ºÀƒaa___\„½…¿†D†´‡7‡¶ˆ?ˆ–‰‰Œ‰üŠjŠç‹9‹‹‹çŒ9Œý‰ùŽyŽèD _á„/ »‹»‘ÀDë-‚ã `„u[]ƒ‹_]ƒi_„= ]„/_? ƒ± „1 »‘»‘€Âk„ø€Ì`„u[]„ë_„2 ‘-‘>‘V@€Ÿj‘.`„u‘A‘V‘D _`„J‘N‘Nƒl„3 ‘´‘Å‘í@cj‘µ`„u‘Ë‘í‘Ø"]„‘_\J‘å‘åƒl„4 ’K’\’}@{j’L`„u’b’}’k `„u`„J’u’uƒl„5 ’Û’ì“@€Íj’Ü`„u’õ“’ÿ"]„‘[\J“ “ ƒl„6 “r“ƒ“«@€Îj“s`„u“Œ“«“–"]„‘[\J“£“£ƒl„7 ” ””H@|j” `„u”%”H”7}a_`„\J”@”@ƒl„8 ”¦”·”å@€“j”§`„u””å”Ô}a_`„\J”Ý”݃l„9 •C•T•g@nj•D`„u•Y•g\J•_•_ƒl„; tÏA€ƒ'‡Ïb>ŠÏ=0–„Ö'€Ï‘¦‘Ö’’]’Ÿ’á“#“i“°“ä” „> »‹»‘ÀDë‚ä `„u[]„/_„A »ü¼€‚僊]„˜_[„Q ¼ ¼ ¼!¼¼!¼‚å]„˜_[]„>_?„A€À”© ¼ „= „B ¼&¼B¼X@^ƒŠj¼'`„u¼H¼X]„‘_J¼Kv¼Tv¼K.‚僊]„˜_[„Av]„‘_„ç„G ¼]¼p¼ì@kj¼^`„u¼w¼ì`„u[]„ë_>¼z¼ìI¼€%¼‰.]„>_>¼š¼ÃJ¼¢&¼®.]„>_?J¼É¼Ô…Þ__.„H ¼ñ½½<@€†j¼ò`„u½ ½<½`„u`„J½x½(v½.‚僊]„˜_[„Ao€½4À•Üa`„u`„„«„C ½A½V½q@tj½B`„u½^½q`„J½av½jv½a.‚僊]„˜_[„At`„„²„D ½v½‹½¬@uj½w`„u½–½¬`„J½™v½¢v½™.‚僊]„˜_[„Au`„„³„E ½±½Å½Þ@j½²`„u½Ì½Þ`„tJ½Ïv½Øv½Ï.‚僊]„˜_[„A`„t„´„I ½ã½ö¾@€‚j½ä`„u½þ¾`„¾J¾¾ …à.„J ¾"¾3¾p@€Ñj¾#`„u¾>¾p¾Qb]„‘`„u`„J¾[x¾a€¾[À—t€‡y¾g.€†a`„u`„„Haa`„u`„`„„Ê„K ¿ðÀ@À@_@€Ûj¿ñ`„uÀ@ À@_À@b]„ë`„u]„ë_JÀ@+xÀ@XxÀ@+.|4À@1À@1À@VÀ@2_`„JÀ@>!xÀ@E€À@?À—÷€†À@NÀ˜Ca`„u`„…aa_`„]„‘_ƒ­€Øa]„ë_…Ÿ„L ÀAÝÀAðÀB1@€ÚjÀAÞ`„uÀAüÀB1ÀB b]„ë`„u]„ë_JÀBxÀB*xÀB.|yÀB €ÀBÀ˜ë€†a`„u`„…aa_`„]„‘_ƒ­€Øa]„ë_…Ÿ„M ÀB‘ÀBŸÀBý@€ÓjÀB’`„uÀB¥ÀBýÀB®`„u_JÀBÀ0ÀBÀÀBÆ„Ö'‚æ„N ÀCÀC#ÀCJ@~jÀC`„¹jÀC`„uÀC,ÀCJ`„u[]„ë_JÀC2ÀC6…Þ__.„O ÀD©ÀD¼ÀDé@€ÙjÀDª`„uÀDÁÀDéÀDÉb]„ë_]„ë_JÀDÓ5ÀDÓÀDÓ]„ë_xÀDÓ.€Øa]„ë_ƒ¬R=xÀDÜÀDÓÀšc€ÀDãÀšga]„‘_\…¤ÀDÓÀš”Þ•:•¸–'–w–Ç——P—˘»™r™Ïš7šù „R ÀIÀIÀYR‚ç`„u[[`„u[]ƒ‹_]„ë_„U ÀIrÀIz€‚僊]„˜__„V ÀI’ÀIž€‚胊a__„n ÀJ®ÀJ®ÀJÛÀJ¹ÀJÛÀJ¿‚å]„˜__ÀJ΂èa__]„R__?„U€À›Ø„VÀ›ï ÀJ®ƒ±„W ÀJàÀJüÀK@^ƒŠjÀJá`„uÀKÀK]„‘_JÀKvÀKvÀK.‚僊]„˜__„Uq]„‘_„­„\ ÀKÀK,ÀKœ@kjÀK`„uÀK3ÀKœ`„u[]„ë_>ÀK6ÀKœIÀK<%ÀKE.]„ë_>ÀKPÀKsJÀKX&ÀKd.]„ë_?JÀKyÀK„…Þ__.„] ÀK¡ÀK²ÀLA@€†jÀK¢`„uÀKºÀLAÀKÃ`„u`„>ÀKÌÀLAIÀKÒ!%ÀKÞ€ÀKÖÀv_JÀKå*?NÀKûÀKÿ_5ÀLÀL_ÀLÀv_}ÀL vÀL.‚胊a__„VÀLÀËa__JÀLxÀL-vÀL$.‚僊]„˜__„UoÀL9À¶a`„u`„„«„X ÀLFÀL[ÀLv@tjÀLG`„uÀLcÀLv`„JÀLfvÀLovÀLf.‚僊]„˜__„Ut`„„²„Y ÀL{ÀLÀL±@ujÀL|`„uÀL›ÀL±`„JÀLžvÀL§vÀLž.‚僊]„˜__„Uu`„„³„Z ÀL¶ÀLÊÀLã@jÀL·`„uÀLÑÀLã`„tJÀLÔvÀLÝvÀLÔ.‚僊]„˜__„U`„t„´„^ ÀLèÀLûÀM@€‚jÀLé`„uÀMÀM`„¾JÀM xÀMxÀM .€Øa]„ë_ƒ¬€‚a`„¾…H„_ ÀM ÀM1ÀMä@€ŸjÀM!`„uÀM4ÀMäÀM7 _`„>ÀM>ÀMäNÀMHÀML_5ÀM[ÀM[_€ÀM[À 2}ÀMZvÀMN.‚胊a__„VÀM[À fa__NÀMkÀMr€Ä`„*=xÀMˆvÀM.‚僊]„˜__„UyÀM”À Q4ÀM™ÀM™ÀMÌ_>ÀMœÀMË=ŠÀM¤À ´)JÀM¹€ÀMÀÀ 2a_a__„¶JÀMÓ‚ÀMÚÀ ´„` ÀMéÀMúÀN/@cjÀMê`„uÀNÀN/ÀN "]„‘_\JÀNxÀN#€ÀNÀ¡‰fyÀN+.€Ÿa_`„„_aa_\\…©„a ÀN4ÀNEÀN`@njÀN5`„uÀNJÀN`\JÀNPxÀNYvÀNP.‚僊]„˜__„Una\„ª„b ÀNeÀNvÀN³@€ÑjÀNf`„uÀNÀN³ÀN”b]„‘`„u`„JÀNžxÀN¤€ÀNžÀ¢w€‡yÀNª.€†a`„u`„„]aa`„u`„`„„Ê„c ÀP3ÀPFÀP¢@€ÛjÀP4`„uÀPPÀP¢ÀP^b]„ë`„u]„ë_JÀPnxÀP›xÀPn.|4ÀPtÀPtÀP™ÀPu_`„JÀP!xÀPˆ€ÀP‚À£€†ÀP‘À£Ta`„u`„…aa_`„]„‘_ƒ­€Øa]„ë_…Ÿ„d ÀR ÀR3ÀRt@€ÚjÀR!`„uÀR?ÀRtÀRMb]„ë`„u]„ë_JÀRWxÀRmxÀRW.|yÀRc€ÀR]À£ü€†a`„u`„…aa_`„]„‘_ƒ­€Øa]„ë_…Ÿ„e ÀRyÀRˆÀS@€ÓjÀRz`„uÀRŽÀSÀR—`„u_>ÀR ÀSIÀR¦!%ÀR²€ÀRªÀ¤³_JÀR¹+?NÀRÎÀRÒ_5ÀRáÀRá_ÀRáÀ¤³_}ÀRàvÀRÔ.‚胊a__„VÀRáÀ¥a__JÀRðxÀRÿvÀR÷.‚僊]„˜__„UÀSÀ¤óa`„u_„„f ÀS ÀSÀSâ@{jÀS`„uÀS$ÀSâÀS-`„u`„>ÀS6ÀSâIÀSÀTOÀU @|jÀT?`„uÀTZÀU ÀTl}a_`„\>ÀTrÀU NÀT|ÀT…‚é]„v[ÀT‡…[“=xÀT˜vÀT.‚僊]„˜__„Uf4ÀT ÀT ÀTÞÀT¡_ÀT¦ _\>ÀT­ÀTÝIÀTµ}ÀT½€ÀT¹À§½ƒÀT¾À¨Ha_`„=xÀTÏÀTÆÀ§à€Ÿ‚ÀTÓÀ¨;a[\…?aa__\\„¤=xÀTîÀTåÀ§àfyÀTÿvÀTö.‚僊]„˜__„U{a`„u_„·aa[\\…©„i ÀUÀU ÀVú@€ÎjÀU`„uÀU)ÀVúÀU<"]„‘`„u\>ÀUFÀVúNÀUPÀU_‚ê]„ë_ÀUa…á_>NÀUŒ€˜]„Å`„uvÀUŒ€ÀUŒÀ©N€…]„Å`„u„ÇExÀUŒ‚À©™€Œa`„„Î>NÀU`„uvÀU–‚À©™V`„u„ÐA>ÀU–ÀVMIÀUž!%ÀUªƒÀU¢À©ð_BÀU±?NÀUÅÀUÉ_5ÀUØÀUØ_ÀUØÀ©ð_}ÀU×vÀUË.‚胊a__„V„ÀUØÀªRa__IÀUé!xÀU÷vÀUî.‚僊]„˜__„Uo„ÀVÀª=a`„u`„„«BÀV ?=xÀV(ÀVÀ©o€Ÿ5ÀV:ÀV4_xÀV4vÀV,.‚僊]„˜__„U„ÀV5Àª=a`„u_„#ÀV4…ÀV4À« 5`„x+#†À«g&ÀVB†À«g_À«g__ÀV4À« _`„u_a_`„„íNÀVXÀVe‚ë]„v[ÀVg…[“=xÀVxvÀVo.‚僊]„˜__„Uf4ÀV€ÀV€ÀVÊÀV‚ì_ÀV„‚í_\>ÀV‡ÀVÉIÀV!xÀV£ÀV”À©o€†„ÀV¬À¬-a`„u`„…=xÀV½‚ÀV°À«Ä€ŸƒÀVÁÀ¬a[\…?aa__\\„¤=xÀVÞ‚ÀVÑÀ«ÄfyÀVïvÀVæ.‚僊]„˜__„U{a`„u_„·aa[\\…©„j ÀVÿÀWÀWd@€“jÀW`„uÀWÀWdÀW-}a_`„\JÀW<xÀW<.|4ÀWHÀWHÀWcÀWI_`„JÀWU!}ÀWZ€ÀWVÀ­;ÀW[À­ya_`„aa_`„\„h„k ÀWiÀWŠÀW±@~jÀWj`„¹jÀWx`„uÀW“ÀW±`„u[]„ë_JÀW™ÀW…Þ__.„l ÀYÀY#ÀYP@€ÙjÀY`„uÀY(ÀYPÀY0b]„ë_]„ë_JÀY:5ÀY:ÀY:]„ë_xÀY:.€Øa]„ë_ƒ¬R=xÀYCÀY:À®c€ÀYJÀ®fa]„‘_\…¤ÀY:À®œ7œ¨FžbžÇŸ,Ÿ‘ ¡Z¡à¢G¢Ø£Ì¤ƒ¥Ÿ§§Ž©­ ­Î®6®ø ¯XS^cAdQvl~é…‘J”N›6¯U ¯X\file:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/collection.dartƒÒ// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. export 'src/algorithms.dart' show binarySearch, insertionSort, lowerBound, mergeSort, shuffle, reverse; export 'src/canonicalized_map.dart'; export 'src/combined_wrappers/combined_iterable.dart'; export 'src/combined_wrappers/combined_list.dart'; export 'src/combined_wrappers/combined_map.dart'; export 'src/comparators.dart'; export 'src/equality.dart'; export 'src/equality_map.dart'; export 'src/equality_set.dart'; export 'src/functions.dart'; export 'src/iterable_extensions.dart'; export 'src/iterable_zip.dart'; export 'src/list_extensions.dart'; export 'src/priority_queue.dart'; export 'src/queue_list.dart'; export 'src/union_set.dart'; export 'src/union_set_controller.dart'; export 'src/unmodifiable_wrappers.dart'; export 'src/wrappers.dart'; NN<O%732 ' #"()"package:collection/collection.dart`file:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/algorithms.dartÀAG// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// A selection of data manipulation algorithms. library pkg.collection.algorithms; import 'dart:math' show Random; import 'utils.dart'; /// Returns a position of the [value] in [sortedList], if it is there. /// /// If the list isn't sorted according to the [compare] function, the result /// is unpredictable. /// /// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on /// the objects. In this case, the objects must be [Comparable]. /// /// Returns -1 if [value] is not in the list. int binarySearch(List sortedList, E value, {int Function(E, E)? compare}) { compare ??= defaultCompare; return binarySearchBy(sortedList, identity, compare, value); } /// Returns a position of the [value] in [sortedList], if it is there. /// /// If the list isn't sorted according to the [compare] function on the [keyOf] /// property of the elements, the result is unpredictable. /// /// Returns -1 if [value] is not in the list by default. /// /// If [start] and [end] are supplied, only that range is searched, /// and only that range need to be sorted. int binarySearchBy(List sortedList, K Function(E element) keyOf, int Function(K, K) compare, E value, [int start = 0, int? end]) { end = RangeError.checkValidRange(start, end, sortedList.length); var min = start; var max = end; var key = keyOf(value); while (min < max) { var mid = min + ((max - min) >> 1); var element = sortedList[mid]; var comp = compare(keyOf(element), key); if (comp == 0) return mid; if (comp < 0) { min = mid + 1; } else { max = mid; } } return -1; } /// Returns the first position in [sortedList] that does not compare less than /// [value]. /// /// If the list isn't sorted according to the [compare] function, the result /// is unpredictable. /// /// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on /// the objects. In this case, the objects must be [Comparable]. /// /// Returns [sortedList.length] if all the items in [sortedList] compare less /// than [value]. int lowerBound(List sortedList, E value, {int Function(E, E)? compare}) { compare ??= defaultCompare; return lowerBoundBy(sortedList, identity, compare, value); } /// Returns the first position in [sortedList] that is not before [value]. /// /// Elements are compared using the [compare] function of the [keyOf] property of /// the elements. /// If the list isn't sorted according to this order, the result is unpredictable. /// /// Returns [sortedList.length] if all the items in [sortedList] are before [value]. /// /// If [start] and [end] are supplied, only that range is searched, /// and only that range need to be sorted. int lowerBoundBy(List sortedList, K Function(E element) keyOf, int Function(K, K) compare, E value, [int start = 0, int? end]) { end = RangeError.checkValidRange(start, end, sortedList.length); var min = start; var max = end; var key = keyOf(value); while (min < max) { var mid = min + ((max - min) >> 1); var element = sortedList[mid]; var comp = compare(keyOf(element), key); if (comp < 0) { min = mid + 1; } else { max = mid; } } return min; } /// Shuffles a list randomly. /// /// A sub-range of a list can be shuffled by providing [start] and [end]. /// /// If [start] or [end] are omitted, /// they default to the start and end of the list. /// /// If [random] is omitted, it defaults to a new instance of [Random]. void shuffle(List elements, [int start = 0, int? end, Random? random]) { random ??= Random(); end ??= elements.length; var length = end - start; while (length > 1) { var pos = random.nextInt(length); length--; var tmp1 = elements[start + pos]; elements[start + pos] = elements[start + length]; elements[start + length] = tmp1; } } /// Reverses a list, or a part of a list, in-place. void reverse(List elements, [int start = 0, int? end]) { end = RangeError.checkValidRange(start, end, elements.length); _reverse(elements, start, end); } /// Internal helper function that assumes valid arguments. void _reverse(List elements, int start, int end) { for (var i = start, j = end - 1; i < j; i++, j--) { var tmp = elements[i]; elements[i] = elements[j]; elements[j] = tmp; } } /// Sort a list between [start] (inclusive) and [end] (exclusive) using /// insertion sort. /// /// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on /// the objects. In this case, the objects must be [Comparable]. /// /// Insertion sort is a simple sorting algorithm. For `n` elements it does on /// the order of `n * log(n)` comparisons but up to `n` squared moves. The /// sorting is performed in-place, without using extra memory. /// /// For short lists the many moves have less impact than the simple algorithm, /// and it is often the favored sorting algorithm for short lists. /// /// This insertion sort is stable: Equal elements end up in the same order /// as they started in. void insertionSort(List elements, {int Function(E, E)? compare, int start = 0, int? end}) { // If the same method could have both positional and named optional // parameters, this should be (list, [start, end], {compare}). compare ??= defaultCompare; end ??= elements.length; for (var pos = start + 1; pos < end; pos++) { var min = start; var max = pos; var element = elements[pos]; while (min < max) { var mid = min + ((max - min) >> 1); var comparison = compare(element, elements[mid]); if (comparison < 0) { max = mid; } else { min = mid + 1; } } elements.setRange(min + 1, pos + 1, elements, min); elements[min] = element; } } /// Generalized insertion sort. /// /// Performs insertion sort on the [elements] range from [start] to [end]. /// Ordering is the [compare] of the [keyOf] of the elements. void insertionSortBy(List elements, K Function(E element) keyOf, int Function(K a, K b) compare, [int start = 0, int? end]) { end = RangeError.checkValidRange(start, end, elements.length); _movingInsertionSort(elements, keyOf, compare, start, end, elements, start); } /// Limit below which merge sort defaults to insertion sort. const int _mergeSortLimit = 32; /// Sorts a list between [start] (inclusive) and [end] (exclusive) using the /// merge sort algorithm. /// /// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on /// the objects. If any object is not [Comparable], that throws a [TypeError]. /// /// Merge-sorting works by splitting the job into two parts, sorting each /// recursively, and then merging the two sorted parts. /// /// This takes on the order of `n * log(n)` comparisons and moves to sort /// `n` elements, but requires extra space of about the same size as the list /// being sorted. /// /// This merge sort is stable: Equal elements end up in the same order /// as they started in. void mergeSort(List elements, {int start = 0, int? end, int Function(E, E)? compare}) { end = RangeError.checkValidRange(start, end, elements.length); compare ??= defaultCompare; var length = end - start; if (length < 2) return; if (length < _mergeSortLimit) { insertionSort(elements, compare: compare, start: start, end: end); return; } // Special case the first split instead of directly calling // _mergeSort, because the _mergeSort requires its target to // be different from its source, and it requires extra space // of the same size as the list to sort. // This split allows us to have only half as much extra space, // and allows the sorted elements to end up in the original list. var firstLength = (end - start) >> 1; var middle = start + firstLength; var secondLength = end - middle; // secondLength is always the same as firstLength, or one greater. var scratchSpace = List.filled(secondLength, elements[start]); // TODO(linter/2097): Remove ignore when no longer required by linter. // See: https://github.com/dart-lang/linter/issues/2097 E Function(E) id = identity; // ignore: omit_local_variable_types _mergeSort(elements, id, compare, middle, end, scratchSpace, 0); var firstTarget = end - firstLength; _mergeSort(elements, id, compare, start, middle, elements, firstTarget); _merge(id, compare, elements, firstTarget, end, scratchSpace, 0, secondLength, elements, start); } /// Sort [elements] using a merge-sort algorithm. /// /// The elements are compared using [compare] on the value provided by [keyOf] /// on the element. /// If [start] and [end] are provided, only that range is sorted. /// /// Uses insertion sort for smaller sublists. void mergeSortBy(List elements, K Function(E element) keyOf, int Function(K a, K b) compare, [int start = 0, int? end]) { end = RangeError.checkValidRange(start, end, elements.length); var length = end - start; if (length < 2) return; if (length < _mergeSortLimit) { _movingInsertionSort(elements, keyOf, compare, start, end, elements, start); return; } // Special case the first split instead of directly calling // _mergeSort, because the _mergeSort requires its target to // be different from its source, and it requires extra space // of the same size as the list to sort. // This split allows us to have only half as much extra space, // and it ends up in the original place. var middle = start + (length >> 1); var firstLength = middle - start; var secondLength = end - middle; // secondLength is always the same as firstLength, or one greater. var scratchSpace = List.filled(secondLength, elements[start]); _mergeSort(elements, keyOf, compare, middle, end, scratchSpace, 0); var firstTarget = end - firstLength; _mergeSort(elements, keyOf, compare, start, middle, elements, firstTarget); _merge(keyOf, compare, elements, firstTarget, end, scratchSpace, 0, secondLength, elements, start); } /// Performs an insertion sort into a potentially different list than the /// one containing the original values. /// /// It will work in-place as well. void _movingInsertionSort( List list, K Function(E element) keyOf, int Function(K, K) compare, int start, int end, List target, int targetOffset) { var length = end - start; if (length == 0) return; target[targetOffset] = list[start]; for (var i = 1; i < length; i++) { var element = list[start + i]; var elementKey = keyOf(element); var min = targetOffset; var max = targetOffset + i; while (min < max) { var mid = min + ((max - min) >> 1); if (compare(elementKey, keyOf(target[mid])) < 0) { max = mid; } else { min = mid + 1; } } target.setRange(min + 1, targetOffset + i + 1, target, min); target[min] = element; } } /// Sorts [elements] from [start] to [end] into [target] at [targetOffset]. /// /// The `target` list must be able to contain the range from `start` to `end` /// after `targetOffset`. /// /// Allows target to be the same list as [elements], as long as it's not /// overlapping the `start..end` range. void _mergeSort( List elements, K Function(E element) keyOf, int Function(K, K) compare, int start, int end, List target, int targetOffset) { var length = end - start; if (length < _mergeSortLimit) { _movingInsertionSort( elements, keyOf, compare, start, end, target, targetOffset); return; } var middle = start + (length >> 1); var firstLength = middle - start; var secondLength = end - middle; // Here secondLength >= firstLength (differs by at most one). var targetMiddle = targetOffset + firstLength; // Sort the second half into the end of the target area. _mergeSort(elements, keyOf, compare, middle, end, target, targetMiddle); // Sort the first half into the end of the source area. _mergeSort(elements, keyOf, compare, start, middle, elements, middle); // Merge the two parts into the target area. _merge(keyOf, compare, elements, middle, middle + firstLength, target, targetMiddle, targetMiddle + secondLength, target, targetOffset); } /// Merges two lists into a target list. /// /// One of the input lists may be positioned at the end of the target /// list. /// /// For equal object, elements from [firstList] are always preferred. /// This allows the merge to be stable if the first list contains elements /// that started out earlier than the ones in [secondList] void _merge( K Function(E element) keyOf, int Function(K, K) compare, List firstList, int firstStart, int firstEnd, List secondList, int secondStart, int secondEnd, List target, int targetOffset) { // No empty lists reaches here. assert(firstStart < firstEnd); assert(secondStart < secondEnd); var cursor1 = firstStart; var cursor2 = secondStart; var firstElement = firstList[cursor1++]; var firstKey = keyOf(firstElement); var secondElement = secondList[cursor2++]; var secondKey = keyOf(secondElement); while (true) { if (compare(firstKey, secondKey) <= 0) { target[targetOffset++] = firstElement; if (cursor1 == firstEnd) break; // Flushing second list after loop. firstElement = firstList[cursor1++]; firstKey = keyOf(firstElement); } else { target[targetOffset++] = secondElement; if (cursor2 != secondEnd) { secondElement = secondList[cursor2++]; secondKey = keyOf(secondElement); continue; } // Second list empties first. Flushing first list here. target[targetOffset++] = firstElement; target.setRange(targetOffset, targetOffset + (firstEnd - cursor1), firstList, cursor1); return; } } // First list empties first. Reached by break above. target[targetOffset++] = secondElement; target.setRange( targetOffset, targetOffset + (secondEnd - cursor2), secondList, cursor2); } /// Sort [elements] using a quick-sort algorithm. /// /// The elements are compared using [compare] on the elements. /// If [start] and [end] are provided, only that range is sorted. /// /// Uses insertion sort for smaller sublists. void quickSort(List elements, int Function(E a, E b) compare, [int start = 0, int? end]) { end = RangeError.checkValidRange(start, end, elements.length); _quickSort(elements, identity, compare, Random(), start, end); } /// Sort [elements] using a quick-sort algorithm. /// /// The elements are compared using [compare] on the value provided by [keyOf] /// on the element. /// If [start] and [end] are provided, only that range is sorted. /// /// Uses insertion sort for smaller sublists. void quickSortBy( List list, K Function(E element) keyOf, int Function(K a, K b) compare, [int start = 0, int? end]) { end = RangeError.checkValidRange(start, end, list.length); _quickSort(list, keyOf, compare, Random(), start, end); } void _quickSort(List list, K Function(E element) keyOf, int Function(K a, K b) compare, Random random, int start, int end) { const minQuickSortLength = 24; var length = end - start; while (length >= minQuickSortLength) { var pivotIndex = random.nextInt(length) + start; var pivot = list[pivotIndex]; var pivotKey = keyOf(pivot); var endSmaller = start; var startGreater = end; var startPivots = end - 1; list[pivotIndex] = list[startPivots]; list[startPivots] = pivot; while (endSmaller < startPivots) { var current = list[endSmaller]; var relation = compare(keyOf(current), pivotKey); if (relation < 0) { endSmaller++; } else { startPivots--; var currentTarget = startPivots; list[endSmaller] = list[startPivots]; if (relation > 0) { startGreater--; currentTarget = startGreater; list[startPivots] = list[startGreater]; } list[currentTarget] = current; } } if (endSmaller - start < end - startGreater) { _quickSort(list, keyOf, compare, random, start, endSmaller); start = startGreater; } else { _quickSort(list, keyOf, compare, random, startGreater, end); end = endSmaller; } length = end - start; } _movingInsertionSort(list, keyOf, compare, start, end, list, start); } ÑNN<1# GMPA.1%EGP;9D+J)!C(#-  O MPANPCKRSUD+H)!C(#- J%3GI&&6%4?A%;96HPANK?OCK(>FA0!*88 K>J$!AO= MPOJ8JNG$>A"G >??+AD($#EDI:DC'KQ2OB.F$!A"Q >??+A+&$#EDF'NF&J(#!!  &%#% *9ALNI(!  " E &$#@1;K:I/IH)F FK;! "!#+&-(--J+& ."/*>-I7*P2?B.D!AG2OB.O!=:AI!)5"!*'&8).(2 '3C CM&package:collection/src/algorithms.dartgfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/canonicalized_map.dart“À// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; /// A map whose keys are converted to canonical values of type `C`. /// /// This is useful for using case-insensitive String keys, for example. It's /// more efficient than a [LinkedHashMap] with a custom equality operator /// because it only canonicalizes each key once, rather than doing so for each /// comparison. class CanonicalizedMap implements Map { final C Function(K) _canonicalize; final bool Function(K)? _isValidKeyFn; final _base = >{}; /// Creates an empty canonicalized map. /// /// The [canonicalize] function should return the canonical value for the /// given key. Keys with the same canonical value are considered equivalent. /// /// The [isValidKey] function is called before calling [canonicalize] for /// methods that take arbitrary objects. It can be used to filter out keys /// that can't be canonicalized. CanonicalizedMap(C Function(K key) canonicalize, {bool Function(K key)? isValidKey}) : _canonicalize = canonicalize, _isValidKeyFn = isValidKey; /// Creates a canonicalized map that is initialized with the key/value pairs /// of [other]. /// /// The [canonicalize] function should return the canonical value for the /// given key. Keys with the same canonical value are considered equivalent. /// /// The [isValidKey] function is called before calling [canonicalize] for /// methods that take arbitrary objects. It can be used to filter out keys /// that can't be canonicalized. CanonicalizedMap.from(Map other, C Function(K key) canonicalize, {bool Function(K key)? isValidKey}) : _canonicalize = canonicalize, _isValidKeyFn = isValidKey { addAll(other); } @override V? operator [](Object? key) { if (!_isValidKey(key)) return null; var pair = _base[_canonicalize(key as K)]; return pair == null ? null : pair.value; } @override void operator []=(K key, V value) { if (!_isValidKey(key)) return; _base[_canonicalize(key)] = MapEntry(key, value); } @override void addAll(Map other) { other.forEach((key, value) => this[key] = value); } @override void addEntries(Iterable> entries) => _base.addEntries(entries .map((e) => MapEntry(_canonicalize(e.key), MapEntry(e.key, e.value)))); @override Map cast() => _base.cast(); @override void clear() { _base.clear(); } @override bool containsKey(Object? key) { if (!_isValidKey(key)) return false; return _base.containsKey(_canonicalize(key as K)); } @override bool containsValue(Object? value) => _base.values.any((pair) => pair.value == value); @override Iterable> get entries => _base.entries.map((e) => MapEntry(e.value.key, e.value.value)); @override void forEach(void Function(K, V) f) { _base.forEach((key, pair) => f(pair.key, pair.value)); } @override bool get isEmpty => _base.isEmpty; @override bool get isNotEmpty => _base.isNotEmpty; @override Iterable get keys => _base.values.map((pair) => pair.key); @override int get length => _base.length; @override Map map(MapEntry Function(K, V) transform) => _base.map((_, pair) => transform(pair.key, pair.value)); @override V putIfAbsent(K key, V Function() ifAbsent) { return _base .putIfAbsent(_canonicalize(key), () => MapEntry(key, ifAbsent())) .value; } @override V? remove(Object? key) { if (!_isValidKey(key)) return null; var pair = _base.remove(_canonicalize(key as K)); return pair?.value; } @override void removeWhere(bool Function(K key, V value) test) => _base.removeWhere((_, pair) => test(pair.key, pair.value)); @deprecated Map retype() => cast(); @override V update(K key, V Function(V) update, {V Function()? ifAbsent}) => _base.update(_canonicalize(key), (pair) { var value = pair.value; var newValue = update(value); if (identical(newValue, value)) return pair; return MapEntry(key, newValue); }, ifAbsent: ifAbsent == null ? null : () => MapEntry(key, ifAbsent())).value; @override void updateAll(V Function(K key, V value) update) => _base.updateAll((_, pair) { var value = pair.value; var key = pair.key; var newValue = update(key, value); if (identical(value, newValue)) return pair; return MapEntry(key, newValue); }); @override Iterable get values => _base.values.map((pair) => pair.value); @override String toString() => MapBase.mapToString(this); bool _isValidKey(Object? key) => (key is K) && (_isValidKeyFn == null || _isValidKeyFn!(key)); } €¦NN<DMJO7%)'*LOLM#3*&$OLOLM#I*&% (/-  !6 PN 6  ")7 '7 *F (; % + @ " H? 0J (6 :B2 E0 &5( P 7" +5(  D 2#D-package:collection/src/canonicalized_map.dartyfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/combined_wrappers/combined_iterable.dart…œ// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'combined_iterator.dart'; /// A view of several iterables combined sequentially into a single iterable. /// /// All methods and accessors treat the [CombinedIterableView] as if it were a /// single concatenated iterable, but the underlying implementation is based on /// lazily accessing individual iterable instances. This means that if the /// underlying iterables change, the [CombinedIterableView] will reflect those /// changes. class CombinedIterableView extends IterableBase { /// The iterables that this combines. final Iterable> _iterables; /// Creates a combined view of [iterables]. const CombinedIterableView(this._iterables); @override Iterator get iterator => CombinedIterator(_iterables.map((i) => i.iterator).iterator); // Special cased contains/isEmpty/length since many iterables have an // efficient implementation instead of running through the entire iterator. @override bool contains(Object? element) => _iterables.any((i) => i.contains(element)); @override bool get isEmpty => _iterables.every((i) => i.isEmpty); @override int get length => _iterables.fold(0, (length, i) => length + i.length); } (NN<!NOPKO 8(*./ GHN P : J?package:collection/src/combined_wrappers/combined_iterable.dartyfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/combined_wrappers/combined_iterator.dart„§// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// The iterator for `CombinedIterableView` and `CombinedListView`. /// /// Moves through each iterable's iterator in sequence. class CombinedIterator implements Iterator { /// The iterators that this combines, or `null` if done iterating. /// /// Because this comes from a call to [Iterable.map], it's lazy and will /// avoid instantiating unnecessary iterators. Iterator>? _iterators; CombinedIterator(Iterator> iterators) : _iterators = iterators { if (!iterators.moveNext()) _iterators = null; } @override T get current { var iterators = _iterators; if (iterators != null) return iterators.current.current; return null as T; } @override bool moveNext() { var iterators = _iterators; if (iterators != null) { do { if (iterators.current.moveNext()) { return true; } } while (iterators.moveNext()); _iterators = null; } return false; } } )NN<D83EK1%O2  =   , &?package:collection/src/combined_wrappers/combined_iterator.dartufile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/combined_wrappers/combined_list.dartˆ// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'combined_iterator.dart'; /// A view of several lists combined into a single list. /// /// All methods and accessors treat the [CombinedListView] list as if it were a /// single concatenated list, but the underlying implementation is based on /// lazily accessing individual list instances. This means that if the /// underlying lists change, the [CombinedListView] will reflect those changes. /// /// The index operator (`[]`) and [length] property of a [CombinedListView] are /// both `O(lists)` rather than `O(1)`. A [CombinedListView] is unmodifiable. class CombinedListView extends ListBase implements UnmodifiableListView { static Never _throw() { throw UnsupportedError('Cannot modify an unmodifiable List'); } /// The lists that this combines. final List> _lists; /// Creates a combined view of [lists]. CombinedListView(this._lists); @override Iterator get iterator => CombinedIterator(_lists.map((i) => i.iterator).iterator); @override set length(int length) { _throw(); } @override int get length => _lists.fold(0, (length, list) => length + list.length); @override T operator [](int index) { var initialIndex = index; for (var i = 0; i < _lists.length; i++) { var list = _lists[i]; if (index < list.length) { return list[index]; } index -= list.length; } throw RangeError.index(initialIndex, this, 'index', null, length); } @override void operator []=(int index, T value) { _throw(); } @override void clear() { _throw(); } @override bool remove(Object? element) { _throw(); } @override void removeWhere(bool Function(T) test) { _throw(); } @override void retainWhere(bool Function(T) test) { _throw(); } } QNN<!9PLGPPN.)B$*! C  L .!G *  ! , ,;package:collection/src/combined_wrappers/combined_list.dart7org-dartlang-sdk:///sdk/lib/collection/collections.dart dart:collection/collections.darttfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/combined_wrappers/combined_map.darto// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'combined_iterable.dart'; /// Returns a new map that represents maps flattened into a single map. /// /// All methods and accessors treat the new map as-if it were a single /// concatenated map, but the underlying implementation is based on lazily /// accessing individual map instances. In the occasion where a key occurs in /// multiple maps the first value is returned. /// /// The resulting map has an index operator (`[]`) that is `O(maps)`, rather /// than `O(1)`, and the map is unmodifiable, but underlying changes to these /// maps are still accessible from the resulting map. /// /// The `length` getter is `O(M)` where M is the total number of entries in /// all maps, since it has to remove duplicate entries. class CombinedMapView extends UnmodifiableMapBase { final Iterable> _maps; /// Create a new combined view of multiple maps. /// /// The iterable is accessed lazily so it should be collection type like /// [List] or [Set] rather than a lazy iterable produced by `map()` et al. CombinedMapView(this._maps); @override V? operator [](Object? key) { for (var map in _maps) { // Avoid two hash lookups on a positive hit. var value = map[key]; if (value != null || map.containsKey(value)) { return value; } } return null; } /// The keys of [this]. /// /// The returned iterable has efficient `contains` operations, assuming the /// iterables returned by the wrapped maps have efficient `contains` operations /// for their `keys` iterables. /// /// The `length` must do deduplication and thus is not optimized. /// /// The order of iteration is defined by the individual `Map` implementations, /// but must be consistent between changes to the maps. /// /// Unlike most [Map] implementations, modifying an individual map while /// iterating the keys will _sometimes_ throw. This behavior may change in /// the future. @override Iterable get keys => _DeduplicatingIterableView( CombinedIterableView(_maps.map((m) => m.keys))); } /// A view of an iterable that skips any duplicate entries. class _DeduplicatingIterableView extends IterableBase { final Iterable _iterable; const _DeduplicatingIterableView(this._iterable); @override Iterator get iterator => _DeduplicatingIterator(_iterable.iterator); // Special cased contains/isEmpty since many iterables have an efficient // implementation instead of running through the entire iterator. // // Note: We do not do this for `length` because we have to remove the // duplicates. @override bool contains(Object? element) => _iterable.contains(element); @override bool get isEmpty => _iterable.isEmpty; } /// An iterator that wraps another iterator and skips duplicate values. class _DeduplicatingIterator implements Iterator { final Iterator _iterator; final _emitted = HashSet(); _DeduplicatingIterator(this._iterator); @override T get current => _iterator.current; @override bool moveNext() { while (_iterator.moveNext()) { if (_emitted.add(current)) { return true; } } return false; } } jNN<!HGKN/MN6L8@#3KM 35NR"DQ:KM 67<>4 JKDH A )H9!* & ##:package:collection/src/combined_wrappers/combined_map.dartafile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/comparators.dart¸æ// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // Character constants. const int _zero = 0x30; const int _upperCaseA = 0x41; const int _upperCaseZ = 0x5a; const int _lowerCaseA = 0x61; const int _lowerCaseZ = 0x7a; const int _asciiCaseBit = 0x20; /// Checks if strings [a] and [b] differ only on the case of ASCII letters. /// /// Strings are equal if they have the same length, and the characters at /// each index are the same, or they are ASCII letters where one is upper-case /// and the other is the lower-case version of the same letter. /// /// The comparison does not ignore the case of non-ASCII letters, so /// an upper-case ae-ligature (Æ) is different from /// a lower case ae-ligature (æ). /// /// Ignoring non-ASCII letters is not generally a good idea, but it makes sense /// for situations where the strings are known to be ASCII. Examples could /// be Dart identifiers, base-64 or hex encoded strings, GUIDs or similar /// strings with a known structure. bool equalsIgnoreAsciiCase(String a, String b) { if (a.length != b.length) return false; for (var i = 0; i < a.length; i++) { var aChar = a.codeUnitAt(i); var bChar = b.codeUnitAt(i); if (aChar == bChar) continue; // Quick-check for whether this may be different cases of the same letter. if (aChar ^ bChar != _asciiCaseBit) return false; // If it's possible, then check if either character is actually an ASCII // letter. var aCharLowerCase = aChar | _asciiCaseBit; if (_lowerCaseA <= aCharLowerCase && aCharLowerCase <= _lowerCaseZ) { continue; } return false; } return true; } /// Hash code for a string which is compatible with [equalsIgnoreAsciiCase]. /// /// The hash code is unaffected by changing the case of ASCII letters, but /// the case of non-ASCII letters do affect the result. int hashIgnoreAsciiCase(String string) { // Jenkins hash code ( http://en.wikipedia.org/wiki/Jenkins_hash_function). // adapted to smi values. // Same hash used by dart2js for strings, modified to ignore ASCII letter // case. var hash = 0; for (var i = 0; i < string.length; i++) { var char = string.codeUnitAt(i); // Convert lower-case ASCII letters to upper case.upper // This ensures that strings that differ only in case will have the // same hash code. if (_lowerCaseA <= char && char <= _lowerCaseZ) char -= _asciiCaseBit; hash = 0x1fffffff & (hash + char); hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); hash >>= 6; } hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); hash >>= 11; return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); } /// Compares [a] and [b] lexically, converting ASCII letters to upper case. /// /// Comparison treats all lower-case ASCII letters as upper-case letters, /// but does no case conversion for non-ASCII letters. /// /// If two strings differ only on the case of ASCII letters, the one with the /// capital letter at the first difference will compare as less than the other /// string. This tie-breaking ensures that the comparison is a total ordering /// on strings and is compatible with equality. /// /// Ignoring non-ASCII letters is not generally a good idea, but it makes sense /// for situations where the strings are known to be ASCII. Examples could /// be Dart identifiers, base-64 or hex encoded strings, GUIDs or similar /// strings with a known structure. int compareAsciiUpperCase(String a, String b) { var defaultResult = 0; // Returned if no difference found. for (var i = 0; i < a.length; i++) { if (i >= b.length) return 1; var aChar = a.codeUnitAt(i); var bChar = b.codeUnitAt(i); if (aChar == bChar) continue; // Upper-case if letters. var aUpperCase = aChar; var bUpperCase = bChar; if (_lowerCaseA <= aChar && aChar <= _lowerCaseZ) { aUpperCase -= _asciiCaseBit; } if (_lowerCaseA <= bChar && bChar <= _lowerCaseZ) { bUpperCase -= _asciiCaseBit; } if (aUpperCase != bUpperCase) return (aUpperCase - bUpperCase).sign; if (defaultResult == 0) defaultResult = (aChar - bChar); } if (b.length > a.length) return -1; return defaultResult.sign; } /// Compares [a] and [b] lexically, converting ASCII letters to lower case. /// /// Comparison treats all upper-case ASCII letters as lower-case letters, /// but does no case conversion for non-ASCII letters. /// /// If two strings differ only on the case of ASCII letters, the one with the /// capital letter at the first difference will compare as less than the other /// string. This tie-breaking ensures that the comparison is a total ordering /// on strings. /// /// Ignoring non-ASCII letters is not generally a good idea, but it makes sense /// for situations where the strings are known to be ASCII. Examples could /// be Dart identifiers, base-64 or hex encoded strings, GUIDs or similar /// strings with a known structure. int compareAsciiLowerCase(String a, String b) { var defaultResult = 0; for (var i = 0; i < a.length; i++) { if (i >= b.length) return 1; var aChar = a.codeUnitAt(i); var bChar = b.codeUnitAt(i); if (aChar == bChar) continue; var aLowerCase = aChar; var bLowerCase = bChar; // Upper case if ASCII letters. if (_upperCaseA <= bChar && bChar <= _upperCaseZ) { bLowerCase += _asciiCaseBit; } if (_upperCaseA <= aChar && aChar <= _upperCaseZ) { aLowerCase += _asciiCaseBit; } if (aLowerCase != bLowerCase) return (aLowerCase - bLowerCase).sign; if (defaultResult == 0) defaultResult = aChar - bChar; } if (b.length > a.length) return -1; return defaultResult.sign; } /// Compares strings [a] and [b] according to [natural sort ordering][]. /// /// A natural sort ordering is a lexical ordering where embedded /// numerals (digit sequences) are treated as a single unit and ordered by /// numerical value. /// This means that `"a10b"` will be ordered after `"a7b"` in natural /// ordering, where lexical ordering would put the `1` before the `7`, ignoring /// that the `1` is part of a larger number. /// /// Example: /// The following strings are in the order they would be sorted by using this /// comparison function: /// /// "a", "a0", "a0b", "a1", "a01", "a9", "a10", "a100", "a100b", "aa" /// /// [natural sort ordering]: https://en.wikipedia.org/wiki/Natural_sort_order int compareNatural(String a, String b) { for (var i = 0; i < a.length; i++) { if (i >= b.length) return 1; var aChar = a.codeUnitAt(i); var bChar = b.codeUnitAt(i); if (aChar != bChar) { return _compareNaturally(a, b, i, aChar, bChar); } } if (b.length > a.length) return -1; return 0; } /// Compares strings [a] and [b] according to lower-case /// [natural sort ordering][]. /// /// ASCII letters are converted to lower case before being compared, like /// for [compareAsciiLowerCase], then the result is compared like for /// [compareNatural]. /// /// If two strings differ only on the case of ASCII letters, the one with the /// capital letter at the first difference will compare as less than the other /// string. This tie-breaking ensures that the comparison is a total ordering /// on strings. /// /// [natural sort ordering]: https://en.wikipedia.org/wiki/Natural_sort_order int compareAsciiLowerCaseNatural(String a, String b) { var defaultResult = 0; // Returned if no difference found. for (var i = 0; i < a.length; i++) { if (i >= b.length) return 1; var aChar = a.codeUnitAt(i); var bChar = b.codeUnitAt(i); if (aChar == bChar) continue; var aLowerCase = aChar; var bLowerCase = bChar; if (_upperCaseA <= aChar && aChar <= _upperCaseZ) { aLowerCase += _asciiCaseBit; } if (_upperCaseA <= bChar && bChar <= _upperCaseZ) { bLowerCase += _asciiCaseBit; } if (aLowerCase != bLowerCase) { return _compareNaturally(a, b, i, aLowerCase, bLowerCase); } if (defaultResult == 0) defaultResult = aChar - bChar; } if (b.length > a.length) return -1; return defaultResult.sign; } /// Compares strings [a] and [b] according to upper-case /// [natural sort ordering][]. /// /// ASCII letters are converted to upper case before being compared, like /// for [compareAsciiUpperCase], then the result is compared like for /// [compareNatural]. /// /// If two strings differ only on the case of ASCII letters, the one with the /// capital letter at the first difference will compare as less than the other /// string. This tie-breaking ensures that the comparison is a total ordering /// on strings /// /// [natural sort ordering]: https://en.wikipedia.org/wiki/Natural_sort_order int compareAsciiUpperCaseNatural(String a, String b) { var defaultResult = 0; for (var i = 0; i < a.length; i++) { if (i >= b.length) return 1; var aChar = a.codeUnitAt(i); var bChar = b.codeUnitAt(i); if (aChar == bChar) continue; var aUpperCase = aChar; var bUpperCase = bChar; if (_lowerCaseA <= aChar && aChar <= _lowerCaseZ) { aUpperCase -= _asciiCaseBit; } if (_lowerCaseA <= bChar && bChar <= _lowerCaseZ) { bUpperCase -= _asciiCaseBit; } if (aUpperCase != bUpperCase) { return _compareNaturally(a, b, i, aUpperCase, bUpperCase); } if (defaultResult == 0) defaultResult = aChar - bChar; } if (b.length > a.length) return -1; return defaultResult.sign; } /// Check for numbers overlapping the current mismatched characters. /// /// If both [aChar] and [bChar] are digits, use numerical comparison. /// Check if the previous characters is a non-zero number, and if not, /// skip - but count - leading zeros before comparing numbers. /// /// If one is a digit and the other isn't, check if the previous character /// is a digit, and if so, the the one with the digit is the greater number. /// /// Otherwise just returns the difference between [aChar] and [bChar]. int _compareNaturally(String a, String b, int index, int aChar, int bChar) { assert(aChar != bChar); var aIsDigit = _isDigit(aChar); var bIsDigit = _isDigit(bChar); if (aIsDigit) { if (bIsDigit) { return _compareNumerically(a, b, aChar, bChar, index); } else if (index > 0 && _isDigit(a.codeUnitAt(index - 1))) { // aChar is the continuation of a longer number. return 1; } } else if (bIsDigit && index > 0 && _isDigit(b.codeUnitAt(index - 1))) { // bChar is the continuation of a longer number. return -1; } // Characters are both non-digits, or not continuation of earlier number. return (aChar - bChar).sign; } /// Compare numbers overlapping [aChar] and [bChar] numerically. /// /// If the numbers have the same numerical value, but one has more leading /// zeros, the longer number is considered greater than the shorter one. /// /// This ensures a total ordering on strings compatible with equality. int _compareNumerically(String a, String b, int aChar, int bChar, int index) { // Both are digits. Find the first significant different digit, then find // the length of the numbers. if (_isNonZeroNumberSuffix(a, index)) { // Part of a longer number, differs at this index, just count the length. var result = _compareDigitCount(a, b, index, index); if (result != 0) return result; // If same length, the current character is the most significant differing // digit. return (aChar - bChar).sign; } // Not part of larger (non-zero) number, so skip leading zeros before // comparing numbers. var aIndex = index; var bIndex = index; if (aChar == _zero) { do { aIndex++; if (aIndex == a.length) return -1; // number in a is zero, b is not. aChar = a.codeUnitAt(aIndex); } while (aChar == _zero); if (!_isDigit(aChar)) return -1; } else if (bChar == _zero) { do { bIndex++; if (bIndex == b.length) return 1; // number in b is zero, a is not. bChar = b.codeUnitAt(bIndex); } while (bChar == _zero); if (!_isDigit(bChar)) return 1; } if (aChar != bChar) { var result = _compareDigitCount(a, b, aIndex, bIndex); if (result != 0) return result; return (aChar - bChar).sign; } // Same leading digit, one had more leading zeros. // Compare digits until reaching a difference. while (true) { var aIsDigit = false; var bIsDigit = false; aChar = 0; bChar = 0; if (++aIndex < a.length) { aChar = a.codeUnitAt(aIndex); aIsDigit = _isDigit(aChar); } if (++bIndex < b.length) { bChar = b.codeUnitAt(bIndex); bIsDigit = _isDigit(bChar); } if (aIsDigit) { if (bIsDigit) { if (aChar == bChar) continue; // First different digit found. break; } // bChar is non-digit, so a has longer number. return 1; } else if (bIsDigit) { return -1; // b has longer number. } else { // Neither is digit, so numbers had same numerical value. // Fall back on number of leading zeros // (reflected by difference in indices). return (aIndex - bIndex).sign; } } // At first differing digits. var result = _compareDigitCount(a, b, aIndex, bIndex); if (result != 0) return result; return (aChar - bChar).sign; } /// Checks which of [a] and [b] has the longest sequence of digits. /// /// Starts counting from `i + 1` and `j + 1` (assumes that `a[i]` and `b[j]` are /// both already known to be digits). int _compareDigitCount(String a, String b, int i, int j) { while (++i < a.length) { var aIsDigit = _isDigit(a.codeUnitAt(i)); if (++j == b.length) return aIsDigit ? 1 : 0; var bIsDigit = _isDigit(b.codeUnitAt(j)); if (aIsDigit) { if (bIsDigit) continue; return 1; } else if (bIsDigit) { return -1; } else { return 0; } } if (++j < b.length && _isDigit(b.codeUnitAt(j))) { return -1; } return 0; } bool _isDigit(int charCode) => (charCode ^ _zero) <= 9; /// Check if the digit at [index] is continuing a non-zero number. /// /// If there is no non-zero digits before, then leading zeros at [index] /// are also ignored when comparing numerically. If there is a non-zero digit /// before, then zeros at [index] are significant. bool _isNonZeroNumberSuffix(String string, int index) { while (--index >= 0) { var char = string.codeUnitAt(index); if (char != _zero) return _isDigit(char); } return false; } ‹NN< LJO@E4"PKJ$1*'!!"O6M0JMK8)NL ,%;<LJ7NON0PKJ$0='!!!"8#8#I=&LJ7NONPKJ$0'!!!"$8#8#I;&IAKFP- NJN)'!!!7& 9JFNONN7='!!!"8#8#$A;&9JFNONN7'!!!"8#8#$A;&EFG?KMGM""=A7K5LAKIGOL *N9$O!H K$% J$$;$!51$"$"&(5) @./% 9"DQ&;.2. 5 8CIN38).'package:collection/src/comparators.dartlfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/empty_unmodifiable_set.dart…å// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'package:collection/collection.dart'; import 'unmodifiable_wrappers.dart'; /// An unmodifiable, empty set which can be constant. class EmptyUnmodifiableSet extends IterableBase with UnmodifiableSetMixin implements UnmodifiableSetView { const EmptyUnmodifiableSet(); @override Iterator get iterator => Iterable.empty().iterator; @override int get length => 0; @override EmptyUnmodifiableSet cast() => EmptyUnmodifiableSet(); @override bool contains(Object? element) => false; @override bool containsAll(Iterable other) => other.isEmpty; @override Iterable followedBy(Iterable other) => DelegatingIterable(other); @override E? lookup(Object? element) => null; @deprecated @override EmptyUnmodifiableSet retype() => EmptyUnmodifiableSet(); @override E singleWhere(bool Function(E) test, {E Function()? orElse}) => orElse != null ? orElse() : throw StateError('No element'); @override Iterable whereType() => Iterable.empty(); @override Set toSet() => {}; @override Set union(Set other) => Set.of(other); @override Set intersection(Set other) => {}; @override Set difference(Set other) => {}; } 1NN<-%66!(  <  B + > J & D BB 2  / 1 /2package:collection/src/empty_unmodifiable_set.dartkfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/unmodifiable_wrappers.dartš1// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'empty_unmodifiable_set.dart'; import 'wrappers.dart'; export 'dart:collection' show UnmodifiableListView, UnmodifiableMapView; /// A fixed-length list. /// /// A `NonGrowableListView` contains a [List] object and ensures that /// its length does not change. /// Methods that would change the length of the list, /// such as [add] and [remove], throw an [UnsupportedError]. /// All other methods work directly on the underlying list. /// /// This class _does_ allow changes to the contents of the wrapped list. /// You can, for example, [sort] the list. /// Permitted operations defer to the wrapped list. class NonGrowableListView extends DelegatingList with NonGrowableListMixin { NonGrowableListView(List listBase) : super(listBase); } /// Mixin class that implements a throwing version of all list operations that /// change the List's length. abstract class NonGrowableListMixin implements List { static Never _throw() { throw UnsupportedError('Cannot change the length of a fixed-length list'); } /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override set length(int newLength) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override bool add(E value) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override void addAll(Iterable iterable) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override void insert(int index, E element) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override void insertAll(int index, Iterable iterable) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override bool remove(Object? value) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override E removeAt(int index) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override E removeLast() => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override void removeWhere(bool Function(E) test) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override void retainWhere(bool Function(E) test) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override void removeRange(int start, int end) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override void replaceRange(int start, int end, Iterable iterable) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the length of the list are disallowed. @override void clear() => _throw(); } /// An unmodifiable set. /// /// An [UnmodifiableSetView] contains a [Set], /// and prevents that set from being changed through the view. /// Methods that could change the set, /// such as [add] and [remove], throw an [UnsupportedError]. /// Permitted operations defer to the wrapped set. class UnmodifiableSetView extends DelegatingSet with UnmodifiableSetMixin { UnmodifiableSetView(Set setBase) : super(setBase); /// An unmodifiable empty set. /// /// This is the same as `UnmodifiableSetView(Set())`, except that it /// can be used in const contexts. const factory UnmodifiableSetView.empty() = EmptyUnmodifiableSet; } /// Mixin class that implements a throwing version of all set operations that /// change the Set. abstract class UnmodifiableSetMixin implements Set { static Never _throw() { throw UnsupportedError('Cannot modify an unmodifiable Set'); } /// Throws an [UnsupportedError]; /// operations that change the set are disallowed. @override bool add(E value) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the set are disallowed. @override void addAll(Iterable elements) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the set are disallowed. @override bool remove(Object? value) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the set are disallowed. @override void removeAll(Iterable elements) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the set are disallowed. @override void retainAll(Iterable elements) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the set are disallowed. @override void removeWhere(bool Function(E) test) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the set are disallowed. @override void retainWhere(bool Function(E) test) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the set are disallowed. @override void clear() => _throw(); } /// Mixin class that implements a throwing version of all map operations that /// change the Map. abstract class UnmodifiableMapMixin implements Map { static Never _throw() { throw UnsupportedError('Cannot modify an unmodifiable Map'); } /// Throws an [UnsupportedError]; /// operations that change the map are disallowed. @override void operator []=(K key, V value) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the map are disallowed. @override V putIfAbsent(K key, V Function() ifAbsent) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the map are disallowed. @override void addAll(Map other) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the map are disallowed. @override V remove(Object? key) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the map are disallowed. @override void clear() => _throw(); /// Throws an [UnsupportedError]; /// operations that change the map are disallowed. set first(_) => _throw(); /// Throws an [UnsupportedError]; /// operations that change the map are disallowed. set last(_) => _throw(); } €ÎNN<&IF 6=<I+47#;O<O$D )$D !$D 1$D 1$D ?$D *$D %$D $D 7$D 7$D 4$D K$D /?'=36#8!G%GN;A$5 !$5 1$5 *$5 1$5 1$5 7$5 7$5 NAA$5 1$5 ;$5 ,$5 %$5 $5$51package:collection/src/unmodifiable_wrappers.dart^file:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/wrappers.dartÀYS// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'dart:math' as math; import 'unmodifiable_wrappers.dart'; /// A base class for delegating iterables. /// /// Subclasses can provide a [_base] that should be delegated to. Unlike /// [DelegatingIterable], this allows the base to be created on demand. abstract class _DelegatingIterableBase implements Iterable { Iterable get _base; const _DelegatingIterableBase(); @override bool any(bool Function(E) test) => _base.any(test); @override Iterable cast() => _base.cast(); @override bool contains(Object? element) => _base.contains(element); @override E elementAt(int index) => _base.elementAt(index); @override bool every(bool Function(E) test) => _base.every(test); @override Iterable expand(Iterable Function(E) f) => _base.expand(f); @override E get first => _base.first; @override E firstWhere(bool Function(E) test, {E Function()? orElse}) => _base.firstWhere(test, orElse: orElse); @override T fold(T initialValue, T Function(T previousValue, E element) combine) => _base.fold(initialValue, combine); @override Iterable followedBy(Iterable other) => _base.followedBy(other); @override void forEach(void Function(E) f) => _base.forEach(f); @override bool get isEmpty => _base.isEmpty; @override bool get isNotEmpty => _base.isNotEmpty; @override Iterator get iterator => _base.iterator; @override String join([String separator = '']) => _base.join(separator); @override E get last => _base.last; @override E lastWhere(bool Function(E) test, {E Function()? orElse}) => _base.lastWhere(test, orElse: orElse); @override int get length => _base.length; @override Iterable map(T Function(E) f) => _base.map(f); @override E reduce(E Function(E value, E element) combine) => _base.reduce(combine); @deprecated Iterable retype() => cast(); @override E get single => _base.single; @override E singleWhere(bool Function(E) test, {E Function()? orElse}) { return _base.singleWhere(test, orElse: orElse); } @override Iterable skip(int n) => _base.skip(n); @override Iterable skipWhile(bool Function(E) test) => _base.skipWhile(test); @override Iterable take(int n) => _base.take(n); @override Iterable takeWhile(bool Function(E) test) => _base.takeWhile(test); @override List toList({bool growable = true}) => _base.toList(growable: growable); @override Set toSet() => _base.toSet(); @override Iterable where(bool Function(E) test) => _base.where(test); @override Iterable whereType() => _base.whereType(); @override String toString() => _base.toString(); } /// An [Iterable] that delegates all operations to a base iterable. /// /// This class can be used to hide non-`Iterable` methods of an iterable object, /// or it can be extended to add extra functionality on top of an existing /// iterable object. class DelegatingIterable extends _DelegatingIterableBase { @override final Iterable _base; /// Creates a wrapper that forwards operations to [base]. const DelegatingIterable(Iterable base) : _base = base; /// Creates a wrapper that asserts the types of values in [base]. /// /// This soundly converts an [Iterable] without a generic type to an /// `Iterable` by asserting that its elements are instances of `E` whenever /// they're accessed. If they're not, it throws a [CastError]. /// /// This forwards all operations to [base], so any changes in [base] will be /// reflected in [this]. If [base] is already an `Iterable`, it's returned /// unmodified. @Deprecated('Use iterable.cast instead.') static Iterable typed(Iterable base) => base.cast(); } /// A [List] that delegates all operations to a base list. /// /// This class can be used to hide non-`List` methods of a list object, or it /// can be extended to add extra functionality on top of an existing list /// object. class DelegatingList extends _DelegatingIterableBase implements List { @override final List _base; const DelegatingList(List base) : _base = base; /// Creates a wrapper that asserts the types of values in [base]. /// /// This soundly converts a [List] without a generic type to a `List` by /// asserting that its elements are instances of `E` whenever they're /// accessed. If they're not, it throws a [CastError]. Note that even if an /// operation throws a [CastError], it may still mutate the underlying /// collection. /// /// This forwards all operations to [base], so any changes in [base] will be /// reflected in [this]. If [base] is already a `List`, it's returned /// unmodified. @Deprecated('Use list.cast instead.') static List typed(List base) => base.cast(); @override E operator [](int index) => _base[index]; @override void operator []=(int index, E value) { _base[index] = value; } @override List operator +(List other) => _base + other; @override void add(E value) { _base.add(value); } @override void addAll(Iterable iterable) { _base.addAll(iterable); } @override Map asMap() => _base.asMap(); @override List cast() => _base.cast(); @override void clear() { _base.clear(); } @override void fillRange(int start, int end, [E? fillValue]) { _base.fillRange(start, end, fillValue); } @override set first(E value) { if (isEmpty) throw RangeError.index(0, this); this[0] = value; } @override Iterable getRange(int start, int end) => _base.getRange(start, end); @override int indexOf(E element, [int start = 0]) => _base.indexOf(element, start); @override int indexWhere(bool Function(E) test, [int start = 0]) => _base.indexWhere(test, start); @override void insert(int index, E element) { _base.insert(index, element); } @override void insertAll(int index, Iterable iterable) { _base.insertAll(index, iterable); } @override set last(E value) { if (isEmpty) throw RangeError.index(0, this); this[length - 1] = value; } @override int lastIndexOf(E element, [int? start]) => _base.lastIndexOf(element, start); @override int lastIndexWhere(bool Function(E) test, [int? start]) => _base.lastIndexWhere(test, start); @override set length(int newLength) { _base.length = newLength; } @override bool remove(Object? value) => _base.remove(value); @override E removeAt(int index) => _base.removeAt(index); @override E removeLast() => _base.removeLast(); @override void removeRange(int start, int end) { _base.removeRange(start, end); } @override void removeWhere(bool Function(E) test) { _base.removeWhere(test); } @override void replaceRange(int start, int end, Iterable iterable) { _base.replaceRange(start, end, iterable); } @override void retainWhere(bool Function(E) test) { _base.retainWhere(test); } @deprecated @override List retype() => cast(); @override Iterable get reversed => _base.reversed; @override void setAll(int index, Iterable iterable) { _base.setAll(index, iterable); } @override void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) { _base.setRange(start, end, iterable, skipCount); } @override void shuffle([math.Random? random]) { _base.shuffle(random); } @override void sort([int Function(E, E)? compare]) { _base.sort(compare); } @override List sublist(int start, [int? end]) => _base.sublist(start, end); } /// A [Set] that delegates all operations to a base set. /// /// This class can be used to hide non-`Set` methods of a set object, or it can /// be extended to add extra functionality on top of an existing set object. class DelegatingSet extends _DelegatingIterableBase implements Set { @override final Set _base; const DelegatingSet(Set base) : _base = base; /// Creates a wrapper that asserts the types of values in [base]. /// /// This soundly converts a [Set] without a generic type to a `Set` by /// asserting that its elements are instances of `E` whenever they're /// accessed. If they're not, it throws a [CastError]. Note that even if an /// operation throws a [CastError], it may still mutate the underlying /// collection. /// /// This forwards all operations to [base], so any changes in [base] will be /// reflected in [this]. If [base] is already a `Set`, it's returned /// unmodified. @Deprecated('Use set.cast instead.') static Set typed(Set base) => base.cast(); @override bool add(E value) => _base.add(value); @override void addAll(Iterable elements) { _base.addAll(elements); } @override Set cast() => _base.cast(); @override void clear() { _base.clear(); } @override bool containsAll(Iterable other) => _base.containsAll(other); @override Set difference(Set other) => _base.difference(other); @override Set intersection(Set other) => _base.intersection(other); @override E? lookup(Object? element) => _base.lookup(element); @override bool remove(Object? value) => _base.remove(value); @override void removeAll(Iterable elements) { _base.removeAll(elements); } @override void removeWhere(bool Function(E) test) { _base.removeWhere(test); } @override void retainAll(Iterable elements) { _base.retainAll(elements); } @deprecated @override Set retype() => cast(); @override void retainWhere(bool Function(E) test) { _base.retainWhere(test); } @override Set union(Set other) => _base.union(other); @override Set toSet() => DelegatingSet(_base.toSet()); } /// A [Queue] that delegates all operations to a base queue. /// /// This class can be used to hide non-`Queue` methods of a queue object, or it /// can be extended to add extra functionality on top of an existing queue /// object. class DelegatingQueue extends _DelegatingIterableBase implements Queue { @override final Queue _base; const DelegatingQueue(Queue queue) : _base = queue; /// Creates a wrapper that asserts the types of values in [base]. /// /// This soundly converts a [Queue] without a generic type to a `Queue` by /// asserting that its elements are instances of `E` whenever they're /// accessed. If they're not, it throws a [CastError]. Note that even if an /// operation throws a [CastError], it may still mutate the underlying /// collection. /// /// This forwards all operations to [base], so any changes in [base] will be /// reflected in [this]. If [base] is already a `Queue`, it's returned /// unmodified. @Deprecated('Use queue.cast instead.') static Queue typed(Queue base) => base.cast(); @override void add(E value) { _base.add(value); } @override void addAll(Iterable iterable) { _base.addAll(iterable); } @override void addFirst(E value) { _base.addFirst(value); } @override void addLast(E value) { _base.addLast(value); } @override Queue cast() => _base.cast(); @override void clear() { _base.clear(); } @override bool remove(Object? object) => _base.remove(object); @override void removeWhere(bool Function(E) test) { _base.removeWhere(test); } @override void retainWhere(bool Function(E) test) { _base.retainWhere(test); } @deprecated @override Queue retype() => cast(); @override E removeFirst() => _base.removeFirst(); @override E removeLast() => _base.removeLast(); } /// A [Map] that delegates all operations to a base map. /// /// This class can be used to hide non-`Map` methods of an object that extends /// `Map`, or it can be extended to add extra functionality on top of an /// existing map object. class DelegatingMap implements Map { final Map _base; const DelegatingMap(Map base) : _base = base; /// Creates a wrapper that asserts the types of keys and values in [base]. /// /// This soundly converts a [Map] without generic types to a `Map` by /// asserting that its keys are instances of `E` and its values are instances /// of `V` whenever they're accessed. If they're not, it throws a [CastError]. /// Note that even if an operation throws a [CastError], it may still mutate /// the underlying collection. /// /// This forwards all operations to [base], so any changes in [base] will be /// reflected in [this]. If [base] is already a `Map`, it's returned /// unmodified. @Deprecated('Use map.cast instead.') static Map typed(Map base) => base.cast(); @override V? operator [](Object? key) => _base[key]; @override void operator []=(K key, V value) { _base[key] = value; } @override void addAll(Map other) { _base.addAll(other); } @override void addEntries(Iterable> entries) { _base.addEntries(entries); } @override void clear() { _base.clear(); } @override Map cast() => _base.cast(); @override bool containsKey(Object? key) => _base.containsKey(key); @override bool containsValue(Object? value) => _base.containsValue(value); @override Iterable> get entries => _base.entries; @override void forEach(void Function(K, V) f) { _base.forEach(f); } @override bool get isEmpty => _base.isEmpty; @override bool get isNotEmpty => _base.isNotEmpty; @override Iterable get keys => _base.keys; @override int get length => _base.length; @override Map map(MapEntry Function(K, V) transform) => _base.map(transform); @override V putIfAbsent(K key, V Function() ifAbsent) => _base.putIfAbsent(key, ifAbsent); @override V? remove(Object? key) => _base.remove(key); @override void removeWhere(bool Function(K, V) test) => _base.removeWhere(test); @deprecated Map retype() => cast(); @override Iterable get values => _base.values; @override String toString() => _base.toString(); @override V update(K key, V Function(V) update, {V Function()? ifAbsent}) => _base.update(key, update, ifAbsent: ifAbsent); @override void updateAll(V Function(K, V) update) => _base.updateAll(update); } /// An unmodifiable [Set] view of the keys of a [Map]. /// /// The set delegates all operations to the underlying map. /// /// A `Map` can only contain each key once, so its keys can always /// be viewed as a `Set` without any loss, even if the [Map.keys] /// getter only shows an [Iterable] view of the keys. /// /// Note that [lookup] is not supported for this set. class MapKeySet extends _DelegatingIterableBase with UnmodifiableSetMixin { final Map _baseMap; MapKeySet(this._baseMap); @override Iterable get _base => _baseMap.keys; @override Set cast() { if (this is MapKeySet) { return this as MapKeySet; } return Set.castFrom(this); } @override bool contains(Object? element) => _baseMap.containsKey(element); @override bool get isEmpty => _baseMap.isEmpty; @override bool get isNotEmpty => _baseMap.isNotEmpty; @override int get length => _baseMap.length; @override String toString() => SetBase.setToString(this); @override bool containsAll(Iterable other) => other.every(contains); /// Returns a new set with the the elements of [this] that are not in [other]. /// /// That is, the returned set contains all the elements of this [Set] that are /// not elements of [other] according to `other.contains`. /// /// Note that the returned set will use the default equality operation, which /// may be different than the equality operation [this] uses. @override Set difference(Set other) => where((element) => !other.contains(element)).toSet(); /// Returns a new set which is the intersection between [this] and [other]. /// /// That is, the returned set contains all the elements of this [Set] that are /// also elements of [other] according to `other.contains`. /// /// Note that the returned set will use the default equality operation, which /// may be different than the equality operation [this] uses. @override Set intersection(Set other) => where(other.contains).toSet(); /// Throws an [UnsupportedError] since there's no corresponding method for /// [Map]s. @override E lookup(Object? element) => throw UnsupportedError("MapKeySet doesn't support lookup()."); @deprecated @override Set retype() => Set.castFrom(this); /// Returns a new set which contains all the elements of [this] and [other]. /// /// That is, the returned set contains all the elements of this [Set] and all /// the elements of [other]. /// /// Note that the returned set will use the default equality operation, which /// may be different than the equality operation [this] uses. @override Set union(Set other) => toSet()..addAll(other); } /// Creates a modifiable [Set] view of the values of a [Map]. /// /// The `Set` view assumes that the keys of the `Map` can be uniquely determined /// from the values. The `keyForValue` function passed to the constructor finds /// the key for a single value. The `keyForValue` function should be consistent /// with equality. If `value1 == value2` then `keyForValue(value1)` and /// `keyForValue(value2)` should be considered equal keys by the underlying map, /// and vice versa. /// /// Modifying the set will modify the underlying map based on the key returned /// by `keyForValue`. /// /// If the `Map` contents are not compatible with the `keyForValue` function, /// the set will not work consistently, and may give meaningless responses or do /// inconsistent updates. /// /// This set can, for example, be used on a map from database record IDs to the /// records. It exposes the records as a set, and allows for writing both /// `recordSet.add(databaseRecord)` and `recordMap[id]`. /// /// Effectively, the map will act as a kind of index for the set. class MapValueSet extends _DelegatingIterableBase implements Set { final Map _baseMap; final K Function(V) _keyForValue; /// Creates a new [MapValueSet] based on [_baseMap]. /// /// [_keyForValue] returns the key in the map that should be associated with /// the given value. The set's notion of equality is identical to the equality /// of the return values of [_keyForValue]. MapValueSet(this._baseMap, this._keyForValue); @override Iterable get _base => _baseMap.values; @override Set cast() { if (this is Set) { return this as Set; } return Set.castFrom(this); } @override bool contains(Object? element) { if (element is! V) return false; var key = _keyForValue(element); return _baseMap.containsKey(key); } @override bool get isEmpty => _baseMap.isEmpty; @override bool get isNotEmpty => _baseMap.isNotEmpty; @override int get length => _baseMap.length; @override String toString() => toSet().toString(); @override bool add(V value) { var key = _keyForValue(value); var result = false; _baseMap.putIfAbsent(key, () { result = true; return value; }); return result; } @override void addAll(Iterable elements) => elements.forEach(add); @override void clear() => _baseMap.clear(); @override bool containsAll(Iterable other) => other.every(contains); /// Returns a new set with the the elements of [this] that are not in [other]. /// /// That is, the returned set contains all the elements of this [Set] that are /// not elements of [other] according to `other.contains`. /// /// Note that the returned set will use the default equality operation, which /// may be different than the equality operation [this] uses. @override Set difference(Set other) => where((element) => !other.contains(element)).toSet(); /// Returns a new set which is the intersection between [this] and [other]. /// /// That is, the returned set contains all the elements of this [Set] that are /// also elements of [other] according to `other.contains`. /// /// Note that the returned set will use the default equality operation, which /// may be different than the equality operation [this] uses. @override Set intersection(Set other) => where(other.contains).toSet(); @override V? lookup(Object? element) { if (element is! V) return null; var key = _keyForValue(element); return _baseMap[key]; } @override bool remove(Object? element) { if (element is! V) return false; var key = _keyForValue(element); if (!_baseMap.containsKey(key)) return false; _baseMap.remove(key); return true; } @override void removeAll(Iterable elements) => elements.forEach(remove); @override void removeWhere(bool Function(V) test) { var toRemove = []; _baseMap.forEach((key, value) { if (test(value)) toRemove.add(key); }); toRemove.forEach(_baseMap.remove); } @override void retainAll(Iterable elements) { var valuesToRetain = Set.identity(); for (var element in elements) { if (element is! V) continue; var key = _keyForValue(element); if (!_baseMap.containsKey(key)) continue; valuesToRetain.add(_baseMap[key] ?? null as V); } var keysToRemove = []; _baseMap.forEach((k, v) { if (!valuesToRetain.contains(v)) keysToRemove.add(k); }); keysToRemove.forEach(_baseMap.remove); } @override void retainWhere(bool Function(V) test) => removeWhere((element) => !test(element)); @deprecated @override Set retype() => Set.castFrom(this); /// Returns a new set which contains all the elements of [this] and [other]. /// /// That is, the returned set contains all the elements of this [Set] and all /// the elements of [other]. /// /// Note that the returned set will use the default equality operation, which /// may be different than the equality operation [this] uses. @override Set union(Set other) => toSet()..addAll(other); } ƒHNN<%+IHC# 6 , = 4 : G  A. O) H 8 % + . A  @- " 7 M(  A4 , I , I N # A 6 )DQKA <=DGQAOP/@;NJ P 5DNHNIOK+8 , * 6  & ( (  7, 2 J L <% &" 4& 2 Q =)  5 2 ( )# , @. , $ . 1# Q5 ( - G9PMN 3DLHNIOJ*6 ) & '  I D H 7 5 / , / # , 4 5=PK < 9DPHNIOL,:  &   )  7 , , % * (9OI16MNPQO!OM-? - & ! 6  6 ; C 9 ( % + & " H 1( / I2 * ) E5 F7<CB666#" *  #% C ( . % 2 FQQ=P@ +<NQ>P@ LM E 2OPP@ 8>QPPHQONQPJ9BO$7OQ.1 , % #%%& ( . % + ## > $ FQQ=P@ +<NQ>P@ L $% !%%2 J ,$*' /,$#'06<+ -0 2OPP@ 8$package:collection/src/wrappers.dart…ã„›^file:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/equality.dart¼þ// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'comparators.dart'; const int _HASH_MASK = 0x7fffffff; /// A generic equality relation on objects. abstract class Equality { const factory Equality() = DefaultEquality; /// Compare two elements for being equal. /// /// This should be a proper equality relation. bool equals(E e1, E e2); /// Get a hashcode of an element. /// /// The hashcode should be compatible with [equals], so that if /// `equals(a, b)` then `hash(a) == hash(b)`. int hash(E e); /// Test whether an object is a valid argument to [equals] and [hash]. /// /// Some implementations may be restricted to only work on specific types /// of objects. bool isValidKey(Object? o); } /// Equality of objects based on derived values. /// /// For example, given the class: /// ```dart /// abstract class Employee { /// int get employmentId; /// } /// ``` /// /// The following [Equality] considers employees with the same IDs to be equal: /// ```dart /// EqualityBy((Employee e) => e.employmentId); /// ``` /// /// It's also possible to pass an additional equality instance that should be /// used to compare the value itself. class EqualityBy implements Equality { final F Function(E) _comparisonKey; final Equality _inner; EqualityBy(F Function(E) comparisonKey, [Equality inner = const DefaultEquality()]) : _comparisonKey = comparisonKey, _inner = inner; @override bool equals(E e1, E e2) => _inner.equals(_comparisonKey(e1), _comparisonKey(e2)); @override int hash(E e) => _inner.hash(_comparisonKey(e)); @override bool isValidKey(Object? o) { if (o is E) { final value = _comparisonKey(o); return value is F && _inner.isValidKey(value); } return false; } } /// Equality of objects that compares only the natural equality of the objects. /// /// This equality uses the objects' own [Object.==] and [Object.hashCode] for /// the equality. /// /// Note that [equals] and [hash] take `Object`s rather than `E`s. This allows /// `E` to be inferred as `Null` in const contexts where `E` wouldn't be a /// compile-time constant, while still allowing the class to be used at runtime. class DefaultEquality implements Equality { const DefaultEquality(); @override bool equals(Object? e1, Object? e2) => e1 == e2; @override int hash(Object? e) => e.hashCode; @override bool isValidKey(Object? o) => true; } /// Equality of objects that compares only the identity of the objects. class IdentityEquality implements Equality { const IdentityEquality(); @override bool equals(E e1, E e2) => identical(e1, e2); @override int hash(E e) => identityHashCode(e); @override bool isValidKey(Object? o) => true; } /// Equality on iterables. /// /// Two iterables are equal if they have the same elements in the same order. /// /// The [equals] and [hash] methods accepts `null` values, /// even if the [isValidKey] returns `false` for `null`. /// The [hash] of `null` is `null.hashCode`. class IterableEquality implements Equality> { final Equality _elementEquality; const IterableEquality( [Equality elementEquality = const DefaultEquality()]) : _elementEquality = elementEquality; @override bool equals(Iterable? elements1, Iterable? elements2) { if (identical(elements1, elements2)) return true; if (elements1 == null || elements2 == null) return false; var it1 = elements1.iterator; var it2 = elements2.iterator; while (true) { var hasNext = it1.moveNext(); if (hasNext != it2.moveNext()) return false; if (!hasNext) return true; if (!_elementEquality.equals(it1.current, it2.current)) return false; } } @override int hash(Iterable? elements) { if (elements == null) return null.hashCode; // Jenkins's one-at-a-time hash function. var hash = 0; for (var element in elements) { var c = _elementEquality.hash(element); hash = (hash + c) & _HASH_MASK; hash = (hash + (hash << 10)) & _HASH_MASK; hash ^= (hash >> 6); } hash = (hash + (hash << 3)) & _HASH_MASK; hash ^= (hash >> 11); hash = (hash + (hash << 15)) & _HASH_MASK; return hash; } @override bool isValidKey(Object? o) => o is Iterable; } /// Equality on lists. /// /// Two lists are equal if they have the same length and their elements /// at each index are equal. /// /// This is effectively the same as [IterableEquality] except that it /// accesses elements by index instead of through iteration. /// /// The [equals] and [hash] methods accepts `null` values, /// even if the [isValidKey] returns `false` for `null`. /// The [hash] of `null` is `null.hashCode`. class ListEquality implements Equality> { final Equality _elementEquality; const ListEquality( [Equality elementEquality = const DefaultEquality()]) : _elementEquality = elementEquality; @override bool equals(List? list1, List? list2) { if (identical(list1, list2)) return true; if (list1 == null || list2 == null) return false; var length = list1.length; if (length != list2.length) return false; for (var i = 0; i < length; i++) { if (!_elementEquality.equals(list1[i], list2[i])) return false; } return true; } @override int hash(List? list) { if (list == null) return null.hashCode; // Jenkins's one-at-a-time hash function. // This code is almost identical to the one in IterableEquality, except // that it uses indexing instead of iterating to get the elements. var hash = 0; for (var i = 0; i < list.length; i++) { var c = _elementEquality.hash(list[i]); hash = (hash + c) & _HASH_MASK; hash = (hash + (hash << 10)) & _HASH_MASK; hash ^= (hash >> 6); } hash = (hash + (hash << 3)) & _HASH_MASK; hash ^= (hash >> 11); hash = (hash + (hash << 15)) & _HASH_MASK; return hash; } @override bool isValidKey(Object? o) => o is List; } abstract class _UnorderedEquality?> implements Equality { final Equality _elementEquality; const _UnorderedEquality(this._elementEquality); @override bool equals(T elements1, T elements2) { if (identical(elements1, elements2)) return true; if (elements1 == null || elements2 == null) return false; var counts = HashMap( equals: _elementEquality.equals, hashCode: _elementEquality.hash, isValidKey: _elementEquality.isValidKey); var length = 0; for (var e in elements1) { var count = counts[e] ?? 0; counts[e] = count + 1; length++; } for (var e in elements2) { var count = counts[e]; if (count == null || count == 0) return false; counts[e] = count - 1; length--; } return length == 0; } @override int hash(T elements) { if (elements == null) return null.hashCode; var hash = 0; for (E element in elements) { var c = _elementEquality.hash(element); hash = (hash + c) & _HASH_MASK; } hash = (hash + (hash << 3)) & _HASH_MASK; hash ^= (hash >> 11); hash = (hash + (hash << 15)) & _HASH_MASK; return hash; } } /// Equality of the elements of two iterables without considering order. /// /// Two iterables are considered equal if they have the same number of elements, /// and the elements of one set can be paired with the elements /// of the other iterable, so that each pair are equal. class UnorderedIterableEquality extends _UnorderedEquality?> { const UnorderedIterableEquality( [Equality elementEquality = const DefaultEquality()]) : super(elementEquality); @override bool isValidKey(Object? o) => o is Iterable; } /// Equality of sets. /// /// Two sets are considered equal if they have the same number of elements, /// and the elements of one set can be paired with the elements /// of the other set, so that each pair are equal. /// /// This equality behaves the same as [UnorderedIterableEquality] except that /// it expects sets instead of iterables as arguments. /// /// The [equals] and [hash] methods accepts `null` values, /// even if the [isValidKey] returns `false` for `null`. /// The [hash] of `null` is `null.hashCode`. class SetEquality extends _UnorderedEquality?> { const SetEquality( [Equality elementEquality = const DefaultEquality()]) : super(elementEquality); @override bool isValidKey(Object? o) => o is Set; } /// Internal class used by [MapEquality]. /// /// The class represents a map entry as a single object, /// using a combined hashCode and equality of the key and value. class _MapEntry { final MapEquality equality; final key; final value; _MapEntry(this.equality, this.key, this.value); @override int get hashCode => (3 * equality._keyEquality.hash(key) + 7 * equality._valueEquality.hash(value)) & _HASH_MASK; @override bool operator ==(Object other) => other is _MapEntry && equality._keyEquality.equals(key, other.key) && equality._valueEquality.equals(value, other.value); } /// Equality on maps. /// /// Two maps are equal if they have the same number of entries, and if the /// entries of the two maps are pairwise equal on both key and value. /// /// The [equals] and [hash] methods accepts `null` values, /// even if the [isValidKey] returns `false` for `null`. /// The [hash] of `null` is `null.hashCode`. class MapEquality implements Equality> { final Equality _keyEquality; final Equality _valueEquality; const MapEquality( {Equality keys = const DefaultEquality(), Equality values = const DefaultEquality()}) : _keyEquality = keys, _valueEquality = values; @override bool equals(Map? map1, Map? map2) { if (identical(map1, map2)) return true; if (map1 == null || map2 == null) return false; var length = map1.length; if (length != map2.length) return false; Map<_MapEntry, int> equalElementCounts = HashMap(); for (var key in map1.keys) { var entry = _MapEntry(this, key, map1[key]); var count = equalElementCounts[entry] ?? 0; equalElementCounts[entry] = count + 1; } for (var key in map2.keys) { var entry = _MapEntry(this, key, map2[key]); var count = equalElementCounts[entry]; if (count == null || count == 0) return false; equalElementCounts[entry] = count - 1; } return true; } @override int hash(Map? map) { if (map == null) return null.hashCode; var hash = 0; for (var key in map.keys) { var keyHash = _keyEquality.hash(key); var valueHash = _valueEquality.hash(map[key] as V); hash = (hash + 3 * keyHash + 7 * valueHash) & _HASH_MASK; } hash = (hash + (hash << 3)) & _HASH_MASK; hash ^= (hash >> 11); hash = (hash + (hash << 15)) & _HASH_MASK; return hash; } @override bool isValidKey(Object? o) => o is Map; } /// Combines several equalities into a single equality. /// /// Tries each equality in order, using [Equality.isValidKey], and returns /// the result of the first equality that applies to the argument or arguments. /// /// For `equals`, the first equality that matches the first argument is used, /// and if the second argument of `equals` is not valid for that equality, /// it returns false. /// /// Because the equalities are tried in order, they should generally work on /// disjoint types. Otherwise the multi-equality may give inconsistent results /// for `equals(e1, e2)` and `equals(e2, e1)`. This can happen if one equality /// considers only `e1` a valid key, and not `e2`, but an equality which is /// checked later, allows both. class MultiEquality implements Equality { final Iterable> _equalities; const MultiEquality(Iterable> equalities) : _equalities = equalities; @override bool equals(E e1, E e2) { for (var eq in _equalities) { if (eq.isValidKey(e1)) return eq.isValidKey(e2) && eq.equals(e1, e2); } return false; } @override int hash(E e) { for (var eq in _equalities) { if (eq.isValidKey(e)) return eq.hash(e); } return 0; } @override bool isValidKey(Object? o) { for (var eq in _equalities) { if (eq.isValidKey(o)) return true; } return false; } } /// Deep equality on collections. /// /// Recognizes lists, sets, iterables and maps and compares their elements using /// deep equality as well. /// /// Non-iterable/map objects are compared using a configurable base equality. /// /// Works in one of two modes: ordered or unordered. /// /// In ordered mode, lists and iterables are required to have equal elements /// in the same order. In unordered mode, the order of elements in iterables /// and lists are not important. /// /// A list is only equal to another list, likewise for sets and maps. All other /// iterables are compared as iterables only. class DeepCollectionEquality implements Equality { final Equality _base; final bool _unordered; const DeepCollectionEquality([Equality base = const DefaultEquality()]) : _base = base, _unordered = false; /// Creates a deep equality on collections where the order of lists and /// iterables are not considered important. That is, lists and iterables are /// treated as unordered iterables. const DeepCollectionEquality.unordered( [Equality base = const DefaultEquality()]) : _base = base, _unordered = true; @override bool equals(e1, e2) { if (e1 is Set) { return e2 is Set && SetEquality(this).equals(e1, e2); } if (e1 is Map) { return e2 is Map && MapEquality(keys: this, values: this).equals(e1, e2); } if (!_unordered) { if (e1 is List) { return e2 is List && ListEquality(this).equals(e1, e2); } if (e1 is Iterable) { return e2 is Iterable && IterableEquality(this).equals(e1, e2); } } else if (e1 is Iterable) { if (e1 is List != e2 is List) return false; return e2 is Iterable && UnorderedIterableEquality(this).equals(e1, e2); } return _base.equals(e1, e2); } @override int hash(Object? o) { if (o is Set) return SetEquality(this).hash(o); if (o is Map) return MapEquality(keys: this, values: this).hash(o); if (!_unordered) { if (o is List) return ListEquality(this).hash(o); if (o is Iterable) return IterableEquality(this).hash(o); } else if (o is Iterable) { return UnorderedIterableEquality(this).hash(o); } return _base.hash(o); } @override bool isValidKey(Object? o) => o is Iterable || o is Map || _base.isValidKey(o); } /// String equality that's insensitive to differences in ASCII case. /// /// Non-ASCII characters are compared as-is, with no conversion. class CaseInsensitiveEquality implements Equality { const CaseInsensitiveEquality(); @override bool equals(String string1, String string2) => equalsIgnoreAsciiCase(string1, string2); @override int hash(String string) => hashIgnoreAsciiCase(string); @override bool isValidKey(Object? object) => object is String; } ðNN<#,1,1$B0IL1" P 0N&0&*<( = 3 '5PNOKQ2 3 % &H3 0 ( &N;9-='F, @6>""$3!L $0.$.&1./ 2HF=;9-5&F, 0.6.'F ,.LG,.&1./ .=&3 *6>))2"5 0".&./IQ@8Q#F  2L@3N7;9->F  -*9A 2 -5 $6:KF;9-9"$:<! 2,4-8!32-!3-5- + ,:@./ 08KPNKMOOL 0+8" "L "/ ")"QN5MM!P.3QJO&*8 <P@H!2O! 4H8@ 6 8EA<# 1/ : 7$package:collection/src/equality.dart€å„›bfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/equality_map.dart„{// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'equality.dart'; import 'wrappers.dart'; /// A [Map] whose key equality is determined by an [Equality] object. class EqualityMap extends DelegatingMap { /// Creates a map with equality based on [equality]. EqualityMap(Equality equality) : super(LinkedHashMap( equals: equality.equals, hashCode: equality.hash, isValidKey: equality.isValidKey)); /// Creates a map with equality based on [equality] that contains all /// key-value pairs of [other]. /// /// If [other] has multiple keys that are equivalent according to [equality], /// the last one reached during iteration takes precedence. EqualityMap.from(Equality equality, Map other) : super(LinkedHashMap( equals: equality.equals, hashCode: equality.hash, isValidKey: equality.isValidKey)) { addAll(other); } } !NN<F67$%%/H"P>:%%0(package:collection/src/equality_map.dartbfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/equality_set.dart„s// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'equality.dart'; import 'wrappers.dart'; /// A [Set] whose key equality is determined by an [Equality] object. class EqualitySet extends DelegatingSet { /// Creates a set with equality based on [equality]. EqualitySet(Equality equality) : super(LinkedHashSet( equals: equality.equals, hashCode: equality.hash, isValidKey: equality.isValidKey)); /// Creates a set with equality based on [equality] that contains all /// elements in [other]. /// /// If [other] has multiple values that are equivalent according to /// [equality], the first one reached during iteration takes precedence. EqualitySet.from(Equality equality, Iterable other) : super(LinkedHashSet( equals: equality.equals, hashCode: equality.hash, isValidKey: equality.isValidKey)) { addAll(other); } } !NN<F07$%%/HFK<%%0(package:collection/src/equality_set.dart_file:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/functions.dart›®// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'dart:math' as math; import 'utils.dart'; /// Creates a new map from [map] with new keys and values. /// /// The return values of [key] are used as the keys and the return values of /// [value] are used as the values for the new map. @Deprecated('Use Map.map or a for loop in a Map literal.') Map mapMap(Map map, {K2 Function(K1, V1)? key, V2 Function(K1, V1)? value}) { var keyFn = key ?? (mapKey, _) => mapKey as K2; var valueFn = value ?? (_, mapValue) => mapValue as V2; var result = {}; map.forEach((mapKey, mapValue) { result[keyFn(mapKey, mapValue)] = valueFn(mapKey, mapValue); }); return result; } /// Returns a new map with all key/value pairs in both [map1] and [map2]. /// /// If there are keys that occur in both maps, the [value] function is used to /// select the value that goes into the resulting map based on the two original /// values. If [value] is omitted, the value from [map2] is used. Map mergeMaps(Map map1, Map map2, {V Function(V, V)? value}) { var result = Map.of(map1); if (value == null) return result..addAll(map2); map2.forEach((key, mapValue) { result[key] = result.containsKey(key) ? value(result[key] as V, mapValue) : mapValue; }); return result; } /// Groups the elements in [values] by the value returned by [key]. /// /// Returns a map from keys computed by [key] to a list of all values for which /// [key] returns that key. The values appear in the list in the same relative /// order as in [values]. Map> groupBy(Iterable values, T Function(S) key) { var map = >{}; for (var element in values) { (map[key(element)] ??= []).add(element); } return map; } /// Returns the element of [values] for which [orderBy] returns the minimum /// value. /// /// The values returned by [orderBy] are compared using the [compare] function. /// If [compare] is omitted, values must implement [Comparable] and they are /// compared using their [Comparable.compareTo]. /// /// Returns `null` if [values] is empty. S? minBy(Iterable values, T Function(S) orderBy, {int Function(T, T)? compare}) { compare ??= defaultCompare; S? minValue; T? minOrderBy; for (var element in values) { var elementOrderBy = orderBy(element); if (minOrderBy == null || compare(elementOrderBy, minOrderBy) < 0) { minValue = element; minOrderBy = elementOrderBy; } } return minValue; } /// Returns the element of [values] for which [orderBy] returns the maximum /// value. /// /// The values returned by [orderBy] are compared using the [compare] function. /// If [compare] is omitted, values must implement [Comparable] and they are /// compared using their [Comparable.compareTo]. /// /// Returns `null` if [values] is empty. S? maxBy(Iterable values, T Function(S?) orderBy, {int? Function(T, T)? compare}) { compare ??= defaultCompare; S? maxValue; T? maxOrderBy; for (var element in values) { var elementOrderBy = orderBy(element); if (maxOrderBy == null || compare(elementOrderBy, maxOrderBy)! > 0) { maxValue = element; maxOrderBy = elementOrderBy; } } return maxValue; } /// Returns the [transitive closure][] of [graph]. /// /// [transitive closure]: https://en.wikipedia.org/wiki/Transitive_closure /// /// Interprets [graph] as a directed graph with a vertex for each key and edges /// from each key to the values that the key maps to. /// /// Assumes that every vertex in the graph has a key to represent it, even if /// that vertex has no outgoing edges. This isn't checked, but if it's not /// satisfied, the function may crash or provide unexpected output. For example, /// `{"a": ["b"]}` is not valid, but `{"a": ["b"], "b": []}` is. Map> transitiveClosure(Map> graph) { // This uses [Warshall's algorithm][], modified not to add a vertex from each // node to itself. // // [Warshall's algorithm]: https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm#Applications_and_generalizations. var result = >{}; graph.forEach((vertex, edges) { result[vertex] = Set.from(edges); }); // Lists are faster to iterate than maps, so we create a list since we're // iterating repeatedly. var keys = graph.keys.toList(); for (var vertex1 in keys) { for (var vertex2 in keys) { for (var vertex3 in keys) { if (result[vertex2]!.contains(vertex1) && result[vertex1]!.contains(vertex3)) { result[vertex2]!.add(vertex3); } } } } return result; } /// Returns the [strongly connected components][] of [graph], in topological /// order. /// /// [strongly connected components]: https://en.wikipedia.org/wiki/Strongly_connected_component /// /// Interprets [graph] as a directed graph with a vertex for each key and edges /// from each key to the values that the key maps to. /// /// Assumes that every vertex in the graph has a key to represent it, even if /// that vertex has no outgoing edges. This isn't checked, but if it's not /// satisfied, the function may crash or provide unexpected output. For example, /// `{"a": ["b"]}` is not valid, but `{"a": ["b"], "b": []}` is. List> stronglyConnectedComponents(Map> graph) { // This uses [Tarjan's algorithm][]. // // [Tarjan's algorithm]: https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm var index = 0; var stack = []; var result = >[]; // The order of these doesn't matter, so we use un-linked implementations to // avoid unnecessary overhead. var indices = HashMap(); var lowLinks = HashMap(); var onStack = HashSet(); void strongConnect(T vertex) { indices[vertex] = index; lowLinks[vertex] = index; index++; stack.add(vertex); onStack.add(vertex); for (var successor in graph[vertex]!) { if (!indices.containsKey(successor)) { strongConnect(successor); lowLinks[vertex] = math.min(lowLinks[vertex]!, lowLinks[successor]!); } else if (onStack.contains(successor)) { lowLinks[vertex] = math.min(lowLinks[vertex]!, lowLinks[successor]!); } } if (lowLinks[vertex] == indices[vertex]) { var component = {}; T? neighbor; do { neighbor = stack.removeLast(); onStack.remove(neighbor); component.add(neighbor as T); } while (neighbor != vertex); result.add(component); } } for (var vertex in graph.keys) { if (!indices.containsKey(vertex)) strongConnect(vertex); } // Tarjan's algorithm produces a reverse-topological sort, so we reverse it to // get a normal topological sort. return result.reversed.toList(); } €ÏNN<;M4;4>2:#AJOPB:!#2!PDPOG -L PP1):% +I#L PP1);& +J#3KP6NKQAAP~")L" "22) M `P6NKQAI'lO!#$! ,-"N0N/ '"&$#=Q$#%package:collection/src/functions.dart…ã„›ifile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/iterable_extensions.dartÀb˜// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:math' show Random; import 'package:collection/src/utils.dart'; import 'algorithms.dart'; /// Extensions that apply to all iterables. /// /// These extensions provide direct access to some of the /// algorithms expose by this package, /// as well as some generally useful convenience methods. /// /// More specialized extension methods that only apply to /// iterables with specific element types include those of /// [IterableComparableExtension] and [IterableNullableExtension]. extension IterableExtension on Iterable { /// Selects [count] elements at random from this iterable. /// /// The returned list contains [count] different elements of the iterable. /// If the iterable contains fewer that [count] elements, /// the result will contain all of them, but will be shorter than [count]. /// If the same value occurs more than once in the iterable, /// it can also occur more than once in the chosen elements. /// /// Each element of the iterable has the same chance of being chosen. /// The chosen elements are not in any specific order. List sample(int count, [Random? random]) { RangeError.checkNotNegative(count, 'count'); var iterator = this.iterator; var chosen = []; for (var i = 0; i < count; i++) { if (iterator.moveNext()) { chosen.add(iterator.current); } else { return chosen; } } var index = count; random ??= Random(); while (iterator.moveNext()) { index++; var position = random.nextInt(index); if (position < count) chosen[position] = iterator.current; } return chosen; } /// The elements that do not satisfy [test]. Iterable whereNot(bool Function(T element) test) => where((element) => !test(element)); /// Creates a sorted list of the elements of the iterable. /// /// The elements are ordered by the [compare] [Comparator]. List sorted(Comparator compare) => [...this]..sort(compare); /// Creates a sorted list of the elements of the iterable. /// /// The elements are ordered by the natural ordering of the /// property [keyOf] of the element. List sortedBy>(K Function(T element) keyOf) { var elements = [...this]; quickSortBy(elements, keyOf, compareComparable); return elements; } /// Creates a sorted list of the elements of the iterable. /// /// The elements are ordered by the [compare] [Comparator] of the /// property [keyOf] of the element. List sortedByCompare( K Function(T element) keyOf, Comparator compare) { var elements = [...this]; quickSortBy(elements, keyOf, compare); return elements; } /// Whether the elements are sorted by the [compare] ordering. /// /// Compares pairs of elements using `compare` to check that /// the elements of this iterable to check /// that earlier elements always compare /// smaller than or equal to later elements. /// /// An single-element or empty iterable is trivially in sorted order. bool isSorted(Comparator compare) { var iterator = this.iterator; if (!iterator.moveNext()) return true; var previousElement = iterator.current; while (iterator.moveNext()) { var element = iterator.current; if (compare(previousElement, element) > 0) return false; previousElement = element; } return true; } /// Whether the elements are sorted by their [keyOf] property. /// /// Applies [keyOf] to each element in iteration order, /// then checks whether the results are in non-decreasing [Comparable] order. bool isSortedBy>(K Function(T element) keyOf) { var iterator = this.iterator; if (!iterator.moveNext()) return true; var previousKey = keyOf(iterator.current); while (iterator.moveNext()) { var key = keyOf(iterator.current); if (previousKey.compareTo(key) > 0) return false; previousKey = key; } return true; } /// Whether the elements are [compare]-sorted by their [keyOf] property. /// /// Applies [keyOf] to each element in iteration order, /// then checks whether the results are in non-decreasing order /// using the [compare] [Comparator].. bool isSortedByCompare( K Function(T element) keyOf, Comparator compare) { var iterator = this.iterator; if (!iterator.moveNext()) return true; var previousKey = keyOf(iterator.current); while (iterator.moveNext()) { var key = keyOf(iterator.current); if (compare(previousKey, key) > 0) return false; previousKey = key; } return true; } /// Takes an action for each element. /// /// Calls [action] for each element along with the index in the /// iteration order. void forEachIndexed(void Function(int index, T element) action) { var index = 0; for (var element in this) { action(index++, element); } } /// Takes an action for each element as long as desired. /// /// Calls [action] for each element. /// Stops iteration if [action] returns `false`. void forEachWhile(bool Function(T element) action) { for (var element in this) { if (!action(element)) break; } } /// Takes an action for each element and index as long as desired. /// /// Calls [action] for each element along with the index in the /// iteration order. /// Stops iteration if [action] returns `false`. void forEachIndexedWhile(bool Function(int index, T element) action) { var index = 0; for (var element in this) { if (!action(index++, element)) break; } } /// Maps each element and its index to a new value. Iterable mapIndexed(R Function(int index, T element) convert) sync* { var index = 0; for (var element in this) { yield convert(index++, element); } } /// The elements whose value and index satisfies [test]. Iterable whereIndexed(bool Function(int index, T element) test) sync* { var index = 0; for (var element in this) { if (test(index++, element)) yield element; } } /// The elements whose value and index do not satisfy [test]. Iterable whereNotIndexed(bool Function(int index, T element) test) sync* { var index = 0; for (var element in this) { if (!test(index++, element)) yield element; } } /// Expands each element and index to a number of elements in a new iterable. Iterable expandIndexed( Iterable Function(int index, T element) expend) sync* { var index = 0; for (var element in this) { yield* expend(index++, element); } } /// Combine the elements with each other and the current index. /// /// Calls [combine] for each element except the first. /// The call passes the index of the current element, the result of the /// previous call, or the first element for the first call, and /// the current element. /// /// Returns the result of the last call, or the first element if /// there is only one element. /// There must be at least one element. T reduceIndexed(T Function(int index, T previous, T element) combine) { var iterator = this.iterator; if (!iterator.moveNext()) { throw StateError('no elements'); } var index = 1; var result = iterator.current; while (iterator.moveNext()) { result = combine(index++, result, iterator.current); } return result; } /// Combine the elements with a value and the current index. /// /// Calls [combine] for each element with the current index, /// the result of the previous call, or [initialValue] for the first element, /// and the current element. /// /// Returns the result of the last call to [combine], /// or [initialValue] if there are no elements. R foldIndexed( R initialValue, R Function(int index, R previous, T element) combine) { var result = initialValue; var index = 0; for (var element in this) { result = combine(index++, result, element); } return result; } /// The first element satisfying [test], or `null` if there are none. T? firstWhereOrNull(bool Function(T element) test) { for (var element in this) { if (test(element)) return element; } return null; } /// The first element whose value and index satisfies [test]. /// /// Returns `null` if there are no element and index satisfying [test]. T? firstWhereIndexedOrNull(bool Function(int index, T element) test) { var index = 0; for (var element in this) { if (test(index++, element)) return element; } return null; } /// The first element, or `null` if the iterable is empty. T? get firstOrNull { var iterator = this.iterator; if (iterator.moveNext()) return iterator.current; return null; } /// The last element satisfying [test], or `null` if there are none. T? lastWhereOrNull(bool Function(T element) test) { T? result; for (var element in this) { if (test(element)) result = element; } return result; } /// The last element whose index and value satisfies [test]. /// /// Returns `null` if no element and index satisfies [test]. T? lastWhereIndexedOrNull(bool Function(int index, T element) test) { T? result; var index = 0; for (var element in this) { if (test(index++, element)) result = element; } return result; } /// The last element, or `null` if the iterable is empty. T? get lastOrNull { if (isEmpty) return null; return last; } /// The single element satisfying [test]. /// /// Returns `null` if there are either no elements /// or more than one element satisfying [test]. /// /// **Notice**: This behavior differs from [Iterable.singleWhere] /// which always throws if there are more than one match, /// and only calls the `orElse` function on zero matchs. T? singleWhereOrNull(bool Function(T element) test) { T? result; var found = false; for (var element in this) { if (test(element)) { if (!found) { result = element; found = true; } else { return null; } } } return result; } /// The single element satisfying [test]. /// /// Returns `null` if there are either none /// or more than one element and index satisfying [test]. T? singleWhereIndexedOrNull(bool Function(int index, T element) test) { T? result; var found = false; var index = 0; for (var element in this) { if (test(index++, element)) { if (!found) { result = element; found = true; } else { return null; } } } return result; } /// The single element of the iterable, or `null`. /// /// The value is `null` if the iterable is empty /// or it contains more than one element. T? get singleOrNull { var iterator = this.iterator; if (iterator.moveNext()) { var result = iterator.current; if (!iterator.moveNext()) { return result; } } return null; } /// Groups elements by [keyOf] then folds the elements in each group. /// /// A key is found for each element using [keyOf]. /// Then the elements with the same key are all folded using [combine]. /// The first call to [combine] for a particular key receives [null] as /// the previous value, the remaining ones receive the result of the previous call. /// /// Can be used to _group_ elements into arbitrary collections. /// For example [groupSetsBy] could be written as: /// ```dart /// iterable.groupFoldBy(keyOf, /// (Set? previous, T element) => (previous ?? {})..add(element)); /// ```` Map groupFoldBy( K Function(T element) keyOf, G Function(G? previous, T element) combine) { var result = {}; for (var element in this) { var key = keyOf(element); result[key] = combine(result[key], element); } return result; } /// Groups elements into sets by [keyOf]. Map> groupSetsBy(K Function(T element) keyOf) { var result = >{}; for (var element in this) { (result[keyOf(element)] ??= {})..add(element); } return result; } /// Groups elements into lists by [keyOf]. Map> groupListsBy(K Function(T element) keyOf) { var result = >{}; for (var element in this) { (result[keyOf(element)] ??= [])..add(element); } return result; } /// Splits the elements into chunks before some elements. /// /// Each element except the first is checked using [test] /// for whether it should start a new chunk. /// If so, the elements since the previous chunk-starting element /// are emitted as a list. /// Any final elements are emitted at the end. /// /// Example: /// Example: /// ```dart /// var parts = [1, 2, 3, 4, 5, 6, 7, 8, 9].split(isPrime); /// print(parts); // ([1], [2], [3, 4], [5, 6], [7, 8, 9]) /// ``` Iterable> splitBefore(bool Function(T element) test) => splitBeforeIndexed((_, element) => test(element)); /// Splits the elements into chunks before some elements. /// /// Each element is checked using [test] for whether it should start a new chunk. /// If so, the elements since the previous chunk-starting element /// are emitted as a list. /// Any final elements are emitted at the end. /// /// Example: /// ```dart /// var parts = [1, 0, 2, 1, 5, 7, 6, 8, 9].splitAfter(isPrime); /// print(parts); // ([1, 0, 2], [1, 5], [7], [6, 8, 9]) /// ``` Iterable> splitAfter(bool Function(T element) test) => splitAfterIndexed((_, element) => test(element)); /// Splits the elements into chunks between some elements. /// /// Each pair of adjacent elements are checked using [test] /// for whether a chunk should end between them. /// If so, the elements since the previous chunk-splitting elements /// are emitted as a list. /// Any final elements are emitted at the end. /// /// Example: /// ```dart /// var parts = [1, 0, 2, 1, 5, 7, 6, 8, 9].splitBetween((i, v1, v2) => v1 > v2); /// print(parts); // ([1], [0, 2], [1, 5, 7], [6, 8, 9]) /// ``` Iterable> splitBetween(bool Function(T first, T second) test) => splitBetweenIndexed((_, first, second) => test(first, second)); /// Splits the elements into chunks before some elements and indices. /// /// Each element and index except the first is checked using [test] /// for whether it should start a new chunk. /// If so, the elements since the previous chunk-starting element /// are emitted as a list. /// Any final elements are emitted at the end. /// /// Example: /// ```dart /// var parts = [1, 0, 2, 1, 5, 7, 6, 8, 9] /// .splitBeforeIndexed((i, v) => i < v); /// print(parts); // ([1], [0, 2], [1, 5, 7], [6, 8, 9]) /// ``` Iterable> splitBeforeIndexed( bool Function(int index, T element) test) sync* { var iterator = this.iterator; if (!iterator.moveNext()) { return; } var index = 1; var chunk = [iterator.current]; while (iterator.moveNext()) { var element = iterator.current; if (test(index++, element)) { yield chunk; chunk = []; } chunk.add(element); } yield chunk; } /// Splits the elements into chunks after some elements and indices. /// /// Each element and index is checked using [test] /// for whether it should end the current chunk. /// If so, the elements since the previous chunk-ending element /// are emitted as a list. /// Any final elements are emitted at the end, whether the last /// element should be split after or not. /// /// Example: /// ```dart /// var parts = [1, 0, 2, 1, 5, 7, 6, 8, 9].splitAfterIndexed((i, v) => i < v); /// print(parts); // ([1, 0], [2, 1], [5, 7, 6], [8, 9]) /// ``` Iterable> splitAfterIndexed( bool Function(int index, T element) test) sync* { var index = 0; List? chunk; for (var element in this) { (chunk ??= []).add(element); if (test(index++, element)) { yield chunk; chunk = null; } } if (chunk != null) yield chunk; } /// Splits the elements into chunks between some elements and indices. /// /// Each pair of adjacent elements and the index of the latter are /// checked using [test] for whether a chunk should end between them. /// If so, the elements since the previous chunk-splitting elements /// are emitted as a list. /// Any final elements are emitted at the end. /// /// Example: /// ```dart /// var parts = [1, 0, 2, 1, 5, 7, 6, 8, 9] /// .splitBetweenIndexed((i, v1, v2) => v1 > v2); /// print(parts); // ([1], [0, 2], [1, 5, 7], [6, 8, 9]) /// ``` Iterable> splitBetweenIndexed( bool Function(int index, T first, T second) test) sync* { var iterator = this.iterator; if (!iterator.moveNext()) return; var previous = iterator.current; var chunk = [previous]; var index = 1; while (iterator.moveNext()) { var element = iterator.current; if (test(index++, previous, element)) { yield chunk; chunk = []; } chunk.add(element); previous = element; } yield chunk; } /// Whether no element satisfies [test]. /// /// Returns true if no element satisfies [test], /// and false if at least one does. /// /// Equivalent to `iterable.every((x) => !test(x))` or /// `!iterable.any(test)`. bool none(bool Function(T) test) { for (var element in this) { if (test(element)) return false; } return true; } } /// Extensions that apply to iterables with a nullable element type. extension IterableNullableExtension on Iterable { /// The non-`null` elements of this `Iterable`. /// /// Returns an iterable which emits all the non-`null` elements /// of this iterable, in their original iteration order. /// /// For an `Iterable`, this method is equivalent to `.whereType()`. Iterable whereNotNull() sync* { for (var element in this) { if (element != null) yield element; } } } /// Extensions that apply to iterables of numbers. extension IterableNumberExtension on Iterable { /// The sum of the elements. /// /// The sum is zero if the iterable is empty. num get sum { num result = 0; for (var value in this) { result += value; } return result; } /// The arithmetic mean of the elements of a non-empty iterable. /// /// The arithmetic mean is the sum of the elements /// divided by the number of elements. /// /// The iterable must not be empty. double get average { var result = 0.0; var count = 0; for (var value in this) { count += 1; result += (value - result) / count; } if (count == 0) throw StateError('No elements'); return result; } } /// Extension on iterables of integers. /// /// Specialized version of some extensions of [IterableNumberExtension]. extension IterableIntegerExtension on Iterable { /// The sum of the elements. /// /// The sum is zero if the iterable is empty. int get sum { var result = 0; for (var value in this) { result += value; } return result; } /// The arithmetic mean of the elements of a non-empty iterable. /// /// The arithmetic mean is the sum of the elements /// divided by the number of elements. /// This method is specialized for integers, /// and may give a different result than [IterableNumberExtension.average] /// for the same values, because the the number algorithm /// converts all numbers to doubles. /// /// The iterable must not be empty. double get average { var average = 0; var remainder = 0; var count = 0; for (var value in this) { // Invariant: Sum of values so far = average * count + remainder. // (Unless overflow has occurred). count += 1; var delta = value - average + remainder; average += delta ~/ count; remainder = delta.remainder(count); } if (count == 0) throw StateError('No elements'); return average + remainder / count; } } /// Extension on iterables of double. /// /// Specialized version of some extensions of [IterableNumberExtension]. extension IterableDoubleExtension on Iterable { /// The sum of the elements. /// /// The sum is zero if the iterable is empty. double get sum { var result = 0.0; for (var value in this) { result += value; } return result; } } /// Extensions on iterables whose elements are also iterables. extension IterableIterableExtension on Iterable> { /// The sequential elements of each iterable in this iterable. /// /// Iterates the elements of this iterable. /// For each one, which is itself an iterable, /// all the elements of that are emitted /// on the returned iterable, before moving on to the next element. Iterable get flattened sync* { for (var elements in this) { yield* elements; } } } /// Extensions that apply to iterables of [Comparable] elements. /// /// These operations can assume that the elements have a natural ordering, /// and can therefore omit, or make it optional, for the user to provide /// a [Comparator]. extension IterableComparableExtension> on Iterable { /// A minimal element of the iterable, or `null` it the iterable is empty. T? get minOrNull { var iterator = this.iterator; if (iterator.moveNext()) { var value = iterator.current; while (iterator.moveNext()) { var newValue = iterator.current; if (value.compareTo(newValue) > 0) { value = newValue; } } return value; } return null; } /// A minimal element of the iterable. /// /// The iterable must not be empty. T get min { var iterator = this.iterator; if (iterator.moveNext()) { var value = iterator.current; while (iterator.moveNext()) { var newValue = iterator.current; if (value.compareTo(newValue) > 0) { value = newValue; } } return value; } throw StateError('No element'); } /// A maximal element of the iterable, or `null` if the iterable is empty. T? get maxOrNull { var iterator = this.iterator; if (iterator.moveNext()) { var value = iterator.current; while (iterator.moveNext()) { var newValue = iterator.current; if (value.compareTo(newValue) < 0) { value = newValue; } } return value; } return null; } /// A maximal element of the iterable. /// /// The iterable must not be empty. T get max { var iterator = this.iterator; if (iterator.moveNext()) { var value = iterator.current; while (iterator.moveNext()) { var newValue = iterator.current; if (value.compareTo(newValue) < 0) { value = newValue; } } return value; } throw StateError('No element'); } /// Creates a sorted list of the elements of the iterable. /// /// If the [compare] function is not supplied, the sorting uses the /// natural [Comparable] ordering of the elements. List sorted([Comparator? compare]) => [...this]..sort(compare); /// Whether the elements are sorted by the [compare] ordering. /// /// If [compare] is omitted, it defaults to comparing the /// elements using their natural [Comparable] ordering. bool isSorted([Comparator? compare]) { if (compare != null) { return IterableExtension(this).isSorted(compare); } var iterator = this.iterator; if (!iterator.moveNext()) return true; var previousElement = iterator.current; while (iterator.moveNext()) { var element = iterator.current; if (previousElement.compareTo(element) > 0) return false; previousElement = element; } return true; } } /// Extensions on comparator functions. extension ComparatorExtension on Comparator { /// The inverse ordering of this comparator. Comparator get inverse => (T a, T b) => this(b, a); /// Makes a comparator on [R] values using this comparator. /// /// Compares [R] values by comparing their [keyOf] value /// using this comparator. Comparator compareBy(T Function(R) keyOf) => (R a, R b) => this(keyOf(a), keyOf(b)); /// Combine comparators sequentially. /// /// Creates a comparator which orders elements the same way as /// this comparator, except that when two elements are considered /// equal, the [tieBreaker] comparator is used instead. Comparator then(Comparator tieBreaker) => (T a, T b) { var result = this(a, b); if (result == 0) result = tieBreaker(a, b); return result; }; } ƒNN< ,,:'::;C0=ME=>'K;=D'<1A?-+/H)"+,"&?!A:PJ"+/")8K:B)<"+/")7(BD ;'37 #EB3I ,6N ';M 1@P 2P A 'B9JBC!*J" '#";??P82N 2H7 )@JI 2="6G6 +??H 4<,52D<;8  ,.= B9<TD1C; A8=>3F1T; KFHF/D1.0; (8" $"&$G53BB,R; '8 #$$IEHF1.7; )@"&%"&.+3&9% 'EH2B;M% *350C5)&*5(I60C5)/M<'&H)/!*5(&I80?BA.1+F$!AKIPM"$$)- )&"$$)- $M"$$)- )&"$$)- $=F5HA<:,8"+,"&@!(4/9>;5.(AD:?!4 /package:collection/src/iterable_extensions.dartbfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/iterable_zip.dart†ì// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; /// Iterable that iterates over lists of values from other iterables. /// /// When [iterator] is read, an [Iterator] is created for each [Iterable] in /// the [Iterable] passed to the constructor. /// /// As long as all these iterators have a next value, those next values are /// combined into a single list, which becomes the next value of this /// [Iterable]'s [Iterator]. As soon as any of the iterators run out, /// the zipped iterator also stops. class IterableZip extends IterableBase> { final Iterable> _iterables; IterableZip(Iterable> iterables) : _iterables = iterables; /// Returns an iterator that combines values of the iterables' iterators /// as long as they all have values. @override Iterator> get iterator { var iterators = _iterables.map((x) => x.iterator).toList(growable: false); return _IteratorZip(iterators); } } class _IteratorZip implements Iterator> { final List> _iterators; List? _current; _IteratorZip(List> iterators) : _iterators = iterators; @override bool moveNext() { if (_iterators.isEmpty) return false; for (var i = 0; i < _iterators.length; i++) { if (!_iterators[i].moveNext()) { _current = null; return false; } } _current = List.generate(_iterators.length, (i) => _iterators[i].current, growable: false); return true; } @override List get current => _current ?? (throw StateError('No element')); } 6NN<FM.LFF$5*IK' #O'5&F *2'N G(package:collection/src/iterable_zip.dartefile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/list_extensions.dartÀB// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // Extension methods on common collection types. import 'dart:collection'; import 'dart:math'; import 'algorithms.dart'; import 'algorithms.dart' as algorithms; import 'equality.dart'; import 'utils.dart'; /// Various extensions on lists of arbitrary elements. extension ListExtensions on List { /// Returns the index of [element] in this sorted list. /// /// Uses binary search to find the location of [element]. /// The list *must* be sorted according to [compare], /// otherwise the result is unspecified /// /// Returns -1 if [element] does not occur in this list. int binarySearch(E element, int Function(E, E) compare) => algorithms.binarySearchBy(this, identity, compare, element); /// Returns the index of [element] in this sorted list. /// /// Uses binary search to find the location of [element]. /// The list *must* be sorted according to [compare] on the [keyOf] of elements, /// otherwise the result is unspecified. /// /// Returns -1 if [element] does not occur in this list. /// /// If [start] and [end] are supplied, only the list range from [start] to [end] /// is searched, and only that range needs to be sorted. int binarySearchByCompare( E element, K Function(E element) keyOf, int Function(K, K) compare, [int start = 0, int? end]) => algorithms.binarySearchBy( this, keyOf, compare, element, start, end); /// Returns the index of [element] in this sorted list. /// /// Uses binary search to find the location of [element]. /// The list *must* be sorted according to the natural ordering of /// the [keyOf] of elements, otherwise the result is unspecified. /// /// Returns -1 if [element] does not occur in this list. /// /// If [start] and [end] are supplied, only the list range from [start] to [end] /// is searched, and only that range needs to be sorted. int binarySearchBy>( E element, K Function(E element) keyOf, [int start = 0, int? end]) => algorithms.binarySearchBy( this, keyOf, (a, b) => a.compareTo(b), element, start, end); /// Returns the index where [element] should be in this sorted list. /// /// Uses binary search to find the location of [element]. /// The list *must* be sorted according to [compare], /// otherwise the result is unspecified. /// /// If [element] is in the list, its index is returned, /// otherwise returns the first position where adding [element] /// would keep the list sorted. This may be the [length] of /// the list if all elements of the list compare less than /// [element]. int lowerBound(E element, int Function(E, E) compare) => algorithms.lowerBoundBy(this, identity, compare, element); /// Returns the index where [element] should be in this sorted list. /// /// Uses binary search to find the location of [element]. /// The list *must* be sorted according to [compare] of /// the [keyOf] of the elements, otherwise the result is unspecified. /// /// If [element] is in the list, its index is returned, /// otherwise returns the first position where adding [element] /// would keep the list sorted. This may be the [length] of /// the list if all elements of the list compare less than /// [element]. /// /// If [start] and [end] are supplied, only that range is searched, /// and only that range need to be sorted. int lowerBoundByCompare( E element, K Function(E) keyOf, int Function(K, K) compare, [int start = 0, int? end]) => algorithms.lowerBoundBy(this, keyOf, compare, element, start, end); /// Returns the index where [element] should be in this sorted list. /// /// Uses binary search to find the location of [element]. /// The list *must* be sorted according to the /// natural ordering of the [keyOf] of the elements, /// otherwise the result is unspecified. /// /// If [element] is in the list, its index is returned, /// otherwise returns the first position where adding [element] /// would keep the list sorted. This may be the [length] of /// the list if all elements of the list compare less than /// [element]. /// /// If [start] and [end] are supplied, only that range is searched, /// and only that range need to be sorted. int lowerBoundBy>(E element, K Function(E) keyOf, [int start = 0, int? end]) => algorithms.lowerBoundBy( this, keyOf, compareComparable, element, start, end); /// Takes an action for each element. /// /// Calls [action] for each element along with the index in the /// iteration order. void forEachIndexed(void Function(int index, E element) action) { for (var index = 0; index < length; index++) { action(index, this[index]); } } /// Takes an action for each element as long as desired. /// /// Calls [action] for each element. /// Stops iteration if [action] returns `false`. void forEachWhile(bool Function(E element) action) { for (var index = 0; index < length; index++) { if (!action(this[index])) break; } } /// Takes an action for each element and index as long as desired. /// /// Calls [action] for each element along with the index in the /// iteration order. /// Stops iteration if [action] returns `false`. void forEachIndexedWhile(bool Function(int index, E element) action) { for (var index = 0; index < length; index++) { if (!action(index, this[index])) break; } } /// Maps each element and its index to a new value. Iterable mapIndexed(R Function(int index, E element) convert) sync* { for (var index = 0; index < length; index++) { yield convert(index, this[index]); } } /// The elements whose value and index satisfies [test]. Iterable whereIndexed(bool Function(int index, E element) test) sync* { for (var index = 0; index < length; index++) { var element = this[index]; if (test(index, element)) yield element; } } /// The elements whose value and index do not satisfy [test]. Iterable whereNotIndexed(bool Function(int index, E element) test) sync* { for (var index = 0; index < length; index++) { var element = this[index]; if (!test(index, element)) yield element; } } /// Expands each element and index to a number of elements in a new iterable. /// /// Like [Iterable.expand] except that the callback function is supplied with /// both the index and the element. Iterable expandIndexed( Iterable Function(int index, E element) expand) sync* { for (var index = 0; index < length; index++) { yield* expand(index, this[index]); } } /// Sort a range of elements by [compare]. void sortRange(int start, int end, int Function(E a, E b) compare) { quickSortBy(this, identity, compare, start, end); } /// Sorts elements by the [compare] of their [keyOf] property. /// /// Sorts elements from [start] to [end], defaulting to the entire list. void sortByCompare( K Function(E element) keyOf, int Function(K a, K b) compare, [int start = 0, int? end]) { quickSortBy(this, keyOf, compare, start, end); } /// Sorts elements by the natural order of their [keyOf] property. /// /// Sorts elements from [start] to [end], defaulting to the entire list. void sortBy>(K Function(E element) keyOf, [int start = 0, int? end]) { quickSortBy(this, keyOf, compareComparable, start, end); } /// Shuffle a range of elements. void shuffleRange(int start, int end, [Random? random]) { RangeError.checkValidRange(start, end, length); shuffle(this, start, end, random); } /// Reverses the elements in a range of the list. void reverseRange(int start, int end) { RangeError.checkValidRange(start, end, length); while (start < --end) { var tmp = this[start]; this[start] = this[end]; this[end] = tmp; start += 1; } } /// Swaps two elements of this list. void swap(int index1, int index2) { RangeError.checkValidIndex(index1, this, 'index1'); RangeError.checkValidIndex(index2, this, 'index2'); var tmp = this[index1]; this[index1] = this[index2]; this[index2] = tmp; } /// A fixed length view of a range of this list. /// /// The view is backed by this this list, which must not /// change its length while the view is being used. /// /// The view can be used to perform specific whole-list /// actions on a part of the list. /// For example, to see if a list contains more than one /// "marker" element, you can do: /// ```dart /// someList.slice(someList.indexOf(marker) + 1).contains(marker) /// ``` ListSlice slice(int start, [int? end]) { end = RangeError.checkValidRange(start, end, length); var self = this; if (self is ListSlice) return self.slice(start, end); return ListSlice(this, start, end); } /// Whether [other] has the same elements as this list. /// /// Returns true iff [other] has the same [length] /// as this list, and the elemets of this list and [other] /// at the same indices are equal according to [equality], /// which defaults to using `==`. bool equals(List other, [Equality equality = const DefaultEquality()]) { if (length != other.length) return false; for (var i = 0; i < length; i++) { if (!equality.equals(this[i], other[i])) return false; } return true; } } /// Various extensions on lists of comparable elements. extension ListComparableExtensions> on List { /// Returns the index of [element] in this sorted list. /// /// Uses binary search to find the location of [element]. /// The list *must* be sorted according to [compare], /// otherwise the result is unspecified. /// If [compare] is omitted, it uses the natural order of the elements. /// /// Returns -1 if [element] does not occur in this list. int binarySearch(E element, [int Function(E, E)? compare]) => algorithms.binarySearchBy( this, identity, compare ?? compareComparable, element); /// Returns the index where [element] should be in this sorted list. /// /// Uses binary search to find the location of where [element] should be. /// The list *must* be sorted according to [compare], /// otherwise the result is unspecified. /// If [compare] is omitted, it uses the natural order of the elements. /// /// If [element] does not occur in this list, the returned index is /// the first index where inserting [element] would keep the list /// sorted. int lowerBound(E element, [int Function(E, E)? compare]) => algorithms.lowerBoundBy( this, identity, compare ?? compareComparable, element); /// Sort a range of elements by [compare]. /// /// If [compare] is omitted, the range is sorted according to the /// natural ordering of the elements. void sortRange(int start, int end, [int Function(E a, E b)? compare]) { RangeError.checkValidRange(start, end, length); algorithms.quickSortBy( this, identity, compare ?? compareComparable, start, end); } } /// A list view of a range of another list. /// /// Wraps the range of the [source] list from [start] to [end] /// and acts like a fixed-length list view of that range. /// The source list must not change length while a list slice is being used. class ListSlice extends ListBase { /// Original length of [source]. /// /// Used to detect modifications to [source] which may invalidate /// the slice. final int _initialSize; /// The original list backing this slice. final List source; /// The start index of the slice. final int start; @override final int length; /// Creates a slice of [source] from [start] to [end]. ListSlice(this.source, this.start, int end) : length = end - start, _initialSize = source.length { RangeError.checkValidRange(start, end, source.length); } // No argument checking, for internal use. ListSlice._(this._initialSize, this.source, this.start, this.length); /// The end index of the slice. int get end => start + length; @override E operator [](int index) { if (source.length != _initialSize) { throw ConcurrentModificationError(source); } RangeError.checkValidIndex(index, this, null, length); return source[start + index]; } @override void operator []=(int index, E value) { if (source.length != _initialSize) { throw ConcurrentModificationError(source); } RangeError.checkValidIndex(index, this, null, length); source[start + index] = value; } @override void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) { if (source.length != _initialSize) { throw ConcurrentModificationError(source); } RangeError.checkValidRange(start, end, length); source.setRange(start + start, start + end, iterable, skipCount); } /// A fixed length view of a range of this list. /// /// The view is backed by this this list, which must not /// change its length while the view is being used. /// /// The view can be used to perform specific whole-list /// actions on a part of the list. /// For example, to see if a list contains more than one /// "marker" element, you can do: /// ```dart /// someList.slice(someList.indexOf(marker) + 1).contains(marker) /// ``` ListSlice slice(int start, [int? end]) { end = RangeError.checkValidRange(start, end, length); return ListSlice._(_initialSize, source, start + start, end - start); } @override void shuffle([Random? random]) { if (source.length != _initialSize) { throw ConcurrentModificationError(source); } algorithms.shuffle(source, start, end, random); } @override void sort([int Function(E a, E b)? compare]) { if (source.length != _initialSize) { throw ConcurrentModificationError(source); } compare ??= defaultCompare; quickSort(source, compare, start, start + length); } /// Sort a range of elements by [compare]. void sortRange(int start, int end, int Function(E a, E b) compare) { if (source.length != _initialSize) { throw ConcurrentModificationError(source); } source.sortRange(start, end, compare); } /// Shuffles a range of elements. /// /// If [random] is omitted, a new instance of [Random] is used. void shuffleRange(int start, int end, [Random? random]) { if (source.length != _initialSize) { throw ConcurrentModificationError(source); } RangeError.checkValidRange(start, end, length); algorithms.shuffle(source, this.start + start, this.start + end, random); } /// Reverses a range of elements. void reverseRange(int start, int end) { RangeError.checkValidRange(start, end, length); source.reverseRange(this.start + start, this.start + end); } // Act like a fixed-length list. @override set length(int newLength) { throw UnsupportedError('Cannot change the length of a fixed-length list'); } @override void add(E element) { throw UnsupportedError('Cannot add to a fixed-length list'); } @override void insert(int index, E element) { throw UnsupportedError('Cannot add to a fixed-length list'); } @override void insertAll(int index, Iterable iterable) { throw UnsupportedError('Cannot add to a fixed-length list'); } @override void addAll(Iterable iterable) { throw UnsupportedError('Cannot add to a fixed-length list'); } @override bool remove(Object? element) { throw UnsupportedError('Cannot remove from a fixed-length list'); } @override void removeWhere(bool Function(E element) test) { throw UnsupportedError('Cannot remove from a fixed-length list'); } @override void retainWhere(bool Function(E element) test) { throw UnsupportedError('Cannot remove from a fixed-length list'); } @override void clear() { throw UnsupportedError('Cannot clear a fixed-length list'); } @override E removeAt(int index) { throw UnsupportedError('Cannot remove from a fixed-length list'); } @override E removeLast() { throw UnsupportedError('Cannot remove from a fixed-length list'); } @override void removeRange(int start, int end) { throw UnsupportedError('Cannot remove from a fixed-length list'); } @override void replaceRange(int start, int end, Iterable newContents) { throw UnsupportedError('Cannot remove from a fixed-length list'); } } äNN<1(7):<8*;=I:=;GG<:H:B>=F-F(JG<17+:B>=F-L(%@(BD3";'373'EB3I3.6N3);M3!/@P3!0PP& A3)-G<AKC#3EKD#C#<4'4*4'&88!3;6:%;$D .::+:5==$Q.'=8I:<8+J;@'BGL8+JFD>%B-D(J4"C,?:M)#D,$ 9.';-H"! )1;" *)1;# Q)14F3;6:%;$D .:J #)14 1)1 7-G)1+$B<)14N$*4?# O A &A 4A &A !F 4F 4F @ F F )F CF+package:collection/src/list_extensions.dart€å„›dfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/priority_queue.dart¾q// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'utils.dart'; /// A priority queue is a priority based work-list of elements. /// /// The queue allows adding elements, and removing them again in priority order. /// The same object can be added to the queue more than once. /// There is no specified ordering for objects with the same priority /// (where the `comparison` function returns zero). /// /// Operations which care about object equality, [contains] and [remove], /// use [Object.==] for testing equality. /// In most situations this will be the same as identity ([identical]), /// but there are types, like [String], where users can reasonably expect /// distinct objects to represent the same value. /// If elements override [Object.==], the `comparison` function must /// always give equal objects the same priority, /// otherwise [contains] or [remove] might not work correctly. abstract class PriorityQueue { /// Creates an empty [PriorityQueue]. /// /// The created [PriorityQueue] is a plain [HeapPriorityQueue]. /// /// The [comparison] is a [Comparator] used to compare the priority of /// elements. An element that compares as less than another element has /// a higher priority. /// /// If [comparison] is omitted, it defaults to [Comparable.compare]. If this /// is the case, `E` must implement [Comparable], and this is checked at /// runtime for every comparison. factory PriorityQueue([int Function(E, E)? comparison]) = HeapPriorityQueue; /// Number of elements in the queue. int get length; /// Whether the queue is empty. bool get isEmpty; /// Whether the queue has any elements. bool get isNotEmpty; /// Checks if [object] is in the queue. /// /// Returns true if the element is found. /// /// Uses the [Object.==] of elements in the queue to check /// for whether they are equal to [object]. /// Equal objects objects must have the same priority /// according to the [comparison] function. /// That is, if `a == b` then `comparison(a, b) == 0`. /// If that is not the case, this check might fail to find /// an object. bool contains(E object); /// Provides efficient access to all the elements curently in the queue. /// /// The operation should be performed without copying or moving /// the elements, if at all possible. /// /// The elements are iterated in no particular order. /// The order is stable as long as the queue is not modified. /// The queue must not be modified during an iteration. Iterable get unorderedElements; /// Adds element to the queue. /// /// The element will become the next to be removed by [removeFirst] /// when all elements with higher priority have been removed. void add(E element); /// Adds all [elements] to the queue. void addAll(Iterable elements); /// Returns the next element that will be returned by [removeFirst]. /// /// The element is not removed from the queue. /// /// The queue must not be empty when this method is called. E get first; /// Removes and returns the element with the highest priority. /// /// Repeatedly calling this method, without adding element in between, /// is guaranteed to return elements in non-decreasing order as, specified by /// [comparison]. /// /// The queue must not be empty when this method is called. E removeFirst(); /// Removes an element of the queue that compares equal to [element]. /// /// Returns true if an element is found and removed, /// and false if no equal element is found. /// /// If the queue contains more than one object equal to [element], /// only one of them is removed. /// /// Uses the [Object.==] of elements in the queue to check /// for whether they are equal to [element]. /// Equal objects objects must have the same priority /// according to the [comparison] function. /// That is, if `a == b` then `comparison(a, b) == 0`. /// If that is not the case, this check might fail to find /// an object. bool remove(E element); /// Removes all the elements from this queue and returns them. /// /// The returned iterable has no specified order. Iterable removeAll(); /// Removes all the elements from this queue. void clear(); /// Returns a list of the elements of this queue in priority order. /// /// The queue is not modified. /// /// The order is the order that the elements would be in if they were /// removed from this queue using [removeFirst]. List toList(); /// Returns a list of the elements of this queue in no specific order. /// /// The queue is not modified. /// /// The order of the elements is implementation specific. /// The order may differ between different calls on the same queue. List toUnorderedList(); /// Return a comparator based set using the comparator of this queue. /// /// The queue is not modified. /// /// The returned [Set] is currently a [SplayTreeSet], /// but this may change as other ordered sets are implemented. /// /// The set contains all the elements of this queue. /// If an element occurs more than once in the queue, /// the set will contain it only once. Set toSet(); } /// Heap based priority queue. /// /// The elements are kept in a heap structure, /// where the element with the highest priority is immediately accessible, /// and modifying a single element takes /// logarithmic time in the number of elements on average. /// /// * The [add] and [removeFirst] operations take amortized logarithmic time, /// O(log(n)), but may occasionally take linear time when growing the capacity /// of the heap. /// * The [addAll] operation works as doing repeated [add] operations. /// * The [first] getter takes constant time, O(1). /// * The [clear] and [removeAll] methods also take constant time, O(1). /// * The [contains] and [remove] operations may need to search the entire /// queue for the elements, taking O(n) time. /// * The [toList] operation effectively sorts the elements, taking O(n*log(n)) /// time. /// * The [toUnorderedList] operation copies, but does not sort, the elements, /// and is linear, O(n). /// * The [toSet] operation effectively adds each element to the new set, taking /// an expected O(n*log(n)) time. class HeapPriorityQueue implements PriorityQueue { /// Initial capacity of a queue when created, or when added to after a /// [clear]. /// /// Number can be any positive value. Picking a size that gives a whole /// number of "tree levels" in the heap is only done for aesthetic reasons. static const int _INITIAL_CAPACITY = 7; /// The comparison being used to compare the priority of elements. final Comparator comparison; /// List implementation of a heap. List _queue = List.filled(_INITIAL_CAPACITY, null); /// Number of elements in queue. /// /// The heap is implemented in the first [_length] entries of [_queue]. int _length = 0; /// Modification count. /// /// Used to detect concurrent modifications during iteration. int _modificationCount = 0; /// Create a new priority queue. /// /// The [comparison] is a [Comparator] used to compare the priority of /// elements. An element that compares as less than another element has /// a higher priority. /// /// If [comparison] is omitted, it defaults to [Comparable.compare]. If this /// is the case, `E` must implement [Comparable], and this is checked at /// runtime for every comparison. HeapPriorityQueue([int Function(E, E)? comparison]) : comparison = comparison ?? defaultCompare; E _elementAt(int index) => _queue[index] ?? (null as E); @override void add(E element) { _modificationCount++; _add(element); } @override void addAll(Iterable elements) { var modified = 0; for (var element in elements) { modified = 1; _add(element); } _modificationCount += modified; } @override void clear() { _modificationCount++; _queue = const []; _length = 0; } @override bool contains(E object) => _locate(object) >= 0; /// Provides efficient access to all the elements curently in the queue. /// /// The operation is performed in the order they occur /// in the underlying heap structure. /// /// The order is stable as long as the queue is not modified. /// The queue must not be modified during an iteration. @override Iterable get unorderedElements => _UnorderedElementsIterable(this); @override E get first { if (_length == 0) throw StateError('No element'); return _elementAt(0); } @override bool get isEmpty => _length == 0; @override bool get isNotEmpty => _length != 0; @override int get length => _length; @override bool remove(E element) { var index = _locate(element); if (index < 0) return false; _modificationCount++; var last = _removeLast(); if (index < _length) { var comp = comparison(last, element); if (comp <= 0) { _bubbleUp(last, index); } else { _bubbleDown(last, index); } } return true; } /// Removes all the elements from this queue and returns them. /// /// The returned iterable has no specified order. /// The operation does not copy the elements, /// but instead keeps them in the existing heap structure, /// and iterates over that directly. @override Iterable removeAll() { _modificationCount++; var result = _queue; var length = _length; _queue = const []; _length = 0; return result.take(length).cast(); } @override E removeFirst() { if (_length == 0) throw StateError('No element'); _modificationCount++; var result = _elementAt(0); var last = _removeLast(); if (_length > 0) { _bubbleDown(last, 0); } return result; } @override List toList() => _toUnorderedList()..sort(comparison); @override Set toSet() { var set = SplayTreeSet(comparison); for (var i = 0; i < _length; i++) { set.add(_elementAt(i)); } return set; } @override List toUnorderedList() => _toUnorderedList(); List _toUnorderedList() => [for (var i = 0; i < _length; i++) _elementAt(i)]; /// Returns some representation of the queue. /// /// The format isn't significant, and may change in the future. @override String toString() { return _queue.take(_length).toString(); } /// Add element to the queue. /// /// Grows the capacity if the backing list is full. void _add(E element) { if (_length == _queue.length) _grow(); _bubbleUp(element, _length++); } /// Find the index of an object in the heap. /// /// Returns -1 if the object is not found. /// /// A matching object, `o`, must satisfy that /// `comparison(o, object) == 0 && o == object`. int _locate(E object) { if (_length == 0) return -1; // Count positions from one instead of zero. This gives the numbers // some nice properties. For example, all right children are odd, // their left sibling is even, and the parent is found by shifting // right by one. // Valid range for position is [1.._length], inclusive. var position = 1; // Pre-order depth first search, omit child nodes if the current // node has lower priority than [object], because all nodes lower // in the heap will also have lower priority. do { var index = position - 1; var element = _elementAt(index); var comp = comparison(element, object); if (comp <= 0) { if (comp == 0 && element == object) return index; // Element may be in subtree. // Continue with the left child, if it is there. var leftChildPosition = position * 2; if (leftChildPosition <= _length) { position = leftChildPosition; continue; } } // Find the next right sibling or right ancestor sibling. do { while (position.isOdd) { // While position is a right child, go to the parent. position >>= 1; } // Then go to the right sibling of the left-child. position += 1; } while (position > _length); // Happens if last element is a left child. } while (position != 1); // At root again. Happens for right-most element. return -1; } E _removeLast() { var newLength = _length - 1; var last = _elementAt(newLength); _queue[newLength] = null; _length = newLength; return last; } /// Place [element] in heap at [index] or above. /// /// Put element into the empty cell at `index`. /// While the `element` has higher priority than the /// parent, swap it with the parent. void _bubbleUp(E element, int index) { while (index > 0) { var parentIndex = (index - 1) ~/ 2; var parent = _elementAt(parentIndex); if (comparison(element, parent) > 0) break; _queue[index] = parent; index = parentIndex; } _queue[index] = element; } /// Place [element] in heap at [index] or above. /// /// Put element into the empty cell at `index`. /// While the `element` has lower priority than either child, /// swap it with the highest priority child. void _bubbleDown(E element, int index) { var rightChildIndex = index * 2 + 2; while (rightChildIndex < _length) { var leftChildIndex = rightChildIndex - 1; var leftChild = _elementAt(leftChildIndex); var rightChild = _elementAt(rightChildIndex); var comp = comparison(leftChild, rightChild); int minChildIndex; E minChild; if (comp < 0) { minChild = leftChild; minChildIndex = leftChildIndex; } else { minChild = rightChild; minChildIndex = rightChildIndex; } comp = comparison(element, minChild); if (comp <= 0) { _queue[index] = element; return; } _queue[index] = minChild; index = minChildIndex; rightChildIndex = index * 2 + 2; } var leftChildIndex = rightChildIndex - 1; if (leftChildIndex < _length) { var child = _elementAt(leftChildIndex); var comp = comparison(element, child); if (comp > 0) { _queue[index] = child; index = leftChildIndex; } } _queue[index] = element; } /// Grows the capacity of the list holding the heap. /// /// Called when the list is full. void _grow() { var newCapacity = _queue.length * 2 + 1; if (newCapacity < _INITIAL_CAPACITY) newCapacity = _INITIAL_CAPACITY; var newQueue = List.filled(newCapacity, null); newQueue.setRange(0, _length, _queue); _queue = newQueue; } } /// Implementation of [HeapPriorityQueue.unorderedElements]. class _UnorderedElementsIterable extends Iterable { final HeapPriorityQueue _queue; _UnorderedElementsIterable(this._queue); @override Iterator get iterator => _UnorderedElementsIterator(_queue); } class _UnorderedElementsIterator implements Iterator { final HeapPriorityQueue _queue; final int _initialModificationCount; E? _current; int _index = -1; _UnorderedElementsIterator(this._queue) : _initialModificationCount = _queue._modificationCount; @override bool moveNext() { if (_initialModificationCount != _queue._modificationCount) { throw ConcurrentModificationError(_queue); } var nextIndex = _index + 1; if (0 <= nextIndex && nextIndex < _queue.length) { _current = _queue._queue[nextIndex]; _index = nextIndex; return true; } _current = null; _index = -2; return false; } @override E get current => _index < 0 ? throw StateError('No element') : (_current ?? null as E); } óNN<@Q>F4J*HJ2E1?"(BIJOK$<'"**,=.8.9=KB(8@:%!F@(%G1>AIP>H7.E#=/8.9=A40F!H3I!#J@#IJOK$63;  &$$  3K9(@: L 6 $ '  "!, "A40=' ' 6  < +( 3 90B , 6+#/-03!HFG<EF2 '.:&9.,( @ !@ ;PO!&327')*,232@/+)(0244(),! '.$.- 7$-J7+=:%+ E=%'*? B1 7+ M*package:collection/src/priority_queue.dart`file:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/queue_list.dart¢$// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; /// A class that efficiently implements both [Queue] and [List]. // TODO(nweiz): Currently this code is copied almost verbatim from // dart:collection. The only changes are to implement List and to remove methods // that are redundant with ListMixin. Remove or simplify it when issue 21330 is // fixed. class QueueList extends Object with ListMixin implements Queue { /// Adapts [source] to be a `QueueList`. /// /// Any time the class would produce an element that is not a [T], the element /// access will throw. /// /// Any time a [T] value is attempted stored into the adapted class, the store /// will throw unless the value is also an instance of [S]. /// /// If all accessed elements of [source] are actually instances of [T] and if /// all elements stored in the returned are actually instance of [S], /// then the returned instance can be used as a `QueueList`. static QueueList _castFrom(QueueList source) { return _CastQueueList(source); } /// Default and minimal initial capacity of the queue-list. static const int _initialCapacity = 8; List _table; int _head; int _tail; /// Creates an empty queue. /// /// If [initialCapacity] is given, prepare the queue for at least that many /// elements. QueueList([int? initialCapacity]) : this._init(_computeInitialCapacity(initialCapacity)); /// Creates an empty queue with the specific initial capacity. QueueList._init(int initialCapacity) : assert(_isPowerOf2(initialCapacity)), _table = List.filled(initialCapacity, null), _head = 0, _tail = 0; /// An internal constructor for use by [_CastQueueList]. QueueList._(this._head, this._tail, this._table); /// Create a queue initially containing the elements of [source]. factory QueueList.from(Iterable source) { if (source is List) { var length = source.length; var queue = QueueList(length + 1); assert(queue._table.length > length); var sourceList = source; queue._table.setRange(0, length, sourceList, 0); queue._tail = length; return queue; } else { return QueueList()..addAll(source); } } /// Computes the actual initial capacity based on the constructor parameter. static int _computeInitialCapacity(int? initialCapacity) { if (initialCapacity == null || initialCapacity < _initialCapacity) { return _initialCapacity; } initialCapacity += 1; if (_isPowerOf2(initialCapacity)) { return initialCapacity; } return _nextPowerOf2(initialCapacity); } // Collection interface. @override void add(E element) { _add(element); } @override void addAll(Iterable iterable) { if (iterable is List) { var list = iterable; var addCount = list.length; var length = this.length; if (length + addCount >= _table.length) { _preGrow(length + addCount); // After preGrow, all elements are at the start of the list. _table.setRange(length, length + addCount, list, 0); _tail += addCount; } else { // Adding addCount elements won't reach _head. var endSpace = _table.length - _tail; if (addCount < endSpace) { _table.setRange(_tail, _tail + addCount, list, 0); _tail += addCount; } else { var preSpace = addCount - endSpace; _table.setRange(_tail, _tail + endSpace, list, 0); _table.setRange(0, preSpace, list, endSpace); _tail = preSpace; } } } else { for (var element in iterable) { _add(element); } } } QueueList cast() => QueueList._castFrom(this); @deprecated QueueList retype() => cast(); @override String toString() => IterableBase.iterableToFullString(this, '{', '}'); // Queue interface. @override void addLast(E element) { _add(element); } @override void addFirst(E element) { _head = (_head - 1) & (_table.length - 1); _table[_head] = element; if (_head == _tail) _grow(); } @override E removeFirst() { if (_head == _tail) throw StateError('No element'); var result = _table[_head] as E; _table[_head] = null; _head = (_head + 1) & (_table.length - 1); return result; } @override E removeLast() { if (_head == _tail) throw StateError('No element'); _tail = (_tail - 1) & (_table.length - 1); var result = _table[_tail] as E; _table[_tail] = null; return result; } // List interface. @override int get length => (_tail - _head) & (_table.length - 1); @override set length(int value) { if (value < 0) throw RangeError('Length $value may not be negative.'); if (value > length && null is! E) { throw UnsupportedError( 'The length can only be increased when the element type is ' 'nullable, but the current element type is `$E`.'); } var delta = value - length; if (delta >= 0) { if (_table.length <= value) { _preGrow(value); } _tail = (_tail + delta) & (_table.length - 1); return; } var newTail = _tail + delta; // [delta] is negative. if (newTail >= 0) { _table.fillRange(newTail, _tail, null); } else { newTail += _table.length; _table.fillRange(0, _tail, null); _table.fillRange(newTail, _table.length, null); } _tail = newTail; } @override E operator [](int index) { if (index < 0 || index >= length) { throw RangeError('Index $index must be in the range [0..$length).'); } return _table[(_head + index) & (_table.length - 1)] as E; } @override void operator []=(int index, E value) { if (index < 0 || index >= length) { throw RangeError('Index $index must be in the range [0..$length).'); } _table[(_head + index) & (_table.length - 1)] = value; } // Internal helper functions. /// Whether [number] is a power of two. /// /// Only works for positive numbers. static bool _isPowerOf2(int number) => (number & (number - 1)) == 0; /// Rounds [number] up to the nearest power of 2. /// /// If [number] is a power of 2 already, it is returned. /// /// Only works for positive numbers. static int _nextPowerOf2(int number) { assert(number > 0); number = (number << 1) - 1; for (;;) { var nextNumber = number & (number - 1); if (nextNumber == 0) return number; number = nextNumber; } } /// Adds element at end of queue. Used by both [add] and [addAll]. void _add(E element) { _table[_tail] = element; _tail = (_tail + 1) & (_table.length - 1); if (_head == _tail) _grow(); } /// Grow the table when full. void _grow() { var newTable = List.filled(_table.length * 2, null); var split = _table.length - _head; newTable.setRange(0, split, _table, _head); newTable.setRange(split, split + _head, _table, 0); _head = 0; _tail = _table.length; _table = newTable; } int _writeToList(List target) { assert(target.length >= length); if (_head <= _tail) { var length = _tail - _head; target.setRange(0, length, _table, _head); return length; } else { var firstPartSize = _table.length - _head; target.setRange(0, firstPartSize, _table, _head); target.setRange(firstPartSize, firstPartSize + _tail, _table, 0); return _tail + firstPartSize; } } /// Grows the table even if it is not full. void _preGrow(int newElementCount) { assert(newElementCount >= length); // Add 1.5x extra room to ensure that there's room for more elements after // expansion. newElementCount += newElementCount >> 1; var newCapacity = _nextPowerOf2(newElementCount); var newTable = List.filled(newCapacity, null); _tail = _writeToList(newTable); _table = newTable; _head = 0; } } class _CastQueueList extends QueueList { final QueueList _delegate; // Assigns invalid values for head/tail because it uses the delegate to hold // the real values, but they are non-null fields. _CastQueueList(this._delegate) : super._(-1, -1, _delegate._table.cast()); @override int get _head => _delegate._head; @override set _head(int value) => _delegate._head = value; @override int get _tail => _delegate._tail; @override set _tail(int value) => _delegate._tail = value; } )NN<ACQP J.QQ>PIB=)>) N$>A'.9;4D/",,7 -O=I(+  &" 0%E=7.#=.=8  &=) J  /! 8%/ 8/% ; K(G> $59. (6 (K? *(K; *'G4;') .*E/! ='08&%"1 18H$.''O-67$2 O4P $ 3 $ 3&package:collection/src/queue_list.dart0org-dartlang-sdk:///sdk/lib/collection/list.dartdart:collection/list.dart_file:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/union_set.dartŒ // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import 'unmodifiable_wrappers.dart'; /// A single set that provides a view of the union over a set of sets. /// /// Since this is just a view, it reflects all changes in the underlying sets. /// /// If an element is in multiple sets and the outer set is ordered, the version /// in the earliest inner set is preferred. Component sets are assumed to use /// `==` and `hashCode` for equality. class UnionSet extends SetBase with UnmodifiableSetMixin { /// The set of sets that this provides a view of. final Set> _sets; /// Whether the sets in [_sets] are guaranteed to be disjoint. final bool _disjoint; /// Creates a new set that's a view of the union of all sets in [sets]. /// /// If any sets in [sets] change, this [UnionSet] reflects that change. If a /// new set is added to [sets], this [UnionSet] reflects that as well. /// /// If [disjoint] is `true`, then all component sets must be disjoint. That /// is, that they contain no elements in common. This makes many operations /// including [length] more efficient. If the component sets turn out not to /// be disjoint, some operations may behave inconsistently. UnionSet(Set> sets, {bool disjoint = false}) : _sets = sets, _disjoint = disjoint; /// Creates a new set that's a view of the union of all sets in [sets]. /// /// If any sets in [sets] change, this [UnionSet] reflects that change. /// However, unlike [new UnionSet], this creates a copy of its parameter, so /// changes in [sets] aren't reflected in this [UnionSet]. /// /// If [disjoint] is `true`, then all component sets must be disjoint. That /// is, that they contain no elements in common. This makes many operations /// including [length] more efficient. If the component sets turn out not to /// be disjoint, some operations may behave inconsistently. UnionSet.from(Iterable> sets, {bool disjoint = false}) : this(sets.toSet(), disjoint: disjoint); @override int get length => _disjoint ? _sets.fold(0, (length, set) => length + set.length) : _iterable.length; @override Iterator get iterator => _iterable.iterator; /// An iterable over the contents of all [_sets]. /// /// If this is not a [_disjoint] union an extra set is used to deduplicate /// values. Iterable get _iterable { var allElements = _sets.expand((set) => set); return _disjoint ? allElements : allElements.where({}.add); } @override bool contains(Object? element) => _sets.any((set) => set.contains(element)); @override E? lookup(Object? element) { for (var set in _sets) { var result = set.lookup(element); if (result != null || set.contains(null)) return result; } return null; } @override Set toSet() => {for (var set in _sets) ...set}; } RNN<%GOPN&D4AJOINNO>6JJO=NNO>@0 < 24M2C O (? 8%package:collection/src/union_set.dartjfile:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/union_set_controller.dart‡­// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'union_set.dart'; /// A controller that exposes a view of the union of a collection of sets. /// /// This is a convenience class for creating a [UnionSet] whose contents change /// over the lifetime of a class. For example: /// /// ```dart /// class Engine { /// Set get activeTests => _activeTestsGroup.set; /// final _activeTestsGroup = UnionSetController(); /// /// void addSuite(Suite suite) { /// _activeTestsGroup.add(suite.tests); /// _runSuite(suite); /// _activeTestsGroup.remove(suite.tests); /// } /// } /// ``` class UnionSetController { /// The [UnionSet] that provides a view of the union of sets in [this]. final UnionSet set; /// The sets whose union is exposed through [set]. final Set> _sets; /// Creates a set of sets that provides a view of the union of those sets. /// /// If [disjoint] is `true`, this assumes that all component sets are /// disjoint—that is, that they contain no elements in common. This makes /// many operations including [length] more efficient. UnionSetController({bool disjoint = false}) : this._(>{}, disjoint); /// Creates a controller with the provided [_sets]. UnionSetController._(this._sets, bool disjoint) : set = UnionSet(_sets, disjoint: disjoint); /// Adds the contents of [component] to [set]. /// /// If the contents of [component] change over time, [set] will change /// accordingly. void add(Set component) { _sets.add(component); } /// Removes the contents of [component] to [set]. /// /// If another set in [this] has overlapping elements with [component], those /// elements will remain in [set]. bool remove(Set component) => _sets.remove(component); } 9NN<KP/ :<#,/J5MHL9N6261I4P%<0package:collection/src/union_set_controller.dart[file:///github/home/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/src/utils.dartƒ// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// A [Comparator] that asserts that its first argument is comparable. /// /// The function behaves just like [List.sort]'s /// default comparison function. It is entirely dynamic in its testing. /// /// Should be used when optimistically comparing object that are assumed /// to be comparable. /// If the elements are known to be comparable, use [compareComparable]. int defaultCompare(Object? value1, Object? value2) => (value1 as Comparable).compareTo(value2); /// A reusable identity function at any type. T identity(T value) => value; /// A reusable typed comparable comparator. int compareComparable>(T a, T b) => a.compareTo(b); NN<G1HII67.!,L!package:collection/src/utils.dart¯—´÷® ¯1¿!Ê"&0³k³rmŽë9*´/à5R¸fÀ›E”ini¼v¤*+7 ƒ‡ ƒˆ“7…ä‚…æV€”`„ß[…ç`„Þ[…ê 707A7Z7a7z€¡^€ßb9‚ï‚ð„¹…æ ƒ‰7`„x‚ñ…]…ì…í …î7‚ò„¹…æ!‚ó„¹…æ#‚ô„¹…æ%‚õ„¹…æ'‚ö„¹…æ)  $*-:=@CFIMTX[cfior}„‡‰Œ”—Ÿ¢ª­µ¸+…î‚÷‚ø‚ù‚ø ‚ú!‚ø ) 7 < > N/6LM‚ûY‚ù‚û\]^htuvq‚ú&&(&c&g&k&n&o&p&f&i&y&{&|&~&&€&€‚&‚û8d‚ü::a‚ý=€ƒ>‚ù?‚ý@€„?€…?t?>‚úE€†>‚üG‚þI€‰J‚ùK‚þL€ŠKVJ‚ÿO‚þP€ŠJ‚úR€ŒJ‚üTƒV€W‚ùXƒY€ŽX€…XXƒ]€”W‚ú_ƒ`€__(_n_{_|_€“W‚ÿhW‚üjƒl€–m‚ùnƒo€—nvm‚úrm‚ütl€šv‚ùwƒx€›w€…wtv‚ú|€†v‚ü~l€œ€€‚ù€ƒ€‚€€‚€ž€V€€‚ú€†€Œ€€‚ü€ˆƒ€Š‚ù€‹ƒ€Œ€ €Œ€¡€Œ€¢€Œ€£€Œ€¤€Œ€¥€Š‚ú€“€¦€“€¯€“€µ€“€º€“€½€“€¾€“€¿€“ƒ€›€À€›€Ã€›€Ç€›€È€›€Êƒ€¡€Ë€¢‚ú€£k€£€Ÿ€£c€£{€£€Í€£€Î€£|€£€“€£n€£ƒ€­€€¢‚ü€¯€¡€Ð€±‚ù€²€…€²€²ƒ€µ^€±‚ú€·k€·€†€·€Ñ€·€Ò€·€Ó€·~€·€Ô€·€×€·€Ø€·€Ù€·€Ú€·€Û€±‚ü€Äƒ€Æ‚ù€Çƒ€È€Æ€Ü€Ê‚ù€Ëƒ€Ì€Ý€Êƒ€Î€Ê‚ú€Ð€à€Ð€±€Ð`€Æ€ä€Ô‚ù€Õƒ€Ö€æ€Ö€ç€Ô‚ú€Ù€à€Ù€±€Ù`€Ô‚ü€Ý€Æ€ê€ß‚ú€à€à€à€±€à`€ß‚ü€ä€Æ€ì€æ‚ú€ç€à€ç€±€ç`€æ‚ü€ë€Æ€í€í‚ù€îƒ€ï€î€í‚ú€ñ€à€ñ€±€ñ`€í‚ü€õ€Æ€ö€÷‚ù€øƒ€ù€î€÷‚ú€û€à€û€±€û`€÷‚ü€ÿ€Æ€ù‚ùƒ€î‚ú€à€±‚ü€Æ€ü ‚ú ` ‚ü €Æ€ý‚ú`‚ü€Æ€þ‚ù€ÿ €ë‚ú‚ü€Æ‚ùƒ  ‚ú#€à#€±#`‚ü'€Æ )‚ù*ƒ+ )‚ú-€à-€±-`)‚ü1€Æ3‚ù4ƒ5^53‚ú8€à8€±8`3‚ü<<€Æ?‚ú@€à@€±@`?‚üDƒ FG‚üHHaƒ KL‚üMMaƒ P‚úQQ"Q#Q%Q*Q-Q6ƒ Y‚úZvZzZ{Z}Z~Z€ZZ‚ZƒZ„Z…Z‡ZˆZ‹ZŒZZŽZZ‘Z’Z“Z”Z•ZŸZ Z¡Z¢Z£Z¤Z¦Z¨Z«Z¬Z®Z¯Z°Z±Z²Z³Z´ZµZ¶Z·Z¸ZºZ¼Z½Z¾Z¿ZÀZÂZÃZÄZÅZÆZÇZÈZÉZÊZËZÌZÏZÑZÒZÓZÔZÖZ×ZØZÙZÚZÛZÜZßZàZäZåZæZçZèZéZêZëZìZíZîZïZðZñZóYAYfYhYkYlYmYoYrƒ ½ô¾‚ù¿ƒ À€„¿€…¾‚üý÷Å‚ùƃ Ç€ŠÇžÆVÅ‚ÿ˃ ̞łú΀ŒÅ‚üЃÒ‚úÓ‚Ó‚Ó‚Ó‚Ó‚Ó‚Ó‚Ó‚Ó‚Ó‚Ó‚Ó‚Ó‚ Ó‚!Ó‚"Ó‚#Ó‚$Ó‚%Ó‚&Ó‚'Ó‚(Ó‚)Ó‚*Ó‚+Ó‚,Ó‚.Ó‚/Ó‚0Ó‚1Ó‚2Ó‚3Ó‚4Ó‚5Ó‚6Ó‚7Ó‚8Ó‚9Ó‚<Ó‚=Ó‚?Ó‚@Ó‚AÓ‚BÓ‚CÓ‚DÓ‚EÓ‚FÓ‚GÒù‚‚ù‚ƒ‚ú‚û‚‚‚‚‚ú‚ ‚ (‚ .‚ þ‚ ‚ ‚ ÿ‚ ‚‚ ‚‚ €Ÿ‚ ‚‚ ‚‚ c‚ {‚ |‚ €“‚ n‚ ‚ ‚ ?‚ ‚ ‚ ‚ ‚‚ÿ‚"‚‚ü‚$‚$ƒ‚&xÒ‚ Ò‚ƒ‚*‚H‚+‚ù‚,ƒ‚-€Ý‚,‚,t‚,u‚,‚I‚,Í‚+ƒ‚4‚+‚ú‚6€†‚6€Ÿ‚6c‚6‚J‚6{‚6€Í‚6n‚61‚6‚K‚6€Ø‚*‚L‚A‚ù‚Bƒ‚C‚M‚C‚N‚C‚O‚C‚P‚B-‚B‚I‚BÍ‚Bt‚Bu‚B‚A‚ÿ‚Nƒ‚O‚N‚O‚O‚O‚P‚A‚ú‚Sƒ‚T‚Q‚T‚Y‚T‚R‚T‚T‚T‚U‚T‚V‚T‚W‚T‚[‚S€Ÿ‚Sc‚Sn‚S€†‚S{‚S€Í‚S‚J‚S1‚S€Ø‚S‚K‚S€‚‚A‚ü‚h‚*‚i‚j‚ù‚kƒ‚l‚N‚k€…‚j‚ü‚o‚*‚j‚q‚ù‚rƒ‚s‚N‚s‚k‚sž‚s‚l‚rV‚q‚ÿ‚yƒ‚zž‚z‚l‚q‚ú‚}€Œ‚q‚ü‚ƒ‚‚n‚‚‚ú‚ƒ€Ÿ‚ƒc‚ƒk‚ƒ€‚‚ƒ?‚ƒ‚q‚ƒ€Ò‚ƒf‚ƒ€†‚ƒ€‡‚ƒr‚ƒ‚s‚ƒ‚t‚ƒ€Ô‚ƒ‚w‚ƒ|‚ƒ€×‚ƒi‚ƒ‚-‚ƒ‚{‚ƒ€ˆ‚ƒ‚|‚ƒ‚}‚ƒ‚X‚ƒ‚~‚ƒ1‚ƒ€Ø‚ƒ{‚ƒƒ‚ ‚‚ ‚‚ ‚˜‚ƒ|‚ƒ€“‚ƒn‚ƒ‚ƒ‚ƒ‚…‚ƒ‚ƒ‚†‚ƒ‚ˆ‚ƒ‚ ‚ƒ‚‰‚ƒ.‚ƒ‚ ‚ƒ‚‘‚ƒ‚’‚ƒ‚“‚ƒ‚”‚ƒ‚‚ƒ‚ ‚ƒ‚‚ƒ‚—‚‚‚ù‚¹Í‚¹¹‚¹€…‚¹t‚¹u‚¹‚r‚¹@‚‚‚ÿ‚ÁÍ‚Á¹‚‚‚ü‚Ä‚‚™‚Æ‚ù‚ǃ‚È‚š‚È‚›‚È‚œ‚È‚‚ǂƂÿ‚΃‚Ï‚›‚Ï‚œ‚Ï‚‚΂Ƃú‚Ôƒ‚Õ‚ ‚Õ‚£‚Õ‚µ‚Õ‚·‚Õ‚R‚Õ‚[‚Õ‚»‚Õ‚¥‚Ô€Ÿ‚Ôc‚Ôk‚Ô~‚Ô€‚‚Ô‚ª‚Ô‚«‚Ô‚J‚Ô?‚Ô‚Ô(‚ƃ‚éa‚Æ‚ü‚ë‚냂킟‚íx‚‚¾‚ð‚ù‚ñƒ‚ò‚¿‚ò‚œ‚ò‚‚ð‚ÿ‚öƒ‚÷‚œ‚÷‚‚ð‚ü‚úƒ‚ü‚À‚ý‚ú‚þ€Ÿ‚þc‚þ{‚þ€Í‚þ€Î‚þ|‚þ€“‚þn‚þƒƒ€‚ý‚üƒ ‚ü‚Áƒ ‚ùƒ ƒƒ ‚ƒ ‚à €›ƒ ƒ €…ƒ ‚úƒ€†ƒ€Óƒ€Øƒ ‚üƒƒaƒƒ‚ǃ‚ùƒ‚Zƒƒƒ‚ƒ‚úƒ €Ÿƒ {ƒ‚üƒ#ƒ#ƒƒ%xƒƒ'‚ʃ(‚ÿƒ)ƒ(‚úƒ+€Ÿƒ+cƒ+‚ƒ+‚ƒ+{ƒ+‚ ƒ+?ƒ+|ƒ+€“ƒ+‚ ƒ+‚ ƒ+nƒ+ƒƒ8€ƒ(‚üƒ:ƒ'‚˃<‚üƒ=ƒ'‚̓?‚úƒ@ƒƒA€ƒ@€Ÿƒ@cƒ@‚ƒ@‚ƒ@{ƒ@‚ ƒ@?ƒ@|ƒ@€“ƒ@‚ ƒ@‚ ƒ@nƒ?‚ÿƒOƒ?‚üƒQƒ'‚΃S‚úƒT€ŸƒTcƒT{ƒT€ÍƒT€ÎƒT|ƒT€“ƒTnƒTƒƒ]€ƒS‚üƒ_ƒ'‚σa‚ùƒbƒƒc€Ýƒaƒƒe‚уa‚üƒgƒ'‚Òƒi‚úƒjƒƒk€ƒj€Ÿƒjcƒj{ƒj€Íƒj€Îƒj|ƒj€“ƒjnƒi‚üƒuƒ'‚Óƒw‚úƒxƒƒy€ƒx(ƒxyƒxcƒx{ƒxnƒw‚ÿƒ€Íƒ€¹ƒw‚üƒƒƒƒ…‚úƒ†‚Õƒ†‚؃†‚ÙƒƒŠ‚Úƒ‹‚ùƒŒƒƒ^ƒŒÍƒŒtƒŒuƒŒ€…ƒŒ¹ƒŒƒŒ‚rƒ‹‚úƒ–rƒ–kƒ–€†ƒ–‚qƒ–€‡ƒ–‚-ƒ–‚sƒ–€ˆƒ–€Òƒ–fƒ–‚wƒ–‚tƒ–iƒ–‚{ƒ–~ƒ–€Ôƒ–‚|ƒ–‚}ƒ–‚Xƒ–‚~ƒ–1ƒ–€Øƒ–|ƒ–€×ƒ–€‚ƒ‹‚üƒ°ƒŠ‚܃²‚ùƒ³ƒƒ´^ƒ²‚úƒ¶‚݃²‚üƒ¸ƒŠ‚Þƒº‚ùƒ»ƒƒ¼^ƒ»@ƒº‚úƒ¿‚݃¿ƒ¿(ƒ¿ƒ¿€Ÿƒ¿cƒ¿‚…ƒ¿kƒ¿nƒ¿‚‰ƒ¿‚ˆƒ¿‚‘ƒ¿‚’ƒ¿‚ƒ¿‚ƒ¿‚“ƒ¿‚”ƒ¿{ƒ¿‚ ƒ¿?ƒ¿‚ ƒ¿|ƒ¿‚ ƒ¿€“ƒ¿~ƒ¿‚—ƒ¿.ƒ¿ƒ¿ƒ¿‚†ƒº‚ÿƒÞ̓޹ƒÞƒº‚üƒâƒŠ‚àƒä‚ùƒåƒƒæ^ƒä‚úƒè‚݃耟ƒècƒèkƒènƒè€Ñƒè€Ûƒè€Úƒè€Óƒè{ƒè€Íƒè|ƒè€Îƒè~ƒè€“ƒè€Ùƒè€Øƒä‚üƒúƒŠ‚áƒü‚ùƒýƒƒþ^ƒü‚ú„‚Ý„€Ÿ„c„‚«„‚ª„k„n„{„|„€“„~„‚J„?ƒü‚ü„ƒŠ‚â„‚ù„ƒ„^„h„t„u„v„„q„‚ú„‚Ý„„(„c„g„n„k„o„p„f„i„y„{„|„~„€‚„„€„‚ü„-ƒŠ‚ã„/‚ú„0k„0€Ÿ„0c„0{„0€Í„0€Î„0|„0€“„0n„0ƒ„:€„/‚ü„<ƒŠ‚ä„>‚ù„?ƒ„@‚å„@^„?t„?u„?„>‚ú„Fk„F€†„F€‚„F€Ñ„F€Û„F€Ú„F€Ó„F~„F€Ù„>‚ü„PƒŠ‚ç„R‚ù„Sƒ„T‚å„T‚è„T^„St„Su„S„R‚ú„[k„[€†„[€‚„[€Ÿ„[c„[n„[€Ñ„[€Û„[€Ú„[€Ó„[{„[€Í„[|„[€Î„[€“„[~„[€Ù„R‚ü„mƒ„o‚È„o‚Ƀƒ„sƒ„sƒ„sƒƒ„wƒ„sƒ„y‚ú„zƒ„v‚ù„|„sƒ„sƒ„~‚ú„€„€„t‚ú„ƒ„€„v‚ú„†„€„ƒ „r„Šƒ„‹„€$„Š‚ú„Ž&„†(„sƒ„†.„sƒ„“ƒ„”ƒ „€K„€O„sƒ!„sƒ"„u‚ü„š„˜‚ú„œ„™‚ù„ž „™‚ü„ ƒ„¡x„œ(„œf„ž„‘‚ú„¦i„œg„œk„œn„œo„˜‚ù„¬q„u‚ú„®„¦r„¬h„¬t„¬u„¬„œi„œy„œ{„œ|„sƒ#„s‚ú„ºƒ$„œ„œ€„sƒ%„oƒ&„¿‚ú„Àƒ'„oƒ(„‚ü„Äsƒ)„‘‚ù„Æ€…„¦€†„Æt„¦€‡„Æ„¦€ˆ„Å‚ú„Í€Œ„Å‚ù„ÏV„oƒ*„Ñ‚ü„Ò„sƒ+„Ô‚ü„Õ„sƒ,„ׂü„Ø„sƒ-„Ú‚ü„Ûƒ„܃.„sƒ/„sƒ0„˜ƒ„àƒ1„sƒ2„®€•„oƒ3„ä‚ü„儬v„oƒ4„胄é„sƒ5„ë‚ú„쀟„¾‚ù„‚ú„ð€ª„ƒ€¬„ƒ€®„ƒ€³„ƒ€´„t‚ù„ö€¹„ìkƒ6„ùƒ7„ú‚ü„û„sƒ8„ý‚ü„þ„oƒ9…‚ü…„oƒ:…ƒ…ƒ;„u‚ù…€ë„ºƒ<„oƒ=… ƒ… „€„oƒ>… ƒ………ƒ;„œc„sƒ?…ƒ…„†€Ÿ…a„¦1„쀆„r‚ú…„†?„ì{„|@„sƒ@„sƒA„sƒB…!ƒC„zƒD„¦|„vƒ…%ƒ;„†… ‚ú…(Š„sƒE…*‚ÿ…+ƒ…,ž„sƒF….‚ü…/…,§„ƹ…ƒ…3ƒG…‚ú…5Ý…5„€ã„€á„€Ý„”ƒH„sƒI…<‚ü…=„zƒJ„”„¦‚X„¦k„oƒK…C‚ü…D…C‚ú…F€Ÿ„¦€‚„ö‚]„‘‚ü…J„oƒL„v‚ÿ…M…L‚ú…O€Ÿ„†ƒM„‚ú…RƒN„ùƒO…T‚ú…UƒP„ùƒQ…W‚ü…X„ùƒR…Zƒ…[ƒS„sƒT…L‚ù…^t…UƒU„sƒV…a‚ü…b…a‚ú…d‚z…d€‚„ùƒW…g‚ü…h„ùƒX…j‚ü…k„ùƒY…m‚ü…n„ùƒZ…p‚ü…q„ùƒ[…s‚ü…t„ùƒ\…v‚ü…w„ù‚ú…yƒ]„ùƒ^…{‚ü…|…%‚Ñ…%ƒ …Oƒ…€‚…€‚…O.„ùƒ_…„‚ú……„ùƒ`…‡‚ü…ˆ„†c…%a…O‚ˆ„¦‚|…Uƒa…Oc„ùƒb„zƒc…O‚—„ùƒd…“‚ü…”…( „oƒe„y‚ü…˜„†‚‰„†k„oƒf…œ‚ü…„¦€Ø…‚ù… „¦‚-„ì€Ó„ìc„¦‚q„ÆÍ„¦‚s„¦€Ò„¦f„Æu„¦‚w„¦‚t„¦‚{„Æ‚r„¦€Ô„¦‚}„¦‚~„¦€×„†„†‚…„†n„†‚ˆ„†‚‘„†‚’„†‚„†‚„†‚“„†‚”„†{„†‚ „†‚ „†|„†‚ „†€“„†‚—„†„†‚†„ìn„ì€Ñ„ì€Û„ì€Ú„ì€Í„ì|„ì€Î„쀓„ì€Ù„ì€Ø…—‚ú…Ðk…ЀŸ…Ðc…Ђ«…Ђª…Ðn…Ð{…Ð|…Ѐ“…ЂJ…Ð?„œp„®€‚„ìƒM…œ‚ú…߃g…‚Ø„¹‚ü…â„sƒh„¹‚ù…åƒi„sƒj…ç‚ù…胅éƒk…]‚ù…ëƒl…ëƒm…€‚˜ƒn #,3:SYhisx€€€Ž€€”€™€œ€¢€¥€¨€«€¬€¯€°€±€³€º€¼€À€Æ€Ò€Ú€à€á€ä€ë€ï€ò€ú€û€ü€ÿ  +1=IKVauy‹•Ÿ«±ºÄÌÖáêñø‚‚ ‚‚"‚$‚-‚8‚B‚D‚N‚S‚[‚e‚q‚|‚ƒ‚‹‚˜‚¨‚©‚ª‚·‚ĂɂՂ߂ã‚è‚î‚ù‚ýƒƒƒƒƒƒƒƒ!ƒ&ƒ1ƒ>ƒDƒGƒHƒOƒYƒ]ƒfƒgƒrƒzƒ€ƒ‹ƒƒ•ƒ›ƒ£ƒ¬ƒ´ƒÈƒÒƒÚƒâƒçƒëƒû„„„„&„,„2„T„Y„e„p„w„ƒ„’„—„©„ª„Ą̈́ã„ì„ô„÷„ü…………(…5…J…K…L…Q…[…`…a…o…p…ƒ…‰……‘…’…”…©…¶…À…Ê…Î…ã…í…÷††!†=†N†V†^†q†w†}†ƒ†•††¥†»†ò†ó†ü‡‡&‡:‡E‡O‡U‡`‡f‡p‡y‡~‡ƒ‡‡™‡¡‡®‡Â‡Ë‡Ñ‡Ó‡Õ‡Ö‡à‡á‡ï‡õˆˆˆˆˆ.ˆ>ˆNˆ]ˆfˆoˆrˆuˆ|ˆ}ˆ‰ˆŽˆ“ˆ¥ˆ«ˆ°ˆÉˆÔˆÝˆåˆæˆò‰‰‰ ‰‰‰'‰,‰3‰<‰I‰T‰^‰`‰v‰€‰„‰‰¤‰«‰²‰¸‰Â‰Í‰Ø‰Ü‰â‰ä‰æ‰ë‰ñ‰øŠŠ ŠŠŠŠŠ%Š/Š=ŠBŠJŠTŠeŠjŠpŠuŠ{ŠƒŠŠŠ‘Š˜Š³Š¸Š¿ŠÇŠÎŠÛŠäŠíŠõŠÿ‹‹‹‹&‹,‹4‹C‹K‹U‹f‹t‹€‹“‹‹©‹¸‹Å‹Ò‹Ý‹íŒŒŒŒ4Œ>ŒOŒgŒsŒ~Œ‰Œ•Œ ŒªŒ¶ŒÈŒÙŒìŒð ,/6Ne~‡¢«´ÇÎ×ÛóøþŽŽ"Ž<ŽAŽ_ŽwŽ{ޗޱŽÏŽð/>\xƒŒ¬Ïö@^€¥Îêñý‘ ‘‘"‘+‘5‘A‘I‘i‘‡‘©‘ʑ’7’I’h’o’z’’º’Æ’ç“ “/“X“…“¦“Ǔ씔@”`”d”‡”Œ”³”Ý• •-•J•K•l•‰•ª•ȕꖖ(–D–d–†–¤–©–¯–Ó–Ø——#—J—o—w— —¶—Зö˜ ˜?˜b˜c˜n˜Ž˜²˜»˜À˜Â˜á™™1™T™}™ ™Â™èš š4šSšpš‘š©š³šÏšÚšãšäšðšú›››››&›+›4›@›L›U›„›¥›«›´›Ú›úœœ œœ$œ2œGœZœgœmœqœ‰œ¤œÃœç,Mfƒ¥Ëæžž"žCžbž}žŸžÅžÞžûŸŸ5ŸSŸuŸ‘Ÿ—Ÿ·ŸÏŸë  ' < U p  ª É Ü â è ÿ¡¡¡/¡D¡]¡‚¡«¡Î¡õ¢¢=¢J¢[¢f¢u¢†¢—¢¢¤¢¶¢À¢Ä¢Ì¢Ó¢Þ¢ç¢ò¢ö££ £££$£/£5£D£R£[£e£r£z££Š£’£¬£Æ£ß£å£î¤ ¤ ¤ ¤¤¤$¤-¤2¤<¤@¤I¤O¤W¤]¤a¤j¤s¤|¤€¤‡¤•¤¤ž¤£¤ª¤´¤¼¤Å¤É¤Ò¤Ü¤è¤ô¤ý¥¥ ¥¥"¥0¥?¥K¥Q¥\¥e¥u¥{¥€¥…¥”¥™¥¢¥§¥±¥È¥Ð¥Ø¥à¥è¥é¥ê¥ñ¥ù¦¦¦O¦z¦|¦ƒ¦‰¦£¦¥¦°¦¶¦Ã¦Í¦Õ¦Ú¦æ¦ó§§§§?§G§L§U§Y§a§l§~§’§¥§Ý§ð§ø¨ ¨C¨V¨]¨b¨v¨Š¨«¨¹¨¿¨Å¨Í¨Þ¨õ¨ö©© ©©$©1©@©M©„©©•©¸©Ã©Ï©×©å©ñ©ò©ó©ÿª ª4ªDªaªzª’ª¬ªÇªé««««L«Y«˜«×«ß¬¬)¬c¬Š¬¼¬í­­5­?­g­­´­ã® ®6®`®†®«®Û®ü¯¯¯¯¯¯¯)¯8¯;¯?¯G¯L¯R¯U¯]¯g¯p¯v¯}¯ˆ¯”¯œ¯¤¯´¯¾¯Ï¯Ø¯Þ¯â¯î¯ø° °°°#°0°:°O°\°^°n°u°‚°°•°Ÿ°¨°²°Â°Ï°Ü°å°í±±±#±,±4±H±\±e±q±ƒ±‘±—±ž±ª±·±È±Ú±è±÷²²²)²-²8²>²U²i²}²‚²‰²”²²¤²±²¹²½²ÄbinarySearchinsertionSortlowerBoundmergeSortshufflereversepkg.collection.algorithmsRandom_mergeSortLimitEsortedListvaluecompareTbinarySearchByKkeyOfstartendlengthminmaxkey>element[]compunary-lowerBoundByelementsrandom>posnextInttmp1[]=_reverseijtmpcomparisonsetRangeinsertionSortByfirstLengthmiddlesecondLengthscratchSpaceidfirstTargetmergeSortBy_movingInsertionSortlisttargettargetOffsetelementKey_mergeSorttargetMiddle_mergefirstListfirstStartfirstEndsecondListsecondStartsecondEndcursor1cursor2firstElementfirstKeysecondElementsecondKey<=quickSortquickSortBy_quickSort>=pivotIndexpivotpivotKeyendSmallerstartGreaterstartPivotscurrentrelationcurrentTargetCanonicalizedMapCV_canonicalize_isValidKeyFn_basecanonicalizeisValidKeyfromotheraddAll_isValidKeypairforEachaddEntriesentriesmapecastK2V2clearcontainsKeycontainsValuevaluesanyfisEmptyisNotEmptykeystransform_putIfAbsentifAbsentremoveremoveWheretestretypeupdatenewValueupdateAlltoStringCombinedIterableView_iterablesiteratorcontainseveryfoldCombinedIterator_iteratorsiteratorsmoveNextCombinedListView_lists_throwCannot modify an unmodifiable ListindexinitialIndexretainWhere_sourcenoSuchMethodCombinedMapView_maps:sync-for-iteratorm_DeduplicatingIterableView_iterable_DeduplicatingIterator_iterator_emittedadd_zero_upperCaseA_upperCaseZ_lowerCaseA_lowerCaseZ_asciiCaseBitequalsIgnoreAsciiCaseabaCharcodeUnitAtbChar^aCharLowerCase|hashIgnoreAsciiCasestringhashchar&< instead.Use list.cast instead.Use set.cast instead.Use queue.cast instead.Use map.cast instead.package:collection/collection.dartpackage:collection/src/algorithms.dart@getters@methodspackage:collection/src/canonicalized_map.dart@constructorspackage:collection/src/combined_wrappers/combined_iterable.dartpackage:collection/src/combined_wrappers/combined_iterator.dart@setterspackage:collection/src/combined_wrappers/combined_list.dartdart:collectionpackage:collection/src/combined_wrappers/combined_map.dartpackage:collection/src/comparators.dartpackage:collection/src/empty_unmodifiable_set.dartpackage:collection/src/unmodifiable_wrappers.dartpackage:collection/src/wrappers.dartpackage:collection/src/equality.dart@factoriespackage:collection/src/equality_map.dartpackage:collection/src/equality_set.dartpackage:collection/src/functions.dartpackage:collection/src/iterable_extensions.dartpackage:collection/src/iterable_zip.dartpackage:collection/src/list_extensions.dartpackage:collection/src/priority_queue.dartpackage:collection/src/queue_list.dartpackage:collection/src/union_set.dartpackage:collection/src/union_set_controller.dartpackage:collection/src/utils.dartdart:mathdart:coreintObjectListNullRangeErrorcheckValidRangenumboolIterable_ListfilledMapMapEntryDeprecatedidenticalStringMapBasemapToStringIterableBaseIteratorListBaseUnsupportedErrorIndexError_InvocationMirror_withTypeSymbolTypeunmodifiableInvocationUnmodifiableMapBaseHashSetSetdart:_internalEmptyIterableStateError_CompactLinkedHashSetLinkedHashSetofidentityHashCodeHashMapLinkedHashMap_GrowableListdoubleComparable@typedefsComparatorcheckNotNegative_SyncIterator_SyncIterable_literal1generateConcurrentModificationErrorcheckValidIndexSplayTreeSetListMixincastFromiterableToFullStringIterableElementErrornoElementListIteratorFollowedByIterablefirstEfficientpragmatooManyStringBufferWhereIterableWhereTypeIterableMappedListIterableExpandIterableSubListIterableSkipWhileIterablecheckNotNullableTakeWhileIterableSortListMapViewtooFewEfficientLengthIterablecheckValueInIntervalReversedListIterableQueueSetBasesetToString_Overridemessage_ImmutableMap_kvPairsnameoptions¯“ƒ¥„e…š¨š¨š¬Ô@S0ùJNNiQQXg_:…9ŽTÅ]Ç{ÉtàöXq]ï¢îÉa2<? QÖS7¯“ÔЫÍïE0000000000 €Ú€ô+,KFPbp %49BMNO_iQrZWZ €Ús€ƒ “1“7” `€… “²“½€`€† “ç“ð€`€† ”” €`€‡“I“I“ˆ“V“ˆ“\`€†“n`€†“~`€‡` ? €€ë €ö ‚ “I€‰4”]”c•_`€…”¡”¥€`€†”³”¹€`€†”q”q”’”z”’”€`€†”‹`€†`?€Œ— ”q€‰”¾”Ò”ñ@j”¿`€…”Û”ñ`€†J”Þ”Þ~v”ä.`€†v”ê.`€†”ö••]@ j”÷`€…••]• [`€‡J•'""%•)€•'‚2`•@v•;•9‚2``€†v•C.`€†a`€…`€‡€Œ•Tv•M•K‚2``€†v•W.`€†a`€…`€‡€ŒÃ¹ƒyƒ–ŒÀA ƒ©ŒÀƒÈ ]€]€Ž`€[„ a`€]€‘`€„Aa`€]€‘`€„a`€`€]€‘`€’]€‘]€Ž`€[]€Ž`€[>N]€“]€Ž`€[„ª€•]€Ž`€[N`€‡*N]€—]€Ž`€[Na[[Na`€…`€˜[N`€†“N[N[Oƒ–^[[`€˜[ƒ©ŒÀ[[[[K>A>N„´„Ã]€Ž`€’]€Ž`€†`€‡2„Ú`€’]€Ž`€†`€‡>N„ò]€™]€Ž`€[v„ò€„ò‚ç]€™]€Ž`€[€œEx„ò„ka`€‡€ž>N„é ]€Ž`€[v…„k!]€Ž`€[€ A> N……"`€&…,x……„Á#'"a`€…[€¢`€M…P5[…P€¥}…g‚…Vƒ…h„ða`€]€‘`€‡ƒ²ƒ¾ƒï +N…B…N$`€…g€¨`€„ I…w…‡…{…nB…?N…­%`€©K>=…Æ… &…ã…Ѐ«…Ö…n`€`€©…û`€¬>B††&`€­>B†?M†k5[†k€¥}††q‚ý†€„ða`€]€‘`€‡ƒ²ƒ¾ƒï +N†Z†i&`€†€¨`€„ I††¢†“†AB†«?N†À†Í']€` †Ï†à„ÁN†ò‡(]€`€‡‡‡†sv‡0‡!†A`€)`€†€¯N‡C‡T*]€°`‡V‡h†A`€‡x†“>N‡¬]€™`€±v‡¬v‡¬‡¤… +]€`€±€³]€™`€±€œEx‡¬†úa`€‡€ž>N‡—,`€±v‡³†ú!`€±€ >>N‡Ý]€™`€´v‡Ýv‡Ý‡Ó‡W-]€`€´€¶]€™`€´€œEx‡Ý‡}a`€‡€ž>N‡Ä.`€´v‡æ‡}!`€´€ A> N‡öˆ/`€†vˆˆ‡Ú/`€†€¸Iˆ%ˆ5ˆ)‡ýBˆ>?NˆVˆ`0`€xˆnvˆjˆb… 1]€`€€¹#ˆo‡ý`€†a`€†`€€»IˆºxˆÈˆ¾ˆ/2'3^`€¼`€†`€‡€¾Bˆé?M‰5[‰€¥}‰ƒ‰ƒ+‰ ˆ/‰+„ða`€`€]€‘`€’‡ƒ²ƒ¾ƒï +N‰‰4`€’‰€¨`€’„ I‰>‰F‰Bˆÿ B‰O?N‰g‰p5]€Ž`€†`€‡x‰‰r„36‰ˆÿ `€’4‰’‰’‰¥]€Ž`€†`€‡J‰˜2‰£`€†`€‡a`€’a]€Ž`€†`€‡]€Ž`€†`€‡€¿N‰·‰Â7`€†u‰Úv‰Ð‰Ä‡Ú7`€†€ÀN‰ë‰ó!`€‡5Љý`€‡x‰ý‰õ‰1!#xŠ ‰þ‰¸"8”a`€Š`€†€Áa`€…`€‡€¢#‰ý‰ý‰ê#*‰ý‰ê#`€‡`€‡=xŠ(Š ‰1!9xŠ4Š)‰¸"8”a`€Š`€†€Á"Š;‰Û#xŠcŠR†Ë:Š}xŠ–vŠ‘Ї‡W`€†€Â8”a`€Š`€†€ÁxŠ®vЧŠ›‡Ú`€†€Ã8”a`€Š`€†€Áa`€…`€‡€Åa`€†`€‡\€ÆNŠÐŠà;]€Ž`€’]€Ž`€†`€†2Šö`€’]€Ž`€†`€†=x‹ Šü„3<4‹‹‹×‹4`€’‹5]€Ž`€†`€‡\>‹#‹ÖN‹/‹6=]€Ž`€†`€†2‹B`€†`€†>N‹i]€™`€†v‹i5‹i‹i]€`€†x‹iv‹d‹[‹w>]€š`€†€È?^@`€‡]€`€†€ÊR=x‹s‹i‹ÓA^a`€†`€†`€†\€Ë‹i‹Ó]€™`€†€œEx‹i‹¼a`€‡€ž>N‹S`€†v‹{‹¼!`€†€ >‹{‹¯=x‹‰‹ƒ‹–9‹ŠŒ†#u‹ x‹š‹’‹w#‹›Œ†a`€…`€‡€¢”“`€†a`€†`€†\€Æ=x‹Ä‹µ‹9‹Å‹l‹Ì‹–a`€’]€Ž`€†`€†\€Æaa`€’]€Ž`€†`€‡\\€ÌN‹ã‹ïB]€]€Ž`€[Œ€Ï]€Ž`€[“=xŒŒ ‹<4Œ%Œ%ŒpŒ&4`€’Œ+=]€Ž`€†`€†\>Œ3Œo=xŒEŒ9XCŒI}Œ^¢Œc­a]€Ž`€[\€Ðaa`€’]€Ž`€†`€†\\€Ì=ŽŒuƒœ2Œ`€['D'E'5Œ²XB=€Ñ„ƒg†ƒœ…ƒJŒÀ[F[G`€˜>=€Ò„ƒgŽ^Žf…ƒ=ƒ²€Óƒï =ƒ¾€Ôƒï =ƒ©ƒï a[=ƒ)J„ƒgŒû ŽØAHŽØ(&`€C(]€`€‡]€°`>SŽØN]gI]€°`RN]€°`€Ø`‚/N”™`€†”N¼Ã`€†“EÊÓÚJ`€†“xæ…ßlKv÷€èŽï)`€†€¯a`€Š`€‡€ÙÿlxŽ…ÿl8”a`€Š`€†€Á>Ž ŽÂIŽŽ*xŽ!€ŽŽï#…Ž"la`€†`€€Ú'La`€…`€‡€Û>Ž3ŽY=‹Ž;MxŽ?ƒŽ;M8”a`€Š`€†€Á=ŒŽI[“>Ž`Žv=ŒŽh[xŽn„Žh[8”a`€Š`€†€ÁIŽ|xŽŽŽ€Žú#…Žla`€†`€‡€»=xŽ¢‚Ž˜CަƒŽ°M„޶[a``€‡€Ü?JŽÆ‚ŽÍ$àAM4àJ ]€Ž`€[]€` >QàN[bN]€` s€Ï` “>N²]€™]€Ž`€[v²x²&©x›€–Þ#'Oa`€…[€¢]€[P]€Ž`€[a]€]€Ž`€[€Ý]€™]€Ž`€[€œEx²‚‘#a`€‡€ž>N‚O]€Ž`€[vЂ‘#!]€Ž`€[€ >ÐÍ>N]€™]€Ž`€[vx&xúƒñ‘Á#'Qa`€…[€¢]€[P]€Ž`€[a]€]€Ž`€[€Ý]€™]€Ž`€[€œEx„‘óa`€‡€ž>NßR]€Ž`€[v,„‘ó!]€Ž`€[€ >,É=x;4‘C?&kx[…V’‘#'a`€…[€¢`€†&Žx€…{’‘#'a`€…[€¢`€†x¶&®x¤…Ÿ’‘#'Sa`€…[€¢`€†T“a`€Š`€‡€Þa` \€ÐJÑØ‘‘‘$“.AU‘3“.‘H']€` ‘ZV`€†]€`€‡>‘h“.N‘r‘(]€`€‡‘ˆ€á`€‡‘“˜*=x’€’“‰A4’#’#’w’$W` ’'X` `€†J’3x’Qx’@v’6„’4”`€† Yv’D„’B”`€† a`€Š`€†€âZx’gv’]ƒ’[“÷`€† Yv’kƒ’i“÷`€† a`€Š`€†€âa`€Š`€†€ã^a` ` `€†\€Ë>N’]€™` v’€’“‰]€™` €œEx’ƒ”½a`€‡€ž>N’†R` v’ƒ”½!` € >’“E’£’¬’®[`€†v’¶„’°•`€† x’Å…’Õ&Kv’Í„’Ç•`€† a`€Š`€‡€Ù’Ø•&x’Ù…’Ø•&8”a`€Š`€†€Á>’Ý“=x’ó‚’å“¶9…’ô•&v’ÿ„’ù•`€‡ a`€†`€‡\€äJ“‚““¶׋=ÊÍÔÃn× €Ú€€ï€å€æ0s%¡Â¡È¢\\`€è*¡È `%? €ê'¡â¡ó¢@]j¡ã`€…¡ú¢¢^`€\J¢¢€ì€¢–Ž(¢!¢2¢Z@_j¢"`€…¢8¢Z¢@^`€\J¢L¢L€ì€¢R–Ñl¯òKw€†``€íj\`€í…A…^‹ÉAa…e‹É…jb`€’…{c`€‡…Œd`€‡…e`€‡…·f]€°`€…×g]€°`€j`€ï…íh`€íj`€ï]€‘]€Ž`€[]€Ž`€[>N]€“]€Ž`€[…ý€•]€Ž`€[N`€‡*N]€—]€Ž`€[Na[[Na`€…`€˜[N`€†“N[N[Ni[Nj[Nk[O…^^[[`€˜[…e‹É[[[[K>A>=#†„†—fŒ†—fRN]€°`€€Ø`€˜µ+]€°`€N†_†ll]€`€5†§†§]€`€x†§x†Œv†€†t—:l]€`€€ñm4†’†’†¥†“n`€`€‡J†™v†›†™™8o`€‡€òaa`€`€‡]€š`€€ó?^@`€‡]€`€€ÊR=x†±†§˜öC'pa`€\€Ð†§˜öN†Ä†È4`€’x†Õ€†Ê—:qr'pl†ù˜â^ s`€t`€u`€l]€š`€v`€†w`€x]€Ž`€[r`€y`€`€’€õN‡ z`€öM‡%5[‡%€¥‡+z4‡1‡1Š]€‘`€ï`€ï>N]€“`€ï‡:€•`€ïN`€‡*N]€—`€ïNa[[Na`€…`€˜[N`€†“N[N[Ni[Nj[Nk[O‡1^[[`€˜[‡1Š[[[[K>A>K>N‡R‡Z{`€øj‡b`€øM‡›5[‡›€¥‡«€û$‡¹‡µ™Ä|‡È›\(š¾šÊ›$+N‡’‡™}`€ù‡«€¨`€ù›3%N‡Þ‡é~]€ü`€‡ë€þ`€=xˆˆ ›¶)4ˆˆˆCˆ€€[\Jˆ%xˆ0ˆ%›Ö*C&ˆ9ˆ4œ+`€a`€\€4ˆMˆMˆ\>ˆPˆ=xˆeˆZ›Ö*€‚a]€‘[=xˆ~ˆvš;€ƒa]€‘\^a[\€„`€‡€a\€…`][=ˆ™š;ˆ£ vˆÃˆ¸›Ö*€†]`€ 4ˆËˆËˆòˆÓ^`€\Jˆßxˆæˆß›¶)Cˆê +a[\ €‡‰*€ˆ4‰ ‰ ‰4]€‘[J‰&x‰-‰&›¶)€‚^`€†`€]€‘[M‰=5[‰=€¥x‰Sx‰K‰Cš;€‰a]€‘`hj‰[`€í^`€í€Ša]€—`]€‘`š¾šÊ›$+=‰S€¨`›3%‰r`>M‰î5[‰î€¥x‰ü‰ôš;€ƒa]€‘\š¾šÊ›$+=‰ü€¨\›3%=/Š =€Ñš…š®š¢JŠ[F[G`€˜>=€Òš…ž´(ž¼)š¢=š¾€Ó›$=šÊ€Ô›$=‡1›$a[=š¢)Jš…jŠ!`€íh†Š:—Ž˜ ˜ ˜`+=˜€L>IŠP‚ŠT—P>MŠh5[Šh€¥Šn"Š‚š;h†Š”—Ž˜ ˜ ˜`+=˜€?Mа5[а€¥ж ŠÏš;ƒŠØ—[Šå—f]€°`€…Šó—w˜ ˜ ˜`+=Š©—õ ж€¨]€Ž`€[˜€B>I‹‹—E>M‹&5[‹&€¥‹,!‹<š;˜ ˜ ˜`+=˜€?M‹¬5[‹¬€¥x‹º‹²š;€ƒa]€‘\˜ ˜ ˜`+=‹º€¨\˜€=€Ñ‡—À—õ —éJ‹É[F[G`€˜>=€Ò‡—À ò ú—é=˜ €Ó˜`=˜ €Ô˜`=…e˜`a[=—é)J‡—À ‹Ì‹é‘ÓA€‹‹ø‘ÓŒz`€öŒe`€‡Œ8f]€°`€ŒWg]€°`€]€‘]€Ž`€[]€Ž`€[>N]€“]€Ž`€[Œi€•]€Ž`€[N`€‡*N]€—]€Ž`€[Na[[Na`€…`€˜[N`€†“N[N[O‹é^[[`€˜[‹ø‘Ó[[[[K>A>=#Œz‚Œm¡žŠŒm¡žRN]€°`€€Ø`€¢¼+]€°`€MŒ—5[Œ—€¥xŒ¥€Œ¡ˆ€‰a]€‘`‡¢*¢6¢g +NŒ’Œ•€Œ`Œ¥€¨`¢‡ NŒ¶ŒÂB]€]€Ž`€[ŒÚ€Ï]€Ž`€[“>N]€™`vuvŒûŒø£/€]€`]€™`€œEx£€a`€‡€ž>NŒê€Ž`v£€!`€ A>I "!ƒ¡®!x2'¡®]€°`€:vF;£á€`€a`€…`€‡€ÅBK?IYvj]¡ž]€°`€o`€‡>MŽ5[Ž€¥xœ€”¡ˆ€u´v²§£á€`€a`€]€‘`‡¢*¢6¢g +N„Œ€‘`œ€¨`¢‡ >Nà]€™`vàuàvÙѤÙ€‘]€`]€™`€œExà¤þa`€‡€ž>NÇ€’`vã¤þ!`€ A> Nó÷4`€’ýuŽ vŽ Ž¥_4`€!IŽ!Ž(vŽ!Ž¥ƒr`€"'€“a`€…`€‡€ÛBŽ6?NŽNŽT€”`€vŽjxŽ_vŽZŽV¥ƒu`€#€•'€–a`€¼]€`€$€—`€%I޽!xŽÏŽÂ¡ž]€°`€:ŽØ¥ßa`€…`€‡€ÅBŽà?M5[€¥x€ ¡ˆ€˜u?v=2£á€`€J'`€j\`€€™)"v™’¥_€`€*^`€]€`€€š`€†€™`€‡€›`€‡"`€€œ`€†]€‘`+,‡¢*¢6¢g +NŽø€`+€¨`+¢‡ M·5[·€¥½$€Û¡ˆä£áð§$þ¡“‡¢*¢6¢g +N¬µ5]€]€Ž`€[½€¨]€]€Ž`€[¢‡ =x £P€ž'§Œa]€š]€Ž`€[\->Mc5[c€¥xq€i¡ˆ€˜u—v•Š£á€`€ª'`€j¼`€€™)^`€]€`€€š`€†€™`€‡€›`€‡"`€€œ`€†]€‘`+,‡¢*¢6¢g +NSa€Ÿ`+q€¨`+¢‡ M‘5[‘€¥‘ $€‘&¡ˆ‘/£á‘;¨Ÿ‘J¡“‡¢*¢6¢g +Nù‘5]€]€Ž`€[‘ €¨]€]€Ž`€[¢‡ =x‘j‘^£P€ž‘q©a]€š]€Ž`€[\-=Ž‘ˆ¢2‘ `€['D'E'5‘Å£PB=€Ñ„¡ß†¢…¢J‘Ó[F[G`€˜>=€Ò„¡ß©©©±…¢=¢*€Ó¢g =¢6€Ô¢g =‹ø¢g a[=¢)J„¡ß!‘Ö‘Ý”A€ ‘씑÷z`€ö]€‘[[>N]€“[’€•[N`€‡*N]€—[Na[[Na`€…`€˜[N`€†“N[N[Ni[O‘Ý^[[`€˜[‘ì”[[[[K>A>M’5[’€¥x’#€’ª;€‰a]€‘`„ª……ª‘ªÊ +N’’€Œ`’#€¨`ªê N’4’<€¡]€]€‘[’F€Ï]€‘[“>N’n]€™`v’nu’nv’f’c«R€]€`]€™`€œEx’n«œa`€‡€ž>N’U€Ž`v’q«œ!`€ >=x“U“M«sC“`/[4“e“e”&]€‘`€ï`€ï>N]€“`€ï“n€•`€ïN`€‡*N]€—`€ïNa[[Na`€…`€˜[N`€†“N[N[O“e^[[`€˜[“e”&[[[[K>A>M“†5[“†€¥x“”€“Œª;€¢u“¬v“ª“Ÿ«ý€`€a`€]€‘`01¬•¬¡¬Ò+N“|“„€£`0“”€¨`0¬òI“¶!“Óv“Îu“Ìv““º­y€¤`24€¥`€6j“à`€a`€…`€‡€Û>M“ó5[“ó€¥x”€“ùª;cu”v””«ý€`€^`€€¦`€†€§`€]€‘`78¬•¬¡¬Ò+=”€¨`7¬ò?=€Ñ¬\¬…¬yJ”&[F[G`€˜>=€Ò¬\®Œ®”¬y=¬•€Ó¬Ò=¬¡€Ô¬Ò=“e¬Òa[=¬y)J¬\a]€‘[\€ÐK>M”:5[”:€¥”G9[”L«s„ª……ª‘ªÊ +=”G€¨]€[ªê ”Z`€…”a€¨`€…>=€ÑªUƒªx‚ªlJ”[F[G`€˜>=€ÒªU¯¢¯ª‚ªl=Œª…€ÓªÊ =ª‘€ÔªÊ =‘ìªÊ a[=Šªl)JªU"”“”š—5A€©”­—5”¸z`€ö”Ìh`€íj`€ï]€‘[[> N]€“[”Ü€•[N`€‡*N]€—[Na[[Na`€…`€˜[N`€†“N[O”š^[[`€˜[”­—5[[[[K>A>N”æ”ò€ª]€°`€RN]€°`€€Ø`€=x• ± Cj• `€a`€`€‡€Ü=x•'± Cj•'`€ a`€`€‡€Ü=x•F± Cj•F`€ a`€`€‡€Ü=x•`± Cj•``€ a`€`€‡€Ü=x•± Cj•`€ a`€`€‡€Ü± O•š•¡€«a]€‘[•ª–õ]€‘[[>N]€“[•³€•[N`€‡*N]€—[Na[[Na`€…`€˜[N`€†“N[N[O•š^[[`€˜[•ª–õ[[[[K>A>M•Ä5[•Ä€¥x•Ò€•ʰ3€‰a]€‘`²_²k²œ+N•¿•€Œ`•Ò€¨`²¼I•ßv•ðu•îv•æ•ã³(€]€`€¬`€‡:=0•ù'€­?>N–5]€™`v–5u–5v–-–*³(€]€`]€™`€œEx–5³a`€‡€ž>N–€Ž`v–8³!`€ >M–P5[–P€¥x–^€–V°3€¢u–vv–t–i³â€`€a`€]€‘`01²_²k²œ+N–F–N€£`0–^€¨`0²¼I–€!x–‘–…± :v–®u–¬v–¢–š´h€¤`24€¥`€6a`€…`€‡€Å>=0–¿'€®?=€Ñ²/²R²FJ–õ[F[G`€˜>=€Ò²/´ÿµ²F=²_€Ó²œ=²k€Ô²œ=•ª²œa[=²F)J²/=Œ–ú°‚—z—²j—`€íh—+°?B=€Ñ‚°_„°‚ƒ°vJ—5[F[G`€˜>=€Ò‚°_µÁ µÉƒ°v=°€Ó°Ä =ް›€Ô°Ä =”­°Ä a[=‹°v)J‚°_#—î—óš A€¯˜š ˜€’`;˜€œ`€†`€†>˜%š N˜™˜€°`€†“N˜¨˜¬€±`€†v˜Äu˜Âv˜µ€˜®¶R€²]€]€`€†=)`€†?C˜Îx˜Ù‚˜Õ¶xKƒ˜Û¶‡a`€Š`€‡€Ù>˜à™úN˜ì˜ð€³`€†x˜ö‚˜ò¶x8x™x˜þƒ˜ú¶‡Y‚™¶xa`€Š`€†€â€´”a`€†`€†Aa`€Š`€†€ÁN™™€µ]€`€†x™1u™0v™#€™¶R€²]€]€`€†=#„™2¶ëa`€†]€`€†€»I™™S™j=‹™[¶‡„™a¶ë>™q™öE™y™‚™„[`€†”x™‹†™‰·þKv™‘…™·R)`€†?a`€Š`€‡€ÙŽ™™·þx™›†™™·þ8•a`€Š`€†€Á>™¡™ÛI™«™¶x™²…™¯·R#†™³·þa`€†`€†€»™¹¶^a`€…`€‡€ŒJ™Ãv™Î…™Ê·R€—`€†%?=Š™ã¶xx™í„™é¶ë8”a`€Š`€†€ÁJ™þ+$šYš|¡¿A€¶šŒ¡¿š—z`€öš¯€Ž`šÈ€·`+šÕe`€‡]€‘]€]€Ž`€[]€]€Ž`€[>N]€“]€]€Ž`€[šè€•]€]€Ž`€[N`€‡*N]€—]€]€Ž`€[Na[[Na`€…`€˜[N`€†“N[N[Oš|^[[`€˜[šŒ¡¿[[[[K>A>N››#€¸]€Ž`€’]€Ž`€†`€†2›9`€’]€Ž`€†`€†N›E›M€‘]€Ž``;2›b``;>N›‡]€™`Bv›‡u›‡v›‚›z¹Q]€`BD]€™`B€œEx›‡º‹a`€‡€ž>N›qR`Bv›Šº‹!`B€ A> N›–› €¹`x›±u›°v›©‚›¢¹€‘]€`E#u›Ãv›¸›²ºé€º`€†Ga`€†`€»N›Ñ›Û€»`€’›áuœvœ x›öu›õv›î‚›ç¹€‘]€`E#uœv›ý›÷ºé€º`€†Ga`€†`€»4`€!IœPœevœ^œT»cr`€"'€¼a`€…`€‡€ÛBœt?Iœ£"!ƒœ¨¹œÈvœÁœ·»cr`€"'€½a`€…`€‡€ÛBœÓ?Iœâ!xœïœçºd€¾œû» a`€…`€‡H>M.5[.€¥x<€4¸û€¿uSvQF¹€`€ubv`V» €`€*^`€`€S`€†J`€†]€‘`IJ‡¹®¹º¹ë +=xºd9» &e<€¨`Iº `;a``;\€Æ?N€‡€’`;x‰ºd#‘» a`€…`;€¢I¡¬¥½6Bµ?Nžž=]€Ž`€†`€†xž žº/6ž,»c4ž7ž7žI]€Ž`€†`€†Jž=2žG`€†`€†a`€’a]€Ž`€†`€†]€Ž`€†`€†€¿Nžwž€5`Kvžˆž‚ºé5`KLIž—ž¤ž›½ÿBž­?>Nžà]€™`€†vžàužàvžÜžÓ½ÿ`K€À]€`€†N]€™`€†€œExžà¾5a`€‡€ž>NžÇ€œ`€†vžã¾5!`€†€ A>Nžñžö`€†žø#Ÿ ½6`;Ÿ¾šIŸ&Ÿ/Ÿ*¾¾>=ŸB€ì$Ÿ†'€ÁŸS¾š'€ÂŸ|»cBŸ‘?=xŸ¯Ÿ©½|9Ÿ°¾¾`€†#xŸ¿Ÿ¸½|€¾ŸË¾¾`€†a`€…`€‡HxŸáuŸßxŸÙŸÓ½|#ŸÚ¾¾`€†a`€…`€†€¢8”a`€Š`€†€Á”`€†a`€†`€†\€Æ>N ]€™`€†v u v   ½ÿ`K€Ã]€`€†O]€™`€†€œEx ¿Åa`€‡€ž>NŸÿ€œ`€†v ¿Å!`€†€ A>N + 0`€† 2# G½6`; OÀ@*I ` i dÀ@N>= |€ì$ À'€Á À@*'€Â ¶»cB Ë?=x ê ã½|6 öÀ@N`€†4 ü ü¡`€†J¡“a`€†a`€†`€†€¿N¡*¡35]€]€Ž`€[¡K€Ï]€Ž`€[“=x¡Y¡Qº/<4¡a¡a¡©¡b4`€’¡g=]€Ž`€†`€†\>¡o¡¨=x¡~¡uÀAC¡‚}¡—ÀAK¡œÀAVa]€Ž`€[\€Ðaa`€’]€Ž`€†`€†\\€Ì=Ž¡®¹“¡µÀAB=€Ñ„¹T†¹“…¹‡J¡¿[F[G`€˜>=€Ò„¹TÀBÀB…¹‡=¹®€Ó¹ë =¹º€Ô¹ë =šŒ¹ë a[=¹‡)J„¹TBz1 !l*0668ßBz +€ÚP€ÄP-Œ¯€Å^`€W-`€‡ŒÒu`€4)œ€Æ`€…8) `4? €‰6bqšB€Çwš“€È]€Ž`€]€Ž`€†`€†]€‘`€C/Ct9‚R‚X‡'€É`€…`4;ƒ»ƒÃ€€Ê`Q<ƒÕƒÝ€€Ë`€=ƒõƒý€€Ì]€`€Aƒkƒkƒ§ƒxƒ§ƒ~€Ê`QƒŽ€Ì]€`€j`€ïƒ€Ë`€j`€ï`9?;€ÀCì=ÀCø<‚ÀD ƒk€‰?„„‡%@€Çj„`€…„#‡%„?€È]€Ž`€]€Ž`€†`€†]€‘`€`€> N]€“`€„M€•`€N`€‡*N]€—`€Na[[Na`€…`€˜[N`€†“N[O„^[[`€˜[„#‡%[[[[K>A>N„Y„d€Í^`€W-`€‡„f3v„u.€Ì]€`€=N„ЄހÎ`Q„S>N„»]€™`€v„»v„»€„´ÀDs>]€š`€€È]€™`€€œEx„»ÀE«a`€‡€ž>N„­€Ï`€v„ÁÀE«!`€€ A> N„τрÐ]€Ž`€†`€†u„Þx„Ù€„ÓÀDs#„ÚÀF a`€…]€Ž`€†`€†€¢N„ë„ò€Ñ`€x„ýv„ô.€Ê`Q;€Ò…ÀF a`€`€YI………ÀF{>B…/?I…H!}…W…MÀEX …XÀF{`€^`€W-`€‡>B…k?I…„!…‘v…ˆ.€Ë`€<>=…¤ÀF{…­U…¸ÀF{`€€Óv…Æ.€Ë`€<?=x…ä…àÀE €Ô$…ø'€Õ…ïÀF{`€'La`€…\WN†† +]€`€†5††]€`€†x†v††ÀF0>]€š`€†€È?^@`€‡]€`€†€ÊR=x† †ÀGžA^a`€†`€†`€†\€Ë†ÀGž>N†<]€™`€†v†<†<ÀGŠ]€™`€†€œEx†<ÀH+a`€‡€ž>N†7€Ö`€†v†CÀH+!`€†€ >=x†Q†MÀE €Ô$†h'€×†\ÀH{'€Øx†a†`ÀF0#†bÀH{a`€…`€†€¢'La`€…\W=x†}†yÀE €Ô$†™'€Ùv††‰ÀGŠ)`€†?'La`€…\W=x†¦†¢ÀE €Ô$†Ú'€Úv†Ðx†¸†²ÀGŠm4†¾†¾†Î†¿€Ö`€†`€‡J†Åx†Ëu†Éx†Æ†ÅÀF0#†ÇÀI{a`€…`€†€¢T“a`€Š`€‡€Þaa`€†`€‡]€š`€†€ó)`€†X'La`€…\W=x†ç†ãÀE €Ô'€Ûa`€…\W=‹‡ ÀDÏx‡‡ÀE €Üa`€YB=€ÑÀD¦ƒÀDÏ‚ÀDÃJ‡%[F[G`€˜>=€ÒÀD¦ÀJy ÀJ ‚ÀDÃ=ŒÀD߀ÓÀE=ÀDë€ÔÀE=„#ÀEa[=ŠÀDÃ)JÀD¦DPKB‡ç‡íŒˆ€Ý`€…`4D‰‰!€€Ê`QE‰2‰8€€Þ`iF‰P‰X€€Ì]€`€JˆÄˆÄ‰ˆØ‰ˆÞ€Ê`Qˆí€Þ`iˆû€Ì]€`€j`€ï`B?D€ÀK{EÀK†F‚ÀK’ ˆÄ€‰H‰]‰xŒ†@€Çj‰^`€…‰~Œ†‰”€È]€Ž`€[]€‘`€`€>N]€“`€‰¢€•`€N`€‡*N]€—`€Na[[Na`€…`€˜[N`€†“N[N[O‰x^[[`€˜[‰~Œ†[[[[K>A>N‰®‰¹€Í^`€W-`€‡‰»3v‰Ê.€Ì]€`€FN‰ß‰ã€Î`Q‰åS>NŠ]€™`€vŠvЀРÀKú>]€š`€€È]€™`€€œExŠÀM.a`€‡€ž>NŠ€Ï`€vŠÀM.!`€€ A> NŠ$Š&€Ð]€Ž`€†`€†&Š4xŠ.€Š(ÀKú#Š/ÀMa`€…[€¢]€Ž`€†`€†NŠRŠY€Ñ`€xŠdvŠ[.€Ê`QD€ÒŠlÀMa`€`€YIŠxŠƒŠ|ÀN>BŠ–?IН!}оŠ´ÀLÛ Š¿ÀN`€^`€W-`€‡>BŠÒ?MŠù5[Šù€¥x‹vŠÿ.€Þ`iE€ß‹ ÀN`€a`€]€‘]€`€m„ÀLZ…ÀLfÀL— +NŠñŠ÷+]€`€‹€¨]€`€ÀL· I‹‹$‹ÀNø>B‹7?=x‹S‹OÀM€à‹[ÀN`€^`€…\ZE‹j‹s‹x`€†”x‹‚‹}ÀOq€áv‹‹‹…ÀNø]€`€)`€†?a`€Š`€‡[‹“ÀOqx‹—‹“ÀOq8”a`€Š`€†€Á>N‹©‹°€â`€j‹²`€ I‹Ãx‹É‹ÇÀM³€¾‹ÕÀOqa`€…`€‡H>=‹èÀOïxŒx‹ùx‹ò‹ñÀM³#‹óÀOqa`€…`€†€¢€Üa`€]€ãvŒjŒ `€ )`€†€¯^`€†`€`€^?=xŒ3Œ/ÀM€à$ŒWŒ=ÀOï'€äxŒKŒFÀNø]€`€#xŒQŒLÀOqY”a`€Š`€†€âa`€†`€€»^`€…\Z=‹ŒmÀLJxŒxŒtÀM€Üa`€YB=€ÑÀL!ƒÀLJ‚ÀL>JŒ†[F[G`€˜>=€ÒÀL!ÀQƒ ÀQ‹‚ÀL>=ŒÀLZ€ÓÀL— =ÀLf€ÔÀL— =‰~ÀL— a[=ŠÀL>)JÀL!K×R0Œ‘Œ¤€†€å+`€jŒ›`€ 3ŒÚŒæÏA€æ+ŒôÏ€Ì]€`€^`€W-`€‡> ÏI€ÀRUJ'4..C6u`€`€‡J?)?NN\€ç]€`€xwxg^ÀRU]€`€€è`€jm^`€`€`€`€`€`€`€`€aa`€`€]€š`€_?^@`€‡]€`€€ÊJƒ4ŠŠÍ’u`€`€‡J›x©›ÀR»€é4­­Ì®€ê`€`€‡J·x¼‚·ÀSj2ƒÇÀSŸ^`€¼`€†`€‡€¾aa`€`€‡`€‡`SûBóCKRR9Sû K€Úa€ë€û€åP;sM‚‚6§A€ì‚B§‚a€í]€]€Ž`€[‚v€î`€‡j‚Š`€‡‚›€ï`€j`€ï]€‘]€Ž`€]€Ž`€†`€†]€Ž`€]€Ž`€†`€†>N]€“]€Ž`€]€Ž`€†`€†‚²€•]€Ž`€]€Ž`€†`€†N`€‡*N]€—]€Ž`€]€Ž`€†`€†Na[[Na`€…`€˜[N`€†“N[N[O‚6^[[`€˜[‚B§[[[[K>A>N‚¼‚Å€Ê`Q‚Ç^€ï‚‚ÞÀTšN‚õ‚ü€Þ`i‚þoNƒTƒa€ð]€Ž`€]€Ž`€†`€†2ƒz`€]€Ž`€†`€†Oƒƒ†€ña]€Ž`€†`€†`€†`€†\ƒŽ„ƒ€è]€Ž`€†`€†ƒ¦`€†ƒ°S`€†\>ƒ·„NƒÃƒÌ€ò`€†xƒÒƒÎÀVk6ƒÞÀV€4ƒäƒäƒë`€†Jƒê“a`€†a`€†`€†€¿=xƒõƒòÀVk9ƒöÀV€x„ƒþÀV‹8„ÀV¡a`€Š`€†€Áa`€†`€†\€Æ>N„%]€™]€Ž`€[v„%€„%ÀTn]€™]€Ž`€[€œEx„%ÀWTa`€‡€ž>N„ €ó]€Ž`€[v„1ÀWT!]€Ž`€[€ A> N„=„D€Ñ`€&„Rx„G„FÀW®#'€Ña`€…[€¢`€I„b„m„fÀWà>B„´?N„̈́ހô]€]€`€†„ë€Ï]€`€†“I„ô„øÀT†>N……u`€x…)… ÀUÕ€Ò…1ÀWà`€a`€`€YI…@!…I…DÀXh>M…j5[…j€¥x…w…pÀUó€ß…|ÀXh`€a`€]€‘]€`€m†ÀUT‡ÀU`ÀU‘ +N…b…h+]€`€…w€¨]€`€ÀU± =…‹ÀX/…ž€‚u…³…®ÀYI…â""…þv…÷…æÀX/)`€†?”a`€…`€‡€Œ†)x†%x†"†ÀX/#“a`€†]€`€†€»#“a`€†`€†€»“a`€…`€‡€Œ†Tx†Px†M†=ÀX/#“a`€†]€`€†€»#”a`€†`€†€»v†]†WÀY]€`€)`€†?a`€…`€‡€Œ>B†q???N†Å†Ò€õ]€™]€`€†v†å†ÔÀX/]€™]€`€†€œN†÷‡€ö`€‡x‡‡ÀZ^a`€‡€žO‡"‡'€÷a]€™]€`€†`€†`€‡‡8‰‡M€ø]€™]€`€†‡``€†`€‡>‡f‰I‡n"!‡sÀZ•v‡—v‡‡ÀZî!]€`€†€ €¬`€‡:>‡ ‡¾J‡ª*?I‡Çx‡Ð‡ËÀ[Kx‡çv‡à‡ÒÀZî!]€`€†€ #“a`€†`€†€»a`€Š`€‡€ÙJ‡ì*?Cˆ""ˆÀZ•vˆ6vˆ.ˆ ÀZî!]€`€†€ o`€‡xˆgxˆcvˆ\ˆNÀZî!]€`€†€ #”a`€†`€†€»KˆiÀ[a`€Š`€‡€Ù>ˆoˆ¦=ˆyÀZ•xˆ”ˆ†ÀZîa`€‡€žIˆ¯"""ˆ³ÀZ•vˆávˆÙˆËÀZî!]€`€†€ o`€‡x‰x‰v‰ˆùÀZî!]€`€†€ #“a`€†`€†€»€á‰À[a`€Š`€‡[x‰,‰'À[€áx‰Dv‰=‰/ÀZî!]€`€†€ #”a`€†`€†€»a`€Š`€‡[>‰I‰fJ‰S)?J‰o*N‰Ž‰›€ù]€Ž`€†`€†x‰ª‰ÀV6‰¶ÀWà`€4‰¾‰¾‰Ð]€Ž`€†`€†J‰Ä2‰Î`€†`€†a`€a]€Ž`€†`€†]€Ž`€†`€†€¿N‰Ý‰â€À]€[&‰îx‰å‰äÀW®#'€Àa`€…[€¢]€[EŠ“ŠœŠž[`€†“xХУÀ^/KvЬЧÀ]ñ)`€†?a`€Š`€‡€ÙŠ´À^/xжŠ´À^/8•a`€Š`€†€ÁA>NŠÊŠÌ€Ö[xŠÒŠÎÀ]ñ#ŠÓÀ^/a`€†[€»IŠÝ%ŠãŠáÀ^¤`€†>I‹ ‹ÀZ‹#ÀZ^‹1À^¤`€†a]€™]€`€†`€†`€‡B‹5?=‹HÀV?‹QÀ]e‹_À^¤`€†&‹nx‹f‹bÀ]ñ#x‹i‹gÀ^/8”a`€Š`€†€Áa`€†[€»`€†a]€Ž`€†`€†`€†`€†\I‹„%‹Š‹ˆÀ^¤`€>N‹ð‹ù€ú`€†x‹ý‹ûÀ^¤`€€û'Y^`€¼`€†`€†bNŒŒ€ü`€†Œ%cxŒ-Œ+À^¤`€€ý“Œ:À_Í^`€†`€†`€dNŒTŒX€þ`€†Œ^cxŒfŒdÀ^¤`€€ýxŒyŒpÀ_Í8”a`€Š`€†€Á^`€†`€†`€dEŒˆŒ‘Œ“€ÿ`€†Œ•À` xŒžŒœÀ`Ç!€áŒ¡À`\ a`€Š`€‡[Œ¦À`Ç!xŒ§Œ¦À`Ç!8”a`€Š`€†€ÁA>IŒ·Œ»ÀZÂŒÍÀZ^ŒÛÀ`Ç!a]€™]€`€†`€†`€‡BŒß?=ŒôÀV?ŒýÀ]e À`Ç!&xÀ]ñ#xÀ^/8”a`€Š`€†€Áa`€†[€»`€†a]€Ž`€†`€†`€†`€†\>=0DJg'=’ÀU2™ÀVB=€ÑƒÀTå…ÀU2„ÀU&J§[F[G`€˜>=€ÒƒÀTåÀbDÀbL„ÀU&=ŽÀUT€ÓÀU‘ =ÀU`€ÔÀU‘ =‚BÀU‘ a[=ŒÀU&)JƒÀTåNÍÒÉAÞÉÿ]€Ž`€]€Ž`€†`€†Ž"N]€Ž`€]€Ž`€†`€†\>Ž*É=xŽ5€Ž.Àbê<4Ž=Ž=ÆŽE`€ŽY€Ð]€Ž`€†`€†\>Ž\ÅNŽhŽs]€Ž`€†`€†xŽ{ŽuÀc#‚Ž|ÀcNa`€…]€Ž`€†`€†€¢Iއ!Ž–„Ž‹Àcz>ŽŸœ=xŽ©ƒŽ§ÀcZ<4ޱޱ•޶`€†ŽÀ`€†\>ŽÅ”NŽÕŽä`€†xŽðŽæÀcz]€Ž`€†`€†#…ŽñÀcòa`€…`€†€¢I‡Àd>H=x2(Àcz]€Ž`€†`€†9…3Àcò†;Àcýa`€†`€†\€Æ>OŒ=xe[Àcz]€Ž`€†`€†9…fÀcòx}nÀd`€†8†Àcýa`€Š`€†€Áa`€†`€†\€Æaa`€†`€†\\€Ì>£Á=x±«Àc9‚²ÀcNƒºÀcZa`€]€Ž`€†`€†\€Æaa`€]€Ž`€†`€†\\€ÌO 0’ËA=’ËP]€š`h]€¨`€†i€î`€‡j}`€‡Ž€ï`€j`€ï]€‘]€Ž`€]€Ž`€†`€†]€Ž`€]€Ž`€†`€†>N]€“]€Ž`€]€Ž`€†`€†¥€•]€Ž`€]€Ž`€†`€†N`€‡*N]€—]€Ž`€]€Ž`€†`€†Na[[Na`€…`€˜[N`€†“N[N[O0^[[`€˜[=’Ë[[[[K>A>N¯¼ ]€Ž`€]€Ž`€†`€†2Õ`€]€Ž`€†`€†>Nì]€™`hvì€ìÀeš]€™`h€œExìÀg@a`€‡€ž>Nä`hvóÀg@!`h€ >Nÿ‘ `€x‘‘ ÀgŽ ^ `i`€kN‘-‘5 ]€Ž`€[&‘Mx‘N‘‘¨€í]€[&‘¾x‘±‘ªÀgë#'5a`€…[€¢]€[M‘ã5[‘〥‘éMx’ ’ÀhvP]€Ž`€[a]€]€Ž`€[€Ý€î‚’GÀe¸€ïƒ’rÀėÀf†Àf’Àfà +=‘ÍN‘逨]€Ž`€]€Ž`€†`€†Àfã ’“Àg?=Ž’¶Àfd’½ÀgB=€Ñ„Àf†Àfd…ÀfXJ’Ë[F[G`€˜>=€Ò„ÀfÀišÀi¢…ÀfX=Àf†€ÓÀfà =Àf’€ÔÀfà ==Àfà a[=ÀfX)J„Àfj&TPTSbÏej& P€Úa€ñ€åo9P€ÄQ¥«Ò`€…S‚m‚y€€ï`€T‚‹‚’€`€U‚©‚´€]€`€‚²€Ï`€“W‚ЂـP]€Ž`€`€’^¸¸‚ZÀ‚ZÊ€ï`€j`€ïÝ`€j`€ï`Q?TÀkS€þÀk W#!‚-€‚ Àk ‚7\‚FÀk `€+]€Ž`€`€’ ¸€‰YƒPƒXŠ8@€Òƒ_Š8ƒg€»`€`€>ƒrŠ8Nƒ~ƒ‚4`€’ƒˆ€ƒŽÀk£Iƒžƒ­vƒ¦ƒ¢Àk½r`€"'€½a`€…`€‡€Û>ƒ¸‡…NƒÆƒÎ`€vƒÕ.`€TIƒäƒð‚ƒèÀl >ƒù„OJ„<+?N„^`€I„nx„Šv„ƒv„v„rÀk½l]€`€€ñ)`€†?T”a`€Š`€‡€Þ>„† N„„¢u`€x„´v„¨„¤Àk½l]€`€€ñ#“a`€†`€€»I…x…(„…#Àl‘'a`€`€‡p>…<…{=x…Ov…H.]€`€UC$…Y…UÀk½a`€\€ÐJ…f+?=Œ…ÕÀl‘x…á„…ÜÀl‘'Y'€¨a`€¼`€`€qN††l]€`€RN†]€`€†r`€† Àl `€„†3Àl‘=x†W…†Àmy€žx†Wv†J†FÀk½l]€`€€ñ”^`€†`€†]€`€sa]€š`€\-…†Àmy=‹†vÀl>†t…†‹Àme>†§‡RN‡‡ `€v‡‡ Àk½u`€#=‹‡Àl>‡)u‡0Àl `€„‡9Àn3$‡I„‡@Àn3'J‡Zx‡a.ƒ‡vÀl>a`€`€Z?I‡‹‡šv‡“‡Àk½r`€"'€“a`€…`€‡€Û>‡¨‰ˆN‡¶‡À]€Ž`€`€’v‡Ç.P]€Ž`€`€’WI‡Ø‡æ‚‡ÜÀnÜ>‡ïˆ J‡ù+?Nˆˆ'`€xˆ9vˆ-ˆ)Àk½l]€`€€ñ#“a`€†`€€»NˆJˆU`€’xˆ`ˆWÀnÜ]€Ž`€`€’#ƒˆaÀo#a`€…`€’€¢Iˆuˆ„„ˆyÀob>ˆˆÆ=xˆžvˆ—.]€`€UC$ˆ¨ˆ¤Àk½a`€\€ÐJˆ³+?NˆÔˆà`€ˆâvˆìÀob`€’N‰‰`€‰tx‰0v‰#‰Àk½l]€`€€ñ”^`€†`€†]€`€sJ‰Cx‰J.‰_u…‰fÀoñ†‰sÀpa`€`€Z?I‰Ž‰v‰–‰’Àk½r`€"'a`€…`€‡€Û>‰¨‰áJ‰°x‰·.‰Ìv‰ÖÀk½a`€`€Z?=xŠvŠ.]€`€UC$Š"ŠÀk½a`€\€ÐJŠ)+ZЋГ‹®@Ч‹®Нu`€`€>е‹®NŠÁŠÐ `€ŠÒw€ŠÞÀqQNŠïŠôD`x‹{‹Àqj!)I‹8‹A‚‹<Àqˆj‹Y`xa`€…`€‡|J‹c+?J‹tx‹‹{~‹€Àqj"a`€\‹³‹ËÐA#P‹ÙЋá€ï`€]€Ž`€`€’>‹ïN‹ûŒ$`€xŒŒ~€Œ Àr ^ `i`€kK>Œ4NŒBŒI%`ŒcƒŒoÀr7xŒŒ|„€Ò€Œ‰Àra`€`€’…JŒŸRNŒ¦]€Ž`€`€’2Œ¦`€`€’>NŒË]€™`†vŒËvŒË‚ŒÄÀr}&]€š`†ˆ]€™`†€œExŒË„Àrëa`€‡€ž>NŒ¹€“`†v„Àrë!`†€ =xŒëƒŒ¦ÀrÆ9vŒç…ŒßÀsI'`€ŠvŒõ…ŒíÀsI(`€’‹a`€`€’\€ÆƒŒ¦ÀrÆ`€¬-€¨`€¬>0ÌNsy+]€š`€ˆŽŽÀr7N¤¯)]€Ž`€`€’2¾`€`€’>NÙ]€™`€vÙƒÙÀsÓ]€™`€€œExÙ…Àta`€‡€ž>NÑ`€và…Àt!`€€ A>à­Iêxó†îÀth2'*^`€¼`€†`€‡€¾BŽ?NŽŽ'+`€†xŽ.†Ž)Àth€û',^`€¼`€†`€†bIŽDŽS‡ŽHÀtÀxŽV”-a`€†a`€…`€‡€Œ>ŽZ-=0ŽfŽl‘$Ž{'.'/Àr7?=xA„7Àsõ9xG†BÀth€ý“‡TÀtÀ^`€†`€†`€dsx~†yÀth€ýx“‡ˆÀtÀ8”a`€Š`€†€Áv†˜Àth)`€†€¯^`€†`€†`€da`€`€’\€ÆJµ„¼Àsõkˆq6qùv_íó—A0`Qaš§€1`€h``ˆmˆt1`€j„`€`_?a€Àvf `^c‘‘2”ˆ@€Òj‘`€…‘9”ˆ‘A€»`€`€>‘L”ˆN‘X‘\4`€’‘b€‘hÀv·I‘x‘‡v‘€‘|ÀvÑr`€"'€½a`€…`€‡€Û>‘’‘ÃJ‘²+?I‘É‘Øv‘Ñ‘ÍÀvÑr`€"'€“a`€…`€‡€Û>‘æ’TJ’!x’(.2Pv’A’=ÀvÑl]€`€€ña]€`€`€f?I’Z’iv’b’^ÀvÑr`€"'a`€…`€‡€Û>’t“ÎN’‚’–3`€x’½$’¼'4v’®.1`€a’È”'5'€–a`€¼`€`€qN’ê’ö6`€†x“v’ü’øÀvÑu`€#€û‚“ ÀwÀ^`€¼`€†`€†bI“%x“5ƒ“)Àx7“a`€Š`€‡•>“;“µN“K“U8`€†x“cƒ“WÀx8v“y‚“eÀwÀ)`€†€¯a`€Š`€†€ÁJ“‰x“™v“”“ÀvÑu`€#€ý„“£Àx‚^`€†`€†`€d?J“½+?I“Ô"“ãv“Ü“ØÀvÑr`€"'9a`€…`€‡€Û“üv“õ“ñÀvÑr`€"':a`€…`€‡€Û>””1J”x”.;P”'ÀvÑa`€’`€e?=x”hv”a.]€`€UC$”r”nÀvÑa`€\€ÐJ”y+e”””•²@;P”¤•²”©4`€’`€>”®•²N”º”Æ<`€†x”Ùv”Ì€”ÈÀyÛl]€`€€ñ€û'&^`€`€†`€†–I”òx•”öÀyô7“a`€Š`€‡•>••‡N••$1]€`€x•7v•*€•&ÀyÛl]€`€€ñx•K•?Àyô8”a`€Š`€†€Á^`€†`€†]€`€sJ•Wx•^.2P‚•sÀzia]€`€`€f?J•x•¥v•˜€•”ÀyÛl]€`€€ñ='€–^`€`€—f•·•¾—?@2P•Ò—?•àl]€`€`€>•î—?N–+–7`€x–E€–9À{^#“a`€†`€€»N–T–b`€x–|x–q€–dÀ{^”^`€†`€†]€`€s='€–^`€`€—N–‘–`€#x–«–ŸÀ{|:'>^`€¼`€†`€‡˜x–Ï–ÃÀ{|'>'€–a`€¼`€`€q$— '?—À{|`€J—$—;ƒ—À|'@‚—-À{ªv”y¿{B|—i—o—u™)A`€…k—“—ž€]€`€—œ€Ï`€“o—u `i? €‰m˜-˜C™'@€ß˜G™'˜Ou`€]€‘]€`€]€`€>N]€“]€`€˜[€•]€`€N`€‡*N]€—]€`€Na[[Na`€…`€˜[N`€†“N[N[Ni[O˜C^[[`€˜[˜G™'[[[[K>A>K>M˜Â5[˜Â€¥x˜Ó˜È~€˜ÍÀ}(B^ `i]€‘]€`€™„À}š…À}¦À}ß +=‹˜»À}…˜Ó€¨]€`€À}ÿ B˜è`€…˜ï€¨`€…>=x™v˜ú.]€`€kC€™À}(a`€\€Ð=‹™À}…+B=€ÑÀ}RƒÀ}…‚À}yJ™'[F[G`€˜>=€ÒÀ}RÀ+À3‚À}y=ŒÀ}š€ÓÀ}ß =À}¦€ÔÀ}ß =˜GÀ}ß a[=ŠÀ}y)JÀ}R} ¶Æjvv&|¬ÃÆ p€Ú€€ïaCD€å1Hsr]z…ÞAE‡…ÞF`€®G]€`€j`€ïÃH`€‡jÍ`€‡Ýe`€‡jë`€‡‚h`€íj`€ï]€‘]€Ž`€[]€Ž`€[>N]€“]€Ž`€[‚€•]€Ž`€[N`€‡*N]€—]€Ž`€[Na[[Na`€…`€˜[N`€†“N[N[Ni[Nj[Nk[Oz^[[`€˜[‡…Þ[[[[K>A>N‚‚#I]€`€‚%r`€'J'KI‚j‚‚nÀ€d>=x‚†‚}À¡C'La`€\€Ð?=x‚¨‚ŸÀ¡C€‚¬À€?a`€\€ÐI‚¼!‚Ë‚ÀÀ€L>=x‚ã‚ÚÀ¡€ž‚êÀ€L]€`€a]€š`€\-?Mƒ5[ƒ€¥ƒœ'€½ƒ*À¡ÀÀ À]+Nƒƒ M`šƒ€¨`šÀ}Nƒ=ƒQN]`€’ƒSŸ`€’=xƒÃxƒœxƒ}vƒoƒgÀ‚¬O]]€`€†¡P`€vƒŒjƒ‡`¢Q`£¥a]¦]€`€†`€]`€§P`€jƒ¬`Œa]¦`€`€]`€§4ƒÊƒÊ„IƒË`€\>ƒÑ„HNƒÝƒá4`€’ƒã{ƒùÀƒžI„!„ „Àƒ´>„„D=x„1„À‚ÏR„:Àƒ´`€’^]€—`€’\©?^a`€\€„`€‡€a\€…`]`€M„b5[„b€¥v„|„hÀ‚ÏS]€‘`€’«ÀÀ À]+N„U„`b`€’„|€¨`€’À}N„›5]€Ž`€[L>M„¼5[„¼€¥„„ÊÀ„œ))ƒ„âÀ€xRN]€°`€€Ø`€À…h„… À€‹ÀÀ À]+=„±À„¾„€¨]€Ž`€[À}>M…(5[…(€¥x…=v…6….À‚¬T]]€`€†¬U[^[]€‘[­ÀÀ À]+=À}M…_5[…_€¥v…m…eÀ‚¬V]€‘`€†®ÀÀ À]+N…R…]W`€†…m€¨`€†À}I…y!…ˆ…}À†4“a`€…`€‡€Œ>=0…”$…Å'X…ºÀ†4?=…ÍÀ€ò…ÔÀ„¾B=€Ñ…À€½‡À€ò†À€æJ…Þ[F[G`€˜>=€Ò…À€½À†ÆÀ†Î†À€æ=À€ÓÀ]=À €ÔÀ]=‡À]a[=ŽÀ€æ)J…À€½‡S€!€$‡S s€Ú€åuŒ—ŒÇ€†Y`€jŒ­`€vŒÏŒû€†Z`€jŒã`€w/€†[`€j`€x7]€†\`€jD`€z€„uA]•„u¨^a]€‘[´_`€íÍh`€íj`€ï]€‘[[> N]€“[Ý€•[N`€‡*N]€—[Na[[Na`€…`€˜[N`€†“N[O^[[`€˜[•„u[[[[K>A>Nåï``€‡)Oú‚ a^a]€‘[b`€í]€‘[‚ƒ‚‚)^a]€‘[‚7b`€íj`€ï]€‘[>‚Bƒ‚I‚H‚U‚LÀ‰C>‚^‚vJ‚f}‚n‚mÀ‰1a]€‘[?J‚}x‚ˆ}‚…‚„À‰1a]€‘[h‚À‰C`€í€Š4‚¥‚¥ƒ}b>‚¨ƒ|=‚°Àˆï*N‚Ï‚Óc`€#‚èv‚Þ‚ÕÀ‰C`€íd`€†°“a`€…`€‡€Œ$ƒ"vƒ‚üÀ‰C`€íe`€†±'f$ƒ<vƒ0ƒ'À‰C`€íd`€†°'g`€=0ƒDƒJg$ƒu'hƒqÀ‰ó^`€í€Ša]€—[]€‘[=ƒ‡ÀˆiƒŽÀ‰4ƒ›ƒ›„_]€‘[[>N]€“[ƒ¤€•[N`€‡*N]€—[Na[[Na`€…`€˜[N`€†“N[N[Ni[Nj[Nk[Oƒ›^[[`€˜[ƒ›„_[[[[K>A>Cƒªƒ±Àˆï>K>MƒÙ5[ƒÙ€¥}ƒà€ƒßÀˆa]€‘[À‹À‹À‹g+=ƒÒÀ‹À‹‡Bƒì`€…ƒó€¨`€…>I„„Àˆï>M„5[„€¥„!²[„9ÀˆÀ‹À‹À‹g+=À‹‡?=€ÑÀŠâÀ‹ÀŠùJ„_[F[G`€˜>=€ÒÀŠâÀŒ¸ÀŒÀ ÀŠù=À‹€ÓÀ‹g=À‹€ÔÀ‹g=ƒ›À‹ga[=ÀŠù)JÀŠâb‚„kÀˆ&^a]€‘[b`€í]€‘[B=€ÑƒÀˆF…Àˆi„Àˆ]J„u[F[G`€˜>=€ÒƒÀˆFÀ›À£„Àˆ]=ŽÀˆv€ÓÀˆ« =Àˆ‚€ÔÀˆ« =•Àˆ« a[=ŒÀˆ])JƒÀˆF{……†°Ai…,†°…4j`€`€’>…9N…€…‡k`€†x…€…‰ÀŽA€ûj…•`€^`€¼`€†`€†bI…¯…º…³ÀŽZx…½”-a`€†a`€…`€‡€ŒJ…Á+?N…Ö…ßl`€†x…è…áÀŽZ8v†j…ê`€)`€†€¯a`€Š`€†€ÁN††m`€†x†€†ÀŽA€û†%”'n‚†8ÀŽÐ^`€¼`€†`€†bK>†I†„J†O†Zx†d€†`ÀŽA€ý‚†nÀŽÐƒ†xÀ^`€†`€†`€d††`€¬>†™†®J†Ÿ+|†ë†÷ˆvAo‡ˆv]€‘`€†`€†>N]€“`€†‡ €•`€†N`€‡*N]€—`€†Na[[Na`€…`€˜[N`€†“N[N[Ni[Nj[Nk[O†÷^[[`€˜[‡ˆv[[[[K>A>N‡}`³K>M‡:5[‡:€¥‡Mµ‡b¸“ƒÀ#„À/Àx +=‡1À¼‡M€¨`³À˜ ‡x`€…‡€¨`€…>M‡Ý5[‡Ý€¥‡ðµˆ¹“p)ƒÀ#„À/Àx +=‡ÌÀ¼‡ð€¨`³À˜ L>=Šˆ6ÀvˆDˆ=À¼v`€†»B>Mˆ\5[ˆ\€¥xˆiˆbÀ¼€‚a]€‘`³¼ƒÀ#„À/Àx +=ˆi€¨`³À˜ =€Ñ€Àê‚ÀÀJˆv[F[G`€˜>=€Ò€ÀêÀ’JÀ’RÀ=‹À#€ÓÀx =ŒÀ/€ÔÀx =‡Àx a[=‰À)J€Àê}ˆ¾ˆÓŠ­AqˆçŠ­ˆì€»`€’‰=]€Ž`€†`€†]€Ž`€[>‰ Š­N‰‰€ë]€Ž`€[2‰/`€[N‰;‰@€À]€`€†‰G€Ï`€†“=x‰T‰MÀ’ü<4‰\‰\‰ž‰]`€†‰cr`€†\>‰m‰=x‰xƒ‰sÀ“AC„‰|À“€a`€†\€Ð=x‰Œƒ‰‡À“AC…‰À“‹a`€†\€Ðaa`€†`€†\\€Ì=x‰§‚‰£À“$9'€Ñ$‰À€‰¶À’ða`€[\€Æ=x‰È‚‰ÄÀ“$9'€’2‰Õ`€`€…'D's't)'€$ŠO'uŠ(½xŠB€Š8À’ð€Üa`€¾'4$Šh€Š^À’ð'v'wa`€[\€Æ=xЂЉÀ“$9'€ÀƒŠ˜À“Aa`€[\€ÆJŠ ‚ЧÀ“$~ŠÛŠß‹8AxŠä‹8ŠíW[ŠøX[`€†J‹‹€‹ €€‹€€“v‹!€‹À”ï`€†Àv‹.‹,À”÷`€†À€€‹;‹?‹ÞAys‹G‹Þ‹Lz`€†‹V{`€†`€†>‹]‹Þ=ˆ‹aÀ•ix‹s7ßÿÿÿ|x‹{€‹vÀ•i8‹}À•ua`€Š`€†€Áa`€†`€†Á=ˆ‹‡À•ix‹™7ßÿÿÿ|x‹¡€‹œÀ•i8x‹¸x‹°7Àÿÿ|€‹²À•ia`€†`€†Á}7 a`€†`€†Âa`€Š`€†€Áa`€†`€†ÁJ‹Ãx‹Ï€‹ÊÀ•i~x‹×€‹ÒÀ•i€´7a`€†`€†Aa`€†`€†Ã€‹á‹åŒŽAs‹ìŒŽ‹ñz`€†`€†>‹÷ŒŽ=ˆ‹ûÀ–ÂxŒ 7ßÿÿÿ|xŒ€ŒÀ–Â8xŒ,xŒ$7Ãÿÿÿ|€Œ&À–Âa`€†`€†Á}–a`€†`€†Âa`€Š`€†€Áa`€†`€†Á=ˆŒ6À–ÂxŒB€Œ=À–Â~xŒJ€ŒEÀ–€´7 a`€†`€†Aa`€†`€†ÃJŒTxŒf7ßÿÿÿ|xŒn€ŒiÀ–Â8xŒ…xŒ}7¿ÿ|€ŒÀ–Âa`€†`€†Á}7a`€†`€†Âa`€Š`€†€Áa`€†`€†Á€‚€“-A€Ÿ“-®+]€`€]€]€`€†>µ“-N¿Ì€õ]€]€`€†Ù€Ï]€`€†“Ißé€ãÀ˜DJòùÀ˜l?N]€]€`€†']€`€†!r`€†“v+%À˜D]€`€)`€†?N?G‚`€‡*NVX[`€†“C_xh„fÀ™KvpjÀ˜D]€`€)`€†?a`€Š`€‡€Ù>x“I~x‹x‡‚À˜D]€`€#„ˆÀ™a`€†`€€»:j”`€^`€¼`€†`€‡˜J¡‚¨À˜°?I·xÄxÀ»À˜D]€`€#„ÁÀ™a`€†`€€»:jÍ`€^`€¼`€†`€‡˜=‹áÀ™)?Iöx‘xÿúÀ˜D]€`€#„‘À™a`€†`€€»:j‘ `€^`€¼`€†`€‡˜=x‘,‘À˜lC‘0r`€†x‘3„‘1À™8”a`€Š`€†€Áx‘:„‘8À™8”a`€Š`€†€Áa]€`€†\€Ð?I‘Fx‘Sx‘O‘JÀ˜D]€`€#„‘PÀ™a`€†`€€»:j‘\`€^`€¼`€†`€‡˜>‘r’÷N‘€‘†€ü`€†„‘ˆÀ™=Œ‘“À™x‘‘„‘“À™8”a`€Š`€†€ÁAC‘œx‘¥„‘£À™Kv‘­‘§À˜D]€`€)`€†?a`€Š`€‡€Ù>‘µ’ñI‘¿x‘Ìx‘È‘ÃÀ˜D]€`€#„‘ÉÀ™a`€†`€€»:j‘Õ`€^`€¼`€†`€‡˜J‘â‚‘éÀ˜°?I‘ûx’x’‘ÿÀ˜D]€`€#„’À™a`€†`€€»:j’`€^`€¼`€†`€‡˜>’'’\=‹’3À™)B’M?I’gx’tx’p’kÀ˜D]€`€#„’qÀ™a`€†`€€»:j’}`€^`€¼`€†`€‡˜>’‘’Ü=x’ª’À˜lC’®r`€†x’µ…’¯À›i8”a`€Š`€†€Áx’¼„’ºÀ™8”a`€Š`€†€Áa]€`€†\€ÐB’Í?=Œ’èÀ™x’æ„’èÀ™8”a`€Š`€†€Á?=Œ’ÿÀ™x’ý„’ÿÀ™8”a`€Š`€†€ÁJ“ #ƒ“À™“€Ï]€`€†““À˜l]€]€`€†ž#‡‚‡íŽ&º’Õ”Ô•L–¥˜(ž#Wfile:///github/home/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/coverage.dart„// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. export 'src/chrome.dart'; export 'src/collect.dart'; export 'src/formatter.dart'; export 'src/hitmap.dart'; export 'src/resolver.dart'; export 'src/run_and_collect.dart'; NN<#package:coverage/coverage.dartYfile:///github/home/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/src/chrome.dart•`// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'package:coverage/src/util.dart'; import 'package:source_maps/parser.dart'; /// Returns a Dart based hit-map containing coverage report for the provided /// Chrome [preciseCoverage]. /// /// [sourceProvider] returns the source content for the Chrome scriptId, or null /// if not available. /// /// [sourceMapProvider] returns the associated source map content for the Chrome /// scriptId, or null if not available. /// /// [sourceUriProvider] returns the uri for the provided sourceUrl and /// associated scriptId, or null if not available. /// /// Chrome coverage information for which the corresponding source map or source /// content is null will be ignored. Future> parseChromeCoverage( List> preciseCoverage, Future Function(String scriptId) sourceProvider, Future Function(String scriptId) sourceMapProvider, Future Function(String sourceUrl, String scriptId) sourceUriProvider, ) async { final coverageReport = >{}; for (var entry in preciseCoverage) { final scriptId = entry['scriptId'] as String; final mapResponse = await sourceMapProvider(scriptId); if (mapResponse == null) continue; SingleMapping mapping; try { mapping = parse(mapResponse) as SingleMapping; } on FormatException { continue; } on ArgumentError { continue; } final compiledSource = await sourceProvider(scriptId); if (compiledSource == null) continue; final coverageInfo = _coverageInfoFor(entry); final offsetCoverage = _offsetCoverage(coverageInfo, compiledSource.length); final coveredPositions = _coveredPositions(compiledSource, offsetCoverage); for (var lineEntry in mapping.lines) { for (var columnEntry in lineEntry.entries) { final sourceUrlId = columnEntry.sourceUrlId; if (sourceUrlId == null) continue; final sourceUrl = mapping.urls[sourceUrlId]; // Ignore coverage information for the SDK. if (sourceUrl.startsWith('org-dartlang-sdk:')) continue; final uri = await sourceUriProvider(sourceUrl, scriptId); if (uri == null) continue; final coverage = coverageReport.putIfAbsent(uri, () => {}); final sourceLine = columnEntry.sourceLine!; final current = coverage[sourceLine + 1] ?? false; coverage[sourceLine + 1] = current || coveredPositions.contains( _Position(lineEntry.line + 1, columnEntry.column + 1)); } } } final coverageHitMaps = >{}; coverageReport.forEach((uri, coverage) { final hitMap = {}; for (var line in coverage.keys.toList()..sort()) { hitMap[line] = coverage[line]! ? 1 : 0; } coverageHitMaps[uri] = hitMap; }); final allCoverage = >[]; coverageHitMaps.forEach((uri, hitMap) { allCoverage.add(toScriptCoverageJson(uri, hitMap)); }); return {'type': 'CodeCoverage', 'coverage': allCoverage}; } /// Returns all covered positions in a provided source. Set<_Position> _coveredPositions( String compiledSource, List offsetCoverage) { final positions = <_Position>{}; // Line is 1 based. var line = 1; // Column is 1 based. var column = 0; for (var offset = 0; offset < compiledSource.length; offset++) { if (compiledSource[offset] == '\n') { line++; column = 0; } else { column++; } if (offsetCoverage[offset]) positions.add(_Position(line, column)); } return positions; } /// Returns coverage information for a Chrome entry. List<_CoverageInfo> _coverageInfoFor(Map entry) { final result = <_CoverageInfo>[]; for (var functions in (entry['functions'] as List).cast>()) { for (var range in (functions['ranges'] as List).cast>()) { result.add(_CoverageInfo( range['startOffset'] as int, range['endOffset'] as int, (range['count'] as int) > 0, )); } } return result; } /// Returns the coverage information for each offset. List _offsetCoverage(List<_CoverageInfo> coverageInfo, int sourceLength) { final offsetCoverage = List.filled(sourceLength, false); // Sort coverage information by their size. // Coverage information takes granularity as precedence. coverageInfo.sort((a, b) => (b.endOffset - b.startOffset).compareTo(a.endOffset - a.startOffset)); for (var range in coverageInfo) { for (var i = range.startOffset; i < range.endOffset; i++) { offsetCoverage[i] = range.isCovered; } } return offsetCoverage; } class _CoverageInfo { _CoverageInfo(this.startOffset, this.endOffset, this.isCovered); /// 0 based byte offset. final int startOffset; /// 0 based byte offset. final int endOffset; final bool isCovered; } /// A covered position in a source file where [line] and [column] are 1 based. class _Position { _Position(this.line, this.column); final int line; final int column; @override int get hashCode => hash2(line, column); @override bool operator ==(dynamic o) => o is _Position && o.line == line && o.column == column; } €«NN<)*MQQ(G3Q%2. package:coverage/src/chrome.dartZfile:///github/home/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/src/collect.dart¢]// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:async'; import 'dart:io'; import 'package:vm_service/vm_service.dart'; import 'util.dart'; const _retryInterval = Duration(milliseconds: 200); /// Collects coverage for all isolates in the running VM. /// /// Collects a hit-map containing merged coverage for all isolates in the Dart /// VM associated with the specified [serviceUri]. Returns a map suitable for /// input to the coverage formatters that ship with this package. /// /// [serviceUri] must specify the http/https URI of the service port of a /// running Dart VM and must not be null. /// /// If [resume] is true, all isolates will be resumed once coverage collection /// is complete. /// /// If [waitPaused] is true, collection will not begin until all isolates are /// in the paused state. /// /// If [includeDart] is true, code coverage for core `dart:*` libraries will be /// collected. /// /// If [scopedOutput] is non-empty, coverage will be restricted so that only /// scripts that start with any of the provided paths are considered. /// /// if [isolateIds] is set, the coverage gathering will be restricted to only /// those VM isolates. Future> collect(Uri serviceUri, bool resume, bool waitPaused, bool includeDart, Set? scopedOutput, {Set? isolateIds, Duration? timeout}) async { scopedOutput ??= {}; // Create websocket URI. Handle any trailing slashes. final pathSegments = serviceUri.pathSegments.where((c) => c.isNotEmpty).toList()..add('ws'); final uri = serviceUri.replace(scheme: 'ws', pathSegments: pathSegments); late VmService service; await retry(() async { try { final options = const CompressionOptions(enabled: false); final socket = await WebSocket.connect('$uri', compression: options); final controller = StreamController(); socket.listen((data) => controller.add(data as String), onDone: () { controller.close(); service.dispose(); }); service = VmService( controller.stream, (String message) => socket.add(message), log: StdoutLog(), disposeHandler: () => socket.close()); await service.getVM().timeout(_retryInterval); } on TimeoutException { // The signature changed in vm_service version 6.0.0. // ignore: await_only_futures await service.dispose(); rethrow; } }, _retryInterval, timeout: timeout); try { if (waitPaused) { await _waitIsolatesPaused(service, timeout: timeout); } return await _getAllCoverage( service, includeDart, scopedOutput, isolateIds); } finally { if (resume) { await _resumeIsolates(service); } // The signature changed in vm_service version 6.0.0. // ignore: await_only_futures await service.dispose(); } } Future> _getAllCoverage( VmService service, bool includeDart, Set? scopedOutput, Set? isolateIds) async { scopedOutput ??= {}; final vm = await service.getVM(); final allCoverage = >[]; for (var isolateRef in vm.isolates!) { if (isolateIds != null && !isolateIds.contains(isolateRef.id)) continue; if (scopedOutput.isNotEmpty) { final scripts = await service.getScripts(isolateRef.id!); for (var script in scripts.scripts!) { final uri = Uri.parse(script.uri!); if (uri.scheme != 'package') continue; final scope = uri.path.split('/').first; // Skip scripts which should not be included in the report. if (!scopedOutput.contains(scope)) continue; final scriptReport = await service.getSourceReport( isolateRef.id!, [SourceReportKind.kCoverage], forceCompile: true, scriptId: script.id); final coverage = await _getCoverageJson( service, isolateRef, scriptReport, includeDart); allCoverage.addAll(coverage); } } else { final isolateReport = await service.getSourceReport( isolateRef.id!, [SourceReportKind.kCoverage], forceCompile: true, ); final coverage = await _getCoverageJson( service, isolateRef, isolateReport, includeDart); allCoverage.addAll(coverage); } } return {'type': 'CodeCoverage', 'coverage': allCoverage}; } Future _resumeIsolates(VmService service) async { final vm = await service.getVM(); final futures = []; for (var isolateRef in vm.isolates!) { // Guard against sync as well as async errors: sync - when we are writing // message to the socket, the socket might be closed; async - when we are // waiting for the response, the socket again closes. futures.add(Future.sync(() async { final isolate = await service.getIsolate(isolateRef.id!); if (isolate.pauseEvent!.kind != EventKind.kResume) { await service.resume(isolateRef.id!); } })); } try { await Future.wait(futures); } catch (_) { // Ignore resume isolate failures } } Future _waitIsolatesPaused(VmService service, {Duration? timeout}) async { final pauseEvents = { EventKind.kPauseStart, EventKind.kPauseException, EventKind.kPauseExit, EventKind.kPauseInterrupted, EventKind.kPauseBreakpoint }; Future allPaused() async { final vm = await service.getVM(); if (vm.isolates!.isEmpty) throw 'No isolates.'; for (var isolateRef in vm.isolates!) { final isolate = await service.getIsolate(isolateRef.id!); if (!pauseEvents.contains(isolate.pauseEvent!.kind)) { throw 'Unpaused isolates remaining.'; } } } return retry(allPaused, _retryInterval, timeout: timeout); } /// Returns the line number to which the specified token position maps. /// /// Performs a binary search within the script's token position table to locate /// the line in question. int? _getLineFromTokenPos(Script script, int tokenPos) { // TODO(cbracken): investigate whether caching this lookup results in // significant performance gains. var min = 0; var max = script.tokenPosTable!.length; while (min < max) { final mid = min + ((max - min) >> 1); final row = script.tokenPosTable![mid]; if (row[1] > tokenPos) { max = mid; } else { for (var i = 1; i < row.length; i += 2) { if (row[i] == tokenPos) return row.first; } min = mid + 1; } } return null; } /// Returns a JSON coverage list backward-compatible with pre-1.16.0 SDKs. Future>> _getCoverageJson(VmService service, IsolateRef isolateRef, SourceReport report, bool includeDart) async { // script uri -> { line -> hit count } final hitMaps = >{}; final scripts = {}; for (var range in report.ranges!) { final scriptRef = report.scripts![range.scriptIndex!]; final scriptUri = Uri.parse(report.scripts![range.scriptIndex!].uri!); // Not returned in scripts section of source report. if (scriptUri.scheme == 'evaluate') continue; // Skip scripts from dart:. if (!includeDart && scriptUri.scheme == 'dart') continue; if (!scripts.containsKey(scriptRef)) { scripts[scriptRef] = await service.getObject(isolateRef.id!, scriptRef.id!) as Script; } final script = scripts[scriptRef]; if (script == null) continue; // Look up the hit map for this script (shared across isolates). final hitMap = hitMaps.putIfAbsent(scriptUri, () => {}); // Collect hits and misses. final coverage = range.coverage; if (coverage == null) continue; for (final tokenPos in coverage.hits!) { final line = _getLineFromTokenPos(script, tokenPos); if (line == null) { print('tokenPos $tokenPos has no line mapping for script $scriptUri'); continue; } hitMap[line] = hitMap.containsKey(line) ? hitMap[line]! + 1 : 1; } for (final tokenPos in coverage.misses!) { final line = _getLineFromTokenPos(script, tokenPos); if (line == null) { print('tokenPos $tokenPos has no line mapping for script $scriptUri'); continue; } hitMap.putIfAbsent(line, () => 0); } } // Output JSON final coverage = >[]; hitMaps.forEach((uri, hitMap) { coverage.add(toScriptCoverageJson(uri, hitMap)); }); return coverage; } class StdoutLog extends Log { @override void warning(String message) => print(message); @override void severe(String message) => print(message); } NN<-4:ONBJ*ONPMFNBB:8NL @L5K FC5<$(<"9&:".%$0)M#@-,/1D5+L'"EG %$-;OG/;O)-"5 2 1!package:coverage/src/collect.dartÅ€‰ÇÉ\file:///github/home/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/src/formatter.dartÐ// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'package:path/path.dart' as p; import 'resolver.dart'; abstract class Formatter { /// Returns the formatted coverage data. Future format(Map> hitmap); } /// Converts the given hitmap to lcov format and appends the result to /// env.output. /// /// Returns a [Future] that completes as soon as all map entries have been /// emitted. class LcovFormatter implements Formatter { /// Creates a LCOV formatter. /// /// If [reportOn] is provided, coverage report output is limited to files /// prefixed with one of the paths included. If [basePath] is provided, paths /// are reported relative to that path. LcovFormatter(this.resolver, {this.reportOn, this.basePath}); final Resolver resolver; final String? basePath; final List? reportOn; @override Future format(Map> hitmap) async { final pathFilter = _getPathFilter(reportOn); final buf = StringBuffer(); for (var key in hitmap.keys) { final v = hitmap[key]!; var source = resolver.resolve(key); if (source == null) { continue; } if (!pathFilter(source)) { continue; } if (basePath != null) { source = p.relative(source, from: basePath); } buf.write('SF:$source\n'); final lines = v.keys.toList()..sort(); for (var k in lines) { buf.write('DA:$k,${v[k]}\n'); } buf.write('LF:${lines.length}\n'); buf.write('LH:${lines.where((k) => v[k]! > 0).length}\n'); buf.write('end_of_record\n'); } return buf.toString(); } } /// Converts the given hitmap to a pretty-print format and appends the result /// to env.output. /// /// Returns a [Future] that completes as soon as all map entries have been /// emitted. class PrettyPrintFormatter implements Formatter { /// Creates a pretty-print formatter. /// /// If [reportOn] is provided, coverage report output is limited to files /// prefixed with one of the paths included. PrettyPrintFormatter(this.resolver, this.loader, {this.reportOn}); final Resolver resolver; final Loader loader; final List? reportOn; @override Future format(Map hitmap) async { final pathFilter = _getPathFilter(reportOn); final buf = StringBuffer(); for (var key in hitmap.keys) { final v = hitmap[key] as Map; final source = resolver.resolve(key); if (source == null) { continue; } if (!pathFilter(source)) { continue; } final lines = await loader.load(source); if (lines == null) { continue; } buf.writeln(source); for (var line = 1; line <= lines.length; line++) { var prefix = _prefix; if (v.containsKey(line)) { prefix = v[line].toString().padLeft(_prefix.length); } buf.writeln('$prefix|${lines[line - 1]}'); } } return buf.toString(); } } const _prefix = ' '; typedef _PathFilter = bool Function(String path); _PathFilter _getPathFilter(List? reportOn) { if (reportOn == null) return (String path) => true; final absolutePaths = reportOn.map(p.absolute).toList(); return (String path) => absolutePaths.any((item) => path.startsWith(item)); } |NN<&+<GK + LP*@  C1 #*!5!-&)A$NK 2(L/E  =1 #.,!/9#? 3256;N#package:coverage/src/formatter.dartYfile:///github/home/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/src/hitmap.dart’Ì// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:convert' show json; import 'dart:io'; import 'package:coverage/src/resolver.dart'; import 'package:coverage/src/util.dart'; /// Creates a single hitmap from a raw json object. Throws away all entries that /// are not resolvable. /// /// `jsonResult` is expected to be a List>. Future>> createHitmap( List> jsonResult, { bool checkIgnoredLines = false, String? packagesPath, }) async { final resolver = Resolver(packagesPath: packagesPath); final loader = Loader(); // Map of source file to map of line to hit count for that line. final globalHitMap = >{}; void addToMap(Map map, int line, int count) { final oldCount = map.putIfAbsent(line, () => 0); map[line] = count + oldCount; } for (var e in jsonResult) { final source = e['source'] as String?; if (source == null) { // Couldn't resolve import, so skip this entry. continue; } var ignoredLinesList = >[]; if (checkIgnoredLines) { final path = resolver.resolve(source); if (path != null) { final lines = await loader.load(path); ignoredLinesList = getIgnoredLines(lines!); // Ignore the whole file. if (ignoredLinesList.length == 1 && ignoredLinesList[0][0] == 0 && ignoredLinesList[0][1] == lines.length) { continue; } } } // Move to the first ignore range. final ignoredLines = ignoredLinesList.iterator; var hasCurrent = ignoredLines.moveNext(); bool _shouldIgnoreLine(Iterator> ignoredRanges, int line) { if (!hasCurrent || ignoredRanges.current.isEmpty) { return false; } if (line < ignoredRanges.current[0]) return false; while (hasCurrent && ignoredRanges.current.isNotEmpty && ignoredRanges.current[1] < line) { hasCurrent = ignoredRanges.moveNext(); } if (hasCurrent && ignoredRanges.current.isNotEmpty && ignoredRanges.current[0] <= line && line <= ignoredRanges.current[1]) { return true; } return false; } final sourceHitMap = globalHitMap.putIfAbsent(source, () => {}); final hits = e['hits'] as List; // hits is a flat array of the following format: // [ , ,...] // line: number. // linerange: '-'. for (var i = 0; i < hits.length; i += 2) { final k = hits[i]; if (k is int) { // Single line. if (_shouldIgnoreLine(ignoredLines, k)) continue; addToMap(sourceHitMap, k, hits[i + 1] as int); } else if (k is String) { // Linerange. We expand line ranges to actual lines at this point. final splitPos = k.indexOf('-'); final start = int.parse(k.substring(0, splitPos)); final end = int.parse(k.substring(splitPos + 1)); for (var j = start; j <= end; j++) { if (_shouldIgnoreLine(ignoredLines, j)) continue; addToMap(sourceHitMap, j, hits[i + 1] as int); } } else { throw StateError('Expected value of type int or String'); } } } return globalHitMap; } /// Merges [newMap] into [result]. void mergeHitmaps( Map> newMap, Map> result) { newMap.forEach((String file, Map v) { final fileResult = result[file]; if (fileResult != null) { v.forEach((int line, int cnt) { final lineFileResult = fileResult[line]; if (lineFileResult == null) { fileResult[line] = cnt; } else { fileResult[line] = lineFileResult + cnt; } }); } else { result[file] = v; } }); } /// Generates a merged hitmap from a set of coverage JSON files. Future>> parseCoverage( Iterable files, int _, { bool checkIgnoredLines = false, String? packagesPath, }) async { final globalHitmap = >{}; for (var file in files) { final contents = file.readAsStringSync(); final jsonMap = json.decode(contents) as Map; if (jsonMap.containsKey('coverage')) { final jsonResult = jsonMap['coverage'] as List; mergeHitmaps( await createHitmap( jsonResult.cast>(), checkIgnoredLines: checkIgnoredLines, packagesPath: packagesPath, ), globalHitmap, ); } } return globalHitmap; } €ŸNN<!-)QA1+" 9C2:5"+6*-/4",+6 '4.J:9.-/...O$5+#/:7 K);:-<9 B#L2%&1&"3 A2 " 2.C+630&   package:coverage/src/hitmap.dart[file:///github/home/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/src/resolver.dart™*// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:convert'; import 'dart:io'; import 'package:package_config/package_config.dart'; import 'package:path/path.dart' as p; /// [Resolver] resolves imports with respect to a given environment. class Resolver { Resolver({String? packagesPath, this.sdkRoot}) : packagesPath = packagesPath, _packages = packagesPath != null ? _parsePackages(packagesPath) : null; final String? packagesPath; final String? sdkRoot; final List failed = []; final Map? _packages; /// Returns the absolute path wrt. to the given environment or null, if the /// import could not be resolved. String? resolve(String scriptUri) { final uri = Uri.parse(scriptUri); if (uri.scheme == 'dart') { final sdkRoot = this.sdkRoot; if (sdkRoot == null) { // No sdk-root given, do not resolve dart: URIs. return null; } String filePath; if (uri.pathSegments.length > 1) { var path = uri.pathSegments[0]; // Drop patch files, since we don't have their source in the compiled // SDK. if (path.endsWith('-patch')) { failed.add('$uri'); return null; } // Canonicalize path. For instance: _collection-dev => _collection_dev. path = path.replaceAll('-', '_'); final pathSegments = [ sdkRoot, path, ...uri.pathSegments.sublist(1), ]; filePath = p.joinAll(pathSegments); } else { // Resolve 'dart:something' to be something/something.dart in the SDK. final lib = uri.path; filePath = p.join(sdkRoot, lib, '$lib.dart'); } return resolveSymbolicLinks(filePath); } if (uri.scheme == 'package') { final _packages = this._packages; if (_packages == null) { return null; } final packageName = uri.pathSegments[0]; final packageUri = _packages[packageName]; if (packageUri == null) { failed.add('$uri'); return null; } final packagePath = p.fromUri(packageUri); final pathInPackage = p.joinAll(uri.pathSegments.sublist(1)); return resolveSymbolicLinks(p.join(packagePath, pathInPackage)); } if (uri.scheme == 'file') { return resolveSymbolicLinks(p.fromUri(uri)); } // We cannot deal with anything else. failed.add('$uri'); return null; } /// Returns a canonicalized path, or `null` if the path cannot be resolved. String? resolveSymbolicLinks(String path) { final normalizedPath = p.normalize(path); final type = FileSystemEntity.typeSync(normalizedPath, followLinks: true); if (type == FileSystemEntityType.notFound) return null; return File(normalizedPath).resolveSymbolicLinksSync(); } static Map _parsePackages(String packagesPath) { final content = File(packagesPath).readAsStringSync(); try { final parsed = PackageConfig.parseString(content, Uri.base.resolve(packagesPath)); return { for (var package in parsed.packages) package.name: package.packageUriRoot }; } on FormatException catch (_) { // It was probably an old style .packages file final lines = LineSplitter.split(content); final packageMap = {}; for (var line in lines) { if (line.startsWith('#')) continue; final firstColon = line.indexOf(':'); if (firstColon == -1) { throw FormatException( 'Unexpected package config format, expected an old style ' '.packages file or new style package_config.json file.', content); } packageMap[line.substring(0, firstColon)] = Uri.parse(line.substring(firstColon + 1, line.length)); } return packageMap; } } } /// Bazel URI resolver. class BazelResolver extends Resolver { /// Creates a Bazel resolver with the specified workspace path, if any. BazelResolver({this.workspacePath = ''}); final String workspacePath; /// Returns the absolute path wrt. to the given environment or null, if the /// import could not be resolved. @override String? resolve(String scriptUri) { final uri = Uri.parse(scriptUri); if (uri.scheme == 'dart') { // Ignore the SDK return null; } if (uri.scheme == 'package') { // TODO(cbracken) belongs in a Bazel package return _resolveBazelPackage(uri.pathSegments); } if (uri.scheme == 'file') { final runfilesPathSegment = '.runfiles/$workspacePath'.replaceAll(RegExp(r'/*$'), '/'); final runfilesPos = uri.path.indexOf(runfilesPathSegment); if (runfilesPos >= 0) { final pathStart = runfilesPos + runfilesPathSegment.length; return uri.path.substring(pathStart); } return null; } if (uri.scheme == 'https' || uri.scheme == 'http') { return _extractHttpPath(uri); } // We cannot deal with anything else. failed.add('$uri'); return null; } String _extractHttpPath(Uri uri) { final packagesPos = uri.pathSegments.indexOf('packages'); if (packagesPos >= 0) { final workspacePath = uri.pathSegments.sublist(packagesPos + 1); return _resolveBazelPackage(workspacePath); } return uri.pathSegments.join('/'); } String _resolveBazelPackage(List pathSegments) { // TODO(cbracken) belongs in a Bazel package final packageName = pathSegments[0]; final pathInPackage = pathSegments.sublist(1).join('/'); final packagePath = packageName.contains('.') ? packageName.replaceAll('.', '/') : 'third_party/dart/$packageName'; return '$packagePath/lib/$pathInPackage'; } } /// Loads the lines of imported resources. class Loader { final List failed = []; /// Loads an imported resource and returns a [Future] with a [List] of lines. /// Returns `null` if the resource could not be loaded. Future?> load(String path) async { try { // Ensure `readAsLines` runs within the try block so errors are caught. return await File(path).readAsLines(); } catch (_) { failed.add(path); return null; } } } €ÁNN<5&E1%P"%N$&& $9)(N' P** ,O6-#(/1 1DG 3*N..O<<@; N-/ %51* ,. !IG 4D'J,N$ && #35 "FAD.9$*%>G2';1)=2++.+"P:2 N-"package:coverage/src/resolver.dartbfile:///github/home/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/src/run_and_collect.dart…ß// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:async'; import 'dart:convert' show utf8, LineSplitter; import 'dart:io'; import 'collect.dart'; import 'util.dart'; Future> runAndCollect(String scriptPath, {List? scriptArgs, bool checked = false, bool includeDart = false, Duration? timeout}) async { final dartArgs = [ '--enable-vm-service', '--pause_isolates_on_exit', ]; if (checked) { dartArgs.add('--checked'); } dartArgs.add(scriptPath); if (scriptArgs != null) { dartArgs.addAll(scriptArgs); } final process = await Process.start('dart', dartArgs); final serviceUriCompleter = Completer(); process.stdout .transform(utf8.decoder) .transform(const LineSplitter()) .listen((line) { final uri = extractObservatoryUri(line); if (uri != null) { serviceUriCompleter.complete(uri); } }); final serviceUri = await serviceUriCompleter.future; Map coverage; try { coverage = await collect(serviceUri, true, true, includeDart, {}, timeout: timeout); } finally { await process.stderr.drain(); } final exitStatus = await process.exitCode; if (exitStatus != 0) { throw 'Process exited with exit code $exitStatus'; } return coverage; } ;NN</>  !90'-)7!N"-7)package:coverage/src/run_and_collect.dartË΀‰Wfile:///github/home/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/src/util.dart“.// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:io'; // TODO(cbracken) make generic /// Retries the specified function with the specified interval and returns /// the result on successful completion. Future retry(Future Function() f, Duration interval, {Duration? timeout}) async { var keepGoing = true; Future _withTimeout(Future Function() f, {Duration? duration}) { if (duration == null) { return f(); } return f().timeout(duration, onTimeout: () { keepGoing = false; final msg = duration.inSeconds == 0 ? '${duration.inMilliseconds}ms' : '${duration.inSeconds}s'; throw StateError('Failed to complete within $msg'); }); } return _withTimeout(() async { while (keepGoing) { try { return await f(); } catch (_) { if (keepGoing) { await Future.delayed(interval); } } } }, duration: timeout); } /// Scrapes and returns the observatory URI from a string, or null if not found. /// /// Potentially useful as a means to extract it from log statements. Uri? extractObservatoryUri(String str) { const kObservatoryListening = 'Observatory listening on '; final msgPos = str.indexOf(kObservatoryListening); if (msgPos == -1) return null; final startPos = msgPos + kObservatoryListening.length; final endPos = str.indexOf(RegExp(r'(\s|$)'), startPos); try { return Uri.parse(str.substring(startPos, endPos)); } on FormatException { return null; } } /// Returns an open port by creating a temporary Socket Future getOpenPort() async { ServerSocket socket; try { socket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0); } catch (_) { // try again v/ V6 only. Slight possibility that V4 is disabled socket = await ServerSocket.bind(InternetAddress.loopbackIPv6, 0, v6Only: true); } try { return socket.port; } finally { await socket.close(); } } /// Returns a JSON hit map backward-compatible with pre-1.16.0 SDKs. Map toScriptCoverageJson(Uri scriptUri, Map hitMap) { final json = {}; final hits = []; hitMap.forEach((line, hitCount) { hits.add(line); hits.add(hitCount); }); json['source'] = '$scriptUri'; json['script'] = { 'type': '@Script', 'fixedId': true, 'id': 'libraries/1/scripts/${Uri.encodeComponent(scriptUri.toString())}', 'uri': '$scriptUri', '_kind': 'library', }; json['hits'] = hits; return json; } /// Generates a hash code for two objects. int hash2(dynamic a, dynamic b) => _finish(_combine(_combine(0, a.hashCode), b.hashCode)); int _combine(int hash, int value) { hash = 0x1fffffff & (hash + value); hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); return hash ^ (hash >> 6); } int _finish(int hash) { hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); hash = hash ^ (hash >> 11); return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); } const muliLineIgnoreStart = '// coverage:ignore-start'; const muliLineIgnoreEnd = '// coverage:ignore-end'; const singleLineIgnore = '// coverage:ignore-line'; const ignoreFile = '// coverage:ignore-file'; /// Return list containing inclusive range of lines to be ignored by coverage. /// If there is a error in balancing the statements it will ignore nothing, /// unless `coverage:ignore-file` is found. /// Return [0, lines.length] if the whole file is ignored. /// /// ``` /// 1. final str = ''; // coverage:ignore-line /// 2. final str = ''; /// 3. final str = ''; // coverage:ignore-start /// 4. final str = ''; /// 5. final str = ''; // coverage:ignore-end /// ``` /// /// Returns /// ``` /// [ /// [1,1], /// [3,5], /// ] /// ``` /// List> getIgnoredLines(List? lines) { final ignoredLines = >[]; if (lines == null) return ignoredLines; final allLines = [ [0, lines.length] ]; var isError = false; var i = 0; while (i < lines.length) { if (lines[i].contains(ignoreFile)) return allLines; if (lines[i].contains(muliLineIgnoreEnd)) isError = true; if (lines[i].contains(singleLineIgnore)) ignoredLines.add([i + 1, i + 1]); if (lines[i].contains(muliLineIgnoreStart)) { final start = i; ++i; while (i < lines.length) { if (lines[i].contains(ignoreFile)) return allLines; if (lines[i].contains(muliLineIgnoreStart)) { isError = true; break; } if (lines[i].contains(muliLineIgnoreEnd)) { ignoredLines.add([start + 1, i + 1]); break; } ++i; } } ++i; } return isError ? [] : ignoredLines; } €²NN<K)>!L1*+&:! 3 QE)=5!:;78"GD PEQ$$!N+#<$&<;<844.OL,;01/  7&* 8>O2 !<6 40  &package:coverage/src/util.dartž] h¶óÚÜé­ý˜¸Ï7À @€íÑ€øÓÔÕÖ׃„…†‡ˆ‰Š ØlÛÜ–xߢጋŒŽ +.147:=@CFQS[]ejmpsvá‘’ ‘HMU “    ”“’ ”•“•`’a•€‹€ €©€¯€¶\%’&]&_%”)–+—,€Å+“.–/€å+’1–2€æ+€Æ4’5€Ç4”7+€É9“:€Ê:€Ë:€Ì9’>€Ç9”@+€ÝB“C€ÊC€ÞC€ÌB’G€ÇB”I˜K’L€ìLL™PQ“R€ïRRR™VQ’X€ÒXX™[#Q”]P0_“`1_’b€Òb™d;d2_”gPAi“ji’l€ßi”nšp’qE›s“tYtZt[t\s’y]yiyoyqyxy›yy€œ€„ž€„Ÿ€„ €…”€ˆ€„¡€Š’€‹ €„¢€„£€„¤¥€¦€„§€¨€“”€”¥€–©€„ª€„«€„¬€š“€›€™’€€™“€Ÿ!€Ž’€¡#€’€£¥€¤­®€¦’€§¯€ƒ°€ƒ’€ª±€„²€„³€“€®)€„´€ƒµ€©“€²+€ƒ¶€±“€µ-€´“€·/€²1€’€º#€„·€’€½2€¡6€·7€‹8€µ€·€°’€Ä:€¡9€Ž“€Ç>€š’€É?€ºA€¡<€„¸€Í¹€Î€ºC€¤º€¤»€¤¼€¤½¾€Õ¿€Ö”€×€‹K€½#€½ €ÄC€ºP€‹T€„À€ß¹€àÁ€‹Y€‹Z€º9ÂÃÄ€çŀ蔀逄’€ëÆ€„Ç€îÈ€’“€ðl€®o€Ém€’’€ôq€çÉÊ€÷Ë€÷Ì€ù’€ú̀΀ü¹€ý€ü’€ÿC€ÿ€‚€ö’€ƒ€„πЀÑ’€ö” €ü“ €†€úC€ú€‚€çÒ€‰€‘’h€Ó€çÔ“€“€€›o€çÕ€€çÖ“€‘€ô±“ 4€ðr€ðu€½€•€›€—€Î&×€çØ(“)€€çÙ€˜€º€ž€‘¹.Ú€çÛ€¢€çÜ0“3€¤2“5€¥€çÝcÞ€›€¬€çß;“<€²€“>)€†’@€´€çà+“CQC€‘B“F€º€¡€¾€çဿ€çâF5K“M€ÀM€Ã〄äQ”RP’TåQ’V€Ô€›)V€ÜV€à€‹€á€…’\€Ü€½€ã€É€è€É€é怽€û@±€½€ý€„çe”f€åèaéh’j aêl’m뀽€½&쀺TíT=TîTï€åð€åñy’zò\ h¹}z"ó€ô’‚õ€ðö€ô€Ò€÷“‡&†“‰'‰(aDŒ’€•@-€¬”€„ø’¹“€‹7€º€û€É=€½:jB€åù𒛀ü€ú¹žš“ Oaûaü¢“¤Q€ýP’¨R“ªS TU V€í“¯d¯e.þ€åÿ³’´‚€å‚¶“·‚·‚³“ºv´€‚€ô‚€ô€Ü€…“¿@|@}@~€ø”Ä€í”ÆÆÈ‚Œ”Ê€‚̔̀„‚¯Ð‚€ø“Ò‚ Ò‚ Ò‚ Ò‚ Ò‚ T‚l“ÙæÚ‚Ú‚x“ÝÂÞ‚¤æà‚‚ !*37=EGH[jx€‰€š€§€¯€¼€Ê€Ù€è€ö '3AS[chowy„‹™¥³¹ÉÎ×Þéôý‚‚ ‚‚‚'‚2‚<‚=‚@‚H‚W‚^‚d‚h‚n‚v‚z‚…‚ˆ‚Œ‚˜‚¡‚¬‚½‚Ƃ̂͂΂ނä‚í‚ñ‚÷‚üƒƒƒƒƒƒƒ ƒ)ƒ*ƒ3ƒ:ƒAƒGƒUƒ\ƒfƒlƒvƒƒƒ—ƒžƒµƒÀƒÍƒÙƒÞƒßƒéƒëƒòƒø„„„„ „„ „(„/„6„A„G„Q„W„[„a„f„m„z„„‡„Š„˜„„¦„µ„·„¿„Ʉ˄Մ܄â„é„î„ó„ô„ù…………*…2…>…D…Q…`…g…q…x…‚…†……”…•…¨…³…¼…Ã…Ï…ë…ÿ†††††††*†0†7†@†K†T†\†`†k†t†x††¡†§†¨†³†¼†Â†È†Õ†Ý†å†í†÷†ú†ý†þ‡‡ ‡‡‡‡‡‡‡‡"‡0‡8‡L‡R‡V‡]‡_‡e‡l‡m‡t‡‚‡‡’‡•‡™‡‡©‡³‡Ä‡Ð‡Ü‡ä‡ì‡í‡ýˆ ˆˆ$ˆ1ˆ=ˆEˆLˆQˆZˆ]ˆ^ˆ‚ˆŽˆ”ˆ˜ˆ¢ˆ¥ˆ³ˆÀˆÅˆÑˆÙˆéˆñˆøˆþ‰‰ ‰‰‰#‰+‰3‰9‰C‰J‰M‰R‰f‰q‰{‰†‰“‰¡‰¬‰Ä‰Ò‰Ù‰ß‰ç‰ë‰ùŠŠŠŠŠŠMŠ‚ŠŠœŠ°ŠÃŠÍŠÐŠÛŠÝŠæŠëŠïŠÿ‹ ‹‹‹ ‹%‹+‹6‹:‹F‹S‹]‹g‹n‹v‹‰‹¡‹ª‹±‹Ä‹Ê‹Ó‹Ú‹â‹è‹î‹ó‹ûŒŒ#Œ6ŒGŒWŒaŒfŒgŒoŒxŒ„ŒŒŒŒ˜Œ¦Œ¨Œ©ŒÃŒØŒÛŒáŒéŒïŒõ")0DIPU]afgijq€ˆ—§µ¾ÎÝäüŽŽ)Ž@ŽYŽwŽ—ŽŸŽ§Ž´ŽÕŽø!ClŠ©²¸»¿ÂÆÉÏÙßâéñû %/’C’J’N’T’e’h’|’’’ž’¦’²’¼’À’È’Ñ’û““ “““/“?“G“u“‚““‘“˜“ž“¥“®“·““ӓړæ“ê“ù””” ”-”B”K”T”k”‚”•”¨”¯”·”¿”˔Дß_CoverageInfostartOffsetendOffsetisCovered_PositionlinecolumnhashCode==oparseChromeCoveragepreciseCoveragesourceProvidersourceMapProvidersourceUriProvider:async_future:is_sync:return_value:async_op_then:async_op_error:await_jump_var:await_ctx_var:saved_try_context_var0:async_op:result:exception:stack_tracecoverageReport:sync-for-iteratoriteratormoveNextentrycurrentscriptId[]mapResponsemappingcompiledSourcecoverageInfooffsetCoveragelengthcoveredPositionslineslineEntryentriescolumnEntrysourceUrlIdsourceUrlurlsstartsWithorg-dartlang-sdk:uricoverageputIfAbsentsourceLine+[]=containscoverageHitMapsforEachhitMapkeystoListgrowablesortallCoverageaddtypeCodeCoverageexceptionstack_trace_coveredPositionspositionsoffset< _coverageInfoForresultfunctionscastrangesrangecount>_offsetCoveragesourceLengthab-compareToiStdoutLogwarningmessagesevere_retryIntervalcollectserviceUriresumewaitPausedincludeDartscopedOutputisolateIdstimeout:saved_try_context_var1:exception0:stack_trace0pathSegmentswherecisNotEmptywsreplaceschemefragmenthostpathportqueryqueryParametersuserInfoserviceoptionscompressionsocketcontrollerlistendataonDoneclosedisposecancelOnErroronErrorstreamlogdisposeHandlergetVMonTimeout_getAllCoveragevmisolatesisolateRefidgetScriptsscriptsscriptpackagescopesplit/firstgetSourceReportforceCompileendTokenPosreportLinestokenPosscriptReportaddAllisolateReport_resumeIsolatesfuturesgetIsolateisolatepauseEventkindframeIndexstep__waitIsolatesPausedpauseEventsallPausedisEmptyNo isolates.Unpaused isolates remaining._getLineFromTokenPosminmaxtokenPosTablemid>>row_getCoverageJsonreporthitMapsscriptRefscriptIndexscriptUrievaluatedartcontainsKeygetObjecthitstokenPos has no line mapping for script missesp_PathFilterFormatterformathitmapLcovFormatterresolverbasePathreportOnpathFilterbufkeyvsourceresolvefromwriteSF:kDA:,LF:LH:end_of_record toStringPrettyPrintFormatterloaderloadwriteln<=prefixpadLeft|_prefix_getPathFilterabsolutePathsmapanyitemjsoncreateHitmapjsonResultcheckIgnoredLinespackagesPathglobalHitMapaddToMapoldCounteignoredLinesListignoredLineshasCurrent_shouldIgnoreLineignoredRangessourceHitMapsplitPosindexOfstartsubstringendjExpected value of type int or StringmergeHitmapsnewMapfilefileResultcntlineFileResultparseCoveragefilesglobalHitmapcontentsreadAsStringSyncencodingjsonMapdecodereviverResolversdkRootfailed_packagesfilePathendsWith-patchreplaceAllsublistlib.dartresolveSymbolicLinkspackageNamepackageUripackagePathpathInPackagenormalizedPathfollowLinksresolveSymbolicLinksSync_parsePackagescontentparsedpackagesnamepackageUriRootpackageMap#firstColon:unary-Unexpected package config format, expected an old style .packages file or new style package_config.json file.BazelResolverworkspacePath_resolveBazelPackagerunfilesPathSegment.runfiles//*$runfilesPos>=pathStarthttpshttp_extractHttpPathpackagesPosjoin.third_party/dart//lib/LoaderreadAsLinesutf8LineSplitterrunAndCollectscriptPathscriptArgscheckeddartArgs--enable-vm-service--pause_isolates_on_exit--checkedprocessserviceUriCompleterstdouttransformdecodercompletefuturestderrdrainexitCodeexitStatusProcess exited with exit code muliLineIgnoreStartmuliLineIgnoreEndsingleLineIgnoreignoreFileretryfintervalkeepGoing_withTimeoutdurationmsginSecondsinMillisecondsmssFailed to complete within extractObservatoryUristrmsgPosstartPosendPos(\s|$)getOpenPortv6OnlytoScriptCoverageJsonhitCount@ScriptfixedIdlibraries/1/scripts/_kindlibraryhash2_combinehashvalue&<<^_finishgetIgnoredLinesallLinesisErrorCoverageResumePauseStartPauseExceptionPauseExitPauseInterruptedPauseBreakpoint // coverage:ignore-start// coverage:ignore-end// coverage:ignore-line// coverage:ignore-fileObservatory listening on package:coverage/coverage.dartpackage:coverage/src/chrome.dart@methods@getters@constructorspackage:coverage/src/collect.dartpackage:coverage/src/formatter.dart@typedefspackage:coverage/src/hitmap.dartpackage:coverage/src/resolver.dartpackage:coverage/src/run_and_collect.dartpackage:coverage/src/util.dartpackage:source_maps/parser.dartdart:coreObjectintboolnumListMapStringdart:asyncFutureUri_FutureFutureOrStackTraceIteratorIterable_awaitHelperdart:_internalunsafeCastSingleMappingparseFormatExceptionArgumentErrorSetTargetLineEntryTargetEntryPattern_GrowableList@factories_completeOnAsyncReturn_completeOnAsyncError_asyncThenWrapperHelper_asyncErrorWrapperHelperdart:collection_CompactLinkedHashSet_Listfilleddart:iopackage:vm_service/vm_service.dartpackage:vm_service/src/vm_service.dartLogprintDurationNullVmServicedart:_httpCompressionOptionsWebSocketconnectStreamControllerFunctionStreamSubscriptionStreamVMTimeoutExceptionIsolateRefScriptListScriptRef_literal1ObjRefSourceReportsyncIsolateEventSuccesswaitScriptSourceReportRangeObjSourceReportCoveragepackage:path/path.dartStringBufferrelativedart:convertStateErrorFileEncodingJsonCodecpackage:package_config/package_config.dart_literal2joinAllfromUrinormalizeFileSystemEntityTypeFileSystemEntitytypeSyncpackage:package_config/src/package_config.dartPackageConfigparseStringbasePackageRegExpProcessCompleterUtf8CodecUtf8DecoderStreamTransformerdelayedServerSocketbindInternetAddressloopbackIPv4loopbackIPv6encodeComponent_microsecondsStreamTransformerBase_Override_durationclientNoContextTakeoverserverNoContextTakeoverclientMaxWindowBitsserverMaxWindowBitsenabledabsolute_reviver_toEncodable_type_allowMalformedžY343­4:°:°:´S­oB¬T!jHè‡mžYT«ÍïE0000000000 ‚U‚|‚¦ ‚Ï‚ù$ƒ€ÉƒAPC9%‡Ý‡óˆAˆˆˆ `ˆ `jˆ-`ˆP a`\j`]`%Jˆaˆa€Ï€ˆs€€ˆy€Œ5ˆˆ‡a`\‚ˆ‡€Ÿ#ˆ‡ƒˆ‡€Øjˆ’a`bˆ‡€Øa`\a`\‘;‘Q’FA ‘e’F‘j` ‘Ÿ a` ]`!j`‘´ `j‘Ã`‘î a`\j`]`%J‘ÿ‘ÿ€Ð€’5’A5’*’"a`\ƒ’"r#’"„’"«j’-a`b’"«a`\a`\‚’9_•Ý•ô–¬A ––¬–`"–)`j–3`–V a`\j`]`%J–g–g€–‚‚ –‚5–ž––a`\‚––‚,#––ƒ––‚dj–¡a`b––‚da`\a`\ž<žSŸXAžgŸXžl` ž„`jžŽ`žÂ a` ]`!j`žï a`\j`]`%JŸŸ€Ÿ'‚Á‚Ÿ1‚à5ŸAŸ9a`\ƒŸ9‚þ#Ÿ9„Ÿ9ƒ6jŸDa`bŸ9ƒ6a`\a`\ŸP‚Í¡F¡S¡ÛA¡d¡Û¡|`%¡•`"]\J¡§¡§€Ô€¡Âƒ˜¡Ñƒ¢Ícfó§~Í ‚b$‚ÍPC9%"" €Ú€ì€É)?Zb€Õ…€ð³  ò‚5€…` ‚ %' ‚A‚i€… ` ‚S%'! ‚u‚‘€…"` ‚ƒ%'#‚‚¹€…$` ‚ª%'%……¦ˆ7A …·ˆ7…Â&`"…Ú'`† a`\]`%`%>N(]&`%†(`%N)`*N*]*`%N+a[[N,a``+[N-`,“N.[N/[O…¦0^[[`+[…·ˆ71[2[3[[K>A>N††"`"€†$…I†5!v†D†:†4`/=†P†v†f†\†5`"1?M†w5[†w4x†‡†}†6a]`6†…†‡…’…à +I†r!†‡9`…ã >=†—…w+B?AD†ª>M†ç5[†ç4†í‡ †‚‡….†…†‡…’…à +N†×†å7`%†í9`%…ã I‡"!‡4‡&†÷>=‡=…w‡D†÷`%B?I‡W!‡\…#B‡g?N‡š‡ª8`"v‡¶‡¬†9`":I‡Â‡Ûv‡Ö‡Æ‡I`;<v‡è‡Þ†`;<a``>B‡î?=‡ù†ˆ‡I)=ˆ*…w+B=?ƒ…P……w„…kJˆ7[:[;`+>=@ƒ…P‡Þ‡æ„…k=Ž…†A…à =…’B…à =…·…à a[=Œ…k)Jƒ…PˆqˆˆAˆœˆ¦` ˆÚ a` ]`!‰ a`\‰'`]`%`%>N(]&`%‰%(`%N)`*N*]*`%N+a[[N,a``+[N-`,“N.[N/[Oˆˆ0^[[`+[ˆœ1[2[3[[K>A>I‰)x‰6€‰-ˆm<'=a`;`D>=}‰X‚‰Qˆ‰Y€‰}ˆm''>a`\=މ·ˆã+B?I‰Ê‰Õ‰Îˆx>I‰äx‰ñ€‰èˆm<'a`;`D>=ŽŠ ˆãŠŠ9FxŠJ€ŠAˆm?ŠU a` ` GƒŠnˆž‚ŠƒˆB?=‰Š—ˆxjŠ a` ]`!?Iе!xŠÈvŠÃ€Šºˆm`;I@'Aa`;`J=ˆŠ×ˆmxŠë€Šâˆm?Šö a` ` G?AC‹)> N‹‹"` x‹-€‹$ˆm?‹8 a` ` GM‹`5[‹`4}‹l‹fˆxa` ]`!‹mŠÁa` ]`!‡ˆòˆþ‰/ +N‹X‹^B`!‹l9`!‰O I‹x!‹‚‹|‹L>=Ž‹“ˆã‹š€æ‹²‹L`!‹¹ŠÁ‚‹¿ˆB?=‹ÓŠÁx‹ã€‹Úˆm?‹î a` ` GMŒ 5[Œ 4}ŒŒˆxa` ]`!ŒŠÁa` ]`!‡ˆòˆþ‰/ +=Œ‹LŒ9`!‰O IŒ$!Œ.Œ(‹L>=ŽŒ?ˆãŒF€õŒZ‹L`!ŒaŠÁ‚ŒgˆB?IŒ{!ƒŒ€ˆžBŒ‹?NŒšŒ¡9` xŒ¬€Œ£ˆm?Œ·a` ` GIŒÈŒÓŒÌŒ‘€ŒÖˆma``KBŒà?=ˆŒëˆmŒöŒ‘=Žˆã+B=?„ˆ¼†ˆã…ˆ×J[:[;`+>=@„ˆ¼ …ˆ×=ˆòA‰/ =ˆþB‰/ =ˆœ‰/ a[=ˆ×)J„ˆ¼Ja‘5AC|‘5Œ`"³ a`\]`%`%>N(]&`%Â(`%N)`*N*]*`%N+a[[N,a``+[N-`,“N.[N/[Oa0^[[`+[|‘51[2[3[[K>A>MÞ5[Þ4䀨…Ž †ŽŽH +NÊÜD`ä9`Žh I!&޾>M<5[<4B€Ò\޾`o³…Ž †ŽŽH +=Œ5üB9`%Žh B?M“5[“4™€±¨…Ž †ŽŽH +=޾™9`Žh I¿!ÕÃŽ¾>Më5[ë4ñ€Ó‘޾`‘³…Ž †ŽŽH +=Œäüñ9`%Žh B?=Œ‘(ü+B=?‚Õ„üƒðJ‘5[:[;`+>=@‚Õ)1ƒð=Ž AŽH =ŽŽBŽH =|ŽH a[=‹ð)J‚Õ‘8‘F’0AE‘c’0‘n`"]``>N(]&`‘(`N)`*N*]*`N+a[[N,a``+[N-`,“N.[N/[O‘F0^[[`+[‘c’01[2[3[[K>A>@v‘”€‘Џ4`/‘Š‘žN‘§‘¬`‘´M‘¹v‘Ì€‘¸`;<'F'GM‘ÿ5[‘ÿ4x’ ’‘© 6a]`6„‘…‘‘N +I‘û’ 9`‘n >=‹’‘’‘© B?=‹’#‘+B=?؃‘‚õJ’0[:[;`+>=@Ø’t ’|‚õ=Œ‘A‘N =‘B‘N =‘c‘N a[=Šõ)JØ’3’A’çAH’X’ç’c`"]``>N(]&`’t(`N)`*N*]*`N+a[[N,a``+[N-`,“N.[N/[O’A0^[[`+[’X’ç1[2[3[[K>A>N’|’`’ƒM’ˆv’›€’‘“`;<'!M’¶5[’¶4x’Á’¼“Ý 6a]`6„“\…“h“™ +I’²’Á9`“¹ >=‹’Ë“L’Ò“Ý B?=‹’Ú“L+B=?“#ƒ“L‚“@J’ç[:[;`+>=@“#”¦ ”®‚“@=Œ“\A“™ =“hB“™ =’X“™ a[=Š“@)J“#‡þS Žžé ¯¾í`ÕÕëIéë`? ÕO“ðöƒ;J`P`‚M‚M‚½‚g‚½‚pK`‚~L`;‚‹M`;`? ‚¢R€‚¨•Ì‚¯•ׂ‚µ•â‚‚ƒ9N‚áƒ9‚ðO`P`? ƒRvƒ€ƒ –%P[Tvƒ%€ƒ–%L`;Uvƒ1€ƒ+–%M[Vp ƒ>ƒD„™Q`W`"ƒŸƒŸ„ƒ»„ƒÃM`;ƒÔR`ƒâS`,j`` ? ƒóY€ƒù–©„–´‚„ –¿#„„„—N„7„—„H:`W` ? „[Yv„k€„a— M`;[v„~€„t— R[\v„€„†— S`,]W„¿„Å„ìA„Ï„ì„×O`bJ„á0„ငç—}™Rœy`c™ $€Ú€õ Z.€Õ%‚\‚k¤t`'‚̂ڀ†T`,j‚Ù`,(ƒÙƒü€†U`%jƒõ`` -‰‰‰šA‰+‰š‰>V]^`9‰QW`j``%J‰f‰fij‰z`,€‰†˜K‰˜[/Œ¿ŒÔvAXŒÞvŒéB`!ŒôY` % a`\j``%J88€æ€P˜ªW˜µ5h`a`\‚`˜Á#`ƒ`˜õjka`b`˜õa`\a`\0”©‘ZAZ´‘Z¼`;ÏY` ‘ a`\j``%J‘‘€ç€‘,™R‘;™]5‘L‘Da`\‚‘D™i#‘Dƒ‘D™j‘Oa`b‘D™a`\a`\1”ã”ø•œA[••œ• \`•Y` •I a`\j``%J•\•\€è€•s™ú•}š5•Ž•†a`\‚•†š#•†ƒ•†šEj•‘a`b•†šEa`\a`\2–k–w—A]–—–`%–¯^]_`!–ÃY` j`\>–Í—=–Ӏ逖‚–ýš¼—š¬3—å—ñ˜‰A_—ü˜‰˜ `%˜%^``˜9Y` j`\>˜C˜‰=˜I€ê€˜f› ‚˜u› ˜~›4™P™l™ÞA`™r™Þ™`%™ Y` j`]a`;`J™³™³€ë€™Ç›o™Ö›y)›M›U›\Ba›\›\`,*œœœ%BVœ%œ%]^`95œü$Bb$c`;`96žkžtž‡Bdž}ž‡ž‚` `97¡R¡W¡nBe¡^¡n¡cf` ` 8£=£B£aBg£N£a£Sh` ` +¤]¤i¤rBW¤r¤r`18àˆñU²Óø#Nz¦Ç9¤¤¤³±†`;© ©ª>A©ª>©$L`;©.i` ©Dj` j`©ok`Cj`©’W`j`©¬l`j©»``9J©Ëuª=©Ù€©â9©èD‚©îPƒ©þb„ªs…ª$…jª2a`b=ªjªuªyBLªyªy`;>«™«¡«¥Bi«¥«¥` ?­­#­1Bj­1­1` @¯A¯V¯eBk¯e¯e`CA°\°h°qBW°q°q`B±o±x±„Bl±„±„`×ø:Z{œC²Ä²Ó½e`]b`CE³^³s€†m`,j³i`, J³w³´cA³Ž´c³“n`,³žo`,`C>³¥´c=³¶e€³ËŸ“j³Õ`, 'n=³øe´ Ÿ“j´`, 'nJ´/´6€–€´LŸ´SŸ+L·d·{·þAp·€·þ·ˆR`;·¸ a`\j``CJ·Ë·Ë\€·àŸ›5·ð·èa`\·èŸ§#·è‚·èŸÕj·óa`b·èŸÕa`\a`\F¸Û¸ã¸èBn¸è¸è`,G¹Å¹Í¹ÒBo¹Ò¹Ò`,M»d»t»”Bqj»e` »}»”»Žr`C`,N¼[¼u¼…Bsj¼\` ¼w¼…¼r``H¼Š¼ž¼¦Btj¼‹` ¼¦¼¦`,O½F½Y½cBuj½G` ½a½c`;ù  9 Z Á ê!P¾8¾G¿ö``CY¾G `P? OR¾±¾Å¾ÊBnj¾²` ¾Ê¾Ê`,S¿¿¿Boj¿` ¿¿`,V¿\¿v¿†Bsj¿]` ¿x¿†¿€r``T¿‹¿Ÿ¿§Btj¿Œ` ¿§¿§`,W¿×¿ê¿ôBuj¿Ø` ¿ò¿ô`;!z!£!Ì"")"R"rêÁ!<"o"r Z€Ú€ð$€÷#$PC9% `‘—— v``%bÞå€ajÉ` `,d‚‚ €wZ]a`;`9e‚#‚/€xZ`€¡f‚M‚V€Wj‚4` `t„M„M„ªIZ„b„ª„oa`,„}x`€¡„w]a`;`9„ W```?b€£Ue£`d‚£kfƒ£~ „MOu…]…c† U…|† ``?b”ej…±`€¹dj…Ù]a`;`9f+ …cOi‚[‚c„HA‚v„H‚{a`,‚–V]^`9‚¯W`j`‚× a`\j```>‚á„H=#‚ç¤M‹‚ç¤Mj‚óa`b+a`\Nƒƒy`,ƒl€ƒ'¤!ƒ0¤Ma`\NƒBƒQz]f`95ƒSƒS]f`9RNƒS]f`9ƒSh`9ƒW¤,…ƒS¤äR=xƒb…ƒS¤Ò{jƒga`9`9`, ^a`9`9`,\j…ƒS¤ÒNƒ~ƒŠ|`€¡ƒŒmƒž¤,…ƒ¨¤¿ƒ¸¤Ma`\JƒÆƒát„ƒã¤–†ƒñ¥KRN„]a`;`92„`;`9>N„!}]k`9v„!v„!†„¥K~]^`9€£]k`9mEx„!¥³€€a`o>N„€`9v¥³€‚`9q=x„4‡„¥€ƒv„0„.¦ L`;=„6¦ a`;`9\s‡„¥‚„:¤;l††‡ŒA€„Z†,‡Œ†8a`,†] a`\`,>†f‡ŒI†l"x†x€†p¦‡€…“a`t`vx†‡€†¦‡€†j†—`,a`t`w>†£‡t=}†²†«¦’†³€†Î¦‡'a$‡#'€‡j‡`,a`\J‡-•?J‡z€‡¦‡m‡‘‡¤‘-A€ˆZ‡µ‘-‡È€‰]^`9‡îV]f`9ˆ a`\`€¡>ˆ‘-Nˆ'ˆ4€Š]x`;RN]x`;|`;ƒ§®NˆJˆO€‹`€¨ˆQ€¸>Nˆ‡}]k`9vˆ‡ˆ‡§m]k`9mExˆ‡…§é€€a`o>Nˆt€Œ`9vˆ‘…§é€‚`9qA>ˆ‘‘Nˆ¨=`vIˆ·!%ˆË†ˆ»¨0`v>ˆÞ‹e=‰¨S‰5v‰[†‰K¨0L`;=v‰}†‰m¨0i` >v‰Ÿ†‰¨0j` ?v‰Ë†‰»¨0k`C@v‰ø†‰è¨0W`AvІЍ0l`B4Š-Š-‹5Š.O`\>Š5‹4IŠA%ŠKŠE¨í`>ŠjŠû=}Š‚Šx§|ЀЛ§m'V$Ší'€vŠÕuŠÓ‡ŠÌ¨SL`;x'€ŽvŠäŠÞ¨í`M[Va`\>‹‹*=}‹‚‹§|‹¨ía`\I‹@‹L‡‹D¨SB‹U?>‹l‹—=‹v¨S‹€¨0`vN‹£‹¨L`;v‹²‹ª¨S`vL`;xI‹¾x‹Ïƒ‹Â§™€‹Ø©¹a``~>‹ßŒg=}‹ð‚‹é§|‹ñŒ©¹'V$ŒK'€ŒE©¹'€‘a`\BŒW?=xŒ|ƒŒo§™€’Œ€©¹a`;`=xŒ’„Œ§Î€’“Œ™¨S`v4Œ¢Œ¢‘Œ£O`\>Œª‘IŒ´%Œ¾Œ¸ª” `€À>ŒÔ¿N/€“`vv71ª” `€À€“`v€ÂIRv\Vª” `€À€”`€Å>lŽy=}‚z§|‚€®§]'V$Ú'€•vŽuÿ‡ø¨SL`;x'€–vŽŽ ªÂ L`;x'€—'€˜vŽbŽZ¨S`vi` y'€™a`\>Ž€µ@vޛޕª” `€À€š`€Äޕް=}‚§|€B§]'V$n'€v”u’‡‹¨SL`;x'€›'€œvíݪ L`;x'€™vªÂ L`;x'€vWGªÂ j` z'€žv‰¨S`vL`;x'€ŸvŸ—¨S`vi` y'€ža`\>Æ‘=}÷‚ð§|øª” a`\a`,`va`\\€²J‘„‘%§Îg‘2‘T‘p@Vj‘3` ‘]‘p]^`9J‘`v‘jv‘`.wZ]a`;`9d€ ]^`9n‘u‘“‘Ã@bj‘v` ‘•‘Ñc`;`9J‘­x‘¶v‘­.wZ]a`;`9db€‘·­ a``9‚o’ü““D@dj’ý` ““D“` `9J“(x“5v“(.xZ`€¡ed€“?­ta` `v€¥p“I“Z”A@ej“J` “a”A“ff` ` >“r”AN“|“ˆc`;“Š€“Ÿ­Ô'fJ“¾5“ΓÎ`9x“Îv“Å.wZ]a`;`9db“Ï­ía``9‚#“΂“ή+x“ìv“Ý“ή`9j` ??”%x”v”€” ­Ô`;I€¡x”7v”0”$­í€¢`,„€£”a`t`,…^`,`,`;†a` ` G` q”F”W—À@gj”G` ”c—À”hh` ` >”w—ÀI”}x”€”¯<'=a`;`D>”¤•=0”¬”²€”د'h'€¤?I• "v•2€•$¯€¥`‡v•L€•>¯€¦`ˆ>•Y•Ù=0•a•g€•‚¯'h'€§?N– –=`vx–$v–.xZ`€¡ed€–.¯a` `v€¥I–B–N–F¯°J–W+?N–Ÿ–¤`;x–´€–¦¯ua`;‰N–È–Íi`;x–æv–×–ϯ°`vj` zua`;‰I–ö–ú^v—x—v——¯°`vi` yua`;‰€¢`,„ƒ—&°‚—,¯ö>—3—«N—?—D€¨`;x—K‚—F¯ö€¡v—Zƒ—U°€¢`,„^`,`,`;†J—i—p%€©'=$—¤v—˜—¯°`vL`;x'A„—Ÿ°£?J—±+$&k'A,“,ê-R-².ð1!v—ò—ø£å€ª``9x˜6˜:€Lj˜` `;y˜T˜X€ij˜?` ` z˜r˜€€jj˜]` ` {˜§˜¶€kj˜…` `C|˜Ô˜Ý€Wj˜»` `}˜ø™€lj˜â` `€‚™ ™ ™‚IZ™™‚™L`;™)i` ™4j` ™Ok`C™eW`™ul``v?x€²y²z‚²({ƒ²3|„²=}…²H ™ Oœœ4£ãA€«œ<£ãœKL`;œ[i` œlj` œ“k`Cœ²W`œÈl`œø a`\`v>£ãN €¬`*N'4€­`,6€G²«IRxcV³€®“a`t`Š>ið=}x†q²ìy"'€¯€½²«óa`\=Ù³)?Iöxÿú²¶<'=a`;`D>žž—=}ž#†ž²ìž$$žQžL²¶'i'€¤a`\=ž€³)Ižž!ž£žº²¶>žÁ “=}žÐ†žÉ²ìžÑ$žþžù²¶'i$Ÿ'€°€Ÿ)²«'€±'€²a`\IŸô!vŸþŸù²¶€³`‹>   ,= ³)I 3!x Bv = 8²¶`;I@'Aa`;`J> Q =‰ [²¶x g b²¶€´x v z u²¶`;I€£'Aa`;`;Œ^ €µ`;€¶`;`;€·]^`;€¸`,€¹`;€º]a`;[€©`;€»`;` ??I ™ ¬‚ ²Á> µ Ø=Š ½²Á Î²¶I ß!‡ ä³> ð£S=Š ø²Áx¡¡ ²¶?¡²Á` a` ` GI¡0!¡5¡L²Á` >¡]¢f=}¡n†¡g²ì¡o¡—²Á` 'j$¡Ã'€°€¡Þ²«'€±'€²a`\=Š¢I²Á¢Z²¶I¢m!¢r¢~²¶¢„²Á` >¢•£M=}¢¦†¢Ÿ²ì¢§¢Â²Á` 'j'€¼a`\=Š£0²Á£A²¶??I£Y‡£]³J£i+?J£z£€‚€£š²«£ ²¶£¦²Á` ƒ£¶²Ì„£Ç²Ö…£Ò²á26€ƒ­­%®€½``C€‡­% `€ƒ? O€…­_­o®@qj­`` ­x®­‰r`C`,>­®N­š­¡€¾`,x­©v­£.n`,Fqv­¹€­³·n`,Fa`t`,ŽI­Å!­Ð­É·“a``J­Ö­Ý·?J­éx­öv­ð.o`,Gqv®€®·o`,Ga`t`,Ž6ß7¸€ˆ®®¯ó€¿`€ƒ€Š®n®s€nj®Y` `,€‹®®’€oj®x` `,€€‘®ž®¥€€€ÀZ`;€–®©®©®ä®¾®ä®Än`,®Ðo`,®Ü€À`;`€ˆ?€Š€¸>€‹¸I€‚¸T ®©€‡€“®é¯¯e@sj®ê` ¯¯e¯ r``J¯""%¯#€¯¸¯`C¯?v¯9.n`,€Šv¯H¯B¸¯`Cn`,Fa``¯Wv¯Q.o`,€‹v¯`¯Z¸¯`Co`,Ga``€Ž¯j¯~¯°@tj¯k` ¯‡¯°`,J¯Šx¯¤x¯–x¯‘v¯‹.n`,€Š€Á7a`t`,€Âx¯žv¯˜.o`,€‹€Á7%a`t`,a`,`,’€Ã7ÿÿÿÿa`,`,“€”¯µ¯È¯ñ@uj¯¶` ¯Ð¯ñ`;J¯Ö5¯Þ¯Ö`;v¯Ö.€ÀZ`;€#¯Þ€¯Öº!w¯Ö.€ÀZ$¯ñv¯ä.n`,€Š'#v¯ë.o`,€‹€‘¯Öº!`;`;8Œ9;9ð:€—¯ö¯ü±€Ä`€ƒ`P€š°t°{€€ÀZ`;€ °°°©°›°©°¡€À`;`€—?€š€ºÛ °€‡€›°­°Á°Ì@nj°®` °Ç°Ì`,J°Êx°Ê”€Åa`,”€œ°Ð°ä°ï@oj°Ñ` °ê°ï`,J°íx°í”€Åa`,”€ž°ô±±@uj°õ` ±±`;J±u±v±.€ÀZ`;€š;;G;‹;Ë€¡±"±1±Š€Æ`€§±1 `€¡? O€£±A±W±bB~±b±b]^`9€¥±f±u±ˆBd±~±ˆ±ƒ` `v<O€Éaa]˜[[[`a]˜[[[`>N-`,“N.[O€Ê[¶Á·¤€Ë]˜[2[3[`>>¶Ç·¤>N¶á}]k`vv¶áv¶á.V]f`v€ª]k`vmEx¶á‡½Ï€€a`o>N¶Ö=`vv¶ë‡½Ï€‚`vq>¶ë·>=w„½ž€Ì¶ù¾"›M¶ó)N··€Í]a`;`€¨v·.€ÈZ]a`;`€¨€¬I·1!·>‡·5¾b>·G· >N·i}]k`€¨v·iv·i·`¾b]a`;`€¨€ ]^`€¨]k`€¨mEx·i¾§€€a`o>N·X€‹`€¨v·q¾§€‚`€¨q>·q·š>=w„½ž€Îv·‡·‚¿ ~]^`9€­œM·{)?J·¤*Jƒ½‹JŸ`9€½=€²ºº¾ó@€’º¾óº"€Ï`,º7=`vº\ a`\\>ºe¾óNºoºt`;xºƒvº~ºv¿®i` yua`;‰>Nº«}]k`vvº«vº«.V]f`v€ª]k`vmExº«„À@€€a`o>Nºœ€Ð`vvºµ„À@€‚`vq>ºµ¾ÔNºò»€Ñ`;x»v»…»À@\i` yua`;‰@x»Ev»>†».À@€€¢`,„€†€»G¿¢a`t`w».»L@x»aƒ»\¿Ò€Òx»|†»lÀ@€€¡“€»‰¿¢^`,`,`;†^` `,`¡»\»I»™»^€»©¿¢†»°À@€ƒ»Á¿Ò>»È¾ÎN¼¼€Ó`,v¼*†¼À@€€¢`,„I¼:¼Jv¼Cƒ¼>¿Ò€¢`,„‡¼MÀAja``>¼d¼ñ=}¼§‚¼ ¿¸¼º€Ç¼¿¿®…¼ÈÀ@\a`\J¼á?N¼ÿ½€Ô`;x½/v½ …½À@\j` zua`;‰I½C½G^‡½SÀAjƒ½j¿Ò½pÀAï>½…¾k=}¾‚¾¿¸¾-€È¾9¿®…¾BÀ@\a`\J¾[?=x¾Šx¾u.€ÕZ…¾}À@\a`v`€¨€¶€’‡¾ŽÀAj¾¥¿®‚¾®¿¸a`,`va`\\€²J¾À?=x¾ãv¾Ú.V]f`v€ª€’¾ç¿®a`v\¢€³¾ø¿¿Y@dj¾ù` ¿¿Y¿!` `v>¿'¿YJ¿-x¿4.€Ö“x¿J€¿EÀC ua`;‰a`,`;`v€´€´À@AÀ@PÀCh@€ÖÀ@]ÀChÀ@b€Ï`,À@p`;`v>À@vÀCh>NÀ@•}]k`vvÀ@•vÀ@•.V]f`v€ª]k`vmExÀ@•‚ÀCÊ€€a`o>NÀ@…€×`vvÀ@Ÿ‚ÀCÊ€‚`vq>À@ŸÀCSNÀ@«À@µ€Ø`;xÀ@ÉvÀ@ăÀ@·ÀD'i` yua`;‰IÀ@ÛÀ@ß^€À@ëÀCš„À@òÀDSÀ@ýÀC¨>ÀAÀCMNÀAEÀAU€Ù`,vÀAa„ÀAWÀDS€¢`,„IÀAqÀAvÀAzÀAuÀC¨€¢`,„…ÀA„ÀDÅa``JÀA•ƒÀAœÀD'?NÀA¶ÀA¾€Ú`;xÀAÜvÀA̓ÀAÀÀD'j` zua`;‰IÀB2"ÀBEvÀB>†ÀB6ÀE8€¢`,„…ÀBHÀDÅa``ÀBg^…ÀBsÀDņÀB„ÀE8ÀBÀC¨>ÀB”ÀB½JÀB ƒÀB§ÀD'?JÀBÇ5ÀC*ÀBÎ`v5ÀBÎÀBÎ]a`;`€¨vÀBÎ.€ÈZ]a`;`€¨€¬#ÀB·ÀBÎÀF +5ÀBßÀBß`€¨xÀBßÀBßÀF ]a`;`€¨bvÀBíƒÀBàÀD'L`;xa``€¨‚#ÀBßÀBßÀFP+xÀCÀBßÀFP`€¨€Ö…ÀCÀDÅÀC$ÀC¨a`,`;`v€´`v`v#ÀB·ÀBÎÀEúƒÀC9ÀD'ÀBÎÀEú`v`v?JÀCY+€¶ÀCêÀCýÀDˆ@€ÕZÀDÀDˆÀD=`v`€¨>ÀDÀDˆNÀD&ÀD/€Í]a`;`€¨5ÀDBÀD1]a`;`€¨vÀD1.€ÈZ]a`;`€¨€¬#ÀDBÀD1ÀG”wÀD1.€ÈZ2ÀDF`;`€¨€°ÀD1ÀG”]a`;`€¨]a`;`€¨JÀDN5ÀDlÀDU]a`;`€¨ÀDUÀGu5ÀDfÀDf`;vÀDf€ÀD^ÀGWL`;x5ÀD]ÀD]`€¨xÀD]‚ÀDUÀHbƒÀDfÀHCa``€¨‚#ÀDl„ÀD]ÀHk5ÀDpÀDp`€¨ÀDp€¸5ÀD]ÀD]\xÀD]‚ÀDUÀH€ƒƒÀDfÀHC…ÀDpÀH¸a`;`€¨\s…ÀDpÀH¸ÀD]ÀHk`€¨`€¨= ?†BýCtG0I3€¹ÀDÀD“ÀEi €Û``€¡€¿ÀD¿ÀDÅÀD× ÀDÕÀD×`€¹? ÀDÅO€»ÀDÜÀDþÀE,@~jÀDÝ` ÀE ÀE,]^`9JÀE jÀE]£`9 €½ÀE1ÀELÀEg@djÀE2` ÀEUÀEgÀEZ` `vJÀEc+IªIøJA€ÀÀHGÀHMÀKu€Ü`€ÂÀH±ÀHÀ€€“`v€ÃÀIÀI€=`v€ÄÀI|ÀI‘€€š`€ÇÀIÝÀIÝÀJ=iÀIóÀJ=ÀIù=`vÀJ€“`v`€À?€Ã€ÀJÔ€ÂÀJà€Ä* ÀIÝO€ÈÀJ‘ÀJ‘ÀJ÷€ÝÀJ®ÀJ÷ÀJ´=`vÀJ€“`v`€À?€Ã€ÀK>€ÂÀKJ€Ä) ÀJ‘O€ÅÀKBÀKKÀKs@€”ÀKZÀKs`JÀK]!vÀK^.€š`€ÄK†KÊ\¤î¤þ­A€Þ¥­¥ R`;¥D a`\`C>¥M­ N¥U¥[€ß`,“O¦Á¦Å€àa`,¦Ðª‰`,>¦Óª‰ I¦ú§‚¦þÀLv§u§ €§ÀKõ€¢`,„a``>§§|=}§&§ÀL§'"'€á§VÀKõ`;‚§^ÀLa`\J§mx§t”€Åa`,”?N§†§Œ€Ï`,‚§ŽÀLN§ž§£€â`,x§¬§¥ÀKõ`;€ã‚§·ÀLa`,`,¤N§Ç§Í€ä`,x§Ô…§ÏÀLô€Â70a`,`,’I§àx§ê†§äÀM/€†7 a`t`w>§ï¨T=}§þ§÷ÀL§ÿ"'€á¨.ÀKõ`;‚¨6ÀLa`\J¨Ex¨L”€Åa`,”?N¨^¨i€å`,†¨kÀM/N¨z¨€K`,“AD¨‰>¨Œ©Æ=¨”ÀMñx¨§x¨¢¨œÀMñ€Á7 a`t`,€£†¨©ÀM/a`t`,…I¨¶x¨À¨ºÀMñ€†j¨Â`, a`t`w>¨Ì©F=}¨Ý¨ÖÀL¨ë"'€æ©ÀKõ`;„©$ÀLßa`\J©5x©<”€Åa`,”?=Š©NÀLx©S‚©NÀL€£”a`t`,…I©]©g‚©aÀLv©q©jÀKõ`;€¢`,„a``B©y?=©†ÀLôx©”©ÀKõ`;€ã‚©ŸÀLa`,`,¤=Ž©­ÀM/x©º…©µÀLô€Â70a`,`,’x©Õ†©ÏÀM/€ç7 a`t`¥I©à"©ï‡©äÀMÜ“a``x©ý‚©÷ÀL€†xª„©ÿÀL߀£”a`t`,…a`t`w>ª ªs=}ªªÀLª"'€èª^ÀKõ`;„ªfÀLßa`\?Jªyª€ÀMñNª’ª˜n`,ªšÀL-a`,Iª«xªµ„ª¯ÀPi€…“a`t`v>ªºªïJªÀªÇ€ €ªäÀKõ?Iªó"ªý‚ª÷ÀLv«u«€«ÀKõ€¢`,„a``!«+x««ÀKõ`;€ã‚«$ÀLa`,`,¤j«.`,a``>«4«²=}«A«:ÀL«B"'€é«nÀKõ`;‚«vÀLa`\J«ƒ«Š€ «§ÀKõ`;?=Š«¶ÀLx«»‚«¶ÀL€£”a`t`,…N«Å«Ëo`,«ÍÀL-a`,I«Þx«è…«âÀQÄ€…“a`t`v>«í¬"J«ó«ú€ ¬ÀKõ`;?I¬&!¬0‚¬*ÀLv¬:¬3ÀKõ`;€¢`,„a``>¬B¬Û=}¬O¬HÀL¬P"'€ê¬—ÀKõ`;‚¬ŸÀLa`\J¬¬¬³€ ¬ÐÀKõ`;?J¬ß¬æ€–„¬üÀPi…­ÀQÄ­ ÀKõ`;^ÀFÀFÀG A€ëZÀFÀG ÀF#€Ï`,ÀF1$`;ÀFD€ì`;`>ÀFPÀG IÀFTxÀFjvÀFc‚ÀFXÀS€¢`,„€…vÀFwÀFlÀS€¢`,„a`t`vJÀF*?EÀFÀF˜ÀFš€í`,€ÀFœÀSxÀF¥ƒÀF£ÀSœ€…vÀF²ÀF§ÀS€¢`,„a`t`v‹ÀFºÀSœxÀF»ƒÀFºÀSœ€£”a`t`,…>ÀF¿ÀGIÀFÅ!ÀFâxÀFÔ‚ÀFÉÀS€ãƒÀFßÀSœa`,`,¤xÀFðÀFåÀS€ãƒÀFûÀSœa`,`,¤a``JÀFÿ*?JÀG)_ÀK¤ÀK¨ÀLA€îZÀK´ÀLÀK½€ï`9ÀKÉ€ð`9`,JÀKÔxÀKçxÀKÜvÀK×€ÀKÔÀTÔi` >ua`;‰qxÀKùvÀKôÀKñÀTái` >ua`;‰a`;`,¦Um"Æ1J67Å:”;à<‚IPJRK× KÚRÞT®Um €É +§BTo…Z¨€ÕË€ðù€÷‚ €Ë‚©‚Ç€†€ñ`;j‚»`;€Ìƒ?ƒl€†€ò`;jƒW`;€Íƒê„€†€ó`;jƒý`;€Ï†3†Iˆ™A€ô†Zˆ™†e`†p `†š a`\]`%`%>N(]&`%†©(`%N)`*N*]*`%N+a[[N,a``+[N-`,“N.[N/[N€õ[O†I0^[[`+[†Zˆ™1[2[3[[K>A>I†­"†±ÀV‚†Õ†Áv†Ï€†ÊÀVw`;©j†Ø`;a``>>N†ô‡€ö`‡M‡‡v‡(€‡#ÀVw`;©j‡/`;j‡@`;I‡]x‡o‡aÀW´€÷a`ª>M‡Œ5[‡Œ4‡’€Ò‡¬ÀW´‚‡»ÀV†ÀVå‡ÀVñÀW+ +=‡…ÀVÖ‡’9`%ÀWK B??N‡ÛB`!K>M‡ö5[‡ö4xˆ€‡üÀVw€øa]`!¬†ÀVå‡ÀVñÀW+ +=‡îÀXŠˆ9`!ÀWK ˆ`ˆ€ù`>=}ˆ+‚ˆ$ÀVˆ,ÀY a`\=ˆ4ÀVÖjˆA`` B=ˆdÀVÖˆk€Ñˆ~ÀXŠvˆŠ€ˆ…ÀVw€ú` ­‚ˆÀVB=?ƒÀV¯…ÀVÖ„ÀVÊJˆ™[:[;`+>=@ƒÀV¯ÀY­ÀYµ„ÀVÊ=ŽÀVåAÀW+ =ÀVñBÀW+ =†ZÀW+ a[=ŒÀVÊ)JƒÀV¯€ÐˆàˆöÓA€û‰ Ó‰` ‰D a` ]`!‰l a`\‰~ `]`%`%>N(]&`%‰’(`%N)`*N*]*`%N+a[[N,a``+[N-`,“N.[N/[N€õ[Oˆö0^[[`+[‰ Ó1[2[3[[K>A>I‰–x‰Ÿ€‰šÀZT<'=a`;`D>=0‰º‰À€‰äÀZT''>?IŠŠ"ŠÀZ_>IŠ1xŠ:€Š5ÀZT<'a`;`D>MŠ[5[Š[4Ša€ÏŠx®€Š€ÀZTƒŠ‡ÀZ…‚Š•ÀZv‡ÀZÙÀZåÀ[ +=ŽŠTÀZÊŠa9`%À[?B?=‰Š©ÀZ_jвa` ]`!?IŠÇ"ƒŠËÀZ…ŠòvŠívŠà€ŠÛÀZT€·]f`;¯€ü`;°jŠõ`;a``>>N‹‹€ö` x‹&€‹!ÀZTe$‹Wj‹0`;'Aj‹A`;a`;` ±N‹iB`!K>M‹ˆ5[‹ˆ4}‹”‹ŽÀZ_a` ]`!‹•À\¼a` ]`!‡ÀZÙÀZåÀ[ +=‹€À\ÿ‹”9`!À[?‹«`‹²€ù`>=}‹Ä‚‹½ÀZv‹ÅÀ]a`\=Ž‹ÏÀZÊj‹Ü`` BIŒ!Œ ŒÀ\ÿ>=ŽŒÀZÊŒ%€æŒ=À\ÿ`!ŒDÀ\¼‚ŒSÀZvB??NŒtB`!K>MŒ5[Œ4}Œ›Œ•ÀZ_a` ]`!€ŒœÀZTa` ]`!‡ÀZÙÀZåÀ[ +=Œ‡À^)Œ›9`!À[?Œ§`Œ®€ù`>=}Œ¾‚Œ·ÀZvŒ¿À^Åa`\=ŽŒÇÀZÊjŒÔ`` BIŒ÷ŒûÀ^)>=}‚ÀZvxA€<ÀZTua`;‰''€ýa`\=ŽrÀZÊj`` B?=Ž¢ÀZÊ©€Ñ¼À^)`!€ÃÀZT‚ÉÀZvB=?„ÀZ£†ÀZÊ…ÀZ¾JÓ[:[;`+>=@„ÀZ£À_ÂÀ_Ê…ÀZ¾=ÀZÙAÀ[ =ÀZåBÀ[ =‰ À[ a[=ÀZ¾)J„ÀZ£€ÑŽ—Ž¥ûA€þŽ·ûŽÇB`!ŽÒ` Žô a`\`%>ŽýûN€ÿ`, €(À`jI2!@ƒ6À`œjC`,a``>LÁJ”€õ€¨À`j¯À`u‚µÀ`€?JÅÌ€æ€äÀ`jëÀ`u‚ñÀ`€€Òþ‘BA-‘B8`Z a`\]`%`%>N(]&`%i(`%N)`*N*]*`%N+a[[N,a``+[N-`,“N.[N/[N€õ[O0^[[`+[-‘B1[2[3[[K>A>NwB`!K>M’5[’4x€˜ÀaD€øa]`!¬…Àa§†Àa³Àaí +=ŠÀb19`!Àb °`·O`>=}ËÄÀaOÌÀb´a`\=ŒØÀa˜jå`` B=Œ‘Àa˜‘€æ‘'Àb1v‘3€‘.ÀaD€ú` ­‘8ÀaOB=?‚Àaq„Àa˜ƒÀaŒJ‘B[:[;`+>=@‚ÀaqÀcSÀc[ƒÀaŒ=Àa§AÀaí =ŽÀa³BÀaí =-Àaí a[=‹ÀaŒ)J‚Àaq€Ó‘E‘[’A‘n’‘y`‘› a`\]`%`%>N(]&`%‘ª(`%N)`*N*]*`%N+a[[N,a``+[N-`,“N.[N/[N€õ[O‘[0^[[`+[‘n’1[2[3[[K>A>N‘¸B`!K>M‘Ó5[‘Ó4x‘Þ€‘ÙÀcú€øa]`!¬…Àd]†ÀdiÀd£ +=‘ËÀdç‘Þ9`!Àdà ‘ñ`‘øO`>=}’ ’Àd’ Àeja`\=Œ’ÀdNj’&`` B=Œ’IÀdN’P€õ’dÀdçv’p€’kÀcú€ú` ­’uÀdB=?‚Àd'„ÀdNƒÀdBJ’[:[;`+>=@‚Àd'Àf ÀfƒÀdB=Àd]AÀd£ =ŽÀdiBÀd£ =‘nÀd£ a[=‹ÀdB)J‚Àd'€Ô’‚’•‘A’©•‘’½`%’Ï`"]\\>N(]&\’æ(\N)`*N*]*\N+a[[N,a``+[N-`,“N.[N/[O’0^[[`+[’©•‘1[2[3[[K>A>N““+`"“-²“7v“P“@Àf»`;<j“V`;M“k5[“k4x“}“qÀg‡')^'`]`"´…Àg†ÀgÀgC +=“}9`"Àgc N“œ“¡`“£M“¨v“½“±Àg‡`;<j“Ã`;N“â“êY` v“ñ“ìÀh3€ú` ­N“ý”`µx” ”Àh3 j”`¶^ `· `¸`µ¹=”&€é€”AÀf°”IÀho”RÀh’N”_”h ][x”o”jÀh’ a][»=”•Àh3”œM”¡v”º”ªÀf»`;<j”À`;=”ÖÀhov”å”àÀh3€ú` ­=”ìÀh’x”ø”óÀh3 j• `¶^ `· `¸`µ¹=•€ì€•&Àf°•.Àho•7Àh’N•D•Q ][x•X•SÀh’ a][»M•d5[•d4•q½[•v¿][•wÀhþ•Àiê…Àg†ÀgÀgC +=•q9]f[Àgc =?‚ÀfÖ„ÀfùƒÀfíJ•‘[:[;`+>=@‚ÀfÖÀj«Àj³ƒÀfí=ÀgAÀgC =ŽÀgBÀgC =’©ÀgC a[=‹Àfí)J‚ÀfÖk6VV[Z8`Na(cÞf”k6 €Õ§*E[Z~€ð¬€÷ €ØÎñ€†€Õ`;jâ`;€Ù‚‚€†€Õ`;j‚`;€Ú‚.‚[€†€Õ]f`;j‚:]f`;€Û‚j‚{€†€Õ`;j‚u`;€Ü‚Š‚¡€†€Õ`;j‚˜`;€Ý‚°‚Í€†€Õ`;j‚Á`;€Þ‚܃€†€Õ`;j‚ò`;€ßƒƒn€†€Õ]f`;jƒ(]f`;€àƒ~ƒ™€†€Õ`;jƒŽ`;€áƒ¨ƒÃ€†€Õ`;jƒ¸`;€âƒÒƒû€†€Õ`;jƒé`;€ã„„.€…€Õ]À]f`,`v„'x„j„`Á ]f`,j„!`¶a]Â`;]f`,]Â`]f`,Ä]À]f`,`Æ€äžLžt€…€Õ`Çž_É' €æ„1„?…öA„V…ö„fB`!„q` „“ a`\`%>„œN„ì`K>„þ…4=‹…Àmðx…"…€ã €…*Àm¿a]f`,`Ë…6`W…P€ù`W>…S…¸=}…`‚…YÀmÕ…~#„…ƒÀn>a`\J…Œj…™`` J…¼…À胅ÚÀmð…æÀmÊ‚…ìÀmÕ€ç…ù†‡lA!†‡l†,R`;†8` †Z a`\`%>†cN†o`K>††ª=‹†‡Ànò†”Í€†ŸÀnÁ†¬`W†Æ€ù`W>†É‡.=}†Ö‚†ÏÀn׆ô#„†ùÀo&a`\J‡j‡`` J‡2‡9€èƒ‡PÀnò‡\ÀnÌ‚‡bÀn×€è‹Û‹éžCA"‹ÿžCŒ #`Œ$` ŒA a`\`%>ŒJžCIŒN"!vŒ`ŒSÀoµ€³`‹xŒzŒmÀoµ<'=a`;`D>Œ=0Œ•Œ›xŒÃŒ¶Àoµua`;‰'$'%?I!x.v)Àoµ`;I@'Aa`;`J>=}=‰CÀoµx_RÀoµ?j%'#a` ` G?O‚‰&^'`[`;”Ž'`[`;>—ŽI%£“_J©'(?I»%Â'_JÈ')?IÝ%êjá]f[_Jð'*?JŽ'+OŽŽ,^'`[``;`;_Ž+õ'`[Ž4K`ŽBL`;ŽQc`;j`_>Ž_õIŽe%Žo…ŽiÀqˆ_JŽuŽ|Àqˆ_?N*2M`;$2†>Àq“#!P‡DÀqž$u'-hÀqž`;'`;'.–Àp¹_a`;=}²‚«ÀoÁ³"ÐÀqâ…ÙÀqˆa`\Jæ+Oú/a]a`;``9˜s%0]a`;``9>,˜sN:L`;NL1`;Naf`;Nyk`;N¤W]a`;`N·¿2`*NÐØ3`*Néô4`*=x‘†‘Àr˜54‘‘“ ‘6`;‘K`\>‘“ŸAG‘$‘,ÀsL‘@j‘@`;>‘;=‘TÀs )=‘nÀrº‘uÀqI`;‘‡ÀsXj‘Ž`;^``;`;`;B‘£‘·j‘·`;>‘²=‘ÎÀs )=‘èÀrÆ‘òÀqI`;’ÀsXj’ `;‡’Àrº^``;`;`;B’)’=j’=`;>’8=’WÀrÓ ’dÀqI`;’vÀsXj’}`;‡’Àrº^``;`;`;B’ž’²j’²`;>’­=’ÑÀs)=’îÀrß “ÀqI`;“ÀsXj“`;‡“.Àrº^``;`;`;B“?>“N=x“s5“l“b]a`;`“bÀrë #“l“bÀu“bÀrë 2“p`;`“bÀu]a`;`]a`;`€ƒ“tÀsL“{ÀsXa`;`\sB“Œaa`;`\\ÎI“§!“¬Às >“µ”=}“Ä‚“½ÀoÁ“Å"'7†“øÀr˜a`\?I” !”Às >””l=}”(‚”!ÀoÁ”)"'8†”_Àr˜a`\?I”r"”{‡”vÀrº”Ž”†ÀrÆJ”—+?N”¬”º9` ”ÀÏu”Í”ÆÀrÆN”Ù”æl`!”é ”ùÀvXN••i` x•%•Àoµ?•0ÀvXa` ` GI•D!x•Sv•N•IÀv›`;I@'Aa`;`J=•bÀv›x•n•iÀv›€´x•†v••|Àv›`;I€£'Aa`;`;Œ^ €µ`;€¶`;`;€·]^`;€¸`,€¹`;€º]a`;[€©`;€»`;` ?N•–•¢€Ý` •¤Àv›I•®!•½•²ÀrÓ =•ÆÀwªx•Ù•ÔÀv›eu•ë•áÀrÓ a`;` ±?I•ó!x– v–•øÀwª`;I@'Aa`;`J>––e=– Àwªx–:–.Àwª€´x–Yv–T–HÀwª`;I€£'Aa`;`;Œ^ €µ`;€¶`;`;€·]^`;€¸`,€¹`;€º]a`;[€©`;€»`;` ?N–}a`CI–Š!–ž–ŽÀrß >–§–í=–¯Àxè–¹\–ÎÀrß ‚–ßÀoÁI–ô–øÀs>——C=— Àxè—€ ':?J—J—_u—u‡—qÀrº—xÀv›—~Àwª—‹Àxè—”Àrë —ŸÀv{4—­—­˜n—®O`\>—µ˜mI—½%—Ç—ÁÀy¡`P>—Ù˜@=}—ê‚—ãÀoÁ—ø"&˜ v˜˜Ày¡`PM[V`;v˜*˜$Ày¡`PP[Ta`\>˜G˜g=}˜X‚˜QÀoÁ˜YÀy¡a`\N˜|˜€;]a`;`˜‚ÀqI]a`;`€˜¢Ào©'K^``;`;]a`;`I˜´˜¼†˜¸ÀzMJ˜Åj˜Ò`` ?N™W]a`;`N™#<]f`9N™7=`,=x™L™HÀzM]a`;`54™T™TœD™U6`;™ZK`\>™aœCAG™g™oÀ{! ™j™`;>™|=™œÀzæ 5™Õ™¬`,™¬ÀqI`,™»À{- j™Â`;^``;`;`,#™¬™¬À{m •™¬À{m `,`,B™ã™õj™õ`;>™ðNšš>]f`5šLš]f`šÀqI]f`š7À{- jš>`;^``;`;]f`#ššÀ{ü šO—`“šÀ{ü ]f`]f`Nš_šhV]f`9šs—`9“>Nš“}]k`vš“š“À{ç ]k`mExš“À|©€€a`o>Nšˆ=`vš¡À|©€‚`q>š¡›ÃNš±š¼?]a`;`šÌÀqI]a`;`šìÀ|ú'@^``;`;]a`;`I›!› ›À}!>›)›¹N›;›A0`9›CÀrr›PÀ}!]a`;`a]a`;``9I›i!›s›mÀ}”>›|›­=x›•›ŒÀ|‡ €’›™À}”`9a`9\¢??=›ÍÀzÕ›ÛÀ|‡ B›í>›ú=xœ5œœ ]a`;`‡œ ÀzÀ#œœ À~> œ ÀzÀ2œ`;`œ À~> ]a`;`]a`;`€ƒœÀ{! œ%À{- a`;`\sBœ4aa`;`\\ÎIœIœ[œMÀzæ >œdœÏ=}œq‚œjÀoÁœr"'A€œ®Ào©a`\=œºÀzæ •?IœÓœãœ×ÀzÕ>œìP=}œù‚œòÀoÁœú"'B€0Ào©a`\=<ÀzÕJ—`9“?JT[iu|oÀzæ uŠÀzÕ‡ÀzÀ4˜˜ž@™O`\> ž?I¦%°ªÀ´ `P>ž=}Ñ‚ÊÀoÁÒ"&õ võïÀ´ `PM[V`;vžþÀ´ `PP[Ta`\>žž;=}ž.‚ž'ÀoÁž/À´ a`\€éžwž|Ÿ_ACž–Ÿ_žª`%ž·Y` žÐ^]_]f`,\>žØŸ_Nž÷žüD]a`;`žþ€ë€ŸÀ€{ŸÀ€†=xŸ-‚Ÿ&À€‘€’&ŸPxŸBŸ1€ä ƒŸJÀ€±a`]f`,Ñ`!a]f`,\Ó€êŸbŸg HAEŸƒ HŸ—`%Ÿ¤Y` Ÿ¸^``\>ŸÀ HNŸßŸäD]a`;`Ÿæ€ë€ŸúÀO ÀZ=x ‚ ÀeFx 8 'Ö' ƒ @À{a``;Øa`\Ú€ë K `¤IAG s¤I ‚`% Y` ]a`;`J ŸRN °]a`;`2 °`;`N ¼]a`;` ¼€îv Õ€ ÎÀ‚W`+j à]f`;I ¼! ¼ƒ ¼À‚\>N ¼}]k]Û`;`v ¼v ¼ ¼À‚\]a`;`H]^]Û`;`Ü]k]Û`;`mEx ¼„À‚«€€a`o>N ¼]Û`;`v„À‚«€‚]Û`;`q=x ¼‚ °À‚;€ƒv ¼… ¼Àƒ46`;Þv ¼… ¼Àƒ4K`ßa`;`\s?=x¡‚ °À‚;€ƒj ò`;j¡`,a`;`\s=x¡1‚ °À‚;€ƒj¡%`;RN¡3]f]a`;`¡3—]a`;`“>N¡X}]k`9v¡Xv¡X€¡QÀ‚V]^`9*]k`9mEx¡X…À„1€€a`o>N¡F=`9v…À„1€‚`9q=x¡}„¡3Àƒü€’RN¡}]a`;`2¡}`;`=x¡“‡¡}À„»€ƒj¡‹`;v¡†¡•À„‹L`;=a`;`\s=x¡º‡¡}À„»€ƒj¡¯`;¡¼ x¢P#v¡Ó†¡ËÀ„‹l`B¡ö v¢ †¢À„‹i` >¢À‚v¢9†¢1À„‹i` >` ua`;áa`;`\sI¢i!¢zv¢u†¢mÀ„‹i` >v¢…†¢}À„‹j` ?a``K=x¢±‡¡}À„»€ƒj¢£`;¢³ x£¢Ô v¢ê†¢âÀ„‹j` ?v£†¢úÀ„‹i` >ua`;áa`;`\s?I£8"!£Tv£D†£<À„‹k`C@!%£‡v£w†£oÀ„‹k`C@`P=x£Ä‡¡}À„»€ƒj£±`;x£Þv£Î†£ÆÀ„‹k`C@ua`;áa`;`\s?N£ú]a`;`£ú€îv¤†¤ À„‹W`Aj¤]f`;I£ú!£ú£úÀ†Ü>N£ú}]k]Û`;`v£úv£ú£úÀ†Ü]a`;`H]^]Û`;`Ü]k]Û`;`mEx£úÀ‡- €€a`o>N£ú]Û`;`vÀ‡- €‚]Û`;`q=x£ú‡¡}À„»€ƒv£ú£úÀ‡¸ 6`;Þv£ú£úÀ‡¸ K`ßa`;`\s?‡¡}À„»a]a`;`\¢„¡3Àƒüa`;`\s‚ °À‚;€ì¤L¤Q¦ÓAI¤a¦Ó¤p`%¤|Y` ¤^``\>¤˜¦ÓN¤ ¤ªW`v¤³€¤¬ÀˆW`+N¤âJ`;I¤í%¤ûƒ¤ñÀˆ¹]a`;`>¥¦†N¥¥(K`x¥3¥*Àˆ¹]a`;`bj¥4`;a``‚I¥H%¥V…¥LÀ‰`;>¥a¦‚N¥m¥wL`x¥‚¥yÀˆ¹]a`;`bj¥ƒ`;a``‚N¥¥®M`x¥¹¥°Àˆ¹]a`;`bj¥º`;a``‚=Œ¥×ÀˆØ$¥ß'N¥ðÀ‰`;#%¦‡¦À‰¦`;$¦:'€—¦(À‰¦`;'`;#%¦X†¦NÀ‰b`;$¦u'O¦jÀ‰b`;'`;'#??=¦Š€ö‚¦žÀˆ£€¦¦ÀˆY¦·Àˆ˜J„¦ÉÀˆØ€î§«§ÁªAP€Õ§Òª§àD`§÷Q]^`;]a`;`>¨ªI¨ %¨€¨ÀЦ]a`;`>¨,©ÿI¨2v¨;¨6ÀЦ]a`;`R`âJ¨D+?>N¨f}]k`;v¨f¨fÀв]k`;mEx¨f‚À‹+€€a`o>N¨^L`;v¨u‚À‹+€‚`;q>¨u©êI¨}x¨†¨ÀЦ]a`;`Sƒ¨’À‹xa``ã>¨™©äN¨§¨´T]a`;`RN¨¶]a`;`2¨¶`;`>N¨×}]k`;v¨×v¨×¨ÒÀЦ]a`;`U]^`;ä]k`;mEx¨×…ÀŒ€€a`o>N¨Ë6`;v…ÀŒ€‚`;qI¨é!x¨ü¨îÀ∆©ÀŒˆa``æ=x©„¨¶À‹õ€ƒ†© ÀŒˆx©©ÀЦ]a`;`b†©ÀŒˆa``‚a`;`\s?„¨¶À‹õI©-v©>„©1À‹ÜR`âJ©G+?>N©{}]k`v©{v©{„©nÀ‹Ü€ ]^`]k`mEx©{…ÀY€€a`o>N©eK`v©ƒ…ÀY€‚`q>©ƒ©¿I©!©”€ï†©¢À¸J©ª+?J©É„©ÐÀ‹Ü?J©ð©÷ÀЦ]a`;`?Jª+€ïªSªX«®AV€Õªe«®ªn+``>ªv«®Iªz""ª…€ª~ÀŽ@ª•)ª˜ÀŽ@`a``窨*ª«ÀŽ@`a``çJª³)?IªÂ"%ªÍªÆÀŽ@``t%ªÞª×ÀŽ@``;Jªé)?Iªø%«ªüÀŽ@`]f`>««AJ«x«)«"ÀŽ@]f`Wj«/a``!aa```è?I«E%«P«IÀŽ@`]a`;`>«i«œJ«ox«„v«}«vÀŽ@]a`;`€ ]^`Wj«Ša``!aa```è?J« *Ôk m£n¥o€_3òˆqŠˆŽ"Ô  €ð€ÚZ€þ€÷€óä‚ €…X€ð`C÷J•7€õ……-” Ap…2” …BR]f`,…N$` …x a`\`%>…” I……x…–…‰À<'=a`;`D>…«†==}…¸‚…±À‹…¹…ÝÀ'$'>a`\J†j†4`% ?N†E†K€ß`,“N†V†_V]f`9†j—`9“N†t†€Š]x`;RN]x`;|`;…À‘KC†‘x†žƒ†˜À‘ €…v†§€† Ào€¢`,êa`t`vA>†¯N†¹†ÄY`*N†Õ†Û€Ï`,ƒ†ÝÀ‘ N†ì†ûZ`,x†ý”€Åa`,”N‡ ‡ [`,v‡€‡Ào€¢`,êN‡&‡+€â`,x‡3€‡-Àob5‡9‡4`,ƒ‡4À‘ 5‡9‡9`,‹‡9À‘ x‡9‡4À’4 €£”a`t`,…‡4À’4 a`,`,ëI‡B"‡K‡FÀ’ j‡N`,"a``‡Z‡UÀ’ j‡]`,#a``>‡b‡xB‡j?I‡~‡‡‡‚À’ j‡Š`,$a``>‡’ˆ:=}‡¡‚‡šÀ‹‡¢"'\€‡âÀox‡ðƒ‡êÀ‘ ]”a`t`,ìa`\=އýÀ‘ª)>ˆAˆ=ŽˆIÀ‘ªˆ[ˆVÀ’ jˆ^`,%a``Nˆ‰ˆ”^`,xˆ–”€Åa`,”Nˆ¢ˆ°_`,xˆ²”€Åa`,”ACˆºxˆÇƒˆÁÀ‘ €…vˆÐ€ˆÉÀo€¢`,êa`t`v>ˆØŠx=ˆàÀ’ xˆí€ˆçÀob5ˆóˆî`,ƒˆîÀ‘ 5ˆóˆó`,‹ˆóÀ‘ xˆóˆîÀ”; €£”a`t`,…ˆîÀ”; a`,`,ëIˆþ"‰‰À’ j‰ `,$a``x‰#‰À‘΀…“a`t`v>‰(‰T=‰2À‘Îx‰Iƒ‰CÀ‘ ]”a`t`,ìI‰["‰d‰_À’ j‰g`,"a``‰s‰nÀ’ j‰v`,#a``>‰{‰«=‰…À‘ò x‰‘ƒ‰‹À‘ ]”a`t`,ìB‰žI‰²""‰»‰¶À’ j‰¾`,&a``x‰Ö‰ËÀ“š €…“a`t`vx‰ë‰ÝÀ“¾ €…“a`t`v>‰ðŠ=‰úÀ“š xŠ ƒŠÀ‘ ]”a`t`,ìIŠ"Š(Š#À’ jŠ+`,%a``xŠBŠ4À“¾ €…“a`t`v>ŠGŠr=ŠQÀ“¾ xŠgƒŠaÀ‘ ]”a`t`,ì?IŠ~†Š‚À‘ªBŠŽ?IŠœxНŠ À‘΀…“a`t`v>Š´‹'=}ŠÃ‚мÀ‹ŠÏ"'`€ŠþÀox‹ ƒ‹À‘ ]”a`t`,ìa`\B‹?N‹1‹=c`;‹FTÀo‡‹\À‘¹‹cÀ‘ÎN‹|‹‰€­`,‹‹‹œÀ—: I‹®x‹¿‹²À—g€®“a`t`Š>‹ÅŒM=}‹Ô‚‹ÍÀ‹‹Õ"'€¯€ŒÀoxŒ'‡Œ!À‘¹€£Œ)À—ga`t`,…a`\BŒ??IŒSxŒbŒWÀ“š €®“a`t`Š>ŒhŒö=}Œw‚ŒpÀ‹Œx"'a€ŒÄÀoŒÌÀ“š a`\=ŒàÀ‘ò ŒæÀ“š IŒýxÀ“¾ €®“a`t`Š>¬=}$‚À‹%"'b€tÀo|À“¾ a`\=“À‘ò ™À“¾ ?N¶Ãc`;Ìî€ÚÀoxñâÀ‘΀£”a`t`,…öÀ‘ò NŽd` K>ŽŽT=Ž%À™8Ž;ÏŽAÀ˜îŽV`WŽp€ù`W>Žs޾=}Ž‚‚Ž{À‹Ž #Ž¥À™oa`\BްNŽÈŽÕl`!ŽØ ŽèÀ™8=ŽþÀ™8xÀ?(À™8a` ` GI>xRBÀ™8<'=a`;`D>gø=}v‚oÀ‹w"'e€ÆÀoxÝÎÀ‘΀£”a`t`,…a`\Bê?N`;v À™8`;II#!x-(Àš@'Aa`;`J><’=DÀšxIDÀš€£'Aa`;`;Œ=WÀ™8xyiÀ™8€´‡Àš^ €µ`;€¶`;`;€·]^`;€¸`,€¹`;€º]a`;[€©`;€»`;` ?I˜x©…œÀ‘6€²À—: a``~>À‘I=}Ï‚ÈÀ‹Ð"'f€‘$Ào‡‘,À‘¹a`\B‘;?N‘S‘[1` ‘]À™8I‘rx‘{‘vÀš@'ga`;`J>‘Ž’==‘âÀ›ãx’‘öÀ™8€´x’’Àš€¡“x’2v’+’&Àš€¢`,„]—a`t`,ì^`,`,`;†^ €µ`;€¶`;`;€·]^`;€¸`,€¹`;€º]a`;[€©`;€»`;` ?N’G’O=`v’_’hÀ—: ’uÀ›ã’~À™8’—€ó+’¯À™°4’½’½“e’¾O`\>’Å“dI’Í%’×’ÑÀD`P>’é“7=}’ú‚’óÀ‹’û"&“ v““ÀD`PM[V`;€“'Àoa`\>“>“^=}“O‚“HÀ‹“PÀDa`\I“l!“x“pÀœú>““É=x“’„“‰À‘€’“–Àœú`va`9\¢=x“³…“¦À‘6€’“·À—: a`;`?J“Ñ“Øi”„“ïÀ‘+‚“ÿÀ‹€ö–Å–Êœ!AF–Ïœ!–Û^``–ñ`%—Y` j`—J`;j`\>—œ!I—""!—.‚—&Àž™!v—B—:Àž™` 4`ï>—N— =0—T—Z—uÀž™` 'Y'h?I—¥!—±ƒ—©Àž«>—º˜{N—Ä—Êi]f`;x—Ô—ÌÀž«`;j'€ža` ]f`;ðI—åv—ôv—ï„—éÀŸ+€ü`;°R`ñ=x˜„—ýÀŸ+ka`;ò?>N˜-}]k`;v˜-„˜-ÀŸ+]k`;mEx˜-…ÀŸ²€€a`o>N˜l`;v˜4…ÀŸ²€‚`;q>˜4˜w=x˜C€˜<Àž‚F'ma`\Ú=x˜]€˜VÀž‚n†˜eÀŸÿ^`\ó>˜‚˜ý=x˜€˜ˆÀž‚F'oa`\Ú=x˜Î€˜ÇÀž‚F˜Ýöa`\Ú=x˜ð€˜éÀž‚n^`\ó>N™}]k`9v™v™™ÀžV]^`9*]k`9mEx™„À å€€a`o>N™ =`9v™&„À å€‚`9q>™&œ N™0™<c`;v™F…™>À¡?L`;=N™T™X€ú` v™b…™ZÀ¡?j` ?I™“!™˜†™«À¡b>™¹š2=0™Á™Ç™íÀž'$š+'p†šÀ¡b'q?Iš8šGvš@‡š<À¡€©`;÷'=a``>>šUšÔ=0š]šcš‰Àž'$šÍ'r‡šÉÀ¡?=xšá€šÚÀž‚F†šçÀ¡ba`\Ú=x›€šùÀž‚F'sa`\ÚI›Q!›]‚›UÀž™>›f›–=›nÀ¡u››t ‡›‚À¡›‡Àž™` ?I›œ!x›ªv›¥‡›¡À¡`;I@'Aa`;`J>›¹›î=›ÁÀ¡x›Ë‡›ÇÀ¡€´x›âv›Ý‡›ÙÀ¡`;I€£'Aa`;`;Œ^ €µ`;€¶`;`;€·]^`;€¸`,€¹`;€º]a`;[€©`;€»`;` ?=x›û€›ôÀž‚F‡œÀ¡a`\Ú=xœ€œ Àž‚n^`\ó£Û2Tžf£Û €÷t : €ú Ò‚€†u€÷`;jî`;'€û ŸPŸZ€†v`,jŸV`,#€ü ŸŸš€†w`,jŸ–`,"€ý Ÿ¼ŸÉ€†x`,jŸÅ`,(€þ ŸéŸõ€†y`,jŸñ`,%€ÿ    €†z`,j `,  @ M€†{`,j I`,$  m }€†|`,j y`,&   «€†}`,j §`,  ‚¼‚Áƒ A~‚Óƒ ‚Û)`;`>‚ムJ‚çxƒ‚ÿÀ¥#€…“a`t`v „y„}…ñA„…ñ„•)`;`,>„…ñN„ä„ë€`,“E„ò„û„ý€í`,“x…‚…À¥²€…v… €…À¥†€¢`,„a`t`vŠ…À¥²x…‚…À¥²€£”a`t`,…>……¹N…$…&`,x…/€…(À¥†€ã‚…:À¥²a`,`,¤I…B"x…Hƒ…FÀ¦%€†7a`t`wx…|x…nj…R`;'€ãƒ…yÀ¦%a`,`,¤€çj…`,(a`t`¥>…‡…J…‚…–À¥²?=‰…£À¥ x…ª…£À¥ €£x…¯ƒ…­À¦%€Âj…±`,a`,`,’a`t`,…I…½…È…ÁÀ¥ “a``J…Îv…Ü€…ÕÀ¥†€¢`,„?J…æx…픀Åa`,” †Ó†ÚsA‚†îs†óf` ‡L`;`;>‡ s I‡!‡&v‡€‡À§–€©`;÷'=a``>>‡4‡†=0‡:‡@€‡[À§–‡gÀ§¡'ƒ?I‡Šv‡™€‡ŽÀ§–„`ø>‡§ˆ=0‡­‡³€‡×À§–‡ãÀ§¡'…?Iˆvˆ)€ˆÀ§–€¥`‡>ˆ3ˆÝ=0ˆsˆy€ˆÀ§–ˆ©À§¡'†?Iˆávˆð€ˆåÀ§–€¦`ˆ>ˆýŠ=0ŠŠ€Š>À§–ŠJÀ§¡'‡?IŠ…xŠ™vŠ”€Š‰À§–`;I€Ò'A^` `,`¡>Šª‹=0аж€ŠÚÀ§–ŠæÀ§¡'ˆ?N‹!‹,‰`,x‹>v‹9€‹.À§–`;IŠ'A^` `,`,ùI‹N‹]‚‹RÀ©x‹`”€Åa`,”a``>‹d‹ë=0‹j‹p€‹‹À§–‹—À§¡'‹?N‹ó‹ÿc`;xŒvŒ €ŒÀ§–`;I€¡“‚ŒÀ©^`,`,`;†NŒ1Œ:Œ`,Œ<ƒŒMÀ©²IŒ]xŒj„ŒaÀ©ü€®“a`t`Š>Œp[IŒvvŒ†ƒŒzÀ©²R`ñ>ŒŒü=0Œ—Œ€ŒÃÀ§–ŒÏÀ§¡'?I„À©üvƒÀ©²€¢`,„a``>&­=0.4€OÀ§–[À§¡'Ž?@xĺÀ©ü€…vуÅÀ©²€¢`,„a`t`vº×Nâî`,xüƒðÀ©²€ã„ŽÀ©üa`,`,¤NŽŽ"`;xŽ)'‘€£xŽIxŽ7…Ž+À« ’7a`,`;ú“—'”^`,`;`;ûa`;`;ŒIŽ^"xŽn…ŽbÀ« €®7 a`t`ŠxŽ……ŽyÀ« €ç7~a`t`¥>ŽŽŽë=ŽŽ´À«A$Žå'€‘xŽÍƒŽÂÀ©²b„ŽÎÀ©üa`,`;ü'•†ŽÜÀ«A'–?=0ŽñŽ÷€À§–'À§¡$V'—†NÀ«A?J_ƒfÀ©²  üA˜6ü;€ú` `>@üIDvL€HÀ¬”€¥`‡JV*?Ifvn€jÀ¬”€¦`ˆJ{*?I‹!v”€À¬”€³`‹JŸ*?N³¸`;v¾€ºÀ¬”`;IIÆ!xÐËÀ­@'Aa`;`JJß*?Jï) ‘5‘:’-A™‘E’-‘Jš` ‘V` `>‘\’-@!v‘o€‘hÀ­q€¦`ˆ‘g‘z@!v‘Ž€‘‡À­q€¥`‡‘†‘–@!v‘¨‘£À­}€¥`‡‘¢‘°@!v‘‘½À­}€¦`ˆ‘¼‘Í@x‘åv‘à€‘ÙÀ­q`;I@'Aa`;`J‘Ù‘òJ‘÷x’x’‘þÀ­}ua`;‰€Òx’ €’À­qua`;‰^` `,`¡ ’Á’Å“¥A›’Û“¥’æB]f`,`,>’í“¥E’ñ’ú’ü€í`,“x““À®Í€…v“ €“À®¬€¢`,êa`t`v‰“À®Íx““À®Í€£”a`t`,…>““–N“"“'€â`,x“.€“)À®¬b“/À®Ía`,`,ëI“7"""!“@‚“;À¯@7 a``!“P‚“KÀ¯@7 a``!“`‚“[À¯@7 a``!“p‚“kÀ¯@7 a``>“y“’J“‚“ˆÀ¯@?J“šx“¡”€Åa`,” “å“ì”UAœ“ù”U”`;`;>””UI” "v”€”À°0R`ñx”$€”À°0@'Aa`;`JJ”3€”:À°0?J”Bx”N€”IÀ°0€£'Aa`;`;Œ •x•}•ÕA•Œ•Õ•‘€ú` `J•""v•¡€•À°Ð€³`‹v•²€•®À°Ð„`øv•Æ€•ÂÀ°Ð`ý ˜J˜OžóAž˜\žó˜b€ú` ˜lY` ` >˜užóI˜y˜…˜}À±OJ˜Ž€˜•À±C?@v˜«˜£À±O` 4`˜µI˜º"v˜Ãu˜Á€˜¾À±C€¥`‡v˜Ó˜ÏÀ±C` €¦`ˆ>˜à™Æ=ˆ˜æÀ±C˜ì%€©v™™À±C` €©`;÷€»#v™#™À±C` „`øv™6™2À±C` €»`;þ+`;€¶#v™Y™UÀ±C` „`øv™l™hÀ±C` €¶`;ÿ+`;€¸#v™‹™‡À±C` „`øv™ž™šÀ±C` €¸`,‚+`,v™½™¹À±C` `;I?Iš!vššÀ±C` 4`ïJš'š.À±C` ?Iš6!šIvšBš:À±O` €©`;÷všPšLÀ±C` €©`;÷a``>>šXšlJš^šeÀ±C` ?Iš¿!šÔvšÇšÃÀ±C` „`øvšßš×À±O` „`øa``çJšíšôÀ±C` ?Išûv›šÿÀ±C` „`ø>››½I›""!›(v››À±C` €»`;þv›3›+À±O` €»`;þa``>!›^x›Pv›K›GÀ±C` €¶`;ÿŸa`;‚x›nv›i›aÀ±O` €¶`;ÿŸa`;‚a``>!›v›‹›‡À±C` €¸`,‚v›››“À±O` €¸`,‚a``>›¡›¹J›©›°À±C` ??=‰›ÂÀ±Ox›Ô›ÌÀ±O`  a` ‚N›ë›ð¡]f`;RN›ò]f`;›òh`;v›þ›öÀ±O` €·]f`;¯‚›òÀµDIœvœ‚œÀµ/¢`‚=xœ)‚œ$Àµ/ka`;ò?=ˆœ9À±CxœCœ?À±C`  a` ‚NœZœa£]f`;RNœc]f`;œch`;vœkœgÀ±C` €·]f`;¯ƒœcÀµüIœ|"vœ‡ƒœ€Àµç¢`‚vœ¡vœœƒœ•Àµç€ü`;°R`ñ=xœ±ƒœªÀµçka`;ò?NœÅœË€ß`,“ACœÒ"xœß„œÙÀ¶˜€…vœæ‚œáÀµ/€¢`,êa`t`vxœö„œðÀ¶˜€…vœÿƒœøÀµç€¢`,êa`t`v>SI !x‚Àµ/b„À¶˜a`,`;ëx&ƒ Àµçb„'À¶˜a`,`;ëa``>>/BB7?=ŒHÀ¶˜xM„HÀ¶˜€£”a`t`,…IWa„[À¶˜vi‚dÀµ/€¢`,êa``>qïIw„{À¶˜v‹ƒ„Àµç€¢`,êa``>“·J›¢%'¤?J½Ä%xáxÕƒÎÀµç¥„ÚÀ¶˜a`,]^`;‚¦'A^`;`;‚Iöxž„úÀ¶˜€†“a`t`w>žžÖNžž§`‚ž‚Ež,ž5ž7¨`,xžEvž>‚ž9Àµ/€¢`,ê]„žGÀ¶˜a`t`,ìxžP†žNÀ¸Ê€†“a`t`wŽžWÀ¸ÊxžU†žWÀ¸Ê]”a`t`,ì>žZž{=xži…žbÀ¸°F'©a`\‚ =xžˆ…žÀ¸°ªxž˜ƒž‘Àµç¥„žÀ¶˜a`,]^`;‚'A^]^[`;\‚ Jž¯ž¶%xžÇ…žÀÀ¸°ua`;‚ >žÝžñJžãžêÀ±C`  º¤¥¥j§z¬x­U®°°´±'º  « Wi „—‚íA¤‚í©€ú` ]`!`!>N(]&`!´(`!N)`*N*]*`!N+a[[N,a``+[N-`,“N.[N/[N€õ[O—0^[[`+[¤‚í1[2[3[[K>A>I¸xÀ€¼Àº‹<'a`;`D>NÜá`讀ðÀº‹K>M‚ 5[‚ 4x‚‚À»—€øa]`!¬„Àºå…ÀºñÀ»+ +=‹‚ÀºÕ‚9`!À»K B‚-`‚4I`>=‹‚?ÀºÕ+B?I‚X"x‚`€‚\Àº‹<'¬a`;`Dx‚x€‚tÀº‹<'­a`;`D>=‹‚‘ÀºÕ‚˜€‚¡Àº‹B?=0‚­‚³‚$‚ê'®€‚æÀº‹=?Àº¬ƒÀºÕ‚ÀºÉJ‚í[:[;`+>=@Àº¬À¼ôÀ¼ü‚ÀºÉ=ŒÀºåAÀ»+ =ÀºñBÀ»+ =¤À»+ a[=ŠÀºÉ)JÀº¬ ‚ðƒ†A¯ ƒ †ƒ€ú` ]`!`!>N(]&`!ƒ(`!N)`*N*]*`!N+a[[N,a``+[N-`,“N.[N/[Oƒ0^[[`+[ƒ †1[2[3[[K>A>@"xƒ*€ƒ&À½<'¬a`;`DxƒB€ƒ>À½<'­a`;`Dƒ&ƒSNƒ\ƒc°`‚ƒe‚Mƒƒ5[ƒƒ4xƒƒ‰À¾Ä ±€ƒ—À½a` ]`‚‚„À½÷…À¾À¾4 +Nƒyƒ²`‚ƒ9`‚À¾T Mƒ®5[ƒ®4xƒ¼ƒ´À¿4 a]`‚‚„À½÷…À¾À¾4 +Nƒ£ƒ¬³`‚ƒ¼9`‚À¾T IƒÇ!ƒßvƒÔƒËÀ¿¥´`,‚jƒí`,)a``>=‹ƒ÷À½ç+B?M„5[„4x„,„#À¿¥µa]]f]f`,‚„À½÷…À¾À¾4 +N„„¶]f]f`,„,9]f]f`,À¾T N„<„H·`,“I„O„gv„`„SÀÀd€¢`,ê”a``>N„w„|¸]f`,x„Š„~ÀÀdb“a`,]f`,ëI„“%„œ„—ÀÀÙ`!>=‹„²À½ç„¹ÀÀÙ`!B??>N„Ü}]k]f`,v„Ü„ÜÀÀd]k]f`,mEx„ÜÀÁI€€a`o>N„Ô¹]f`,v„êÀÁI€‚]f`,q>=„ðÀÀ›x„ü„ðÀÀ›€£v…„ÿÀÁ¤€¢`,êa`t`,…N……€¾`!…‚ …)ÀÀ›N…=…DS`,“>N…p}]k`!v…p&…p…cÀÀd]^`!]k`!mEx…pÀÂG€€a`o>N…Tº`!v…ˆÀÂG€‚`!q>=x…•…ŽÀ»…žÀÂ5x…­…¦ÀÂ5€£v…»…¯ÀÂ¥€¢`,êa`t`,……ÃÀÂ¥^`,`,]^`,`,\‚!=…ÕÀÂ5x…Ü…ÕÀÂ5€£v…ë…ßÀÂ¥€¢`,êa`t`,…=‹…ùÀ½ç†ÀÂB=?À½¾ƒÀ½ç‚À½ÛJ†[:[;`+>=@À½¾ÀÃà ÀÃË‚À½Û=ŒÀ½÷AÀ¾4 =À¾BÀ¾4 =ƒ À¾4 a[=ŠÀ½Û)JÀ½¾ †Ë†Ò‡¨A¼†Ú‡¨†â`;`;>†è‡¨N†ð†ú½`;‡‚$N‡‡(¾`,x‡/€‡*ÀÄj¿‡;Àă^` `,`,‚%I‡Ix‡[‚‡MÀÄ–€…“a`t`vJ‡`€‡gÀÄj?J‡ox‡{€‡vÀÄj€¡x‡“‚‡…ÀÄ–€£v‡Ÿ‡•Àă€¢`,„a`t`,…^`,`,`;† ˆuˆ|‰?AÀˆƒ‰?ˆ‹`;`;>ˆ‘‰?Nˆ™ˆ£½`;ˆ®‚$NˆÃˆÑ¾`,xˆØ€ˆÓÀÅ€¿ˆäÀÅ™^` `,`,‚%Iˆòx‰‚ˆöÀŬ€…“a`t`vJ‰ '?J‰x‰"€‰ÀÅ€€¡“‚‰/ÀŬ^`,`,`;† ‰Ð‰×‹-A‰ß‹-‰çÁ`;‰õÂ`;ŠÃ`;j``;>Š ‹-NŠŠ½`;Š*‚$NŠ?ŠJÄ`;#xŠR€ŠLÀÆd@ƒŠ[ÀÆa`;`J'ƒŠmÀÆ`;IŠzŠ„‚Š~ÀÆ|>ŠŠ·JŠ“$г€ŠœÀÆd„Š¢ÀÆ°Š­ÀÆp?NŠ¿ŠÊÅ`;#xŠÒŠÌÀÆp@ƒŠÛÀÆa`;`J'ƒŠíÀÆ`;JŠú$‹+€‹ÀÆd„‹ Àư‹ÀÆp…‹ÀÇ$‹%ÀÆ|`; ‹Ï‹ÖAÆ‹á‹óÇ]^`;`;>‹úNŒŒ §`‚Œ ‚NŒ!Œ+½`;'>NŒD}]k`;vŒD€ŒDÀdz]k`;mExŒDƒÀÇý€€a`o>NŒ<¸`;vŒKƒÀÇý€‚`;q>ŒKŒå=5ŒQŒQ`‚ŒQÀÇÒR=xŒ`…ŒQÀÈsF‚ŒfÀÇéa`\‚ =xŒy…ŒQÀÈsF„ŒÀÈJa`\‚ …ŒQÀÈs=ŠŒŠÀÇé#xŒ£„ŒžÀÈJ@Œµ‚$a`;`J'ŒÔ‚$`;JŒéxŒ÷ŒðÀÇÒua`;‚  É0ºmºp½ÄNÅdÆIÇ—É0 cfile:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/package_config.dart¡Ü// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// A package configuration is a way to assign file paths to package URIs, /// and vice-versa. /// /// This package provides functionality to find, read and write package /// configurations in the [specified format](https://github.com/dart-lang/language/blob/master/accepted/future-releases/language-versioning/package-config-file-v2.md). library package_config.package_config; import 'dart:io' show File, Directory; import 'dart:typed_data' show Uint8List; import 'src/discovery.dart' as discover; import 'src/errors.dart' show throwError; import 'src/package_config.dart'; import 'src/package_config_io.dart'; export 'package_config_types.dart'; /// Reads a specific package configuration file. /// /// The file must exist and be readable. /// It must be either a valid `package_config.json` file /// or a valid `.packages` file. /// It is considered a `package_config.json` file if its first character /// is a `{`. /// /// If the file is a `.packages` file (the file name is `.packages`) /// and [preferNewest] is true, the default, also checks if there is /// a `.dart_tool/package_config.json` file next /// to the original file, and if so, loads that instead. /// If [preferNewest] is set to false, a directly specified `.packages` file /// is loaded even if there is an available `package_config.json` file. /// The caller can determine this from the [PackageConfig.version] /// being 1 and look for a `package_config.json` file themselves. /// /// If [onError] is provided, the configuration file parsing will report errors /// by calling that function, and then try to recover. /// The returned package configuration is a *best effort* attempt to create /// a valid configuration from the invalid configuration file. /// If no [onError] is provided, errors are thrown immediately. Future loadPackageConfig(File file, {bool preferNewest = true, void Function(Object error)? onError}) => readAnyConfigFile(file, preferNewest, onError ?? throwError); /// Reads a specific package configuration URI. /// /// The file of the URI must exist and be readable. /// It must be either a valid `package_config.json` file /// or a valid `.packages` file. /// It is considered a `package_config.json` file if its first /// non-whitespace character is a `{`. /// /// If [preferNewest] is true, the default, and the file is a `.packages` file, /// as determined by its file name being `.packages`, /// first checks if there is a `.dart_tool/package_config.json` file /// next to the original file, and if so, loads that instead. /// The [file] *must not* be a `package:` URI. /// If [preferNewest] is set to false, a directly specified `.packages` file /// is loaded even if there is an available `package_config.json` file. /// The caller can determine this from the [PackageConfig.version] /// being 1 and look for a `package_config.json` file themselves. /// /// If [loader] is provided, URIs are loaded using that function. /// The future returned by the loader must complete with a [Uint8List] /// containing the entire file content encoded as UTF-8, /// or with `null` if the file does not exist. /// The loader may throw at its own discretion, for situations where /// it determines that an error might be need user attention, /// but it is always allowed to return `null`. /// This function makes no attempt to catch such errors. /// As such, it may throw any error that [loader] throws. /// /// If no [loader] is supplied, a default loader is used which /// only accepts `file:`, `http:` and `https:` URIs, /// and which uses the platform file system and HTTP requests to /// fetch file content. The default loader never throws because /// of an I/O issue, as long as the location URIs are valid. /// As such, it does not distinguish between a file not existing, /// and it being temporarily locked or unreachable. /// /// If [onError] is provided, the configuration file parsing will report errors /// by calling that function, and then try to recover. /// The returned package configuration is a *best effort* attempt to create /// a valid configuration from the invalid configuration file. /// If no [onError] is provided, errors are thrown immediately. Future loadPackageConfigUri(Uri file, {Future Function(Uri uri)? loader, bool preferNewest = true, void Function(Object error)? onError}) => readAnyConfigFileUri(file, loader, onError ?? throwError, preferNewest); /// Finds a package configuration relative to [directory]. /// /// If [directory] contains a package configuration, /// either a `.dart_tool/package_config.json` file or, /// if not, a `.packages`, then that file is loaded. /// /// If no file is found in the current directory, /// then the parent directories are checked recursively, /// all the way to the root directory, to check if those contains /// a package configuration. /// If [recurse] is set to [false], this parent directory check is not /// performed. /// /// If [onError] is provided, the configuration file parsing will report errors /// by calling that function, and then try to recover. /// The returned package configuration is a *best effort* attempt to create /// a valid configuration from the invalid configuration file. /// If no [onError] is provided, errors are thrown immediately. /// /// Returns `null` if no configuration file is found. Future findPackageConfig(Directory directory, {bool recurse = true, void Function(Object error)? onError}) => discover.findPackageConfig(directory, recurse, onError ?? throwError); /// Finds a package configuration relative to [location]. /// /// If [location] contains a package configuration, /// either a `.dart_tool/package_config.json` file or, /// if not, a `.packages`, then that file is loaded. /// The [location] URI *must not* be a `package:` URI. /// It should be a hierarchical URI which is supported /// by [loader]. /// /// If no file is found in the current directory, /// then the parent directories are checked recursively, /// all the way to the root directory, to check if those contains /// a package configuration. /// If [recurse] is set to [false], this parent directory check is not /// performed. /// /// If [loader] is provided, URIs are loaded using that function. /// The future returned by the loader must complete with a [Uint8List] /// containing the entire file content, /// or with `null` if the file does not exist. /// The loader may throw at its own discretion, for situations where /// it determines that an error might be need user attention, /// but it is always allowed to return `null`. /// This function makes no attempt to catch such errors. /// /// If no [loader] is supplied, a default loader is used which /// only accepts `file:`, `http:` and `https:` URIs, /// and which uses the platform file system and HTTP requests to /// fetch file content. The default loader never throws because /// of an I/O issue, as long as the location URIs are valid. /// As such, it does not distinguish between a file not existing, /// and it being temporarily locked or unreachable. /// /// If [onError] is provided, the configuration file parsing will report errors /// by calling that function, and then try to recover. /// The returned package configuration is a *best effort* attempt to create /// a valid configuration from the invalid configuration file. /// If no [onError] is provided, errors are thrown immediately. /// /// Returns `null` if no configuration file is found. Future findPackageConfigUri(Uri location, {bool recurse = true, Future Function(Uri uri)? loader, void Function(Object error)? onError}) => discover.findPackageConfigUri( location, loader, onError ?? throwError, recurse); /// Writes a package configuration to the provided directory. /// /// Writes `.dart_tool/package_config.json` relative to [directory]. /// If the `.dart_tool/` directory does not exist, it is created. /// If it cannot be created, this operation fails. /// /// Also writes a `.packages` file in [directory]. /// This will stop happening eventually as the `.packages` file becomes /// discontinued. /// A comment is generated if `[PackageConfig.extraData]` contains a /// `"generator"` entry. Future savePackageConfig( PackageConfig configuration, Directory directory) => writePackageConfigJsonFile(configuration, directory); €µNN<KH€¨''))*"%$1)9!IEE19MHCBP7L?@3MB049!?'P6E>/MHCBBG9/E>/9:?6A@=B4P7L?@57"2M;57529BGP7L?@6>HK:4757729BGBG(/E>/9?6A@=B4P7L?@6:62#;>EB33HE =:*package:package_config/package_config.dartifile:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/package_config_types.dart‚þ// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// A package configuration is a way to assign file paths to package URIs, /// and vice-versa. /// /// {@canonicalFor package_config.InvalidLanguageVersion} /// {@canonicalFor package_config.LanguageVersion} /// {@canonicalFor package_config.Package} /// {@canonicalFor package_config.PackageConfig} /// {@canonicalFor errors.PackageConfigError} library package_config.package_config_types; export 'src/package_config.dart' show PackageConfig, Package, LanguageVersion, InvalidLanguageVersion; export 'src/errors.dart' show PackageConfigError; NN<K:3+1.-!J20package:package_config/package_config_types.dartbfile:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/src/discovery.dart’è// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:io'; import 'dart:typed_data'; import 'package_config_io.dart'; import 'errors.dart'; import 'package_config_impl.dart'; import 'package_config_json.dart'; import 'packages_file.dart' as packages_file; import 'util_io.dart' show defaultLoader, pathJoin; final Uri packageConfigJsonPath = Uri(path: '.dart_tool/package_config.json'); final Uri dotPackagesPath = Uri(path: '.packages'); final Uri currentPath = Uri(path: '.'); final Uri parentPath = Uri(path: '..'); /// Discover the package configuration for a Dart script. /// /// The [baseDirectory] points to the directory of the Dart script. /// A package resolution strategy is found by going through the following steps, /// and stopping when something is found. /// /// * Check if a `.dart_tool/package_config.json` file exists in the directory. /// * Check if a `.packages` file exists in the directory. /// * Repeat these checks for the parent directories until reaching the /// root directory if [recursive] is true. /// /// If any of these tests succeed, a `PackageConfig` class is returned. /// Returns `null` if no configuration was found. If a configuration /// is needed, then the caller can supply [PackageConfig.empty]. Future findPackageConfig(Directory baseDirectory, bool recursive, void Function(Object error) onError) async { var directory = baseDirectory; if (!directory.isAbsolute) directory = directory.absolute; if (!await directory.exists()) { return null; } do { // Check for $cwd/.packages var packageConfig = await findPackagConfigInDirectory(directory, onError); if (packageConfig != null) return packageConfig; if (!recursive) break; // Check in parent directories. var parentDirectory = directory.parent; if (parentDirectory.path == directory.path) break; directory = parentDirectory; } while (true); return null; } /// Similar to [findPackageConfig] but based on a URI. Future findPackageConfigUri( Uri location, Future Function(Uri uri)? loader, void Function(Object error) onError, bool recursive) async { if (location.isScheme('package')) { onError(PackageConfigArgumentError( location, 'location', 'Must not be a package: URI')); return null; } if (loader == null) { if (location.isScheme('file')) { return findPackageConfig( Directory.fromUri(location.resolveUri(currentPath)), recursive, onError); } loader = defaultLoader; } if (!location.path.endsWith('/')) location = location.resolveUri(currentPath); while (true) { var file = location.resolveUri(packageConfigJsonPath); var bytes = await loader(file); if (bytes != null) { return parsePackageConfigBytes(bytes, file, onError); } file = location.resolveUri(dotPackagesPath); bytes = await loader(file); if (bytes != null) { return packages_file.parse(bytes, file, onError); } if (!recursive) break; var parent = location.resolveUri(parentPath); if (parent == location) break; location = parent; } return null; } /// Finds a `.packages` or `.dart_tool/package_config.json` file in [directory]. /// /// Loads the file, if it is there, and returns the resulting [PackageConfig]. /// Returns `null` if the file isn't there. /// Reports a [FormatException] if a file is there but the content is not valid. /// If the file exists, but fails to be read, the file system error is reported. /// /// If [onError] is supplied, parsing errors are reported using that, and /// a best-effort attempt is made to return a package configuration. /// This may be the empty package configuration. Future findPackagConfigInDirectory( Directory directory, void Function(Object error) onError) async { var packageConfigFile = await checkForPackageConfigJsonFile(directory); if (packageConfigFile != null) { return await readPackageConfigJsonFile(packageConfigFile, onError); } packageConfigFile = await checkForDotPackagesFile(directory); if (packageConfigFile != null) { return await readDotPackagesFile(packageConfigFile, onError); } return null; } Future checkForPackageConfigJsonFile(Directory directory) async { assert(directory.isAbsolute); var file = File(pathJoin(directory.path, '.dart_tool', 'package_config.json')); if (await file.exists()) return file; return null; } Future checkForDotPackagesFile(Directory directory) async { var file = File(pathJoin(directory.path, '.packages')); if (await file.exists()) return file; return null; } €„NN<!##.4O4((:DQ*P;H-HEABA!=# O5$,7!7-2)&(>% ?Q;$<1 82#QO,QQJE14FJ#H@#BI K(C:()package:package_config/src/discovery.dart_file:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/src/errors.dart„í// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// General superclass of most errors and exceptions thrown by this package. /// /// Only covers errors thrown while parsing package configuration files. /// Programming errors and I/O exceptions are not covered. abstract class PackageConfigError { PackageConfigError._(); } class PackageConfigArgumentError extends ArgumentError implements PackageConfigError { PackageConfigArgumentError(Object? value, String name, String message) : super.value(value, name, message); PackageConfigArgumentError.from(ArgumentError error) : super.value(error.invalidValue, error.name, error.message); } class PackageConfigFormatException extends FormatException implements PackageConfigError { PackageConfigFormatException(String message, Object? source, [int? offset]) : super(message, source, offset); PackageConfigFormatException.from(FormatException exception) : super(exception.message, exception.source, exception.offset); } /// The default `onError` handler. Never throwError(Object error) => throw error; "NN<MI;$7$I+7D;$N(?F#/&package:package_config/src/errors.dartgfile:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/src/package_config.dart¿÷// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:typed_data'; import 'errors.dart'; import 'package_config_impl.dart'; import 'package_config_json.dart'; /// A package configuration. /// /// Associates configuration data to packages and files in packages. /// /// More members may be added to this class in the future, /// so classes outside of this package must not implement [PackageConfig] /// or any subclass of it. abstract class PackageConfig { /// The largest configuration version currently recognized. static const int maxVersion = 2; /// An empty package configuration. /// /// A package configuration with no available packages. /// Is used as a default value where a package configuration /// is expected, but none have been specified or found. static const PackageConfig empty = SimplePackageConfig.empty(); /// Creats a package configuration with the provided available [packages]. /// /// The packages must be valid packages (valid package name, valid /// absolute directory URIs, valid language version, if any), /// and there must not be two packages with the same name. /// /// The package's root ([Package.rootUri]) and package-root /// ([Package.packageUriRoot]) paths must satisfy a number of constraints /// We say that one path (which we know ends with a `/` charater) /// is inside another path, if the latter path is a prefix of the former path, /// including the two paths being the same. /// /// * No package's root must be the same as another package's root. /// * The package-root of a package must be inside the pacakge's root. /// * If one package's package-root is inside another package's root, /// then the latter package's package root must not be inside the former /// package's root. (No getting between a package and its package root!) /// This also disallows a package's root being the same as another /// package's package root. /// /// If supplied, the [extraData] will be available as the /// [PackageConfig.extraData] of the created configuration. /// /// The version of the resulting configuration is always [maxVersion]. factory PackageConfig(Iterable packages, {Object? extraData}) => SimplePackageConfig(maxVersion, packages, extraData); /// Parses a package configuration file. /// /// The [bytes] must be an UTF-8 encoded JSON object /// containing a valid package configuration. /// /// The [baseUri] is used as the base for resolving relative /// URI references in the configuration file. If the configuration /// has been read from a file, the [baseUri] can be the URI of that /// file, or of the directory it occurs in. /// /// If [onError] is provided, errors found during parsing or building /// the configuration are reported by calling [onError] instead of /// throwing, and parser makes a *best effort* attempt to continue /// despite the error. The input must still be valid JSON. /// The result may be [PackageConfig.empty] if there is no way to /// extract useful information from the bytes. static PackageConfig parseBytes(Uint8List bytes, Uri baseUri, {void Function(Object error)? onError}) => parsePackageConfigBytes(bytes, baseUri, onError ?? throwError); /// Parses a package configuration file. /// /// The [configuration] must be a JSON object /// containing a valid package configuration. /// /// The [baseUri] is used as the base for resolving relative /// URI references in the configuration file. If the configuration /// has been read from a file, the [baseUri] can be the URI of that /// file, or of the directory it occurs in. /// /// If [onError] is provided, errors found during parsing or building /// the configuration are reported by calling [onError] instead of /// throwing, and parser makes a *best effort* attempt to continue /// despite the error. The input must still be valid JSON. /// The result may be [PackageConfig.empty] if there is no way to /// extract useful information from the bytes. static PackageConfig parseString(String configuration, Uri baseUri, {void Function(Object error)? onError}) => parsePackageConfigString(configuration, baseUri, onError ?? throwError); /// Parses the JSON data of a package configuration file. /// /// The [configuration] must be a JSON-like Dart data structure, /// like the one provided by parsing JSON text using `dart:convert`, /// containing a valid package configuration. /// /// The [baseUri] is used as the base for resolving relative /// URI references in the configuration file. If the configuration /// has been read from a file, the [baseUri] can be the URI of that /// file, or of the directory it occurs in. /// /// If [onError] is provided, errors found during parsing or building /// the configuration are reported by calling [onError] instead of /// throwing, and parser makes a *best effort* attempt to continue /// despite the error. The input must still be valid JSON. /// The result may be [PackageConfig.empty] if there is no way to /// extract useful information from the bytes. static PackageConfig parseJson(Object? jsonData, Uri baseUri, {void Function(Object error)? onError}) => parsePackageConfigJson(jsonData, baseUri, onError ?? throwError); /// Writes a configuration file for this configuration on [output]. /// /// If [baseUri] is provided, URI references in the generated file /// will be made relative to [baseUri] where possible. static void writeBytes(PackageConfig configuration, Sink output, [Uri? baseUri]) { writePackageConfigJsonUtf8(configuration, baseUri, output); } /// Writes a configuration JSON text for this configuration on [output]. /// /// If [baseUri] is provided, URI references in the generated file /// will be made relative to [baseUri] where possible. static void writeString(PackageConfig configuration, StringSink output, [Uri? baseUri]) { writePackageConfigJsonString(configuration, baseUri, output); } /// Converts a configuration to a JSON-like data structure. /// /// If [baseUri] is provided, URI references in the generated data /// will be made relative to [baseUri] where possible. static Map toJson(PackageConfig configuration, [Uri? baseUri]) => packageConfigToJson(configuration, baseUri); /// The configuration version number. /// /// Currently this is 1 or 2, where /// * Version one is the `.packages` file format and /// * Version two is the first `package_config.json` format. /// /// Instances of this class supports both, and the version /// is only useful for detecting which kind of file the configuration /// was read from. int get version; /// All the available packages of this configuration. /// /// No two of these packages have the same name, /// and no two [Package.root] directories overlap. Iterable get packages; /// Look up a package by name. /// /// Returns the [Package] fron [packages] with [packageName] as /// [Package.name]. Returns `null` if the package is not available in the /// current configuration. Package? operator [](String packageName); /// Provides the associated package for a specific [file] (or directory). /// /// Returns a [Package] which contains the [file]'s path, if any. /// That is, the [Package.rootUri] directory is a parent directory /// of the [file]'s location. /// /// Returns `null` if the file does not belong to any package. Package? packageOf(Uri file); /// Resolves a `package:` URI to a non-package URI /// /// The [packageUri] must be a valid package URI. That means: /// * A URI with `package` as scheme, /// * with no authority part (`package://...`), /// * with a path starting with a valid package name followed by a slash, and /// * with no query or fragment part. /// /// Throws an [ArgumentError] (which also implements [PackageConfigError]) /// if the package URI is not valid. /// /// Returns `null` if the package name of [packageUri] is not available /// in this package configuration. /// Returns the remaining path of the package URI resolved relative to the /// [Package.packageUriRoot] of the corresponding package. Uri? resolve(Uri packageUri); /// The package URI which resolves to [nonPackageUri]. /// /// The [nonPackageUri] must not have any query or fragment part, /// and it must not have `package` as scheme. /// Throws an [ArgumentError] (which also implements [PackageConfigError]) /// if the non-package URI is not valid. /// /// Returns a package URI which [resolve] will convert to [nonPackageUri], /// if any such URI exists. Returns `null` if no such package URI exists. Uri? toPackageUri(Uri nonPackageUri); /// Extra data associated with the package configuration. /// /// The data may be in any format, depending on who introduced it. /// The standard `package_config.json` file storage will only store /// JSON-like list/map data structures. Object? get extraData; } /// Configuration data for a single package. abstract class Package { /// Creates a package with the provided properties. /// /// The [name] must be a valid package name. /// The [root] must be an absolute directory URI, meaning an absolute URI /// with no query or fragment path and a path starting and ending with `/`. /// The [packageUriRoot], if provided, must be either an absolute /// directory URI or a relative URI reference which is then resolved /// relative to [root]. It must then also be a subdirectory of [root], /// or the same directory, and must end with `/`. /// If [languageVersion] is supplied, it must be a valid Dart language /// version, which means two decimal integer literals separated by a `.`, /// where the integer literals have no leading zeros unless they are /// a single zero digit. /// /// The [relativeRoot] controls whether the [root] is written as /// relative to the `package_config.json` file when the package /// configuration is written to a file. It defaults to being relative. /// /// If [extraData] is supplied, it will be available as the /// [Package.extraData] of the created package. factory Package(String name, Uri root, {Uri? packageUriRoot, LanguageVersion? languageVersion, Object? extraData, bool relativeRoot = true}) => SimplePackage.validate(name, root, packageUriRoot, languageVersion, extraData, relativeRoot, throwError)!; /// The package-name of the package. String get name; /// The location of the root of the package. /// /// Is always an absolute URI with no query or fragment parts, /// and with a path ending in `/`. /// /// All files in the [rootUri] directory are considered /// part of the package for purposes where that that matters. Uri get root; /// The root of the files available through `package:` URIs. /// /// A `package:` URI with [name] as the package name is /// resolved relative to this location. /// /// Is always an absolute URI with no query or fragment part /// with a path ending in `/`, /// and with a location which is a subdirectory /// of the [root], or the same as the [root]. Uri get packageUriRoot; /// The default language version associated with this package. /// /// Each package may have a default language version associated, /// which is the language version used to parse and compile /// Dart files in the package. /// A package version is defined by two non-negative numbers, /// the *major* and *minor* version numbers. /// /// A package may have no language version associated with it /// in the package configuration, in which case tools should /// use a default behavior for the package. LanguageVersion? get languageVersion; /// Extra data associated with the specific package. /// /// The data may be in any format, depending on who introduced it. /// The standard `package_config.json` file storage will only store /// JSON-like list/map data structures. Object? get extraData; /// Whether the [root] URI should be written as relative. /// /// When the configuration is written to a `package_config.json` /// file, the [root] URI can be either relative to the file /// location or absolute, controller by this value. bool get relativeRoot; } /// A language version. /// /// A language version is represented by two non-negative integers, /// the [major] and [minor] version numbers. /// /// If errors during parsing are handled using an `onError` handler, /// then an *invalid* language version may be represented by an /// [InvalidLanguageVersion] object. abstract class LanguageVersion implements Comparable { /// The maximal value allowed by [major] and [minor] values; static const int maxValue = 0x7FFFFFFF; factory LanguageVersion(int major, int minor) { RangeError.checkValueInInterval(major, 0, maxValue, 'major'); RangeError.checkValueInInterval(minor, 0, maxValue, 'major'); return SimpleLanguageVersion(major, minor, null); } /// Parses a language version string. /// /// A valid language version string has the form /// /// > *decimalNumber* `.` *decimalNumber* /// /// where a *decimalNumber* is a non-empty sequence of decimal digits /// with no unnecessary leading zeros (the decimal number only starts /// with a zero digit if that digit is the entire number). /// No spaces are allowed in the string. /// /// If the [source] is valid then it is parsed into a valid /// [LanguageVersion] object. /// If not, then the [onError] is called with a [FormatException]. /// If [onError] is not supplied, it defaults to throwing the exception. /// If the call does not throw, then an [InvalidLanguageVersion] is returned /// containing the original [source]. static LanguageVersion parse(String source, {void Function(Object error)? onError}) => parseLanguageVersion(source, onError ?? throwError); /// The major language version. /// /// A non-negative integer less than 231. /// /// The value is negative for objects representing *invalid* language /// versions ([InvalidLanguageVersion]). int get major; /// The minor language version. /// /// A non-negative integer less than 231. /// /// The value is negative for objects representing *invalid* language /// versions ([InvalidLanguageVersion]). int get minor; /// Compares language versions. /// /// Two language versions are considered equal if they have the /// same major and minor version numbers. /// /// A language version is greater then another if the former's major version /// is greater than the latter's major version, or if they have /// the same major version and the former's minor version is greater than /// the latter's. @override int compareTo(LanguageVersion other); /// Valid language versions with the same [major] and [minor] values are /// equal. /// /// Invalid language versions ([InvalidLanguageVersion]) are not equal to /// any other object. @override bool operator ==(Object other); @override int get hashCode; /// A string representation of the language version. /// /// A valid language version is represented as /// `"${version.major}.${version.minor}"`. @override String toString(); } /// An *invalid* language version. /// /// Stored in a [Package] when the orginal language version string /// was invalid and a `onError` handler was passed to the parser /// which did not throw on an error. abstract class InvalidLanguageVersion implements LanguageVersion { /// The value -1 for an invalid language version. @override int get major; /// The value -1 for an invalid language version. @override int get minor; /// An invalid language version is only equal to itself. @override bool operator ==(Object other); @override int get hashCode; /// The original invalid version string. @override String toString(); } ”NN<##E;J>#&:?:BME@=>LDQ.FIHMMG <>IL<+70?EF.HEE=D1@5F+00?EF.HEE=D1F5O<CG0?EF.HEE=D1@5HFE9N@KE9JB>E9B3(&7?=H835"!BL,LDE A 5@(2P(M'J%M= 9D0M+ML(<EF*-6/LNDGI4ILGCBI>2) ,(J1'/A%:@?:*?!20AC>!@/@?.(7EF*<C>6D-E@%H?*2BB6(3,HH=+> EKO(.5;"7H+"7H+"B,OBL (K L " 71- #CA%C4 4 ; " + .package:package_config/src/package_config.dartuOlfile:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/src/package_config_impl.dartÀL// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'errors.dart'; import 'package_config.dart'; import 'util.dart'; export 'package_config.dart'; // Implementations of the main data types exposed by the API of this package. class SimplePackageConfig implements PackageConfig { @override final int version; final Map _packages; final PackageTree _packageTree; @override final Object? extraData; factory SimplePackageConfig(int version, Iterable packages, [Object? extraData, void Function(Object error)? onError]) { onError ??= throwError; var validVersion = _validateVersion(version, onError); var sortedPackages = [...packages]..sort(_compareRoot); var packageTree = _validatePackages(packages, sortedPackages, onError); return SimplePackageConfig._(validVersion, packageTree, {for (var p in packageTree.allPackages) p.name: p}, extraData); } SimplePackageConfig._( this.version, this._packageTree, this._packages, this.extraData); /// Creates empty configuration. /// /// The empty configuration can be used in cases where no configuration is /// found, but code expects a non-null configuration. const SimplePackageConfig.empty() : version = 1, _packageTree = const EmptyPackageTree(), _packages = const {}, extraData = null; static int _validateVersion( int version, void Function(Object error) onError) { if (version < 0 || version > PackageConfig.maxVersion) { onError(PackageConfigArgumentError(version, 'version', 'Must be in the range 1 to ${PackageConfig.maxVersion}')); return 2; // The minimal version supporting a SimplePackageConfig. } return version; } static PackageTree _validatePackages(Iterable originalPackages, List packages, void Function(Object error) onError) { var packageNames = {}; var tree = MutablePackageTree(); for (var originalPackage in packages) { SimplePackage? package; if (originalPackage is! SimplePackage) { // SimplePackage validates these properties. package = SimplePackage.validate( originalPackage.name, originalPackage.root, originalPackage.packageUriRoot, originalPackage.languageVersion, originalPackage.extraData, originalPackage.relativeRoot, (error) { if (error is PackageConfigArgumentError) { onError(PackageConfigArgumentError(packages, 'packages', 'Package ${package!.name}: ${error.message}')); } else { onError(error); } }); if (package == null) continue; } else { package = originalPackage; } var name = package.name; if (packageNames.contains(name)) { onError(PackageConfigArgumentError( name, 'packages', "Duplicate package name '$name'")); continue; } packageNames.add(name); tree.add(0, package, (error) { if (error is ConflictException) { // There is a conflict with an existing package. var existingPackage = error.existingPackage; if (error.isRootConflict) { onError(PackageConfigArgumentError( originalPackages, 'packages', 'Packages ${package!.name} and ${existingPackage.name} ' 'have the same root directory: ${package.root}.\n')); } else { assert(error.isPackageRootConflict); // Package is inside the package URI root of the existing package. onError(PackageConfigArgumentError( originalPackages, 'packages', 'Package ${package!.name} is inside the package URI root of ' 'package ${existingPackage.name}.\n' '${existingPackage.name} URI root: ' '${existingPackage.packageUriRoot}\n' '${package.name} root: ${package.root}\n')); } } else { // Any other error. onError(error); } }); } return tree; } @override Iterable get packages => _packages.values; @override Package? operator [](String packageName) => _packages[packageName]; /// Provides the associated package for a specific [file] (or directory). /// /// Returns a [Package] which contains the [file]'s path. /// That is, the [Package.rootUri] directory is a parent directory /// of the [file]'s location. /// Returns `null` if the file does not belong to any package. @override Package? packageOf(Uri file) => _packageTree.packageOf(file); @override Uri? resolve(Uri packageUri) { var packageName = checkValidPackageUri(packageUri, 'packageUri'); return _packages[packageName]?.packageUriRoot.resolveUri( Uri(path: packageUri.path.substring(packageName.length + 1))); } @override Uri? toPackageUri(Uri nonPackageUri) { if (nonPackageUri.isScheme('package')) { throw PackageConfigArgumentError( nonPackageUri, 'nonPackageUri', 'Must not be a package URI'); } if (nonPackageUri.hasQuery || nonPackageUri.hasFragment) { throw PackageConfigArgumentError(nonPackageUri, 'nonPackageUri', 'Must not have query or fragment part'); } // Find package that file belongs to. var package = _packageTree.packageOf(nonPackageUri); if (package == null) return null; // Check if it is inside the package URI root. var path = nonPackageUri.toString(); var root = package.packageUriRoot.toString(); if (_beginsWith(package.root.toString().length, root, path)) { var rest = path.substring(root.length); return Uri(scheme: 'package', path: '${package.name}/$rest'); } return null; } } /// Configuration data for a single package. class SimplePackage implements Package { @override final String name; @override final Uri root; @override final Uri packageUriRoot; @override final LanguageVersion? languageVersion; @override final Object? extraData; @override final bool relativeRoot; SimplePackage._(this.name, this.root, this.packageUriRoot, this.languageVersion, this.extraData, this.relativeRoot); /// Creates a [SimplePackage] with the provided content. /// /// The provided arguments must be valid. /// /// If the arguments are invalid then the error is reported by /// calling [onError], then the erroneous entry is ignored. /// /// If [onError] is provided, the user is expected to be able to handle /// errors themselves. An invalid [languageVersion] string /// will be replaced with the string `"invalid"`. This allows /// users to detect the difference between an absent version and /// an invalid one. /// /// Returns `null` if the input is invalid and an approximately valid package /// cannot be salvaged from the input. static SimplePackage? validate( String name, Uri root, Uri? packageUriRoot, LanguageVersion? languageVersion, Object? extraData, bool relativeRoot, void Function(Object error) onError) { var fatalError = false; var invalidIndex = checkPackageName(name); if (invalidIndex >= 0) { onError(PackageConfigFormatException( 'Not a valid package name', name, invalidIndex)); fatalError = true; } if (root.isScheme('package')) { onError(PackageConfigArgumentError( '$root', 'root', 'Must not be a package URI')); fatalError = true; } else if (!isAbsoluteDirectoryUri(root)) { onError(PackageConfigArgumentError( '$root', 'root', 'In package $name: Not an absolute URI with no query or fragment ' 'with a path ending in /')); // Try to recover. If the URI has a scheme, // then ensure that the path ends with `/`. if (!root.hasScheme) { fatalError = true; } else if (!root.path.endsWith('/')) { root = root.replace(path: root.path + '/'); } } if (packageUriRoot == null) { packageUriRoot = root; } else if (!fatalError) { packageUriRoot = root.resolveUri(packageUriRoot); if (!isAbsoluteDirectoryUri(packageUriRoot)) { onError(PackageConfigArgumentError( packageUriRoot, 'packageUriRoot', 'In package $name: Not an absolute URI with no query or fragment ' 'with a path ending in /')); packageUriRoot = root; } else if (!isUriPrefix(root, packageUriRoot)) { onError(PackageConfigArgumentError(packageUriRoot, 'packageUriRoot', 'The package URI root is not below the package root')); packageUriRoot = root; } } if (fatalError) return null; return SimplePackage._( name, root, packageUriRoot, languageVersion, extraData, relativeRoot); } } /// Checks whether [version] is a valid Dart language version string. /// /// The format is (as RegExp) `^(0|[1-9]\d+)\.(0|[1-9]\d+)$`. /// /// Reports a format exception on [onError] if not, or if the numbers /// are too large (at most 32-bit signed integers). LanguageVersion parseLanguageVersion( String? source, void Function(Object error) onError) { var index = 0; // Reads a positive decimal numeral. Returns the value of the numeral, // or a negative number in case of an error. // Starts at [index] and increments the index to the position after // the numeral. // It is an error if the numeral value is greater than 0x7FFFFFFFF. // It is a recoverable error if the numeral starts with leading zeros. int readNumeral() { const maxValue = 0x7FFFFFFF; if (index == source!.length) { onError(PackageConfigFormatException('Missing number', source, index)); return -1; } var start = index; var char = source.codeUnitAt(index); var digit = char ^ 0x30; if (digit > 9) { onError(PackageConfigFormatException('Missing number', source, index)); return -1; } var firstDigit = digit; var value = 0; do { value = value * 10 + digit; if (value > maxValue) { onError( PackageConfigFormatException('Number too large', source, start)); return -1; } index++; if (index == source.length) break; char = source.codeUnitAt(index); digit = char ^ 0x30; } while (digit <= 9); if (firstDigit == 0 && index > start + 1) { onError(PackageConfigFormatException( 'Leading zero not allowed', source, start)); } return value; } var major = readNumeral(); if (major < 0) { return SimpleInvalidLanguageVersion(source); } if (index == source!.length || source.codeUnitAt(index) != $dot) { onError(PackageConfigFormatException("Missing '.'", source, index)); return SimpleInvalidLanguageVersion(source); } index++; var minor = readNumeral(); if (minor < 0) { return SimpleInvalidLanguageVersion(source); } if (index != source.length) { onError(PackageConfigFormatException( 'Unexpected trailing character', source, index)); return SimpleInvalidLanguageVersion(source); } return SimpleLanguageVersion(major, minor, source); } abstract class _SimpleLanguageVersionBase implements LanguageVersion { @override int compareTo(LanguageVersion other) { var result = major.compareTo(other.major); if (result != 0) return result; return minor.compareTo(other.minor); } } class SimpleLanguageVersion extends _SimpleLanguageVersionBase { @override final int major; @override final int minor; String? _source; SimpleLanguageVersion(this.major, this.minor, this._source); @override bool operator ==(Object other) => other is LanguageVersion && major == other.major && minor == other.minor; @override int get hashCode => (major * 17 ^ minor * 37) & 0x3FFFFFFF; @override String toString() => _source ??= '$major.$minor'; } class SimpleInvalidLanguageVersion extends _SimpleLanguageVersionBase implements InvalidLanguageVersion { final String? _source; SimpleInvalidLanguageVersion(this._source); @override int get major => -1; @override int get minor => -1; @override String toString() => _source!; } abstract class PackageTree { Iterable get allPackages; SimplePackage? packageOf(Uri file); } /// Packages of a package configuration ordered by root path. /// /// A package has a root path and a package root path, where the latter /// contains the files exposed by `package:` URIs. /// /// A package is said to be inside another package if the root path URI of /// the latter is a prefix of the root path URI of the former. /// /// No two packages of a package may have the same root path, so this /// path prefix ordering defines a tree-like partial ordering on packages /// of a configuration. /// /// The package root path of a package must not be inside another package's /// root path. /// Entire other packages are allowed inside a package's root or /// package root path. /// /// The package tree contains an ordered mapping of unrelated packages /// (represented by their name) to their immediately nested packages' names. class MutablePackageTree implements PackageTree { /// A list of packages that are not nested inside each other. final List packages = []; /// The tree of the immediately nested packages inside each package. /// /// Indexed by [Package.name]. /// If a package has no nested packages (which is most often the case), /// there is no tree object associated with it. Map? _packageChildren; @override Iterable get allPackages sync* { for (var package in packages) { yield package; } var children = _packageChildren; if (children != null) { for (var tree in children.values) { yield* tree.allPackages; } } } /// Tries to (add) `package` to the tree. /// /// Reports a [ConflictException] if the added package conflicts with an /// existing package. /// It conflicts if its root or package root is the same as another /// package's root or package root, or is between the two. /// /// If a conflict is detected between [package] and a previous package, /// then [onError] is called with a [ConflictException] object /// and the [package] is not added to the tree. /// /// The packages are added in order of their root path. /// It is never necessary to insert a node between two existing levels. void add( int start, SimplePackage package, void Function(Object error) onError) { var path = package.root.toString(); for (var treePackage in packages) { // Check is package is inside treePackage. var treePackagePath = treePackage.root.toString(); assert(treePackagePath.length > start); assert(path.startsWith(treePackagePath.substring(0, start))); if (_beginsWith(start, treePackagePath, path)) { // Package *is* inside treePackage. var treePackagePathLength = treePackagePath.length; if (path.length == treePackagePathLength) { // Has same root. Do not add package. onError(ConflictException.root(package, treePackage)); return; } var treePackageUriRoot = treePackage.packageUriRoot.toString(); if (_beginsWith(treePackagePathLength, path, treePackageUriRoot)) { // The treePackage's package root is inside package, which is inside // the treePackage. This is not allowed. onError(ConflictException.packageRoot(package, treePackage)); return; } _treeOf(treePackage).add(treePackagePathLength, package, onError); return; } } packages.add(package); } @override SimplePackage? packageOf(Uri file) { return findPackageOf(0, file.toString()); } /// Finds package containing [path] in this tree. /// /// Returns `null` if no such package is found. /// /// Assumes the first [start] characters of path agrees with all /// the packages at this level of the tree. SimplePackage? findPackageOf(int start, String path) { for (var childPackage in packages) { var childPath = childPackage.root.toString(); if (_beginsWith(start, childPath, path)) { // The [package] is inside [childPackage]. var childPathLength = childPath.length; if (path.length == childPathLength) return childPackage; var uriRoot = childPackage.packageUriRoot.toString(); // Is [package] is inside the URI root of [childPackage]. if (uriRoot.length == childPathLength || _beginsWith(childPathLength, uriRoot, path)) { return childPackage; } return _packageChildren?[childPackage.name] ?.findPackageOf(childPathLength, path) ?? childPackage; } } return null; } /// Returns the [PackageTree] of the children of [package]. /// /// Ensures that the object is allocated if necessary. MutablePackageTree _treeOf(SimplePackage package) { var children = _packageChildren ??= {}; return children[package.name] ??= MutablePackageTree(); } } class EmptyPackageTree implements PackageTree { const EmptyPackageTree(); @override Iterable get allPackages => const Iterable.empty(); @override SimplePackage? packageOf(Uri file) => null; } /// Checks whether [longerPath] begins with [parentPath]. /// /// Skips checking the [start] first characters which are assumed to /// already have been matched. bool _beginsWith(int start, String parentPath, String longerPath) { if (longerPath.length < parentPath.length) return false; for (var i = start; i < parentPath.length; i++) { if (longerPath.codeUnitAt(i) != parentPath.codeUnitAt(i)) return false; } return true; } /// Conflict between packages added to the same configuration. /// /// The [package] conflicts with [existingPackage] if it has /// the same root path ([isRootConflict]) or the package URI root path /// of [existingPackage] is inside the root path of [package] /// ([isPackageRootConflict]). class ConflictException { /// The existing package that [package] conflicts with. final SimplePackage existingPackage; /// The package that could not be added without a conflict. final SimplePackage package; /// Whether the conflict is with the package URI root of [existingPackage]. final bool isPackageRootConflict; /// Creates a root conflict between [package] and [existingPackage]. ConflictException.root(this.package, this.existingPackage) : isPackageRootConflict = false; /// Creates a package root conflict between [package] and [existingPackage]. ConflictException.packageRoot(this.package, this.existingPackage) : isPackageRootConflict = true; /// WHether the conflict is with the root URI of [existingPackage]. bool get isRootConflict => !isPackageRootConflict; } /// Used for sorting packages by root path. int _compareRoot(Package p1, Package p2) => p1.root.toString().compareTo(p2.root.toString()); ‚'NN<N5 (" GC;G )-(H?G3*9&3)2C.D-)    *  =@;,A>J=@CP)"(-/,<$*:0*M+22-4"85,O-7MD!OF>F4&;I/FFI!#N)N "N)'0,71EI1 1 *:16G )/$)A  ? $P > 4F(.   !%&>H3K?FJLAGM2@+G!J25 ,$%*!,KF=JA2:J O((19.D7,<40A HLO3H K '.42C.9)4130A>B1; 4:>96,<0 H .:ED;4L?=G>:'>N$G='OD&F5,,63package:package_config/src/package_config_impl.dart€¿O‚'‚*‚,jfile:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/src/package_config_io.dart•’// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // dart:io dependent functionality for reading and writing configuration files. import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'errors.dart'; import 'package_config_impl.dart'; import 'package_config_json.dart'; import 'packages_file.dart' as packages_file; import 'util.dart'; import 'util_io.dart'; /// Name of directory where Dart tools store their configuration. /// /// Directory is created in the package root directory. const dartToolDirName = '.dart_tool'; /// Name of file containing new package configuration data. /// /// File is stored in the dart tool directory. const packageConfigFileName = 'package_config.json'; /// Name of file containing legacy package configuration data. /// /// File is stored in the package root directory. const packagesFileName = '.packages'; /// Reads a package configuration file. /// /// Detects whether the [file] is a version one `.packages` file or /// a version two `package_config.json` file. /// /// If the [file] is a `.packages` file and [preferNewest] is true, /// first checks whether there is an adjacent `.dart_tool/package_config.json` /// file, and if so, reads that instead. /// If [preferNewset] is false, the specified file is loaded even if it is /// a `.packages` file and there is an available `package_config.json` file. /// /// The file must exist and be a normal file. Future readAnyConfigFile( File file, bool preferNewest, void Function(Object error) onError) async { if (preferNewest && fileName(file.path) == packagesFileName) { var alternateFile = File( pathJoin(dirName(file.path), dartToolDirName, packageConfigFileName)); if (alternateFile.existsSync()) { return await readPackageConfigJsonFile(alternateFile, onError); } } Uint8List bytes; try { bytes = await file.readAsBytes(); } catch (e) { onError(e); return const SimplePackageConfig.empty(); } return parseAnyConfigFile(bytes, file.uri, onError); } /// Like [readAnyConfigFile] but uses a URI and an optional loader. Future readAnyConfigFileUri( Uri file, Future Function(Uri uri)? loader, void Function(Object error) onError, bool preferNewest) async { if (file.isScheme('package')) { throw PackageConfigArgumentError( file, 'file', 'Must not be a package: URI'); } if (loader == null) { if (file.isScheme('file')) { return await readAnyConfigFile(File.fromUri(file), preferNewest, onError); } loader = defaultLoader; } if (preferNewest && file.pathSegments.last == packagesFileName) { var alternateFile = file.resolve('$dartToolDirName/$packageConfigFileName'); Uint8List? bytes; try { bytes = await loader(alternateFile); } catch (e) { onError(e); return const SimplePackageConfig.empty(); } if (bytes != null) { return parsePackageConfigBytes(bytes, alternateFile, onError); } } Uint8List? bytes; try { bytes = await loader(file); } catch (e) { onError(e); return const SimplePackageConfig.empty(); } if (bytes == null) { onError(PackageConfigArgumentError( file.toString(), 'file', 'File cannot be read')); return const SimplePackageConfig.empty(); } return parseAnyConfigFile(bytes, file, onError); } /// Parses a `.packages` or `package_config.json` file's contents. /// /// Assumes it's a JSON file if the first non-whitespace character /// is `{`, otherwise assumes it's a `.packages` file. PackageConfig parseAnyConfigFile( Uint8List bytes, Uri file, void Function(Object error) onError) { var firstChar = firstNonWhitespaceChar(bytes); if (firstChar != $lbrace) { // Definitely not a JSON object, probably a .packages. return packages_file.parse(bytes, file, onError); } return parsePackageConfigBytes(bytes, file, onError); } Future readPackageConfigJsonFile( File file, void Function(Object error) onError) async { Uint8List bytes; try { bytes = await file.readAsBytes(); } catch (error) { onError(error); return const SimplePackageConfig.empty(); } return parsePackageConfigBytes(bytes, file.uri, onError); } Future readDotPackagesFile( File file, void Function(Object error) onError) async { Uint8List bytes; try { bytes = await file.readAsBytes(); } catch (error) { onError(error); return const SimplePackageConfig.empty(); } return packages_file.parse(bytes, file.uri, onError); } Future writePackageConfigJsonFile( PackageConfig config, Directory targetDirectory) async { // Write .dart_tool/package_config.json first. var dartToolDir = Directory(pathJoin(targetDirectory.path, dartToolDirName)); await dartToolDir.create(recursive: true); var file = File(pathJoin(dartToolDir.path, packageConfigFileName)); var baseUri = file.uri; var sink = file.openWrite(encoding: utf8); writePackageConfigJsonUtf8(config, baseUri, sink); var doneJson = sink.close(); // Write .packages too. file = File(pathJoin(targetDirectory.path, packagesFileName)); baseUri = file.uri; sink = file.openWrite(encoding: utf8); writeDotPackages(config, baseUri, sink); var donePackages = sink.close(); await Future.wait([doneJson, donePackages]); } €¨NN<P##.B8&</5?2&(D.DO)KM.)OAO&F&.7D,2)"&5!QDQ +0E .(:.3CC7"F1;681<&.<+<&.8)=1P-F-5A)+#/1package:package_config/src/package_config_io.dartuOlfile:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/src/package_config_json.dart«¯// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // Parsing and serialization of package configurations. import 'dart:convert'; import 'dart:typed_data'; import 'errors.dart'; import 'package_config_impl.dart'; import 'packages_file.dart' as packages_file; import 'util.dart'; const String _configVersionKey = 'configVersion'; const String _packagesKey = 'packages'; const List _topNames = [_configVersionKey, _packagesKey]; const String _nameKey = 'name'; const String _rootUriKey = 'rootUri'; const String _packageUriKey = 'packageUri'; const String _languageVersionKey = 'languageVersion'; const List _packageNames = [ _nameKey, _rootUriKey, _packageUriKey, _languageVersionKey ]; const String _generatedKey = 'generated'; const String _generatorKey = 'generator'; const String _generatorVersionKey = 'generatorVersion'; final _jsonUtf8Decoder = json.fuse(utf8).decoder; PackageConfig parsePackageConfigBytes( Uint8List bytes, Uri file, void Function(Object error) onError) { // TODO(lrn): Make this simpler. Maybe parse directly from bytes. Object? jsonObject; try { jsonObject = _jsonUtf8Decoder.convert(bytes); } on FormatException catch (e) { onError(PackageConfigFormatException.from(e)); return const SimplePackageConfig.empty(); } return parsePackageConfigJson(jsonObject, file, onError); } PackageConfig parsePackageConfigString( String source, Uri file, void Function(Object error) onError) { Object? jsonObject; try { jsonObject = jsonDecode(source); } on FormatException catch (e) { onError(PackageConfigFormatException.from(e)); return const SimplePackageConfig.empty(); } return parsePackageConfigJson(jsonObject, file, onError); } /// Creates a [PackageConfig] from a parsed JSON-like object structure. /// /// The [json] argument must be a JSON object (`Map`) /// containing a `"configVersion"` entry with an integer value in the range /// 1 to [PackageConfig.maxVersion], /// and with a `"packages"` entry which is a JSON array (`List`) /// containing JSON objects which each has the following properties: /// /// * `"name"`: The package name as a string. /// * `"rootUri"`: The root of the package as a URI stored as a string. /// * `"packageUri"`: Optionally the root of for `package:` URI resolution /// for the package, as a relative URI below the root URI /// stored as a string. /// * `"languageVersion"`: Optionally a language version string which is a /// an integer numeral, a decimal point (`.`) and another integer numeral, /// where the integer numeral cannot have a sign, and can only have a /// leading zero if the entire numeral is a single zero. /// /// All other properties are stored in [extraData]. /// /// The [baseLocation] is used as base URI to resolve the "rootUri" /// URI referencestring. PackageConfig parsePackageConfigJson( Object? json, Uri baseLocation, void Function(Object error) onError) { if (!baseLocation.hasScheme || baseLocation.isScheme('package')) { throw PackageConfigArgumentError(baseLocation.toString(), 'baseLocation', 'Must be an absolute non-package: URI'); } if (!baseLocation.path.endsWith('/')) { baseLocation = baseLocation.resolveUri(Uri(path: '.')); } String typeName() { if (0 is T) return 'int'; if ('' is T) return 'string'; if (const [] is T) return 'array'; return 'object'; } T? checkType(Object? value, String name, [String? packageName]) { if (value is T) return value; // The only types we are called with are [int], [String], [List] // and Map. Recognize which to give a better error message. var message = "$name${packageName != null ? " of package $packageName" : ""}" ' is not a JSON ${typeName()}'; onError(PackageConfigFormatException(message, value)); return null; } Package? parsePackage(Map entry) { String? name; String? rootUri; String? packageUri; String? languageVersion; Map? extraData; var hasName = false; var hasRoot = false; var hasVersion = false; entry.forEach((key, value) { switch (key) { case _nameKey: hasName = true; name = checkType(value, _nameKey); break; case _rootUriKey: hasRoot = true; rootUri = checkType(value, _rootUriKey, name); break; case _packageUriKey: packageUri = checkType(value, _packageUriKey, name); break; case _languageVersionKey: hasVersion = true; languageVersion = checkType(value, _languageVersionKey, name); break; default: (extraData ??= {})[key] = value; break; } }); if (!hasName) { onError(PackageConfigFormatException('Missing name entry', entry)); } if (!hasRoot) { onError(PackageConfigFormatException('Missing rootUri entry', entry)); } if (name == null || rootUri == null) return null; var parsedRootUri = Uri.parse(rootUri!); var relativeRoot = !hasAbsolutePath(parsedRootUri); var root = baseLocation.resolveUri(parsedRootUri); if (!root.path.endsWith('/')) root = root.replace(path: root.path + '/'); var packageRoot = root; if (packageUri != null) packageRoot = root.resolve(packageUri!); if (!packageRoot.path.endsWith('/')) { packageRoot = packageRoot.replace(path: packageRoot.path + '/'); } LanguageVersion? version; if (languageVersion != null) { version = parseLanguageVersion(languageVersion, onError); } else if (hasVersion) { version = SimpleInvalidLanguageVersion('invalid'); } return SimplePackage.validate( name!, root, packageRoot, version, extraData, relativeRoot, (error) { if (error is ArgumentError) { onError( PackageConfigFormatException(error.message, error.invalidValue)); } else { onError(error); } }); } var map = checkType>(json, 'value'); if (map == null) return const SimplePackageConfig.empty(); Map? extraData; List? packageList; int? configVersion; map.forEach((key, value) { switch (key) { case _configVersionKey: configVersion = checkType(value, _configVersionKey) ?? 2; break; case _packagesKey: var packageArray = checkType>(value, _packagesKey) ?? []; var packages = []; for (var package in packageArray) { var packageMap = checkType>(package, 'package entry'); if (packageMap != null) { var entry = parsePackage(packageMap); if (entry != null) { packages.add(entry); } } } packageList = packages; break; default: (extraData ??= {})[key] = value; break; } }); if (configVersion == null) { onError(PackageConfigFormatException('Missing configVersion entry', json)); configVersion = 2; } if (packageList == null) { onError(PackageConfigFormatException('Missing packages list', json)); packageList = []; } return SimplePackageConfig(configVersion!, packageList!, extraData, (error) { if (error is ArgumentError) { onError(PackageConfigFormatException(error.message, error.invalidValue)); } else { onError(error); } }); } final _jsonUtf8Encoder = JsonUtf8Encoder(' '); void writePackageConfigJsonUtf8( PackageConfig config, Uri? baseUri, Sink> output) { // Can be optimized. var data = packageConfigToJson(config, baseUri); output.add(_jsonUtf8Encoder.convert(data) as Uint8List); } void writePackageConfigJsonString( PackageConfig config, Uri? baseUri, StringSink output) { // Can be optimized. var data = packageConfigToJson(config, baseUri); output.write(JsonEncoder.withIndent(' ').convert(data)); } Map packageConfigToJson(PackageConfig config, Uri? baseUri) => { ...?_extractExtraData(config.extraData, _topNames), _configVersionKey: PackageConfig.maxVersion, _packagesKey: [ for (var package in config.packages) { _nameKey: package.name, _rootUriKey: trailingSlash((package.relativeRoot ? relativizeUri(package.root, baseUri) : package.root) .toString()), if (package.root != package.packageUriRoot) _packageUriKey: trailingSlash( relativizeUri(package.packageUriRoot, package.root) .toString()), if (package.languageVersion != null && package.languageVersion is! InvalidLanguageVersion) _languageVersionKey: package.languageVersion.toString(), ...?_extractExtraData(package.extraData, _packageNames), } ], }; void writeDotPackages(PackageConfig config, Uri baseUri, StringSink output) { var extraData = config.extraData; // Write .packages too. String? comment; if (extraData is Map) { var generator = extraData[_generatorKey]; if (generator is String) { var generated = extraData[_generatedKey]; var generatorVersion = extraData[_generatorVersionKey]; comment = 'Generated by $generator' "${generatorVersion is String ? " $generatorVersion" : ""}" "${generated is String ? " on $generated" : ""}."; } } packages_file.write(output, config, baseUri: baseUri, comment: comment); } /// If "extraData" is a JSON map, then return it, otherwise return null. /// /// If the value contains any of the [reservedNames] for the current context, /// entries with that name in the extra data are dropped. Map? _extractExtraData( Object? data, Iterable reservedNames) { if (data is Map) { if (data.isEmpty) return null; for (var name in reservedNames) { if (data.containsKey(name)) { var filteredData = { for (var key in data.keys) if (!reservedNames.contains(key)) key: data[key] }; if (filteredData.isEmpty) return null; for (var value in filteredData.values) { if (!_validateJson(value)) return null; } return filteredData; } } return data; } return null; } /// Checks that the object is a valid JSON-like data structure. bool _validateJson(Object? object) { if (object == null || true == object || false == object) return true; if (object is num || object is String) return true; if (object is List) { return object.every(_validateJson); } if (object is Map) { return object.values.every(_validateJson); } return false; } @NN<8#.2(B &,6% **82'FD2#3.<(D%#3.<HGL%JE.HK>KOJ=4D&KEN1*<"'G"NQH+;6%!5AG"Q+JM6-87NE+G#@9#N$N<=#GP$,I$2!# )PJP"P 0!B3;#=3<P:3-$=;$8-F$3DGE N$+.0>*F=KIN:)4&#&$%= /12 @%H6!((/3package:package_config/src/package_config_json.dartuOffile:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/src/packages_file.dartœ"// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'package_config_impl.dart'; import 'util.dart'; import 'errors.dart'; /// The language version prior to the release of language versioning. /// /// This is the default language version used by all packages from a /// `.packages` file. final LanguageVersion _languageVersion = LanguageVersion(2, 7); /// Parses a `.packages` file into a [PackageConfig]. /// /// The [source] is the byte content of a `.packages` file, assumed to be /// UTF-8 encoded. In practice, all significant parts of the file must be ASCII, /// so Latin-1 or Windows-1252 encoding will also work fine. /// /// If the file content is available as a string, its [String.codeUnits] can /// be used as the `source` argument of this function. /// /// The [baseLocation] is used as a base URI to resolve all relative /// URI references against. /// If the content was read from a file, `baseLocation` should be the /// location of that file. /// /// Returns a simple package configuration where each package's /// [Package.packageUriRoot] is the same as its [Package.root] /// and it has no [Package.languageVersion]. PackageConfig parse( List source, Uri baseLocation, void Function(Object error) onError) { if (baseLocation.isScheme('package')) { onError(PackageConfigArgumentError( baseLocation, 'baseLocation', 'Must not be a package: URI')); return PackageConfig.empty; } var index = 0; var packages = []; var packageNames = {}; while (index < source.length) { var ignoreLine = false; var start = index; var separatorIndex = -1; var end = source.length; var char = source[index++]; if (char == $cr || char == $lf) { continue; } if (char == $colon) { onError(PackageConfigFormatException( 'Missing package name', source, index - 1)); ignoreLine = true; // Ignore if package name is invalid. } else { ignoreLine = char == $hash; // Ignore if comment. } var queryStart = -1; var fragmentStart = -1; while (index < source.length) { char = source[index++]; if (char == $colon && separatorIndex < 0) { separatorIndex = index - 1; } else if (char == $cr || char == $lf) { end = index - 1; break; } else if (char == $question && queryStart < 0 && fragmentStart < 0) { queryStart = index - 1; } else if (char == $hash && fragmentStart < 0) { fragmentStart = index - 1; } } if (ignoreLine) continue; if (separatorIndex < 0) { onError( PackageConfigFormatException("No ':' on line", source, index - 1)); continue; } var packageName = String.fromCharCodes(source, start, separatorIndex); var invalidIndex = checkPackageName(packageName); if (invalidIndex >= 0) { onError(PackageConfigFormatException( 'Not a valid package name', source, start + invalidIndex)); continue; } if (queryStart >= 0) { onError(PackageConfigFormatException( 'Location URI must not have query', source, queryStart)); end = queryStart; } else if (fragmentStart >= 0) { onError(PackageConfigFormatException( 'Location URI must not have fragment', source, fragmentStart)); end = fragmentStart; } var packageValue = String.fromCharCodes(source, separatorIndex + 1, end); Uri packageLocation; try { packageLocation = Uri.parse(packageValue); } on FormatException catch (e) { onError(PackageConfigFormatException.from(e)); continue; } var relativeRoot = !hasAbsolutePath(packageLocation); packageLocation = baseLocation.resolveUri(packageLocation); if (packageLocation.isScheme('package')) { onError(PackageConfigFormatException( 'Package URI as location for package', source, separatorIndex + 1)); continue; } var path = packageLocation.path; if (!path.endsWith('/')) { path += '/'; packageLocation = packageLocation.replace(path: path); } if (packageNames.contains(packageName)) { onError(PackageConfigFormatException( 'Same package name occured more than once', source, start)); continue; } var rootUri = packageLocation; if (path.endsWith('/lib/')) { // Assume default Pub package layout. Include package itself in root. rootUri = packageLocation.replace(path: path.substring(0, path.length - 4)); } var package = SimplePackage.validate(packageName, rootUri, packageLocation, _languageVersion, null, relativeRoot, (error) { if (error is ArgumentError) { onError(PackageConfigFormatException(error.message, source)); } else { onError(error); } }); if (package != null) { packages.add(package); packageNames.add(packageName); } } return SimplePackageConfig(1, packages, null, onError); } /// Writes the configuration to a [StringSink]. /// /// If [comment] is provided, the output will contain this comment /// with `# ` in front of each line. /// Lines are defined as ending in line feed (`'\n'`). If the final /// line of the comment doesn't end in a line feed, one will be added. /// /// If [baseUri] is provided, package locations will be made relative /// to the base URI, if possible, before writing. /// /// If [allowDefaultPackage] is `true`, the [packageMapping] may contain an /// empty string mapping to the _default package name_. /// /// All the keys of [packageMapping] must be valid package names, /// and the values must be URIs that do not have the `package:` scheme. void write(StringSink output, PackageConfig config, {Uri? baseUri, String? comment}) { if (baseUri != null && !baseUri.isAbsolute) { throw PackageConfigArgumentError(baseUri, 'baseUri', 'Must be absolute'); } if (comment != null) { var lines = comment.split('\n'); if (lines.last.isEmpty) lines.removeLast(); for (var commentLine in lines) { output.write('# '); output.writeln(commentLine); } } else { output.write('# generated by package:package_config at '); output.write(DateTime.now()); output.writeln(); } for (var package in config.packages) { var packageName = package.name; var uri = package.packageUriRoot; // Validate packageName. if (!isValidPackageName(packageName)) { throw PackageConfigArgumentError( config, 'config', '"$packageName" is not a valid package name'); } if (uri.scheme == 'package') { throw PackageConfigArgumentError( config, 'config', 'Package location must not be a package URI: $uri'); } output.write(packageName); output.write(':'); // If baseUri is provided, make the URI relative to baseUri. if (baseUri != null) { uri = relativizeUri(uri, baseUri)!; } if (!uri.path.endsWith('/')) { uri = uri.replace(path: uri.path + '/'); } output.write(uri); output.writeln(); } } €ÊNN<#FE@6JQ=M7EF@?-O*(F !" &,7? 8$2$/M 7#NK6,F,D%,JN 1%5:@/,O%=.,G#"LMP8$F%:0C%DGF2L8BH4'0N%0%# ?")$&,(K#(QA*#/-package:package_config/src/packages_file.dart]file:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/src/util.dart ¬// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Utility methods used by more than one library in the package. library package_config.util; import 'errors.dart'; // All ASCII characters that are valid in a package name, with space // for all the invalid ones (including space). const String _validPackageNameCharacters = r" ! $ &'()*+,-. 0123456789 ; = " r'@ABCDEFGHIJKLMNOPQRSTUVWXYZ _ abcdefghijklmnopqrstuvwxyz ~ '; /// Tests whether something is a valid Dart package name. bool isValidPackageName(String string) { return checkPackageName(string) < 0; } /// Check if a string is a valid package name. /// /// Valid package names contain only characters in [_validPackageNameCharacters] /// and must contain at least one non-'.' character. /// /// Returns `-1` if the string is valid. /// Otherwise returns the index of the first invalid character, /// or `string.length` if the string contains no non-'.' character. int checkPackageName(String string) { // Becomes non-zero if any non-'.' character is encountered. var nonDot = 0; for (var i = 0; i < string.length; i++) { var c = string.codeUnitAt(i); if (c > 0x7f || _validPackageNameCharacters.codeUnitAt(c) <= $space) { return i; } nonDot += c ^ $dot; } if (nonDot == 0) return string.length; return -1; } /// Validate that a [Uri] is a valid `package:` URI. /// /// Used to validate user input. /// /// Returns the package name extracted from the package URI, /// which is the path segment between `package:` and the first `/`. String checkValidPackageUri(Uri packageUri, String name) { if (packageUri.scheme != 'package') { throw PackageConfigArgumentError(packageUri, name, 'Not a package: URI'); } if (packageUri.hasAuthority) { throw PackageConfigArgumentError( packageUri, name, 'Package URIs must not have a host part'); } if (packageUri.hasQuery) { // A query makes no sense if resolved to a file: URI. throw PackageConfigArgumentError( packageUri, name, 'Package URIs must not have a query part'); } if (packageUri.hasFragment) { // We could leave the fragment after the URL when resolving, // but it would be odd if "package:foo/foo.dart#1" and // "package:foo/foo.dart#2" were considered different libraries. // Keep the syntax open in case we ever get multiple libraries in one file. throw PackageConfigArgumentError( packageUri, name, 'Package URIs must not have a fragment part'); } if (packageUri.path.startsWith('/')) { throw PackageConfigArgumentError( packageUri, name, "Package URIs must not start with a '/'"); } var firstSlash = packageUri.path.indexOf('/'); if (firstSlash == -1) { throw PackageConfigArgumentError(packageUri, name, "Package URIs must start with the package name followed by a '/'"); } var packageName = packageUri.path.substring(0, firstSlash); var badIndex = checkPackageName(packageName); if (badIndex >= 0) { if (packageName.isEmpty) { throw PackageConfigArgumentError( packageUri, name, 'Package names mus be non-empty'); } if (badIndex == packageName.length) { throw PackageConfigArgumentError(packageUri, name, "Package names must contain at least one non-'.' character"); } assert(badIndex < packageName.length); var badCharCode = packageName.codeUnitAt(badIndex); var badChar = 'U+' + badCharCode.toRadixString(16).padLeft(4, '0'); if (badCharCode >= 0x20 && badCharCode <= 0x7e) { // Printable character. badChar = "'${packageName[badIndex]}' ($badChar)"; } throw PackageConfigArgumentError( packageUri, name, 'Package names must not contain $badChar'); } return packageName; } /// Checks whether URI is just an absolute directory. /// /// * It must have a scheme. /// * It must not have a query or fragment. /// * The path must end with `/`. bool isAbsoluteDirectoryUri(Uri uri) { if (uri.hasQuery) return false; if (uri.hasFragment) return false; if (!uri.hasScheme) return false; var path = uri.path; if (!path.endsWith('/')) return false; return true; } /// Whether the former URI is a prefix of the latter. bool isUriPrefix(Uri prefix, Uri path) { assert(!prefix.hasFragment); assert(!prefix.hasQuery); assert(!path.hasQuery); assert(!path.hasFragment); assert(prefix.path.endsWith('/')); return path.toString().startsWith(prefix.toString()); } /// Finds the first non-JSON-whitespace character in a file. /// /// Used to heuristically detect whether a file is a JSON file or an .ini file. int firstNonWhitespaceChar(List bytes) { for (var i = 0; i < bytes.length; i++) { var char = bytes[i]; if (char != 0x20 && char != 0x09 && char != 0x0a && char != 0x0d) { return char; } } return -1; } /// Appends a trailing `/` if the path doesn't end with one. String trailingSlash(String path) { if (path.isEmpty || path.endsWith('/')) return path; return path + '/'; } /// Whether a URI should not be considered relative to the base URI. /// /// Used to determine whether a parsed root URI is relative /// to the configuration file or not. /// If it is relative, then it's rewritten as relative when /// output again later. If not, it's output as absolute. bool hasAbsolutePath(Uri uri) => uri.hasScheme || uri.hasAuthority || uri.hasAbsolutePath; /// Attempts to return a relative path-only URI for [uri]. /// /// First removes any query or fragment part from [uri]. /// /// If [uri] is already relative (has no scheme), it's returned as-is. /// If that is not desired, the caller can pass `baseUri.resolveUri(uri)` /// as the [uri] instead. /// /// If the [uri] has a scheme or authority part which differs from /// the [baseUri], or if there is no overlap in the paths of the /// two URIs at all, the [uri] is returned as-is. /// /// Otherwise the result is a path-only URI which satsifies /// `baseUri.resolveUri(result) == uri`, /// /// The `baseUri` must be absolute. Uri? relativizeUri(Uri? uri, Uri? baseUri) { if (baseUri == null) return uri; assert(baseUri.isAbsolute); if (uri!.hasQuery || uri.hasFragment) { uri = Uri( scheme: uri.scheme, userInfo: uri.hasAuthority ? uri.userInfo : null, host: uri.hasAuthority ? uri.host : null, port: uri.hasAuthority ? uri.port : null, path: uri.path); } // Already relative. We assume the caller knows what they are doing. if (!uri.isAbsolute) return uri; if (baseUri.scheme != uri.scheme) { return uri; } // If authority differs, we could remove the scheme, but it's not worth it. if (uri.hasAuthority != baseUri.hasAuthority) return uri; if (uri.hasAuthority) { if (uri.userInfo != baseUri.userInfo || uri.host.toLowerCase() != baseUri.host.toLowerCase() || uri.port != baseUri.port) { return uri; } } baseUri = baseUri.normalizePath(); var base = [...baseUri.pathSegments]; if (base.isNotEmpty) base.removeLast(); uri = uri.normalizePath(); var target = [...uri.pathSegments]; if (target.isNotEmpty && target.last.isEmpty) target.removeLast(); var index = 0; while (index < base.length && index < target.length) { if (base[index] != target[index]) { break; } index++; } if (index == base.length) { if (index == target.length) { return Uri(path: './'); } return Uri(path: target.skip(index).join('/')); } else if (index > 0) { var buffer = StringBuffer(); for (var n = base.length - index; n > 0; --n) { buffer.write('../'); } buffer.writeAll(target.skip(index), '/'); return Uri(path: buffer.toString()); } else { return uri; } } // Character constants used by this package. /// "Line feed" control character. const int $lf = 0x0a; /// "Carriage return" control character. const int $cr = 0x0d; /// Space character. const int $space = 0x20; /// Character `#`. const int $hash = 0x23; /// Character `.`. const int $dot = 0x2e; /// Character `:`. const int $colon = 0x3a; /// Character `?`. const int $question = 0x3f; /// Character `{`. const int $lbrace = 0x7b; €ÿNN<BE/+HI:)'/Q5)@D&?,"K) 5!=D;(N!&E:&F A;EP&I)&E17L>0(?*9H+8H69&F6,"'"%$)6)%8=P.+H =$7E<&<9!>;9GJCA2<)$-#*:22G#&N<,@$%(*&E9(  "4!4.) -#)$package:package_config/src/util.dart`file:///github/home/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.2/lib/src/util_io.dart// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Utility methods requiring dart:io and used by more than one library in the /// package. library package_config.util_io; import 'dart:io'; import 'dart:typed_data'; Future defaultLoader(Uri uri) async { if (uri.isScheme('file')) { var file = File.fromUri(uri); try { return await file.readAsBytes(); } catch (_) { return null; } } if (uri.isScheme('http') || uri.isScheme('https')) { return _httpGet(uri); } throw UnsupportedError('Default URI unsupported scheme: $uri'); } Future _httpGet(Uri uri) async { assert(uri.isScheme('http') || uri.isScheme('https')); var client = HttpClient(); var request = await client.getUrl(uri); var response = await request.close(); if (response.statusCode != HttpStatus.ok) { return null; } var splitContent = await response.toList(); var totalLength = 0; if (splitContent.length == 1) { var part = splitContent[0]; if (part is Uint8List) { return part; } } for (var list in splitContent) { totalLength += list.length; } var result = Uint8List(totalLength); var offset = 0; for (var contentPart in splitContent as Iterable) { result.setRange(offset, offset + contentPart.length, contentPart); offset += contentPart.length; } return result; } /// The file name of a path. /// /// The file name is everything after the last occurrence of /// [Platform.pathSeparator], or the entire string if no /// path separator occurs in the string. String fileName(String path) { var separator = Platform.pathSeparator; var lastSeparator = path.lastIndexOf(separator); if (lastSeparator < 0) return path; return path.substring(lastSeparator + separator.length); } /// The directory name of a path. /// /// The directory name is everything before the last occurrence of /// [Platform.pathSeparator], or the empty string if no /// path separator occurs in the string. String dirName(String path) { var separator = Platform.pathSeparator; var lastSeparator = path.lastIndexOf(separator); if (lastSeparator < 0) return ''; return path.substring(0, lastSeparator); } /// Join path parts with the [Platform.pathSeparator]. /// /// If a part ends with a path separator, then no extra separator is /// inserted. String pathJoin(String part1, String part2, [String? part3]) { var separator = Platform.pathSeparator; var separator1 = part1.endsWith(separator) ? '' : separator; if (part3 == null) { return '$part1$separator1$part2'; } var separator2 = part2.endsWith(separator) ? '' : separator; return '$part1$separator1$part2$separator2$part3'; } /// Join an unknown number of path parts with [Platform.pathSeparator]. /// /// If a part ends with a path separator, then no extra separator is /// inserted. String pathJoinAll(Iterable parts) { var buffer = StringBuffer(); var separator = ''; for (var part in parts) { buffer ..write(separator) ..write(part); separator = part.endsWith(Platform.pathSeparator) ? '' : Platform.pathSeparator; } return buffer.toString(); } nNN<O 2" '7B-9*(.." # 'AG"=9)*3&;"C8)*3$+7E?*?&?5HE- M'package:package_config/src/util_io.dartÉbìˆð86 ÐKú𨱷ßOüÕ*  •”[‚-`;`9‚0€¹`bdef9È‚1 _£`97.FG!7{¶‚4=V`;L1fk`;LKMÁ‚7‚8 €ï7 7 7:7#7?É7 7€È $049;CFHJLOQY\^fhkmoy|‚“–™œŸ¢¥*‚8ÊË  ÌÍ Î  " $ Ë CEHÏËÐÏIJÐNQ Ð!!NÑ$%Î&T&U&a&V&W%Ò,%Ë.X.Z.[.]._.`.b.d.e.g$9Ò:9ÎP]jr‡‹©¸ÁÌÍ×Ùæïü‚‚‚‚.‚=‚K‚b‚k‚r‚|‚ˆ‚’‚š‚ ‚­‚¼‚‚˂ւނå‚ÿƒ ƒƒƒƒ2ƒCƒ`ƒjƒ}ƒ”ƒ•ƒ¯ƒ´ƒ¸ƒ¿ƒÃƒÈƒÔƒðƒöƒü„„ „„„&„-„8„A„I„S„Y„d„j„q„s„~„‡„Ž„˜„¤„±„µ„Ä҄ބæ„ë„ð„õ„þ……… ……(…1…=…I…W…[…f…x…ƒ…‹…“…”…›…ž…®…¯…°…Ê…Û…ë…÷…û† ††††4†5†8†G†U†^†c†d†‚†„†™†¼†Ä†Ï†Ð†×†Ý†æ†ì†í‡‡‡‡=‡A‡G‡T‡\‡f‡r‡t‡Œ‡—‡Ç‡Þ‡ç‡î‡ö‡úˆˆ ˆˆˆ&ˆXˆrˆxˆˆ”ˆ•ˆ–ˆ—ˆ³ˆ¹ˆÄˆÖˆæˆòˆú‰‰ ‰‰%‰*‰5‰D‰N‰c‰u‰|‰‰‰•‰ž‰­‰´‰Ä‰Õ‰à‰ô‰ùŠŠŠŠ Š%Š/Š?ŠAŠYŠdŠŠŒŠ–ЗУХЧжŠËŠÛŠì‹‹‹‹%‹&‹)‹=‹A‹T‹f‹o‹ˆ‹›‹µ‹»‹Ê‹Õ‹Û‹ß‹è‹ð‹ô‹üŒŒ ŒŒ*Œ3Œ;ŒFŒTŒgŒtŒŒŽŒ¢Œ²Œ¶Œ½ŒÍŒÏŒæŒðŒ÷%)5Yabekpv‹š¦«²¹ÀÊÑÔæûŽŽŽŽŽ*Ž6Ž@ŽMŽhŽ}ޗޛ޷޼ŽÏŽÖŽæŽíŽöŽÿ 1>EP\`mr‚Œš±²¼É×÷&5X€…•šŸ©´¶½æç‘‘0‘1‘D‘_‘b‘e‘k‘p‘t‘z‘ƒ‘Š‘œ‘¬‘²‘³‘Ç‘Ù‘å’ ’2’\’‚’Œ’“’Ò’Ú’ø“1“<“C“E“R“Y“Z“]“^“}“““ž“¤“º“Ǔ֓ã“î“û“ÿ” ”””””” ”#”+”A”E”J”j”r”x”~”…””—””©”´”¸”¼”ǔϔהà”í”ø”ÿ•• •••"•-•2•<•¼•æ•î––G–O–u–‚–°–º–í–õ—&—Y—†—ª—Ñ—Ø—ç—ð—ô—ú—þ˜˜˜˜˜˜$˜.˜>˜J˜X˜b˜h˜~˜“˜ª˜Â˜É˜Ö˜å˜í˜ñ˜û˜þ™™™&™*™,™4™7™:™I™^™k™x™…™Œ™™™¥™«™´™¼™Ä™È™Ñ™Ú™ã™è™÷šš ššš+š3š6šBšRš\šfšwš‰šš—š¤š»šÈšÐšÙšèšðšüpackage_config.package_configFileDirectoryUint8ListdiscoverthrowErrorloadPackageConfigfilepreferNewestonErrorloadPackageConfigUriloaderfindPackageConfigdirectoryrecursefindPackageConfigUrilocationsavePackageConfigconfigurationpackage_config.package_config_typesPackageConfigPackageLanguageVersionInvalidLanguageVersionPackageConfigErrorpackages_filedefaultLoaderpathJoinpackageConfigJsonPathpath.dart_tool/package_config.jsondotPackagesPath.packagescurrentPath.parentPath..baseDirectoryrecursive:async_future:is_sync:return_value:async_op_then:async_op_error:await_jump_var:await_ctx_var:saved_try_context_var0:async_op:result:exception:stack_traceisAbsoluteabsoluteexistspackageConfigparentDirectoryparentexceptionstack_traceisSchemepackageMust not be a package: URIresolveUriendsWith/bytesfindPackagConfigInDirectorypackageConfigFilecheckForPackageConfigJsonFile.dart_toolpackage_config.jsoncheckForDotPackagesFile_PackageConfigArgumentErrorvaluenamemessagefromerrorinvalidValuePackageConfigFormatExceptionsourceoffsetmaxVersionemptypackagesextraDataparseBytesbaseUriparseStringparseJsonjsonDatawriteBytesoutputwriteStringtoJsonversion[]packageNamepackageOfresolvepackageUritoPackageUrinonPackageUrirootpackageUriRootlanguageVersionrelativeRootmaxValuemajorminorparsecompareToother==hashCodetoStringSimplePackageConfig_packages_packageTreevalidVersionsortedPackagessortpackageTree:sync-for-iteratorallPackagesiteratormoveNextpcurrent[]=_validateVersion<>Must be in the range 1 to _validatePackagesoriginalPackagespackageNamestreeoriginalPackagePackage : containsDuplicate package name ''addexistingPackageisRootConflictPackages and have the same root directory: . isPackageRootConflict is inside the package URI root of package URI root: root: valuessubstringlength+Must not be a package URIhasQueryhasFragmentMust not have query or fragment partrestschemeSimplePackagevalidatefatalErrorinvalidIndex>=Not a valid package nameIn package : Not an absolute URI with no query or fragment with a path ending in /hasSchemereplacefragmenthostpathSegmentsportqueryqueryParametersuserInfoThe package URI root is not below the package root_SimpleLanguageVersionBaseresultSimpleLanguageVersion_source*^&SimpleInvalidLanguageVersionunary-PackageTreeMutablePackageTree_packageChildren:sync_op_gen:sync_op:iterator_currentchildren_yieldEachIterablestarttreePackagetreePackagePathstartsWithtreePackagePathLengthtreePackageUriRoot_treeOffindPackageOfchildPackagechildPathchildPathLengthuriRootEmptyPackageTreeConflictExceptionpackageRootparseLanguageVersionindexreadNumeralMissing numbercharcodeUnitAtdigitfirstDigitNumber too large<=Leading zero not allowedMissing '.'Unexpected trailing character_beginsWithlongerPathi_compareRootp1p2dartToolDirNamepackageConfigFileNamepackagesFileNamereadAnyConfigFile:saved_try_context_var1alternateFileexistsSyncreadAsByteseurireadAnyConfigFileUrilastFile cannot be readparseAnyConfigFilefirstCharreadPackageConfigJsonFilereadDotPackagesFilewritePackageConfigJsonFileconfigtargetDirectorydartToolDircreatesinkopenWriteencodingmodedoneJsonclosedonePackages_configVersionKey_packagesKey_topNames_nameKey_rootUriKey_packageUriKey_languageVersionKey_packageNames_generatedKey_generatorKey_generatorVersionKey_jsonUtf8Decoderfusedecoder_jsonUtf8Encoder parsePackageConfigBytesjsonObjectconvertparsePackageConfigStringparsePackageConfigJsonjsonbaseLocationMust be an absolute non-package: URItypeNameTintstringarrayobjectcheckType of package is not a JSON parsePackageentryrootUrihasNamehasRoothasVersionforEachkeyMissing name entryMissing rootUri entryparsedRootUriinvalidmappackageListconfigVersionpackageArraypackageMappackage entryMissing configVersion entryMissing packages listwritePackageConfigJsonUtf8datawritePackageConfigJsonStringwritepackageConfigToJsonentrieswriteDotPackagescommentgeneratorgeneratedgeneratorVersionGenerated by on _extractExtraDatareservedNamesisEmptycontainsKeyfilteredDatakeys_validateJsonevery_languageVersionignoreLineseparatorIndexendMissing package name-queryStartfragmentStartNo ':' on lineLocation URI must not have queryLocation URI must not have fragmentpackageValuepackageLocationPackage URI as location for packageSame package name occured more than once/lib/Must be absolutelinessplitremoveLastcommentLine# writeln# generated by package:package_config at "" is not a valid package namePackage location must not be a package URI: :package_config.util_validPackageNameCharacters$lf$cr$space$hash$dot$colon$question$lbraceisValidPackageNamecheckPackageNamenonDotccheckValidPackageUriNot a package: URIhasAuthorityPackage URIs must not have a host partPackage URIs must not have a query partPackage URIs must not have a fragment partPackage URIs must not start with a '/'firstSlashindexOfPackage URIs must start with the package name followed by a '/'badIndexPackage names mus be non-emptyPackage names must contain at least one non-'.' characterbadCharCodebadCharU+toRadixStringpadLeft0' ()Package names must not contain isAbsoluteDirectoryUriisUriPrefixprefixfirstNonWhitespaceChartrailingSlashhasAbsolutePathrelativizeUritoLowerCasenormalizePathbaseisNotEmptytarget./skipjoinbuffern../writeAllpackage_config.util_iohttphttpsDefault URI unsupported scheme: _httpGetclientgetUrlrequestresponsestatusCodetoListsplitContenttotalLengthpartlistcontentPartsetRangefileNameseparatorlastSeparatorlastIndexOfdirNamepart1part2part3separator1separator2pathJoinAllparts2147483647 ! $ &'()*+,-. 0123456789 ; = @ABCDEFGHIJKLMNOPQRSTUVWXYZ _ abcdefghijklmnopqrstuvwxyz ~ package:package_config/package_config.dart@methodspackage:package_config/package_config_types.dartpackage:package_config/src/discovery.dart@getterspackage:package_config/src/errors.dart@constructorspackage:package_config/src/package_config.dart@factoriespackage:package_config/src/package_config_impl.dart@setterspackage:package_config/src/package_config_io.dartpackage:package_config/src/package_config_json.dartpackage:package_config/src/packages_file.dartpackage:package_config/src/util.dartpackage:package_config/src/util_io.dartdart:iodart:typed_datadart:coreboolObjectNulldart:asyncFutureUri_Uri_FutureFutureOrStackTraceFileSystemEntity_awaitHelperdart:_internalunsafeCastString_completeOnAsyncReturn_completeOnAsyncError_asyncThenWrapperHelper_asyncErrorWrapperHelperfromUriArgumentErrorFormatExceptionIterableSinkStringSinkMapComparableRangeErrorcheckValueInIntervalListofIteratornumSetdart:collection_CompactLinkedHashSet_GrowableList_SyncIterator_SyncIterablePatternEmptyIterabledart:convertIOSinkUtf8CodecEncodingFileModewait_literal2ConverterJsonCodecCodecJsonUtf8EncoderjsonDecodeJsonEncoderwithIndentMapEntryfromCharCodesDateTimenowStringBufferUnsupportedErrordart:_httpHttpClientHttpClientRequestHttpClientResponseStreamPlatformpathSeparatorEfficientLengthIterable_ImmutableMap_kvPairs_Override_allowMalformed_reviver_toEncodableÉ^-3-Ü.ˆ606064Uwö8E¿"˜U³kd£ùºNÉ^ UØ«ÍïE0000000000 …&7…A€â…[7…Š€³…¬€½…ȀŅä€â=€´€¾€Æ€ã†@†c€…`=†HE†]€å†ª†Ñ€…`=†´E†É€æ‡š‡¹€…`=‡ E‡µ€çˆ­ˆÇ€…`=ˆ·9ŽbŽq€„`H €„`I ‰@‰J‰`A‰P‰``€ãJ‰Sv‰[‰S`€€? ‰ê‰õòA ‰ýò`I>‰ýNŠý `HK>‹‹ =ˆ‹V‹K‹"`L>‹/‹lI‹5!‹B‹9 J‹Ku‹Z‹R ?=/‹aI‹üŒ€ŒVŒa`M`NPJŒuŒ'Œ ?=Œ,€Œ>VIŒFŒYŒP€èŒb€ça`M`NR>ŒgŒ—=ŒmxŒ‰xŒ|€ŒxV ' a`I`HS a`IT>ŒžÜNŒªŒ¯`IxŒµ€Œ±V^`N`IUN9C`VxQvJE‚4`VX”a`Y`V[@"qxea‚4‚f‚ea`V`I]'a`M`N^‹x{‚4‚€‚ea`V`I]'a`M`N^a’=™#®‚¤‚e“a`M`N_µ‚4xÁ¼‚4“‚΂e^`V`V`I``IJàuïç  ¦±ÏA»Ï`IJ¾vƾ`ICîõ‘àAý‘à‘`I‘`Ij`b‘4`Ij`b‘K`Ij`b‘b`Ij`b‘y`Ij`b‘`Ij`b`IJ‘Ÿx‘§‘Ÿ€‘°ƒ¹‘·ƒÄ‚‘¾ƒÖƒ‘Ń脑̃ú…‘Ó„ †‘Ú„^`I`I`I`I`I`I`I`IG’á’è“A ’ð“’ø`I`IJ“x“ “ €“„°a`I`IH”7”>”‘A!”V”‘”^`I`IJ”kx”s”k!€”Œ…a`I`II–ä–ë—A"–ò—–ú`I`IJ—x— —"€—…Pa`I`IJ›]›d›±A#›m›±›u`I›€$`Vj›ˆ`V`IJ›“x›››“#€›¥… ›«…«^`I`V`IKÝäžA%îžö`I`IJÿxžÿ%€ž†a`I`IL Á Æ ùA& Ð ù Ø`I`NJ áx é á&€ ô†aa`I`NM¡õ¡ú¢-A'¢¢-¢ `I`NJ¢x¢¢'€¢(†±a`I`NN£Î£Ó¤A(£á¤£é`I`NJ£òx£ú£ò(€¤ ‡a`I`NO¥à¥ç¦èA)¥ë¦è¥ó`I¦ `Ij`b¦"`Ij`b¦9`Ij`b¦P`Ij`b¦g`Ij`b¦~`Ij`b¦•*`Ij`b`IJ¦¤x¦¬¦¤)€¦±‡Q¦¸‡\‚¦¿‡nƒ¦Æ‡€„¦Í‡’…¦Ô‡¤†¦Û‡¶‡¦â‡È^`I`I`I`I`I`I`I`I`IP©©©HA+©©H©(,]c`I`IJ©2x©:©2+€©Bˆca]c`I`IQ¬^¬k¬”A-¬p¬”¬x`I]d`IJ¬x¬‰¬-€¬ˆ½a`I]d`IR®¬®³®êA.®¿®ê®Ç`I`IJ®Ðx®Ø®Ð.€®å‰a`I`IS°•°œ°ÍA/°¥°Í°­`I`IJ°¶x°¾°¶/€°È‰ga`I`IT ´Þ´åµ4A0´íµ4´õ`Iµ1`Ij`b`IJµxµµ0€µ#‰·1µ/‰Ã^`I1`I`I\!¶A¶F¶ŽA2¶N¶Ž¶V3`I¶e4`I`NJ¶ox¶w¶o2€¶€Š*¶ˆŠ5a`I`I`N]"·M·R·”A5·X·”·`6`I·n7`I`NJ·xx·€·x5€·‡ŠŽ·ŽŠ™a`I`I`N^#¸”¸˜¸¿A8¸œ¸¿¸¤`I`VJ¸­x¸µ¸­8€¸ºŠòa`I`V_$¹I¹P¹A9¹`¹¹h`I`IJ¹qx¹y¹q9€¹Š‹Ba`I`I`%»#»*»‚A:»6»‚»>`I»K#`I`IJ»]x»e»]:€»r‹’»x‹a`I`I`Ia&½ô½û¾A;¾¾¾ [`IJ¾ x¾¾ ;€¾‹öa[`Ib'À@¨À@¬À@ÕA<À@±À@ÕÀ@¹`I`HJÀ@ÂxÀ@ÊÀ@Â<€À@ÐŒJa`I`Hc(ÀD‘ÀD˜ÀDÀA=ÀD¡ÀDÀÀD¢ [`IJÀDªxÀD²ÀDª=€ÀD¼Œ®a[`Id èbû/kŸ–æ6†÷G—ç7I£ý M  t Ø ( x Ü & Š è ) +!€†>`Vj`V,)5€†?`Vj1`V-=J€†@`VjF`V.R^€†A`VjZ`V/fq€†B`Vjm`V0y„€†C`Vj€`V1Œ˜€†D`Vj”`V2 ­€†E`Vj©`V 3µÂ€†F`Vj¾`V 4Ê×€†G`VjÓ`V 5ß쀆H`Vjè`V 6ô‚€†I`Vj‚`V ¡ r¡ 7€ÚeJ€÷K)L6T€“o€³€â=‚m‚sÀ›ÃM`M?‡‡ €`€€A‡˜‡ €7`Ig†0†0†ŒN7†A†Œ`=??&†c†Z€è`€€A+ †0gh†‘†‘†µO7†š†µ† `€€†¬`I`=??€ŠA• †‘g E„3„;…ïA„B…ï„K`€ãj`b„Z `Ij`b`=>„d…ïI„j„v„nî>„„ëI„‡„‘€„‹Ü>„š„¿=‰„¤î„° >„Æ„å=‰„Ðî' ?I„ò„ü€„öÜ>……)=ˆ… Ü…€èI…0!%…:…4Ü`€ã`€€>…M…³=0…U…[j$…h'P'Q?J…º…Éh&…Ñ…ËÜ`€ã`€€…ãî`IB‡æ‡ñˆ@ ‡ùˆ`IJ‡ü5ˆ‡ü`Iv‡ü.7`IA#‡ü€‡üçˆ ‡üç`I`ICˆŠˆ•ˆ±@ˆŸˆ±`IJˆ¢vˆ¨vˆ¢.`€€?`I€‚GŠWŠ^Œ‡@ŠfŒ‡Šn`IŠ„`Ij`bŠ™`Ij`bŠ®`Ij`bŠÃ`Ij`bŠØ`Ij`bŠí`Ij`b`I>ŠõŒ‡=Šû<'‹!n`I€‹"‘s‹)‘~‚‹0‘ƒ‹7‘¢„‹>‘´…‹E‘Ɔ‹L‘ØI‹Û""‹å‹ß‘~x‹ð.&€‹û‘sa`I`NM!xŒ.(€Œ‘sa`I`NO>ŒŒ7JŒ%€Œ,‘s?JŒ>xŒE.)vŒJ. `IB€ŒS‘sŒZ‘~‚Œa‘ƒŒh‘¢„Œo‘´…Œv‘ƆŒ}‘Ø^`I`I`I`I`I`I`I`I`IPHÌÓŽ@ ÛŽã`I`IJìvùxì.R7€ó“a`I`€”[ `I€œIY`´@!x´€`I`IJvœx.R7€–“la`I`€”[!`I€JÚá’@@"è’@ð`I`I>ö’@N‘‘ S`€”x‘ .R7€‘“Æa`I`€”[=x‘$‘“ßTa\€§I‘Dv‘Uv‘O‘H“ß,]d`I€™U`NpJ‘^5‘q‘l`Iv‘l‘e“ßV`I€—#‘l‚‘l”L' ‘l”L`I`I?I‘}‘•v‘Žv‘ˆ‘“ß,]d`I€™`Vr”a`M`N_J‘›5‘®‘©`Iv‘©‘¢“ßV`I€—#‘©‚‘©”Â' ‘©”Â`I`I?=x‘Çv‘Á‘º“ß,]d`I€™Wa`It=x‘ëv‘à‘Ù“ßX]d`I€šWa`It=x’‘ý“ßTa\€§J’$x’2’+“ß a`I€©K–Û–â—0@#–ë—0–ó`I–þ$`Vj—`V`IJ—x— x—.R7€—•ža`I`€”[#—*•©^`V`I€¦L™¦™­™ñ@%™·™ñ™¿`I`IJ™Èx™Í€™È–!“x™àv™Ú.`€€?Y€™ë–!^`IZ`N`V€‡^`V`V`I`Mœµœºœï@&œÄœïœÌ`I`NJœÕxœìxœÛvœÕ.`€€?Y€œæ–¬^`IZ`N`V€‡[“a`Y`NuNõúž&@'žž&ž `I`NJž!xž.&€ž!—)a`I`NMOŸÙŸÞ @(Ÿì Ÿô`I`NJŸýx vŸý.`€€?(€ —wa`I`N€‰P¡î¡õ£€@)¡ù£€¢`I¢`Ij`b¢,`Ij`b¢A`Ij`b¢V`Ij`b¢k`Ij`b¢€`Ij`b¢•*`Ij`b`I>¢£€N¢©¢¯,]d`I¢ºv`I€¢Â—Тϗۂ¢Ü—탢é—ÿ„¢ö˜…£˜#†£˜5‡£˜G=£.<')£G˜gJ£Sx£Z.+x£h£b˜g\`Ia]c`Ixa]c`I`IQQ¥£¥ª«3@+¥±«3¥Ã,]c`I`I>¥Ê«3N¥Ö¥Ý]`y¥ß{N¥÷¦^`N*N¦¦4_`N*>N¦Y`]|`Iv¦Yx¦Y€¦S™a4¦_¦_¦s¦`b`I`NJ¦i!¦n„¦i™¢'a`M`N^aa`I`N]c`I}c]|`I~Ex¦Y„™rda`N€>N¦Kb`Iv¦v„™r `I‚>¦v«I¦~"x¦‚.(…¦‘ša`I`NOƒ¦š™`>¦¸¨‘N§?§FS`€”x§H.R7…§Oša`I`€”[N§d§i`Ix§r§k™< a`I„=w§†§†šjVx§¥‡§ š•“x§¸v§².`€€?Y‡§Ãš•Z)^`IZ`N`V€‡^`V`V`I`€¡I§äx§îv§è.`€€?^u¨v¨†§ýšjV`I€—a`I`N€†>¨ ¨H=x¨)v¨†¨šjX]d`I€še“v¨5v¨/.`€€?`I€‚a`V`I\…?=x¨Y¨R™¨®©c=‹¨¸™`!x¨Ø.(…¨çša`I`NO=x©8©1™©jªpI©t"v©}…©xšh`Nˆx©‘v©‹.`€€?ix©§…©£š“a`V`I]a`I`N€„>©­ªIª ‚ª™R>ªªK=xª1ª*™®Ê¯äN®Ö®ÝS`€”x®ß.R7€®æœa`I`€”[=w¯F¯?º,x¯|x¯[v¯U¯Nº,]d`I€™a4¯a¯a¯z¯bb`I`NJ¯kv¯p‚¯kž!h`Nˆaa`I`N]c`I}j^k`N]d`I‰€£I¯Š!¯šv¯•¯ŽºV`I€—=x¯°v¯ª¯£º,]d`I€™l“u¯Åv¯Á¯ººV`I€—a`V`I\Š?J¯Ív¯Û¯Ôº,]d`I€™S²²³ @.²)³ ²1`I`I>²7³ =ˆ²=Ÿx²D.€²MŸ^`I`I`I`I`I`I`I`IGI²X"!²bv²\.`€€?²k€æa`M`NR!x²w.m7€²‹Ÿa`I`NVJ²’€²™Ÿ?N²ª²±S`€”x²³.R7€²ºŸa`I`€”[=x²Ì²ÅŸÁ/.)^.`N\€¨J²ïx²ý²öŸÁ a`I€©T´Î´Õµy@/´Þµy´æ`I`I>´ìµyI´ò!x´÷.m7€µ  Fa`I`NVJµ€µ F?Nµ*µ1S`€”xµ3.R7€µ: Fa`I`€”[=xµLµE ‹/^.`N\€¨Jµ]xµkµd ‹ a`I€©Vµ³µ¸½ö@m7µË½öµÓ`I`N>µÙ½ö Nµãµén`V“Nµø¶o]d`Vv¶ €¶¡o]d`V‹N¶p`VN¶8q`VN¶ó¶øV`Vx·v¶ú.`€€?Y€· ¡^`IZ`N`V€‡I·!·…·¡v“a`M`N_>·%¸Y=‰·-¡(…·5¡v=Œ·A¡jj·R`VI·Ä·Îv·È.`€€?·×€æa`M`NR>·à¸SE·ê·ó·õr`V“x·ü†·ú¢s…·þ¡va`Y`NŒޏ¢x¸†¸¢t”a`Y`V>¸ ¸KI¸¸&x¸"‚¸¡6†¸#¢a`V`VŽj¸/`Va`M`N_J¸6)???E¸`¸i¸kr`V¸m¡(x¸v†¸t¢Ãsv¸‚‚¸x¡6`Vra`Y`NŒޏТÃx¸‹†¸Š¢Ãt”a`Y`V>¸¼ N¸¸¦u`Vx¸±‚¸¨¡6†¸²¢Ãa`V`VŽI¸¼x¸Æv¸À.`€€?v‡¸Ò£.a`V`N€…>¸Ý»ÛI¹2"¹»²»ÓJ»¾)??=‹»ä¡^„»÷¡j=Œ¼¡j‡¼£.I¼Q¼^„¼U¡jJ¼g)?I¼¡x¼«v¼¥.`€€?v¼·¡j`Va`V`N€…J¼Â)?I½"½,½#¡j`Vj½5`Va`M`N_""½Yƒ½H¡^x½vv½p.`€€?v½‚¡^`Va`V`N€…½´½£¡^`Vj½½`Va`M`N_>½Æ½ßJ½Î)?J½æ*\ÀCªÀC±ÀO›@0ÀC¹ÀO›ÀCÁ`IÀCÐ1`Ij`b`I>ÀC×ÀO›IÀD!"ÀD*ÀD%¥ÕxÀD5.'€ÀD@¥Ça`I`NNJÀDGxÀDN./€ÀDX¥Ça`I`IT?=‰ÀDd¥Õ#ÀDpÀDk¥ÕvÀDz. `IBxÀD„.ÀD¥Õ`I^`I`I`I`I`I`I`I`IG`IIÀDæ"xÀDê.'ÀDõ¥Õ`Ia`I`NNxÀDþ.&€ÀE ¥Ça`I`NM>ÀEÀE4JÀExÀE./€ÀE)¥Ça`I`IT?IÀE "xÀE¤.'€ÀE¯¥Ça`I`NNxÀE¸.(€ÀEÇ¥Ça`I`NO>ÀEÎÀEñ=ˆÀEÖ¥ÇxÀEÝ.€ÀEæ¥Ç^`I`I`I`I`I`I`I`IG?IÀFo"xÀFs.'€ÀF~¥Ça`I`NNxÀF‡.&ÀF’¥Õ`Ia`I`NM>ÀF™ÀFì=0ÀF¡ÀF§€¼$ÀFå'w€ÀFÑ¥Ç'xÀFÞ¥Õ`I'y?NÀFùÀGz`€”5ÀGÀG`€”xÀG.R7ÀG ¥Õ`Ia`I`€”[R=xÀG‚ÀG¨}/^.`N\€¨‚ÀG¨}NÀG+ÀG6{`€”5ÀG8ÀG8`€”xÀG8.R7€ÀG?¥Ça`I`€”[R=xÀGFƒÀG8¨÷/^.`N\€¨ƒÀG8¨÷IÀGX"vÀGmvÀGg‚ÀG\¨h,]d`I€™h`NÀGxÀG‹vÀG†‚ÀG{¨h,]d`I€™“a`V`IŽ' a`M`N^>ÀG—ÀGÁJÀGŸxÀG±ƒÀG¦¨â a`I€©?IÀHû"!ÀIvÀI ‚ÀHÿ¨hV`I€—vÀIƒÀI¨âV`I€—a`M`N^""ÀI?vÀI:‚ÀI/¨hV`I€—ÀIZvÀIUƒÀIJ¨âV`I€—!xÀIyvÀIs.`€€?|uÀI“vÀI‚ÀI„¨hV`I€—uÀI¥vÀI¡ƒÀI–¨âV`I€—a`I`I`N€Ž>ÀIªÀIÔJÀI²xÀIăÀI¹¨â a`I€©?CÀJ""vÀJvÀJ‚ÀJ¨h,]d`I€™h`NvÀJ@vÀJ:ƒÀJ/¨â,]d`I€™h`NxÀJ\vÀJV.`€€?|xÀJwvÀJr‚ÀJg¨h,]d`I€™“a`V`IŽxÀJŒvÀJ‡ƒÀJ|¨â,]d`I€™“a`V`IŽa`I`I`N€Ž>ÀJ’ÀK2=xÀJ«vÀJ¥‚ÀJš¨h,]d`I€™}“a`V`I=xÀJÔvÀJÉ‚ÀJ¾¨hX]d`I€š}”a`V`I=xÀJøvÀJòƒÀJç¨â,]d`I€™}“a`V`I=xÀK!vÀKƒÀK ¨âX]d`I€š}”a`V`IIÀKù"vÀLvÀL‚ÀKý¨h,]d`I€™h`NÀL0xÀL,vÀL'‚ÀL¨h,]d`I€™“a`V`IŽ'~a`M`N^>ÀL9ÀLŒ=0ÀLAÀLG€¼$ÀL…'w€ÀLq¥Ç'xÀL~¥Õ`I'y?=xÀL£vÀLƒÀL’¨â,]d`I€™“ÀLµ“`IvÀLÍvÀLÇ‚ÀL¼¨h,]d`I€™`Vr'~a`V]c`I\”=xÀLövÀLìƒÀLá¨âX]d`I€še“'a`V`I\…=xÀM#vÀMƒÀM¨âX]d`I€š”ÀM5“`IvÀMMvÀMG‚ÀM<¨h,]d`I€™`VrvÀM[vÀMU.`€€?`I€‚a`V]c`I\”IÀM¡vÀM¶vÀM°ƒÀM¥¨â,]d`I€™U`NpJÀM¿' ?IÀNL"xÀNhvÀNavÀN[ƒÀNP¨â,]d`I€™`Vr[”a`Y`NuÀN…vÀN€vÀNzƒÀNo¨â,]d`I€™€€`I•' a`M`N^>ÀNÀO=xÀN¦vÀN ƒÀN•¨â,]d`I€™Wa`It=5ÀNÅÀNÅ]d`IvÀNŃÀNº¨âX]d`I€šR=xÀNÚ„ÀNůÊWa`It=xÀNñ„ÀNůÊWa`It=xÀO„ÀNůʀ'a`I\–„ÀNůÊ?=wÀO@ƒÀO5¨âV'€¡=xÀOZƒÀOO¨âTa\€§JÀO{xÀOƒÀO‚¨â a`I€©]ÀPÄÀPÉÀQ0@2ÀPÑÀQ0ÀPÙ3`IÀPè4`I`NJÀPøÀQxÀPø.€‚7€ÀQ °ÔÀQ°áa`I`I`tWjÀQ*`ta`M`NR^ÀQûÀRÀRb@5ÀRÀRbÀR6`IÀR7`I`NJÀR,ÀRLxÀR,.€‚7€ÀR>±hÀRE±ua`I`I`tWjÀR]`ta`M`NRWÀS ÀSÀZ1@€‚7ÀS*ÀZ1ÀS23`IÀSA4`I`t>ÀSH NÀT$ÀT5€ƒ`NxÀT7.&€ÀTB±þa`I`NMNÀTUÀTe€„`NxÀTg.&ÀTr² a`I`NMIÀT~"‚ÀT‚²&!ƒÀT—²Y>ÀT¨ÀU=‰ÀT°² xÀT¸.ÀTÁ² ^`I`I`I`I`I`I`I`IGIÀTÏxÀTÙvÀTÓ.`€€?(€ÀTè±þa`I`N€‰=ˆÀTñ±þxÀTú.€ÀU±þ^`I`I`I`I`I`I`I`IG?IÀU"ƒÀU²Y!‚ÀU/²&>ÀUAÀU¨=ˆÀUI±þxÀUR.€ÀU[±þ^`I`I`I`I`I`I`I`IGIÀUjxÀUtvÀUn.`€€?(ÀUƒ² a`I`N€‰=‰ÀU‹² xÀU“.ÀUœ² ^`I`I`I`I`I`I`I`IG?IÀU¯"ƒÀU³²Y‚ÀUƲ&>ÀUØÀW&NÀUæÀUú€…`NxÀVvÀUü.`€€?(ÀV² a`I`N€‰NÀV%ÀV:€†`NxÀVBvÀV<.`€€?(€ÀVQ±þa`I`N€‰IÀVa"„ÀVe´m!…ÀV}´®>ÀV“ÀV¼=‰ÀV² xÀV¥.ÀV®² ^`I`I`I`I`I`I`I`IGIÀVÃ"…ÀVÇ´®!„ÀVà´m>ÀVõÀW =ˆÀVÿ±þxÀW.€ÀW±þ^`I`I`I`I`I`I`I`IG??NÀW3ÀW:€‡`txÀW<.€ˆ7€ÀWR±þÀWZ² a`I`I`tXIÀWf!ÀWq„ÀWjµ½jÀW‚`ta`M`NRJÀW„ÀW—µ½?NÀW«0`IK>ÀW½ÀWø=ÀWŶ2xÀWÕ.0ÀWÞ² 1€ÀWë±þ^`I1`I`I\ÀWú`€´ÀXO`€´>ÀXÀX¸JÀX”jÀX©`tIÀX¿!xÀXÄ.'…ÀX϶2a`I`NNJÀXÚjÀXï`t?IÀXþÀY …ÀY¶2' a`M`N^JÀYjÀY(`t?IÀY3ÀY@…ÀY7¶2'~a`M`N^JÀYIjÀY^`t?JÀYm#""xÀY…vÀY~…ÀYu¶2`VX€‰–a`Y`N—xÀY¢…ÀY™¶2€Š'~^`˜`V`N™xÀYÈvÀYÂ.`€€?vxÀYÝ…ÀYÔ¶2€‹•a`V`Vša`V`N€…jÀZ`tjÀZ'`t`tXÀZžÀZ¬Àxb@€ˆ7ÀZÁÀxbÀZÉ3`IÀZØ4`I`t>ÀZßÀxbIÀ[XÀ[c€À[\¸A' a`M`N^=ˆÀ[k¸A'?NÀ[ƒÀ[”€Œ`VxÀ[œvÀ[–.`€€?Y€À[§¸A^`IZ`N`V€‡NÀ[ºÀ[Ê€`VxÀ[ÒvÀ[Ì.`€€?YÀ[ݸN^`IZ`N`V€‡IÀ]#!À]8‚À]'¸˜ƒÀ];¸äa`M`N_JÀ]LjÀ]a`t?EÀ^?À^HÀ^Jr`V“xÀ^Q„À^O¹ls‚À^S¸˜a`Y`NŒŒÀ^e¹lxÀ^f„À^e¹lt”a`Y`V>À^jÀ_FNÀ^xÀ^‡€Ž`VxÀ^€À^‰¸A€‹„À^›¹la`V`VšNÀ^«À^¹€`VxÀ^ÁÀ^»¸N€‹„À^̹la`V`VšIÀ^Ö!xÀ^ávÀ^Û.`€€?€…À^ð¹Û†À_ºa`V`V`N€>À_À_@JÀ_jÀ_/`t?NÀ`À` €‘`VjÀ``VNÀ`[€’`VNÀ`ÆÀ`Ò€“`V‚À`Ô¸˜NÀ`îÀ`ù€”`VƒÀ`û¸äACÀa"xÀa#†Àaº×svÀa,€Àa%¸A`VXa`Y`NŒxÀaA‡Àa6ºðsvÀaIÀaC¸N`VXa`Y`NŒA>ÀaQÀnð NÀa]Àal€Ž`VxÀau€Àan¸A€‹†Àa€º×a`V`VšNÀa˜Àa¦€`VxÀa®Àa¨¸N€‹‡Àa¹ºða`V`VšIÀaÌxÀaÖvÀaÐ.`€€?€Àa廈Àaõ»Ã a`V`V`N€>ÀbÀbÜIÀbxÀbvÀb.`€€?vÀb%»ˆa`V`N€…>Àb6Àbm=ÀbBºÈ†ÀbXº×?=ŒÀbxº¬Àb‡»ˆ=ŽÀbŸº×xÀbª†ÀbŸº×t”a`Y`V=Àb¶ºðxÀbÀ‡Àb¶ºðt”a`Y`VBÀbÌ?IÀc"xÀcvÀc.`€€?vÀc)»ˆa`V`N€…xÀcLvÀcF.`€€?v„ÀcXº¬a`V`N€…>ÀcgÀcÃ=ÀcqºÈ†Àc‡º×=ŽÀcœº×xÀc§†Àcœº×t”a`Y`VBÀc³IÀcÊ"xÀcÔvÀcÎ.`€€?vÀcà»Ã a`V`N€…xÀdvÀcü.`€€?v„Àdº¬a`V`N€…>ÀdÀdM=Àd'ºðxÀd1‡Àd'ºðt”a`Y`VBÀd=?IÀeÂ"ÀeÕÀeÆ»ˆjÀeÞ`Va`M`N_xÀeîvÀeè.`€€?v„Àeúº¬a`V`N€…>Àf ÀiÛ=ŽÀfº×xÀf†Àfº×t”a`Y`VIÀf¶ÀfƆÀfºº×vÀfЀÀfɸA`VXa`M`N_BÀfØ?=Àf终xÀfÿ€Àfø¸A€‹†Àg º×a`V`VšIÀgRxÀg\vÀgV.`€€?vÀgh»ˆa`V`N€…>ÀgyÀgÝ=Àg…ºÈ†Àg›º×=ŽÀg²º×xÀg½†Àg²º×t”a`Y`VBÀgË?IÀhcÀhvÀhg»ˆjÀh`Va`M`N_>Àh‡ÀiV=ŽÀh“º×xÀhž†Àh“º×t”a`Y`VIÀh¬"Àh¼†Àh°º×vÀhÆ€Àh¿¸A`VXa`M`N_xÀhävÀhÞ.`€€?vxÀh÷€Àhð¸A€‹†Àiº×a`V`Vša`V`N€…>ÀiÀiLJÀijÀi4`t???IÀjE"ÀjWÀjI»Ã jÀj``Va`M`N_xÀjpvÀjj.`€€?v„Àj|º¬a`V`N€…>Àj‹Àlm=Àj•ºðxÀjŸ‡Àj•ºðt”a`Y`VIÀj«Àjº‡Àj¯ºðvÀjÃÀj½¸N`VXa`M`N_BÀjË?=Àjڻà xÀjðÀjê¸N€‹‡Àjûºða`V`VšIÀkxÀkvÀk.`€€?vÀk'»Ã a`V`N€…>Àk7Àkm=ÀkCºðxÀkM‡ÀkCºðt”a`Y`VBÀk[?IÀkxÀkŠÀk|»Ã jÀk“`Va`M`N_>Àk›Àle=Àk§ºðxÀk±‡Àk§ºðt”a`Y`VIÀk¿"Àk·ÀkúðvÀk×ÀkѸN`VXa`M`N_xÀkõvÀkï.`€€?vxÀlÀl¸N€‹‡Àlºða`V`Vša`V`N€…>Àl Àl[JÀl.jÀlC`t???NÀmvÀm…€•`ixÀm‡.€–7Àm–¸N‡Àmºða`I`V`iYIÀm°!ÀmÃÀm´ÀCI jÀmÕ`ia`M`NR>ÀmàÀnJÀmêjÀmÿ`t?NÀn"Àn2€—`ixÀn4.€–7€ÀnC¸A†ÀnKº×a`I`V`iYIÀn_!ÀnsÀncÀCÎ jÀn…`ia`M`NR>ÀnÀnÃJÀnšjÀn¯`t?JÀnÌjÀná`tIÀpDÀpS‡ÀpHºðvÀp\ÀpV¸N`VXa`M`N_>ÀpdÀrgIÀpl"Àp|†Àppº×vÀp†€Àp¸A`VXa`M`N_xÀp vÀpš.`€€?vxÀp³€Àp¬¸A€‹†Àp¾º×a`V`Vša`V`N€…>ÀpÍÀq=Àp׺ȆÀpíº×>ÀqÀqR=#Àq%…ÀqºÈÀqºÈÀq)œ`V“xÀqF‚Àq5¸˜”a`Y`V[+`VNÀqaÀqk€˜`ixÀqm.€–7€Àq|¸AÀq„ºÈ`Va`I`V`iYIÀq Àq®Àq¤ÀE—jÀqÀ`ia`M`NRJÀqÈjÀqÝ`t?JÀqê#ÀqûÀqñÀE—jÀr `ia`M`NRjÀr1`tjÀrX`t`t?NÀs0Às:€˜`ixÀs<.€–7ÀsK¸N‡ÀsRºða`I`V`iYIÀt›Àt©ÀtŸÀF\jÀt»`ia`M`NRJÀtÃjÀtØ`t?IÀvJÀvXÀvNÀF\jÀvj`ia`M`NR>ÀvuÀv¤JÀv}jÀv’`t?JÀw¶#"xÀwÄvÀw¾.`€€?vxÀwÖÀwиN€‹‡Àwáºða`V`Vša`V`N€…xÀxvÀwý.`€€?v„Àxº¬a`V`N€…jÀx6`tjÀxU`t`tYÀz¡Àz°À€¯@€–7Àz¾À€¯ÀzÆ`IÀzЀ™`V`i>Àz×À€¯NÀzáÀz瀚`V“NÀzôÀ{€›`N*NÀ{À{r`VÀ{ÀGíACÀ{ xÀ{)„À{'ÀH2svÀ{0€À{+ÀGà`VXa`Y`NŒ>À{8ÀçCÀ{z"xÀ{ƒ„À{ÀH2svÀ{Š€À{…ÀGà`VXa`Y`NŒxÀ{švÀ{”.`€€?vxÀ{«€À{¦ÀGà€‹„À{¶ÀH2a`V`Vša`V`N€…>À{»À{Ð=ŒÀ{ÅÀH2xÀ{Æ„À{ÅÀH2t”a`Y`VIÀ{ýÀ|„À|ÀH2vÀ| €À|ÀGà`VXa`M`N_BÀ|?NÀ|gÀ|mn`V„À|oÀH2CÀ|x"xÀ|„À|ÀH2svÀ|ˆ€À|ƒÀGà`VXa`Y`NŒ!xÀ|™vÀ|“.`€€?vxÀ|ª€À|¥ÀGà€‹„À|µÀH2a`V`Vša`V`N€…>À|ºÀ|Ï=ŒÀ|ÄÀH2xÀ|Å„À|ÄÀH2t”a`Y`VIÀ}"À}"xÀ}„À}ÀH2…À}ÀI£a`Y`V[”a`M`N_À}AxÀ}/€À}*ÀGà€‹…À}:ÀI£a`V`VšjÀ}J`Va`M`N_>À}RÀ}}IÀ}„""À}’xÀ}Š„À}ˆÀH2…À}ŒÀI£a`Y`V[•a`M`N_À}»xÀ}©€À}¤ÀGà€‹…À}´ÀI£a`V`VšjÀ}Ä`Va`M`N_À}óxÀ}Ý€À}ØÀGà€‹xÀ}î…À}èÀI£t”a`Y`Va`V`VšjÀ}ü`Va`M`N_>À~À'=ŠÀ~5ÀH xÀ~:‚À~5ÀH ”a`Y`V[IÀ~yxÀ~ƒ‚À~}ÀH s“a`Y`NŒBÀ~ˆ?IÀ~ýÀ‚ÀÀH “a`M`N_=‹À ÀH)?>À.Àk=ŠÀ\ÀH xÀa‚À\ÀH t”a`Y`VIÀ˜Àž„ÀœÀH2vÀ¦€À¡ÀGà`VXa`M`N_BÀ®?=ŒÀÞÀH2xÀß„ÀÞÀH2t”a`Y`VIÀîxÀø‚ÀòÀH s“a`Y`NŒJÀýjÀ€`i?IÀ€"À€,‚À€&ÀH “a`M`N_JÀ€2jÀ€H`i?IÀ€TƒÀ€XÀHJÀ€ejÀ€{`i?JÀ€ŒjÀ€¢`i_ÀbÀfÀ‚¹@8ÀjÀ‚¹Àr`I`V>ÀxÀ‚¹=ˆÀðÀNxÀ÷.€À‚ÀN^`I`I`I`I`I`I`I`IGNÀ‚À‚€‡`VxÀ‚.€œ7€À‚%ÀNa`I`VZIÀ‚0!À‚;À‚4ÀN~JÀ‚DÀ‚KÀN~`V?NÀ‚^À‚eS`€”xÀ‚g.R7€À‚nÀNa`I`€”[=xÀ‚€‚À‚yÀNß/^.`N\€¨JÀ‚‘uÀ‚´xÀ‚˜.€œ7xÀ‚©‚À‚¢ÀNß a`I€©a`I`VZZÀƒuÀƒzÀŠ—@€œ7ÀƒƒÀŠ—Àƒ‹`I`V>Àƒ‘ÀŠ—NÀƒ›Àƒ 8`V7‘ûNÀƒ°Àƒº€`N)NÀƒÊÀƒ×€ž`N)AEÀƒãÀƒìÀƒîr`V“xÀƒõ„ÀƒóÀPsvÀƒü€Àƒ÷ÀO§`VXa`Y`NŒŒÀ„ÀPxÀ„„À„ÀPt”a`Y`VA>À„ ÀŠ‚NÀ„À„ u`VxÀ„(vÀ„".`€€?€ŸxÀ„B€À„=ÀO§€‹„À„MÀPa`V`Vša`V`V€IÀ…xÀ…vÀ….`€€?v…À…(ÀPŒa`V`N€…>À…3À…j=‹À…=ÀOí)BÀ…Z?IÀ…s"À…€…À…wÀPŒjÀ…‰`Va`M`N_ƒÀ…“ÀOí>À…¡À‰ºIÀ‡À‡xÀ‡„À‡ÀPt”a`Y`VvÀ‡!€À‡ÀO§`VXa`M`N_BÀ‡)?NÀ‡?À‡D€ `VxÀ‡K€À‡FÀO§€‹xÀ‡X„À‡VÀPt”a`Y`Va`V`VšIÀ‡ÊxÀ‡ÔvÀ‡Î.`€€?v†À‡àÀQßa`V`N€…BÀ‡ç?IÀˆú""!‚ÀˆÿÀOÚÀ‰†À‰ÀQßjÀ‰&`Va`M`N_"À‰CxÀ‰?„À‰=ÀPt•a`Y`VvÀ‰K€À‰FÀO§`VXa`M`N_xÀ‰kvÀ‰e.`€€?vxÀ‰|€À‰wÀO§€‹xÀ‰‰„À‰‡ÀPt•a`Y`Va`V`Vša`V`N€…>À‰‘À‰²JÀ‰+??=‰ÀŠ ÀOÆxÀŠÀŠ ÀOÆ€¡7Ãÿÿÿa`V`Vž=‰ÀŠ%ÀOÆxÀŠ*ÀŠ%ÀOÆ€¢7!a`Y`VŸ=‰ÀŠ7ÀOÆxÀŠ<ÀŠ7ÀOÆ€£…ÀŠ?ÀPŒa`V`V =‹ÀŠOÀOí*=ŠÀŠkÀOÚ*JÀŠˆÀŠÀOÆ`À‹/À‹6ÀŒR@9À‹FÀŒRÀ‹N`I`I>À‹TÀŒRNÀ‹`À‹gS`€”xÀ‹i.R7€À‹pÀTda`I`€”[AEÀ‹|À‹…À‹‡r`VxÀ‹vÀ‹–vÀ‹À‹‰ÀTƒ,]d`I€™`Vr”a`Y`V[xÀ‹¤‚À‹¢ÀT¾€‰“a`Y`N—ŠÀ‹ªÀT¾xÀ‹«‚À‹ªÀT¾”a`Y`V[>À‹¯ÀŒ/IÀ‹·vÀ‹ËxÀ‹ÇvÀ‹ÂÀ‹»ÀTƒ,]d`I€™‚À‹ÈÀT¾a`V`IŽh`Nˆ>À‹×ÀŒ)=xÀ‹ívÀ‹èÀ‹áÀTƒ,]d`I€™e‚À‹îÀT¾vÀ‹úÀ‹óÀTƒ!`I€a`V`I\…BÀŒ?JÀŒ6xÀŒDÀŒ=ÀTƒ a`I€©aÀŽ$ÀŽ+ÀŽ‚@:ÀŽ7ÀŽ‚ÀŽ?`IÀŽL#`I`IJÀŽ`xÀŽwxÀŽ`.9€ÀŽqÀVua`I`I`tÀŽyÀV‚a`I`I¡bÀ‘GÀ‘NÀ‘@;À‘UÀ‘À‘V [`IJÀ‘^xÀ‘dvÀ‘^.`€€?€¤À‘p;€À‘zÀWa`H`I€ŠcÀ“ºÀ“¾À”k@<À“ÃÀ”kÀ“Ë`I`H>À“ÑÀ”kIÀ“×xÀ“Û.'€À“æÀW}a`I`NN>À“íÀ”JÀ“õxÀ”vÀ“ü.`€€?€¥€À”ÀW}a`I`H€‹>À”&À”gJÀ”.xÀ”;vÀ”5.`€€?€¦xÀ”M.)vÀ”R. `IB€À”[ÀW}^`I`I`I`I`I`I`I`I`IPa`I`H€ŒdÀ™À™ À›}@=À™À›}À™ [`I>À™À›}NÀ™$À™-€§`HÀ™/;€À™9ÀX´IÀ™C"À™WvÀ™PÀ™GÀXЀ¨`I¢'€©a`M`N^À™jvÀ™d.`€€?À™s€ça`M`NR>À™xÀ™ JÀ™€xÀ™À™‡ÀXÐ a`ITIÀ™§""!À™»vÀ™´À™«ÀXЀ¨`I¢'€©a`M`N^!À™àvÀ™ÙÀ™ÐÀXЀ¨`I¢'a`M`N^!À™÷vÀ™ñ.`€€?Àš€ça`M`NR>ÀšÀš-JÀš xÀšÀšÀXÐ a`IT?NÀš:Àš?`IxÀšA./xÀšK.;ÀšSÀXÐa[`Iba`I`ITNÀšiÀšm€ª`IxÀšo.0‚ÀšxÀZ@^`I1`I`I\JÀ›?#xÀ›XvÀ›QxÀ›F.-ƒÀ›LÀZ‹a`I]d`IR`Vr[vÀ›fxÀ›Z.-‚À›`ÀZ@a`I]d`IR`Vra`Y`Nu‚À›oÀZ@ƒÀ›vÀZ‹`I[À›‚À›À›Á@R7À›“À›ÁÀ››`I`€”JÀ›¤À›¯€¯€À›µÀ[“vÀ›».`€€?Á¿YøR¬„’]¶‚ý , ô%£0°1D1Ø8GºMñOT@VQVâWYX[n[Ï iÀ OÀ UÀ£Ð €«`MkÀ¡}À¡¥€†€¬`ijÀ¡‰`ilÀ¢À¢1€†€­`ijÀ¢`imÀ¢ÈÀ¢ô€†€®`ijÀ¢Ö`inÀ£BÀ£j€†€¯`ijÀ£N`ioÀ£|À£€€€°`IsÀ£…À£‹À£¤ À£™À£¤À£Ÿ€°`I`i?o€À]$ À£‹gqÀ£©À£¼À£Î@ jÀ£ª`MÀ£ÄÀ£Î`IJÀ£ÊvÀ£Ê.€°`Io]P]štÀ¤À¤ À§A €±`MvÀ¤ÈÀ¤è€†€²`tjÀ¤Ñ`twÀ¥^À¥|€†€³`tjÀ¥f`txÀ¥ÓÀ¥ù€†€´`tjÀ¥ß`tyÀ¦°À¦Ü€†€µ`tjÀ¦¿`tzÀ¦îÀ¦ò€€°`I~À¦÷À¦ýÀ§ À§ À§À§€°`I`t?z€À^s À¦ýg|À§À§-À§?@ jÀ§`MÀ§5À§?`IJÀ§;vÀ§;.€°`Iz^Ÿ^é9£«ÒA¹Ò`=J¿Çg;Àœ@ÀœDÀœëA€¶7ÀœMÀœëÀœN [`H>ÀœSÀœëIÀœW%Àœ_€Àœ[À_K`IJÀœjÀœu£Àœ{À_K`I?IÀœƒ%Àœ‹€Àœ‡À_K`HJÀœ“ÀœšÀ_K`H?=0Àœ¡Àœµ¤€Àœ»À_K' '€·<ÀpÀuÀ A€¸7À…À À€¹`IÀ£€º]d`I\>À©À EÀ­À¶À¸r`V”xÀ¿‚À½À`GsvÀÆÀÁÀ` `Vra`Y`NŒŠÀÎÀ`GxÀÏ‚ÀÎÀ`Gt”a`Y`VA>ÀÓÀ IÀž"ÀžxÀž ÀžÀ` ‚Àž À`Ga`V`IŽ!Àž%xÀžÀžÀ` xÀž ‚ÀžÀ`G”a`Y`V[a`V`IŽBÀž.?NÀžA€»`VAEÀžN`V‹ÀžSÀaYvÀžbÀž]À` `VrxÀžrƒÀžjÀaY€‰”a`Y`N—‹ÀžxÀaYxÀžƒÀžxÀaY”a`Y`V[>ÀžƒÀžµIÀž‹!Àž¡xÀž“ÀžÀ` xÀžœƒÀž”ÀaY”a`Y`V[a`V`IŽBÀžª?NÀžÝÀžå€¼`yÀžç{=xÀŸ„ÀžûÀbPg$ÀŸ€ÀŸ À`'€½a`M\‡=xÀŸ"„ÀŸÀbPgxÀŸ„xÀŸMxÀŸ6ÀŸ(À` €¾ƒÀŸ;ÀaYa`V]c`I¥€¿`I4ÀŸQÀŸQÀŸyÀŸR€À`I`IJÀŸZ#ÀŸ^…ÀŸZÀc'€Á$ÀŸy'€ÂÀŸtÀc`I'€Â`Iaa`I`I]c`I¦)'€Ã^`I`I§a`M\‡=xÀŸ„ÀŸ•ÀbPg$ÀŸÔ'€ÄxÀŸ°‚ÀŸ®À`G”a`Y`V['€Å‚ÀŸÉÀ`G'€Æa`M\‡=0ÀŸÛÀŸájxÀŸ÷„ÀŸïÀbP a`I„d-ù\X]§^ö^ù_%_ìd- €Ú7€ñ€â€€‚‚ €Ç`€ã€’‚ `€€? €ú€‚‚™‚°‚¹Bj‚š`M‚¹‚¹`I€„‚ñ‚öƒBiƒƒƒ`I`N€…ƒ`ƒeƒ~Bvƒpƒ~ƒuu`V`N€†…I…N…iB^…\…i…d`I`N€‡†…†‰†ºBY†“†º†›`I†§Z`Nj†³`N`V€ˆ‡&‡:‡à@€Èj‡'`M‡A‡à‡I`I`I>‡O‡àN‡[‡b`Vx‡d.Y€‡oÀeË^`IZ`N`V€‡I‡zx‡…‡~Àeä[“a`Y`NuJ‡Šx‡–€‡‘ÀeË“‡£Àeä^`V`V`I`?J‡°#x‡·.(€‡ÆÀeËa`I`N€‰x‡Ò€‡ÎÀeË“a`V`I]+`I€‰ˆjˆoˆŠB(ˆ}ˆŠˆ…`I`N€ŠˆÊˆÝˆñB€¤jˆË`Mˆèˆñˆí `H`I€‹‰-‰=ŠY@€¥j‰.`M‰NŠY‰V`I`H>‰\ŠYN‰h‰q€É]d`Ix‰{v‰s.`=€ê-€‰ÀgEa`I]d`IRI‰êx‰î.vx‰ÿ€‰úÀgE€‹xŠvЀРÀgE`VX”a`Y`V[a`V`Vša`V`N€…=xŠ&ŠÀg^€'a`I\–?JŠ3Š:ª€ÊŠLÀg^€ŒЭнŠÛB€¦jŠ®`MŠÎŠÛŠÖ`I`H€‹B‹G‹@€‹U‹‹Z€Ë`V‹i€Ì`V`NJ‹w‹€‹wÀh‹„Àhœa`M`N_€ŽŒbŒgŒŸ@|ŒqŒŸŒy6`IŒ‡7`I`NJŒ‘Œ—€Œ‘Àh팚Àhøa`M`N^€Œ¤Œ¨ŒÖ@€ŸŒ¼ŒÖŒÁu`V`VJŒÎ€ŒÎÀiI€ŒÛŒâ@€ÍŒòŒúb`I`IJ€Ài‚d¶dàe e:ege§f¾fëg!h>hthÒi-ifiŸiãdwiàiã €“€Ú€ø€â€”™˜€Î`M€–€ mr€€`€€€—€¡‚x‚|€€V`I€˜€¢‚ڂ耀(`N€™€£ƒRƒW€€,]d`I€š€¤„i„s€€X]d`I€²‰7‰7‰“O€“‰C‰“‰P`€€‰\V`I‰g(`N‰|,]d`I‰ˆX]d`I`€”?€–€Àjµ€—ÀjÀ€˜‚ÀjË€™ƒÀjÖ€š„Àjæ ‰7g €¦„ф؅@#„á…„ç$`Vj„ï`V`IJ„öx… x„ö.€Ï€“€…ÀkW^`V]d`I€¬”a`V`IŽ€›…>…G…a@&…R…a`NJ…U!…Zv…U.V`I€—€¯…f…n‰2A€Ð…~‰2…†`I…š`€€`€”>…¡‰2 N…Ô…ÙV`Ix…á…ÛÀl€È€…éÀla`I`I€ˆN…ú† (`Nx†† Àl(€† Àla`I`N€‰I†+!†4‚†/Àl2=ˆ†=Àlx†I€†DÀlv†X†SÀl2`I`VX^`V`V`I`?N†—†,]d`I†§«`I“N†µ†ÀX]d`I†Ê«`I“N†×†Ýn`V“I†ç"v†ð€†ëÀlh`Nˆx‡†þÀlvx‡€‡Àl€‹“a`V`Vša`V`N€…>‡%‡[=x‡8…‡-Àm€x‡@€‡<Àl“a`V`I]a`I\–=އLÀm1”>‡b‡‚=x‡u…‡jÀm€'a`I\–E‡‰‡’‡”r`V†‡–Àm1x‡Ÿ‡‡Àn sv‡¦€‡¡Àl`VXa`Y`NŒ‡®Àn x‡¯‡‡®Àn t”a`Y`V>‡³ˆYI‡»x‡Å‡¿Àlvx‡Ö€‡ÑÀl€‹‡‡áÀn a`V`Vša`V`N€…>‡æˆS=x‡ö„‡ðÀlñ€x‡ÿ€‡úÀl†ˆ Àm1‡ˆÀn ^`V`V`I`a`I\–=xˆ(…ˆÀm€xˆ0€ˆ,Àl‡ˆ1Àn a`V`I]a`I\–=Žˆ>Àm1xˆH‡ˆFÀn t”a`Y`V?Iˆƒxˆ†ˆ‡Àm1svˆ”€ˆÀl`VXa`Y`NŒ>ˆœˆä=xˆª„ˆ¤Àlñ€xˆ³€ˆ®Àl†ˆ½Àm1^`V`V`I`a`I\–=xˆ×…ˆÌÀm€'a`I\–?Jˆëˆý€²ˆÿÀl‚‰Àl2ƒ‰ Àlf„‰Àlñ…‰#Àm€œ‰˜‰£Š:@ ‰¬Š:`I>‰¬Š:N‰¸‰½€Ñ`€”x‰¿.€Òa`€”€­=x‰Ñ€‰ÌÀp“Ta\€§I‰ñvŠv‰ú€‰õÀp“,]d`I€™U`NpJŠ 5ŠŠ`IvŠ.V`I€—#ŠŠÀpý'ŠÀpý`I`I?JŠ vŠ2vŠ,€Š'Àp“,]d`I€™€€`I•€Š?ŠJŠz@!ŠcŠz`IJŠfxŠwxŠf.€Ï€“^`V]d`I€¬“a`V`IŽ€žŠŠˆŠå@€ÓŠŠå`NJЦ"vЬvЦ.,]d`I€™h`N"ŠÆvŠÁvŠ».,]d`I€™€€`I•'a`M`N^!ŠßvŠÚvŠÏ.X]d`I€š€€`I•'a`M`N^€§ŠêŠï‹Ç@T‹‹Ç\>‹ ‹ÇC‹"v‹v‹.,]d`I€™h`N‹6v‹1v‹+.,]d`I€™€€`I•'a`M`N^>‹=‹|=x‹Kv‹E.,]d`I€™Wa`It=x‹jv‹_.X]d`I€šWa`ItI‹‚v‹‘v‹†.X]d`I€šh`N=x‹§v‹.X]d`I€šex‹ºv‹³v‹¨.X]d`I€š`Vr”a`Y`V['a`V`I\…?€¨‹Ì‹Ñ‘*@/‹Ú‘*‹á.`Nj‹ð`N\>‹ø‘* NŒ,Œ;€Ô`V“NŒJŒS€Õ]d`IŒ]«`I“>NŒv`]|`IvŒvvŒv.,]d`I€™c]|`I~ExŒvƒÀt3da`N€>NŒnb`IvŒ}ƒÀt3 `I‚>Œ}Ž-IŒ…"ŒŽ„Œ‰ÀtŠ' a`M`N^Œ„Œ˜ÀtŠ'a`M`N^>Œ¤ŒÎIŒÕŒÞ„ŒÙÀtŠ'~a`M`N^>ŒçÎIv ‚Àth`N>,W=xA‚8ÀtWa`It>^Æ=‰¬Àsÿxº¬Àsÿt”a`Y`V>ÕŽ'=xè‚ßÀt€#€ìÀsâxŽvû.`€€€–€Í„ŽÀtŠa`I`I€„ŽÀtŠ`Ia`I\–IŽr!vŽw.&`N€›>ŽƒŽÉ=xŽ”‚Ž‹Àt“ަ“`IŽ­Àsÿ'~a`V]c`I\”?I"v ‚ÀtU`Np!v.&`N€›>%D=x6‚-Àt€' a`I\–?=wk.,‚sÀt€£=w.X›¬`Ix²v«‚¢Àt`Vrt”a`Y`Vv½v·.`€€€–`I€‚€¤IÝ""!vâ.&`N€›vù‚ðÀtU`Np!x v.`€€€–^uv.V`I€—a`I`N€†>"B=x4v*.X]d`I€še“'a`V`I\…?Iv"!vz.V`I€—vŠ.`€€€–™€æa`M`NR>¢‘Iª€®Àsâ=w¼.VxÉuÇvÃ.V`I€—€Öa`I­€¡?=wÞ.Vxëuévå.V`I€—€×''a`˜`I`I®€¡?=x‘ .Ta\€§€©‘/‘B’Z@ j‘0`M‘J’Z`I>‘M’ZN‘Y‘a€Ø`y‘c{I‘w!‘€v‘{.V`I€—=x‘‘€‘‰Àxvgv‘—.V`I€—a`M\‡?E‘¢‘«‘­r`V“x‘´‘²ÀxÏsv‘¼v‘¶.,]d`I€™`Vra`Y`NŒ‰‘ÄÀxÏx‘Å‘ÄÀxÏt”a`Y`V>‘É’=x‘Ù€‘ÑÀxvgx‘év‘ß.X]d`I€š‘êÀxÏa`V`IŽa`M\‡=x‘ý€‘õÀxvgx’v’.,]d`I€™’ ÀxÏa`V`IŽa`M\‡=x’ €’Àxvgv’1v’&.X]d`I€š€€`I•a`M\‡J’=x’L€’DÀxv a`I„€«““”•@€Ù€““,”•“4`I“A€Ú`I“P€Û`V`V>“S”•N“]“c€Ü`V“N“h“€Ý`V“E“Š“““™€™`Vx“§v“ €“›Àz]`VX”a`Y`V[x“²…“¬Àz¯€‰“a`Y`N—“ºÀz¯x“¸…“ºÀz¯”a`Y`V[>“Á”lI“É“Ùx“Ñ€“ÍÀz]…“ÒÀz¯a`V`I]“ÜÀzha`M`N^>“ç”f=Œ“ñÀz…” Àz¯=‹”ÀzŽx”ƒ”ÀzŽt”a`Y`VI”,”6ƒ”0ÀzŽ‚”9Àzta`M`N_>”<”^J”H…”OÀz¯??J”r„”yÀz€¬–½–Ê™"@€Ï€“–Ù™"–ß$`Vj–ç`V]d`I>–ë™"I–ñx–û€–õÀ|€Þ“a`Y`N¯>——h=0— —²€—+À|'$'€ß?N—u—z€©`Ix—šx—Šv—„.,]d`I€™€à`Ia]d`I³€á4—¤—¤—²—¥K`I`NJ—«!—­—«À|Ó'a`M`N^€â4—¼—¼—Æ`bJ—Â+^a`I`N€âa`I`I´I—ΗחÒÀ|~J—à—çµ`I''?I—õ—þ—ùÀ|~`I'~a`M`N^J˜˜µ`I'~'?N˜%˜-€ã`Vx˜/.€Ù€“˜?À|~`I' €˜JÀ|a`I`I`V`V€«I˜¸x˜Ä‚˜¼À}¢€Þ“a`Y`N¯J˜Ê˜Ñµ`I˜ÒÀ|~`I'?J˜â˜éµ`Ix˜ï˜êÀ|~`I“‚˜üÀ}¢^`V`V`I`x™ ™À|~`I‚™À}¢^`V`V`I`€­™'™2™–@€Ò™7™–`€”J™=™H€²v™Q.`€€€–v™X.V`I€—v™^.(`N€˜™s·`Iv™x.,]d`I€™™…·`Iv™Š.X]d`I€šk<k»kòpjq^qÃrqsÆxEz?{ö~ª? {jx{ €³€´>DÚ€ä`M`L€¶€¸ry€€€¼`I€¼~~™‹™‘€¼`I`€´?€¶€Àë ~g€ºž±Ø@ jŸ`M¹Ø`IJ¿$Ø'€åvÐ.€¼`I€¶€€X€h£€e€h €½€Ú¸€õK€¾Z`†€æ€ç`M[]¹`I_€Ã‚5‚5‚l‚<‚l‚I`=j`b]€¾_? ‚U»‚[€Á_€‚cÀ€ã€Äƒ©ƒ©„€èƒ³„ƒÃ€é]¼`I_ƒÖ`=j`b]€¾_? ƒè»5ƒîƒî]¼`I_ƒî€Á_ƒöÀNR=x„‚ƒîÀx€ê€„À8a]¼`I_\¾‚ƒîÀx€Á„U„l†A€ë€½„v†€ç`M[„‚`=]¼`I_>„‹†=#„™€„‘À‚ˆ„‘À‚„Ÿ+`=J„¬„³Á`I_54„Ò„Ò…z„Ó6`I„Ú7`I`N>„á…yI„í„÷„ñÀ‚aJ…… ‚…À‚l?I… …*‚…$À‚lJ…3*?J…Kx…[u…Y€…RÀ‚5…bÀ‚a`I…iÀ‚l`Ia`I`I`N^€ì4…Ž…Ž…¾…`I`VJ…˜#……˜Àƒ“x…´u…²€…«À‚8…¹Àƒ`Ia`I`V_`V€í4…Ô…Ô…ü…Õ[`NJ…Þ"%…ã…ÞÀƒk`I…õ…ðÀƒkÙƒ™ƒ©€Ÿƒ¦ƒ© €Å€Ú¸€õK€ÆV\Œ‡€î]Â`I]Ã`I€Éëñ€€ï€Å]Ã`I€à‚¤‚¤‚Ý‚«‚Ý‚¸`=j`b`€Æ?€É‚̀΀‚ÕÀ„9 ‚¤Å€á„„„€è„ „„2€é]c`I„E`=j`b`€Æ?€É5„`„`]Ã`I„`€Î„hÀ„›R=x„r‚„`À„»€ê€„yÀ„‰a]c`I\Ç‚„`À„» „ŀ΄ƄچlA€ë€Å„á†l„í`=]Ã`I>„ö†l=#…€„üÀ…7ˆ„üÀ…7… +`=J……Ê`I54…=…=…å…>6`I…E7`I`N>…L…äI…X…b…\À…J…k…x‚…rÀ…š?I…‹…•‚…À…šJ…ž*?J…¶x…Æu…Ä€…½À…75…ÍÀ…`I…ÔÀ…š`Ia`I`I`N^€ì4…ù…ù†)…ú`I`VJ†#††À†4“x†u†€†À…78†$À†4`Ia`I`V_`V€í4†?†?†g†@[`NJ†I"%†N†IÀ†™`I†`†[À†™€Ê‡V‡x‡“@cj‡W`M‡‡“]|`IJ‡„v‡‹v‡„.€ï€Å]Ã`I€Éc]|`Ìˇ˜‡¬‡Ã@j‡™`M‡³‡Ã`VJ‡¶v‡½v‡¶.€ï€Å]Ã`I€É`VЀχȇو@€j‡É`M‡Üˆ‡å€ð`I`NJ‡ïx‡öv‡ï.€ï€Å]Ã`I€É€€‡úÀ‡“a`I`NрЈˆˆS@€êjˆ`MˆˆSˆ/€ñ]c`I\Jˆ<xˆCvˆ<.€ï€Å]Ã`I€É€ê€ˆJÀˆa]c`I\ǀшXˆkˆˆ@€àjˆY`Mˆrˆˆ€ò`M[]Ã_Jˆxxˆvˆx.€ï€Å]Ã`I€É€à_a]Ã_Ò€Òˆˆžˆ·@fjˆŽ`Mˆ£ˆ·\Jˆ©xˆ°vˆ©.€ï€Å]Ã`I€Éfa\Ó€Óˆ¼ˆÍ‰@€ójˆ½`MˆÕ‰ˆÞ€ô`M`NJˆêxˆñvˆê.€ï€Å]Ã`I€É€ó€ˆúÀ‰9a`M`NÔ€Ô‰‰‰Y@€õj‰`M‰#‰Y‰6€é]c`M`NJ‰@x‰Gv‰@.€ï€Å]Ã`I€É€õ€‰SÀ‰©a]c`M`NÕ€Õ‰^‰w‰±@€öj‰_`M‰‰±‰€é]Ã`M]Ã`IJ‰™x‰ v‰™.€ï€Å]Ã`I€É€ö€‰«ÀŠ#a]Ã`M]Ã`IÖ€Ö‰¶‰ÏŠ @€÷j‰·`M‰ÛŠ ‰é€é]Ã`M]Ã`IJ‰óx‰úv‰ó.€ï€Å]Ã`I€É€÷€ŠÀЧa]Ã`M]Ã`I׀׊Š&ŠW@€øjŠ`MŠ,ŠWŠ5€ô`M`IJŠAxŠHvŠA.€ï€Å]Ã`I€É€ø€ŠOÀ‹+a`M`I؀؊\ŠmŠš@€ùjŠ]`MŠsŠšŠ|€ð`M`NJІxŠvІ.€ï€Å]Ã`I€É€ù€Š”À‹›a`M`NـيŸŠ°Šó@€újŠ `MйŠóŠÌ€ñ]c`M\JŠÙxŠàvŠÙ.€ï€Å]Ã`I€É€ú€ŠêÀŒ a]c`M\Ú€ÚŠø‹ ‹M@€ûjŠù`M‹‹M‹,€üa`I`N\J‹5x‹…͇’I†È!†Üv†Õ†ÐK€¨`I¢'€©a`M`N^J†ç†ô€ç?I†ý!x‡v‡ ‡K`Ià'a`I`NáJ‡‡,€ç?I‡5‡Wx‡J‡9ª'^`N`IU'a`M`N^J‡b‡o€æ?J‡|‡‰€å€é‡Ø‡ã‡çB€°‡ç‡ç`I€êˆˆ ˆ?@ˆ(ˆ?`=Jˆ+ˆ+E.€ëˆDˆˆ™BjˆE`â!ˆ™ˆ™`I€ìˆžˆëˆûBjˆŸ`â!ˆûˆû`˜€í‰‰M‰bBj‰`â!‰b‰b`˜€î‰g‰´‰¿B j‰h`â!‰¿‰¿`˜€ï‰ÄŠŠ%B j‰Å`â!Š%Š%`˜€óŠ*ŠsЇB€ÈjŠ+`â#ŠzЇŠ‚`I`I€ôŠŒŠÕŠñB jŠ`â#ŠäŠñŠì`I`I€õŠö‹>‹RB€¤jŠ÷`â#‹I‹R‹N `H`I€ö‹W‹œ‹ºB€¥j‹X`â#‹­‹º‹µ`I`H€÷‹¿ŒŒ"B€¦j‹À`â#ŒŒ"Œ`I`H€øŒ'Œ:ŒL@ jŒ(`MŒBŒL`IJŒHvŒH.€°`I€éñà‘‘2‘\‘‡‘²‘Ý’’>’t’ª’à““R“–E“““– €û €Ú)L!€“€ü _eˆn `€€€þ ­»€€°jœ`M`I'€ÿ Ñà€jÀ`M`I' ê‚€X]d`Ij÷]d`I% ‚6‚U€j‚%`M`˜‚Iå' ‚k‚“€j‚Z`M`˜‚ƒå'  ‚©‚Ä€ j‚˜`M`˜‚·å' ‚Ú‚ô€ j‚É`M`˜+ ŠŠ–”–`€ü? Š€’ ‚ùƒ ƒ>@ij‚ú`Mƒƒ>ƒ#`I`NJƒ,xƒ1€ƒ,À•(€ó'^`˜`V`Næ ƒCƒTƒˆ@vjƒD`Mƒ_ƒˆƒdu`V`NJƒqƒz€ƒqÀ•Œjƒƒ`Va`M`N_ ƒƒž„@^jƒŽ`Mƒ¬„ƒ´`I`NJƒÃ"vƒÈ€ƒÃÀ•åh`Nˆ!xƒ×.vxƒè€ƒãÀ•個xƒÿvƒø€ƒóÀ•å`VX”a`Y`V[a`V`Vša`V`N „ „„£@Yj„ `M„#„£„+`I„7Z`Nj„C`N`V>„K„£I„Q"v„Z€„UÀ–™h`Nˆx„h.vx„y€„tÀ–™€‹“a`V`Vša`V`NJ„‰”?J„—“ „¨„¹„Ý@(j„©`M„DŽ݄Ï`I`NJ„Ø* „â„ö…@ j„ã`M……… `I`IJ…+ ……2…ð@€¤j… `M…=…ð…B `H`I>…G…ðI…M"…\v…U€…QÀ—º€¨`I¢'a`M`N^…pv…i€…eÀ—º€¨`I¢'€©a`M`N^>…{…­J…ƒ…Žçv…¢€…žÀ—º`Ià?=0…³…¹j$…ë'€…ÍÀ—º' …õ†ˆl@€¦j…ö`M†ˆl†`I`H>†$ˆlN†0†7S`€”†D€¯€†JÀ˜.I†[v†lv†f†_À˜¨,]d`I€™U`Np>†u‡g=x‡Qv‡K‡DÀ˜¨,]d`I€™€ê‡Xµ`I''a]c`I\èI‡nv‡y‡rÀ˜¨€Ó`N€ž>‡ˆ+=xˆvˆˆÀ˜¨,]d`I€™€'a`I\–?Jˆ2ˆ9ª€¨'€©€Êvˆbˆ[À˜¨,]d`I€™••i•–v—!—[—–˜k™² ™Þ“Ô™Û™Þ  €Ú)L!B W]Šñ`€€ ¡­€€°j`M`I' ÃÒ€j²`M`I' Üô€X]d`Ijé]d`I% ‚(‚G€j‚`M`˜‚;å' ‚]‚¢€j‚L`M`˜‚uå' ‚¸‚ï€ j‚§`M`˜‚Æå' ƒƒ(€ j‚ô`M`˜ƒå'% €€ŠˆŠ`? €€’  ƒ-ƒ>ƒr@ijƒ.`MƒOƒrƒW`I`NJƒ`xƒe€ƒ`À›{€ó'^`˜`V`Næ ƒwƒˆƒ¼@vjƒx`Mƒ“ƒ¼ƒ˜u`V`NJƒ¥ƒ®€ƒ¥À›ßjƒ·`Va`M`N_ ƒÁƒÒ…?@^jƒÂ`Mƒà…?ƒè`I`N>ƒî…?Iƒôvƒý€ƒøÀœ8U`NéJ„*?I„X!x„].vx„n€„iÀœ8€‹x„…v„~€„yÀœ8`VX”a`Y`V[a`V`Vša`V`NJ„Œ)?J„ý"x… €…Àœ8'a`I`Ná…-x….Y€…'Àœ8^`IZ`N`Vv…5€…0Àœ8`VXa`M`N_ …D…T‰_@Yj…E`M…^‰_…f`I…rZ`Nj…~`N`V>…†‰_I…Œv…•€…ÀvU`NéJ…ž“?I…¬x…°.vx…Á€…¼Àv€‹“a`V`Vša`V`NJ…Ñ”?E…à…é…ër`V“x…ò‚…ðÀžsv…ù€…ôÀv`VXa`Y`NŒІÀžx†‚†Àžt”a`Y`V>†‰LN††u`Vx†$€†Àv€‹‚†/Àža`V`VšI†9x†=.vƒ†IÀžsa`V`NJ†T“?I†d†qƒ†hÀžsj†z`Va`M`N_>†‰FI†‹†‘‚†Àž“a`M`N_J†—“?I‡:x‡C€‡>Àv€Š'x‡V‚‡TÀžt”a`Y`V^`˜`V`N™=Ї\Àžx‡^‚‡\Àžt–a`Y`V?N‡r‡x€™`Vx‡€‡zÀv'‚‡ŒÀž^`˜`V`VêI‡˜x‡¢„‡œÀŸ“€Þ“a`Y`N¯J‡¨v‡´€‡¯Àv`VX?IˆT"!ˆYÀ‚xˆrvˆk€ˆfÀv`VXsxˆz„ˆtÀŸ“t–a`Y`Va`Y`NŒJˆ„ˆ†ÀŸ“?Iˆ•!xˆŸ€ˆšÀv€Š'^`˜`V`N™Jˆ¶„ˆ½ÀŸ“?IˆÌ!ˆÑF€ˆßÀvxˆë„ˆåÀŸ“t”a`Y`VJˆñ„ˆøÀŸ“?J‰#‰v‰€‰Àv`VXx‰#„‰ÀŸ“t–a`Y`Va`M`N_x‰/„‰)ÀŸ“t–a`Y`Vx‰;„‰5ÀŸ“t—a`Y`V`V?J‰S“ ‰d‰u‰Ì@(j‰e`M‰ƒ‰Ì‰‹`I`NJ‰š"v‰Ÿ€‰šÀ¡¥h`Nˆx‰­.vx‰¾€‰¹À¡¥€‹“a`V`Vša`V`N ‰Ñ‰åŠ&@ j‰Ò`M‰ôŠ&‰ü`I`IJŠ#xŠ.(€ŠÀ¢.a`I`N'+`I! Š+Š>Šd@€¤jŠ,`MŠIŠdŠN `H`IJŠVxŠZ€ŠVÀ¢‘ a`IT" ŠiŠyŠª@€¥jŠj`MŠŠŠªŠ’`I`HJŠ›ŠŸ£€Š¥À¢æ# ЮоŠï@€¦jН`MŠÏŠïŠ×`I`HJŠàŠä£€ŠêÀ£0›X›¼œS¡‚¢ ¢m¢Â£ £V  £†š£ƒ£† & €Ú)L!€“?B* ü‚˜p`€€, ‚N‚^€€°j‚=`M`I'- ‚t‚„€j‚c`M`I'. ‚Ž‚¬€X]d`Ij‚›]d`I'/ ‚àƒ€j‚Ï`M`˜‚óå'0 ƒƒC€jƒ`M`˜ƒ1å'1 ƒYƒ—€ jƒH`M`˜ƒgå'2 ƒ­ƒÝ€ jƒœ`M`˜ƒÃå'A ‚)‚)‚7‚5‚7`*? ‚)€’ 4 ƒâƒó„'@ijƒã`M„„'„ `I`NJ„x„€„À¥,€ó'^`˜`V`Næ5 „,„=„–@vj„-`M„H„–„Mu`V`NJ„`"„i€„`À¥j„r`Va`M`N_„„€„{À¥j„`V a`M`N_6 „›„¬…+@^j„œ`M„º…+„Â`I`N>„È…+I„Îv„×€„ÒÀ¦ U`NéJ„à*?J„ò!x„ú.vx… €…À¦ €‹x…"v…€…À¦ `VX”a`Y`V[a`V`Vša`V`N57 …0…@‰@Yj…1`M…J‰…R`I…^Z`Nj…j`N`V>…r‰I…xv…€…|À¦ÌU`NéJ…Š“?I…˜…¯x…¡€…œÀ¦Ì€‹“a`V`Všj…¸`Va`M`N_J…¿”?I…Í…äx…Ö€…ÑÀ¦Ì€‹“a`V`Všj…í`V a`M`N_>…ø‡ŠI†"x†v† €†À¦Ì`VXs•a`Y`NŒ!†*x†€†À¦Ì€‹”a`V`Všj†3`V a`M`N_J†>”?N†Ú†à€™`Vx†ç€†âÀ¦Ì'•^`˜`V`VêI†ÿx‡ ‚‡À¨ [“a`Y`Nu>‡‡j=ЇÀ¨ x‡%€‡ À¦Ì'x‡9‚‡3À¨ t”a`Y`V^`˜`V`VêI‡Gx‡Q‚‡KÀ¨ [“a`Y`NuJ‡V‚‡]À¨ ??J‡rv‡~€‡yÀ¦Ì`VX?I‡ôxˆv‡ý€‡øÀ¦Ì`VXs–a`Y`NŒJˆ “?Iˆ4!ˆ9DxˆK€ˆFÀ¦Ì€‹“a`V`VšJˆ[“?Iˆƒ!ˆšxˆŒ€ˆ‡À¦Ì€‹”a`V`Všjˆ£`Va`M`N_Jˆª“?IˆÜ!xˆá.vxˆò€ˆíÀ¦Ì€‹•a`V`Vša`V`N5J‰“?J‰–8 ‰!‰2‰f@(j‰"`M‰@‰f‰H`I`NJ‰Q‰bx‰Q.Y€‰\Àª"^`IZ`N`V7”a`M`N_9 ‰k‰‰û@ j‰l`M‰Ž‰û‰–`I`I>‰œ‰ûN‰¨‰¯`Vx‰±.Y€‰¼Àª™^`IZ`N`V7I‰Ç‰Ò‰ËÀª²”a`M`N_J‰Øx‰ã€‰ßÀª™“a`V`I]?J‰ì+: ŠŠŒó@€¤jŠ`MŠŒóŠ# `H`I>Š(ŒóIŠ."!Š=vŠ6€Š2À«S€¨`I¢'a`M`N^!ŠQvŠJ€ŠFÀ«S€¨`I¢'€©a`M`N^>Š\Š£=0ŠdŠjj$Šœ'€Š~À«S'?NЮг`Ivй€ŠµÀ«S`IàIŠÃŠÐvŠË€ŠÇÀ«S`Ië'a`M`N^>Š×Œ@I‹¿""x‹Ïv‹È‹ÃÀ«ç`VX€‰–a`Y`N—x‹Ü‹×À«ç€Š'^`˜`V`N™‹ïF‹ýÀ«ç”>ŒŒ:=‰ŒÀ«çxŒŒÀ«ç''^`˜`I`V`Iì?>ŒGŒ³=‰ŒÀ«ç$Œ­'vŒ¢€ŒžÀ«S`I댨À«çJŒ¹ŒÄçxŒÙŒÔÀ«ç€×''a`˜`I`I®; Œø’ò@€¦jŒù`M’ò!`I`H>'’òN3:S`€”G€¯€MÀ­o.I^xoumvibÀ­ˆV`I€—€Š'^`˜`V`N™>‚NŽeŽo ]c`IxŽŠxŽ~uŽ|vŽxŽqÀ­ˆV`I€—-'a`˜]d`Iía4ŽŽŽ¤Ž‘b`I`NJŽš!ŽŸ‚ŽšÀ®H'a`M`N^aa`I`N]c`I}=xŽºvŽ´Ž­À­ˆ,]d`I€™l“vŽÎ‚ŽÄÀ­ê€€`I•a`V`I\ŠIŽÜvŽçŽàÀ­ˆ€Ó`N€ž>Žý¡=x’vŒ…À­ˆ,]d`I€™€'a`I\–?Jª±ª€¨'€©và‚ÖÀ­ê!`Iî€ÊvüõÀ­ˆ,]d`I€™>’îI‘u"v‘†v‘€‘yÀ­ˆ,]d`I€™U`Npv‘˜‘‘À­ˆ€Ó`N€ž>‘®‘Ô=x‘Åv‘¿‘¸À­ˆ,]d`I€™€'a`I\–?=x’iv’X’QÀ­ˆ,]d`I€™l“x’”x’€u’~v’z’sÀ­ˆV`I€—€×''a`˜`I`I®€×''a`˜`I`I®a`V`I\ŠJ’²’¹ª€¨'€©€Êv’â’ÛÀ­ˆ,]d`I€™< ’÷“•Ù@€j’ø`M“•Ù“€Ë`V“*€Ì`V`N>“5•ÙI“;“I€“?À°Â“LÀ°Îa`M`N_J“W)?I“¬“º€“°À°Âj“Ã`Va`M`N_J“ʓۓÑÀ°Îj“ä`V a`M`N_?I“󔀓÷À°Âj” `V a`M`N_J””&”À°Îj”/`Va`M`N_?I”Ô!”îx”—ØÀ°Â€£”äÀ°Îa`V`V j”ñ`V(a`M`N_J•*?N•j•u"`Vx•€•wÀ°Â#j•ƒ`V(a`V`VïJ•–"x•¨‚•À±ê€‰j•±`V a`Y`N—x•Æ‚•»À±ê€Þj•Ï`V a`Y`N¯= •Þ•ï—%@|j•ß`M•ù—%–6`I–7`I`N>–—%I–– ñ€–*À²˜–1À²£J–9)?I–J!–[v–T€–NÀ²˜`VXv–d–^À²£`VXa`M`N_J–l*?E–~–‡–‰r`V“x–‚–ŽÀ³ sv–˜€–’À²˜`VXa`Y`NŒŠ– À³ x–¡‚– À³ t”a`Y`V>–¥—I–­!x–².€x–Ç€–ÁÀ²˜€‹‚–ÒÀ³ a`V`Všx–Ü–ÖÀ²£€‹‚–çÀ³ a`V`Vša`V`V`N<>–ì— J–ö*?J—)> —*—:˜#@€Ÿj—+`M—N˜#—Su`V`V>—]˜#I—c—p€—gÀ´3j—y`Va`M`N_J—€j—`V ?I—œx—©€— À´3sj—±`V a`Y`NŒJ—¹€—ÀÀ´3?I—Îx—Û€—ÒÀ´3[j—ã`V a`Y`NuJ—뀗òÀ´3?J˜x˜€˜À´3#j˜`V(a`V`Vï? ˜(˜;˜n@€Íj˜)`M˜K˜n˜Sb`I`IJ˜\x˜a€˜\Àµ7€Öa`I­¥ ¥m¥è¦©©ÿªu«/­K°ž²u´µµi ) ÄØ€†$&`VjÔ`V( µÂ£Ìµ¢µÂ B €Ú)LD W\ÞA%hÞm&`V`NJz""x€€{À¶€‰j‰`V a`Y`N—x˜€“À¶€Þj¡`V a`Y`N¯"x¶€±À¶€‰j¿`V a`Y`N—x΀ÉÀ¶€Þj×`V a`Y`N¯E ‚‚!‚`A'‚*‚`‚/&`V`NJ‚8"x‚=€‚8À¶é€‰j‚F`Va`Y`N—x‚S€‚NÀ¶é€Þj‚\`Va`Y`N¯F ‚Á‚ƃöA(‚Óƒö‚Û`I‚候`V`N>‚ìƒöI‚ðxƒv‚ù€‚ôÀ·n`VXsxƒƒÀ·yt•a`Y`Va`Y`NŒJƒ *?Iƒ!ƒ"Dxƒ4€ƒ/À·n€‹ƒ?À·ya`V`VšJƒH*?IƒX!ƒwxƒa€ƒ\À·n€‹xƒrƒlÀ·yt”a`Y`Va`V`Všjƒ€`Va`M`N_Jƒ‡*?Iƒ—ƒ§vƒ €ƒ›À·n`VXxƒ°ƒªÀ·yt•a`Y`Va`M`N_Jƒµ)?JƒÄƒæxƒÐ€ƒËÀ·n€‹xƒáƒÛÀ·yt•a`Y`Va`V`Všjƒï`Va`M`N_ ¹-µñµô¶Í·R¹- Ofile:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/path.dartÀDÁ// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// A comprehensive, cross-platform path manipulation library. /// /// The path library was designed to be imported with a prefix, though you don't /// have to if you don't want to: /// /// import 'package:path/path.dart' as p; /// /// The most common way to use the library is through the top-level functions. /// These manipulate path strings based on your current working directory and /// the path style (POSIX, Windows, or URLs) of the host platform. For example: /// /// p.join('directory', 'file.txt'); /// /// This calls the top-level [join] function to join "directory" and "file.txt" /// using the current platform's directory separator. /// /// If you want to work with paths for a specific platform regardless of the /// underlying platform that the program is running on, you can create a /// [Context] and give it an explicit [Style]: /// /// var context = p.Context(style: Style.windows); /// context.join('directory', 'file.txt'); /// /// This will join "directory" and "file.txt" using the Windows path separator, /// even when the program is run on a POSIX machine. import 'src/context.dart'; import 'src/style.dart'; export 'src/context.dart' hide createInternal; export 'src/path_exception.dart'; export 'src/path_map.dart'; export 'src/path_set.dart'; export 'src/style.dart'; /// A default context for manipulating POSIX paths. final Context posix = Context(style: Style.posix); /// A default context for manipulating Windows paths. final Context windows = Context(style: Style.windows); /// A default context for manipulating URLs. /// /// URL path equality is undefined for paths that differ only in their /// percent-encoding or only in the case of their host segment. final Context url = Context(style: Style.url); /// The system path context. /// /// This differs from a context created with [new Context] in that its /// [Context.current] is always the current working directory, rather than being /// set once when the context is created. final Context context = createInternal(); /// Returns the [Style] of the current context. /// /// This is the style that all top-level path functions will use. Style get style => context.style; /// Gets the path to the current working directory. /// /// In the browser, this means the current URL, without the last file segment. String get current { // If the current working directory gets deleted out from under the program, // accessing it will throw an IO exception. In order to avoid transient // errors, if we already have a cached working directory, catch the error and // use that. Uri uri; try { uri = Uri.base; } on Exception { if (_current != null) return _current!; rethrow; } // Converting the base URI to a file path is pretty slow, and the base URI // rarely changes in practice, so we cache the result here. if (uri == _currentUriBase) return _current!; _currentUriBase = uri; if (Style.platform == Style.url) { _current = uri.resolve('.').toString(); } else { final path = uri.toFilePath(); // Remove trailing '/' or '\' unless it is the only thing left // (for instance the root on Linux). final lastIndex = path.length - 1; assert(path[lastIndex] == '/' || path[lastIndex] == '\\'); _current = lastIndex == 0 ? path : path.substring(0, lastIndex); } return _current!; } /// The last value returned by [Uri.base]. /// /// This is used to cache the current working directory. Uri? _currentUriBase; /// The last known value of the current working directory. /// /// This is cached because [current] is called frequently but rarely actually /// changes. String? _current; /// Gets the path separator for the current platform. This is `\` on Windows /// and `/` on other platforms (including the browser). String get separator => context.separator; /// Returns a new path with the given path parts appended to [current]. /// /// Equivalent to [join()] with [current] as the first argument. Example: /// /// p.absolute('path', 'to/foo'); // -> '/your/current/dir/path/to/foo' /// /// Does not [normalize] or [canonicalize] paths. String absolute(String part1, [String? part2, String? part3, String? part4, String? part5, String? part6, String? part7]) => context.absolute(part1, part2, part3, part4, part5, part6, part7); /// Gets the part of [path] after the last separator. /// /// p.basename('path/to/foo.dart'); // -> 'foo.dart' /// p.basename('path/to'); // -> 'to' /// /// Trailing separators are ignored. /// /// p.basename('path/to/'); // -> 'to' String basename(String path) => context.basename(path); /// Gets the part of [path] after the last separator, and without any trailing /// file extension. /// /// p.basenameWithoutExtension('path/to/foo.dart'); // -> 'foo' /// /// Trailing separators are ignored. /// /// p.basenameWithoutExtension('path/to/foo.dart/'); // -> 'foo' String basenameWithoutExtension(String path) => context.basenameWithoutExtension(path); /// Gets the part of [path] before the last separator. /// /// p.dirname('path/to/foo.dart'); // -> 'path/to' /// p.dirname('path/to'); // -> 'path' /// /// Trailing separators are ignored. /// /// p.dirname('path/to/'); // -> 'path' /// /// If an absolute path contains no directories, only a root, then the root /// is returned. /// /// p.dirname('/'); // -> '/' (posix) /// p.dirname('c:\'); // -> 'c:\' (windows) /// /// If a relative path has no directories, then '.' is returned. /// /// p.dirname('foo'); // -> '.' /// p.dirname(''); // -> '.' String dirname(String path) => context.dirname(path); /// Gets the file extension of [path]: the portion of [basename] from the last /// `.` to the end (including the `.` itself). /// /// p.extension('path/to/foo.dart'); // -> '.dart' /// p.extension('path/to/foo'); // -> '' /// p.extension('path.to/foo'); // -> '' /// p.extension('path/to/foo.dart.js'); // -> '.js' /// /// If the file name starts with a `.`, then that is not considered the /// extension: /// /// p.extension('~/.bashrc'); // -> '' /// p.extension('~/.notes.txt'); // -> '.txt' /// /// Takes an optional parameter `level` which makes possible to return /// multiple extensions having `level` number of dots. If `level` exceeds the /// number of dots, the full extension is returned. The value of `level` must /// be greater than 0, else `RangeError` is thrown. /// /// p.extension('foo.bar.dart.js', 2); // -> '.dart.js /// p.extension('foo.bar.dart.js', 3); // -> '.bar.dart.js' /// p.extension('foo.bar.dart.js', 10); // -> '.bar.dart.js' /// p.extension('path/to/foo.bar.dart.js', 2); // -> '.dart.js' String extension(String path, [int level = 1]) => context.extension(path, level); /// Returns the root of [path], if it's absolute, or the empty string if it's /// relative. /// /// // Unix /// p.rootPrefix('path/to/foo'); // -> '' /// p.rootPrefix('/path/to/foo'); // -> '/' /// /// // Windows /// p.rootPrefix(r'path\to\foo'); // -> '' /// p.rootPrefix(r'C:\path\to\foo'); // -> r'C:\' /// p.rootPrefix(r'\\server\share\a\b'); // -> r'\\server\share' /// /// // URL /// p.rootPrefix('path/to/foo'); // -> '' /// p.rootPrefix('https://dart.dev/path/to/foo'); /// // -> 'https://dart.dev' String rootPrefix(String path) => context.rootPrefix(path); /// Returns `true` if [path] is an absolute path and `false` if it is a /// relative path. /// /// On POSIX systems, absolute paths start with a `/` (forward slash). On /// Windows, an absolute path starts with `\\`, or a drive letter followed by /// `:/` or `:\`. For URLs, absolute paths either start with a protocol and /// optional hostname (e.g. `https://dart.dev`, `file://`) or with a `/`. /// /// URLs that start with `/` are known as "root-relative", since they're /// relative to the root of the current URL. Since root-relative paths are still /// absolute in every other sense, [isAbsolute] will return true for them. They /// can be detected using [isRootRelative]. bool isAbsolute(String path) => context.isAbsolute(path); /// Returns `true` if [path] is a relative path and `false` if it is absolute. /// On POSIX systems, absolute paths start with a `/` (forward slash). On /// Windows, an absolute path starts with `\\`, or a drive letter followed by /// `:/` or `:\`. bool isRelative(String path) => context.isRelative(path); /// Returns `true` if [path] is a root-relative path and `false` if it's not. /// /// URLs that start with `/` are known as "root-relative", since they're /// relative to the root of the current URL. Since root-relative paths are still /// absolute in every other sense, [isAbsolute] will return true for them. They /// can be detected using [isRootRelative]. /// /// No POSIX and Windows paths are root-relative. bool isRootRelative(String path) => context.isRootRelative(path); /// Joins the given path parts into a single path using the current platform's /// [separator]. Example: /// /// p.join('path', 'to', 'foo'); // -> 'path/to/foo' /// /// If any part ends in a path separator, then a redundant separator will not /// be added: /// /// p.join('path/', 'to', 'foo'); // -> 'path/to/foo /// /// If a part is an absolute path, then anything before that will be ignored: /// /// p.join('path', '/to', 'foo'); // -> '/to/foo' String join(String part1, [String? part2, String? part3, String? part4, String? part5, String? part6, String? part7, String? part8]) => context.join(part1, part2, part3, part4, part5, part6, part7, part8); /// Joins the given path parts into a single path using the current platform's /// [separator]. Example: /// /// p.joinAll(['path', 'to', 'foo']); // -> 'path/to/foo' /// /// If any part ends in a path separator, then a redundant separator will not /// be added: /// /// p.joinAll(['path/', 'to', 'foo']); // -> 'path/to/foo /// /// If a part is an absolute path, then anything before that will be ignored: /// /// p.joinAll(['path', '/to', 'foo']); // -> '/to/foo' /// /// For a fixed number of parts, [join] is usually terser. String joinAll(Iterable parts) => context.joinAll(parts); /// Splits [path] into its components using the current platform's [separator]. /// /// p.split('path/to/foo'); // -> ['path', 'to', 'foo'] /// /// The path will *not* be normalized before splitting. /// /// p.split('path/../foo'); // -> ['path', '..', 'foo'] /// /// If [path] is absolute, the root directory will be the first element in the /// array. Example: /// /// // Unix /// p.split('/path/to/foo'); // -> ['/', 'path', 'to', 'foo'] /// /// // Windows /// p.split(r'C:\path\to\foo'); // -> [r'C:\', 'path', 'to', 'foo'] /// p.split(r'\\server\share\path\to\foo'); /// // -> [r'\\server\share', 'foo', 'bar', 'baz'] /// /// // Browser /// p.split('https://dart.dev/path/to/foo'); /// // -> ['https://dart.dev', 'path', 'to', 'foo'] List split(String path) => context.split(path); /// Canonicalizes [path]. /// /// This is guaranteed to return the same path for two different input paths /// if and only if both input paths point to the same location. Unlike /// [normalize], it returns absolute paths when possible and canonicalizes /// ASCII case on Windows. /// /// Note that this does not resolve symlinks. /// /// If you want a map that uses path keys, it's probably more efficient to use a /// Map with [equals] and [hash] specified as the callbacks to use for keys than /// it is to canonicalize every key. String canonicalize(String path) => context.canonicalize(path); /// Normalizes [path], simplifying it by handling `..`, and `.`, and /// removing redundant path separators whenever possible. /// /// Note that this is *not* guaranteed to return the same result for two /// equivalent input paths. For that, see [canonicalize]. Or, if you're using /// paths as map keys use [equals] and [hash] as the key callbacks. /// /// p.normalize('path/./to/..//file.text'); // -> 'path/file.txt' String normalize(String path) => context.normalize(path); /// Attempts to convert [path] to an equivalent relative path from the current /// directory. /// /// // Given current directory is /root/path: /// p.relative('/root/path/a/b.dart'); // -> 'a/b.dart' /// p.relative('/root/other.dart'); // -> '../other.dart' /// /// If the [from] argument is passed, [path] is made relative to that instead. /// /// p.relative('/root/path/a/b.dart', from: '/root/path'); // -> 'a/b.dart' /// p.relative('/root/other.dart', from: '/root/path'); /// // -> '../other.dart' /// /// If [path] and/or [from] are relative paths, they are assumed to be relative /// to the current directory. /// /// Since there is no relative path from one drive letter to another on Windows, /// or from one hostname to another for URLs, this will return an absolute path /// in those cases. /// /// // Windows /// p.relative(r'D:\other', from: r'C:\home'); // -> 'D:\other' /// /// // URL /// p.relative('https://dart.dev', from: 'https://pub.dev'); /// // -> 'https://dart.dev' String relative(String path, {String? from}) => context.relative(path, from: from); /// Returns `true` if [child] is a path beneath `parent`, and `false` otherwise. /// /// p.isWithin('/root/path', '/root/path/a'); // -> true /// p.isWithin('/root/path', '/root/other'); // -> false /// p.isWithin('/root/path', '/root/path') // -> false bool isWithin(String parent, String child) => context.isWithin(parent, child); /// Returns `true` if [path1] points to the same location as [path2], and /// `false` otherwise. /// /// The [hash] function returns a hash code that matches these equality /// semantics. bool equals(String path1, String path2) => context.equals(path1, path2); /// Returns a hash code for [path] such that, if [equals] returns `true` for two /// paths, their hash codes are the same. /// /// Note that the same path may have different hash codes on different platforms /// or with different [current] directories. int hash(String path) => context.hash(path); /// Removes a trailing extension from the last part of [path]. /// /// p.withoutExtension('path/to/foo.dart'); // -> 'path/to/foo' String withoutExtension(String path) => context.withoutExtension(path); /// Returns [path] with the trailing extension set to [extension]. /// /// If [path] doesn't have a trailing extension, this just adds [extension] to /// the end. /// /// p.setExtension('path/to/foo.dart', '.js') // -> 'path/to/foo.js' /// p.setExtension('path/to/foo.dart.js', '.map') /// // -> 'path/to/foo.dart.map' /// p.setExtension('path/to/foo', '.js') // -> 'path/to/foo.js' String setExtension(String path, String extension) => context.setExtension(path, extension); /// Returns the path represented by [uri], which may be a [String] or a [Uri]. /// /// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL /// style, this will just convert [uri] to a string. /// /// // POSIX /// p.fromUri('file:///path/to/foo') // -> '/path/to/foo' /// /// // Windows /// p.fromUri('file:///C:/path/to/foo') // -> r'C:\path\to\foo' /// /// // URL /// p.fromUri('https://dart.dev/path/to/foo') /// // -> 'https://dart.dev/path/to/foo' /// /// If [uri] is relative, a relative path will be returned. /// /// p.fromUri('path/to/foo'); // -> 'path/to/foo' String fromUri(uri) => context.fromUri(uri); /// Returns the URI that represents [path]. /// /// For POSIX and Windows styles, this will return a `file:` URI. For the URL /// style, this will just convert [path] to a [Uri]. /// /// // POSIX /// p.toUri('/path/to/foo') /// // -> Uri.parse('file:///path/to/foo') /// /// // Windows /// p.toUri(r'C:\path\to\foo') /// // -> Uri.parse('file:///C:/path/to/foo') /// /// // URL /// p.toUri('https://dart.dev/path/to/foo') /// // -> Uri.parse('https://dart.dev/path/to/foo') /// /// If [path] is relative, a relative URI will be returned. /// /// p.toUri('path/to/foo') // -> Uri.parse('path/to/foo') Uri toUri(String path) => context.toUri(path); /// Returns a terse, human-readable representation of [uri]. /// /// [uri] can be a [String] or a [Uri]. If it can be made relative to the /// current working directory, that's done. Otherwise, it's returned as-is. This /// gracefully handles non-`file:` URIs for [Style.posix] and [Style.windows]. /// /// The returned value is meant for human consumption, and may be either URI- /// or path-formatted. /// /// // POSIX at "/root/path" /// p.prettyUri('file:///root/path/a/b.dart'); // -> 'a/b.dart' /// p.prettyUri('https://dart.dev/'); // -> 'https://dart.dev' /// /// // Windows at "C:\root\path" /// p.prettyUri('file:///C:/root/path/a/b.dart'); // -> r'a\b.dart' /// p.prettyUri('https://dart.dev/'); // -> 'https://dart.dev' /// /// // URL at "https://dart.dev/root/path" /// p.prettyUri('https://dart.dev/root/path/a/b.dart'); // -> r'a/b.dart' /// p.prettyUri('file:///root/path'); // -> 'file:///root/path' String prettyUri(uri) => context.prettyUri(uri); ÏNN<?Q".ONP)P6MI/7/P5/"4367-G@/GQ**0B"4OOJP , M>0%, #C)'?E+9;N M8+HJL2G693%+8OD%E0,774%,L+1A%"6O/:558H.2GNN4=BBE2$N.0/6E.6#<HJNLJIQP,:OJN:NIQP,2BO9N9N6JO>N>N;;BP<8<OBH091:8MGK.QQ%@E:INDF:O2<>OP< PQPDA#0(Q==;OJHIQ*Q--?DHCO I6'D6+OK5>D2/<6-,N5 1#40:<>/=JQON!DC%HC/ND1package:path/path.dartYfile:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/characters.dart‚// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// This library contains character-code definitions. const plus = 0x2b; const minus = 0x2d; const period = 0x2e; const slash = 0x2f; const zero = 0x30; const nine = 0x39; const colon = 0x3a; const upperA = 0x41; const upperZ = 0x5a; const lowerA = 0x61; const lowerZ = 0x7a; const backslash = 0x5c; NN<6 package:path/src/characters.dartVfile:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/context.dartÀ§B// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:math' as math; import '../path.dart' as p; import 'characters.dart' as chars; import 'internal_style.dart'; import 'parsed_path.dart'; import 'path_exception.dart'; import 'style.dart'; Context createInternal() => Context._internal(); /// An instantiable class for manipulating paths. Unlike the top-level /// functions, this lets you explicitly select what platform the paths will use. class Context { /// Creates a new path context for the given style and current directory. /// /// If [style] is omitted, it uses the host operating system's path style. If /// only [current] is omitted, it defaults ".". If *both* [style] and /// [current] are omitted, [current] defaults to the real current working /// directory. /// /// On the browser, [style] defaults to [Style.url] and [current] defaults to /// the current URL. factory Context({Style? style, String? current}) { if (current == null) { if (style == null) { current = p.current; } else { current = '.'; } } if (style == null) { style = Style.platform; } else if (style is! InternalStyle) { throw ArgumentError('Only styles defined by the path package are ' 'allowed.'); } return Context._(style as InternalStyle, current); } /// Create a [Context] to be used internally within path. Context._internal() : style = Style.platform as InternalStyle, _current = null; Context._(this.style, this._current); /// The style of path that this context works with. final InternalStyle style; /// The current directory given when Context was created. If null, current /// directory is evaluated from 'p.current'. final String? _current; /// The current directory that relative paths are relative to. String get current => _current ?? p.current; /// Gets the path separator for the context's [style]. On Mac and Linux, /// this is `/`. On Windows, it's `\`. String get separator => style.separator; /// Returns a new path with the given path parts appended to [current]. /// /// Equivalent to [join()] with [current] as the first argument. Example: /// /// var context = Context(current: '/root'); /// context.absolute('path', 'to', 'foo'); // -> '/root/path/to/foo' /// /// If [current] isn't absolute, this won't return an absolute path. Does not /// [normalize] or [canonicalize] paths. String absolute(String part1, [String? part2, String? part3, String? part4, String? part5, String? part6, String? part7]) { _validateArgList( 'absolute', [part1, part2, part3, part4, part5, part6, part7]); // If there's a single absolute path, just return it. This is a lot faster // for the common case of `p.absolute(path)`. if (part2 == null && isAbsolute(part1) && !isRootRelative(part1)) { return part1; } return join(current, part1, part2, part3, part4, part5, part6, part7); } /// Gets the part of [path] after the last separator on the context's /// platform. /// /// context.basename('path/to/foo.dart'); // -> 'foo.dart' /// context.basename('path/to'); // -> 'to' /// /// Trailing separators are ignored. /// /// context.basename('path/to/'); // -> 'to' String basename(String path) => _parse(path).basename; /// Gets the part of [path] after the last separator on the context's /// platform, and without any trailing file extension. /// /// context.basenameWithoutExtension('path/to/foo.dart'); // -> 'foo' /// /// Trailing separators are ignored. /// /// context.basenameWithoutExtension('path/to/foo.dart/'); // -> 'foo' String basenameWithoutExtension(String path) => _parse(path).basenameWithoutExtension; /// Gets the part of [path] before the last separator. /// /// context.dirname('path/to/foo.dart'); // -> 'path/to' /// context.dirname('path/to'); // -> 'path' /// /// Trailing separators are ignored. /// /// context.dirname('path/to/'); // -> 'path' String dirname(String path) { final parsed = _parse(path); parsed.removeTrailingSeparators(); if (parsed.parts.isEmpty) return parsed.root ?? '.'; if (parsed.parts.length == 1) return parsed.root ?? '.'; parsed.parts.removeLast(); parsed.separators.removeLast(); parsed.removeTrailingSeparators(); return parsed.toString(); } /// Gets the file extension of [path]: the portion of [basename] from the last /// `.` to the end (including the `.` itself). /// /// context.extension('path/to/foo.dart'); // -> '.dart' /// context.extension('path/to/foo'); // -> '' /// context.extension('path.to/foo'); // -> '' /// context.extension('path/to/foo.dart.js'); // -> '.js' /// /// If the file name starts with a `.`, then it is not considered an /// extension: /// /// context.extension('~/.bashrc'); // -> '' /// context.extension('~/.notes.txt'); // -> '.txt' /// /// Takes an optional parameter `level` which makes possible to return /// multiple extensions having `level` number of dots. If `level` exceeds the /// number of dots, the full extension is returned. The value of `level` must /// be greater than 0, else `RangeError` is thrown. /// /// context.extension('foo.bar.dart.js', 2); // -> '.dart.js /// context.extension('foo.bar.dart.js', 3); // -> '.bar.dart.js' /// context.extension('foo.bar.dart.js', 10); // -> '.bar.dart.js' /// context.extension('path/to/foo.bar.dart.js', 2); // -> '.dart.js' String extension(String path, [int level = 1]) => _parse(path).extension(level); /// Returns the root of [path] if it's absolute, or an empty string if it's /// relative. /// /// // Unix /// context.rootPrefix('path/to/foo'); // -> '' /// context.rootPrefix('/path/to/foo'); // -> '/' /// /// // Windows /// context.rootPrefix(r'path\to\foo'); // -> '' /// context.rootPrefix(r'C:\path\to\foo'); // -> r'C:\' /// context.rootPrefix(r'\\server\share\a\b'); // -> r'\\server\share' /// /// // URL /// context.rootPrefix('path/to/foo'); // -> '' /// context.rootPrefix('https://dart.dev/path/to/foo'); /// // -> 'https://dart.dev' String rootPrefix(String path) => path.substring(0, style.rootLength(path)); /// Returns `true` if [path] is an absolute path and `false` if it is a /// relative path. /// /// On POSIX systems, absolute paths start with a `/` (forward slash). On /// Windows, an absolute path starts with `\\`, or a drive letter followed by /// `:/` or `:\`. For URLs, absolute paths either start with a protocol and /// optional hostname (e.g. `https://dart.dev`, `file://`) or with a `/`. /// /// URLs that start with `/` are known as "root-relative", since they're /// relative to the root of the current URL. Since root-relative paths are /// still absolute in every other sense, [isAbsolute] will return true for /// them. They can be detected using [isRootRelative]. bool isAbsolute(String path) => style.rootLength(path) > 0; /// Returns `true` if [path] is a relative path and `false` if it is absolute. /// On POSIX systems, absolute paths start with a `/` (forward slash). On /// Windows, an absolute path starts with `\\`, or a drive letter followed by /// `:/` or `:\`. bool isRelative(String path) => !isAbsolute(path); /// Returns `true` if [path] is a root-relative path and `false` if it's not. /// /// URLs that start with `/` are known as "root-relative", since they're /// relative to the root of the current URL. Since root-relative paths are /// still absolute in every other sense, [isAbsolute] will return true for /// them. They can be detected using [isRootRelative]. /// /// No POSIX and Windows paths are root-relative. bool isRootRelative(String path) => style.isRootRelative(path); /// Joins the given path parts into a single path. Example: /// /// context.join('path', 'to', 'foo'); // -> 'path/to/foo' /// /// If any part ends in a path separator, then a redundant separator will not /// be added: /// /// context.join('path/', 'to', 'foo'); // -> 'path/to/foo /// /// If a part is an absolute path, then anything before that will be ignored: /// /// context.join('path', '/to', 'foo'); // -> '/to/foo' /// String join(String part1, [String? part2, String? part3, String? part4, String? part5, String? part6, String? part7, String? part8]) { final parts = [ part1, part2, part3, part4, part5, part6, part7, part8 ]; _validateArgList('join', parts); return joinAll(parts.whereType()); } /// Joins the given path parts into a single path. Example: /// /// context.joinAll(['path', 'to', 'foo']); // -> 'path/to/foo' /// /// If any part ends in a path separator, then a redundant separator will not /// be added: /// /// context.joinAll(['path/', 'to', 'foo']); // -> 'path/to/foo /// /// If a part is an absolute path, then anything before that will be ignored: /// /// context.joinAll(['path', '/to', 'foo']); // -> '/to/foo' /// /// For a fixed number of parts, [join] is usually terser. String joinAll(Iterable parts) { final buffer = StringBuffer(); var needsSeparator = false; var isAbsoluteAndNotRootRelative = false; for (var part in parts.where((part) => part != '')) { if (isRootRelative(part) && isAbsoluteAndNotRootRelative) { // If the new part is root-relative, it preserves the previous root but // replaces the path after it. final parsed = _parse(part); final path = buffer.toString(); parsed.root = path.substring(0, style.rootLength(path, withDrive: true)); if (style.needsSeparator(parsed.root!)) { parsed.separators[0] = style.separator; } buffer.clear(); buffer.write(parsed.toString()); } else if (isAbsolute(part)) { isAbsoluteAndNotRootRelative = !isRootRelative(part); // An absolute path discards everything before it. buffer.clear(); buffer.write(part); } else { if (part.isNotEmpty && style.containsSeparator(part[0])) { // The part starts with a separator, so we don't need to add one. } else if (needsSeparator) { buffer.write(separator); } buffer.write(part); } // Unless this part ends with a separator, we'll need to add one before // the next part. needsSeparator = style.needsSeparator(part); } return buffer.toString(); } /// Splits [path] into its components using the current platform's /// [separator]. Example: /// /// context.split('path/to/foo'); // -> ['path', 'to', 'foo'] /// /// The path will *not* be normalized before splitting. /// /// context.split('path/../foo'); // -> ['path', '..', 'foo'] /// /// If [path] is absolute, the root directory will be the first element in the /// array. Example: /// /// // Unix /// context.split('/path/to/foo'); // -> ['/', 'path', 'to', 'foo'] /// /// // Windows /// context.split(r'C:\path\to\foo'); // -> [r'C:\', 'path', 'to', 'foo'] /// context.split(r'\\server\share\path\to\foo'); /// // -> [r'\\server\share', 'foo', 'bar', 'baz'] /// /// // Browser /// context.split('https://dart.dev/path/to/foo'); /// // -> ['https://dart.dev', 'path', 'to', 'foo'] List split(String path) { final parsed = _parse(path); // Filter out empty parts that exist due to multiple separators in a row. parsed.parts = parsed.parts.where((part) => part.isNotEmpty).toList(); if (parsed.root != null) parsed.parts.insert(0, parsed.root!); return parsed.parts; } /// Canonicalizes [path]. /// /// This is guaranteed to return the same path for two different input paths /// if and only if both input paths point to the same location. Unlike /// [normalize], it returns absolute paths when possible and canonicalizes /// ASCII case on Windows. /// /// Note that this does not resolve symlinks. /// /// If you want a map that uses path keys, it's probably more efficient to use /// a Map with [equals] and [hash] specified as the callbacks to use for keys /// than it is to canonicalize every key. String canonicalize(String path) { path = absolute(path); if (style != Style.windows && !_needsNormalization(path)) return path; final parsed = _parse(path); parsed.normalize(canonicalize: true); return parsed.toString(); } /// Normalizes [path], simplifying it by handling `..`, and `.`, and /// removing redundant path separators whenever possible. /// /// Note that this is *not* guaranteed to return the same result for two /// equivalent input paths. For that, see [canonicalize]. Or, if you're using /// paths as map keys use [equals] and [hash] as the key callbacks. /// /// context.normalize('path/./to/..//file.text'); // -> 'path/file.txt' String normalize(String path) { if (!_needsNormalization(path)) return path; final parsed = _parse(path); parsed.normalize(); return parsed.toString(); } /// Returns whether [path] needs to be normalized. bool _needsNormalization(String path) { var start = 0; final codeUnits = path.codeUnits; int? previousPrevious; int? previous; // Skip past the root before we start looking for snippets that need // normalization. We want to normalize "//", but not when it's part of // "http://". final root = style.rootLength(path); if (root != 0) { start = root; previous = chars.slash; // On Windows, the root still needs to be normalized if it contains a // forward slash. if (style == Style.windows) { for (var i = 0; i < root; i++) { if (codeUnits[i] == chars.slash) return true; } } } for (var i = start; i < codeUnits.length; i++) { final codeUnit = codeUnits[i]; if (style.isSeparator(codeUnit)) { // Forward slashes in Windows paths are normalized to backslashes. if (style == Style.windows && codeUnit == chars.slash) return true; // Multiple separators are normalized to single separators. if (previous != null && style.isSeparator(previous)) return true; // Single dots and double dots are normalized to directory traversals. // // This can return false positives for ".../", but that's unlikely // enough that it's probably not going to cause performance issues. if (previous == chars.period && (previousPrevious == null || previousPrevious == chars.period || style.isSeparator(previousPrevious))) { return true; } } previousPrevious = previous; previous = codeUnit; } // Empty paths are normalized to ".". if (previous == null) return true; // Trailing separators are removed. if (style.isSeparator(previous)) return true; // Single dots and double dots are normalized to directory traversals. if (previous == chars.period && (previousPrevious == null || style.isSeparator(previousPrevious) || previousPrevious == chars.period)) { return true; } return false; } /// Attempts to convert [path] to an equivalent relative path relative to /// [current]. /// /// var context = Context(current: '/root/path'); /// context.relative('/root/path/a/b.dart'); // -> 'a/b.dart' /// context.relative('/root/other.dart'); // -> '../other.dart' /// /// If the [from] argument is passed, [path] is made relative to that instead. /// /// context.relative('/root/path/a/b.dart', /// from: '/root/path'); // -> 'a/b.dart' /// context.relative('/root/other.dart', /// from: '/root/path'); // -> '../other.dart' /// /// If [path] and/or [from] are relative paths, they are assumed to be /// relative to [current]. /// /// Since there is no relative path from one drive letter to another on /// Windows, this will return an absolute path in that case. /// /// context.relative(r'D:\other', from: r'C:\other'); // -> 'D:\other' /// /// This will also return an absolute path if an absolute [path] is passed to /// a context with a relative path for [current]. /// /// var context = Context(r'some/relative/path'); /// context.relative(r'/absolute/path'); // -> '/absolute/path' /// /// If [current] is relative, it may be impossible to determine a path from /// [from] to [path]. For example, if [current] and [path] are "." and [from] /// is "/", no path can be determined. In this case, a [PathException] will be /// thrown. String relative(String path, {String? from}) { // Avoid expensive computation if the path is already relative. if (from == null && isRelative(path)) return normalize(path); from = from == null ? current : absolute(from); // We can't determine the path from a relative path to an absolute path. if (isRelative(from) && isAbsolute(path)) { return normalize(path); } // If the given path is relative, resolve it relative to the context's // current directory. if (isRelative(path) || isRootRelative(path)) { path = absolute(path); } // If the path is still relative and `from` is absolute, we're unable to // find a path from `from` to `path`. if (isRelative(path) && isAbsolute(from)) { throw PathException('Unable to find a path to "$path" from "$from".'); } final fromParsed = _parse(from)..normalize(); final pathParsed = _parse(path)..normalize(); if (fromParsed.parts.isNotEmpty && fromParsed.parts[0] == '.') { return pathParsed.toString(); } // If the root prefixes don't match (for example, different drive letters // on Windows), then there is no relative path, so just return the absolute // one. In Windows, drive letters are case-insenstive and we allow // calculation of relative paths, even if a path has not been normalized. if (fromParsed.root != pathParsed.root && ((fromParsed.root == null || pathParsed.root == null) || !style.pathsEqual(fromParsed.root!, pathParsed.root!))) { return pathParsed.toString(); } // Strip off their common prefix. while (fromParsed.parts.isNotEmpty && pathParsed.parts.isNotEmpty && style.pathsEqual(fromParsed.parts[0], pathParsed.parts[0])) { fromParsed.parts.removeAt(0); fromParsed.separators.removeAt(1); pathParsed.parts.removeAt(0); pathParsed.separators.removeAt(1); } // If there are any directories left in the from path, we need to walk up // out of them. If a directory left in the from path is '..', it cannot // be cancelled by adding a '..'. if (fromParsed.parts.isNotEmpty && fromParsed.parts[0] == '..') { throw PathException('Unable to find a path to "$path" from "$from".'); } pathParsed.parts.insertAll(0, List.filled(fromParsed.parts.length, '..')); pathParsed.separators[0] = ''; pathParsed.separators .insertAll(1, List.filled(fromParsed.parts.length, style.separator)); // Corner case: the paths completely collapsed. if (pathParsed.parts.isEmpty) return '.'; // Corner case: path was '.' and some '..' directories were added in front. // Don't add a final '/.' in that case. if (pathParsed.parts.length > 1 && pathParsed.parts.last == '.') { pathParsed.parts.removeLast(); pathParsed.separators ..removeLast() ..removeLast() ..add(''); } // Make it relative. pathParsed.root = ''; pathParsed.removeTrailingSeparators(); return pathParsed.toString(); } /// Returns `true` if [child] is a path beneath `parent`, and `false` /// otherwise. /// /// path.isWithin('/root/path', '/root/path/a'); // -> true /// path.isWithin('/root/path', '/root/other'); // -> false /// path.isWithin('/root/path', '/root/path'); // -> false bool isWithin(String parent, String child) => _isWithinOrEquals(parent, child) == _PathRelation.within; /// Returns `true` if [path1] points to the same location as [path2], and /// `false` otherwise. /// /// The [hash] function returns a hash code that matches these equality /// semantics. bool equals(String path1, String path2) => _isWithinOrEquals(path1, path2) == _PathRelation.equal; /// Compares two paths and returns an enum value indicating their relationship /// to one another. /// /// This never returns [_PathRelation.inconclusive]. _PathRelation _isWithinOrEquals(String parent, String child) { // Make both paths the same level of relative. We're only able to do the // quick comparison if both paths are in the same format, and making a path // absolute is faster than making it relative. final parentIsAbsolute = isAbsolute(parent); final childIsAbsolute = isAbsolute(child); if (parentIsAbsolute && !childIsAbsolute) { child = absolute(child); if (style.isRootRelative(parent)) parent = absolute(parent); } else if (childIsAbsolute && !parentIsAbsolute) { parent = absolute(parent); if (style.isRootRelative(child)) child = absolute(child); } else if (childIsAbsolute && parentIsAbsolute) { final childIsRootRelative = style.isRootRelative(child); final parentIsRootRelative = style.isRootRelative(parent); if (childIsRootRelative && !parentIsRootRelative) { child = absolute(child); } else if (parentIsRootRelative && !childIsRootRelative) { parent = absolute(parent); } } final result = _isWithinOrEqualsFast(parent, child); if (result != _PathRelation.inconclusive) return result; String relative; try { relative = this.relative(child, from: parent); } on PathException catch (_) { // If no relative path from [parent] to [child] is found, [child] // definitely isn't a child of [parent]. return _PathRelation.different; } if (!isRelative(relative)) return _PathRelation.different; if (relative == '.') return _PathRelation.equal; if (relative == '..') return _PathRelation.different; return (relative.length >= 3 && relative.startsWith('..') && style.isSeparator(relative.codeUnitAt(2))) ? _PathRelation.different : _PathRelation.within; } /// An optimized implementation of [_isWithinOrEquals] that doesn't handle a /// few complex cases. _PathRelation _isWithinOrEqualsFast(String parent, String child) { // Normally we just bail when we see "." path components, but we can handle // a single dot easily enough. if (parent == '.') parent = ''; final parentRootLength = style.rootLength(parent); final childRootLength = style.rootLength(child); // If the roots aren't the same length, we know both paths are absolute or // both are root-relative, and thus that the roots are meaningfully // different. // // isWithin("C:/bar", "//foo/bar/baz") //=> false // isWithin("http://example.com/", "http://google.com/bar") //=> false if (parentRootLength != childRootLength) return _PathRelation.different; // Make sure that the roots are textually the same as well. // // isWithin("C:/bar", "D:/bar/baz") //=> false // isWithin("http://example.com/", "http://example.org/bar") //=> false for (var i = 0; i < parentRootLength; i++) { final parentCodeUnit = parent.codeUnitAt(i); final childCodeUnit = child.codeUnitAt(i); if (!style.codeUnitsEqual(parentCodeUnit, childCodeUnit)) { return _PathRelation.different; } } // Start by considering the last code unit as a separator, since // semantically we're starting at a new path component even if we're // comparing relative paths. var lastCodeUnit = chars.slash; /// The index of the last separator in [parent]. int? lastParentSeparator; // Iterate through both paths as long as they're semantically identical. var parentIndex = parentRootLength; var childIndex = childRootLength; while (parentIndex < parent.length && childIndex < child.length) { var parentCodeUnit = parent.codeUnitAt(parentIndex); var childCodeUnit = child.codeUnitAt(childIndex); if (style.codeUnitsEqual(parentCodeUnit, childCodeUnit)) { if (style.isSeparator(parentCodeUnit)) { lastParentSeparator = parentIndex; } lastCodeUnit = parentCodeUnit; parentIndex++; childIndex++; continue; } // Ignore multiple separators in a row. if (style.isSeparator(parentCodeUnit) && style.isSeparator(lastCodeUnit)) { lastParentSeparator = parentIndex; parentIndex++; continue; } else if (style.isSeparator(childCodeUnit) && style.isSeparator(lastCodeUnit)) { childIndex++; continue; } // If a dot comes after a separator, it may be a directory traversal // operator. To check that, we need to know if it's followed by either // "/" or "./". Otherwise, it's just a normal non-matching character. // // isWithin("foo/./bar", "foo/bar/baz") //=> true // isWithin("foo/bar/../baz", "foo/bar/.foo") //=> false if (parentCodeUnit == chars.period && style.isSeparator(lastCodeUnit)) { parentIndex++; // We've hit "/." at the end of the parent path, which we can ignore, // since the paths were equivalent up to this point. if (parentIndex == parent.length) break; parentCodeUnit = parent.codeUnitAt(parentIndex); // We've hit "/./", which we can ignore. if (style.isSeparator(parentCodeUnit)) { lastParentSeparator = parentIndex; parentIndex++; continue; } // We've hit "/..", which may be a directory traversal operator that // we can't handle on the fast track. if (parentCodeUnit == chars.period) { parentIndex++; if (parentIndex == parent.length || style.isSeparator(parent.codeUnitAt(parentIndex))) { return _PathRelation.inconclusive; } } // If this isn't a directory traversal, fall through so we hit the // normal handling for mismatched paths. } // This is the same logic as above, but for the child path instead of the // parent. if (childCodeUnit == chars.period && style.isSeparator(lastCodeUnit)) { childIndex++; if (childIndex == child.length) break; childCodeUnit = child.codeUnitAt(childIndex); if (style.isSeparator(childCodeUnit)) { childIndex++; continue; } if (childCodeUnit == chars.period) { childIndex++; if (childIndex == child.length || style.isSeparator(child.codeUnitAt(childIndex))) { return _PathRelation.inconclusive; } } } // If we're here, we've hit two non-matching, non-significant characters. // As long as the remainders of the two paths don't have any unresolved // ".." components, we can be confident that [child] is not within // [parent]. final childDirection = _pathDirection(child, childIndex); if (childDirection != _PathDirection.belowRoot) { return _PathRelation.inconclusive; } final parentDirection = _pathDirection(parent, parentIndex); if (parentDirection != _PathDirection.belowRoot) { return _PathRelation.inconclusive; } return _PathRelation.different; } // If the child is shorter than the parent, it's probably not within the // parent. The only exception is if the parent has some weird ".." stuff // going on, in which case we do the slow check. // // isWithin("foo/bar/baz", "foo/bar") //=> false // isWithin("foo/bar/baz/../..", "foo/bar") //=> true if (childIndex == child.length) { if (parentIndex == parent.length || style.isSeparator(parent.codeUnitAt(parentIndex))) { lastParentSeparator = parentIndex; } else { lastParentSeparator ??= math.max(0, parentRootLength - 1); } final direction = _pathDirection(parent, lastParentSeparator); if (direction == _PathDirection.atRoot) return _PathRelation.equal; return direction == _PathDirection.aboveRoot ? _PathRelation.inconclusive : _PathRelation.different; } // We've reached the end of the parent path, which means it's time to make a // decision. Before we do, though, we'll check the rest of the child to see // what that tells us. final direction = _pathDirection(child, childIndex); // If there are no more components in the child, then it's the same as // the parent. // // isWithin("foo/bar", "foo/bar") //=> false // isWithin("foo/bar", "foo/bar//") //=> false // equals("foo/bar", "foo/bar") //=> true // equals("foo/bar", "foo/bar//") //=> true if (direction == _PathDirection.atRoot) return _PathRelation.equal; // If there are unresolved ".." components in the child, no decision we make // will be valid. We'll abort and do the slow check instead. // // isWithin("foo/bar", "foo/bar/..") //=> false // isWithin("foo/bar", "foo/bar/baz/bang/../../..") //=> false // isWithin("foo/bar", "foo/bar/baz/bang/../../../bar/baz") //=> true if (direction == _PathDirection.aboveRoot) { return _PathRelation.inconclusive; } // The child is within the parent if and only if we're on a separator // boundary. // // isWithin("foo/bar", "foo/bar/baz") //=> true // isWithin("foo/bar/", "foo/bar/baz") //=> true // isWithin("foo/bar", "foo/barbaz") //=> false return (style.isSeparator(child.codeUnitAt(childIndex)) || style.isSeparator(lastCodeUnit)) ? _PathRelation.within : _PathRelation.different; } // Returns a [_PathDirection] describing the path represented by [codeUnits] // starting at [index]. // // This ignores leading separators. // // pathDirection("foo") //=> below root // pathDirection("foo/bar/../baz") //=> below root // pathDirection("//foo/bar/baz") //=> below root // pathDirection("/") //=> at root // pathDirection("foo/..") //=> at root // pathDirection("foo/../baz") //=> reaches root // pathDirection("foo/../..") //=> above root // pathDirection("foo/../../foo/bar/baz") //=> above root _PathDirection _pathDirection(String path, int index) { var depth = 0; var reachedRoot = false; var i = index; while (i < path.length) { // Ignore initial separators or doubled separators. while (i < path.length && style.isSeparator(path.codeUnitAt(i))) { i++; } // If we're at the end, stop. if (i == path.length) break; // Move through the path component to the next separator. final start = i; while (i < path.length && !style.isSeparator(path.codeUnitAt(i))) { i++; } // See if the path component is ".", "..", or a name. if (i - start == 1 && path.codeUnitAt(start) == chars.period) { // Don't change the depth. } else if (i - start == 2 && path.codeUnitAt(start) == chars.period && path.codeUnitAt(start + 1) == chars.period) { // ".." backs out a directory. depth--; // If we work back beyond the root, stop. if (depth < 0) break; // Record that we reached the root so we don't return // [_PathDirection.belowRoot]. if (depth == 0) reachedRoot = true; } else { // Step inside a directory. depth++; } // If we're at the end, stop. if (i == path.length) break; // Move past the separator. i++; } if (depth < 0) return _PathDirection.aboveRoot; if (depth == 0) return _PathDirection.atRoot; if (reachedRoot) return _PathDirection.reachesRoot; return _PathDirection.belowRoot; } /// Returns a hash code for [path] that matches the semantics of [equals]. /// /// Note that the same path may have different hash codes in different /// [Context]s. int hash(String path) { // Make [path] absolute to ensure that equivalent relative and absolute // paths have the same hash code. path = absolute(path); final result = _hashFast(path); if (result != null) return result; final parsed = _parse(path); parsed.normalize(); return _hashFast(parsed.toString())!; } /// An optimized implementation of [hash] that doesn't handle internal `..` /// components. /// /// This will handle `..` components that appear at the beginning of the path. int? _hashFast(String path) { var hash = 4603; var beginning = true; var wasSeparator = true; for (var i = 0; i < path.length; i++) { final codeUnit = style.canonicalizeCodeUnit(path.codeUnitAt(i)); // Take advantage of the fact that collisions are allowed to ignore // separators entirely. This lets us avoid worrying about cases like // multiple trailing slashes. if (style.isSeparator(codeUnit)) { wasSeparator = true; continue; } if (codeUnit == chars.period && wasSeparator) { // If a dot comes after a separator, it may be a directory traversal // operator. To check that, we need to know if it's followed by either // "/" or "./". Otherwise, it's just a normal character. // // hash("foo/./bar") == hash("foo/bar") // We've hit "/." at the end of the path, which we can ignore. if (i + 1 == path.length) break; final next = path.codeUnitAt(i + 1); // We can just ignore "/./", since they don't affect the semantics of // the path. if (style.isSeparator(next)) continue; // If the path ends with "/.." or contains "/../", we need to // canonicalize it before we can hash it. We make an exception for ".."s // at the beginning of the path, since those may appear even in a // canonicalized path. if (!beginning && next == chars.period && (i + 2 == path.length || style.isSeparator(path.codeUnitAt(i + 2)))) { return null; } } // Make sure [hash] stays under 32 bits even after multiplication. hash &= 0x3FFFFFF; hash *= 33; hash ^= codeUnit; wasSeparator = false; beginning = false; } return hash; } /// Removes a trailing extension from the last part of [path]. /// /// context.withoutExtension('path/to/foo.dart'); // -> 'path/to/foo' String withoutExtension(String path) { final parsed = _parse(path); for (var i = parsed.parts.length - 1; i >= 0; i--) { if (parsed.parts[i].isNotEmpty) { parsed.parts[i] = parsed.basenameWithoutExtension; break; } } return parsed.toString(); } /// Returns [path] with the trailing extension set to [extension]. /// /// If [path] doesn't have a trailing extension, this just adds [extension] to /// the end. /// /// context.setExtension('path/to/foo.dart', '.js') /// // -> 'path/to/foo.js' /// context.setExtension('path/to/foo.dart.js', '.map') /// // -> 'path/to/foo.dart.map' /// context.setExtension('path/to/foo', '.js') /// // -> 'path/to/foo.js' String setExtension(String path, String extension) => withoutExtension(path) + extension; /// Returns the path represented by [uri], which may be a [String] or a [Uri]. /// /// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL /// style, this will just convert [uri] to a string. /// /// // POSIX /// context.fromUri('file:///path/to/foo') /// // -> '/path/to/foo' /// /// // Windows /// context.fromUri('file:///C:/path/to/foo') /// // -> r'C:\path\to\foo' /// /// // URL /// context.fromUri('https://dart.dev/path/to/foo') /// // -> 'https://dart.dev/path/to/foo' /// /// If [uri] is relative, a relative path will be returned. /// /// path.fromUri('path/to/foo'); // -> 'path/to/foo' String fromUri(uri) => style.pathFromUri(_parseUri(uri)); /// Returns the URI that represents [path]. /// /// For POSIX and Windows styles, this will return a `file:` URI. For the URL /// style, this will just convert [path] to a [Uri]. /// /// // POSIX /// context.toUri('/path/to/foo') /// // -> Uri.parse('file:///path/to/foo') /// /// // Windows /// context.toUri(r'C:\path\to\foo') /// // -> Uri.parse('file:///C:/path/to/foo') /// /// // URL /// context.toUri('https://dart.dev/path/to/foo') /// // -> Uri.parse('https://dart.dev/path/to/foo') Uri toUri(String path) { if (isRelative(path)) { return style.relativePathToUri(path); } else { return style.absolutePathToUri(join(current, path)); } } /// Returns a terse, human-readable representation of [uri]. /// /// [uri] can be a [String] or a [Uri]. If it can be made relative to the /// current working directory, that's done. Otherwise, it's returned as-is. /// This gracefully handles non-`file:` URIs for [Style.posix] and /// [Style.windows]. /// /// The returned value is meant for human consumption, and may be either URI- /// or path-formatted. /// /// // POSIX /// var context = Context(current: '/root/path'); /// context.prettyUri('file:///root/path/a/b.dart'); // -> 'a/b.dart' /// context.prettyUri('https://dart.dev/'); // -> 'https://dart.dev' /// /// // Windows /// var context = Context(current: r'C:\root\path'); /// context.prettyUri('file:///C:/root/path/a/b.dart'); // -> r'a\b.dart' /// context.prettyUri('https://dart.dev/'); // -> 'https://dart.dev' /// /// // URL /// var context = Context(current: 'https://dart.dev/root/path'); /// context.prettyUri('https://dart.dev/root/path/a/b.dart'); /// // -> r'a/b.dart' /// context.prettyUri('file:///root/path'); // -> 'file:///root/path' String prettyUri(uri) { final typedUri = _parseUri(uri); if (typedUri.scheme == 'file' && style == Style.url) { return typedUri.toString(); } else if (typedUri.scheme != 'file' && typedUri.scheme != '' && style != Style.url) { return typedUri.toString(); } final path = normalize(fromUri(typedUri)); final rel = relative(path); // Only return a relative path if it's actually shorter than the absolute // path. This avoids ugly things like long "../" chains to get to the root // and then go back down. return split(rel).length > split(path).length ? path : rel; } ParsedPath _parse(String path) => ParsedPath.parse(path, style); } /// Parses argument if it's a [String] or returns it intact if it's a [Uri]. /// /// Throws an [ArgumentError] otherwise. Uri _parseUri(uri) { if (uri is String) return Uri.parse(uri); if (uri is Uri) return uri; throw ArgumentError.value(uri, 'uri', 'Value must be a String or a Uri'); } /// Validates that there are no non-null arguments following a null one and /// throws an appropriate [ArgumentError] on failure. void _validateArgList(String method, List args) { for (var i = 1; i < args.length; i++) { // Ignore nulls hanging off the end. if (args[i] == null || args[i - 1] != null) continue; int numArgs; for (numArgs = args.length; numArgs >= 1; numArgs--) { if (args[numArgs - 1] != null) break; } // Show the arguments. final message = StringBuffer(); message.write('$method('); message.write(args .take(numArgs) .map((arg) => arg == null ? 'null' : '"$arg"') .join(', ')); message.write('): part ${i - 1} was null, but part $i was not.'); throw ArgumentError(message.toString()); } } /// An enum of possible return values for [Context._pathDirection]. class _PathDirection { /// The path contains enough ".." components that at some point it reaches /// above its original root. /// /// Note that this applies even if the path ends beneath its original root. It /// takes precendence over any other return values that may apple. static const aboveRoot = _PathDirection('above root'); /// The path contains enough ".." components that it ends at its original /// root. static const atRoot = _PathDirection('at root'); /// The path contains enough ".." components that at some point it reaches its /// original root, but it ends beneath that root. static const reachesRoot = _PathDirection('reaches root'); /// The path never reaches to or above its original root. static const belowRoot = _PathDirection('below root'); final String name; const _PathDirection(this.name); @override String toString() => name; } /// An enum of possible return values for [Context._isWithinOrEquals]. class _PathRelation { /// The first path is a proper parent of the second. /// /// For example, `foo` is a proper parent of `foo/bar`, but not of `foo`. static const within = _PathRelation('within'); /// The two paths are equivalent. /// /// For example, `foo//bar` is equivalent to `foo/bar`. static const equal = _PathRelation('equal'); /// The first path is neither a parent of nor equal to the second. static const different = _PathRelation('different'); /// We couldn't quickly determine any information about the paths' /// relationship to each other. /// /// Only returned by [Context._isWithinOrEqualsFast]. static const inconclusive = _PathRelation('inconclusive'); final String name; const _PathRelation(this.name); @override String toString() => name; } „‹NN<#1GQLPHLP5*I7<1(6M/A/K)+JL3KP+ HO2HKHA;'39H9L'M2-9?<'4 !'9=$'Q1?55@G6:IPP6EJJM4%N687>M6>%OJLPNLKMM9>QLP5PKMM94B>APAP> %/>FPFPC=+# .:BP'%(H22 )%>;CL%# N3ED:DQJP8;9<$!NKCOIM0QP,%K!*G<KPFN"1!5*&IK)L$)8 5%)KLDJO KL()48 #*'(2K$%31L8DFQ24/9IJ?MP48FNPQ1DB4M0K4M*0M22E$NPGN.AF$&*'F$)$)NL&FMO#N4.P,G%+"HBBA0@LJ->Q7AMP31/0C7!@6?A:!A#9= 5#H/&?5:$)7" OEP#$75OH:OM@7P131B(EI!$5M(&G;8A1- './-+5-KML &*?+CEJ3'%QP9K5724HQA8GN1)J898?-#O&.98).74@::I $#@J ',$$#" 428%MIL&$'!*NQ ,GJK$)6MOA 4G)-N/FQJ$%> IAL)!9(;EQ:#>)5#8*QM71!4$:1>;<.P7(3+68<, ;?LNEP8LK;PKHD L%;",!"/ NO@CM),LL6;*):;,$7F-DMQE9L 3Q4=<9# G7L1$:/E7E"8=" package:path/src/context.dart~gs]file:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/internal_style.dart // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'context.dart'; import 'style.dart'; /// The internal interface for the [Style] type. /// /// Users should be able to pass around instances of [Style] like an enum, but /// the members that [Context] uses should be hidden from them. Those members /// are defined on this class instead. abstract class InternalStyle extends Style { /// The default path separator for this style. /// /// On POSIX, this is `/`. On Windows, it's `\`. @override String get separator; /// Returns whether [path] contains a separator. bool containsSeparator(String path); /// Returns whether [codeUnit] is the character code of a separator. bool isSeparator(int codeUnit); /// Returns whether this path component needs a separator after it. /// /// Windows and POSIX styles just need separators when the previous component /// doesn't already end in a separator, but the URL always needs to place a /// separator between the root and the first component, even if the root /// already ends in a separator character. For example, to join "file://" and /// "usr", an additional "/" is needed (making "file:///usr"). bool needsSeparator(String path); /// Returns the number of characters of the root part. /// /// Returns 0 if the path is relative and 1 if the path is root-relative. /// /// If [withDrive] is `true`, this should include the drive letter for `file:` /// URLs. Non-URL styles may ignore the parameter. int rootLength(String path, {bool withDrive = false}); /// Gets the root prefix of [path] if path is absolute. If [path] is relative, /// returns `null`. @override String? getRoot(String path) { final length = rootLength(path); if (length > 0) return path.substring(0, length); return isRootRelative(path) ? path[0] : null; } /// Returns whether [path] is root-relative. /// /// If [path] is relative or absolute and not root-relative, returns `false`. bool isRootRelative(String path); /// Returns the path represented by [uri] in this style. @override String pathFromUri(Uri uri); /// Returns the URI that represents a relative path. @override Uri relativePathToUri(String path) { final segments = context.split(path); // Ensure that a trailing slash in the path produces a trailing slash in the // URL. if (isSeparator(path.codeUnitAt(path.length - 1))) segments.add(''); return Uri(pathSegments: segments); } /// Returns the URI that represents [path], which is assumed to be absolute. @override Uri absolutePathToUri(String path); /// Returns whether [codeUnit1] and [codeUnit2] are considered equivalent for /// this style. bool codeUnitsEqual(int codeUnit1, int codeUnit2) => codeUnit1 == codeUnit2; /// Returns whether [path1] and [path2] are equivalent. /// /// This only needs to handle character-by-character comparison; it can assume /// the paths are normalized and contain no `..` components. bool pathsEqual(String path1, String path2) => path1 == path2; int canonicalizeCodeUnit(int codeUnit) => codeUnit; String canonicalizePart(String part) => part; } [NN<1ON'-13 3'G"FPNKPA$9LQ59Q !%62/P$; 7 '*Q I(O &PO:Q?A60$package:path/src/internal_style.dartZfile:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/parsed_path.dart™™// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'internal_style.dart'; import 'style.dart'; class ParsedPath { /// The [InternalStyle] that was used to parse this path. InternalStyle style; /// The absolute root portion of the path, or `null` if the path is relative. /// On POSIX systems, this will be `null` or "/". On Windows, it can be /// `null`, "//" for a UNC path, or something like "C:\" for paths with drive /// letters. String? root; /// Whether this path is root-relative. /// /// See `Context.isRootRelative`. bool isRootRelative; /// The path-separated parts of the path. All but the last will be /// directories. List parts; /// The path separators preceding each part. /// /// The first one will be an empty string unless the root requires a separator /// between it and the path. The last one will be an empty string unless the /// path ends with a trailing separator. List separators; /// The file extension of the last non-empty part, or "" if it doesn't have /// one. String extension([int level = 1]) => _splitExtension(level)[1]; /// `true` if this is an absolute path. bool get isAbsolute => root != null; factory ParsedPath.parse(String path, InternalStyle style) { // Remove the root prefix, if any. final root = style.getRoot(path); final isRootRelative = style.isRootRelative(path); if (root != null) path = path.substring(root.length); // Split the parts on path separators. final parts = []; final separators = []; var start = 0; if (path.isNotEmpty && style.isSeparator(path.codeUnitAt(0))) { separators.add(path[0]); start = 1; } else { separators.add(''); } for (var i = start; i < path.length; i++) { if (style.isSeparator(path.codeUnitAt(i))) { parts.add(path.substring(start, i)); separators.add(path[i]); start = i + 1; } } // Add the final part, if any. if (start < path.length) { parts.add(path.substring(start)); separators.add(''); } return ParsedPath._(style, root, isRootRelative, parts, separators); } ParsedPath._( this.style, this.root, this.isRootRelative, this.parts, this.separators); String get basename { final copy = clone(); copy.removeTrailingSeparators(); if (copy.parts.isEmpty) return root ?? ''; return copy.parts.last; } String get basenameWithoutExtension => _splitExtension()[0]; bool get hasTrailingSeparator => parts.isNotEmpty && (parts.last == '' || separators.last != ''); void removeTrailingSeparators() { while (parts.isNotEmpty && parts.last == '') { parts.removeLast(); separators.removeLast(); } if (separators.isNotEmpty) separators[separators.length - 1] = ''; } void normalize({bool canonicalize = false}) { // Handle '.', '..', and empty parts. var leadingDoubles = 0; final newParts = []; for (var part in parts) { if (part == '.' || part == '') { // Do nothing. Ignore it. } else if (part == '..') { // Pop the last part off. if (newParts.isNotEmpty) { newParts.removeLast(); } else { // Backed out past the beginning, so preserve the "..". leadingDoubles++; } } else { newParts.add(canonicalize ? style.canonicalizePart(part) : part); } } // A relative path can back out from the start directory. if (!isAbsolute) { newParts.insertAll(0, List.filled(leadingDoubles, '..')); } // If we collapsed down to nothing, do ".". if (newParts.isEmpty && !isAbsolute) { newParts.add('.'); } // Canonicalize separators. parts = newParts; separators = List.filled(newParts.length + 1, style.separator, growable: true); if (!isAbsolute || newParts.isEmpty || !style.needsSeparator(root!)) { separators[0] = ''; } // Normalize the Windows root if needed. if (root != null && style == Style.windows) { if (canonicalize) root = root!.toLowerCase(); root = root!.replaceAll('/', '\\'); } removeTrailingSeparators(); } @override String toString() { final builder = StringBuffer(); if (root != null) builder.write(root); for (var i = 0; i < parts.length; i++) { builder.write(separators[i]); builder.write(parts[i]); } builder.write(separators.last); return builder.toString(); } /// Returns k-th last index of the `character` in the `path`. /// /// If `k` exceeds the count of `character`s in `path`, the left most index /// of the `character` is returned. int _kthLastIndexOf(String path, String character, int k) { var count = 0, leftMostIndexedCharacter = 0; for (var index = path.length - 1; index >= 0; --index) { if (path[index] == character) { leftMostIndexedCharacter = index; ++count; if (count == k) { return index; } } } return leftMostIndexedCharacter; } /// Splits the last non-empty part of the path into a `[basename, extension]` /// pair. /// /// Takes an optional parameter `level` which makes possible to return /// multiple extensions having `level` number of dots. If `level` exceeds the /// number of dots, the path is split at the first most dot. The value of /// `level` must be greater than 0, else `RangeError` is thrown. /// /// Returns a two-element list. The first is the name of the file without any /// extension. The second is the extension or "" if it has none. List _splitExtension([int level = 1]) { if (level <= 0) { throw RangeError.value( level, 'level', "level's value must be greater than 0"); } final file = parts.cast().lastWhere((p) => p != '', orElse: () => null); if (file == null) return ['', '']; if (file == '..') return ['..', '']; final lastDot = _kthLastIndexOf(file, '.', level); // If there is no dot, or it's the first character, like '.bashrc', it // doesn't count. if (lastDot <= 0) return [file, '']; return [file.substring(0, lastDot), file.substring(lastDot)]; } ParsedPath clone() => ParsedPath._( style, root, isRootRelative, List.from(parts), List.from(separators)); } €ÔNN<<PJP*$E/QO+N B*'?'&7:+#D 03-!#(IP%/?#G$3G0*!'"!"#!B J>@0+ KK-24*  $+-$$@N&>1=&* %P IPLCPC2CM')7K)B&M!package:path/src/parsed_path.dart]file:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/path_exception.dartÛ// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// An exception class that's thrown when a path operation is unable to be /// computed accurately. class PathException implements Exception { String message; PathException(this.message); @override String toString() => 'PathException: $message'; } NN<K+ 2$package:path/src/path_exception.dartWfile:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/path_map.dart†// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import '../path.dart' as p; /// A map whose keys are paths, compared using [p.equals] and [p.hash]. class PathMap extends MapView { /// Creates an empty [PathMap] whose keys are compared using `context.equals` /// and `context.hash`. /// /// The [context] defaults to the current path context. PathMap({p.Context? context}) : super(_create(context)); /// Creates a [PathMap] with the same keys and values as [other] whose keys /// are compared using `context.equals` and `context.hash`. /// /// The [context] defaults to the current path context. If multiple keys in /// [other] represent the same logical path, the last key's value will be /// used. PathMap.of(Map other, {p.Context? context}) : super(_create(context)..addAll(other)); /// Creates a map that uses [context] for equality and hashing. static Map _create(p.Context? context) { context ??= p.context; return LinkedHashMap( equals: (path1, path2) { if (path1 == null) return path2 == null; if (path2 == null) return false; return context!.equals(path1, path2); }, hashCode: (path) => path == null ? 0 : context!.hash(path), isValidKey: (path) => path is String || path == null); } } (NN<H/P:;N>NL 90B:!3+0 D?package:path/src/path_map.dartWfile:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/path_set.dartŒˆ// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:collection'; import '../path.dart' as p; /// A set containing paths, compared using [p.equals] and [p.hash]. class PathSet extends IterableBase implements Set { /// The set to which we forward implementation methods. final Set _inner; /// Creates an empty [PathSet] whose contents are compared using /// `context.equals` and `context.hash`. /// /// The [context] defaults to the current path context. PathSet({p.Context? context}) : _inner = _create(context); /// Creates a [PathSet] with the same contents as [other] whose elements are /// compared using `context.equals` and `context.hash`. /// /// The [context] defaults to the current path context. If multiple elements /// in [other] represent the same logical path, the first value will be /// used. PathSet.of(Iterable other, {p.Context? context}) : _inner = _create(context)..addAll(other); /// Creates a set that uses [context] for equality and hashing. static Set _create(p.Context? context) { context ??= p.context; return LinkedHashSet( equals: (path1, path2) { if (path1 == null) return path2 == null; if (path2 == null) return false; return context!.equals(path1, path2); }, hashCode: (path) => path == null ? 0 : context!.hash(path), isValidKey: (path) => path is String || path == null); } // Normally we'd use DelegatingSetView from the collection package to // implement these, but we want to avoid adding dependencies from path because // it's so widely used that even brief version skew can be very painful. @override Iterator get iterator => _inner.iterator; @override int get length => _inner.length; @override bool add(String? value) => _inner.add(value); @override void addAll(Iterable elements) => _inner.addAll(elements); @override Set cast() => _inner.cast(); @override void clear() => _inner.clear(); @override bool contains(Object? element) => _inner.contains(element); @override bool containsAll(Iterable other) => _inner.containsAll(other); @override Set difference(Set other) => _inner.difference(other); @override Set intersection(Set other) => _inner.intersection(other); @override String? lookup(Object? element) => _inner.lookup(element); @override bool remove(Object? value) => _inner.remove(value); @override void removeAll(Iterable elements) => _inner.removeAll(elements); @override void removeWhere(bool Function(String?) test) => _inner.removeWhere(test); @override void retainAll(Iterable elements) => _inner.retainAll(elements); @override void retainWhere(bool Function(String?) test) => _inner.retainWhere(test); @override Set union(Set other) => _inner.union(other); @override Set toSet() => _inner.toSet(); } eNN<DF:C+:=O:OJ ;2B4!3+0 D?HQK 5 # 0 F ( " > J K O = 6 L M L M A *package:path/src/path_set.dartTfile:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/style.dartŒO// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'context.dart'; import 'style/posix.dart'; import 'style/url.dart'; import 'style/windows.dart'; /// An enum type describing a "flavor" of path. abstract class Style { /// POSIX-style paths use "/" (forward slash) as separators. Absolute paths /// start with "/". Used by UNIX, Linux, Mac OS X, and others. static final Style posix = PosixStyle(); /// Windows paths use `\` (backslash) as separators. Absolute paths start with /// a drive letter followed by a colon (example, `C:`) or two backslashes /// (`\\`) for UNC paths. static final Style windows = WindowsStyle(); /// URLs aren't filesystem paths, but they're supported to make it easier to /// manipulate URL paths in the browser. /// /// URLs use "/" (forward slash) as separators. Absolute paths either start /// with a protocol and optional hostname (e.g. `https://dart.dev`, /// `file://`) or with "/". static final Style url = UrlStyle(); /// The style of the host platform. /// /// When running on the command line, this will be [windows] or [posix] based /// on the host operating system. On a browser, this will be [url]. static final Style platform = _getPlatformStyle(); /// Gets the type of the host platform. static Style _getPlatformStyle() { // If we're running a Dart file in the browser from a `file:` URI, // [Uri.base] will point to a file. If we're running on the standalone, // it will point to a directory. We can use that fact to determine which // style to use. if (Uri.base.scheme != 'file') return Style.url; if (!Uri.base.path.endsWith('/')) return Style.url; if (Uri(path: 'a/b').toFilePath() == 'a\\b') return Style.windows; return Style.posix; } /// The name of this path style. Will be "posix" or "windows". String get name; /// A [Context] that uses this style. Context get context => Context(style: this); @Deprecated('Most Style members will be removed in path 2.0.') String get separator; @Deprecated('Most Style members will be removed in path 2.0.') Pattern get separatorPattern; @Deprecated('Most Style members will be removed in path 2.0.') Pattern get needsSeparatorPattern; @Deprecated('Most Style members will be removed in path 2.0.') Pattern get rootPattern; @Deprecated('Most Style members will be removed in path 2.0.') Pattern? get relativeRootPattern; @Deprecated('Most style members will be removed in path 2.0.') String? getRoot(String path); @Deprecated('Most style members will be removed in path 2.0.') String? getRelativeRoot(String path); @Deprecated('Most style members will be removed in path 2.0.') String pathFromUri(Uri uri); @Deprecated('Most style members will be removed in path 2.0.') Uri relativePathToUri(String path); @Deprecated('Most style members will be removed in path 2.0.') Uri absolutePathToUri(String path); @override String toString() => name; } WNN<0NA+QL/O+NF'&PF5*%GLM58GA(/AA A%AA$A A(AA&A& package:path/src/style.dartógZfile:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/style/posix.dartˆo// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import '../characters.dart' as chars; import '../internal_style.dart'; import '../parsed_path.dart'; /// The style for POSIX paths. class PosixStyle extends InternalStyle { PosixStyle(); @override final name = 'posix'; @override final separator = '/'; final separators = const ['/']; // Deprecated properties. @override final separatorPattern = RegExp(r'/'); @override final needsSeparatorPattern = RegExp(r'[^/]$'); @override final rootPattern = RegExp(r'^/'); @override final relativeRootPattern = null; @override bool containsSeparator(String path) => path.contains('/'); @override bool isSeparator(int codeUnit) => codeUnit == chars.slash; @override bool needsSeparator(String path) => path.isNotEmpty && !isSeparator(path.codeUnitAt(path.length - 1)); @override int rootLength(String path, {bool withDrive = false}) { if (path.isNotEmpty && isSeparator(path.codeUnitAt(0))) return 1; return 0; } @override bool isRootRelative(String path) => false; @override String? getRelativeRoot(String path) => null; @override String pathFromUri(Uri uri) { if (uri.scheme == '' || uri.scheme == 'file') { return Uri.decodeComponent(uri.path); } throw ArgumentError("Uri $uri must have scheme 'file:'."); } @override Uri absolutePathToUri(String path) { final parsed = ParsedPath.parse(path, this); if (parsed.parts.isEmpty) { // If the path is a bare root (e.g. "/"), [components] will // currently be empty. We add two empty components so the URL constructor // produces "file:///", with a trailing slash. parsed.parts.addAll(['', '']); } else if (parsed.hasTrailingSeparator) { // If the path has a trailing slash, add a single empty component so the // URI has a trailing slash as well. parsed.parts.add(''); } return Uri(scheme: 'file', pathSegments: parsed.parts); } } NNN<&!)  " ) 2 % $ = = &I :F - 0 4,? '1 BP5%.O+<!package:path/src/style/posix.dartXfile:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/style/url.dartŠò// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import '../characters.dart' as chars; import '../internal_style.dart'; import '../utils.dart'; /// The style for URL paths. class UrlStyle extends InternalStyle { UrlStyle(); @override final name = 'url'; @override final separator = '/'; final separators = const ['/']; // Deprecated properties. @override final separatorPattern = RegExp(r'/'); @override final needsSeparatorPattern = RegExp(r'(^[a-zA-Z][-+.a-zA-Z\d]*://|[^/])$'); @override final rootPattern = RegExp(r'[a-zA-Z][-+.a-zA-Z\d]*://[^/]*'); @override final relativeRootPattern = RegExp(r'^/'); @override bool containsSeparator(String path) => path.contains('/'); @override bool isSeparator(int codeUnit) => codeUnit == chars.slash; @override bool needsSeparator(String path) { if (path.isEmpty) return false; // A URL that doesn't end in "/" always needs a separator. if (!isSeparator(path.codeUnitAt(path.length - 1))) return true; // A URI that's just "scheme://" needs an extra separator, despite ending // with "/". return path.endsWith('://') && rootLength(path) == path.length; } @override int rootLength(String path, {bool withDrive = false}) { if (path.isEmpty) return 0; if (isSeparator(path.codeUnitAt(0))) return 1; for (var i = 0; i < path.length; i++) { final codeUnit = path.codeUnitAt(i); if (isSeparator(codeUnit)) return 0; if (codeUnit == chars.colon) { if (i == 0) return 0; // The root part is up until the next '/', or the full path. Skip ':' // (and '//' if it exists) and search for '/' after that. if (path.startsWith('//', i + 1)) i += 3; final index = path.indexOf('/', i); if (index <= 0) return path.length; // file: URLs sometimes consider Windows drive letters part of the root. // See https://url.spec.whatwg.org/#file-slash-state. if (!withDrive || path.length < index + 3) return index; if (!path.startsWith('file://')) return index; if (!isDriveLetter(path, index + 1)) return index; return path.length == index + 3 ? index + 3 : index + 4; } } return 0; } @override bool isRootRelative(String path) => path.isNotEmpty && isSeparator(path.codeUnitAt(0)); @override String? getRelativeRoot(String path) => isRootRelative(path) ? '/' : null; @override String pathFromUri(Uri uri) => uri.toString(); @override Uri relativePathToUri(String path) => Uri.parse(path); @override Uri absolutePathToUri(String path) => Uri.parse(path); } ]NN<&!'  " ) O A - = = %$?END : 3,++%NB2,,Q>A7;A &: M 1 9 9package:path/src/style/url.dart\file:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/style/windows.dart˜q// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import '../characters.dart' as chars; import '../internal_style.dart'; import '../parsed_path.dart'; import '../utils.dart'; // `0b100000` can be bitwise-ORed with uppercase ASCII letters to get their // lowercase equivalents. const _asciiCaseBit = 0x20; /// The style for Windows paths. class WindowsStyle extends InternalStyle { WindowsStyle(); @override final name = 'windows'; @override final separator = '\\'; final separators = const ['/', '\\']; // Deprecated properties. @override final separatorPattern = RegExp(r'[/\\]'); @override final needsSeparatorPattern = RegExp(r'[^/\\]$'); @override final rootPattern = RegExp(r'^(\\\\[^\\]+\\[^\\/]+|[a-zA-Z]:[/\\])'); @override final relativeRootPattern = RegExp(r'^[/\\](?![/\\])'); @override bool containsSeparator(String path) => path.contains('/'); @override bool isSeparator(int codeUnit) => codeUnit == chars.slash || codeUnit == chars.backslash; @override bool needsSeparator(String path) { if (path.isEmpty) return false; return !isSeparator(path.codeUnitAt(path.length - 1)); } @override int rootLength(String path, {bool withDrive = false}) { if (path.isEmpty) return 0; if (path.codeUnitAt(0) == chars.slash) return 1; if (path.codeUnitAt(0) == chars.backslash) { if (path.length < 2 || path.codeUnitAt(1) != chars.backslash) return 1; // The path is a network share. Search for up to two '\'s, as they are // the server and share - and part of the root part. var index = path.indexOf('\\', 2); if (index > 0) { index = path.indexOf('\\', index + 1); if (index > 0) return index; } return path.length; } // If the path is of the form 'C:/' or 'C:\', with C being any letter, it's // a root part. if (path.length < 3) return 0; // Check for the letter. if (!isAlphabetic(path.codeUnitAt(0))) return 0; // Check for the ':'. if (path.codeUnitAt(1) != chars.colon) return 0; // Check for either '/' or '\'. if (!isSeparator(path.codeUnitAt(2))) return 0; return 3; } @override bool isRootRelative(String path) => rootLength(path) == 1; @override String? getRelativeRoot(String path) { final length = rootLength(path); if (length == 1) return path[0]; return null; } @override String pathFromUri(Uri uri) { if (uri.scheme != '' && uri.scheme != 'file') { throw ArgumentError("Uri $uri must have scheme 'file:'."); } var path = uri.path; if (uri.host == '') { // Drive-letter paths look like "file:///C:/path/to/file". The // replaceFirst removes the extra initial slash. Otherwise, leave the // slash to match IE's interpretation of "/foo" as a root-relative path. if (path.length >= 3 && path.startsWith('/') && isDriveLetter(path, 1)) { path = path.replaceFirst('/', ''); } } else { // Network paths look like "file://hostname/path/to/file". path = '\\\\${uri.host}$path'; } return Uri.decodeComponent(path.replaceAll('/', '\\')); } @override Uri absolutePathToUri(String path) { final parsed = ParsedPath.parse(path, this); if (parsed.root!.startsWith(r'\\')) { // Network paths become "file://server/share/path/to/file". // The root is of the form "\\server\share". We want "server" to be the // URI host, and "share" to be the first element of the path. final rootParts = parsed.root!.split('\\').where((part) => part != ''); parsed.parts.insert(0, rootParts.last); if (parsed.hasTrailingSeparator) { // If the path has a trailing slash, add a single empty component so the // URI has a trailing slash as well. parsed.parts.add(''); } return Uri( scheme: 'file', host: rootParts.first, pathSegments: parsed.parts); } else { // Drive-letter paths become "file:///C:/path/to/file". // If the path is a bare root (e.g. "C:\"), [parsed.parts] will currently // be empty. We add an empty component so the URL constructor produces // "file:///C:/", with a trailing slash. We also add an empty component if // the URL otherwise has a trailing slash. if (parsed.parts.isEmpty || parsed.hasTrailingSeparator) { parsed.parts.add(''); } // Get rid of the trailing "\" in "C:\" because the URI constructor will // add a separator on its own. parsed.parts .insert(0, parsed.root!.replaceAll('/', '').replaceAll('\\', '')); return Uri(scheme: 'file', pathSegments: parsed.parts); } } @override bool codeUnitsEqual(int codeUnit1, int codeUnit2) { if (codeUnit1 == codeUnit2) return true; /// Forward slashes and backslashes are equivalent on Windows. if (codeUnit1 == chars.slash) return codeUnit2 == chars.backslash; if (codeUnit1 == chars.backslash) return codeUnit2 == chars.slash; // If this check fails, the code units are definitely different. If it // succeeds *and* either codeUnit is an ASCII letter, they're equivalent. if (codeUnit1 ^ codeUnit2 != _asciiCaseBit) return false; // Now we just need to verify that one of the code units is an ASCII letter. final upperCase1 = codeUnit1 | _asciiCaseBit; return upperCase1 >= chars.lowerA && upperCase1 <= chars.lowerZ; } @override bool pathsEqual(String path1, String path2) { if (identical(path1, path2)) return true; if (path1.length != path2.length) return false; for (var i = 0; i < path1.length; i++) { if (!codeUnitsEqual(path1.codeUnitAt(i), path2.codeUnitAt(i))) { return false; } } return true; } @override int canonicalizeCodeUnit(int codeUnit) { if (codeUnit == chars.slash) return chars.backslash; if (codeUnit < chars.upperA) return codeUnit; if (codeUnit > chars.upperZ) return codeUnit; return codeUnit | _asciiCaseBit; } @override String canonicalizePart(String part) => part.toLowerCase(); } €ºNN<&!L!+  ( - 4 H : = $> %$; : 51NM;)/%P#55$4 = )%% 4AELOP+ A%< '1*BNDN.)Q-N >PMQ1AO%M> 6-CGGKN>Q2E 0.4-G +922% >#package:path/src/style/windows.dartTfile:///github/home/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/src/utils.dartƒ÷// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'characters.dart' as chars; /// Returns whether [char] is the code for an ASCII letter (uppercase or /// lowercase). bool isAlphabetic(int char) => (char >= chars.upperA && char <= chars.upperZ) || (char >= chars.lowerA && char <= chars.lowerZ); /// Returns whether [char] is the code for an ASCII digit. bool isNumeric(int char) => char >= chars.zero && char <= chars.nine; /// Returns whether [path] has a URL-formatted Windows drive letter beginning at /// [index]. bool isDriveLetter(String path, int index) { if (path.length < index + 2) return false; if (!isAlphabetic(path.codeUnitAt(index))) return false; if (path.codeUnitAt(index + 1) != chars.colon) return false; if (path.length == index + 2) return true; return path.codeUnitAt(index + 2) == chars.slash; } NN<#I64;FQ --;?-4package:path/src/utils.dart¹SQè¯5½!ØÚ‚á)î‘û°îº*k)”7+7-7.7/70797:7A7Z7a7z7\€²tz€³tz€µtz€´tz)io*io+io,ioô-âö .âö"`I$`I$&7  "%(+14:=CFLOUX^agjpuwz‚…–˜ )ö/0/ 1 /2 !"#%&'()+-./02589:;<=3)0*>*?*@*A*B*C*D*E*F*G*H*I472884:€¶:€¸7M=0>>4@> >=5D=2FF F!F"F#F%F&F'F(F)F+F-F.F/F4UmU€‚U€ˆU€–U€œURF0F2F5F8F9F:F;F0€°X  2iv^Y( €¤€¥€¦6$?&0'?($&*0+€°++X+++ + *23i3v3^3Y3(3 3€¤3€¦3€3|3€Ÿ3€Í*6@@B2C%C'C(AGBGCH0JDGEGFGGH2OHM2QHO O OGII0WGJY2ZI2\\HZH\AaKGLGMNM6fGOh6iGPk5lAmQc0oUd0qd2sWZ[mRc2w\GSy6zGTwaoc|2d|0 y2ƒ seƒfƒgWhwjslWoZsZtsohs}GU‘5’Vso€€s€Z€‰GW\€Š\€‹e2›XV2€¡Z€¢€£\tJ€¨O€Ði€ðw€¾w€¿w)GY¨5©llV\€Ö\€×Z€ÞGZ°6±€ðs€àw€ám[d5¶1\¸]¹6ºG^¼2½€ê¸_¿5À¸`GaÂ6ÄÃ2Æ€ê¸bÈ5ÉÃ0ËccÍdÎ0ÏƀƀàÆfÆ€óÆ€õÆ€öÆ€÷Æ€øÆ€ùÆ€úÆ€ûÆ€ýÆ€þÆ€ÿÆJ\GeGfã5ä\€óOgs€êWU\J\\-o!#G2ðhâ6òGiâ0õ€¼j")8@GJQRZ^hqwxz{|€…€Ž€–€›€ €¥€ª€¯€´€¹€Á€Ù€à€é€î€ø #*/4@IQU]chnsx|Œ˜Ÿ¤­±¶¼ÁÅÉÎÔÚàæïóôù‚‚ ‚ ‚6‚>‚D‚J‚b‚i‚m‚w‚‚‹‚”‚•‚ž‚¤‚²‚΂à‚å‚é‚ñ‚ù‚üƒƒƒƒ!ƒ'ƒ/ƒ5ƒHƒMƒVƒfƒnƒoƒpƒqƒyƒ„ƒžƒ¦ƒ¨ƒ²ƒ¼ƒÆƒÎƒÐƒÙƒÝƒàƒñ„„„#„7„=„R„T„^„h„x„‡„•„¢„°„¼„τڄä„ò……………"…-…6…?…K…_…c…d…e…f…q…‚…“…›…¡…¥…¨…¶…¿…Å…Ð…Ù…Ý…ê…ð…õ…þ† ††2†B†H†L†S†Z†[†_†b†e†i†j†l†t†ˆ†‘†ž†¥†­†¹†Â†Ë†Û†å†ô†ù†ý‡‡‡$‡,‡7‡A‡H‡W‡`‡a‡f‡~‡€‡¤‡¨‡±‡·‡¾‡Ë‡Ú‡á‡â‡ä‡é‡ï‡ö‡þˆˆˆˆˆ"ˆ#ˆ+ˆ2ˆ=ˆGˆSˆYˆ_ˆhˆsˆwˆ€ˆ‹ˆˆ•ˆšˆ¢ˆ³ˆ»ˆ¾ˆÁˆÑˆæˆñ‰‰‰‰"‰$‰(‰B‰J‰l‰Š‰‰‰–‰‰©‰®‰µ‰Ú‰é‰í‰ù‰ûŠŠ ŠŠŠ!Š-Š1Š:ŠGŠQŠXŠbŠnŠŠÌŠâŠêŠòŠú‹‹7‹A‹N‹r‹“‹·‹Õ‹óŒŒ/ŒNŒqŒŒŒ•Œ˜ŒžŒ¢Œ«Œ±ŒµŒ·ŒºŒ½ŒÁŒÉŒÍŒÖŒãŒðŒù!(+/9BQX[htw„’©³¹ÈÑÚcreateInternalposixstylewindowsurlcontext_currentUriBase_currentcurrenturiresolve.toStringpathtoFilePathlastIndexlength-[]/\substringseparatorabsolutepart1part2part3part4part5part6part7basenamebasenameWithoutExtensiondirnameextensionlevelrootPrefixisAbsoluteisRelativeisRootRelativejoinpart8joinAllpartssplitcanonicalizenormalizerelativefromisWithinparentchildequalspath1path2hashwithoutExtensionsetExtensionfromUritoUriprettyUriplusminusperiodslashzeroninecolonupperAupperZlowerAlowerZbackslashmathpcharsContext_internal_Only styles defined by the path package are allowed._parseparsedremoveTrailingSeparatorsisEmptyrootremoveLastseparatorsrootLengthwithDrive>whereTypebufferneedsSeparatorisAbsoluteAndNotRootRelative:sync-for-iteratorwherepartiteratormoveNext[]=clearwriteisNotEmptycontainsSeparatortoListgrowableinsert_needsNormalizationstartcodeUnitspreviousPreviouspreviousi<+codeUnitisSeparatorUnable to find a path to "" from "".fromParsedpathParsedpathsEqualremoveAt..insertAlllastadd_isWithinOrEqualsparentIsAbsolutechildIsAbsolutechildIsRootRelativeparentIsRootRelativeresult_isWithinOrEqualsFast>=startsWithcodeUnitAtparentRootLengthchildRootLengthparentCodeUnitchildCodeUnitcodeUnitsEquallastCodeUnitlastParentSeparatorparentIndexchildIndexchildDirection_pathDirectionparentDirectiondirectionindexdepthreachedRoot_hashFastbeginningwasSeparatorcanonicalizeCodeUnitnext&*^pathFromUrirelativePathToUriabsolutePathToUritypedUrischemefilerel_PathDirectionaboveRootatRootreachesRootbelowRootname_PathRelationwithinequaldifferentinconclusive_parseUriValue must be a String or a Uri_validateArgListmethodargsnumArgsmessage(takemapargnull", ): part was null, but part was not.InternalStylegetRootsegmentspathSegmentscodeUnit1codeUnit2canonicalizePartParsedPath_splitExtensionparsecopyclonehasTrailingSeparatorleadingDoublesnewPartstoLowerCasereplaceAllbuilder_kthLastIndexOfcharacterkcountleftMostIndexedCharacter<=level's value must be greater than 0castlastWhereorElselastDotPathExceptionPathException: PathMapVofotheraddAll_createhashCodeisValidKeyPathSet_innervalueelementsTcontainselementcontainsAlldifferenceintersectionlookupremoveremoveAllremoveWheretestretainAllretainWhereuniontoSetStyleplatform_getPlatformStyleendsWitha/ba\bseparatorPatternneedsSeparatorPatternrootPatternrelativeRootPatterngetRelativeRootPosixStyle[^/]$^/Uri must have scheme 'file:'.UrlStyle(^[a-zA-Z][-+.a-zA-Z\d]*://|[^/])$[a-zA-Z][-+.a-zA-Z\d]*://[^/]*:////indexOffile://WindowsStyle[/\\][^/\\]$^(\\\\[^\\]+\\[^\\/]+|[a-zA-Z]:[/\\])^[/\\](?![/\\])hostreplaceFirst\\rootPartsfirstupperCase1|_asciiCaseBitisAlphabeticcharisNumericisDriveLetterbelow rootat rootabove rootreaches rootMost Style members will be removed in path 2.0.Most style members will be removed in path 2.0.package:path/path.dart@getters@setters@methodspackage:path/src/characters.dartpackage:path/src/context.dart@factories@constructorspackage:path/src/internal_style.dartpackage:path/src/parsed_path.dartpackage:path/src/path_exception.dartpackage:path/src/path_map.dartpackage:path/src/path_set.dartpackage:path/src/style.dartpackage:path/src/style/posix.dartpackage:path/src/style/url.dartpackage:path/src/style/windows.dartpackage:path/src/utils.dartdart:coreUriStringbaseExceptionObjectbool==intnumNullIterableListdart:mathArgumentError_GrowableList_literal7_literal8StringBufferIterator_ListfilledPatternmax_UriRangeError_literal2dart:collectionMapViewMapLinkedHashMapIterableBaseSetLinkedHashSetdart:_internalEfficientLengthIterableDeprecatedRegExpdecodeComponentidentical_Override¹O/%/È0p6ø6ø6üG– e·d[iý•€‚ƒÃ“°™ø£ µÜ¹O H«ÍïE0000000000 „€¿œ€ÀÌ 7‚=ˆ `€Â‚d‚x€]€Ã`‚v€Æ`“ ‚= `? €È‚¹‚¾ƒ³@‚˃³‚Û`€Ê‚î`€Ìƒ`€Íƒ`€Î\>ƒ%ƒ³=ƒ9€Ñ`€ÌƒF€Â'=xƒnvƒe.]€Ã` ƒr€ƒx€·xƒ‹ƒ€€Â ‚ƒ”€Ía`€Í`€Ò€Ôƒƒ£€Øa`\€Ö……†@ …†…'`€Ø…: `€Ø…I `€Ùj`€Û\>…X†=#…k‚…^Š…^#%…v€…ov`€‘v……‰v`€‘ `€Ù€“*`€Ù+`€ÙN…¯…´`€Î#…¶`€Ùv…Ì€…Åv`€Î€Ý+`€Î=x…æv…Ý.]€Ã` …êv…÷€…ðv`€Ê€Þv†…þ`€Ê€Þƒ† éa`\€Ö †M†R†à@†]†à†t`€Ê†‹ `€Ê†›`€Î\>†§†à=x†¶v†­.]€Ã` †º€†À‚‡†È‚’‚†Ð‚a`\€Ö ‡%‡)‡…@‡.‡…‡6`€Î]€ß[[>‡?‡…J‡Ex‡y‡ZMv‡f.]€Ã`€‡pƒ ^`€Ù]€ß[[O ‡Í‡Ôˆ@‡Úˆ‡â`€Î`€ÎJ‡î‡î€áx‡ù.€‡ÿƒa`€Î]€ß[[ \mïgÀˆ5ˆ;Œ<`€Â]€â`ˆºˆÀ€`€Ê‰‰%€ `€Ê‰„‰’€`€Î‰Ñ‰ÑŠ‰ÖŠ‰Ü`€Ê‰é `€Ê‰ö`€Î`?€„E„P‚„[ ‰Ñ€È‹‹$Œ:@j‹`€Â‹-Œ:‹4``€Í>‹;Œ:N‹E‹I`€Íx‹Rv‹K. `€Êv‹b€‹\„° `€Êa`€Ê`€Í€äI‹o!‹w‹s„È“a`€Â`€Ù€çJ‹}‹„„È?=‰‹„Èx‹Áx‹­v‹šv‹“.`€Ê`€è€êa`€Î€ìx‹âv‹Øv‹Ñ€‹Ë„°`€Ê`€è€êa`€Î€ìa`€Î`€Í€îI‹ó!‹û‹÷„È“a`€Â`€Ù€çJŒŒ„È?JŒxŒvŒ.`€ÊvŒ/€Œ)„°`€Êa`€Ê`€Í€äŽ?Ý ;€¿S€Àƒ¥€È€®á€±Œ{ŒŠŽý`€Â"ŒŠ `? €ÈžðB ¥ðª!`€Í´"`€ÍÜ#]€ß`€Î`€Ìj`€Ûë$`€Îj`€Û`€‘ Ž(Ž7Žû@%ŽFŽûŽV `€ÊŽ€#]€ß`€Î`€Ìj`€Û`€‘>ŽˆŽûJŽŽxŽ•. vަ€Ž‡&!`€Í€ïv޵€Ž¬‡&"`€Í€ð$5ŽÓŽÓ`€èvŽÓ€ŽÊ‡&`€è€ê#ŽÓ‚ŽÓ‡Ž+xŽÞŽÓ‡Ž`€èa`€Î€ò`€Î#Žñ‡2^`€Í`€Í#]€ß`€Î`€Ì$`€Î`€‘¨  #*0šY&`&—«€']€Ã`€Í©€Æ`€Í“'ñ€(]€Ã`€Í€Æ`€Í“(„—€)]€Ã`•€Æ`“/ÇÇ–K*ã–Ké+]€Ã[‘,]€ß`€Î]€ß[[‘.-`€Âj`€Û`#>‘7–K>N‘Q.]€ó[v‘Q€‘Qˆ³/]€ó[€öEx‘Qƒˆú0a`€Ù€ø>N‘F1[v‘[ƒˆú2[€ú>‘[•å N‘g‘n3[|‘w„‘p‰<4'3I‘‰‘”…‘‰X=0‘‘£€ý'5?N‘Ù‘Þ![|‘ñ|‘ç„‘à‰<4'34'!I’’ †’‰=0’’€ý'6?N’L’S"[|’f|’\„’U‰<4'34'"I’x’ƒ‡’|‰Í=0’Œ’’€ý'7?=x’Îv’Ã.']€Ã`€Í& &’Ò †’Ò‰`€Ía`€Í\€Ö=x’ìv’ß.(]€Ã`€Í' &’ð ‡’ð‰Í`€Ía`€Í\€ÖN““8[|“„“ ‰<4'8N“$“(9[|“1„“*‰<4'9I“A"!“I“EŠw!“X“TŠ‘ >“a“¶=0“k“q€ý':I“½!“Å“ÁŠw>“Ε*N“Ü“â]€ß[[5“ä“ä]€ß`€Î]€ß[[“äˆÀ#“ä“ä‹ +x“î“î‹ ]€ß`€Î]€ß[[4“ïŠwa`€Â]€ß[[€ÿ]€ß[[I“ý"” ”ˆÀ””Šï >”%”Ú=0”1”7€ý$”F';”sŠw'<'=?=x”êv”ä.)]€Ã`( ”î”øŠï ]€ß[[,• ˆÀ]€ß`€Î]€ß[[-•Šwa`\€ÖI•1!•9•5Š‘ >•B•“=x•Rv•L.)]€Ã`( •V&•` •`Š‘ ]€ß[[,•pˆÀ-‚•ƒˆØa`\€Ö>•š•ß=0•¤•ª€ý'>I•ëv•úv•ï.']€Ã`€Í&?`€Ù>––G=0– –€ý'@? Ç"+–P–T—K@A–]—K–b!`€Í–l"`€Í`€Í>–t—KE–z–ƒ–…B`€Í“x–Œ‚–ŠŒûCv–™v–Ž.']€Ã`€Í&D`€Ía`€å`€ÙŠ–¡Œûx–¢‚–¡ŒûE”a`€å`€Í>–¦—%I–®x–·€–²ŒÔCx–Ãv–¹.']€Ã`€Í&4‚–ÄŒûa`€Í`€Ía`€å`€ÙJ–Èx–Ñ‚–ÏŒûF”a`€å`€Í?I–Ü"–倖àŒÔx–òv–è.']€Ã`€Í&4‚–óŒûa`€Í`€Ía`€Â`€Ù€çx—–ùŒßCx—v—.(]€Ã`€Í'4‚—Œûa`€Í`€Ía`€å`€ÙJ—x—‚—ŒûF”a`€å`€Í?J—+x—Dv—=v—2.']€Ã`€Í&D`€ÍF”a`€å`€Í,—P—k˜Ü@ j—Q`€Â—r˜Ü—w!`€Í—"`€Í—©#]€ß`€Î`€Ìj`€Û—¸$`€Îj`€Û`€‘>—¾˜ÜN˜A˜GG`€Íx˜I.A€˜SŽö˜Ya`€Í`€Í`€Í+J˜fx˜zx˜rv˜m.)]€Ã`(4„˜sGa`€Í` x˜€˜‹ŽöFx˜œv˜’.']€Ã`€Í&4„˜Ga`€Í`€Ía`€å`€Íx˜¬˜¥Fx˜ºv˜®.(]€Ã`€Í'4„˜»Ga`€Í`€Ía`€å`€Í#‚˜Ò ^`€Í`€Í#]€ß`€Î`€Ì$`€Î`€‘-˜á˜ôšW@j˜â`€Â˜üšW`€Î>˜ÿšWN™ ™H`™ $™/v™.I` 'JE™6™?™AB`€Í“x™H™FÚCv™Uv™J.']€Ã`€Í&D`€Ía`€å`€Ù‰™]Úx™^™]ÚE”a`€å`€Í>™bš"=5™j™j`€™j®R=x™y‚™j‘QK'La`€Â\=x™Ž‚™j‘QKx™žv™”.']€Ã`€Í&4™ŸÚa`€Í`€Ía`€Â\=x™­‚™j‘QK'Ma`€Â\=x™Â‚™j‘QKx™Ôv™È.(]€Ã`€Í'4™ÕÚa`€Í`€Ía`€Â\=x™ã‚™j‘QK'Na`€Â\=x™ø‚™j‘QKxšv™þ.)]€Ã`(4šÚa`€Í`a`€Â\=xš‚™j‘QK'Oa`€Â\‚™j‘Q=xš-€š(®K'Pa`€Â\Jš=xšI€šD®a`€Î ¹Ô~ò0š\šb¦"Q`3š¥š³€R]€ß`€Î`=2š±`€Î`=;š¸š¸šÇšÅšÇ`0? š¸"<šÌšÌ›x*šâ›xšèS]€Ã[›-`€Âj`€Û`0>››x>N›%.]€ó[v›%€›%“€/]€ó[€öEx›%‚“°0a`€Ù€ø>N›9[v›+‚“°2[€ú>›+›t=x›3.T&›]›>&›H ƒ›H“ò]€ß[[-›U“Ž`=a`=\5 šÌ"5›}›‚œÚ@T›ŒœÚ››U`=\>›¤œÚNœSœ]V`€Îœm€Ñ`€Îvœ“€œ‹”lV`€ÎC'W=xœÁvœ¸.R]€ß`€Î`=3XœÂ”€œÏ”la`€Î`=\6R@R]€Ã[J"xJx3v,v".R]€ß`€Î`=3Y]€ô`=9]€ß[[477H8Z`=]€ß[[J>x@€>•S^`€Ù]€ß[[Oaa`=]€ß[[]€ô]€ß[[[^\`€Ù]€Ã]€ß[[7Wjž@jX`€Ârž`€Î>užN„H`† >N´.]€ó`=v´v´vª.R]€ß`€Î`=3Y]€ô`=/]€ó`=€öEx´–0a`€Ù€ø>N£9`=v¼–2`=€ú>¼ä=xɀĖKxÓ‚Ï–ƒa`€ÎVa`€Â\Jêxö€ñ–a`€Î8ž žžG@]žžGž%8`€Î`€ÙJž-xž7vž-.R]€ß`€Î`=3^€žC— a`€Â`€Ù9žLžg¦ @ jžM`€Âžn¦ žs!`€Íž}"`€Íž¥#]€ß`€Î`€Ìj`€Ûž´$`€Îj`€Û`€‘>žº¦ =‹Ÿ —¨Ÿ€Ñ`€ÎƒŸ4—¨'$N¢¢_`€Ù)N¢ ¢3`]€Ã`€Í¢5`€Íx¢:'ab“a`€Í`€Íx¢M'Nb“a`€Í`€ÍE¢a¢j¢lB`€Í“x¢s†¢q˜GCv¢y¢u—¨`€ÎD`€Ía`€å`€ÙŽ¢ƒ˜Gx¢†¢ƒ˜GE”a`€å`€Í>¢†£åI¢Ž„¢’—á>¢ž£œN¢¬¢¶c`€Îx¢¼¢¸—¨`€Îd†¢Æ˜G^`€Í`€Í`€ÎN¢Ö¢çe`=x¢òv¢é.R]€ß`€Î`=34‡¢ó˜Âa`€Â`=€ÿI£!££ ™>£%£”J£1x£I£8™`= €£Q—v£W—#‚£t—$‡£€˜Â^`€Í`€Í#]€ß`€Î`€Ì$`€Î`€‘U??=Œ£¤—áx£Ä…£±—ïfx£Ñ£Í—¨`€Îb†£Ü˜Ga`€Í`€Ía`€Â`€ÙN¥`¥g3`€Íx¥xx¥n€¥i—vg7ÀB@a`€å`€ÍE¥z—a`€å`€ÍN¥Š¥“ `€Ê¥• †¥¤™÷!€¥º—v"¥È—¥ß!¥å—¨`€ÎJ¥ð¥÷€•‡¦šC‡¦šC'RäÓòT—=¦R¦XÀU=h`?¦Ã¦Ç€i]€Ã`€Î@§§€j]€Ã`€ÎA¨þ©€#]€Ã`€ÌB©Y©^€k]€Ã`[CJ©‰©’€€V`€ÎDK©Õ©ß€€l`€ÎF©ï©ö€m`€èGªª €n]€ß`€Î[Yª%ª%ª£oª4ª£ª:V`€ÎªJ#]€Ã`€ÌªVi]€Ã`€Îªaj]€Ã`€Îªmk]€Ã`[`=? D+C€›…A›?‚› @ƒ›°B„›ÀF+G2ª¡`€Î[ ª%"Z±Û±Û¾h*±ñ¾h±ö9]€ß[[±ü-[j`€Û`=>³o¾h N³y³ˆp]€Ã`€Î#³ x³€³Šœ.4'pa`€Â[€ÿj³²]€Ã`€Î³Î#`€Î&³ä x³ä€³áœ.4'pa`€Â[€ÿ]€ô[]€Ã`€ÎE³ý´´B`€Í“"x´ƒ´ œ×Cv´v´.i]€Ã`€Î?D`€Ía`€å`€Ùx´"ƒ´ œ×Cv´3‚´$œXD`€Ía`€å`€Ù‹´;œ×x´<ƒ´;œ×E”a`€å`€ÍA>´@´ÎN´L´S`€Îx´c‚´UœX4ƒ´dœ×a`€Í`€ÎI´n´y„´r{B´‚?=x´—v´’.#]€Ã`€ÌAXƒ´˜œ×´¨%´³{`€Î8x´Äv´À.i]€Ã`€Î?4ƒ´Åœ×a`€Í`€Îa`€Í`€Ì\&N´Ù´Þ!`€Í“N´ë´ò"`€Í“N´ÿµq`€Í“Nµµr`€Í“Nµ*µ4s`€Í“NµAµKt`€Í“NµXµbu`pµd€ƒ&µy xµy€µvœ.4'va`€Â[€ÿ`€ÎNµµ˜w]€Ã`eµ§€Æ`e“Cµ°vµÁµ·ž x`€ÙwA>µÌ½«IµÔvµëvµâµØž y`€„xz`€Ù€Š>µö¶ßI¶v¶ ¶žº {`€Ù'>¶¶|=x¶*v¶$.k]€Ã`[B ¶.dƒ¶>ž-¶Džº a`[\€Ö=¶Yžº ¶p€Æ`e“?=‹¶†ž-x¶Šƒ¶†ž-E”a`€å`€Í=Œ¶–ž;“=x¶´¶ªž |a\B¶Ï?I¹)v¹@v¹7¹-ž y`€„x}`€Ù€‹=0¹Nx¹T.~“ƒ¹ež-a`€Í`€Í`(R?=Œ¹rž;x¹y„¹rž;Ex¹†¹|ž a`€Í~a`€å`€ÍI¹!v¹µv¹¬¹¢ž y`€„x€€`€Ù€>¹¾¹ð=x¹Ð¹Èžº ¹Ôo„¹àž;a`e\€Ö>¹÷½Z=ºžIxº …ºžIExºº ž a`€Í~a`€å`€ÍIº0xº=…º4žI€vºEvº@.i]€Ã`€Î?D`€Ía`€å`€Ù)>ºMº¹=0ºYº_+$º®'€‚vº’.V`€ÎC'€ƒƒºžž-'€ƒ…º¥žI?IºÃ!vºÛvºÒºÈž y`€„x€€`€Ù€=0ºäxºê.~•ƒºûž-a`€Í`€Í`(R?=Ž» žWx»†» žWEx»»ž a`€Í~a`€å`€ÍI»8!v»Pv»G»=ž y`€„x€€`€Ù€=0»Yx»_.~–ƒ»pž-a`€Í`€Í`(R?=»žex»‰‡»žeEx»–»Œž a`€Í~a`€å`€ÍI»¯!v»Çv»¾»´ž y`€„x€€`€Ù€>»Ð¼$=x»ä»Üžº »èo„»ôž;…»üžI†¼žW‡¼žea`e\€Ö>¼+½R=¼7žsx¼A¼7žsEx¼N¼Dž a`€Í~a`€å`€ÍI¼ix¼w¼mžs€v¼€v¼z.j]€Ã`€Î@D`€Ía`€å`€Ù)>¼ˆ¼ä=0¼–¼œ+$¼×'€„v¼º.V`€ÎC'€ƒƒ¼Æž-'€ƒ¼Ížs?=x¼ø¼ðžº ½ o„½ž;…½žI†½)žW‡½2že½=žsa`e\€ÖI½bv½yv½p½fž y`€„x}`€Ù€‹=x½‘½‡ž €…a\€€?I½±v½½½µžº {`€Ù'>½É¾=x½×v½Ñ.k]€Ã`[B ½Ûdƒ½ëž-½ñžº a`[\€Ö?=x¾ €¾œ.€†4¾¾¾c¾[¾€‡[\>¾!¾bI¾)&¾2 |¾2¾-¤‚ €ˆ'€‰`€Ù=x¾Nv¾D.n]€ß`€Î[GX&¾O ¾O¤‚ `€Î¾W¤Š a`€Î[\?aa[[\\, C&² x²€²œ.4'€Ša`€Â[€ÿ`€Î?²5#`€Î&²J x²J€²Gœ.4'€‹a`€Â[€ÿ]€ô[@²h#`€Î&²‡ 5²‡²}[x²}€²zœ.4'ja`€Â[€ÿ#²}‚²}¥€²Š€Æ[“‚²}¥€[]€ô[A²¤/`€Ì&²º z²ºx²®€²«œ.4'€‹a`€Â[€ÿD`€ÍD&²Ü x²á€²Þœ.4'la`€Â[€ÿ`€ÎB³€Æ`[“F&³& #%³/³(œ=`€Î³?!³Eœ=`€Î³Oœ=[`€èG2³l`€Î[ ±Û" Mª¨ª°±ÖA€ŒªÉ±Öªâw]€ô`ªú`€Îj`€Û`=>«±Ö N«K«Y€]€Ã`5«c«c]€Ã`x«c€«[¦œ[^\`€Ù]€Ã`R=x«m‚«c¦Þ€Ž^a```€Í\0‚«c¦ÞN«}«ƒk]€Ã`[«–€Æ`[“N¬/¬4i]€ß`€Î`€Í2¬C`€Î`€ÍN¬à¬æj]€ß`€Î`€Í2¬õ`€Î`€ÍN­<­B#]€ß`€Í`€Ì2­U`€Í`€ÌN­b€[N­† €]€Ã`e>N­±.]€ó`v­±‚­±¦Ê/]€ó`€öEx­±§ê 0a`€Ù€ø>N­¢€‘`v­À§ê 2`€ú>­À±JI­È"­Ô‡­Ì§Ëx­÷v­òv­ë­ß¨2 `€Ê!`€Í€ï€’&­ù ‡­ù§Ë`€åa`€å`€Ù1>®®š=® §Ëv®)v®"®¨2 `€Ê!`€Í€ï=®7§Õ®T€Æ`e“=x®fƒ®`§G ®jd&®z ‡®z§Ë`€Í®ƒ§Õa`[\€Ö?N®§®±`€èv®Æv®¿®³¨2 `€Ê`€è€êN®Û®á€“`€Íx®è„®ã§e€”#¯ ®ÿ© 'x¯"¯© `€èa`€Î€ò`€Î4¯.¯.¯?`€ÍJ¯4v¯9„¯4§eD`€Í2a`€Îa`€Í`€Í3I¯I%¯`v¯Y¯M¨2 `€Ê`€Ò>¯q¯Ù=x¯†¯{§©€”¯š©F 4¯¡¯¡¯Ð`€ÌJ¯§v¯Ì&¯»v¯´¯¨¨2 `€Ê`€Ò€Š`€Ì5a`€Ía`€Ì`€Ì3?N¯æ°€•`€Îv°°¨2 `€ÎN°(°2t`€Í#°N°4ªe +x°y…°s§‡€”°…ªe `€Î4° ° °²`€ÍJ°¦v°¬…°¦§‡D`€Í2a`€Îa`€Í`€Í3`€Í=x°É°»§Õ °Íov°ìv°å°Ù¨2 `€Ê"`€Í€ð°ô©F v±v±±¨2 `€Ê!`€Í€ïv±1v±*±¨2 `€Ê"`€Í€ð±9ª…a`e\€ÖJ±P±eY±g¦«x±‘x±|v±u„±p§eY]€ô`€Í9`€Ì4±€±€±±B`€Í`€ÌJ±‡x±Œ†±‡§©4±«Î a`€Â`€Ì€ÿaa`€Í`€Ì]€ô`€Ì[^\`€Ù]€Ã`€Ìx±­v±¨„±£§e€–]€ô`€Î6[^\`€Ù]€Ã`€Îx±Âv±½…±·§‡€–]€ô`€Î6[^\`€Ù]€Ã`€Îƒ±Ì§GO¿#¿'ÀEI@¿-ÀEI¿4`€Ùj¿L`€Ù]€ß[[>¿TÀEIN¿^¿cH`¿e N¿}¿‚!`€Í“N¿¿–"`€Í“N¿£¿«r`€Í“N¿¸¿Âs`€Í“N¿Ï¿Øq`€Í“N¿å¿ït`€Í“N¿üÀ@€—`€Ù)>NÀ@!.]€ó`[vÀ@!vÀ@!.k]€Ã`[B/]€ó`[€öExÀ@!­ 0a`€Ù€ø>NÀ@€˜`[vÀ@(­ 2`[€ú>À@(ÀCNÀ@4À@=€™`€ÍvÀ@EÀ@?­Ü !`€Í]IÀ@QxÀ@^À@U® €’‚À@`­a`€å`€Ù1>À@fÀAEÀ@pÀ@yÀ@{B`€Í‚À@}­xÀ@…À@ƒ®n CÀ@‡® a`€å`€ÙÀ@“®n xÀ@‘À@“®n E”a`€å`€Í>À@–À@»=xÀ@§À@¢­K'€ša`€Â\=ŠÀ@Å­À@Ì® =‹À@Þ­&“=À@ò­l)?>NÀA).]€ó`evÀA)vÀA)ÀA#­Ü w]€Ã`e^/]€ó`e€öExÀA)¯5 0a`€Ù€ø>NÀA€›`evÀA2¯5 2`e€úA>ÀA2ÀC— IÀAÀD›ÀDò=xÀD©ÀD£± X'pxÀDäxÀDÄvÀD¾.#]€Ã`€ÌA9`€Î4ÀDÈÀDÈÀDâÀDÉ€Š`€Ì`€ÎJÀDÒ5ÀDÒÀDÒ`€ÌÀDÒ²û #ÀDÒÀDÒ³ +xÀDØÀDÒ³ `€Ì€£“^`€Í`€Í`€Î7`€Îaa`€Ì`€Î]€ô`€Î[^\`€Ù]€Ã`€Îa`€Î`€Â\?=xÀEvÀDø.n]€ß`€Î[G€†4ÀE ÀE ÀE0ÀE `€ÎÀE€‡[\JÀE5ÀE"ÀE]€ß`€Î`€ÂÀE± 5ÀE#ÀE#`€ÎÀE#³ø 5ÀE+ÀE+[5[ÀE+´ #´j&ÀE+ ´j`€Â´j`€Â`€Â5ÀE"ÀE"\xÀE"ÀE´ XÀE#´C ÀE+´^a`€Î`€Â\ÀE+´^aa`€Î[\\,JÀE8ÀE?± QÀEÀÀEËÀFNA€¤ÀEÒÀFNÀEàH`ÀEꀥ`€ÍÀEø€¦`€Í`€Í>ÀFÀFN=xÀF €ÀFµ6€§ÀF€½xÀF)‚ÀF µQFÀF+µCa`€å`€Í^]€ô[`€Î\8JÀF;‚ÀFBµQRÀFSÀF^ÀG@~ÀFkÀGÀFp€¨`€ÍÀFz!`€Í`(JÀF‰ÀF‰+$ÀF“'€©'€ª€ÀFã¶'€«vÀFö.V`€ÎC'€¬ÀG¶SÀGÜÀGíÀHs@€­ÀGöÀHsÀGû!`€Í`[>ÀHÀHsNÀH ÀHG`€ÍÀH€°vÀH .k]€Ã`[B4ÀH'ÀH'ÀH;ÀH(€®[`€ÙJÀH.&ÀH5 |ÀH5zÀH0ÀH.¶å!€’€ÀH7¶‡`€ÙJÀHB#xÀHPÀHJ¶¥€¯“a`€å`€Ù9+xÀHdvÀH_.k]€Ã`[B4xÀHkÀHe¶¥F”a`€å`€Ía`€Í`[`[TÀIÊÀI×ÀK8@€°ÀIâÀK8ÀIç!`€ÍÀIñ"`€ÍÀJ €±`[`e>ÀJÀK8IÀJ"ÀJ)‚ÀJ·åvÀJFvÀJ>ÀJ4·å`[w]€Ã`e^?`€ÙJÀJO+?IÀJ`!ÀJsvÀJnÀJd·å`[!`€Í]€ÀJv·Ëa`€Â`€Ù€çJÀJ|vÀJ•vÀJÀJƒ·å`[w]€Ã`e^€²`e:?NÀJ£ÀJ«w]€Ã`evÀJ·ÀJ­·å`[w]€Ã`e^NÀJÈÀJÎG`€ÍÀJЀ°ƒÀJݸ´4ÀJæÀJæÀJþÀJ瀮[`€ÙJÀJí&ÀJö |ÀJözÀJï„ÀJí¹"€’ÀJø·Ø`€ÙJÀK#xÀK„ÀK ¸æ€¯“a`€å`€Ù9+xÀK)ƒÀK"¸´4xÀK0„ÀK*¸æF”a`€å`€Ía`€Í`e`eUÀK=ÀKXÀP@ jÀK>`€ÂÀK_ÀPÀKd!`€ÍÀKn"`€ÍÀK–#]€ß`€Î`€Ìj`€ÛÀK¥$`€Îj`€Û`€‘>ÀK«ÀP NÀKµÀK»€˜`exÀK½.€°€ÀKɹþÀKϺ xÀK×.€­€ÀKá¹þa`€Í`[Sa`€Í`€Í`[`eTIÀKíÀK÷„ÀKñº[JÀL+?NÀLÀL"€`€ÍvÀL*ÀL$º[`e€`€ÍhIÀL;ÀLK…ÀL?º×JÀLT+?NÀLjÀLn8`€ÎxÀLtvÀLp.i]€Ã`€Î?4ÀLuº×`€Ía`€Í`€ÎIÀL‡!ÀL–vÀL‹.l`€ÎD>ÀLŸÀLÈ=ŽÀL§»$ÀLÂvÀL°.l`€ÎD†ÀL½»?NÀLÓÀLà€ `€ÍvÀLèÀLâº[`e€ `€ÍkNÀLþÀM€Š`€Ì5ÀMÀM]€ß`€Î`€Ì‚ÀMº#ÀMÀM»ð+xÀM ÀM »ð]€ß`€Î`€Ì4†ÀM »a`€Â`€Ì€ÿ`€ÌIÀM!ÀMÀM»Ú>ÀM(ÀN…NÀM4ÀM:`€ÍxÀMAÀM<»Ú`€Ì€³uÀM[vÀMQÀMKº[`e€ž`€ÍivÀMdÀM^º[`e€Ÿ`€Íj^`€Í`€Í`€Í;IÀMy!ÀMЇÀM}»®>ÀM“ÀN,NÀM¡ÀM¦`€ÎxÀM­vÀM¨.j]€Ã`€Î@4ÀM®»®`€Ía`€Í`€ÎJÀMÅÀMÌ€­xÀMãÀMÞ»Ú`€Ì€´ÀMè¼x xÀMõÀMï¼x EvÀMüÀM÷½ D`€Ía`€å`€Í^`€Í`€Í`<= )>ÀN3ÀNJÀN=ÀND€­xÀNkxÀN[ÀNV»Ú`€Ì ÀNd¼x a`€Í`€Ò€Ô€µa`ÀNŒÀPNÀN˜ÀNž`€ÊÀN  “5ÀNÝÀNÇ`€è5ÀNÇÀNÇ`€èvÀNÇ.m`€èF#ÀNÇÀNǾ +xÀNÐÀNǾ `€è€¶†ÀNØ»a`€Î`€è@`€è#ÀNÇÀNǾo †ÀNà»ÀNǾo `€è`€Â!vÀNûÀNõº[`e€ž`€Íi"vÀOÀOº[`e€Ÿ`€ÍjIÀOi!ÀOz‡ÀOm»®>ÀOƒÀOÐJÀOÀO¢€–ÀO­¾M xÀO¹vÀO´.j]€Ã`€Î@4ÀOº»®`€Ía`€Í`€Î>ÀO×ÀPJÀOáÀO耕ÀOö¾M ÀOý¾M 'VÀPÀP1ÀQÀ@jÀP`€ÂÀP9ÀQÀ`€Î>ÀP<ÀQÀJÀPBxÀQ²5ÀPJÀPJ`ÀPJ $ÀPivÀPY.I` 'JR =xÀPw€ÀPJÀ@/K'€·a`€Â\=xÀP˜€ÀPJÀ@/KvÀPž.V`€ÎCa`€Â\=xÀPµ€ÀPJÀ@/K'€¸a`€Â\=xÀPÙ€ÀPJÀ@/KvÀPß.l`€ÎDa`€Â\=xÀP÷€ÀPJÀ@/K'€¹a`€Â\=xÀQ€ÀPJÀ@/KvÀQ.i]€Ã`€Î?a`€Â\=xÀQ-€ÀPJÀ@/K'€ºa`€Â\=xÀQL€ÀPJÀ@/KvÀQR.j]€Ã`€Î@a`€Â\=xÀQe€ÀPJÀ@/K'€»a`€Â\=xÀQ„€ÀPJÀ@/KvÀQŠ.k]€Ã`[Ba`€Â\=xÀQ€ÀPJÀ@/K'Pa`€Â\€ÀPJÀ@/a`€ÎHÀQÅÀQÐÀU;@€¼ÀQÜÀU;`€Î>ÀQÜÀU;NÀQæÀQëH`ÀQí >NÀR.]€ó`[vÀRvÀR.k]€Ã`[B/]€ó`[€öExÀRÀBŸ0a`€Ù€ø>NÀR €±`[vÀRÀBŸ2`[€ú>ÀRÀUNÀR*ÀR/!`€ÍvÀR;‚ÀR1ÀBú!`€Í]>NÀRc.]€ó`evÀRcvÀRc‚ÀRYÀBúw]€Ã`e^/]€ó`e€öExÀRc„ÀCP0a`€Ù€ø>NÀRP€˜`evÀRl„ÀCP2`e€ú>ÀRlÀU=5ÀRvÀRv`€ÀRvÀBR=xÀR‡†ÀRvÀCãKvÀR.V`€ÎCa`€Â\=xÀR¤†ÀRvÀCãK'€½a`€Â\=xÀR¼†ÀRvÀCãKƒÀRÂÀC%a`€Â\=xÀRÔ†ÀRvÀCãK'Na`€Â\=xÀRë†ÀRvÀCãKvÀR÷…ÀRñÀC³"`€Íga`€Â\†ÀRvÀCãNÀS ÀS€`€ÍvÀS …ÀSÀC³€`€ÍhIÀS5!ÀSE†ÀS9ÀDÜ>ÀSNÀTQ=5ÀSZÀSZ`€ÀSZÀBR=xÀSm‡ÀSZÀE(K'€¾a`€Â\=xÀSއÀSZÀE(KvÀS”.l`€ÎDa`€Â\=xÀS®‡ÀSZÀE(KxÀS¸vÀS´.i]€Ã`€Î?4ÀS¹ÀDÜ`€Ía`€Í`€Îa`€Â\=xÀSÕ‡ÀSZÀE(K'€½a`€Â\=xÀSï‡ÀSZÀE(KvÀSû…ÀSõÀC³€ž`€Íia`€Â\=xÀT‡ÀSZÀE(K'Na`€Â\=xÀT.‡ÀSZÀE(KvÀT:…ÀT4ÀC³€Ÿ`€Íja`€Â\‡ÀSZÀE(?NÀT_ÀTl€ `€ÍvÀTt…ÀTnÀC³€ `€ÍkIÀTŠ!ÀT›‡ÀTŽÀF²>ÀT¤ÀTó=5ÀT°ÀT°`€ÀT°ÀBR=xÀT¶ÀT°ÀFþK'€¿a`€Â\=xÀTÃÀT°ÀFþKxÀTÎvÀTÉ.j]€Ã`€Î@4ÀTÏÀF²`€Ía`€Í`€Îa`€Â\=xÀTßÀT°ÀFþK'Oa`€Â\ÀT°ÀFþ?=xÀU€ÀTýÀBK'€Àa`€Â\JÀU!xÀU-€ÀU(ÀBa`€Î&,¾55Û6a7¥9Ð?ÞBHH [ÀUiÀUoÀV €Á`€Â]ÀUÀU‘€!`€Í^`ÀU§ÀU®€€w]€Ã`edÀU²ÀU²ÀUÚÀUÁÀUÚÀUÇ!`€ÍÀUÒw]€Ã`e`[?]€ÀH®^ÀH» ÀU²€ÈbÀUßÀUòÀV@jÀUà`€ÂÀUúÀV`€ÎJÀV$ÀVvÀV.I` '€½vÀV.!`€Í]'€ÂvÀV.w]€Ã`e^HóIieÀVUÀV[ÀWç€Ã`€ÂgÀVuÀV{€"`€ÍhÀVŠÀV•€€`€ÍiÀV¤ÀV®€€ž`€ÍjÀV½ÀVÉ€€Ÿ`€ÍkÀVØÀV䀀 `€ÍoÀVéÀVéÀWdÀVôÀWdÀVú"`€ÍÀW€`€Íj`€ÛÀW&€ž`€Íj`€ÛÀW=€Ÿ`€Íj`€ÛÀWV€ `€Íj`€Û`e?g€ÀJ!hÀJ.i‚ÀJCjƒÀJXk„ÀJm ÀVé€ÈmÀWiÀW|ÀWå@jÀWj`€ÂÀW„ÀWå`€ÎJÀWŠ$ÀW‡ vÀWŒ.I` '€½'LvÀW¤."`€Íg'€ƒvÀW­.€`€Íh'€ƒvÀW».€ž`€Íi'€ƒvÀWÈ.€Ÿ`€Íj'€ƒvÀW×.€ `€Ík'OJÄKqpÀX4ÀX:À]½€Ä`€Â]€ó`€ÎsÀXyÀX‚€€Å`€ÎtÀXÀX—€€Æ`€ÍuzÀXŸÀX©€€G`€ÍxÀX§”€Ça`€ÍB€ƒÀX­ÀX­ÀYÀX¾ÀYÀXÆ€È`€Î`p?s€ÀXäÀL!tvÀY €ÀYÀL!D`€Í ÀX­€È|ÀYSÀYdÀYƒ@0jÀYT`€ÂÀYlÀYƒ`€ÙJÀYrxÀYzwÀYt.GxÀYrvÀYt.G`€ÍuE”a`€å`€ÍzCvÀY|.€Æ`€Íta`€å`€ÙvÀYˆÀYŸÀZ@2jÀY‰`€ÂÀY§ÀZ`€ÎJÀYª#"xÀY±vÀY«.G`€Íu€“a`€å`€Ù)xÀY¿vÀY¹.G`€ÍuCvÀYÁ.€Æ`€Íta`€å`€ÙxÀYÛvÀYÒ.€Å`€Îs4vÀYÜ.G`€Íua`€Í`€ÎC0ÀYëÀYüFvÀZ.G`€ÍuvÀZ .€Å`€Îs`€ÎwÀZÀZ!ÀZP@xÀZ+ÀZP`€ÙJÀZ."xÀZ4vÀZ..G`€ÍuCxÀZ>vÀZ6.€Æ`€ÍtF”a`€å`€Ía`€å`€ÙxÀZMvÀZE.€Æ`€Ít€’“a`€å`€Ù1xÀZUÀZdÀ[;@yÀZmÀ[;`€„>ÀZmÀ[;IÀZs!vÀZx.x`€ÙwJÀZƒjÀZ•`€„?NÀZ¢ÀZ§€É`€ÎxÀZ²vÀZ©.€Å`€Îs4xÀZ¹vÀZ³.G`€ÍuE”a`€å`€Ía`€Í`€ÎCIÀZÃÀZÌ€ÀZÇÀO'€ša`€Â`€ÙGJÀZÔjÀZæ`€„?IÀZðÀZù€ÀZôÀO'Ma`€Â`€ÙGJÀ[jÀ[`€„?JÀ[ jÀ[2`€„~À[@À[DÀ[f@À[QÀ[f`€ÍJÀ[WÀ[W€¾.À[jÀ[oÀ[’@|À[~À[’\>À[À[’=wÀ[‰.GxÀ[‡vÀ[‰.G`€ÍuE”a`€å`€Íz€€À[—À[œÀ[Â@€…À[®À[Â\>À[±À[Â=wÀ[¹.GxÀ[·vÀ[¹.G`€ÍuE”a`€å`€Íz€À\À\2À]»@jÀ\ `€ÂÀ\:À]»`€Î>À\=NÀ\GÀ\LH`À\N EÀ\bÀ\kÀ\mB`€Í“xÀ\tÀ\rÀQdCvÀ\v.G`€Íua`€å`€Ù‰À\}ÀQdxÀ\~À\}ÀQdE”a`€å`€Í>À\‚À\¨=xÀ\€À\ŠÀQCKxÀ\žvÀ\•.€Å`€Îs4À\ŸÀQda`€Í`€ÎCa`€Â\=xÀ\³€À\®ÀQCK'€Êa`€Â\K>À\ËÀ\ì=xÀ\Ø€À\ÓÀQCKvÀ\Þ.2`€Îva`€Â\À\î`HÀ]o`H>À]À]=xÀ]€À] ÀQCK'€Ëa`€Â\EÀ]%À].À]0B`€ÍxÀ]8vÀ]2.G`€ÍuE”a`€å`€ÍxÀ]?À]=ÀRÞCvÀ]KvÀ]A.€Å`€ÎsD`€Ía`€å`€Ù‰À]SÀRÞxÀ]TÀ]SÀRÞE”a`€å`€Í>À]XÀ]~=xÀ]e€À]`ÀQCKxÀ]tvÀ]k.€Å`€Îs4À]uÀRÞa`€Í`€ÎCa`€Â\=xÀ]‰€À]„ÀQCK$À]š'€¿vÀ]“.G`€Íu'Oa`€Â\JÀ]¡xÀ]­€À]¨ÀQCa`€ÎLjMN N¿O÷P5PœQTD€„À]ÀÀ]ÆÀ_§ €Ì`€Â€†À]íÀ^€†€Í`€„jÀ]ô`€„€‡À^+À^S€†€Î`€„jÀ^5`€„€ˆÀ^oÀ^Œ€†€Ï`€„jÀ^u`€„€‰À^¨À^¼€†€Ð`€„jÀ^°`€„€ŠÀ^ËÀ^Ô€z`€Ù€‹À^ãÀ^ï€}`€Ù€ŒÀ^þÀ_€€Ñ`€Ù€À_EÀ_KÀ_¥ À_UÀ_¥À_cz`€ÙjÀ_o`€ÙÀ_{}`€ÙjÀ_Š`€ÙÀ_–€Ñ`€ÙjÀ_ž`€Ù`€„?€Š€ÀUu€‹ÀUŒ€Œ‚ÀU£ À_K€È€À_À_À_@@€€À_À_@`€ÙJÀ_""!vÀ_.z`€Ù€Š!vÀ_*.}`€Ù€‹!vÀ_;.€Ñ`€Ù€ŒUîVV„„ „²A€Ò„„²„€Ó`€Î„<,]€ß`€Î]€ß[[j`€Û„^-`€Âj`€Û`J„n„n&„x „xI€„ƒÀV]€ß[[,„˜ÀVŽ-‚„«ÀV¬…ã…놪A€Ô…ø†ª†€Ó`€Î†$,]€ß`€Î]€ß[[j`€Û†F-`€Âj`€Û`J†V†V†hI€†sÀW,†ÀW"-‚†£ÀW@‡¿‡Çˆ¬A€Õ‡Øˆ¬‡îS`€Âˆ ,]€ß`€Î]€ß[[j`€Ûˆ--`€Âj`€Û`>ˆ6ˆ¬Iˆ:%ˆC€ˆ>ÀWž]€Ã[>ˆLˆ‰JˆRˆg<ˆpÀWž]€Ã[-‚ˆ~ÀWÈ?Jˆˆ”&ˆ£€ˆžÀWž]€ß[[‰«‰³ŒNA€Ö‰¼ŒN‰Á9]€ß[[‰Ý,]€ß`€Î]€ß[[j`€Û‰ÿ-`€Âj`€Û`>ŠŒNIŠ !ŠxŠ€ŠÀX\4'€¢a`€Â[€ÿ–a`€Â`€ÙJ>Š%ŠŸ=0Š+Š1L$Š>'€×xŠd€ŠaÀX\4'€¢a`€Â[€ÿ'€Ø'€Ù?IФxЬ€Š¨ÀX\^'+a`€Â`€Ù>ŠÅŒIŠË""xŠÓ€ŠÏÀX\^'va`€Â`€ÙxŠú€ŠöÀX\^'€‹a`€Â`€Ùx‹ €‹ÀX\^'ja`€Â`€Ù>‹6‹µ=0‹>‹D€ý$‹S'€Ú'€Û?J‹»‹Ö/&‹â x‹â€‹ßÀX\4'+a`€Â[€ÿ]€Ã[‹ðÀXk-‚Œ ÀX‰?JŒŒ/Z€Œ8ÀX\-‚ŒEÀX‰Z-m´HBIvK~TmVcVfVúWƒXAZ- €€Ü€À€‘õû…7€Ý`M€“‚§‚³€ `€Ù€•‚¸‚¸ƒ?‚Ń?‚Õ`€Ê‚ë€Þ`€Ê‚÷`€Îƒ  `€Ùjƒ`€Ù`€‘?€“ƒÀZï ƒ(O€ƒ.ÀZ̃5ÀZׂƒ:ÀZ〖ƒíƒí…5„…5„`€Ê„#`€Î`€‘? „1€•€„CÀ[K„V x„rv„k€„eÀ[K3`€ÍPEv„y„tÀ[VD`€Ía`€å`€Ív„¢€„œÀ[K`€è€ê!v„É€„ÃÀ[K!`€Í€ï"x„ôv„퀄çÀ[K"`€Í€ðEv„û„öÀ[VD`€Ía`€å`€Í…À[V )\3€—…}…ƒ‰€ß`€Â`€‘`<€š…Ë…Ñ€€à€`<€›…ì…ø€ j…Ö`€Â`€Ù€­‡_‡_‡š‡p‡š‡v€à`<‡„ `€Ùj‡“`€Ù`€—?€š€À\£€›À\° ‡_€È€œ…ý††+@€Šj…þ`€Â††+`€ÌJ† v†'v† .€à€`<€š€Š`€ÌR€†/†L†a@j†0`€Â†R†a`€ÒJ†Uv†\v†U.€à€`<€š`€ÒS€ž†e†‚†“@€Þj†f`€Â†††“`€ÒJ†‰v†v†‰.€à€`<€š€Þ`€ÒT€Ÿ†—†®†Á@j†˜`€Â†³†Á`€ÎJ†¶v†½v†¶.€à€`<€š`€ÎV€ †Å†Ü†õ@€áj†Æ`€Â†ä†õ`€ÎJ†çv†îv†ç.€à€`<€š€á`€ÎZ€¡†ù‡‡+@j†ú`€Â‡‡+`€èJ‡v‡"v‡.€à€`<€š`€è^€¢‡/‡C‡Z@Dj‡0`€Â‡J‡Z`€ÍJ‡Mv‡Tv‡M.€à€`<€šD`€Í_€¦‡Ÿ‡¯‡å@j‡ `€Â‡¸‡å‡Ä`€Ø`€ÍJ‡Îx‡Õv‡Î.€à€`<€š€‡ßÀ_a`€Ø`€Ía€§‡é‡üˆ0@€âj‡ê`€Âˆˆ0ˆ€ã[j`€Û`€ÎJˆxˆvˆ.€à€`<€š€â€ã€ˆ*À_ƒ^€ã[`€Îb€¨ˆ4ˆKˆy@€äjˆ5`€ÂˆPˆyˆ\`€Ø`€ØJˆfxˆmvˆf.€à€`<€š€ä€ˆsÀ_øa`€Ø`€Øc€©ˆ}ˆ’ˆÀ@€åjˆ~`€Âˆ˜ˆÀˆ¢`<`<Jˆ¬xˆ³vˆ¬.€à€`<€š€å€ˆºÀ`ba`<``¨a5aªb1buZŠ\<brbu €®€ë€°‚›‚Ÿ„$A€ì‚«„$‚±€í]€Ã[‚΀îa[`€Ù`€Í>‚ׄ$I‚Ûv‚䀂ßÀbÂ?`€ÙJ‚íx‚ô”€Ça`€ÍB?I‚ú}ƒ‚þÀbÐvƒ €ƒÀb€—[ra[`€ÙJƒ“?Iƒ!}ƒ+ƒ$ÀbÐvƒ1€ƒ,Àb€²[:a[`€ÙJƒ8vƒD€ƒ?ÀbÂD`€Í?NƒSƒW€ï`€Í“Nƒbƒf€ð`€Íxƒtvƒm€ƒhÀbÂD`€ÍF”a`€å`€ÍCƒ{xƒ†‚ƒ‚Àc”CƒƒˆÀc£a`€å`€Ù>ƒ„Nƒ—ƒœ€ñ`€Íxƒ¢‚ƒžÀc”Exƒ±xƒªƒƒ¦Àc£F‚ƒ¬Àc”a`€å`€Í€ò•a`€å`€Ísa`€å`€ÍIƒ¼}ƒÇƒÀÀbÐxƒÌ€ƒÈÀbÂ4„ƒÍÀd a`€Í[a[`€Ù>ƒÕƒí=‹ƒÝÀc£„ƒãÀd >ƒô„=ŠƒüÀc”x„„„Àd E”a`€å`€ÍJ„ƒ„Àc£eb£b¦e €±€óƒt€³ƒ=ƒO€†€ô`€ÍjƒN`€Í €´ƒ\ƒx€†€õ`€Íjƒu`€Í€µƒ…ƒ¢€†€ö`€Íjƒž`€Í€¶ƒ¯ƒÍ€†€÷`€ÍjƒÉ`€Í€·ƒÝ„3€†€ø`€Îjƒñ`€Î€¹„M„΀…€ù€±]€ß`€Î`€Í}„Ì4„W„W„Ì]€ß`€Î`€Í>„Z„ËN„b„f9]€ß`€Î`€Í2„u`€Î`€ÍE„{„„„†B`€Í“x„„‹Àf)C7@a`€å`€Ù‰„“Àf)x„”„“Àf)E”a`€å`€Í>„˜„»=x„¡€„žÀfXx„¯j„¢`€Î4„°Àf)a`€Í`€ÎC„¶Àf)a`€Î`€Í\J„¿€„ÆÀfa]€ß`€Î`€Í€º„Û„þ€…€ú`€Íx„û&„ó„èv•7`€ÍF”a`€å`€Í€»… …*€…€û`€Íx…&…#…v•7`€Í€Ça`€ÍB€½…q…‚‡gA€ü…‹‡g…€‡`€Í]€ô`€Î>…—‡gI…›"x…¥€…ŸÀgC…§€»a`€å`€Ùx…º€…´Àg€’…¼€ºa`€å`€Ù1>…dž=0…Í…ÓL$†'€ý€…ýÀg?N††]€Ã`€Î†€Æ`€Î“N†(†0€þ`€Í“I†7x†A€†;ÀgC“a`€å`€Ù>†F†o=ІLÀh<”=ˆ†]Àgx†e€†fÀg€Ça`€ÍB?=ˆ†sÀgx†ˆx†‚€†|Àg€ÿ”a`€Í`€Íw‚†ŠÀh<a`€Í`€ÍxD†•>†˜‡DN†¢†¨`€Íx†°€†ªÀgj†²`€Ía`€Í`€Íy=ˆ†ÅÀgx†Ë€†ÅÀgj†Ï`€Í a`€Í`€ÍzI†ãx†í€†çÀg€’“a`€å`€Ù1>†ò‡=‹†úÀhôx‡ƒ†úÀhôj‡`€Ía`€Í`€Íx?=x‡'‡#Àh x‡8j‡+`€Î4ƒ‡9Àhôa`€Í`€ÎCa`€Î\€Öx‡S€‡MÀg€’“a`€å`€Ù1J‡[‡bÀh€¾ˆuˆyŒÉAˆ‚ŒÉˆ”]€ó`€Î`€Í>ˆ›ŒÉ Nˆ£ˆª€¡`€Í“Nˆµˆº`€Ù*NˆÉˆÏ`€Í“CˆÖ!‚ˆÞÀjn>ˆäŠ[Iˆê!xˆõ€ˆïÀj@0a`€Ù€ø=0‰‰+'?N‰3‰8 `€Îv‰@€‰:Àj@2`€Î€úN‰Q‰W`€Íx‰`‰Y€¹4„‰aÀjÍa`€Â`€Í€ÿI‰l‰v…‰pÀjî>‰‰Î=0‰‡‰€ý$‰Ç' „‰ÂÀjÍ?=ЉÔÀjn‰úx‰â‰ÜÀjî`€Íj‰ä`€Ía`€Í`€Íy“a`€Â`€Ù€ç=ŠÀjîxŠ ŠÀjî`€ÍjŠ `€Ía`€Í`€Íy=‰Š Àj_xŠ'Š Àj_ExŠ1Š+Àjî`€Í€ÿƒŠ4Àj}a`€Í`€Íwa`€å`€Í=‹Š@Àj}xŠFƒŠ@Àj}EjŠI`€Í a`€å`€ÍN‹œ‹£ `€Ù‹²x‹­‹¦Àj_”a`€Í`€Íy”a`€Â`€Ù€ç=‰‹ºÀj_x‹Ê‹ÃÀj_”a`€Í`€Íz=‰‹ÒÀj_#„‹ÛÀlPx‹ä‹åÀj_€Ça`€ÍB‹îÀj_`€ÍIŒ)"xŒ4Œ-Àj_CŒ6€»a`€å`€ÙxŒJŒCÀj_€’ŒL€ºa`€å`€Ù1>ŒWŒ¶=0Œ]Œc€ý$Œ±' ŒªÀj_?JŒºŒÁÀj_mle4gqj$ml[file:///github/home/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/builder.dartŒ=// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Contains a builder object useful for creating source maps programatically. library source_maps.builder; // TODO(sigmund): add a builder for multi-section mappings. import 'dart:convert'; import 'package:source_span/source_span.dart'; import 'parser.dart'; import 'src/source_map_span.dart'; /// Builds a source map given a set of mappings. class SourceMapBuilder { final List _entries = []; /// Adds an entry mapping the [targetOffset] to [source]. void addFromOffset(SourceLocation source, SourceFile targetFile, int targetOffset, String identifier) { ArgumentError.checkNotNull(targetFile, 'targetFile'); _entries.add(Entry(source, targetFile.location(targetOffset), identifier)); } /// Adds an entry mapping [target] to [source]. /// /// If [isIdentifier] is true or if [target] is a [SourceMapSpan] with /// `isIdentifier` set to true, this entry is considered to represent an /// identifier whose value will be stored in the source map. [isIdentifier] /// takes precedence over [target]'s `isIdentifier` value. void addSpan(SourceSpan source, SourceSpan target, {bool? isIdentifier}) { isIdentifier ??= source is SourceMapSpan ? source.isIdentifier : false; var name = isIdentifier ? source.text : null; _entries.add(Entry(source.start, target.start, name)); } /// Adds an entry mapping [target] to [source]. void addLocation( SourceLocation source, SourceLocation target, String? identifier) { _entries.add(Entry(source, target, identifier)); } /// Encodes all mappings added to this builder as a json map. Map build(String fileUrl) { return SingleMapping.fromEntries(_entries, fileUrl).toJson(); } /// Encodes all mappings added to this builder as a json string. String toJson(String fileUrl) => jsonEncode(build(fileUrl)); } /// An entry in the source map builder. class Entry implements Comparable { /// Span denoting the original location in the input source file final SourceLocation source; /// Span indicating the corresponding location in the target file. final SourceLocation target; /// An identifier name, when this location is the start of an identifier. final String? identifierName; /// Creates a new [Entry] mapping [target] to [source]. Entry(this.source, this.target, this.identifierName); /// Implements [Comparable] to ensure that entries are ordered by their /// location in the target file. We sort primarily by the target offset /// because source map files are encoded by printing each mapping in order as /// they appear in the target file. @override int compareTo(Entry other) { var res = target.compareTo(other.target); if (res != 0) return res; res = source.sourceUrl .toString() .compareTo(other.source.sourceUrl.toString()); if (res != 0) return res; return source.compareTo(other.source); } } VNN<O</#1*? otherMaps, /*String|Uri*/ Object? mapUrl}) => parseJson(jsonDecode(jsonMap), otherMaps: otherMaps, mapUrl: mapUrl); /// Parses a source map or source map bundle directly from a json string. /// /// [mapUrl], which may be either a [String] or a [Uri], indicates the URL of /// the source map file itself. If it's passed, any URLs in the source /// map will be interpreted as relative to this URL when generating spans. Mapping parseExtended(String jsonMap, {Map? otherMaps, /*String|Uri*/ Object? mapUrl}) => parseJsonExtended(jsonDecode(jsonMap), otherMaps: otherMaps, mapUrl: mapUrl); /// Parses a source map or source map bundle. /// /// [mapUrl], which may be either a [String] or a [Uri], indicates the URL of /// the source map file itself. If it's passed, any URLs in the source /// map will be interpreted as relative to this URL when generating spans. Mapping parseJsonExtended(/*List|Map*/ Object? json, {Map? otherMaps, /*String|Uri*/ Object? mapUrl}) { if (json is List) { return MappingBundle.fromJson(json, mapUrl: mapUrl); } return parseJson(json as Map); } /// Parses a source map /// /// [mapUrl], which may be either a [String] or a [Uri], indicates the URL of /// the source map file itself. If it's passed, any URLs in the source /// map will be interpreted as relative to this URL when generating spans. Mapping parseJson(Map map, {Map? otherMaps, /*String|Uri*/ Object? mapUrl}) { if (map['version'] != 3) { throw ArgumentError('unexpected source map version: ${map["version"]}. ' 'Only version 3 is supported.'); } if (map.containsKey('sections')) { if (map.containsKey('mappings') || map.containsKey('sources') || map.containsKey('names')) { throw FormatException('map containing "sections" ' 'cannot contain "mappings", "sources", or "names".'); } return MultiSectionMapping.fromJson(map['sections'], otherMaps, mapUrl: mapUrl); } return SingleMapping.fromJson(map, mapUrl: mapUrl); } /// A mapping parsed out of a source map. abstract class Mapping { /// Returns the span associated with [line] and [column]. /// /// [uri] is the optional location of the output file to find the span for /// to disambiguate cases where a mapping may have different mappings for /// different output files. SourceMapSpan? spanFor(int line, int column, {Map? files, String? uri}); /// Returns the span associated with [location]. SourceMapSpan? spanForLocation(SourceLocation location, {Map? files}) { return spanFor(location.line, location.column, uri: location.sourceUrl?.toString(), files: files); } } /// A meta-level map containing sections. class MultiSectionMapping extends Mapping { /// For each section, the start line offset. final List _lineStart = []; /// For each section, the start column offset. final List _columnStart = []; /// For each section, the actual source map information, which is not adjusted /// for offsets. final List _maps = []; /// Creates a section mapping from json. MultiSectionMapping.fromJson(List sections, Map? otherMaps, {/*String|Uri*/ Object? mapUrl}) { for (var section in sections) { var offset = section['offset']; if (offset == null) throw FormatException('section missing offset'); var line = section['offset']['line']; if (line == null) throw FormatException('offset missing line'); var column = section['offset']['column']; if (column == null) throw FormatException('offset missing column'); _lineStart.add(line); _columnStart.add(column); var url = section['url']; var map = section['map']; if (url != null && map != null) { throw FormatException("section can't use both url and map entries"); } else if (url != null) { var other = otherMaps?[url]; if (otherMaps == null || other == null) { throw FormatException( 'section contains refers to $url, but no map was ' 'given for it. Make sure a map is passed in "otherMaps"'); } _maps.add(parseJson(other, otherMaps: otherMaps, mapUrl: url)); } else if (map != null) { _maps.add(parseJson(map, otherMaps: otherMaps, mapUrl: mapUrl)); } else { throw FormatException('section missing url or map'); } } if (_lineStart.isEmpty) { throw FormatException('expected at least one section'); } } int _indexFor(int line, int column) { for (var i = 0; i < _lineStart.length; i++) { if (line < _lineStart[i]) return i - 1; if (line == _lineStart[i] && column < _columnStart[i]) return i - 1; } return _lineStart.length - 1; } @override SourceMapSpan? spanFor(int line, int column, {Map? files, String? uri}) { // TODO(jacobr): perhaps verify that targetUrl matches the actual uri // or at least ends in the same file name. var index = _indexFor(line, column); return _maps[index].spanFor( line - _lineStart[index], column - _columnStart[index], files: files); } @override String toString() { var buff = StringBuffer('$runtimeType : ['); for (var i = 0; i < _lineStart.length; i++) { buff ..write('(') ..write(_lineStart[i]) ..write(',') ..write(_columnStart[i]) ..write(':') ..write(_maps[i]) ..write(')'); } buff.write(']'); return buff.toString(); } } class MappingBundle extends Mapping { final Map _mappings = {}; MappingBundle(); MappingBundle.fromJson(List json, {/*String|Uri*/ Object? mapUrl}) { for (var map in json) { addMapping(parseJson(map, mapUrl: mapUrl) as SingleMapping); } } void addMapping(SingleMapping mapping) { // TODO(jacobr): verify that targetUrl is valid uri instead of a windows // path. // TODO: Remove type arg https://github.com/dart-lang/sdk/issues/42227 var targetUrl = ArgumentError.checkNotNull( mapping.targetUrl, 'mapping.targetUrl'); _mappings[targetUrl] = mapping; } /// Encodes the Mapping mappings as a json map. List toJson() => _mappings.values.map((v) => v.toJson()).toList(); @override String toString() { var buff = StringBuffer(); for (var map in _mappings.values) { buff.write(map.toString()); } return buff.toString(); } bool containsMapping(String url) => _mappings.containsKey(url); @override SourceMapSpan? spanFor(int line, int column, {Map? files, String? uri}) { // TODO: Remove type arg https://github.com/dart-lang/sdk/issues/42227 uri = ArgumentError.checkNotNull(uri, 'uri'); // Find the longest suffix of the uri that matches the sourcemap // where the suffix starts after a path segment boundary. // We consider ":" and "/" as path segment boundaries so that // "package:" uris can be handled with minimal special casing. Having a // few false positive path segment boundaries is not a significant issue // as we prefer the longest matching prefix. // Using package:path `path.split` to find path segment boundaries would // not generate all of the path segment boundaries we want for "package:" // urls as "package:package_name" would be one path segment when we want // "package" and "package_name" to be sepearate path segments. var onBoundary = true; var separatorCodeUnits = ['/'.codeUnitAt(0), ':'.codeUnitAt(0)]; for (var i = 0; i < uri.length; ++i) { if (onBoundary) { var candidate = uri.substring(i); var candidateMapping = _mappings[candidate]; if (candidateMapping != null) { return candidateMapping.spanFor(line, column, files: files, uri: candidate); } } onBoundary = separatorCodeUnits.contains(uri.codeUnitAt(i)); } // Note: when there is no source map for an uri, this behaves like an // identity function, returning the requested location as the result. // Create a mock offset for the output location. We compute it in terms // of the input line and column to minimize the chances that two different // line and column locations are mapped to the same offset. var offset = line * 1000000 + column; var location = SourceLocation(offset, line: line, column: column, sourceUrl: Uri.parse(uri)); return SourceMapSpan(location, location, ''); } } /// A map containing direct source mappings. class SingleMapping extends Mapping { /// Source urls used in the mapping, indexed by id. final List urls; /// Source names used in the mapping, indexed by id. final List names; /// The [SourceFile]s to which the entries in [lines] refer. /// /// This is in the same order as [urls]. If this was constructed using /// [SingleMapping.fromEntries], this contains files from any [FileLocation]s /// used to build the mapping. If it was parsed from JSON, it contains files /// for any sources whose contents were provided via the `"sourcesContent"` /// field. /// /// Files whose contents aren't available are `null`. final List files; /// Entries indicating the beginning of each span. final List lines; /// Url of the target file. String? targetUrl; /// Source root prepended to all entries in [urls]. String? sourceRoot; final Uri? _mapUrl; final Map extensions; SingleMapping._(this.targetUrl, this.files, this.urls, this.names, this.lines) : _mapUrl = null, extensions = {}; factory SingleMapping.fromEntries(Iterable entries, [String? fileUrl]) { // The entries needs to be sorted by the target offsets. var sourceEntries = entries.toList()..sort(); var lines = []; // Indices associated with file urls that will be part of the source map. We // rely on map order so that `urls.keys[urls[u]] == u` var urls = {}; // Indices associated with identifiers that will be part of the source map. // We rely on map order so that `names.keys[names[n]] == n` var names = {}; /// The file for each URL, indexed by [urls]' values. var files = {}; var lineNum; late List targetEntries; for (var sourceEntry in sourceEntries) { if (lineNum == null || sourceEntry.target.line > lineNum) { lineNum = sourceEntry.target.line; targetEntries = []; lines.add(TargetLineEntry(lineNum, targetEntries)); } var sourceUrl = sourceEntry.source.sourceUrl; var urlId = urls.putIfAbsent( sourceUrl == null ? '' : sourceUrl.toString(), () => urls.length); if (sourceEntry.source is FileLocation) { files.putIfAbsent( urlId, () => (sourceEntry.source as FileLocation).file); } var sourceEntryIdentifierName = sourceEntry.identifierName; var srcNameId = sourceEntryIdentifierName == null ? null : names.putIfAbsent(sourceEntryIdentifierName, () => names.length); targetEntries.add(TargetEntry(sourceEntry.target.column, urlId, sourceEntry.source.line, sourceEntry.source.column, srcNameId)); } return SingleMapping._(fileUrl, urls.values.map((i) => files[i]).toList(), urls.keys.toList(), names.keys.toList(), lines); } SingleMapping.fromJson(Map map, {mapUrl}) : targetUrl = map['file'], urls = List.from(map['sources']), names = List.from(map['names'] ?? []), files = List.filled(map['sources'].length, null), sourceRoot = map['sourceRoot'], lines = [], _mapUrl = mapUrl is String ? Uri.parse(mapUrl) : mapUrl, extensions = {} { var sourcesContent = map['sourcesContent'] == null ? const [] : List.from(map['sourcesContent']); for (var i = 0; i < urls.length && i < sourcesContent.length; i++) { var source = sourcesContent[i]; if (source == null) continue; files[i] = SourceFile.fromString(source, url: urls[i]); } var line = 0; var column = 0; var srcUrlId = 0; var srcLine = 0; var srcColumn = 0; var srcNameId = 0; var tokenizer = _MappingTokenizer(map['mappings']); var entries = []; while (tokenizer.hasTokens) { if (tokenizer.nextKind.isNewLine) { if (entries.isNotEmpty) { lines.add(TargetLineEntry(line, entries)); entries = []; } line++; column = 0; tokenizer._consumeNewLine(); continue; } // Decode the next entry, using the previous encountered values to // decode the relative values. // // We expect 1, 4, or 5 values. If present, values are expected in the // following order: // 0: the starting column in the current line of the generated file // 1: the id of the original source file // 2: the starting line in the original source // 3: the starting column in the original source // 4: the id of the original symbol name // The values are relative to the previous encountered values. if (tokenizer.nextKind.isNewSegment) throw _segmentError(0, line); column += tokenizer._consumeValue(); if (!tokenizer.nextKind.isValue) { entries.add(TargetEntry(column)); } else { srcUrlId += tokenizer._consumeValue(); if (srcUrlId >= urls.length) { throw StateError( 'Invalid source url id. $targetUrl, $line, $srcUrlId'); } if (!tokenizer.nextKind.isValue) throw _segmentError(2, line); srcLine += tokenizer._consumeValue(); if (!tokenizer.nextKind.isValue) throw _segmentError(3, line); srcColumn += tokenizer._consumeValue(); if (!tokenizer.nextKind.isValue) { entries.add(TargetEntry(column, srcUrlId, srcLine, srcColumn)); } else { srcNameId += tokenizer._consumeValue(); if (srcNameId >= names.length) { throw StateError('Invalid name id: $targetUrl, $line, $srcNameId'); } entries.add( TargetEntry(column, srcUrlId, srcLine, srcColumn, srcNameId)); } } if (tokenizer.nextKind.isNewSegment) tokenizer._consumeNewSegment(); } if (entries.isNotEmpty) { lines.add(TargetLineEntry(line, entries)); } map.forEach((name, value) { if (name.startsWith('x_')) extensions[name] = value; }); } /// Encodes the Mapping mappings as a json map. /// /// If [includeSourceContents] is `true`, this includes the source file /// contents from [files] in the map if possible. Map toJson({bool includeSourceContents = false}) { var buff = StringBuffer(); var line = 0; var column = 0; var srcLine = 0; var srcColumn = 0; var srcUrlId = 0; var srcNameId = 0; var first = true; for (var entry in lines) { var nextLine = entry.line; if (nextLine > line) { for (var i = line; i < nextLine; ++i) { buff.write(';'); } line = nextLine; column = 0; first = true; } for (var segment in entry.entries) { if (!first) buff.write(','); first = false; column = _append(buff, column, segment.column); // Encoding can be just the column offset if there is no source // information. var newUrlId = segment.sourceUrlId; if (newUrlId == null) continue; srcUrlId = _append(buff, srcUrlId, newUrlId); srcLine = _append(buff, srcLine, segment.sourceLine!); srcColumn = _append(buff, srcColumn, segment.sourceColumn!); if (segment.sourceNameId == null) continue; srcNameId = _append(buff, srcNameId, segment.sourceNameId!); } } var result = { 'version': 3, 'sourceRoot': sourceRoot ?? '', 'sources': urls, 'names': names, 'mappings': buff.toString() }; if (targetUrl != null) result['file'] = targetUrl!; if (includeSourceContents) { result['sourcesContent'] = files.map((file) => file?.getText(0)).toList(); } extensions.forEach((name, value) => result[name] = value); return result; } /// Appends to [buff] a VLQ encoding of [newValue] using the difference /// between [oldValue] and [newValue] static int _append(StringBuffer buff, int oldValue, int newValue) { buff.writeAll(encodeVlq(newValue - oldValue)); return newValue; } StateError _segmentError(int seen, int line) => StateError('Invalid entry in sourcemap, expected 1, 4, or 5' ' values, but got $seen.\ntargeturl: $targetUrl, line: $line'); /// Returns [TargetLineEntry] which includes the location in the target [line] /// number. In particular, the resulting entry is the last entry whose line /// number is lower or equal to [line]. TargetLineEntry? _findLine(int line) { var index = binarySearch(lines, (e) => e.line > line); return (index <= 0) ? null : lines[index - 1]; } /// Returns [TargetEntry] which includes the location denoted by /// [line], [column]. If [lineEntry] corresponds to [line], then this will be /// the last entry whose column is lower or equal than [column]. If /// [lineEntry] corresponds to a line prior to [line], then the result will be /// the very last entry on that line. TargetEntry? _findColumn(int line, int column, TargetLineEntry? lineEntry) { if (lineEntry == null || lineEntry.entries.isEmpty) return null; if (lineEntry.line != line) return lineEntry.entries.last; var entries = lineEntry.entries; var index = binarySearch(entries, (e) => e.column > column); return (index <= 0) ? null : entries[index - 1]; } @override SourceMapSpan? spanFor(int line, int column, {Map? files, String? uri}) { var entry = _findColumn(line, column, _findLine(line)); if (entry == null) return null; var sourceUrlId = entry.sourceUrlId; if (sourceUrlId == null) return null; var url = urls[sourceUrlId]; if (sourceRoot != null) { url = '${sourceRoot}${url}'; } var sourceNameId = entry.sourceNameId; var file = files?[url]; if (file != null) { var start = file.getOffset(entry.sourceLine!, entry.sourceColumn); if (sourceNameId != null) { var text = names[sourceNameId]; return SourceMapFileSpan(file.span(start, start + text.length), isIdentifier: true); } else { return SourceMapFileSpan(file.location(start).pointSpan()); } } else { var start = SourceLocation(0, sourceUrl: _mapUrl?.resolve(url) ?? url, line: entry.sourceLine, column: entry.sourceColumn); // Offset and other context is not available. if (sourceNameId != null) { return SourceMapSpan.identifier(start, names[sourceNameId]); } else { return SourceMapSpan(start, start, ''); } } } @override String toString() { return (StringBuffer('$runtimeType : [') ..write('targetUrl: ') ..write(targetUrl) ..write(', sourceRoot: ') ..write(sourceRoot) ..write(', urls: ') ..write(urls) ..write(', names: ') ..write(names) ..write(', lines: ') ..write(lines) ..write(']')) .toString(); } String get debugString { var buff = StringBuffer(); for (var lineEntry in lines) { var line = lineEntry.line; for (var entry in lineEntry.entries) { buff ..write(targetUrl) ..write(': ') ..write(line) ..write(':') ..write(entry.column); var sourceUrlId = entry.sourceUrlId; if (sourceUrlId != null) { buff ..write(' --> ') ..write(sourceRoot) ..write(urls[sourceUrlId]) ..write(': ') ..write(entry.sourceLine) ..write(':') ..write(entry.sourceColumn); } var sourceNameId = entry.sourceNameId; if (sourceNameId != null) { buff..write(' (')..write(names[sourceNameId])..write(')'); } buff.write('\n'); } } return buff.toString(); } } /// A line entry read from a source map. class TargetLineEntry { final int line; List entries; TargetLineEntry(this.line, this.entries); @override String toString() => '$runtimeType: $line $entries'; } /// A target segment entry read from a source map class TargetEntry { final int column; final int? sourceUrlId; final int? sourceLine; final int? sourceColumn; final int? sourceNameId; TargetEntry(this.column, [this.sourceUrlId, this.sourceLine, this.sourceColumn, this.sourceNameId]); @override String toString() => '$runtimeType: ' '($column, $sourceUrlId, $sourceLine, $sourceColumn, $sourceNameId)'; } /// A character iterator over a string that can peek one character ahead. class _MappingTokenizer implements Iterator { final String _internal; final int _length; int index = -1; _MappingTokenizer(String internal) : _internal = internal, _length = internal.length; // Iterator API is used by decodeVlq to consume VLQ entries. @override bool moveNext() => ++index < _length; @override String get current => (index >= 0 && index < _length) ? _internal[index] : throw RangeError.index(index, _internal); bool get hasTokens => index < _length - 1 && _length > 0; _TokenKind get nextKind { if (!hasTokens) return _TokenKind.EOF; var next = _internal[index + 1]; if (next == ';') return _TokenKind.LINE; if (next == ',') return _TokenKind.SEGMENT; return _TokenKind.VALUE; } int _consumeValue() => decodeVlq(this); void _consumeNewLine() { ++index; } void _consumeNewSegment() { ++index; } // Print the state of the iterator, with colors indicating the current // position. @override String toString() { var buff = StringBuffer(); for (var i = 0; i < index; i++) { buff.write(_internal[i]); } buff.write(''); try { buff.write(current); } on RangeError catch (_) {} buff.write(''); for (var i = index + 1; i < _internal.length; i++) { buff.write(_internal[i]); } buff.write(' ($index)'); return buff.toString(); } } class _TokenKind { static const _TokenKind LINE = _TokenKind(isNewLine: true); static const _TokenKind SEGMENT = _TokenKind(isNewSegment: true); static const _TokenKind EOF = _TokenKind(isEof: true); static const _TokenKind VALUE = _TokenKind(); final bool isNewLine; final bool isNewSegment; final bool isEof; bool get isValue => !isNewLine && !isNewSegment && !isEof; const _TokenKind( {this.isNewLine = false, this.isNewSegment = false, this.isEof = false}); } ‚ÊNN<D/"#5NGKNO7IJJNGK&I+/.NGK5D9!NGKDM)%'&$9@D6*<ML/63:*3<*,/(1*Q++K)$&K,F0J  (M %2!AI H I=>(2.K" /7J/)!@ 12 !&3GC+M K81$2E ("B /7K:E>BLM1MNMCE+*5(8- CJJLO@**@2-&67?IPON 8!5%6)QE=2%Q; P@!:%*-B+)<4$M0EB8NFKO9,!27:(%A75I&$>8#"*"5% %I% ML1791EI+)*/'F G.G0+J2+P M K1 ;2J45!0 +%8H,(6?E4E&"8!Q?J(F32CJQN*);3CPFQ(OE?%A5 /7<$)*!#+I"(H!D $3"'4"E0 -!$#!- !-#! '&) /$E ), 72 (LJ6%#? ( 82<+%-0*  I &  !9 >D90=Ppackage:source_maps/parser.dart€€Ègfile:///github/home/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/src/source_map_span.dart‰‘// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. library source_maps.source_map_span; import 'package:source_span/source_span.dart'; /// A [SourceSpan] for spans coming from or being written to source maps. /// /// These spans have an extra piece of metadata: whether or not they represent /// an identifier (see [isIdentifier]). class SourceMapSpan extends SourceSpanBase { /// Whether this span represents an identifier. /// /// If this is `true`, [text] is the value of the identifier. final bool isIdentifier; SourceMapSpan(SourceLocation start, SourceLocation end, String text, {this.isIdentifier = false}) : super(start, end, text); /// Creates a [SourceMapSpan] for an identifier with value [text] starting at /// [start]. /// /// The [end] location is determined by adding [text] to [start]. SourceMapSpan.identifier(SourceLocation start, String text) : this( start, SourceLocation(start.offset + text.length, sourceUrl: start.sourceUrl, line: start.line, column: start.column + text.length), text, isIdentifier: true); } /// A wrapper aruond a [FileSpan] that implements [SourceMapSpan]. class SourceMapFileSpan implements SourceMapSpan, FileSpan { final FileSpan _inner; @override final bool isIdentifier; @override SourceFile get file => _inner.file; @override FileLocation get start => _inner.start; @override FileLocation get end => _inner.end; @override String get text => _inner.text; @override String get context => _inner.context; @override Uri? get sourceUrl => _inner.sourceUrl; @override int get length => _inner.length; SourceMapFileSpan(this._inner, {this.isIdentifier = false}); @override int compareTo(SourceSpan other) => _inner.compareTo(other); @override String highlight({color}) => _inner.highlight(color: color); @override SourceSpan union(SourceSpan other) => _inner.union(other); @override FileSpan expand(FileSpan other) => _inner.expand(other); @override String message(String message, {color}) => _inner.message(message, color: color); @override String toString() => _inner.toString().replaceAll('FileSpan', 'SourceMapFileSpan'); } MNN<%/JO(-2@G#!PD>7,"5!C=  & * & " ( * #? > ? = ; -- E,package:source_maps/src/source_map_span.dartgfile:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/src/span_with_context.dart.package:source_span/src/span_with_context.dart]file:///github/home/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/src/utils.dart„%// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Utilities that shouldn't be in this package. library source_maps.utils; /// Find the first entry in a sorted [list] that matches a monotonic predicate. /// Given a result `n`, that all items before `n` will not match, `n` matches, /// and all items after `n` match too. The result is -1 when there are no /// items, 0 when all items match, and list.length when none does. // TODO(sigmund): remove this function after dartbug.com/5624 is fixed. int binarySearch(List list, bool Function(dynamic) matches) { if (list.isEmpty) return -1; if (matches(list.first)) return 0; if (!matches(list.last)) return list.length; var min = 0; var max = list.length - 1; while (min < max) { var half = min + ((max - min) ~/ 2); if (matches(list[half])) { max = half; } else { min = half + 1; } } return max; } NN<1POJCH>%/) "package:source_maps/src/utils.dart[file:///github/home/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/src/vlq.dartŒÊ// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Utilities to encode and decode VLQ values used in source maps. /// /// Sourcemaps are encoded with variable length numbers as base64 encoded /// strings with the least significant digit coming first. Each base64 digit /// encodes a 5-bit value (0-31) and a continuation bit. Signed values can be /// represented by using the least significant bit of the value as the sign bit. /// /// For more details see the source map [version 3 documentation](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?usp=sharing). library source_maps.src.vlq; import 'dart:math'; const int VLQ_BASE_SHIFT = 5; const int VLQ_BASE_MASK = (1 << 5) - 1; const int VLQ_CONTINUATION_BIT = 1 << 5; const int VLQ_CONTINUATION_MASK = 1 << 5; const String BASE64_DIGITS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; final Map _digits = () { var map = {}; for (var i = 0; i < 64; i++) { map[BASE64_DIGITS[i]] = i; } return map; }(); final int MAX_INT32 = (pow(2, 31) as int) - 1; final int MIN_INT32 = -(pow(2, 31) as int); /// Creates the VLQ encoding of [value] as a sequence of characters Iterable encodeVlq(int value) { if (value < MIN_INT32 || value > MAX_INT32) { throw ArgumentError('expected 32 bit int, got: $value'); } var res = []; var signBit = 0; if (value < 0) { signBit = 1; value = -value; } value = (value << 1) | signBit; do { var digit = value & VLQ_BASE_MASK; value >>= VLQ_BASE_SHIFT; if (value > 0) { digit |= VLQ_CONTINUATION_BIT; } res.add(BASE64_DIGITS[digit]); } while (value > 0); return res; } /// Decodes a value written as a sequence of VLQ characters. The first input /// character will be `chars.current` after calling `chars.moveNext` once. The /// iterator is advanced until a stop character is found (a character without /// the [VLQ_CONTINUATION_BIT]). int decodeVlq(Iterator chars) { var result = 0; var stop = false; var shift = 0; while (!stop) { if (!chars.moveNext()) throw StateError('incomplete VLQ value'); var char = chars.current; var digit = _digits[char]; if (digit == null) { throw FormatException('invalid character in VLQ encoding: $char'); } stop = (digit & VLQ_CONTINUATION_BIT) == 0; digit &= VLQ_BASE_MASK; result += (digit << shift); shift += VLQ_BASE_SHIFT; } // Result uses the least significant bit as a sign bit. We convert it into a // two-complement value. For example, // 2 (10 binary) becomes 1 // 3 (11 binary) becomes -1 // 4 (100 binary) becomes 2 // 5 (101 binary) becomes -2 // 6 (110 binary) becomes 3 // 7 (111 binary) becomes -3 var negate = (result & 1) == 1; result = result >> 1; result = negate ? -result : result; // TODO(sigmund): can we detect this earlier? if (result < MIN_INT32 || result > MAX_INT32) { throw FormatException( 'expected an encoded 32 bit int, but we got: $result'); } return result; } gNN<CJMNQ€¥()*H&!/,D(0="'%#MON!(EI0 O( ! !"&02@ package:source_maps/src/vlq.dartmŽz¢Ýšèè«ít{`€Î€„€Š€‹€Œ€„€Š€‹€Œ€„€Š€‹€Œ€„€Š€‹€Œ€€é` [|`m[ 777   -;INTWdgjm   €Ò€Ô€Õ€Ö %!&#$%'%(%)#)*A) )#.*Q012R04T444]4 0::*h=>i>j>#>k>V>l>Em>n>€¼=IVIl=L€Œ=NNP€¤P~P€­P€°N N=WXoW*€Á[\!\w[_w[a[c€Ãef"f€f€žf€Ÿf€ elen€Äpqr€År€ÆqGq2qxqypyGp{0{}}|}€…{p€‚€Ì€„€…€Í€…€Î€…€Ï€…€Ð€…z€…}€…€Ñ€…€€€„€Ž€€Ý€‘€’ €‘€”€”€€ß€—€˜€™€à€˜ €˜€Š€˜€˜€Þ€˜€˜€á€˜€˜D€˜€£€é€—€¥€¥€â€¥€ä€¥€å€¥€æ€¥€—€¬€®€¯€ì€±€²€ô€²€õ€²€ö€²€÷€²€ø€²€¸€ù€²€ú€²€û€±€¼€ü€¼€Á€Á€Á€Ä€Å€Â€Ç€É !€Ë"€Á#€Á$€Á%€Ï€Ð&€Ë'€Ì€Ó €Ã€Õ (€×)€Á*€Ú+€Ø€Ü€Ü€Á,€¿€à-€Á.€Ê€ã€Á/€å€æ0€Á1€Ê€é€Â€ë€Î€í€é!€é"€è€ñ€Á2€Á3€ô€õ/€ó€÷0€ó€ù2€Á4€û€ü€ß€þ4€õ?€ÃD€æC€æE€Õ4€æF€Á5€Á6€Â I K €þX€ßY€ô9[€þ^€Å7€íb€ÎD€ídf€æg€Ê€ñ€Ò€Ã"8€Ì$9€ÕX€õ{€Á:€æ€(*€þ€†€Á;-.€Õ€Ž€æ€’D€þ€”€Ò4€Š€–€Ó€£ €§€æ€¯€õ€²€Ó€³€Ë€è€Ó€´€Ò>€µ€ñ€¶€ÍA€Ç€í4€Á€ë0€ÏK€×?MN€é3<Q€ŠQQ€ÞMUW@XY€áA[B\]]D\``€â`€ä<d€å`€æ€ÁC€í€ç€ÁDijkE€ÁF€ßnG€ÁH€ë€ê€õ€—€æ€òItuJA€ÿAAA€ÁK€ÁL|}~MN#+8>HT^aipv€‚€†€Š€€š€Ÿ€¦€¬€Á€Æ€Ô€Ý€â€å€î€ö!',/>Q[glt|…‹¥­´»ÁÃÙì‚‚‚‚1‚L‚]‚“‚­‚´‚тڂۂ܂â‚ã‚ä‚é‚í‚ø‚üƒƒƒƒƒƒƒƒƒ ƒ*ƒ1ƒ:ƒKƒNƒTƒUƒ[ƒcƒrƒ}ƒ‡ƒ™ƒšƒ¤ƒ­ƒ¶ƒÆƒÎƒÏƒÜƒàƒåƒêƒôƒû„„„„„#„,„5„>„F„M„V„^„g„q„€„Œ„™„¦„­„¯„ƄȄلë„ò„÷………………&…*…1…>…I…J…O…Z…s…w…|……‰…Š…‘…™…¤…®…º…Æ…Ì…Ó…Ú…á…é…ñ…ù…ý†,†=†J†R†[†\†^†i†r†v††ƒ†Œ†“†ž†¬†´†½†Æ†Ñ†Ó†Ü†Þ†ß†î†ï†ú‡ ‡‡‡!‡)‡-‡2‡6‡@‡D‡K‡N‡S‡X‡]‡d‡q‡‚‡‹‡ª‡¬‡È‡âˆˆ.ˆ;ˆ>ˆOˆUˆ\ˆeˆjˆoˆuˆ|ˆ†ˆŽˆ–ˆ¢ˆ³ˆ¿ˆÃˆÊˆÍˆÐˆÔˆÖˆéˆ÷‰‰‰-‰:‰A‰J‰S‰\‰v‰}‰‰€‰…‰†‰ˆ‰‘‰–‰š‰Ÿ‰³‰·‰Ú‰àŠ ŠLŠlŠtŠ|Š‰Š¨Š°ŠºŠæ‹‹6‹V‹b‹†‹‹•‹™‹¦‹Ë‹Ù‹úŒŒŒ ŒŒ&Œ2ŒSŒ]ŒaŒeŒhŒrŒ|ŒŒŒ„ŒŒŒ”Œ£Œ¯Œ³Œ¼ŒÀŒÊŒÔŒÙŒãŒíŒ÷APWhqwƒ–™¢¯·source_maps.builderSourceMapBuilder_entriesaddFromOffsetsourcetargetFiletargetOffsetidentifieraddlocationaddSpantargetisIdentifiernametextstartaddLocationbuildfileUrltoJsonincludeSourceContentsEntryidentifierNamecompareTootherressourceUrltoStringsource_maps.parserbuilderMappingspanForlinecolumnfilesurispanForLocationMultiSectionMapping_lineStart_columnStart_mapsfromJsonsectionsotherMapsmapUrl:sync-for-iteratoriteratormoveNextsectioncurrentoffset[]section missing offsetoffset missing lineoffset missing columnurlmapsection can't use both url and map entriessection contains refers to , but no map was given for it. Make sure a map is passed in "otherMaps"section missing url or mapisEmptyexpected at least one section_indexFori=Invalid source url id. , Invalid name id: _consumeNewSegmentforEachvaluestartsWithx_filesourcesfromEntriessourceEntriessortlineNumtargetEntriessourceEntry>urlIdputIfAbsentsourceEntryIdentifierNamekeysfirstentrynextLine;segmentnewUrlIdsourceUrlIdsourceLinesourceColumnsourceNameIdresultversiongetText_appendoldValuenewValuewriteAllseenInvalid entry in sourcemap, expected 1, 4, or 5 values, but got . targeturl: , line: _findLinee<=_findColumnlineEntrylastgetOffsetspanpointSpanresolvetargetUrl: , sourceRoot: , urls: , names: , lines: debugString: --> ( TargetLineEntry TargetEntry_MappingTokenizer_internal_lengthunary-internalnext_TokenKindLINESEGMENTEOFVALUEisEofparsejsonMapparseExtendedparseJsonExtendedparseJsonunexpected source map version: . Only version 3 is supported.map containing "sections" cannot contain "mappings", "sources", or "names".source_maps.source_map_spanSourceMapSpanendSourceMapFileSpan_innercontexthighlightcolorunionexpandmessagereplaceAllFileSpan_contextnoSuchMethodsource_maps.utilsbinarySearchlistmatchesminmaxhalf~/source_maps.src.vlqVLQ_BASE_SHIFTVLQ_BASE_MASKVLQ_CONTINUATION_BITVLQ_CONTINUATION_MASKBASE64_DIGITS_digitsMAX_INT32MIN_INT32encodeVlqexpected 32 bit int, got: signBit<<|digit&>>decodeVlqcharsstopshiftincomplete VLQ valuecharinvalid character in VLQ encoding: negateexpected an encoded 32 bit int, but we got: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/package:source_maps/builder.dart@getters@methods@constructorspackage:source_maps/parser.dart@setters@factoriespackage:source_maps/src/source_map_span.dartpackage:source_span/src/span_with_context.dartpackage:source_maps/src/utils.dartpackage:source_maps/src/vlq.dartdart:convertpackage:source_span/source_span.dartdart:coreObjectList_GrowableListpackage:source_span/src/location.dartSourceLocationpackage:source_span/src/file.dartSourceFileintStringArgumentErrorcheckNotNullFileLocationpackage:source_span/src/span.dartSourceSpanboolNullMapjsonEncodeComparablenum==UriIteratorIterableFormatExceptionStringBufferType_literal2fromfromStringStateError_ListIndexErrorRangeErrorjsonDecodeSourceSpanBaseSourceSpanWithContextpackage:source_span/src/span_mixin.dartSourceSpanMixinPattern_InvocationMirror_withTypeSymbolunmodifiableInvocationdart:mathpow_Override_ImmutableMap_kvPairsmŠû?û¯û÷ààä,1Zsb”emŠx«ÍïE0000000000 €Ú€ò€™€­0€ºH€Øj€øˆ0<\€š€ª€®€Â€Ð€×€ê€ò€Ù€ä€ùvsv  €†`j`GQ€†`jM`s€€†`j|`ÂÍ€†`jÉ`ÿ˜ÿ  *€†`j` :O€†`jC` _r€†`jf` ‚”€†`j‰`‰"‰ €Ú €ö€™)€­G€º[€øu‚—‚œ `ƒ8ƒ;€ `„7„M€ ] `„J$`“„˜„¥€ `%!†£†®€€`+-‡‡8‡{j‡`& ‡B‡{‡J`‡Q [j`( `? ‡^/v‡k€‡f‚t`)+ ‡w‚€.‡í‡íˆEˆˆEˆ `ˆ [j`( `? ˆ$/vˆ1€ˆ,‚Í] `, ˆA‚Ù/ŠŠŒŠ$ŒŠ3]-`ŠB [j`( `>ŠÇŒEŠÍŠÖŠØ`“xŠß‚ŠÝƒZvŠïvŠá. `%`/a`0`13ŠŠ÷ƒZxŠø‚Š÷ƒZ”a`0`4>ŠüŒN‹‹ `x‹v‹ . `%‚‹ƒZa``6I‹$‹*ƒ‹(ƒÉj‹-`a``17>‹2‹àN‹„‹†`x‹Š‚‹ˆƒZ”a`0`4I‹—"x‹„‹›„'v‹®v‹ . `%`/a`0`18!‹Éx‹Åv‹¸. `%„‹Æ„'a``6j‹Ì`a``17=‹‹ÑƒÉj‹Õ`??I‹è‹îƒ‹ìƒÉj‹ñ`a``17=xŒv‹ö. ] `xŒ‚ŒƒZ”a`0`4a`\9?#%ŠZŠVƒ<`Šj;Špƒ<`&Š{Šwƒ<``Ч=xн€Š°ƒ+^`1] `? ŠA „Ö„Þ„ü@„å„ü`J„èv„öv„è. `%`/…(…0…K@ …6…K`J…9v…Ev…9. ] ``/#ŒšŒ£Œÿ@!Œ§ŒÿŒ¬"`Œ¹#`j`( `<>Œ¿Œÿ=#ŒÉŒÅ†f‰ŒÅ†fvŒÍ.`+`JŒÙŒà[.€Œð†[Œ÷†f`$*7k@$?kD%``0JO\;.€d†Ü%§«·@&²··%``>¿·IÅxЀɇ“a`0`13>ÕŽ=0ÝãD$Ž''€Ž‡'(IŽ&xŽ1€Ž*‡)vŽ3.`a`0`1E>Ž;ŽÀ=0ŽCŽID$ŽS'*€Ž]‡'+',vޱ.`'(?IŽÇxŽÒ€ŽË‡vŽàvŽÔ. ] `-`Ga`0`13JŽçxŽî”.a`I?IŽöx€Žú‡vv. ] `/`Ja`0`18Jx0v)v. ] ``/0”a`0`K?I:x>.1€P‡a``1'JYukv`.`?=ws.x—x.2€‡a``(0”a`0`K!J u²v§.`'v{’È@1Œ’È‘%``1>™’ÈIŸ¯v£.`J¸*?NÐÛ3`uèvÝ.`I‘x‘&€‘‰Gx‘3v‘(. ] `‘4‰ya``6a`0`13J‘A*?I‘{"x‘Š‘‰yx‘ v‘™v‘. ] ``/0”a`0`Ka`0`18x‘¶€‘¯‰Gx‘Ãv‘¸. ] `x‘ϑĉy”a`0`4a``6a`0`13>‘Õ‘îJ‘Ý)?I’"x’)’‰yx’?v’8v’,. ] ``/0•a`0`Ka`0`18x’U€’N‰Gx’bv’W. ] `x’n’c‰y•a`0`4a``6a`0`13>’t’±=w’|.x’•’Љy”a`0`4!J’ )?J’¸*(“Y“]”y@2“j”y“o%``>“w”yN““…4`“N“’“–5`x“«v“¤v“˜. ] ``/0”a`0`KC“´x“¿“»‹ß‚“Á‹ía`0`13>“Æ”dN“Ô“Ù6`x“ߓۋßx“îx“ç‚“ã‹í0“é‹ßa`0`K7•a`0`La`0`4I“ûx”x” v“ÿ. ] `ƒ” Œ\a``6)€”‹Æa`0`1E>””7=Š”%‹íƒ”+Œ\>”>”^=‰”H‹ßx”Sƒ”NŒ\”a`0`4J”k‚”r‹í)•B•F˜G@8•O˜G•T%`•b9`j`( `>•i˜GI•ox•z€•sm“a`0`13>••É=0•‡•D$•Â''€•ºm'(I•Ðx•Û€•Ôm)v•Ý.`a`0`1E>•å–m=0•í•óD$•ý'*€–m':';v–^.`'(?I–t–}–xy>–†–ª=‰–Žyx–•.&€–ma``%I–±x–º–µy`“a`0`13>–¿—=0–Ç–ÍD$–þ'<–øy`'(I— x——y`v—. `a`0`18>——“=0—'—-D$—7'=—?y`'>'?v—…. `'(?N— —ª@`x—·v—¬. ] `—¸y`a``6I—Ãx—Ñ‚—Ç )€—Óma`0`1E>—Û˜#=0—ã—éD$˜'=—ûy`'A€˜m'(?J˜*x˜8€˜1m0‚˜: a`0`K*˜¡˜¥›@B˜®›˜³9`˜¿C`j`( `>˜È›=#˜Õ˜Îÿ‰˜Îÿ“+`I˜áx˜ê€˜åô“a`0`13>˜ï™5=0˜÷˜ýD$™.'<€™(ô'(I™™O™Ã=0™W™]D$™g'=€™oô'>'?v™µ. `'(I™Êx™Õ™Îÿ`“a`0`13>™Úš$=0™â™èD$š'Dšÿ`'(?Nš1š8E`xšLxšEvš:. ] `€šFôa``6šNÿ`a`0`4IšZ"xše‚š^‘ )všg.`a`0`1E"xšƒxš€šzô”a`0`4vš…. `a`0`13xš•‚šŽ‘ xš£vš˜. ] `xš©€š¤ô”a`0`4a``6a`0`18>š°šú=0š¸š¾D$šó'=€šÐô'Fšãÿ`'G?J›‚›‘ +›¤›«œ @H›²œ ›·"`›Ä#`j`( `J›Ó›ÚNx›öv›è. `%I€›þ’¦œ’±^```%PÀþAÂÿ , « SÚŒ 0 ŸêJ`€®`€š2¡¥€K`3ÀÆ€%j«` `;žhžhŸ LžvŸ ž|K`ž‡%``0>žŸ Iž•xž vž™.%`3“a`0`13>ž¥žï=0ž­ž³D$žè''vžà.%`3'(IžöxŸvžú.%`3)vŸvŸ.K`2`a`0`1E>ŸŸœ=0ŸŸD$Ÿ('*vŸ2.%`3'+',vŸŒvŸ‡.K`2`'(?2€“›3“¥ žh€¹4Ëàõ@MjÌ` êõ`Jívòví.K`2 `5úžž*@9jû` žž*`Jžxžvž.K`2&vž#.%`3a``%6ž/žCžc@Cjž0` žJžc`JžMxžRvžM.K`28vž\.%`3^`9``)8Ÿ¥ŸºŸè@NjŸ¦` ŸÃŸè`<JŸÉŸÉ[vŸÓ.K`2vŸÙ.%`3vŸá.%`3¤çB¨ÿ<¡~¡£7O``D¡ `<? A>¡ä¡ó¡÷BK¡÷¡÷`?¡ü¢¢B"j¡ý` ¢¢`0@¢#¢@¢CB#j¢$` ¢C¢C`0B£££5BP£%£5£/Q`<`<WwŸÇñE¤B¤Hµ¿R`€ù`<G¤Ÿ¤£€Kj¤ƒ` `I¥B¥H€S`J¥ß¥ã€T`[«š«š­7«£­7«©K`«´S`«ÁT``E>«Ç­7I«Íx«Öv«Ñ.T`Jv«Ø.S`Ia`0`13>«à¬-=0«è«îS$¬&'Uv¬.T`J'Vv¬.S`I'(I¬4x¬=v¬8.T`J)v¬Dv¬?.K`G`a`0`1E>¬L¬Ó=0¬T¬ZD$¬d'Uv¬k.T`J'+',v¬Ãv¬¾.K`G`'(I¬Úx¬åv¬Þ.S`I“a`0`13>¬ê­3=0¬ò¬øD$­,'Wv­$.S`I'(?G€—vI—€J‚—‹ «š K¥è¥ý¦@Mj¥é` ¦¦`J¦ v¦v¦ .K`G `L¦¦+¦B@j¦` ¦2¦B`J¦5x¦:v¦5.T`J0v¦<.S`Ia`0`KM¦G¦d¦‰@"j¦H` ¦j¦‰`0J¦m¦z;v¦|.K`Gv¦‚.S`IN¦Ž¦«¦Ì@#j¦` ¦¯¦Ì`0J¦²¦¿;v¦Á.K`Gv¦Ç.T`JO¦Ñ¦è§ @j¦Ò` ¦í§ `J¦ðx¦õv¦ð.K`GHv¦ý.S`Iv§.T`J^```+P§§&«•@Xj§` §.«•`>§.«•N§:§BY`x§Iv§D.K`G&v§Q.T`Ja``%N§b§lZ`x§sv§n.K`G8v§}.T`J^`9``)N§Ž[`I§"§«§¡›“a``17!§»€§³šÝ“a``17>§Á©éI¨y¨„v¨}.`L“a``17>¨Š©ÊJ©/#©>€©6šÝx©Lv©Fv©A.K`G `0”a`0`Ka``17'x©tv©o.K`GHx©’v©.K`GB€©œšÝ^```*x©«v©¦.K`GBx©½€©µšÝ”a`0`4^```*^```+`?=Щӛ`v©ß.T`JI©ð©ü€©ôšÝxª vªv©ÿ.K`G `0”a`0`Ka``17>ªª®=Šª‘›`vª¢vª.K`G`>ªµ«F=Š«›`x«*v«%.K`GBx«<€«4šÝ”a`0`4^```*J«Mx«Yv«T.K`GHx«fv«a.K`GBx«uv«p.K`G&v«}.S`Ia``%^```*«‡›``^```+U­<­L®@\j­=` ­U®­aQ`€Â`>­h®I­n!%­x€­ržJ`EJ­‡­”\€­žžJ€ÿ?N­±­¸E`x­Áv­º.S`I\v­Ñ­ËžJ`ES`Ia`0`TJ­Þ#­ì­åžˆ“a``17x­øv­ó.T`J\v®®žJ`ET`Ja`0`T®žˆ`V®®6°@]j® ` ®;°®GQ`€Â`€Â>®N°I®T!%®^€®XŸR`®Å¯PI®Í"x®Øv®Ñ.S`I)v®à®ÚŸR`ET`Ja`0`1Ex®õv®î®èŸR`ES`I)v®÷.T`Ja`0`1E>®ý¯J=0¯¯ S$¯A'^.'_¯-ŸR`E'`?>¯W¯îI¯_"x¯jv¯c.S`I)v¯vv¯r¯lŸR`<#`0@%`3a`0`1Ex¯“v¯Œv¯†¯€ŸR`<"`0?%`3)v¯•.T`Ja`0`1E>¯›¯è=0¯¥¯«S$¯ß'^.'_¯ËŸR`<'`?J¯õ¯üŸW° °#±0@aj° ` °%±0°&Q``1>°-±0I°3!%°=€°7¡``°°ÂJ°‡"°”a°—¡``<°ªv° .M`Kv°³°­¡``²¬´£I²²!²Àv²¶.M`Kv²É€²Ã¢ÿM`€ûa``1U>²Ô³I=0²Ü²âS$²ï'cv³.M`K'd'ev³(€³"¢ÿM`€û'f?I³P%³Z€³T¢ÿ`E>³h³úN³v³|"`³~W`v³‡.S`Iv³•³¢ÿ`ES`IN³ª³®#`³°X`v³¹.T`Jv³Å³¿¢ÿ`ET`JJ³Ò³Ù[v³ã.K`G³é£š‚³ð£×>´´ŸN´´"`´W`v´ .S`Iv´4v´.€´(¢ÿ"`0?%`3N´I´M#`´OX`v´X.T`Jv´hv´d€´^¢ÿ#`0@%`3J´w´~[v´ˆ.K`G´Ž¤;‚´•¤|Y´Ñ´Úµ½@g´áµ½´æ"`´ó#`j`( `<>´ùµ½=µ Z€µ¤÷µ!¥vµ&.`LIµ3"µ=€µ7¤÷“a``17"µJµF¥µYµU¥`vµ\.`La``17Jµe.?Jµvxµ‚vµ}.K`G!xµŽvµ‡.S`I€µ¤÷a`0`4#µ›µ—¥vµ¥.T`Jxµ³vµ¬.S`Iµµ¥`a`0`4`^```<#S‚S‚S€Àh`J‚S&‚S x‚S.i^j‚S`_ ”j] `` j] [‚Sc`_[j]a`_[a`d[f`D£ï;­(0!>"©"Ý$Ý&7&» s\j¶D`<ggÉÑ€†k`jÏ`Ý倆l`jã`¶¶˜·Åam¶Ÿ·Å¶˜n`<¶¤"`¶±#`j`( `<>¶··Å=¶ÈZ¶Ø§h‚¶ß§sv¶ä€¶ä§^`€üI¶ñ"¶û¶õ§h“a``17"·‚·§s··§s`v·€·§^`€üa``17J·#€·*§^?N·;·Go`v·Tv·N€·I§^"`0?%`3J·`x·lv·g€·g§^K`>!x·†ƒ·z¨·ˆ§ha`0`4#·“‚·§sv·¦v·¢€·§^#`0@%`3x·»ƒ·¯¨·½§s`a`0`4`^```<#¶˜·Åap¶˜·Å¶˜n`<^```<J¶˜4¶˜¶˜·Å¶¤"`¶±#`j`( `<J¶˜¶˜€¶˜¨÷¶˜©)‚¶˜©4)gä@ &ø'D(Þ)g ] €Ú €÷g$hqJir™s¹€™Ñ€ºå‚^‚h‚nÀKÓt`a‚Ü‚â€u]] `€bƒlƒy€v]`c„ „€w]`d„f„{€x]`e„î…€y]`f…U…c€z]`1g……µ€{]`j…§lh†|†€†|]`j†Œ`{‰‰Š‰&Љ2!`€Â‰9}[j`( `^? ‰N~‰Pl‰^$`‰_€Ž€‰jªÆ~)}Š4‰‚‰‚Š`>‰…Š I‰‘‰›‰•ªÒ)a``1mJ‰¤j‰²`?I‰Á‰Ë‰ÅªÒ*a``1mJ‰Õ+?J‰ì&‰ù‰óªÒ`a`+|kk’’‹€€`€ÂŸ€`Ë€‚]a`€Â`ç}`1jï`1þ€ƒ`j`( Ž€„`j`( `^? Ž2~ŽAlRNŽO] `ŽO$`Ž_€Ž€Žj«¯€…Ž~«»~)>NŽË€†]n]o`€Â`vŽËvŽË‚޼«Ç€‡]-]o`€Â`q€ˆ]n]o`€Â`rExŽË‡¬f€‰a`1t>N޳€Š]o`€Â`v‡¬f€‹]o`€Â`v=xŽä†ŽO¬/Žä€ŽvŽõŽï¬Þ€Œ`€Âx€…v¬Þ€`ya`\9†ŽO¬/#ƒ*«Ý5@3`„3«ð#3†3­hjJ`3­h``+`#ƒc«Ý5{l`…l¬#l†l­¨j…`l­¨``+`~——’ÔL]¤’Ôªu] `€·v`Ëw``^?a€­øb®c‚®dxþ” X`v‘x‘x‘ v‘v‘€ù­ø/`€J€Ž`€’”a`0`4€a`z`{#‘¦k€‘²­ø“–`a`0`4ex’|x‘õ€‘á­ø€`4‘ù‘ù’m‘ú9`€`J’v’gx’$v’ƒ’®ú€‘] `€”€’4’*’*’T’+€“``1J’9’9v’O„’E¯B!`€aa``1]-`|`}aa`€`]-`~€”6j’ˆ^€•`0`0___`aa````f!’¨x’¼€’µ­ø€`4’À’À’Ò’Á9`€`J’Êv’σ’ʰ% `€“aa`€`]-`~ —Ak“^“j”—A€–]“u”—“‚ ] `€`1>“‰”—E““˜“š`“x“¡“Ÿ°°x“°v“©€“£°`/0”a`0`Ka`0`13‰“µ°°x“¶“µ°°”a`0`4>“º”‚N“ȓр—`€x“Ø€“Ó°“Ù°°a``€6N“é“ò€˜`€x“ù€“ô°x“ü“ú°°”a`0`4a``€6I”"!” x”v”‚” ±0€Ž`€’”a`0`4v”,ƒ”#±`€Ž`€’a``17”Mv”I‚”@±0 `€“v”Yƒ”P±` `€“a``1U>”^”|J”h*?J”ˆ)l•.•AñA€™]•Nñ•`€‘] `] `€>•lñN•x•ˆ€š]a`] `•Š‚``€•­²\4•¹•¹•à•º€“``J•Èv•×v•ҕȲ»!`€M`€û>N–€†]n] `v–v–•ø²€›]-] `ƒ€ˆ]n] `rEx–‚²ô€‰a`1t>N•ð€œ] `v–‚²ô€‹] `v>––y=x–ƒ–³]€4–"–"–r–#€ž`–/€Ÿ``J–Hx–Xv–S„–H³¦!`€\v–m…–b³±!`€a`€Â`€ÿ^a```\„J–€xåx–žv–—–‡²€›]-] `ƒP`€4–¥–¥ã–¦€ ] `] `€>–¹âN—K—Q ] `€—Z…`€“>N—z€†]n`v—z‚—z´Z€ˆ]n`rEx—z„´¡€‰a`1t>N—m€“`v—„´¡€‹`v>—š¿N——¥X`v—¶v—±…—§´ê!`€X` N˜T˜^@`u˜µ˜`†˜{µ v˜“v˜Ž…˜„´ê!`€`€Ôv˜®v˜¨v˜£…˜™´ê!`€"`€š€ÒC`€ŸN˜Ç˜×€¡`v™x˜ê'€¢€£x˜ý†˜õµ €¤“‡™ µ6^```‡^``]-`ˆ‹`}N™-™1 `v™Bv™=…™3´ê!`€M`€ûN™Y™d€¥`x™€v™{v™uv™p…™f´ê!`€"`€š€Ò9`€ž0™‚µša`0`K>N™´€†]n`v™´x™´†™¬µ €¦'€¢a`‰] `Œ€ˆ]n`rEx™´¶ €‰a`1t>N™¤9`v™Á¶ €‹`v>™Áš·Iš"vš)ƒš#´}€§`1xš?š4¶5 )všLvšGƒšA´}/`€J€Ž`€’a`0`1E>šTš•=xšhƒšb´}šl€˜šr¶ý šx¶5 š„¶ a`€\9?=š¡¶5 xš«š¡¶5 ”a`0`4N››'€¨] `›5…`“N›C›R€©`“>N›n€†]n`€v›nƒ›n´}€ˆ]n`€rEx›n†¸€‰a`1t>N›f9`€v›u†¸€‹`€v>›uÇ=x›„›·Ý€ª4›œ›œœ›€“``1J›·"!›Ðv›Æv›Á›·¸š!`€M`€ûv›Ø‡›Ó¸Z `€“a``1Uxœv›þv›úv›õ›ë¸š!`€#`€š€Ó9`€žvœ ‡œ¸Z€Ž`€’a`0`13aa``1\ŽNœ"œ5€«`vœH„œ7·Ý`/A>Nœ€€†]n`vœ€xœ€‚œn´Z€¬…œ…·üa`]-`€ˆ]n`rExœ€¹€ €‰a`1t>Nœa€“`vœ–¹€ €‹`v>œ–DIœ¢xœÀvœ»vœµvœ°œ¦¹í !`€"`€š€Ò9`€ž)vœÇ‡œÂ¸Z€Ž`€’a`0`1EBœÏ?Iœà!œývœóvœîœä¹í !`€M`€ûv‡¸Z `€“a``1UB ?=x,„·Ý0¹í a`\9=N·üx]…N·üxxvq„`·Ý`/0z¹\a`0`Ka`0`4=x§vœ‡—¸Z€‘] `€”€­„®·Ýa]-`\JЃ״}aa] `]-`€]-`€‘^`1] `€?yžSžZ¨Ý@€“žc¨Ý`>žf¨Ý=xžl.€®]vž‰vžƒvž|.u]] `€a-`€G `€“a`\mNŸŸ €¯] `Ÿª”`vŸÃ.y]`eEŸãŸìŸî`“xŸõŸó¼FvŸþvŸ÷.u]] `€a`/a`0`13‰ ¼Fx  ¼F”a`0`4>  ¨” N  9`€x &v  .u]] `€a '¼Fa``€6I 1x 7 5¼F)“a`0`1E> <¡‡N L U€°`€x ]v W.u]] `€ax ` ^¼F0”a`0`Ka``€6I n! v {ƒ r½ `€“v ‡‚ ‚¼º `€“a``1U> Œ¡=x ˜.€±]# ±—^#`9``\u=x Ëv Ã.{]`jg€²^`\™=x à.€®]v õ‚ ð¼º `€“a`\mI¡ !¡"x¡v¡ƒ¡½€Ž`€’”a`0`4v¡*‚¡%¼º€Ž`€’a``17>¡2¡=x¡>.€±]'€³^#`9``\u=x¡lv¡d.{]`jg€²^`\™??>N¢å€†]n`v¢åv¢åv¢Ú‚¢Õ¼º€‘] `€”€´]-`š€ˆ]n`rEx¢åƒ¾é€‰a`1t>N¢È€“`v¢ïƒ¾é€‹`v>¢ï¤I¢ù""¢ýv£„£ ¿T!`€£Bv£=v£7v£2„£(¿T!`€"`€š€Ò9`€žv£J‚£E¼º€Ž`€’a``17x£`.€µ]x£v£ˆ‚£ƒ¼º`€‘€¤“v£¯v£©v£¤„£š¿T!`€"`€š€ÒC`€Ÿ^```‡a``1w>£¹£þ=£Å`€£Ö¼„£ê¿T?=x¤.€±]9v¤(‚¤#¼º€Ž`€’^#`9``\u=x¤?v¤7.{]`jg€¶'€·a`\›=x¤Q.€¸]‚¤k¼º€¤q¼^`€] `€‹`\nI¤Œv¤£€¤¼€¹`1œ=x¤·v¤¯.{]`jg€¶'€·a`\›?N¤Ð¤Û€º`x¤÷v¤ì‚¤ç¼º€‘] `€”€»4¥¥¥$¥€“``1J¥v¥ƒ¥ÀAŠ€¼`1€‚^a``1``N¥3¥;~`#¥Hƒ¥=ÀAOx¥K”.a`Ia``17+x¥fv¥\‚¥W¼º€‘] `€”ƒ¥gÀAOa``6`I¥{!¥‡„¥ÀAÓ>¥¦ä=x¥š.€½]v¥Â‚¥½¼º`€‘#¥ìv¥çv¥áv¥Ü¥ÔÀAÓ`!`€"`€š€Ò9`€žv¥ô‚¥ï¼º€Ž`€’a``17v¦ v¦v¦¦ ÀAÓ`!`€"`€š€ÒC`€Ÿ“`#¦^v¦Yv¦Uv¦P¦HÀAÓ`!`€#`€š€Ó9`€žv¦f‚¦a¼º€Ž`€’a``17v¦v¦Œv¦‡¦ÀAÓ`!`€#`€š€ÓC`€Ÿv¦³v¦®‚¦©¼º`€‘`{`}v¦Î.v]`b^```}`\o>¦ë§=x¦õ.€¾]v§‚§¼º`€‘a`\t=x§"v§.{]`jg€²^`\™I§§!§³„§«ÀAÓ=x§¼.€¿]‚§Ì¼º§ÒÀAÓ`€§Û¼a`€`] `\p?>N¨€†]n`v¨v¨‚¨ ¼º€‘] `€”€ˆ]n`rEx¨…ÀDx€‰a`1t>N§ÿ€“`v¨…ÀDx€‹`vA>¨¨ŽI¨'v¨5†¨+ÀDÔ€¼`1€‚B¨@?=x¨R.€¿]‚¨b¼º†¨hÀDÔ€¨s¼a`€`] `\p=x¨›.€±]#¨´—^#`9``\uJ¨Àx¨Ïv¨Ç.{]`jg€a`žm©<©Aªœ@€®]©Pªœ©V `\>©[ªœI©a"!v©f.z]`1f©|€©xÀE»>©…©´=x©.€±]#©¦Ÿ^#`9``\u>©»ª=x©Ã.€±]#©Ü ^#`9``\u=x©ò.€À]4©ü©üª/\Jªxª vª.{]`jg€¶$ª.xª(ª¡€Á•a``¢')a`\›}jªI`^a\}`\x=xª^vªV.{]`jg€¶$ªz'€·ªh¤ªtÀE»`a`\›=xªvª‡.{]`jg€²^`\™n«Û«àµ`@€¸]«ùµ`¬9`€¬€¯] `¬F€‹`j`( \>¬Pµ`N¬û­ €Â`1*N­!€Ã`N­C­P€Ä`#­Z‚­RÀG‡+#v­ƒ­{ÀG‡`€¼`1€‚v­›.v]`bv­·.w]`c``N­Ð­Ý€Å`1*>N®€†]n`v®®ÀGv€ˆ]n`rEx®‡ÀH*€‰a`1t>N­ó€“`v®‡ÀH*€‹`v>®µ\N®"®,€Æ`5®.®.`®.ÀHw#®.®.ÀH« +v®Dv®>v®9®.ÀH« `!`€"`€š€Ò9`€ž`N®V®^Y`5®`®``®`ÀHw#®`®`ÀI +v®tv®pv®k®`ÀI `!`€#`€š€Ó9`€ž`I®€"!®Œ‚®„ÀG‡®¡®—ÀHw®¤ÀG‡`a``1m>®­¯Ì=Ž®·ÀH)@"®å®ÛÀH› v®í€®èÀGk€Ž`€’a``17®ÿ®÷ÀI v¯€¯ÀGk€Ž`€’a``17®Û¯ =x¯.€À]4¯"¯"¯®\>¯%¯­=x¯9v¯1.{]`jg€¶#¯I¯?ÀH› v¯Q€¯LÀGk€Ž`€’a``17¯n ¯’¥`a`\›}…¯·ÀG¿^a\}`\xI¯Ó†¯×ÀH>¯å°v=x¯ï.€À]4¯ù¯ù°X\>¯ü°W=x°v°.{]`jg€¶#° °ÀHw°0¡°G¦`a`\›}…°aÀG¿^a\}`\xI°}°‹°ÀHw>°”±aI°žƒ°¢ÀG£>°´±*=x°À.€À]4°Ê°Ê°ó\J°Ðx°Øv°Ð.{]`jg€¶°ä¡a`\›}„± ÀG²^a\}`\x>±1±Y=x±Ev±=.{]`jg€¶'€·a`\›>±hµV=x±r.€À]4±|±|µ\>±µN±‘±š€Ç`#ƒ±œÀG£±µ¦±Ã§`I±Û!±ç‚±ßÀG‡>±ð²!=x²v±þ.{]`jg€¶² ÀL/ a`\›I²(²6²,ÀH› v²>€²9ÀGk€Ž`€’a``17>²F³”=x²T.€À]4²^²^²×\>²a²Ö=x²Œv²q.{]`jg€¶²’©#ƒ²¥ÀG£'€È'€É`'€Êa`\›}„²àÀG²^a\}`\x=‹³ÀG£)=#³?„³)ÀG²Œ³)ÀG²#v³]³SÀHw`€¼`1€‚v³i.v]`bv³y.w]`c`+`I³›"³§³ŸÀI v³¯€³ªÀGk€Ž`€’a``17³áv³Úv³Öv³Ñ³ÇÀHw`!`€#`€š€ÓC`€Ÿv³îv³é€³äÀGk`€‘`{a``17>³ö´=x´ v´.{]`jg€¶#´"v´´ÀHw`€…`€ƒ´<©'€Ë'€Ì´lÀL/ `a`\›>´ˆµ=x´–.€À]4´ ´ ´Ù\>´£´Ø=x´»v´³.{]`jg€¶´ÁÀL/ a`\›}„´âÀG²^a\}`\x}#vµ"µÀHw`€¼`1€‚vµ..v]`bvµ>.w]`c`^a\}`\xoµØµÝ· @€½]µò· µú`¶€Í`¶Z`¶8@}`j`( \>¶@· =x¶F.€¾]x¶V€¶QÀO…€¤“¶cÀO^```‡a`\t=x¶v.€À]4¶€¶€¶¸\J¶†x¶†.€¾]x¶–€¶‘ÀO…€¤¶ ÀO‚¶­ÀOœ^```‡a`\t}ƒ¶ÉÀO¨^a\}`\x=x¶Õ.€¾]x¶å€¶àÀO…€¤‚¶ïÀOœv¶ÿ€¶úÀO…`{^```‡a`\tp·»·À¾â@€¿]·Ï¾â·Ý9`€·î€“`¸ €¯] `\>¸¾âN¸+¸1}`#v¸=¸3ÀQ€¼`1€‚v¸I.v]`bv¸Y.w]`c`I¸n!¸sv¸‰¸ÀQ!`€>¸º1=x¸˜.€±]^#`9``\u=x¸·v¸¯.{]`jg€¶'€·a`\›=x¸É.€¸]€¸ãÀQ‚¸éÀQ(€‹¹ÀQ^`€] `€‹`\nI¹v¹/‚¹ÀQ(€¹`1œ=x¹Cv¹;.{]`jg€¶'€·a`\›?=x¹V.€À]4¹`¹`º\>¹cº=x¹m.€Î]€¹}ÀQv¹¹ƒÀQ!`€#v¹©¹ŸÀQ€¼`1€‚'€Ï¹Áª`a`€`€Â`\q=x¹Þ.€Ð]v¹ô¹êÀQ€…`€ƒa`\s}ƒº ÀQC^a\}`\x=xº"vº.{]`jg€²^`\™Iº8ºVvºQvºKvºFº<ÀQ!`€"`€š€Ò9`€žvº^€ºYÀQ€Ž`€’a``17>ºf»ÖIºnxº…‚ºrÀQ(€ÑºŽÀQa``1«Jºš?=º¨`‚º¹ÀQ(ºÍÀQ=xºà.€±]^#`9``\u=xºÿvº÷.{]`jg€¶'€·a`\›=x».€¸]€»+ÀQ‚»1ÀQ(€‹»NÀQ^`€] `€‹`\n=x»`.€À]4»j»j»ž\J»px»p.€Ò]€»|ÀQv»—v»‘v»Œ»‚ÀQ!`€"`€š€ÒC`€Ÿ^`€`€Ó`1\r}ƒ»±ÀQC^a\}`\x=x»Çv»¿.{]`jg€²^`\™I»Ý»ùv»ôv»ðv»ë»áÀQ!`€#`€š€Ó9`€žv¼€»üÀQ€Ž`€’a``17>¼ ¾ÞN¼¼'€Ô`1¼Cv¼¼Ž¼Þ=¼˜`‚¼¨ÀQ(¼¼ÀQJ¼Ð?=x¼ç.€±]^#`9``\u=x½v¼þ.{]`jg€¶'€·a`\›=x½.€¸]€½2ÀQ‚½8ÀQ(€‹½UÀQ^`€] `€‹`\n=x½h.€À]4½r½r¾z\>½u¾yI½„½ƒÀUÄ>½”½Ñ=x½¨v½ .{]`jg€¶x½Ã½´¡€Á–a``¢a`\›>½Ø¾K=x½ä.€Ò]€½ðÀQ½öX`x¾v¾v¾v¾ ½ÿÀQ!`€#`€š€ÓC`€Ÿ0”a`0`K“€Ó*^`€`€Ó`1\r=x¾U.€Ð]v¾k¾aÀQ€…`€ƒa`\s}ƒ¾ƒÀQC^a\}`\x=x¾™v¾‘.{]`jg€²^`\™=¾ª`‚¾ºÀQ(¾ÎÀQ?q¿N¿SÀB@€Î]¿bÀB¿i9`€¿z!`€Â¿‡€Õ`\>¿’ÀB @!¿ ¿¬ÀXÅ¿Ÿ¿±@x¿Év¿Ä€¿¿ÀXº`€‘€Ñv¿×¿ÒÀXÅ`€Æ^`‰``1¬¿¿¿ÜN¿è¿ô€Í`vÀ@v¿û¿öÀXÅ"`€š€ÄC`€ŸNÀ@À@Z`vÀ@&vÀ@"À@ÀXÅ#`€š€ÅC`€ŸNÀ@ŸÀ@ª€Ö`xÀ@¬.€×]xÀ@ÁvÀ@¼€À@·ÀXº`€‘€¤“ƒÀ@ÎÀYN^```‡a``vNÀ@çÀ@ò€Ø`xÀ@ô.€×]xÀA vÀA€À@ÿÀXº`€‘€¤ƒÀAÀYN„ÀA ÀY}^```‡a``v=‹ÀA1ÀYNxÀA=ƒÀA1ÀYNxÀAK…ÀA@ÀY³€ÁxÀA\jÀAN`0”a`0`Ka`0`­a`0`4=ŒÀAfÀY}xÀAp„ÀAfÀY}xÀAxÀA…ÀAtÀY³†ÀAÀZ&a`0`4€ÁxÀAžjÀA`0”a`0`Ka`0`­a`0`4=5ÀA©ÀA©`jvÀA©.{]`jgR=xÀA¹‡ÀA©À[µ€¶xÀAÃ'€·€ÁƒÀAÅÀYNa``¢a`\›=xÀAÚ‡ÀA©À[µ€¶xÀAê‚ÀAàÀXЀÁÀAìX`xÀAÿ„ÀAõÀY}0ƒÀBÀYNa`0`K”a``¢a`\›‡ÀA©À[µrÀBòÀB÷ÀD@€Ò]ÀCÀDÀC 9`€ÀCC`ÀC!€Ó`1jÀC-`1\>ÀC4ÀDNÀC@ÀCE€Ù`xÀCO.€×]xÀCdvÀC_€ÀCZÀ\Í`€‘€¤“xÀCxÀCqÀ\Ú#‚ÀC{À\è“”`a`0`4^```‡a``v=5ÀC•ÀC•`jvÀC•.{]`jgR=xÀC¥„ÀC•À]±€¶xÀCÀÀC±¡€ÁxÀCÎxÀCÅ”ÀCÇÀ\Úa`0`4xÀCÕƒÀCÐÀ]€ÁxÀCæjÀCØ`0”a`0`Ka`0`­a`0`4a``¢a`\›=xÀCõ„ÀC•À]±€¶'€Ïa`\›„ÀC•À]±sÀDJÀDOÀDŸ@€Ð]ÀDZÀDŸÀDc€…`\>ÀDjÀDŸIÀDp!ÀDz€ÀDtÀ^î=xÀD‹vÀDƒ.{]`jg€¶$ÀDš'€·ÀD”À^î`a`\›?tÀEÀEÀEÞ@€¾]ÀEÀEÞÀE%`\>ÀE+ÀEÞ>NÀEG€†]n`vÀEGvÀEG€ÀEBÀ_…] `,€ˆ]n`rExÀEGÀ_¥€‰a`1t>NÀE:€Ú`vÀERÀ_¥€‹`v>ÀERÀEÚIÀEZÀEc‚ÀE^À`jÀEf`a``17>ÀElÀE =xÀE~vÀEv.{]`jg€¶xÀEˆ'€·€ÁjÀEŠ`a``¢a`\›>ÀE§ÀEÔ=xÀE¹vÀE±.{]`jg€Û‚ÀEÇÀ`a`\®uÀFõÀFúÀH¹@€±]ÀGÀH¹ÀG9`j`( ÀG`j`( ÀG*#`j`( \>ÀG0ÀH¹@"ÀGB€ÀG=Àa#ÀGRÀGMÀa7ÀG=ÀGYIÀGà!ÀGé€ÀGäÀa#=‰ÀGòÀa7xÀHxÀGÿÀGúÀa#`”a`0`4€a`z?=xÀH.€À]4ÀHÀHÀH \>ÀH!ÀHŸ=5ÀH)ÀH)`jvÀH).{]`jgR=xÀH;ƒÀH)Àb+€¶xÀHN5ÀHGÀHB`ÀHBÀa7#ÀHB„ÀHBÀbk'ÀHBÀbk``€ÜvÀHW.x]`d^```¯a`\›=xÀHyƒÀH)Àb+€¶5ÀHƒÀH`‚ÀHÀaK#ÀH„ÀHÀbùÀHŒ§ÀHÀbù``a`\›ƒÀH)Àb+}jÀH°`^a\}`\xvÀHïÀHóÀI‚@€×]ÀHýÀI‚ÀI``>ÀI ÀI‚NÀIÀI€Ý`“>NÀI:€†]n`vÀI:vÀI:€ÀI5Àc•] `,€ˆ]n`rExÀI:‚ÀcË€‰a`1t>NÀI-€Ú`vÀIE‚ÀcË€‹`v>ÀIEÀIlIÀIMÀIVƒÀIQÀd5jÀIY`a``17=‰ÀI_Àc´xÀIdÀI_Àc´”a`0`4?JÀIrÀIyÀc´wÀIËÀIÐÀJi@€µ]ÀIáÀJiÀIé``1>ÀIïÀJi>NÀJ €†]n`vÀJ vÀJ €ÀJÀdñ] `,€ˆ]n`rExÀJ Àe€‰a`1t>NÀIþ€Ú`vÀJÀe€‹`v>ÀJÀJTIÀJ"!ÀJ'‚ÀJ"Àe~jÀJ*`a``17!ÀJ9‚ÀJ4Àe~jÀJ<`a``17JÀJB*?JÀJZ)xÀJèÀJíÀKÑ@€À]ÀJöÀKÑÀK€Þa\ÀK#@}`j`( \>ÀK+ÀKÑIÀK1"!ÀKCvÀK5.v]`b!ÀKTÀKNÀfD=xÀKevÀK].{]`jg€¶ÀKkÀfD`a`\›?=}ÀK€ÀKwÀf5a\IÀK‡"!ÀK™vÀK‹.v]`b!ÀKªÀK¤ÀfD=xÀK»vÀK³.{]`jg€¶jÀKÈ`a`\›?0s2@;­EŸGOOiPöXš\§^È__`ücodËfg>ÀL ÀL&ÀbŠ€ß`€ÀLÕÀLÙ€!`€‚ÀMŸÀM¨€€¼`1€ƒÀNnÀNs€€…`€ŽÀNxÀNxÀO¿ÀN‚ÀO¿ÀNŽ!`€ÂÀNš€…`j`( ÀN¦~`1jÀN°`1`?€ƒÀh€}ÀO 4ÀNÈÀNÈÀOŸ`>ÀNËÀOžNÀNÛÀNã€à`ÀN倆€ÀN÷Àh=‹ÀOÀhÀO€‡ƒÀO%Àh=‹ÀO9ÀhÀOC€ˆƒÀO]ÀhJÀOqÀOx€‰ƒÀOŒÀha`€‚‚ÀO¸Àh) ÀNxA€†ÀQÀQ3ÀSqA€á]ÀQDÀSqÀQP!`€Â`JÀQ_#"%ÀQd€ÀQ_ÀiH`!ÀQÈÀQŽvÀQ¡ÀQœÀiH`X` vÀQ¯ÀQªÀiH``€ÔvÀQÀvÀQºÀQµÀiH`"`€š€ÒC`€ŸÀQÜÀiH`ÀQíÀR€©vÀR,vÀR&€ÀR!ÀiH"`€š€Ä%`€MvÀRV€ÀRQÀiHM`€Ç9“C“ÀR„€©vÀRœvÀR˜€ÀR“ÀiH#`€š€Å%`€MvÀRÆ€ÀRÁÀiHM`€Ç9ÀRévÀRý€ÀRøÀiH`€ÆjÀS`CÀS#€ŠvÀS8€ÀS3ÀiH`€ÆvÀSS€ÀSNÀiH`€ÆvÀSl€ÀSgÀiH`€Æ`€‡ÀSÐÀSíÀVHA€â]ÀSÿÀVHÀT!``>ÀTÀVHNÀT(ÀT-`vÀT4€ÀT/ÀkF`€ÔIÀT>!xÀTHÀTCÀke€Ñ'€ã^`‰``1¬JÀTZ€ÀTaÀkF?NÀTpÀTz[`vÀT…vÀT€ÀT|ÀkF#`€š€Ó%`€EÀT‘ÀTšÀTœ`“xÀT£ƒÀT¡ÀlxÀT±vÀTªÀT¥Àke`{0”a`0`Ka`0`13‹ÀT¶ÀlxÀT·ƒÀT¶Àl”a`0`4>ÀT»ÀU&IÀTÃ"ÀTÚxÀTÌÀTÇÀke€äƒÀT×Àla``°jÀTÝ`a``17ÀTûxÀTéÀTäÀke€äxÀTöƒÀTôÀl”a`0`4a``°jÀTþ`a``17>ÀUÀU =ŠÀU ÀkÓxÀU‚ÀU ÀkÓ0”a`0`K?JÀU-ÀU4vÀUX€ÀUSÀkF"`€š€ÒÀUg€©‚ÀUvÀkÓMvÀU€ÀU˜ÀkFM`€û9vÀUÃvÀU¿€ÀUºÀkF#`€š€Ó9`€žCvÀUævÀUâ€ÀUÝÀkF#`€š€ÓC`€ŸxÀUüÀU÷Àke€å'€ã'€¢a`‰``±xÀV+vÀV#€ÀVÀkFX` €å'€ã'€¢a`‰``±€ˆÀWÀW0ÀZçA€æ]ÀWIÀZçÀWg!``>ÀWmÀZçIÀWs!xÀW…vÀW}€ÀWxÀnÍX` €ç'€¢a``1²JÀW•€ÀWœÀnÍ?IÀX$xÀX2vÀX-€ÀX(ÀnÍ`€Ô€ç'€èa``1²JÀXD€ÀXKÀnÍ?NÀX\ÀXdX`xÀXsvÀXk€ÀXfÀnÍX` €¤“xÀX”vÀXvÀX…€ÀX€ÀnÍX` `{0”a`0`K^```‡NÀX¢ÀX§`vÀX®€ÀX©ÀnÍ`€ÔNÀX¼ÀXÂ"`€švÀXÉ€ÀXÄÀnÍ"`€š€ÒNÀXØÀXÜ#`€švÀXã€ÀXÞÀnÍ#`€š€ÓIÀXì"xÀXúvÀXõ€ÀXðÀnÍ`€Ô€ç'€¢a``1²ÀY €‹€ÀY"ÀnÍ>ÀY)ÀZ¦=ŠÀY1ÀpxÀYBvÀY=€ÀY8ÀnÍ`€Ô€¤“xÀY`vÀYYvÀYT€ÀYOÀnÍ`€Ô`{0”a`0`K^```‡IÀYlvÀYu‚ÀYpÀp€§`1³>ÀY~ÀY›=ŒÀYˆÀp^ƒÀYŽÀp6>ÀY¢ÀZ =ŒÀY¬Àp^ÀY²€©xÀYÑvÀYÊvÀYÆ€ÀYÁÀnÍ#`€š€Ó%`€0”a`0`KMvÀYò€ÀYíÀnÍM`€û9xÀZvÀZvÀZ€ÀZÀnÍ#`€š€Ó9`€ž0”a`0`KCÀZ6€ŠÀZFÀo=‹ÀZYÀp6#ÀZsvÀZlvÀZf€ÀZaÀnÍ"`€š€Ò%`€vÀZvÀZ{€ÀZvÀnÍ#`€š€Ó%`€a``17„ÀZˆÀp^vÀZ“€ÀZŽÀnÍ"`€š€Ò`€š?JÀZ¬ÀZ³ƒÀZÉÀp6„ÀZÐÀp^‚ÀZÕÀpÀZÛÀo€‰À[jÀ[‡À^|A€é]À[šÀ^|À[±!``>À[·À^|IÀ[½!À[ÑvÀ[ÊvÀ[Æ€À[ÁÀsV#`€š€ÓC`€Ÿ“a``17JÀ[×€À[ÞÀsV?IÀ[èÀ[úvÀ[õvÀ[ñ€À[ìÀsV#`€š€Ó9`€žvÀ\vÀ\€À[ýÀsV"`€š€Ò9`€ža``17JÀ\€À\ÀsV?NÀ\&À\+`xÀ\7vÀ\2€À\-ÀsV`€Ô€¤“xÀ\UvÀ\NvÀ\I€À\DÀsV`€Ô`{0”a`0`K^```‡JÀ\`À\gvÀ\‹€À\†ÀsV"`€š€ÒÀ\š€©xÀ\¹vÀ\²vÀ\®€À\©ÀsV#`€š€Ó%`€0”a`0`KMvÀ\Ú€À\ÕÀsVM`€û9xÀ]vÀ]vÀ\ü€À\÷ÀsV#`€š€Ó9`€ž0”a`0`KCxÀ]CxÀ]*vÀ]#À]Àt6`{0xÀ]1À],Àt6€ê'€¢^`‰``´a`0`K0”a`0`KÀ]QÀt6#xÀ^ vÀ^€À^ÀsVX` €ç'€¢a``1²xÀ^7vÀ^/€À^*ÀsVX` €¤“xÀ^XvÀ^QvÀ^I€À^DÀsVX` `{0”a`0`K^```‡vÀ^p€À^kÀsVX` `€ŠÀ^áÀ^ìÀ`,A€ë]À^ûÀ`,À_``>À_ À`,IÀ_vÀ_€À_Àw €§`1³>À_!À_7JÀ_)“IÀ_>À_cxÀ_G€À_BÀw €äxÀ_^vÀ_W€À_RÀw `{0”a`0`Ka``°jÀ_f`a``17>À_kÀ_äJÀ_s#À_†vÀ_€À_zÀw `{”a``17“xÀ_ÛxÀ_±vÀ_ª€À_¥Àw `{0xÀ_¸€À_³Àw €ê'€¢xÀ_ÖvÀ_Ï€À_ÊÀw `{0•a`0`K^`‰``´a`0`K0”a`0`K`>À_ëÀ`(JÀ_óxÀ`xÀ`vÀ_ÿ€À_úÀw `{0xÀ` €À`Àw €ê'€¢^`‰``´a`0`K0”a`0`K€‹À`À`ÀaUA€ì]À`¢ÀaUÀ`¹!``1JÀ`ÈÀa9xÀa!xÀauÀaÀ`ÈvÀ`Û€À`ÖÀypX` vÀ`é€À`äÀyp`€ÔvÀ`úvÀ`ô€À`ïÀyp"`€š€ÒC`€ŸvÀavÀa€ÀaÀyp"`€š€ÒC`€Ÿa`0`4vÀa2€Àa-Àyp`€üa`0`4vÀaOvÀaG€ÀaBÀypX` `{a``17€ŒÀaZÀamÀbˆ@€jÀa[` ÀauÀbˆ`>ÀaxÀbˆNÀa„Àa‹€í`jÀalIÀa¡vÀa¥.€¼`1€‚=xÀa·€Àa°Àz×€¶'€îa`\›?=xÀaÕ€ÀaÎÀz×€¶$ÀaÚvÀaévÀaãvÀaÞ.!`€"`€š€Ò9`€ž'€ïvÀaüvÀaövÀañ.!`€"`€š€ÒC`€Ÿ'0vÀbvÀbvÀb.!`€#`€š€Ó9`€ž'€ïvÀb+vÀb'vÀb".!`€#`€š€ÓC`€Ÿa`\›IÀb:!ÀbDvÀb>.€…`€ƒ=xÀbT€ÀbMÀz×€¶$Àbe'€ðvÀb^.€…`€ƒ'€ña`\›?JÀblxÀbz€ÀbsÀz×€a`ži!kn¦s/vâyIz•|Š€ÀbÅÀbËÀdõ€ò`€‘Àc"Àc&€`€’ÀcgÀcm€€Ž`€“ÀcºÀc½€ `€”ÀdYÀdt€€‘] `Àdr…`“€˜ÀdyÀdyÀd Àd~Àd Àd„`Àd€Ž`Àdœ ``€?€‘€À}\€’À}i€“‚À}w ÀdyA€–Àd¥Àd¸Àdó@€jÀd¦` ÀdÀÀdó`JÀdÆ$ÀdóvÀdÈ.€Ž`€’'€óvÀdÒ.`€‘'€ôxÀdævÀdÛ.€‘] `€”€õ'€ö^``µ'€ñ}¸~Z~j)ñgƒ|¯~g~j €™€Ú€º€š‚#‚)Œ½€÷`]¶`€š€œ‚ýƒ€M`€ƒNƒT€%`€žƒšƒž€9`€Ÿƒåƒë€C`€©†=†=ˆ\†Kˆ\†Q%`†ZM[j`( †j9`j`( †uC`j`( `€š>‡ˆ\I‡ x‡+v‡$.%`€“a`0`13>‡0‡z=0‡8‡>D$‡s''v‡k.%`€'(I‡"!‡Š‚‡…À>x‡š‡•À>`“a`0`13>‡Ÿ‡å=0‡§‡­D$‡Þ'<‡ØÀ>`'(I‡ì"!‡÷ƒ‡ðÀPxˆ ˆÀP`“a`0`13>ˆˆX=0ˆˆD$ˆQ'DˆIÀP`'(?€€À#€œ#%†¨†žÀ/`†¸;†¾À/`&†Õ†ËÀ/``€ž5†ò†í`‚†íÀ>#†í„†íÀ€Ì“†íÀ€Ì``€Ÿ5‡‡ `ƒ‡ ÀP#‡ „‡ À€‡À#‡ À`` †=A€ „’„…@€ø„¨…`>„¨…N„´„»€ù`5„Ç„½`v„½.M`€œ#„½€„½À~'€ú„½À~``J„à$… €„éÀn'€ïx„÷v„ò.9`€ž”a`0`4'€ïx…v„þ.C`€Ÿ”a`0`4€£ˆÜˆà‰É@€ûˆè‰ÉˆøQ`€š`>ˆÿ‰ÉI‰!‰v‰ .M`€œv‰€‰À‚3M`€œa``1U>‰'‰›=0‰/‰5S$‰B'cv‰S.M`€œ'd'€üv‰z€‰tÀ‚3M`€œ'f?J‰¡x‰Àx‰°v‰©.%`€0v‰¸€‰²À‚3%`€a`0`K€ýa`·€¤ŠŠŠG@NŠ'ŠG`€ÂJŠ-Š-€Ê..'€¥Чз‹™@\jЍ` ŠÀ‹™ŠÐQ`€š`>Š×‹™IŠÝ!ŠëvŠá.M`€œvŠô€ŠîÀƒhM`€œa``1U>Šÿ‹s=0‹‹ S$‹'cv‹+.M`€œ'd'€üv‹R€‹LÀƒhM`€œ'f?J‹yx‹‡v‹€.%`€0v‹€‹‰Àƒh%`€a`0`K€¦‹ž‹¸Œ(@aj‹Ÿ` ‹ºŒ(‹»Q``1J‹Ë""%‹Ñ€‹ËÀ„U`€š‹öv‹ì.M`€œv‹ÿ‹ùÀ„U`€šM`€œa``1UŒvŒ.%`€vŒ"ŒÀ„U`€š%`€a``17€¡Œ-ŒAŒp@bjŒ.` ŒJŒp`JŒMxŒh5ŒbŒN`5ŒNŒN`vŒN.M`€œ#ŒN€ŒNÀ…0+vŒYŒNÀ…0`b`¹`#ŒN€ŒNÀ…"“ŒNÀ…"``vŒj.%`€a`0`4€§ŒuŒˆŒ»@€jŒv` ŒŒ»`JŒ–$Œ»'vŒ™.€þ``»'€ÿvŒ§.%`€'€·vŒ¯.€ø`€ ')D‚ƒƒE„2„ì…°†€ª*0ë`€š€¬^^épéu%`~M[j`( Ž9`j`( ™C`j`( `€ª? ª€©€°À†kMÃÀ†w9‚ÔÀ††CƒâÀ†˜†Ü†è~¢†;†å†è €­€Ú€™€ò€º€®ƒƒ‡*``€š€¹ƒ `€®? A€°ƒDƒ[ƒÌ@€øjƒE` ƒfƒÌ`>ƒfƒÌNƒrƒy€ù`5ƒ…ƒ{`vƒ{.M`€œ#ƒ{€ƒ{À‡©'€úƒ{À‡©``Jƒž$ƒÈ€ƒ§À‡™'€ïxƒµvƒ°.9`€ž”a`0`4'€ïxƒÃvƒ¼.C`€Ÿ”a`0`4€³ƒÑƒá„Ê@€ûjƒÒ` ƒé„ʃùQ`€š`>„„ÊI„!„v„ .M`€œv„€„ÀˆfM`€œa``1U>„(„œ=0„0„6S$„C'cv„T.M`€œ'd'€üv„{€„uÀˆfM`€œ'f?J„¢x„Áx„±v„ª.%`€0v„¹€„³Àˆf%`€a`0`K€ýa`·€´„Ï„æ…@Nj„Ð` „ï…`€ÂJ„õ„õ€Ê..'€µ……$†@\j…` …-†…=Q`€š`>…D†I…J!…Xv…N.M`€œv…a€…[À‰£M`€œa``1U>…l…à=0…t…zS$…‡'cv…˜.M`€œ'd'€üv…¿€…¹À‰£M`€œ'f?J…æx…ôv…í.%`€0v…ü€…öÀ‰£%`€a`0`K€¶† †%†•@aj† ` †'†•†(Q``1J†8""%†>€†8ÀŠ`€š†cv†Y.M`€œv†l†fÀŠ`€šM`€œa``1U††v†.%`€v††‰ÀŠ`€š%`€a``17€±†š†®†Ý@bj†›` †·†Ý`J†ºx†Õ5†Ï†»`5†»†»`v†».M`€œ#†»€†»À‹k+v†Æ†»À‹k`b`¹`#†»€†»À‹]“†»À‹]``v†×.%`€a`0`4€·†â†õ‡(@€j†ã` †ý‡(`J‡$‡('v‡.€þ``»'€ÿv‡.%`€'€·v‡.€ø`€°')‡gˆB‰E‰€Šm‹'‹ëŒQŒy‡$ŒvŒy €º€Úhqir7Oc]~€™–€ø°€Â‚‚Ž`]¶`€Â €Ä‚n‚‚†B"‚†‚†`€š€Å‚»‚΂ÑB#‚Ñ‚Ñ`€š€Æ‚ûƒƒ Bƒ ƒ `€Çƒªƒ³ƒ¼BMƒ¼ƒ¼`€Èƒïƒ÷ƒýBƒýƒý`€Ê………ˆA…'…ˆ…7"`€š…M#`€š…Y``€ÂJ…h…h€Ö€…wÀÅ…~ÀЂ…ƒÀۀ̆c†n†…B]†s†…†Q`€Â`€Â€Í‡‡#‡>B\j‡` ‡,‡>‡8Q`€Â`€ÎŠWŠ^Š~BŠeŠ~Šm`Šw}[j`( `€ÏŽtŽ{ŽB€“Ž„Žކ}[j`( `"DfˆªŽŽ<ŽqޝŽá €ÐŽôŽú‘„`€ù€ÒFK€"j&` `€š€Óps€#jP` `€š€Ô”€jx` `€Ö™™‘‚§‘‚­"`€š¹#`€šÃ``€Ð>É‘‚IÏ!áv×vÓ.#`€š€ÓM`€œvêvä."`€š€ÒM`€œa``1U>õp=0ýS$'cv(v"."`€š€ÒM`€œ'd'evOvK.#`€š€ÓM`€œ'fIwx†vv{.#`€š€Ó%`€vŽvˆ."`€š€Ò%`€a`0`13>–á=0ž¤S$Ú'Uv¸.#`€š€Ó'VvÓ."`€š€Ò'(Iè!øvñvì.`€Ô`{x‘vû."`€š€Ò€ûv‘ .#`€š€Óa`€š`€£a``17>‘‘~=0‘‘S$‘+'v‘4.`€Ô'x‘Jv‘D."`€š€Ò€ûv‘S.#`€š€Óa`€š`€£'€·'?€Ò€À€ÓÀ›€Ô‚À¦ ™‘És€×’`€Â €¼ €½ €¾ €¿g€Àg€Á€¼–€–‡˜Ëa ––˜Ë–‡n`€Â–¥`–µ€…`–Ô€‚]a`€Â`–ð}`1j–ø`1—€ƒ`j`( —€„`j`( `>—.˜ËN—:—A€í`j5—C—C`j—ClR=x—Z‡—CÀ’²€¶$—”' x—sv—nv—h€—hÀ’#"`€š€Ä9`€ž”a`0`4' x—v—ˆv—‚€—‚À’#"`€š€ÄC`€Ÿ”a`0`4a`\›‡—CÀ’²I—›!—©v—Ÿ€—ŸÀ’#M`€Ç=x—¹‡—²À’¢€¶$—Þ'—Ƥv—Ò€—ÒÀ’#M`€Ça`\›?=5—å—å`j‡—åÀ’¢R=x—ô—åÀ“Ç€²$˜'€ÿ˜À’.^`\™=x˜—åÀ“Ç€¶˜€¾€˜À’#‚˜*À’:ƒ˜1À’F}„˜RÀ’\€ƒ…˜qÀ’o€„†˜™À’‚a`\›—åÀ“ÇJ˜¯x˜½‡˜¶À’¢€a`ž€½–‡˜Ëa–‡˜Ë–‡n`€Â^``]a`€Â`}`1€ƒ`€„``J–‡4–‡–‡˜Ë–¥`–µ€…`–Ô€‚]a`€Â`–ð}`1j`1—€ƒ`j`( —€„`j`( `J–‡–‡€¼€–‡À”ª–‡À”ÿ‚–‡À• ƒ–‡À•}„–‡À•-€ƒ…–‡À•?€„†–‡À•R€¾#ž~a4ž~#n`€Â<€…`[€‚]a`€Â`{}`1jƒ`1’€ƒ`j`( ¨€„`j`( `JÂxžsÎ|€×À•ÊÝÀ•Õ‚äÀ•á}ƒž À•÷€ƒ„ž,À– €„…žXÀ–€“a`y€¿#ž~a#ž~#n`€Â^`]a`€Â`}`1€ƒ`€„``J#4##ž~<€…`[€‚]a`€Â`{}`1j`1’€ƒ`j`( ¨€„`j`( `J##€¾€#À– #À–ñ‚#À–ý}ƒ#À—€ƒ„#À—%€„…#À—8€ÀŸŸ¤ûaŸ¤ûŸn`€ÂŸ"`Ÿ(#`j`( `€Â>Ÿ.¤û =Ÿ?ZŸOÀ—´‚ŸVÀ—¿vŸ[€Ÿ[À—©`€ÈIŸh"ŸrŸlÀ—´“a``17"Ÿ‚Ÿ{À—¿ŸŽŸŠÀ—¿`vŸ‘€Ÿ‘À—©`€Èa``17JŸš€Ÿ¡À—©?NŸ²Ÿ·`vŸ¾€Ÿ¹À—©`€ÆNŸÎŸÜ`€švŸã€ŸÞÀ—©"`€š€ÄNŸòŸ÷9`v „ŸùÀ˜‘9`€žN  C`v ,„ À˜‘C`€ŸO Ÿ ¤a`\ ´¢4 ¹`\> ¼¢4N Ê Ó`x Úƒ ÕÀ˜q€ä åÀ™a``°I ï" ü óÀ™% j ÿ`a``17"¡‰¡€À™% j¡Œ`a``17"¡¨x¡¤¡¢À™”a`0`4v¡°ƒ¡«À˜q`{a``17!¡Ñx¡¿ƒ¡ºÀ˜q€äx¡Ì¡ÊÀ™”a`0`4a``°j¡Ô`a``17>¡Û¢ =¡åÀ˜²x¡ê…¡åÀ˜²”a`0`4=Ž¡øÀ˜Ò“>¢¢.=Ž¢À˜Òx¢"†¢À˜Ò”a`0`4E¢;¢D¢F`“x¢M¢KÀš³¢OÀ—´a`0`13¢VÀš³x¢W¢VÀš³”a`0`4>¢[¢|=¢cÀ˜ô¢tÀš³a`\N¢‰¢š`€š¢œ€©x¢Àv¢¹„¢«À˜‘%`€¢ÂÀ—´a`0`4Mv¢Ü€¢ÜÀ—©M`€Ç9…¢íÀ˜²C†¢ûÀ˜ÒN£`€šI£,"£4‚£0À—¿£C£?À—¿`v£F€£FÀ—©`€Èa``17>£N£u=£VÀ›¦ v£l€£gÀ—©#`€š€ÅI£|£„£€À—¿`£‡À—´a``17>£Ž£½=£–À›¦ £§À›9>£Ä¤˜E£Ì£Õ£×`£ÙÀ—´x£â£àÀœ^ £äÀ—¿`a`0`13£éÀœ^ x£ê£éÀœ^ ”a`0`4>£î¤=£øÀ˜ô¤ Àœ^ a`\=¤À›¦ ¤,€©x¤Pv¤I„¤;À˜‘%`€¤RÀ—¿`a`0`4Mv¤l€¤lÀ—©M`€Ç9…¤}À˜²C†¤‹À˜ÒJ¤Ÿ¤¦€Ê¤ºÀ›9¤ÌÀ›¦ x¤áƒ¤ÜÀ˜q€¤¤ëÀ—´‚¤òÀ—¿^```‡€ÁŸ¤ûaŸ¤ûŸn`€Â^```€ÂJŸ4ŸŸ¤ûŸ"`Ÿ(#`j`( `€ÂJŸŸ€À€ŸÀΟÀž‚ŸÀž žHŒÞ‘Ò’”•®–…—³žH €Ø €Ú€º€Ù 6<…b``¼€Ü ü‚€€Ø`€Ý ‚ð‚õ€€Ø`€Â€ã ‚ú‚úƒ(ƒ ƒ(ƒ`ƒ"`€Â`€Ù?€Ü€Àžò€ÝÀžþ ‚úA€Þ ÍØë@àë`Jãvã.€Ø`€Ü€ß ‚½‚Í‚Ú@!‚Ò‚Ú`€ÂJ‚Õv‚Õ.€Ø`€Â€Ý€á „Ò„å…`@€j„Ó` „í…`„ï}[j`( `>„÷…`I„ý…v….!`€Â€ßJ…v….`€Þ?J…#$…\'x…*ŽùI09v4.!`€Â€ßJBvI.`€Þ?N[d`1*Ny€ƒ`I‹%•€À¢›`> Ù=ЍÀ¢ð)=‹¿À¢ÿÎÀ¢›`Iàê€äÀ¢›)a``1m>óŽ=ŠûÀ¢ð)?NŽŽ' `Ž/€¼uŽ-vŽ).!`€Â€ßvŽH.`€ÞvŽQ.€`€ìvŽ_.€‚]a`€Â`€í}‚Ž~À¢ð€ƒƒŽžÀ¢ÿ€„ŽÄÀ¢ªJŽÙ$Žõ'„ŽëÀ£n¢v£ó€ò @FÙ!`€ê`½€ô ÃÉ€€ùjª` [€÷ ×"×*`?!`€ÂR€`x€‚]a`€Â`”€ù[j`( `€ò?€ô„À¤„ ¥€ñ€«À¤L´À¤X‚ºÀ¤cƒÈÀ¤o€õ Îãÿ@%jÏ` êÿ`Jí5íí`€Âví.!`€Â€ß#í€íÀ¤ÿ+vùvóíÀ¤ÿ`€Â"`€š€Ä%`€`¤Î¥M ¥]ž” l¡—¤¥Z¥] €ø €Úhq]€º0Q€ù ‚¹‚ÈŠ/"``€Â ‚È `€ù? A €û ‚òƒƒ#@Mj‚ó` ƒƒ#`Jƒvƒvƒ."`€š€ÄM`€œ€ü ƒ(ƒ<ƒ_@jƒ)` ƒCƒ_`JƒFxƒQvƒJvƒF.#`€š€Å%`€0vƒYvƒS."`€š€Ä%`€a`0`K€ÿ ƒdƒt„@\jƒe` ƒ}„ƒ‰Q`€Â`>ƒ„Nƒœƒ£E`xƒ«vƒ¥."`€š€Ä\vƒ»€ƒµÀ¦Ý"`€š€Äa`€š`€¥JƒÇ#ƒÕƒÎÀ¦ö“a``17xƒàvƒÜ.#`€š€Å\vƒð€ƒêÀ¦Ý#`€š€Åa`€š`€¥ƒ÷À¦ö` „„†²@]j„` „"†²„.Q`€Â`€Â>„5†²I„;!„Iv„?.M`€ûv„R€„LÀ§¿M`€Ça``1U>„]„Ò=0„e„kS$„x'cv„‰.M`€û'd'ev„±€„«À§¿M`€Ç'f?N„ß„å"`€š„ç`€šv„ð."`€š€Äv„ý€„÷À§¿"`€š€ÄN……#`€š…`€šv….#`€š€Åv…)€…#À§¿#`€š€ÅN…9…C#`€Â#…K…EÀ¨Mv…S."`€š€Äa``1€¦.€…bÀ§¿`€ÂN…s…{$`€Â#…‚…}À¨‡v…‰.#`€š€Åa``1€¦.€…–À§¿`€ÂI…¢x…Íx…´v…°ƒ…¦À¨Á#`€š€Å\v…Æ„…¾À©"`€š€Äa`€š`€¥“a`0`13>…Ò†=0…Ú…àS$†'^.'_€†À§¿'`?N†(†-`x†>v†9ƒ†/À¨Á`€Æx†Uv†P„†HÀ©`€Æ€¤x†mv†iƒ†_À¨Á#`€š€Å€ûv†~„†vÀ©"`€š€Äa`€š`€£^```‡a``¾J†‹†’€Ê†À¨M‚†¤À¨‡…†©À©Ã †·†Êˆw@j†¸` †Ñˆw†Ù`†ã}[j`( `>†ëˆwN†÷†þ€í`j5‡‡`j‡lR=x‡‚‡Àªí€¶$‡Q' x‡0v‡+v‡%."`€š€Ä9`€ž”a`0`4' x‡Lv‡Ev‡?."`€š€ÄC`€Ÿ”a`0`4a`\›‚‡ÀªíI‡X!‡fv‡\.M`€û=x‡v‚‡oÀªÝ€¶$‡›'‡ƒ¤v‡.M`€ûa`\›?=x‡©‚‡¢ÀªÝ€¶$‡»'€ÿ€‡³Àª´a`\›N‡É‡Ó€“`x‡Ú.€“}‡ëÀªÁ^}[`I‡÷vˆƒ‡ûÀ¬€¹`1¿>ˆˆT=5ˆˆ`j‚ˆÀªÝR=xˆ*„ˆÀ¬g€²^`\™=xˆ>„ˆÀ¬g€¶ƒˆDÀ¬a`\›„ˆÀ¬g?Jˆ[xˆi‚ˆbÀªÝ€a`ž ˆ|ˆ‰ @€“jˆ}` ˆ˜‰ ˆš}[j`( `>ˆ¢‰ Iˆ¨"!%ˆ±.`ˆÕvˆÎ.`€ü“a``17JˆÛ'?Jˆêx‰ˆñ{.}€‰ À­€“a`y ‰%‰?‰‘@aj‰&` ‰A‰‘‰BQ``1J‰R""%‰X€‰RÀ­¬`€Â‰ov‰i."`€š€Äv‰x‰rÀ­¬`€Â"`€š€Äa``1€¦‰…v‰.#`€š€Åv‰Ž‰ˆÀ­¬`€Â#`€š€Åa``1€¦€ý ‰–‰ª‰Ú@bj‰—` ‰³‰Ú`J‰¶x‰Åv‰¼v‰¶."`€š€Äb`€¡x‰Ë7€Áv‰Ñv‰Í.#`€š€Åb`€¡a`0`­a`0`4 ‰ß‰òŠ-@€j‰à` ‰úŠ-`JŠ$Š- 'vŠ.€þ``»'%vŠ."`€š€Ä'&vŠ .#`€š€Å'evŠ&.`€Æ''¥û¦B¦º§œª¬ë­‰®C®Ö¯K  ¯{¥¸¯x¯{ €Ú€™€ò€ºio…ß(`€Ð ‚S‚[€h`„„…Ý„&…Ý„="`€š„S#`€š„_`„jh``>„”…ÝI„š!x„§v„Ÿ.X` €Ñ‚„°À°^`‰``1¬>„·… =0„¿„ÅS$…')v„ç.X` '*‚„ÿÀ°'+?I……C…v…&.X` ‚…/À°v…;€…5À¯ÿC`€Ÿ>…L…Ù=0…T…ZS$…g',‚…yÀ°'-'.x…°v…©€…£À¯ÿC`€Ÿ”a`0`4'/v…È.X` '+? ƒÀ° „|€Ö€„‚À¯ÿ„‰À° ‚„ŽÀ° ‚$‚/‚B@X‚7‚B`J‚:v‚:.h` ±o±¤±´¯»±±±´  €Ú€º EGžA4`ž€•]¶[]¶[c0_k1__Jx#xx}€xÀ²\‡À²a[`Á)“a`0`1E“À²€šÀ²_ ÷ù‚PA5‚‚P€•]¶[]¶[‚0_‚1__J‚*#x‚?x‚/€‚*À²²\‚9À²¾a[`Á)“a`0`1E€‚EÀ²²‚LÀ²¾_ ‚©‚®ƒ‡A2‚ºƒ‡‚Í3]-``1>‚Óƒ‡I‚×v‚à€‚ÛÀ³A€§`1J‚é)?N‚þƒ 4`vƒ€ƒ À³A-`G>Nƒ0€†]n`vƒ0xƒ0€ƒ+À³A€¬”a`]-`€ˆ]n`rExƒ0‚À³¢€‰a`1t>Nƒ"€`vƒ9‚À³¢€‹`v>ƒ9ƒvIƒ?!ƒIƒƒCÀ´ƒLÀ³}a``1m>ƒXƒrJƒ`*?Jƒz) ƒ¼ƒÁ„A5ƒÌ„ƒØ!`€Â`1Jƒá!ƒñvƒìvƒæ€ƒáÀ´…"`€š€Ä9`€žvƒývƒù€ƒôÀ´…#`€š€Å9`€ža``17 „>„C„úA6„V„ú7`[„`€œ] _„h8_\>„q„úN„{„9`x„ˆ€„ƒÀµ:+^_``ÂI„™x„£‚„Àµ9“a`0`13=0„¨„®S$„Þ€„¾Àµ';?=x„瀄ãÀµ<‚„èÀµ9„ñÀµ"a`_\à …I…N†A=…`†7`[…j€œ] _…r8_\>…{†N………‹9`x…’€…À¶:…šÀ¶^_``ÂI…¦x…°‚…ªÀ¶-“a`0`13>…µ†=0…»…ÁS$…þ€…ÑÀ¶'>…õÀ¶'(?=x† €†À¶<‚† À¶-+a`_\à †^†b‡A?†p‡†x@`†„``>†Ž‡N†–†œ€Ý`“>N†Æ€†]n`v†Æv†Æ€†¿À¶þ] `,€ˆ]n`rEx†ÆƒÀ·7€‰a`1t>N†¬A`v†ÑƒÀ·7€‹`v>†Ñ‡I†×†ë„†ÛÀ·—†îÀ· a``17=ІøÀ·$x†ý‚†øÀ·$”a`0`4?J‡‚‡À·$ ‡¾‡Ã‹AB‡Ð‹‡ØX`‡è`‡òC``>‡ú‹IˆivˆrˆmÀ¸9€§`1³>ˆ{‰çNˆ…ˆ•C`“Cˆž)>ˆ«‰ãNˆ¹ˆ¿9`xˆÉ€ˆÁÀ¸.:'€¢ƒˆ×À¸z^`‰``ÄIˆïˆù„ˆóÀ¸“xˆü”.a`Ia``17>‰‰tJ‰ #x‰2x‰ v‰€‰À¸.`{0ƒ‰"À¸za`0`K‚‰5À¸Da`0`18ƒ‰JÀ¸z+`?I‰}x‰™x‰‡„‰À¸“0ƒ‰‰À¸za`0`K‚‰œÀ¸Da`0`18J‰¤ƒ‰«À¸z?=‹‰ÂÀ¸zx‰Ú„‰ÔÀ¸“”a`0`4?N‰ð‰ö9`xŠ€‰øÀ¸.:ŠÀ¸9^`‰``ÄCŠ!ŠƒŠÀ¹ëxŠ!”.a`Ia``17>Š%‹LNŠ{Š…@`#ŠƒŠ‡À¹ë“a``17“xнxŠ €Š˜À¸.€ê'€¢xЏƒŠ²À¹ë0”a`0`K^`‰``´”a`0`4`NŠÌŠ×D`xŠßƒŠÙÀ¹ë0„ŠáÀº`a`0`KIŠðŠû‚ŠôÀ¸D…ŠþÀºòa``17J‹ „‹Àº`?=‹‹ À¹ëx‹0€‹(À¸.:‹8À¸9x‹Dƒ‹>À¹ë”a`0`4^`‰``ÄJ‹r+ »°±ä±ç²†³%´i´ëµß¶â¸»° ]file:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/source_span.dart¬// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. export 'src/file.dart'; export 'src/location.dart'; export 'src/location_mixin.dart'; export 'src/span.dart'; export 'src/span_exception.dart'; export 'src/span_mixin.dart'; export 'src/span_with_context.dart'; NN<""%$package:source_span/source_span.dart^file:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/src/charcode.dartÎ// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// "Carriage return" control character. const int $cr = 0x0D; /// "Line feed" control character. const int $lf = 0x0A; /// Space character. const int $space = 0x20; /// "Horizontal Tab" control character, common name. const int $tab = 0x09; NN<)#5%package:source_span/src/charcode.dart\file:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/src/colors.dart•// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // Color constants used for generating messages. const String red = '\u001b[31m'; const String yellow = '\u001b[33m'; const String blue = '\u001b[34m'; const String none = '\u001b[0m'; NN<1!$"!#package:source_span/src/colors.dartZfile:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/src/file.dart·È// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:math' as math; import 'dart:typed_data'; import 'location.dart'; import 'location_mixin.dart'; import 'span.dart'; import 'span_mixin.dart'; import 'span_with_context.dart'; // Constants to determine end-of-lines. const int _lf = 10; const int _cr = 13; /// A class representing a source file. /// /// This doesn't necessarily have to correspond to a file on disk, just a chunk /// of text usually with a URL associated with it. class SourceFile { /// The URL where the source file is located. /// /// This may be null, indicating that the URL is unknown or unavailable. final Uri? url; /// An array of offsets for each line beginning in the file. /// /// Each offset refers to the first character *after* the newline. If the /// source file has a trailing newline, the final offset won't actually be in /// the file. final _lineStarts = [0]; /// The code points of the characters in the file. final Uint32List _decodedChars; /// The length of the file in characters. int get length => _decodedChars.length; /// The number of lines in the file. int get lines => _lineStarts.length; /// The line that the offset fell on the last time [getLine] was called. /// /// In many cases, sequential calls to getLine() are for nearby, usually /// increasing offsets. In that case, we can find the line for an offset /// quickly by first checking to see if the offset is on the same line as the /// previous result. int? _cachedLine; /// This constructor is deprecated. /// /// Use [new SourceFile.fromString] instead. @Deprecated('Will be removed in 2.0.0') SourceFile(String text, {url}) : this.decoded(text.runes, url: url); /// Creates a new source file from [text]. /// /// [url] may be either a [String], a [Uri], or `null`. SourceFile.fromString(String text, {url}) : this.decoded(text.codeUnits, url: url); /// Creates a new source file from a list of decoded code units. /// /// [url] may be either a [String], a [Uri], or `null`. /// /// Currently, if [decodedChars] contains characters larger than `0xFFFF`, /// they'll be treated as single characters rather than being split into /// surrogate pairs. **This behavior is deprecated**. For /// forwards-compatibility, callers should only pass in characters less than /// or equal to `0xFFFF`. SourceFile.decoded(Iterable decodedChars, {url}) : url = url is String ? Uri.parse(url) : url as Uri?, _decodedChars = Uint32List.fromList(decodedChars.toList()) { for (var i = 0; i < _decodedChars.length; i++) { var c = _decodedChars[i]; if (c == _cr) { // Return not followed by newline is treated as a newline final j = i + 1; if (j >= _decodedChars.length || _decodedChars[j] != _lf) c = _lf; } if (c == _lf) _lineStarts.add(i + 1); } } /// Returns a span from [start] to [end] (exclusive). /// /// If [end] isn't passed, it defaults to the end of the file. FileSpan span(int start, [int? end]) { end ??= length; return _FileSpan(this, start, end); } /// Returns a location at [offset]. FileLocation location(int offset) => FileLocation._(this, offset); /// Gets the 0-based line corresponding to [offset]. int getLine(int offset) { if (offset < 0) { throw RangeError('Offset may not be negative, was $offset.'); } else if (offset > length) { throw RangeError('Offset $offset must not be greater than the number ' 'of characters in the file, $length.'); } if (offset < _lineStarts.first) return -1; if (offset >= _lineStarts.last) return _lineStarts.length - 1; if (_isNearCachedLine(offset)) return _cachedLine!; _cachedLine = _binarySearch(offset) - 1; return _cachedLine!; } /// Returns `true` if [offset] is near [_cachedLine]. /// /// Checks on [_cachedLine] and the next line. If it's on the next line, it /// updates [_cachedLine] to point to that. bool _isNearCachedLine(int offset) { if (_cachedLine == null) return false; final cachedLine = _cachedLine!; // See if it's before the cached line. if (offset < _lineStarts[cachedLine]) return false; // See if it's on the cached line. if (cachedLine >= _lineStarts.length - 1 || offset < _lineStarts[cachedLine + 1]) { return true; } // See if it's on the next line. if (cachedLine >= _lineStarts.length - 2 || offset < _lineStarts[cachedLine + 2]) { _cachedLine = cachedLine + 1; return true; } return false; } /// Binary search through [_lineStarts] to find the line containing [offset]. /// /// Returns the index of the line in [_lineStarts]. int _binarySearch(int offset) { var min = 0; var max = _lineStarts.length - 1; while (min < max) { final half = min + ((max - min) ~/ 2); if (_lineStarts[half] > offset) { max = half; } else { min = half + 1; } } return max; } /// Gets the 0-based column corresponding to [offset]. /// /// If [line] is passed, it's assumed to be the line containing [offset] and /// is used to more efficiently compute the column. int getColumn(int offset, {int? line}) { if (offset < 0) { throw RangeError('Offset may not be negative, was $offset.'); } else if (offset > length) { throw RangeError('Offset $offset must be not be greater than the ' 'number of characters in the file, $length.'); } if (line == null) { line = getLine(offset); } else if (line < 0) { throw RangeError('Line may not be negative, was $line.'); } else if (line >= lines) { throw RangeError('Line $line must be less than the number of ' 'lines in the file, $lines.'); } final lineStart = _lineStarts[line]; if (lineStart > offset) { throw RangeError('Line $line comes after offset $offset.'); } return offset - lineStart; } /// Gets the offset for a [line] and [column]. /// /// [column] defaults to 0. int getOffset(int line, [int? column]) { column ??= 0; if (line < 0) { throw RangeError('Line may not be negative, was $line.'); } else if (line >= lines) { throw RangeError('Line $line must be less than the number of ' 'lines in the file, $lines.'); } else if (column < 0) { throw RangeError('Column may not be negative, was $column.'); } final result = _lineStarts[line] + column; if (result > length || (line + 1 < lines && result >= _lineStarts[line + 1])) { throw RangeError("Line $line doesn't have $column columns."); } return result; } /// Returns the text of the file from [start] to [end] (exclusive). /// /// If [end] isn't passed, it defaults to the end of the file. String getText(int start, [int? end]) => String.fromCharCodes(_decodedChars.sublist(start, end)); } /// A [SourceLocation] within a [SourceFile]. /// /// Unlike the base [SourceLocation], [FileLocation] lazily computes its line /// and column values based on its offset and the contents of [file]. /// /// A [FileLocation] can be created using [SourceFile.location]. class FileLocation extends SourceLocationMixin implements SourceLocation { /// The [file] that `this` belongs to. final SourceFile file; @override final int offset; @override Uri? get sourceUrl => file.url; @override int get line => file.getLine(offset); @override int get column => file.getColumn(offset); FileLocation._(this.file, this.offset) { if (offset < 0) { throw RangeError('Offset may not be negative, was $offset.'); } else if (offset > file.length) { throw RangeError('Offset $offset must not be greater than the number ' 'of characters in the file, ${file.length}.'); } } @override FileSpan pointSpan() => _FileSpan(file, offset, offset); } /// A [SourceSpan] within a [SourceFile]. /// /// Unlike the base [SourceSpan], [FileSpan] lazily computes its line and column /// values based on its offset and the contents of [file]. [SourceSpan.message] /// is also able to provide more context then [SourceSpan.message], and /// [SourceSpan.union] will return a [FileSpan] if possible. /// /// A [FileSpan] can be created using [SourceFile.span]. abstract class FileSpan implements SourceSpanWithContext { /// The [file] that `this` belongs to. SourceFile get file; @override FileLocation get start; @override FileLocation get end; /// Returns a new span that covers both `this` and [other]. /// /// Unlike [union], [other] may be disjoint from `this`. If it is, the text /// between the two will be covered by the returned span. FileSpan expand(FileSpan other); } /// The implementation of [FileSpan]. /// /// This is split into a separate class so that `is _FileSpan` checks can be run /// to make certain operations more efficient. If we used `is FileSpan`, that /// would break if external classes implemented the interface. class _FileSpan extends SourceSpanMixin implements FileSpan { @override final SourceFile file; /// The offset of the beginning of the span. /// /// [start] is lazily generated from this to avoid allocating unnecessary /// objects. final int _start; /// The offset of the end of the span. /// /// [end] is lazily generated from this to avoid allocating unnecessary /// objects. final int _end; @override Uri? get sourceUrl => file.url; @override int get length => _end - _start; @override FileLocation get start => FileLocation._(file, _start); @override FileLocation get end => FileLocation._(file, _end); @override String get text => file.getText(_start, _end); @override String get context { final endLine = file.getLine(_end); final endColumn = file.getColumn(_end); int? endOffset; if (endColumn == 0 && endLine != 0) { // If [end] is at the very beginning of the line, the span covers the // previous newline, so we only want to include the previous line in the // context... if (length == 0) { // ...unless this is a point span, in which case we want to include the // next line (or the empty string if this is the end of the file). return endLine == file.lines - 1 ? '' : file.getText( file.getOffset(endLine), file.getOffset(endLine + 1)); } endOffset = _end; } else if (endLine == file.lines - 1) { // If the span covers the last line of the file, the context should go all // the way to the end of the file. endOffset = file.length; } else { // Otherwise, the context should cover the full line on which [end] // appears. endOffset = file.getOffset(endLine + 1); } return file.getText(file.getOffset(file.getLine(_start)), endOffset); } _FileSpan(this.file, this._start, this._end) { if (_end < _start) { throw ArgumentError('End $_end must come after start $_start.'); } else if (_end > file.length) { throw RangeError('End $_end must not be greater than the number ' 'of characters in the file, ${file.length}.'); } else if (_start < 0) { throw RangeError('Start may not be negative, was $_start.'); } } @override int compareTo(SourceSpan other) { if (other is! _FileSpan) return super.compareTo(other); final result = _start.compareTo(other._start); return result == 0 ? _end.compareTo(other._end) : result; } @override SourceSpan union(SourceSpan other) { if (other is! FileSpan) return super.union(other); final span = expand(other); if (other is _FileSpan) { if (_start > other._end || other._start > _end) { throw ArgumentError('Spans $this and $other are disjoint.'); } } else { if (_start > other.end.offset || other.start.offset > _end) { throw ArgumentError('Spans $this and $other are disjoint.'); } } return span; } @override bool operator ==(other) { if (other is! FileSpan) return super == other; if (other is! _FileSpan) { return super == other && sourceUrl == other.sourceUrl; } return _start == other._start && _end == other._end && sourceUrl == other.sourceUrl; } // Eliminates dart2js warning about overriding `==`, but not `hashCode` @override int get hashCode => super.hashCode; /// Returns a new span that covers both `this` and [other]. /// /// Unlike [union], [other] may be disjoint from `this`. If it is, the text /// between the two will be covered by the returned span. @override FileSpan expand(FileSpan other) { if (sourceUrl != other.sourceUrl) { throw ArgumentError('Source URLs \"$sourceUrl\" and ' " \"${other.sourceUrl}\" don't match."); } if (other is _FileSpan) { final start = math.min(_start, other._start); final end = math.max(_end, other._end); return _FileSpan(file, start, end); } else { final start = math.min(_start, other.start.offset); final end = math.max(_end, other.end.offset); return _FileSpan(file, start, end); } } /// See `SourceSpanExtension.subspan`. FileSpan subspan(int start, [int? end]) { RangeError.checkValidRange(start, end, length); if (start == 0 && (end == null || end == length)) return this; return file.span(_start + start, end == null ? _end : _start + end); } } // TODO(#52): Move these to instance methods in the next breaking release. /// Extension methods on the [FileSpan] API. extension FileSpanExtension on FileSpan { /// See `SourceSpanExtension.subspan`. FileSpan subspan(int start, [int? end]) { RangeError.checkValidRange(start, end, length); if (start == 0 && (end == null || end == length)) return this; final startOffset = this.start.offset; return file.span( startOffset + start, end == null ? this.end.offset : startOffset + end); } } ÁNN<!((P30K?LP 5",*''KKKP&/*G-:,0C:MKN<#&QN?> /L)J " # : 6 1 (,*LOPK)G,Q) J/J1G%H9C $<3> '7 8E DE 3=%&J &>N< $(<34.* :4*),4CIK-*),4C+Q!package:source_span/src/file.dartÆAgfile:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/src/span_with_context.dart…à// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'location.dart'; import 'span.dart'; import 'utils.dart'; /// A class that describes a segment of source text with additional context. class SourceSpanWithContext extends SourceSpanBase { // This is a getter so that subclasses can override it. /// Text around the span, which includes the line containing this span. String get context => _context; final String _context; /// Creates a new span from [start] to [end] (exclusive) containing [text], in /// the given [context]. /// /// [start] and [end] must have the same source URL and [start] must come /// before [end]. [text] must have a number of characters equal to the /// distance between [start] and [end]. [context] must contain [text], and /// [text] should start at `start.column` from the beginning of a line in /// [context]. SourceSpanWithContext( SourceLocation start, SourceLocation end, String text, this._context) : super(start, end, text) { if (!context.contains(text)) { throw ArgumentError('The context line "$context" must contain "$text".'); } if (findLineStart(context, text, start.column) == null) { throw ArgumentError('The span text "$text" must start at ' 'column ${start.column + 1} in a line within "$context".'); } } } &NN<M5:J"QLIMLL"#P>AF.package:source_span/src/span_with_context.dartafile:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/src/highlighter.dartÀdü// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:math' as math; import 'package:collection/collection.dart'; import 'package:path/path.dart' as p; import 'package:term_glyph/term_glyph.dart' as glyph; import 'charcode.dart'; import 'colors.dart' as colors; import 'location.dart'; import 'span.dart'; import 'span_with_context.dart'; import 'utils.dart'; /// A class for writing a chunk of text with a particular span highlighted. class Highlighter { /// The lines to display, including context around the highlighted spans. final List<_Line> _lines; /// The color to highlight the primary [_Highlight] within its context, or /// `null` if it should not be colored. final String? _primaryColor; /// The color to highlight the secondary [_Highlight]s within their context, /// or `null` if they should not be colored. final String? _secondaryColor; /// The number of characters before the bar in the sidebar. final int _paddingBeforeSidebar; /// The maximum number of multiline spans that cover any part of a single /// line in [_lines]. final int _maxMultilineSpans; /// Whether [_lines] includes lines from multiple different files. final bool _multipleFiles; /// The buffer to which to write the result. final _buffer = StringBuffer(); /// The number of spaces to render for hard tabs that appear in `_span.text`. /// /// We don't want to render raw tabs, because they'll mess up our character /// alignment. static const _spacesPerTab = 4; /// Creates a [Highlighter] that will return a string highlighting [span] /// within the text of its file when [highlight] is called. /// /// [color] may either be a [String], a [bool], or `null`. If it's a string, /// it indicates an [ANSI terminal color escape][] that should be used to /// highlight [span]'s text (for example, `"\u001b[31m"` will color red). If /// it's `true`, it indicates that the text should be highlighted using the /// default color. If it's `false` or `null`, it indicates that no color /// should be used. /// /// [ANSI terminal color escape]: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors Highlighter(SourceSpan span, {color}) : this._(_collateLines([_Highlight(span, primary: true)]), () { if (color == true) return colors.red; if (color == false) return null; return color as String?; }(), null); /// Creates a [Highlighter] that will return a string highlighting /// [primarySpan] as well as all the spans in [secondarySpans] within the text /// of their file when [highlight] is called. /// /// Each span has an associated label that will be written alongside it. For /// [primarySpan] this message is [primaryLabel], and for [secondarySpans] the /// labels are the map values. /// /// If [color] is `true`, this will use [ANSI terminal color escapes][] to /// highlight the text. The [primarySpan] will be highlighted with /// [primaryColor] (which defaults to red), and the [secondarySpans] will be /// highlighted with [secondaryColor] (which defaults to blue). These /// arguments are ignored if [color] is `false`. /// /// [ANSI terminal color escape]: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors Highlighter.multiple(SourceSpan primarySpan, String primaryLabel, Map secondarySpans, {bool color = false, String? primaryColor, String? secondaryColor}) : this._( _collateLines([ _Highlight(primarySpan, label: primaryLabel, primary: true), for (var entry in secondarySpans.entries) _Highlight(entry.key, label: entry.value) ]), color ? (primaryColor ?? colors.red) : null, color ? (secondaryColor ?? colors.blue) : null); Highlighter._(this._lines, this._primaryColor, this._secondaryColor) : _paddingBeforeSidebar = 1 + math.max( // In a purely mathematical world, floor(log10(n)) would give the // number of digits in n, but floating point errors render that // unreliable in practice. (_lines.last.number + 1).toString().length, // If [_lines] aren't contiguous, we'll write "..." in place of a // line number. _contiguous(_lines) ? 0 : 3), _maxMultilineSpans = _lines .map((line) => line.highlights .where((highlight) => isMultiline(highlight.span)) .length) .reduce(math.max), _multipleFiles = !isAllTheSame(_lines.map((line) => line.url)); /// Returns whether [lines] contains any adjacent lines from the same source /// file that aren't adjacent in the original file. static bool _contiguous(List<_Line> lines) { for (var i = 0; i < lines.length - 1; i++) { final thisLine = lines[i]; final nextLine = lines[i + 1]; if (thisLine.number + 1 != nextLine.number && thisLine.url == nextLine.url) { return false; } } return true; } /// Collect all the source lines from the contexts of all spans in /// [highlights], and associates them with the highlights that cover them. static List<_Line> _collateLines(List<_Highlight> highlights) { final highlightsByUrl = groupBy<_Highlight, Uri?>( highlights, (highlight) => highlight.span.sourceUrl); for (var list in highlightsByUrl.values) { list.sort((highlight1, highlight2) => highlight1.span.compareTo(highlight2.span)); } return highlightsByUrl.values.expand((highlightsForFile) { // First, create a list of all the lines in the current file that we have // context for along with their line numbers. final lines = <_Line>[]; for (var highlight in highlightsForFile) { final context = highlight.span.context; // If [highlight.span.context] contains lines prior to the one // [highlight.span.text] appears on, write those first. final lineStart = findLineStart( context, highlight.span.text, highlight.span.start.column)!; final linesBeforeSpan = '\n'.allMatches(context.substring(0, lineStart)).length; final url = highlight.span.sourceUrl; var lineNumber = highlight.span.start.line - linesBeforeSpan; for (var line in context.split('\n')) { // Only add a line if it hasn't already been added for a previous span. if (lines.isEmpty || lineNumber > lines.last.number) { lines.add(_Line(line, lineNumber, url)); } lineNumber++; } } // Next, associate each line with each highlights that covers it. final activeHighlights = <_Highlight>[]; var highlightIndex = 0; for (var line in lines) { activeHighlights.removeWhere((highlight) => highlight.span.sourceUrl != line.url || highlight.span.end.line < line.number); final oldHighlightLength = activeHighlights.length; for (var highlight in highlightsForFile.skip(highlightIndex)) { if (highlight.span.start.line > line.number) break; if (highlight.span.sourceUrl != line.url) break; activeHighlights.add(highlight); } highlightIndex += activeHighlights.length - oldHighlightLength; line.highlights.addAll(activeHighlights); } return lines; }).toList(); } /// Returns the highlighted span text. /// /// This method should only be called once. String highlight() { _writeFileStart(_lines.first.url); // Each index of this list represents a column after the sidebar that could // contain a line indicating an active highlight. If it's `null`, that // column is empty; if it contains a highlight, it should be drawn for that column. final highlightsByColumn = List<_Highlight?>.filled(_maxMultilineSpans, null); for (var i = 0; i < _lines.length; i++) { final line = _lines[i]; if (i > 0) { final lastLine = _lines[i - 1]; if (lastLine.url != line.url) { _writeSidebar(end: glyph.upEnd); _buffer.writeln(); _writeFileStart(line.url); } else if (lastLine.number + 1 != line.number) { _writeSidebar(text: '...'); _buffer.writeln(); } } // If a highlight covers the entire first line other than initial // whitespace, don't bother pointing out exactly where it begins. Iterate // in reverse so that longer highlights (which are sorted after shorter // highlights) appear further out, leading to fewer crossed lines. for (var highlight in line.highlights.reversed) { if (isMultiline(highlight.span) && highlight.span.start.line == line.number && _isOnlyWhitespace( line.text.substring(0, highlight.span.start.column))) { replaceFirstNull(highlightsByColumn, highlight); } } _writeSidebar(line: line.number); _buffer.write(' '); _writeMultilineHighlights(line, highlightsByColumn); if (highlightsByColumn.isNotEmpty) _buffer.write(' '); final primaryIdx = line.highlights.indexWhere((highlight) => highlight.isPrimary); final primary = primaryIdx == -1 ? null : line.highlights[primaryIdx]; if (primary != null) { _writeHighlightedText( line.text, primary.span.start.line == line.number ? primary.span.start.column : 0, primary.span.end.line == line.number ? primary.span.end.column : line.text.length, color: _primaryColor); } else { _writeText(line.text); } _buffer.writeln(); // Always write the primary span's indicator first so that it's right next // to the highlighted text. if (primary != null) _writeIndicator(line, primary, highlightsByColumn); for (var highlight in line.highlights) { if (highlight.isPrimary) continue; _writeIndicator(line, highlight, highlightsByColumn); } } _writeSidebar(end: glyph.upEnd); return _buffer.toString(); } /// Writes the beginning of the file highlight for the file with the given /// [url]. void _writeFileStart(Uri? url) { if (!_multipleFiles || url == null) { _writeSidebar(end: glyph.downEnd); } else { _writeSidebar(end: glyph.topLeftCorner); _colorize(() => _buffer.write('${glyph.horizontalLine * 2}>'), color: colors.blue); _buffer.write(' ${p.prettyUri(url)}'); } _buffer.writeln(); } /// Writes the post-sidebar highlight bars for [line] according to /// [highlightsByColumn]. /// /// If [current] is passed, it's the highlight for which an indicator is being /// written. If it appears in [highlightsByColumn], a horizontal line is /// written from its column to the rightmost column. void _writeMultilineHighlights( _Line line, List<_Highlight?> highlightsByColumn, {_Highlight? current}) { // Whether we've written a sidebar indicator for opening a new span on this // line, and which color should be used for that indicator's rightward line. var openedOnThisLine = false; String? openedOnThisLineColor; final currentColor = current == null ? null : current.isPrimary ? _primaryColor : _secondaryColor; var foundCurrent = false; for (var highlight in highlightsByColumn) { final startLine = highlight?.span.start.line; final endLine = highlight?.span.end.line; if (current != null && highlight == current) { foundCurrent = true; assert(startLine == line.number || endLine == line.number); _colorize(() { _buffer.write(startLine == line.number ? glyph.topLeftCorner : glyph.bottomLeftCorner); }, color: currentColor); } else if (foundCurrent) { _colorize(() { _buffer.write(highlight == null ? glyph.horizontalLine : glyph.cross); }, color: currentColor); } else if (highlight == null) { if (openedOnThisLine) { _colorize(() => _buffer.write(glyph.horizontalLine), color: openedOnThisLineColor); } else { _buffer.write(' '); } } else { _colorize(() { final vertical = openedOnThisLine ? glyph.cross : glyph.verticalLine; if (current != null) { _buffer.write(vertical); } else if (startLine == line.number) { _colorize(() { _buffer .write(glyph.glyphOrAscii(openedOnThisLine ? '┬' : '┌', '/')); }, color: openedOnThisLineColor); openedOnThisLine = true; openedOnThisLineColor ??= highlight.isPrimary ? _primaryColor : _secondaryColor; } else if (endLine == line.number && highlight.span.end.column == line.text.length) { _buffer.write(highlight.label == null ? glyph.glyphOrAscii('â””', '\\') : vertical); } else { _colorize(() { _buffer.write(vertical); }, color: openedOnThisLineColor); } }, color: highlight.isPrimary ? _primaryColor : _secondaryColor); } } } // Writes [text], with text between [startColumn] and [endColumn] colorized in // the same way as [_colorize]. void _writeHighlightedText(String text, int startColumn, int endColumn, {required String? color}) { _writeText(text.substring(0, startColumn)); _colorize(() => _writeText(text.substring(startColumn, endColumn)), color: color); _writeText(text.substring(endColumn, text.length)); } /// Writes an indicator for where [highlight] starts, ends, or both below /// [line]. /// /// This may either add or remove [highlight] from [highlightsByColumn]. void _writeIndicator( _Line line, _Highlight highlight, List<_Highlight?> highlightsByColumn) { final color = highlight.isPrimary ? _primaryColor : _secondaryColor; if (!isMultiline(highlight.span)) { _writeSidebar(); _buffer.write(' '); _writeMultilineHighlights(line, highlightsByColumn, current: highlight); if (highlightsByColumn.isNotEmpty) _buffer.write(' '); _colorize(() { _writeUnderline(line, highlight.span, highlight.isPrimary ? '^' : glyph.horizontalLineBold); _writeLabel(highlight.label); }, color: color); _buffer.writeln(); } else if (highlight.span.start.line == line.number) { if (highlightsByColumn.contains(highlight)) return; replaceFirstNull(highlightsByColumn, highlight); _writeSidebar(); _buffer.write(' '); _writeMultilineHighlights(line, highlightsByColumn, current: highlight); _colorize(() => _writeArrow(line, highlight.span.start.column), color: color); _buffer.writeln(); } else if (highlight.span.end.line == line.number) { final coversWholeLine = highlight.span.end.column == line.text.length; if (coversWholeLine && highlight.label == null) { replaceWithNull(highlightsByColumn, highlight); return; } _writeSidebar(); _buffer.write(' '); _writeMultilineHighlights(line, highlightsByColumn, current: highlight); _colorize(() { if (coversWholeLine) { _buffer.write(glyph.horizontalLine * 3); } else { _writeArrow(line, math.max(highlight.span.end.column - 1, 0), beginning: false); } _writeLabel(highlight.label); }, color: color); _buffer.writeln(); replaceWithNull(highlightsByColumn, highlight); } } /// Underlines the portion of [line] covered by [span] with repeated instances /// of [character]. void _writeUnderline(_Line line, SourceSpan span, String character) { assert(!isMultiline(span)); assert(line.text.contains(span.text)); var startColumn = span.start.column; var endColumn = span.end.column; // Adjust the start and end columns to account for any tabs that were // converted to spaces. final tabsBefore = _countTabs(line.text.substring(0, startColumn)); final tabsInside = _countTabs(line.text.substring(startColumn, endColumn)); startColumn += tabsBefore * (_spacesPerTab - 1); endColumn += (tabsBefore + tabsInside) * (_spacesPerTab - 1); _buffer ..write(' ' * startColumn) ..write(character * math.max(endColumn - startColumn, 1)); } /// Write an arrow pointing to column [column] in [line]. /// /// If the arrow points to a tab character, this will point to the beginning /// of the tab if [beginning] is `true` and the end if it's `false`. void _writeArrow(_Line line, int column, {bool beginning = true}) { final tabs = _countTabs(line.text.substring(0, column + (beginning ? 0 : 1))); _buffer ..write(glyph.horizontalLine * (1 + column + tabs * (_spacesPerTab - 1))) ..write('^'); } /// Writes a space followed by [label] if [label] isn't `null`. void _writeLabel(String? label) { if (label != null) _buffer.write(' $label'); } /// Writes a snippet from the source text, converting hard tab characters into /// plain indentation. void _writeText(String text) { for (var char in text.codeUnits) { if (char == $tab) { _buffer.write(' ' * _spacesPerTab); } else { _buffer.writeCharCode(char); } } } // Writes a sidebar to [buffer] that includes [line] as the line number if // given and writes [end] at the end (defaults to [glyphs.verticalLine]). // // If [text] is given, it's used in place of the line number. It can't be // passed at the same time as [line]. void _writeSidebar({int? line, String? text, String? end}) { assert(line == null || text == null); // Add 1 to line to convert from computer-friendly 0-indexed line numbers to // human-friendly 1-indexed line numbers. if (line != null) text = (line + 1).toString(); _colorize(() { _buffer ..write((text ?? '').padRight(_paddingBeforeSidebar)) ..write(end ?? glyph.verticalLine); }, color: colors.blue); } /// Returns the number of hard tabs in [text]. int _countTabs(String text) { var count = 0; for (var char in text.codeUnits) { if (char == $tab) count++; } return count; } /// Returns whether [text] contains only space or tab characters. bool _isOnlyWhitespace(String text) { for (var char in text.codeUnits) { if (char != $space && char != $tab) return false; } return true; } /// Colors all text written to [_buffer] during [callback], if colorization is /// enabled and [color] is not `null`. void _colorize(void Function() callback, {required String? color}) { if (_primaryColor != null && color != null) _buffer.write(color); callback(); if (_primaryColor != null && color != null) _buffer.write(colors.none); } } /// Information about how to highlight a single section of a source file. class _Highlight { /// The section of the source file to highlight. /// /// This is normalized to make it easier for [Highlighter] to work with. final SourceSpanWithContext span; /// Whether this is the primary span in the highlight. /// /// The primary span is highlighted with a different character and colored /// differently than non-primary spans. final bool isPrimary; /// The label to include inline when highlighting [span]. /// /// This helps distinguish clarify what each highlight means when multiple are /// used in the same message. final String? label; _Highlight(SourceSpan span, {this.label, bool primary = false}) : span = (() { var newSpan = _normalizeContext(span); newSpan = _normalizeNewlines(newSpan); newSpan = _normalizeTrailingNewline(newSpan); return _normalizeEndOfLine(newSpan); })(), isPrimary = primary; /// Normalizes [span] to ensure that it's a [SourceSpanWithContext] whose /// context actually contains its text at the expected column. /// /// If it's not already a [SourceSpanWithContext], adjust the start and end /// locations' line and column fields so that the highlighter can assume they /// match up with the context. static SourceSpanWithContext _normalizeContext(SourceSpan span) => span is SourceSpanWithContext && findLineStart(span.context, span.text, span.start.column) != null ? span : SourceSpanWithContext( SourceLocation(span.start.offset, sourceUrl: span.sourceUrl, line: 0, column: 0), SourceLocation(span.end.offset, sourceUrl: span.sourceUrl, line: countCodeUnits(span.text, $lf), column: _lastLineLength(span.text)), span.text, span.text); /// Normalizes [span] to replace Windows-style newlines with Unix-style /// newlines. static SourceSpanWithContext _normalizeNewlines(SourceSpanWithContext span) { final text = span.text; if (!text.contains('\r\n')) return span; var endOffset = span.end.offset; for (var i = 0; i < text.length - 1; i++) { if (text.codeUnitAt(i) == $cr && text.codeUnitAt(i + 1) == $lf) { endOffset--; } } return SourceSpanWithContext( span.start, SourceLocation(endOffset, sourceUrl: span.sourceUrl, line: span.end.line, column: span.end.column), text.replaceAll('\r\n', '\n'), span.context.replaceAll('\r\n', '\n')); } /// Normalizes [span] to remove a trailing newline from `span.context`. /// /// If necessary, also adjust `span.end` so that it doesn't point past where /// the trailing newline used to be. static SourceSpanWithContext _normalizeTrailingNewline( SourceSpanWithContext span) { if (!span.context.endsWith('\n')) return span; // If there's a full blank line on the end of [span.context], it's probably // significant, so we shouldn't trim it. if (span.text.endsWith('\n\n')) return span; final context = span.context.substring(0, span.context.length - 1); var text = span.text; var start = span.start; var end = span.end; if (span.text.endsWith('\n') && _isTextAtEndOfContext(span)) { text = span.text.substring(0, span.text.length - 1); if (text.isEmpty) { end = start; } else { end = SourceLocation(span.end.offset - 1, sourceUrl: span.sourceUrl, line: span.end.line - 1, column: _lastLineLength(context)); start = span.start.offset == span.end.offset ? end : span.start; } } return SourceSpanWithContext(start, end, text, context); } /// Normalizes [span] so that the end location is at the end of a line rather /// than at the beginning of the next line. static SourceSpanWithContext _normalizeEndOfLine(SourceSpanWithContext span) { if (span.end.column != 0) return span; if (span.end.line == span.start.line) return span; final text = span.text.substring(0, span.text.length - 1); return SourceSpanWithContext( span.start, SourceLocation(span.end.offset - 1, sourceUrl: span.sourceUrl, line: span.end.line - 1, column: text.length - text.lastIndexOf('\n') - 1), text, // If the context also ends with a newline, it's possible that we don't // have the full context for that line, so we shouldn't print it at all. span.context.endsWith('\n') ? span.context.substring(0, span.context.length - 1) : span.context); } /// Returns the length of the last line in [text], whether or not it ends in a /// newline. static int _lastLineLength(String text) { if (text.isEmpty) { return 0; } else if (text.codeUnitAt(text.length - 1) == $lf) { return text.length == 1 ? 0 : text.length - text.lastIndexOf('\n', text.length - 2) - 1; } else { return text.length - text.lastIndexOf('\n') - 1; } } /// Returns whether [span]'s text runs all the way to the end of its context. static bool _isTextAtEndOfContext(SourceSpanWithContext span) => findLineStart(span.context, span.text, span.start.column)! + span.start.column + span.length == span.context.length; @override String toString() { final buffer = StringBuffer(); if (isPrimary) buffer.write('primary '); buffer.write('${span.start.line}:${span.start.column}-' '${span.end.line}:${span.end.column}'); if (label != null) buffer.write(' ($label)'); return buffer.toString(); } } /// A single line of the source file being highlighted. class _Line { /// The text of the line, not including the trailing newline. final String text; /// The 0-based line number in the source file. final int number; /// The URL of the source file in which this line appears. final Uri? url; /// All highlights that cover any portion of this line, in source span order. /// /// This is populated after the initial line is created. final highlights = <_Highlight>[]; _Line(this.text, this.number, this.url); @override String toString() => '$number: "$text" (${highlights.join(', ')})'; } ‚¨NN<-&6 !LLM*O/!>#L E/"PN"L>OLONKZ(F0+#EQ0OQ!MEOH3ZD.JK8:9=G$RP+/,7?P410G@)I E.F0RA5  H/ 444;+ H2).'PKX<.((+%9& HPNI8+8H; (;=JM3,1*$#Q"O/+>%M #*) /E-EQK7"8PQ"#)0405D1$)!!Q!& ?- P!%1Q.%&G/?20'. JQ"J"0H8LKPI(O=.C&;:7OF9M88O3H! &6QH +)%JHP5B !A<OGFJ PB$1Q!',%MLL(?*Q.4>,1 '!D('8Q)GFLJ3K$9M*<Q B118/LANP!E'P#0B.-87JP-%0H""'!&'0JO':$3P-1HC;2'%/I=P.Q+7?",'%?PQ$AQ,:G 7PCC #-<028@2=P;%+ F(package:source_span/src/highlighter.dart^file:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/src/location.dartì// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'span.dart'; // TODO(nweiz): Use SourceLocationMixin once we decide to cut a release with // breaking changes. See SourceLocationMixin for details. /// A class that describes a single location within a source file. /// /// This class should not be extended. Instead, [SourceLocationBase] should be /// extended instead. class SourceLocation implements Comparable { /// URL of the source containing this location. /// /// This may be null, indicating that the source URL is unknown or /// unavailable. final Uri? sourceUrl; /// The 0-based offset of this location in the source. final int offset; /// The 0-based line of this location in the source. final int line; /// The 0-based column of this location in the source final int column; /// Returns a representation of this location in the `source:line:column` /// format used by text editors. /// /// This prints 1-based lines and columns. String get toolString { final source = sourceUrl ?? 'unknown source'; return '$source:${line + 1}:${column + 1}'; } /// Creates a new location indicating [offset] within [sourceUrl]. /// /// [line] and [column] default to assuming the source is a single line. This /// means that [line] defaults to 0 and [column] defaults to [offset]. /// /// [sourceUrl] may be either a [String], a [Uri], or `null`. SourceLocation(this.offset, {sourceUrl, int? line, int? column}) : sourceUrl = sourceUrl is String ? Uri.parse(sourceUrl) : sourceUrl as Uri?, line = line ?? 0, column = column ?? offset { if (offset < 0) { throw RangeError('Offset may not be negative, was $offset.'); } else if (line != null && line < 0) { throw RangeError('Line may not be negative, was $line.'); } else if (column != null && column < 0) { throw RangeError('Column may not be negative, was $column.'); } } /// Returns the distance in characters between `this` and [other]. /// /// This always returns a non-negative value. int distance(SourceLocation other) { if (sourceUrl != other.sourceUrl) { throw ArgumentError('Source URLs \"$sourceUrl\" and ' "\"${other.sourceUrl}\" don't match."); } return (offset - other.offset).abs(); } /// Returns a span that covers only a single point: this location. SourceSpan pointSpan() => SourceSpan(this, this, ''); /// Compares two locations. /// /// [other] must have the same source URL as `this`. @override int compareTo(SourceLocation other) { if (sourceUrl != other.sourceUrl) { throw ArgumentError('Source URLs \"$sourceUrl\" and ' "\"${other.sourceUrl}\" don't match."); } return offset - other.offset; } @override bool operator ==(other) => other is SourceLocation && sourceUrl == other.sourceUrl && offset == other.offset; @override int get hashCode => (sourceUrl?.hashCode ?? 0) + offset; @override String toString() => '<$runtimeType: $offset $toolString>'; } /// A base class for source locations with [offset], [line], and [column] known /// at construction time. class SourceLocationBase extends SourceLocation { SourceLocationBase(int offset, {sourceUrl, int? line, int? column}) : super(offset, sourceUrl: sourceUrl, line: line, column: column); } iNN<M:CO=2E978L#-20EPI@CL$D+@/DE0'(<2*E87 ((<2" !& ; >P2FI%package:source_span/src/location.dartdfile:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/src/location_mixin.dart‡+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'location.dart'; import 'span.dart'; // Note: this class duplicates a lot of functionality of [SourceLocation]. This // is because in order for SourceLocation to use SourceLocationMixin, // SourceLocationMixin couldn't implement SourceLocation. In SourceSpan we // handle this by making the class itself non-extensible, but that would be a // breaking change for SourceLocation. So until we want to endure the pain of // cutting a release with breaking changes, we duplicate the code here. /// A mixin for easily implementing [SourceLocation]. abstract class SourceLocationMixin implements SourceLocation { @override String get toolString { final source = sourceUrl ?? 'unknown source'; return '$source:${line + 1}:${column + 1}'; } @override int distance(SourceLocation other) { if (sourceUrl != other.sourceUrl) { throw ArgumentError('Source URLs \"$sourceUrl\" and ' "\"${other.sourceUrl}\" don't match."); } return (offset - other.offset).abs(); } @override SourceSpan pointSpan() => SourceSpan(this, this, ''); @override int compareTo(SourceLocation other) { if (sourceUrl != other.sourceUrl) { throw ArgumentError('Source URLs \"$sourceUrl\" and ' "\"${other.sourceUrl}\" don't match."); } return offset - other.offset; } @override bool operator ==(other) => other is SourceLocation && sourceUrl == other.sourceUrl && offset == other.offset; @override int get hashCode => (sourceUrl?.hashCode ?? 0) + offset; @override String toString() => '<$runtimeType: $offset $toolString>'; } 9NN<PFKNNH6? 20 '(<2* 8 ((<2" !& ; >+package:source_span/src/location_mixin.dartZfile:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/src/span.dart¤þ// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'package:path/path.dart' as p; import 'package:term_glyph/term_glyph.dart' as glyph; import 'charcode.dart'; import 'file.dart'; import 'highlighter.dart'; import 'location.dart'; import 'span_mixin.dart'; import 'span_with_context.dart'; /// A class that describes a segment of source text. abstract class SourceSpan implements Comparable { /// The start location of this span. SourceLocation get start; /// The end location of this span, exclusive. SourceLocation get end; /// The source text for this span. String get text; /// The URL of the source (typically a file) of this span. /// /// This may be null, indicating that the source URL is unknown or /// unavailable. Uri? get sourceUrl; /// The length of this span, in characters. int get length; /// Creates a new span from [start] to [end] (exclusive) containing [text]. /// /// [start] and [end] must have the same source URL and [start] must come /// before [end]. [text] must have a number of characters equal to the /// distance between [start] and [end]. factory SourceSpan(SourceLocation start, SourceLocation end, String text) => SourceSpanBase(start, end, text); /// Creates a new span that's the union of `this` and [other]. /// /// The two spans must have the same source URL and may not be disjoint. /// [text] is computed by combining `this.text` and `other.text`. SourceSpan union(SourceSpan other); /// Compares two spans. /// /// [other] must have the same source URL as `this`. This orders spans by /// [start] then [length]. @override int compareTo(SourceSpan other); /// Formats [message] in a human-friendly way associated with this span. /// /// [color] may either be a [String], a [bool], or `null`. If it's a string, /// it indicates an [ANSI terminal color escape][] that should /// be used to highlight the span's text (for example, `"\u001b[31m"` will /// color red). If it's `true`, it indicates that the text should be /// highlighted using the default color. If it's `false` or `null`, it /// indicates that the text shouldn't be highlighted. /// /// This uses the full range of Unicode characters to highlight the source /// span if [glyph.ascii] is `false` (the default), but only uses ASCII /// characters if it's `true`. /// /// [ANSI terminal color escape]: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors String message(String message, {color}); /// Prints the text associated with this span in a user-friendly way. /// /// This is identical to [message], except that it doesn't print the file /// name, line number, column number, or message. If [length] is 0 and this /// isn't a [SourceSpanWithContext], returns an empty string. /// /// [color] may either be a [String], a [bool], or `null`. If it's a string, /// it indicates an [ANSI terminal color escape][] that should /// be used to highlight the span's text (for example, `"\u001b[31m"` will /// color red). If it's `true`, it indicates that the text should be /// highlighted using the default color. If it's `false` or `null`, it /// indicates that the text shouldn't be highlighted. /// /// This uses the full range of Unicode characters to highlight the source /// span if [glyph.ascii] is `false` (the default), but only uses ASCII /// characters if it's `true`. /// /// [ANSI terminal color escape]: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors String highlight({color}); } /// A base class for source spans with [start], [end], and [text] known at /// construction time. class SourceSpanBase extends SourceSpanMixin { @override final SourceLocation start; @override final SourceLocation end; @override final String text; SourceSpanBase(this.start, this.end, this.text) { if (end.sourceUrl != start.sourceUrl) { throw ArgumentError('Source URLs \"${start.sourceUrl}\" and ' " \"${end.sourceUrl}\" don't match."); } else if (end.offset < start.offset) { throw ArgumentError('End $end must come after start $start.'); } else if (text.length != start.distance(end)) { throw ArgumentError('Text "$text" must be ${start.distance(end)} ' 'characters long.'); } } } // TODO(#52): Move these to instance methods in the next breaking release. /// Extension methods on the base [SourceSpan] API. extension SourceSpanExtension on SourceSpan { /// Like [SourceSpan.message], but also highlights [secondarySpans] to provide /// the user with additional context. /// /// Each span takes a label ([label] for this span, and the values of the /// [secondarySpans] map for the secondary spans) that's used to indicate to /// the user what that particular span represents. /// /// If [color] is `true`, [ANSI terminal color escapes][] are used to color /// the resulting string. By default this span is colored red and the /// secondary spans are colored blue, but that can be customized by passing /// ANSI escape strings to [primaryColor] or [secondaryColor]. /// /// [ANSI terminal color escapes]: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors /// /// Each span in [secondarySpans] must refer to the same document as this /// span. Throws an [ArgumentError] if any secondary span has a different /// source URL than this span. /// /// Note that while this will work with plain [SourceSpan]s, it will produce /// much more useful output with [SourceSpanWithContext]s (including /// [FileSpan]s). String messageMultiple( String message, String label, Map secondarySpans, {bool color = false, String? primaryColor, String? secondaryColor}) { final buffer = StringBuffer() ..write('line ${start.line + 1}, column ${start.column + 1}'); if (sourceUrl != null) buffer.write(' of ${p.prettyUri(sourceUrl)}'); buffer ..writeln(': $message') ..write(highlightMultiple(label, secondarySpans, color: color, primaryColor: primaryColor, secondaryColor: secondaryColor)); return buffer.toString(); } /// Like [SourceSpan.highlight], but also highlights [secondarySpans] to /// provide the user with additional context. /// /// Each span takes a label ([label] for this span, and the values of the /// [secondarySpans] map for the secondary spans) that's used to indicate to /// the user what that particular span represents. /// /// If [color] is `true`, [ANSI terminal color escapes][] are used to color /// the resulting string. By default this span is colored red and the /// secondary spans are colored blue, but that can be customized by passing /// ANSI escape strings to [primaryColor] or [secondaryColor]. /// /// [ANSI terminal color escapes]: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors /// /// Each span in [secondarySpans] must refer to the same document as this /// span. Throws an [ArgumentError] if any secondary span has a different /// source URL than this span. /// /// Note that while this will work with plain [SourceSpan]s, it will produce /// much more useful output with [SourceSpanWithContext]s (including /// [FileSpan]s). String highlightMultiple(String label, Map secondarySpans, {bool color = false, String? primaryColor, String? secondaryColor}) => Highlighter.multiple(this, label, secondarySpans, color: color, primaryColor: primaryColor, secondaryColor: secondaryColor) .highlight(); /// Returns a span from [start] code units (inclusive) to [end] code units /// (exclusive) after the beginning of this span. SourceSpan subspan(int start, [int? end]) { RangeError.checkValidRange(start, end, length); if (start == 0 && (end == null || end == length)) return this; final text = this.text; final startLocation = this.start; var line = startLocation.line; var column = startLocation.column; // Adjust [line] and [column] as necessary if the character at [i] in [text] // is a newline. void consumeCodePoint(int i) { final codeUnit = text.codeUnitAt(i); if (codeUnit == $lf || // A carriage return counts as a newline, but only if it's not // followed by a line feed. (codeUnit == $cr && (i + 1 == text.length || text.codeUnitAt(i + 1) != $lf))) { line += 1; column = 0; } else { column += 1; } } for (var i = 0; i < start; i++) { consumeCodePoint(i); } final newStartLocation = SourceLocation(startLocation.offset + start, sourceUrl: sourceUrl, line: line, column: column); SourceLocation newEndLocation; if (end == null || end == length) { newEndLocation = this.end; } else if (end == start) { newEndLocation = newStartLocation; } else { for (var i = start; i < end; i++) { consumeCodePoint(i); } newEndLocation = SourceLocation(startLocation.offset + end, sourceUrl: sourceUrl, line: line, column: column); } return SourceSpan( newStartLocation, newEndLocation, text.substring(start, end)); } } €ìNN<&6!5>'0%=E.NLI*O(AKD&L #KOAMGI8MJ!Z+HLN@OAMGI8MJ!ZK/   4,D1,E5IK4.Q(LO5NHNA[LL!OGLL"EJ 7&,K0LO5NHNA[LL!OGQQ8*.M4.4C&#'Q#+I&J&J;#(!) *B=G!package:source_span/src/span.dartdfile:///github/home/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/src/span_exception.dartÚ// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'span.dart'; /// A class for exceptions that have source span information attached. class SourceSpanException implements Exception { // This is a getter so that subclasses can override it. /// A message describing the exception. String get message => _message; final String _message; // This is a getter so that subclasses can override it. /// The span associated with this exception. /// /// This may be `null` if the source location can't be determined. SourceSpan? get span => _span; final SourceSpan? _span; SourceSpanException(this._message, this._span); /// Returns a string representation of `this`. /// /// [color] may either be a [String], a [bool], or `null`. If it's a string, /// it indicates an ANSI terminal color escape that should be used to /// highlight the span's text. If it's `true`, it indicates that the text /// should be highlighted using the default color. If it's `false` or `null`, /// it indicates that the text shouldn't be highlighted. @override String toString({color}) { if (span == null) return message; return 'Error on ${span!.message(message, color: color)}'; } } /// A [SourceSpanException] that's also a [FormatException]. class SourceSpanFormatException extends SourceSpanException implements FormatException { @override final dynamic source; @override int? get offset => span?.start.offset; SourceSpanFormatException(String message, SourceSpan? span, [this.source]) : super(message, span); } /// A [SourceSpanException] that also highlights some secondary spans to provide /// the user with extra context. /// /// Each span has a label ([primaryLabel] for the primary, and the values of the /// [secondarySpans] map for the secondary spans) that's used to indicate to the /// user what that particular span represents. class MultiSourceSpanException extends SourceSpanException { /// A label to attach to [span] that provides additional information and helps /// distinguish it from [secondarySpans]. final String primaryLabel; /// A map whose keys are secondary spans that should be highlighted. /// /// Each span's value is a label to attach to that span that provides /// additional information and helps distinguish it from [secondarySpans]. final Map secondarySpans; MultiSourceSpanException(String message, SourceSpan? span, this.primaryLabel, Map secondarySpans) : secondarySpans = Map.unmodifiable(secondarySpans), super(message, span); /// Returns a string representation of `this`. /// /// [color] may either be a [String], a [bool], or `null`. If it's a string, /// it indicates an ANSI terminal color escape that should be used to /// highlight the primary span's text. If it's `true`, it indicates that the /// text should be highlighted using the default color. If it's `false` or /// `null`, it indicates that the text shouldn't be highlighted. /// /// If [color] is `true` or